From e2ed61d79021e1e55d971cedb5ddc4587d17f918 Mon Sep 17 00:00:00 2001 From: Pablo Rosado Date: Thu, 23 Apr 2026 19:16:16 +0200 Subject: [PATCH 1/9] =?UTF-8?q?=F0=9F=93=8A=20Charts=20as=20first-class=20?= =?UTF-8?q?ETL=20citizens=20via=20empty-dimensions=20detection?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From aebb16dcdda5f669b067d3348ecf0b8294b1dd3c Mon Sep 17 00:00:00 2001 From: Pablo Rosado Date: Thu, 23 Apr 2026 21:04:06 +0200 Subject: [PATCH 2/9] Let mdim configs create single charts --- dag/animal_welfare.yml | 5 + etl/collection/chart_upsert.py | 121 ++++++++++++++++++ etl/collection/model/core.py | 8 ++ etl/steps/__init__.py | 19 +++ .../banning_of_chick_culling.config.yml | 38 ++++++ schemas/multidim-schema.json | 7 +- 6 files changed, 195 insertions(+), 3 deletions(-) create mode 100644 etl/collection/chart_upsert.py create mode 100644 etl/steps/export/multidim/animal_welfare/latest/banning_of_chick_culling.config.yml diff --git a/dag/animal_welfare.yml b/dag/animal_welfare.yml index 0d8370bb712..6e853c988eb 100644 --- a/dag/animal_welfare.yml +++ b/dag/animal_welfare.yml @@ -143,3 +143,8 @@ steps: - data://meadow/animal_welfare/2026-04-16/chick_culling_laws data://grapher/animal_welfare/2026-04-16/chick_culling_laws: - data://garden/animal_welfare/2026-04-16/chick_culling_laws + # + # Single-chart collection replicating chart 7118 (https://admin.owid.io/admin/charts/7118/edit). + # + export://multidim/animal_welfare/latest/banning_of_chick_culling: + - data://grapher/animal_welfare/2026-04-16/chick_culling_laws diff --git a/etl/collection/chart_upsert.py b/etl/collection/chart_upsert.py new file mode 100644 index 00000000000..b9d0c474150 --- /dev/null +++ b/etl/collection/chart_upsert.py @@ -0,0 +1,121 @@ +"""Upsert a Collection with zero dimensions as a regular Grapher chart. + +When a multidim `Collection` has no dimensions and exactly one view, it is the degenerate +"single chart" case. Instead of pushing it as a multi-dim data page via the `/multi-dims/` +admin endpoint, we translate the view into a standard Grapher chart config and push it +via `AdminAPI.create_chart` / `AdminAPI.update_chart`. + +This keeps one authoring format (mdim config) across the chart↔multidim spectrum: adding a +dimension to a single-chart collection promotes it to a proper multidim without a config +migration. +""" + +from typing import TYPE_CHECKING, Any + +import structlog +from sqlalchemy.orm import Session +from sqlalchemy.orm.exc import NoResultFound + +from apps.chart_sync.admin_api import AdminAPI +from etl.collection.utils import map_indicator_path_to_id +from etl.config import DEFAULT_GRAPHER_SCHEMA, GRAPHER_USER_ID, OWIDEnv +from etl.grapher.model import Chart + +if TYPE_CHECKING: + from etl.collection.model.core import Collection + from etl.collection.model.view import View + +log = structlog.get_logger() + + +_AXIS_ORDER = ("y", "x", "size", "color") + + +def upsert_collection_as_chart(collection: "Collection", owid_env: OWIDEnv) -> int: + """Push a zero-dimension collection to Grapher as a regular chart. + + Expects `len(collection.dimensions) == 0` and `len(collection.views) == 1`. + """ + if len(collection.dimensions) != 0: + raise ValueError("upsert_collection_as_chart called on a collection with dimensions.") + if len(collection.views) != 1: + raise ValueError(f"Chart mode (no dimensions) requires exactly one view; got {len(collection.views)}.") + + view = collection.views[0] + slug = _resolve_chart_slug(collection, view) + config = _build_chart_config(view, slug) + + admin_api = AdminAPI(owid_env) + user_id = int(GRAPHER_USER_ID) if GRAPHER_USER_ID else None + + with Session(owid_env.engine) as session: + try: + existing = Chart.load_chart(session, slug=slug) + except NoResultFound: + existing = None + + if existing is not None: + # Preserve publication state unless the user explicitly overrode it. + config.setdefault("isPublished", existing.config.get("isPublished", False)) + log.info("collection.chart.update", slug=slug, chart_id=existing.id) + admin_api.update_chart(chart_id=existing.id, chart_config=config, user_id=user_id) + chart_id = existing.id + else: + # New charts default to unpublished so humans can review before go-live. + config.setdefault("isPublished", False) + log.info("collection.chart.create", slug=slug) + result = admin_api.create_chart(chart_config=config, user_id=user_id) + chart_id = result["chartId"] + + log.info( + "collection.chart.upsert_success", + slug=slug, + chart_id=chart_id, + admin_url=f"{owid_env.admin_site}/admin/charts/{chart_id}/edit", + ) + return chart_id + + +def _resolve_chart_slug(collection: "Collection", view: "View") -> str: + """Derive the chart slug from the collection's short_name. + + Grapher chart slugs are conventionally dash-separated; the mdim short_name is snake_case. + """ + del view # unused for now; kept in the signature for future explicit-slug overrides + return collection.short_name.replace("_", "-") + + +def _build_chart_config(view: "View", slug: str) -> dict[str, Any]: + """Translate `view.config` + `view.indicators` into a grapher chart config dict.""" + config: dict[str, Any] = dict(view.config or {}) + config["slug"] = slug + config.setdefault("$schema", DEFAULT_GRAPHER_SCHEMA) + + # Resolve indicator catalog paths (y/x/size/color) to variable IDs and emit as + # the grapher `dimensions` block, which charts identify by numeric variableId. + dimensions: list[dict[str, Any]] = [] + for axis in _AXIS_ORDER: + entries = _axis_entries(view, axis) + for indicator in entries: + dim: dict[str, Any] = {"property": axis, "variableId": int(map_indicator_path_to_id(indicator.catalogPath))} + if indicator.display: + dim["display"] = indicator.display + dimensions.append(dim) + if not dimensions: + raise ValueError(f"Chart view for slug '{slug}' has no indicators.") + config["dimensions"] = dimensions + + # Rewrite catalog-path references in `sortColumnSlug` and `map.columnSlug` to IDs. + if "sortColumnSlug" in config: + config["sortColumnSlug"] = str(map_indicator_path_to_id(config["sortColumnSlug"])) + if isinstance(config.get("map"), dict) and "columnSlug" in config["map"]: + config["map"]["columnSlug"] = str(map_indicator_path_to_id(config["map"]["columnSlug"])) + + return config + + +def _axis_entries(view: "View", axis: str) -> list: + value = getattr(view.indicators, axis, None) + if value is None: + return [] + return value if isinstance(value, list) else [value] diff --git a/etl/collection/model/core.py b/etl/collection/model/core.py index 2b13d18e4a9..2b481869273 100644 --- a/etl/collection/model/core.py +++ b/etl/collection/model/core.py @@ -243,6 +243,14 @@ def save( # ty: ignore[invalid-method-override] self.upsert_to_db(owid_env) def upsert_to_db(self, owid_env: OWIDEnv): + # Degenerate "single chart" case: no dimensions means no multi-dim page — push to the + # charts table via the chart admin endpoint instead of `/multi-dims/`. + if len(self.dimensions) == 0: + from etl.collection.chart_upsert import upsert_collection_as_chart + + upsert_collection_as_chart(self, owid_env) + return + # Replace especial fields URIs with IDs (e.g. sortColumnSlug). # TODO: I think we could move this to the Grapher side. config = replace_catalog_paths_with_ids(self.to_dict()) diff --git a/etl/steps/__init__.py b/etl/steps/__init__.py index bd6335cd203..cf1df527029 100644 --- a/etl/steps/__init__.py +++ b/etl/steps/__init__.py @@ -1174,12 +1174,31 @@ def run(self) -> None: DataStep._run_py_isolated(self) # ty: ignore else: DataStep._run_py(self) # ty: ignore + elif self._is_multidim_yaml_only(): + # YAML-only multidim: no .py, just a .config.yml. Run the default + # boilerplate (load_collection_config → create_collection → save). + self._run_multidim_yaml_only(sp) # save checksum (only update index.json, don't call ds.save() which iterates # table_names and would pick up custom JSON files written by the export script) ds.metadata.source_checksum = self.checksum_input() ds.metadata.save(ds._index_file) + def _is_multidim_yaml_only(self) -> bool: + """True if this is an `export://multidim/...` step backed only by a `.config.yml`.""" + if not self.path.startswith("multidim/"): + return False + return self._search_path.with_suffix(".config.yml").exists() + + def _run_multidim_yaml_only(self, search_path: Path) -> None: + from etl.helpers import PathFinder + + # Synthesise the `.py` path PathFinder expects; the file doesn't need to exist, + # PathFinder only parses namespace/version/short_name out of the path components. + paths_ = PathFinder(str(search_path.with_suffix(".py"))) + collection = paths_.create_collection(config=paths_.load_collection_config()) + collection.save() + def checksum_output(self) -> str: # output checksum is checksum of all ingredients return self.checksum_input() diff --git a/etl/steps/export/multidim/animal_welfare/latest/banning_of_chick_culling.config.yml b/etl/steps/export/multidim/animal_welfare/latest/banning_of_chick_culling.config.yml new file mode 100644 index 00000000000..750fe75019e --- /dev/null +++ b/etl/steps/export/multidim/animal_welfare/latest/banning_of_chick_culling.config.yml @@ -0,0 +1,38 @@ +# Single-chart collection: `dimensions` is empty, so this is pushed as a regular +# Grapher chart (not a multi-dim data page). Replicates chart: +# https://admin.owid.io/admin/charts/7118/edit +title: + title: "Which countries have banned chick culling?" + title_variant: "Chart" +default_selection: + - "World" +topic_tags: + - "Animal Welfare" +dimensions: [] +views: + - dimensions: {} + indicators: + y: + - "chick_culling_laws#status" + config: + $schema: "https://files.ourworldindata.org/schemas/grapher-schema.009.json" + title: "Which countries have banned chick culling?" + subtitle: "Chick culling is the process of separating and killing unwanted male and unhealthy female chicks that cannot produce eggs in industrialized egg facilities." + note: "In Switzerland grinding is banned but gassing is still allowed. Belgium has only a regional ban." + originUrl: "/animal-welfare" + tab: "map" + hasMapTab: true + chartTypes: [] + yAxis: + min: "auto" + map: + hideTimeline: true + colorScale: + baseColorScheme: "BinaryMapPaletteA" + customNumericColorsActive: true + customCategoryColors: + Banned: "#4881c6" + "No laws": "#b6a28c" + "Not banned": "#ad9882" + "Partially banned": "#a084c1" + "Banned but not yet effective": "#3e94a1" diff --git a/schemas/multidim-schema.json b/schemas/multidim-schema.json index 976f2711cd8..0bd7007b67d 100644 --- a/schemas/multidim-schema.json +++ b/schemas/multidim-schema.json @@ -327,13 +327,11 @@ }, "dimensions": { "type": "array", + "minItems": 0, "title": "Collection dimensions", "description": "Array of dimension objects that define the filter dropdowns available to users.", "requirement_level": "required", "guidelines": [ - [ - "Must contain at least one dimension." - ], [ "Each dimension creates a dropdown filter in the user interface." ], @@ -342,6 +340,9 @@ ], [ "Should be ordered by importance or logical flow." + ], + [ + "May be an empty array (single-chart case): the collection is materialised as a regular Grapher chart instead of a multi-dimensional data page. In that case, `views` must contain exactly one view." ] ], "items": { From 72c04bd072c14de9737fa8a01effa6131492e0d1 Mon Sep 17 00:00:00 2001 From: Pablo Rosado Date: Thu, 23 Apr 2026 21:55:58 +0200 Subject: [PATCH 3/9] Update chart preview extension --- .../install/archived/chart-preview-0.0.1.vsix | Bin 0 -> 23157 bytes .../install/chart-preview-0.0.2.vsix | Bin 0 -> 23260 bytes .../chart-preview/package-lock.json | 4 +- vscode_extensions/chart-preview/package.json | 2 +- .../chart-preview/src/extension.ts | 55 ++++++++++++++++-- 5 files changed, 52 insertions(+), 9 deletions(-) create mode 100644 vscode_extensions/chart-preview/install/archived/chart-preview-0.0.1.vsix create mode 100644 vscode_extensions/chart-preview/install/chart-preview-0.0.2.vsix diff --git a/vscode_extensions/chart-preview/install/archived/chart-preview-0.0.1.vsix b/vscode_extensions/chart-preview/install/archived/chart-preview-0.0.1.vsix new file mode 100644 index 0000000000000000000000000000000000000000..7a244378a28bf85f6f651377937d79380633c404 GIT binary patch literal 23157 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 ba$8?o)TTG-&%r4gq#6dB(FBNvuuH1z{;rXC#~0 z;&C0X5XgOmD~m_>7~Mw?^~)N%(=>y&wlDU#hzX)bnnv_j(`B{E!}mIF(O6}C$G$#W zB9-(gniu*h!+A5XVeMbZT|goKHljRtO4EiXid(>uq1>QJ&_PLs@_F8A`sZK&K%YTl zHiJ}GX|h<^gV-B2$g#_H`1)w%iOevUWg-Sf5|`=rWn(cKCxJu4c&59cW&vaeR?-1Q zh?u1!OIsZ`keOkiFQF5P^pu-Sg@dgq`>)8w{4{xEi*E;#(q@A^@i?CIsy4dBWvUvR zXZu8@@D=`XUc)*P#m{z&UIzhJL>AF<2(`+b_K_*} z1Cak;_AaAYe;WPI*42Oj0LcH{T0(ZV{~6p_PuauX#7T$N-Nrg6p22pA9s$IwFHoOO zK^74tfEdlyHy$4QJV`ptjo95R;MXU=oe3YU!p#hI{a2nM6ErG#IB2IWhh>~M2Y4>1 z=VIA=eW?Aa?+#-`Ig&c4r~FjzY*;Uze=|9OYJ}n+Pzr0xhRHo2eUaByr`s7aRU>OB z=kdrpHLMd@q<6h-GckVFwuklW zMyN4~-G+13MvkCUZg0o!?ZTT4C_K5Go-;%ob?|Xm-5SEKumL{9Q#X-n{mTo}BCC}rql4W7x} zF61EsSSM)pMR~~`GtapUHO6&#vvq-DI|cxN&{n3Lf(#Ddzr3}Ck0L#WOC~Y9z5J|U zS>^B_$+!tKkUE&8G6#h-R_~}p4(O=e*u#S}rW~6-1-g?B#XcR^H=1J$`9&DSq8NZ0 zASJO9^6V~4IlJ~bVM=~Jl`NxU_C8I~qvp|FtrA6xq101mn2Cgril9l>@Vr>)f|yWD zi@-`-$rY*t#&8an^1XX3PqgvcR}ZjUy&+e$=dj~w@C7xGE z<*xJe9P5*=gz5(ET6b1s-U65Zd1=3VtVo#^)kC!8a~!1ZUof!@ms?rI+nX-X+gm-* z?0Bt%yH)ea6tm1CvrJuOr}1RDq`n_sE+KEcCJp&r`JIf{J9Cc_v+c}nR^RW_7E0-k zRO`yA>e}d(N@0Qb&7Hv&V67;yknr02tb|GNqaVv9ODmwViCEz=5mR){=={tZ)9zzN zYRlG5WUW)nzaLA@E+d=4ojQC*Rjg)d_Gc9CYOIcCw7@8uX?+@w*5b#TQPXw=mk9$% z=JHHq*-1N+FND?>MITgsSZ#cF`e_Nst-*j1#rnOr>I2a&E3;tXdd;T;echunl=M{S zn%}6<*vmK-ZIE{+7i(CL4&51@#G4R{a;*AA44_UA8I#t{#$C}slLjKVBnh-j2hnk> zgge8)iDC7e6~`CW)StHci~@m_f<&P&VLNXzoyH?%rd^@7{k1d2K0iY>*Q#LQ?OEWJ}Jv+fBS z3QAOIK_o*ceE@mfoV5=Rc>6eaImeZELVN`#jlX*F`~~x8Hh*DwJ2+X}r|yNtXy zubxEg2&^viDMHLTT_4^;8#e)$u954>0lBpi*5rA+j0^QRDUlaH&l@96cC&Q7ynXL) z7Ci-uw^duJs*2VHM4n5HTJ|${;k)Z_J$LAOU$0qy-CdQs-}WzuV^?f`JX}Uq%_EQF z1Fper!hj0%EM{hVe1G;TI=X#f9Rj&(E0HbDm63{yB%3%hQH?~2jyb>CIXNuOpr(NT z9P0%YpYEA~OH2UI_73ZE_@)}s0`JP3fk3jysS%nX3T@JhTTmVCJSC6OVs{3yiD}w| z*Rr%tKirxgqwY#a+`u2Frs#U9d?~tq`b>}^no(RosP+YiR*{1I66r+_$QECpB_#=- zR9*w^K^UhRl{ZJYL5$-vM93;`Nyb)A0>YHWuJ^$pLKql$+4>_B_xzq3UAu9 zPpBlHLni~&knMGt%rh3DOHLN=>8>U`qL6KQ6EsP>c={V&aDRI6W&2F}3%!*&|m z)ygS$a>XfbafqE2za_0^K;XGwKMeq-;)2NIZmD(Kt*B-ynLBJO8cXZ5JHBWnX(+3_ zI?N=fzSku!3RP@LAzqQyjWTJl$+R$8Tnn$X2s3u)@(o%Hwm?*C@I4{_g4qI<(zEcO z>sSRZ0U@UermW#xD`J-=!Vm!tVXgg0#DRyAfP>lOqioi!pm0*oqS>lRHO2c+=u0$e zu)p}GTqWFt8kOWX#HMVB65x zB#Y+>D0ogAldPqVdpnE1fM8#g0Qj|H+=ZVPpYDMle_Zh>aANVf1~rcdVB$GT!Bid#^ex?=hZT)A0^tgfb#$X# z?NdbU!2gc9Rf~@bs2GQ%9toL=0G-rL-~)okE{5`-;+Db$G~?uOEf;uA&A{J7FD6-5 zK5%yA?BU3yS}{w`!uuq}WwN+!^6&$kwBJC8M*yVG*c!_Or1au#`Ag*KCS>cuSbs7H z{e0cOz&IPlNR&i9->M6Cb;!ppI%p5hrmWt7F4)k}$|qz$>+=58Tz*a;KS!Rj+V1%J zv2%TFYC7xo@>XbVUrj{I(X~9MfQh= z8=Nh2`Voha#2TEJwSATohyB}}>7=FU#mhv)RcW+Zcg;uFQjmJ8FF-gaEG>tvSE2}O zD-E{BJu!tWocLk21de)?eVhFU3#%aOfVA{^&rv>K)Mf5@kob}4#J7OTnhRtgpvOV` z!&l)h0}T4*CDo`@nI^A#-u@w;4rrhUm@5(sA#J5G`1Nwr7ZvhH zVr@R-Jf=`mx}gMHm%}(+YNg{9>!){)OsYyFO=hcWihxh%^-C?bwiWkgWvGK!_1fq# z#=8mst}5}=tkANT5R&Y(n}W^!f7BafK(+6m zb?+%oSgsRbg3@#qsggoHUjJ8@qnx&3O-BHGrAnirV0m) z&ZxM&oSuH3eohWA68z{_8G+E!qPA2rW1%>+}tmc z4W_E;{)_hFvVW`CbB%f61tF;q=HTYuWRIB5wo&j7Vv}0rS>qzr{@zMpZ(D4O3bjcy zArcvr&;_~JWQIPkokE?CXoN#zK4iUa8U_Qy9ez6LSLa-vTXE=D^=(Sg3M^_Z&iDhH*1Nq)q|m z9QXUXq(gJd$JqNa!dlq)@cYHx)#;<+-eo)VMJ39_ci6!VPd2XGu8{0vBU9<~Q~EuD zOCKGgPm)guSv9;I49pUsjF3H2DqgZqd9+hjwVk>YSM2XmG7mJ(i@JPDKB`Y66;O)j35pSD=(BR(+GUd*t?t(2Sd3(>6<( z)6N}X^=kKDHjd#Q90dCbrZYe+aZ_+LTI3oqPpsP43DK7 z06#yp&Th-oU9{lQSe9jiJ0!Bb3fvn&PSP3;x)qpemEPLPG5oXn84j&sJ2QZA;83MB zg#k=ktE)n@)ARdV6)lWP=1X=wrpU!C$H2u{4>r4%g^xwG%P@BBw%RBWtf!{U@e%pX z_HSpwFf)2<9Gf<*TCWgI%8%j&3qwdX;EiX7IzY?NcWRDFHJ6`}8M2U(rdFZhC z%}D8kdah#J7yFPdLi`^$;@{ zYTig$EyglxAX~hNRy>HKokGmuN4>xK=5HDW584>FpK+HH14L>jvB=!+K^dE3%g9e~ zMN2fZY9Fir3rq=|!SK9vSOdI)^j+UwcbGkkuW4N3UPp2PcY4opBT>q}-!4Q~D_+9H zC^*!iU{~Ro93{x|FEIC|66PA@ZIfM9&P_OV3xG(=^M~thfQS24>O`7R?Dy+$;>*V> zLfAgpWaw3Ta(qYC*}ABh-U)WdaoVTnc?^Q=1#44;-j-r`H$=CT$tcjxfR+2bJ}g8( z!@+jo^3-uK??#0#+D;ZU5oM{WM)*Wr~On@zr z-nHOG9f!`%7_Ze(MCSHJBnH{`MM=DIRJ*fXyHdyk#)HkN?)bZ!gbH4#*@!#;XR1ZD z#QDA`jx{|~X4=Uk-jtX?a=|&7#l6KCQdKeSf3BQVLtU85q)hL{8!g6EmVC2xjwln! z6Td01BDGo|qkNjXD9yC#Blh+;S-dch>;yfrdVL>$vn0L~PwiNdb55xO9WjyCw?MOK zrFixGcSkzl|3ElfJyo8^HtB+3u&BgBTFD~cb7GLhuC%rFW=VQERSy@+G;vp)2iP#{Z0c~>znb+q#vlM&A;l`? zn1zVbA8%VM*^GG+_tQ5cJ9LHKYQz`W9;YQXN{X62qZlQ75Jp`tZkYx4G!>e~X*?i* z$;f{%8R>N*TxSvi6n^{@A`-R0`CSm zuH$xwy=nL#ngQRqKIbF|e0}rUpw@oDdC7#C;TvTVK~rRxdd3tWvBuJ+9xkGy(^Al} zs~lK5v4~M4zm1F<6)aej!p6=S5xd>q9;1|5RbPMc{5!C#n~s6Dsb@c58sRHhX}V%T zOQbAk3wGKR>`g7+lD~kGheigK0j%852cd_36Wpc1Z$Xg^v6KKmtVP?!x>4b8%h}CJ z0aP7)=q0A<*k!3I>7=n5P@`VX>-qWkZ0z)WT0&Tw zzKO7FbqTm^V}-Te2&+<4qqF62`SC=0dOrDTs|&DSylpV2MZ*049$NXLs&*TJ_&URn z=No!rO9O-N?)-g#`Ymo;Zs#JLP@Q>FInBUQ6ZxUY68_{NhLEF{?3=^G`rL2-W%sdn zymwJ)Ew0>q9D~3+rLlib!{?3w!ynt;xtd6`Jq^&7P}#e577OdJV*#Xo9Ue^hN7|>p zQ1KWvbPCrNZOY}cS3ITdrO+$L{fc6V5XOg>PE%*;Vl{Mp_%{|VaalXE+GZ^03Y?7gH(TRp%s#Vu0 zrs>}r2pl~$WaHVnZ(HzNvCUi4(TAGG_YdGoP4v{r!FP9(wHWgZ-1f{_l$+@4O zpN(V;Xjyv@93FUkbBT)^#~2|MiA{tlm!^e-cExQnk2}yNt|!2m=ctXxdb0Y;VtTi1 ze^#}hCu(kQW2o)=l9VYmHe`lO8N6-jn9?k3rI8DpxI%KeAK@mK?x!B4jLmpYa2ll+-u5dS%ENNyg329hsTvCv3_Ly51N0{#z*ES}nhe$+G z9yZf7{&2yb1A3Dq*_!#T`x-_K`6Rp)ko7YbP|7gv5u5wrkTpi?azwbni`*4 z+MHdknhGmq_)pqDtw6D2CcEuP<<(F4*vT`;9XpD((Y|r+O~Sdby2fs?mpuc5wMN3h zaJS5V4&{&HB4qUiHf(dd9d=&#OEvqhd;x~@K~4c>YiDP#OBL3EFOS7`FWcANIG=5$ zOFq=0N+)oZuNigqP*g2))hFNE!)=i9n~owD1QsPGa!o-OF_8u{Nw&guM^$)2>dnT4 zGX*(W^I(S7Pbm<(a%bQjz=O#O*{=#~%|tmtLzl$4DY#Xt464(X9EU4A`b{#wp$EmF z!rjr2!rmiZrwmLu`7n#-mxauFvl>(kiyZ1RlwN1d2!Jdjz&h^X^!sQUr&(>2?8%jk zZmTLGtnw~H&U@JV3007+B|KAMj|I2yt{ujeCws3N$`#(tQKio@e zV_<)yrRAh4hV&oswZB+VHZCTQEG*0A03M|-fEb8uOaV{Tha?UNq)ljU`SY>*B!&iMz0pS8Tk1o$jfXDuPdv8XoKTA8`)1_AHW_wy$Ex>{2t1K zE|0|T10xQAk`^YM7UEizmlL0v)mMZ!Pdg7!uC=igtrkP2>O$e+G!BIq$ZCxP{On$} zP68G<`$Xw>HIG`jUCzX;AW*iGUV@Wkbz~J(ey!>-usftR`e)#zoqbaf?mW&Kn9Cra zGvWW%u|N^;Wsrr~4;tx{poToh#e4)g%RK2>uV7yg2riRalU9;(%x10wR1K~G&gp;} z<f9XC!FTNvO8ri}lk$mTX`C7WgV%DDG((OaM1LEJyvxlVP^gBySqi zj^g7B8)GuY3r#x$r9d9mZ1Klp}>*1V)&Yz9Hb)PtqHpMS-xO z6!t(smjt!V_*B*eVUKFVyK=-;K z>U=?~4nm=>*(u!@WfvoJ~@0eNryF_GoN$?W%M3Vx~Rc zhITJU1;ETkY>N{C?T!W0%t{vT%K0VExXzCode&oGJz~{my|js?b^BKs!rH@9E}(dQ zmDUHRqI$jPW@MW#y$v2and}Z6oT+g~u3)xrFEo3OT{c0vnuQZrEmfLVXv~KIK(T_x zJc*#s8dl*Rh5FWIAIF5YH8As{R7U3L=;n^fB zBg4Bb;o0a|;X_6~-e52SpvoX}C;kaU7opEYcF_AxByTayQzwWD2C3pT!!DCs`-=ko zTWLg>0F~!VSPs}G*GeG&zsWxsSkfW(DYy!=a>U#DCBoA!mW!GxR*C)~NY#fPs+71| zLtcNP*@>?6bl^K~Ub5`0G@h<#l{hTgqNZ!gJQXCtr-bbSd#s#@861;Z(etLh# z(K^8-q1CNch1c3IJ2x+{qpH9-i#L*dTxA{=a0v8thJ3gYNL|&^SZo3#!_e`dR>BhK zG@~iqp-le?SxQ(e%c zo@DviX)sAu8RoepvOaRseJr-&P>lw0j5IO5xAv#2P+O!g2Yd{FdX8JxVQBJN$S)f_ zjDweGZQig~{!)v2$lC)asMbeB;(@fCb5YtU7Xmv5=JH+r!47R1cJsmumJbaD0#YLEO?t$PJq;+Ys?eWH^&ARW`s-P1CS_ zUGWP6DEOy%&{?u`HK;8cQ>!X-NZn)4uswg>revKX#mQ(w@r9^;-f(n&h&}V4?YZ9s z%1k&sTG=&-9K9|?B}Z|tLzK4>BmA(aYlAv9CMg^)_{;p6;(`nlm z;*F$Wv&G!xjEHKdq!j?urw%}qsSm9hbyO<6q(GvI+0mOb*Lfglx?kw3`!`wiYHQ--cMcy^Nk;g&)mFXi1lCaLjlRDv1UW!Me>d zc7+}Ev`Wp7yxDB9^)J4Q(Q{)Jd}0Hx{Y8O3;oAYp0-ng|fN0_)reQNwX-+?rjw>0F zqpRw|0q7g{Dtg!=G$xHKkN4x6@8g>xE2&@BYSRToPZDIEZR{G;Rhb{Zwqx>dvy*#^tgqRLCC!i6Ym4SSAkh0ge zl_v=gg@jvws_yJblg>7elbq5V|Dtieg^gt+to?*qGG<#|fNgJlIU|zsiAO_a(H(47 z7og5i;Q&}Wq}H=LEZ1e8;CBg0RL2BzHUE$M^>!xCAd(5I4OLI`EskTor-gJ9cP!kh z&xH3iim+i=zTe~dnf&0V0B&6_E4e!3`#75FwZl43fTQ5^gN@Qf;9C@eg#moMB`+BB z@{@**yeD_Gd;22T+Sgb1sh*OWC z$Eyh^Jty9e$JLivxs^OdCqv>CDGWuRj|Kv^%v47WbiaK{mCs`&{w}LwvvJS`A8yqn_q8J_F*L$QL4m*$@Gm?&O*p8K!ovSXUQ&ZN8D( zy-y)ggbYOTytzIf!U(Ikm>Vzw2ghO5-D8u@&ia&{^Tk&k*KmxpoCmQHkvZqEnxrGoQkh=nHe7?Hh%lB@a_B$Zzqvlb*-_*Fei$?oLw~(+* z+@b_-)DfyCK!%d3cW^uBB5<^V6YIXbxHLX5Cs|(y=vK>zYVTOYVNUC_w7WmMn2(o- z&v$4ZOr!QI*EUbPSgoAYqk)$GtSIj{gRieFe-=M4y;LY&yt=rxv8$t(hc<6-Chode zxBEF0v?HqDq|KFQQx6ZmosW;GKko;<|Jksf4W+;S!2$sIbN&BqSXlr68`h1_m)jO= zYwdTmwl)aHi<6}2@y*E{^El6g)=H@JH?5SS z63!w+6h-m^wO+X?a%NvoY{4_eNq~jTWC6>v3H3};_2yj+Ur~1jk*cQ8u8Bl$Hx62+ zkw&lh#a4qQ$4du@p=N1ihMDC}#(Wm@gd-!N?X4MdrdtG_2o57BX&a5;sD!AtIr_nr}y5{AH_#&wPLAc-| z$q{vi3uF(Zd8V6$xJQ12fzhEL%f|sYkdox+dS=L5VKVZK4iz`rH6oSsYi$dUcfPCUoLgRbod6UHaJ# zvrclv%K$8>QOc)Gs&n8WSN+=gX(pb8_F!tQU}NSyGlmJ|s7;T@?`IZy&(vU@!S^iU z;<}`G*9dhHVToFDj06p&L~tUcxuS6HRj;uY4)K1MGHkSwYD_nFy^xSpTZ2{RT*)?F>)#Wf3 zZ-D01zZV!r@z+P$r6FKCosWfVI7r(6{v;3ybu{mw28ha}4#^-{V<)&x;R37#X%>z*r?+cV=b#N=!Ii9PC}q22lV{Cyt=ey@`; z^pMv5ET`Pm{&1)FBKurm-XwYC&ORko;EgdOi6qQDxncAeK4*r~sSCqvNp@eBI0O;T zUdYf6+WA-Q~kE*O+5J?y2*-;Lz!? zmzQ5&nliujj8HprqH^e$9B(uC(*_u@&&WMZ&s`W3STqnbA2x>tiYK)s!nIaKCq{~?Lrw@3e|n^nY*3iCcHE&Yz1u0KBka0&OyB7N>8ZXkTL&NOXZvSW>4>2`}Ro`XP~|j zh`+xJo^{xXekATJ+|o%@pwFXPM6?II(x0zUk;aw#xoSV+LYoJS3PBANcG<#Cn4d~o z;x>8^mXH9&B>)V^mtmbA|nYrD@oA%j-rnMLtu_jFjcC9i#zKsw`%vH**XqC(}D1`@|2 z+nA19?<2o9Qn)Z-j`{ZQ{Ar5&iQ66V@B_Lcan&m5`6&2e=YAuj&V6Q|vVce3RGkZm zfyPLX3t5e`rSa!B1O)Bf8EdhWyO0rF`r7ELv!F~{-?-ygklrwH%llr zzj;lEkZtVC=`+f|7Zh{)lUuKTn@HMVQ-e?q z2OwFw5iJ@TnQB={KoDcV^uESBbyHI&Ekak+TMt{^!TIFvtq+_TpiD>vIzO~$``72e zoCm}Ah^J%M^i=e$;;UYMmM~XFH-v>Qj*qgK)n;UczJgRbrNozCSz)RRTC_}1#7)<_5@eG|v$T!? z!#Y)@#WUadcdmK}?+3))AW>Y(x^;qD@oY63dW_t7Sik4zTt(jYy(~iA8Pbp{<8{uV zDO6X&(CkPCIb?BDL!3FJH@VztrFQ{%+tl!h$D_7xfoI_4BY}oP!|J?dk$9rWU$bxC zfioplO!0NUP!meLD*DQQC2LKx(~s|NAf?rFGA0e{P>DC%fmhUf8#rnQ{HfLth>pp5aXcsEO`AQ^PAd*W1)%EV1IGwK)Z&K_#|LYg_ zNe0mrXLeubgkS~VgU1zz_hP0i>v1bd9DEzR0#h1(yeNIKQ|OC&rB73?F@kO&Xk2Wo zEr2^3lEzh;bpX#74-Ro!?^_l%!*Go?R?>b((|S{x(1~hA3#|%r`(x&Nne1Mll~M~pfxip_bjEx`PNF=IB4(^c5$T;tvNqhf zD*KIo=qnC4twM7J~(%dDYKw*S!Na7-=Qe-TG$#)QiX~tDgsF> z5cq7j2$lMN5$Qv=(2oc9@4#2WdDy+O>^);ayoUQ;6?dbT$2`ycq9jU=-fSN$ntjES zxQa+JbFZ=EF;c{DhBq>VMztOteiQ_0l}iYLhk_hR`!iY>qc2id!&jw9?cZYfX)}b? zM+;msf|aT}#RTtBrTd^WUeg5kQvf9iygDQ@Nz0Q3Qs3AN(Fy1D8sdpRsWt0eW+3#aomP zm~at@1K7j317Q;@epBk)vt+ND)i4Sb1q8+?wBy7?ZV7P^G5~v3f&>D;X^ndhP4`Vu z9oGro9j%kZDZxw=zuY|9{kl*P2=A(~I0xjGKu3)}*MZC;@IWhnWW5G-9dH5ii)ruZ zoLDwfhx5+EeilKoE9SSR?HhOOUnhfT)pZA7f9XJ{D<9&0a*auFkqJJc+ zSYOnI1;O}1s5u7E)UfKIULf?^nI>0t{=zVy>rz@!KK-m;Gm+gLFO$4^Tdt7=;{-ZM0M_#88-U?XX$}pO*E?rP_wYWfyL66gThD0K#whAb& z{}$5r8~uHNH-IL*FiCvR4?U>VqvJ*KZ!QYab>W*^M-U0LXqU$2K=Hb6nfS_dv$eZ$ z7LkoS2MEK-EkEHdl4v@Y9v+WDy9x@rRO0Wbamn(9!ns+oC;<-5+Wbpj2}x8lgXhg= z!-hS++{&Z~`N|yX(FK{M4m*zXKyr=|+t7`t8FTyc#^w^!Q$gQOvdiz z#o}ydl41J@7J95aBUb;I^F+$)g4OQ5T_uL}9yN|7`&A0Zj)W6-cTGvSp%v?h4I+E@@7qVF_#jlN~!j;IRG;1VWgndAl|TG@(*Un88*H-+uW|#@pr48n43K6}N}d zv??EvFF!3Mj}oNE)H8os zD9m~?Ct<;Vv_rk9HlwfcDSTq|pdiB&w7~Q7ftxR)(^7~Uw!l~#| zB@*d4dh(wGR6=~Asv5xU@^NA`_H(mi4)g;b6_7f!ey4~D53yOvCuz?%&4meYJNhS) zXhtMh{f)qScX0BOgeV6dRMYAz%jDkDAb*W)QJl}N(J)OR4XB?NX^?n;u7c9@ zMa(ZRP2jy1Ty=%#c>$WxKCT0zl)G?jgtsg8W(=$LMH2$_O2RiUgVL7(?W!U)04m7K}s z%=@w3jeYHd-+bk&Q+v18QjE;#k#%z$%2+B{Q9`O&YEhGFsgDkpvfIOciF3FXMctqd zQ>sZS-$x(Ws(wNrI;S4F>Lp6@x?B~33Z=#~`7nqxMIbFh5KVOGL3E@sc{qpWq>AX- zQ|_m|;A?kqnPee+)564=6piA*10kl`#*$@+D&2QKdQYE3;U|r2o|5d4&DKs5=Fn^H z2Jnt{YCu%f^>8x6l9x7$7(W98aU++sLX(UmN2-+A(r@*=1;`8tMlxl?GG|f}eC8ZI z=CFkr?NsVw&@H1nLSCqKWs>KrVR#L00Sp>7wby>9SWS>)?tfL3T#ZuI`(Y_UI%Su= zItx1uEiVZX>{Jw#EhRqM4?3q2OPW1~dlpoFTcWHzYB+3C=j%lq+5Ah`&rqEl{05+I zE#mb~!mC`Gs`g#Q5G_^h6WAnCu(C%~_SxKXO7Z62D zi=t%Ri8`H26=dQvbP2(mLA+rx0s`7dRw1gN;aBY36T*t+C<)f;zi)~9tAT$MQ6ys> zW11`vRnOFoiFtZh1Kvm?lm8Bka|5G*dN+dz{iIa7I1?SgY4o@~J}y6+G>P@abRcw8 zcGUJxJy(RWv%afT4QgANJ+4;o=Fv(GreZ@CJIH?FKBRjUfEq4#1vNB{&f>)_RpOr<+mh zJ@1krLZik`g5z<-*#hU%7BJ1BA@YPObf!tPx92FbW}FVy4D8c|G4W;9yR)-P{~&mW z9q31}QuXwh8u0#$F%J6~!0%z;p-rML-mtIdzKlYQ{WOH5AAd*y2vU{@r{ibkpO*K& zz{YzKnK~lEXde`fDe#3$?2$VlMuuN(f8zqjFMN7X(2L#`EA*w*Iikc1Vx{%DAYL{E z3H5#&$V*QS8arM}ASb29mf*tk<0|$YEqq}xMXA2TBwhEi31!hBfYbGVKZx^4#N*5v z%%@Usa4G%;hK~3uOC^%ns||(;P5|aYXwrg#CWMX=^c(@&9Kz#QOJ(A_eCUrmH?IP@ z^ril7=~{rHL|2nS+9m>F58p585i66lai53c1 z(X04PIB`xKG_Re;&CSkE4(ojZo+si02?FAi`>8RvspDsWU!RKX2|4`t(;)a@Pl}ff29zy$-<1*?zbO02Vr57N^SfJ$t4cu9 zuK>`N5*~sQn*sg%_$XR+K$NQika6{2x^s8e7Qmcc_KVDKFoa}5Yq6*eWD4b_ple8{pus-+Lx_vOu@kRjK^N z{AymDZHoy}hPY^MZs~!bW$t6SCKZ}zYAig=84jN)^PS}6|N6$Tyu}H>to3^**XW=&LvIc zc4$xs+pfTVLAl!e29uvvL`*8~=cBP!6|htCWE7ai%YD;mgrUnDzqmDsZiu8!;+wyqS|WY2G-w9x8}37G zs6)%7W-OlZIJ_&Lam-&z`*`(S`U<1`P}t(ZyiF^c2?DJa-zq$(R|0`BmZ!RzDk8?$ zypOffyDx!vpI>SoXKJ^5aTGC+f@k$)+5G4EPI5dFj5Tol+1Y*!q_YEk`uH=P*;&+7 zkb~LP*;LwX)S1Dl{jxll131)0p3XLt&O5_{*IT)*fdJa=p}{GAGjELZK_BYv%}4k^ zd9>eRgGC;d_a=TvKR>-R2;woVu7O&x|9N|nZF9CShX74H?7G{ziJ?IeyV1gvzql0e zGj9J`AY=xBByREP;Rb`1@;h?la#2=8Nx5bS7vNA1Y4PR{&;57L0mIV_V>{tNs?h zG%EtwQ4-L*wB6Qwha!X*&jR+sQ~I&DLeR?T*^*=dr0%!y+pYvuNEjd^O7HJA?Qh=( z8l7jBE`fu<#Kp=;>p6H?1x(PMB1pH;>beH1X5FJyo=6H%5$&g``gx&rwb_&5_qlTu zWDQrmwz3bC26}FRuel~QhnR%>hg>Hc`5#-ak>0H}=wdiB)K*>*+u0(uC6rOtQLd0s zug{t9Am%9^U?F;1*ew5FecV-0T-&w=V1fqs#x*zu2@>2bIKidS;Efa9-GjTkYva(k zySqaOt^tDHmnojQlv7i+**_4PQh6?%P-92>pjEcm2SSy(si&C7;Bl& zBGR;5qwyxA$fguA$1mGuQ8IR*Wp{jPY+v=aQw0R4VHo3If@8Tjzo)o+e>E0cF_P$r9MB|+s&!t*w+dieU?wuQ zW*x9=Ms42*$<;#StYtl}wJ3yFw`8aw8K_ep7&9feX_2|?uB*7#P%0_H?8WvHZIr|s%cXzKbP z)Q+VcCN84LxieEA;zkBy&D+G8*GkePh#YQp-8YHU%h9$CdcchEG4p6Sq3WW{4T-t4 z>XlflU_bvhR3hs+sP7|1wFVaObkNwRI+l&NDn-sFxrcQP_Ss8`DJ`L@%Z5ZT?}M}L z)RXA2mcgG1TdYd}b%ro6H%cE~uC{+N4vBGzeu|=;iR9wq%KJhY53N8>fqu%a(i^}O zmWO`N19Sa|r^{y!22t2A+^8W-J;h-F zPeuCC_PobDGE6~h1@De0-<(-*`2imEIZzrqmsvG)yNme-zuDM(B}+XYMo+c;KJU9T zkILLZFgI7c-sRVl#}nQqT$SJ0JQyp~_tQt2$Izy(W}T@*XIr}^$`w><`DG`vii=}? zLS#*Qg5I}lIBQB*Ux%A59sLlu`hFu*6>^uxSA3ZB%13gwYIZ7==iK^61zSs%Y;j}F zehRYV>-{WXVIA+08O6{teLc&OCji;v$^1Gz8`__(|JY6c;vL)PmJC)rq{`h}Og?3H z%hsj2(87{k!EwGikB~Zo6&gpXLWAU&`D?cQM)AVTez#V=bM~k@UiubK97p3w`RhdKzpf!&-mWP z7-ZT1NTZR1-IAGGTA1syQ#tBYc`D)qe0bjyABoalDX^htQ1Kz1j&*(;$DjWA+;LXL zTgxP~$_eV#NoMxQYhDs}boih?)fV`@x(=j<`b>a)rv~V5x_oLxf7Mhv;wnzDvj*WI zQhUC^dFB#(V!PWeSMOjQK7FQ`NbyMC!uVl#>_=iPP*VGPC#R4fUU`NjK)zr%mPc&b zIZ{@#?DLvzp)YG!OTNlmrduRX%BBH{qu&1@Ga?!QwnXH3*J4#_VfB@p_ucKbCicEo z#)Patgf8#6h?-Z;MBbv5a8VkqY{A^twz_pJoOT+63(dn_tPH-a0|hQ3v0o*vmN?}> zGL>u9BOtD*6vHOej9^_9b%%*z=)G>0FX{q!?~Y+8Ah^+~I&^b|6iY(knJERS=h;ka zypAy9t5s)vMJidyaD_|ipbufc`bzsNX&s3t-15kPtiU`tcUrnW^s+sqG7Inn&?R*I zI4#ow>kUY<)*j2O${8;jNFryC?ckfa8E*3YP@X&&c;b9Dq0K*QL zd?Io&bBWn-8eZV8CwpxG`(q4!SYg9y>c+th5)Nsp=ykqpY$94Nd3jQ=lt|5`*PJ82lxR-~nM5I_65uI3k8kOJo zS`-=t7ts%(TGLAoNHZm_KG%64&=K&QQ)L2`>>eKp2f>AR$A>rEdZgyc9Asjto$QEO zdVco8mF%HAi>X=rrkTSg8?RbnWKrP9IV0u+^~%xLJOT+ygSns0js<>YpoQeo64-w1 zV4F59XUjTN=zk}SD#A2Cae@J$X^mKI*K0~Lt#Y1Zp0Foj*HfgwbJY2TtELr?v`T1p z@fsJmqK?;<7EtzD)O9u^S4Gj)VjIR~zMz9UpgSI(#MvxF7XZXTq```y#j(kC8#iexTMkbBP^(25Dcj>ux)`^He8X zccPg!ZtxH{=z7m#vb*byXJfqqR^h{>f1Np`2}{^kBG=yo<%{{aslLUTRxxlxZK+%U zt;IN5jqdqCmK%AuVNx&9sZ`B*9vE@=MxHH-GRa{8InKsF%R)WDxSae=wdfiaYqS@w zn)U1RV>l_UTDi%_5kHfYOSyR^KX`sY;Z(Ymtj3d#3g(=a$efU4*}NP#w9g)anhc99 z)kc~XU)wC2!$cTtY4fG*Moi5Zjr*owSfs{Mg@C_WJq0S!cpWxz>Le%6(UZzw>g_~0 z4bQ#m-PBYGydZwMpS1e#OqxL9+%z^)tCKT(Bsi?$bqfGi`Jrg zQB_Lg6|gBnf3vg9%C^I^Tg=xo{hnM6kpDxfJueGS~PIj;Rkvk{)kv0e%^V`x3s7%Pm- zbnO^=s4}+KLSAeo_rbc~onjb`U;DN}yI9jEM&HsA8GP;A%6yJ>$s;k8Gv0AeDO=^1 zjKYii_Q3<|xSOr4PuPkoc_!mDI&-eakNmfl?QCH-qbmj^zec7J! z3TWP;xzW|wU196~ax82;9y#58bZ6wm$ZS;y|#BmBT> zr_Zj##`7(loaQo7dI4}Jn^&13!C=39g%TDlIz&{iH|!R3p5#^08O%?qL*k@DrJ7sO z1%e{#u|_t7QjPb_*A0JZMI*?h)|fj|v9#Dks*;8(1r?{c|{b;g&J%5V#1q<-UH>1XP02;idoD=K{It>Xr-pe}HjhdR|;V$Ft zDA6|ale&wd0%N4o6~(+E>)xfW8g^7{(l*LGiZt<|t(Iv(%223XvZKex#=<~OxQcDK zA8zo&29rxC=T6%@b3d(ay=eqpFCxb;JQ$SdAyW>9kXE#Z9d$^ue>M^p7mt&x2jb@W z&F?=67tWmMLG1gQQbVbEvCH3}M49$QL}MD#%R(jc8g#OQ8Zv!0V^yz~YxLngQhfcz z6UZ*QFRuKdu)U%tyNlj1p;MZQfRO_!*7?d&jB}3zoQnl$=DtbG_$-gm-tQfhNM;y}e%h_UGTs-fWO|k4_7aE;_KiFd_2<&ysZ1yQ~PR2rO=l$8R z*NNL}zUq13*;H;zbR*nmZ3PINIgd}?NrHdGs|lCzJEt_ED`m7NOCkYUpyXN}NI?I|38=FF7NN?PqY+H!NxartI!fr=ZEjO790sVv$-4iowX=JF!+ikp5wf`g%fJW zqA2QS`gYp)l-z?XVbT}x9J}vryhF0C>>bfd&?3a%*#lGxoI4daW=TU`DZk>G*$apH z?AO1Qr+L4&jeJW%^vy!@b6RR8YSSolymq7$U2UEiVL}IU&wo0ZgScN{x6sM&n+vkHxLFGJH)n zZVz5pjPTWLm}s3P3=&Ey)D|hagXTI^j;<4Bv|Azz@tFL&r%kV~P0K#czqi&pGb0&^ zcGV~5cck)Dpo&G!6&gVXZ+K^5W5S~3s4OT%7WVzzkA`V(0)-ai8K!ogCLCOEH|E*vL@Bqy!Do(;uC6y?_$ZhclGAgmxZHWYNo+Cr(={GI#Wppe&&6Q`5nEe%jGiR!`A9vrE zWCO=ENgJn-OG4omwDAai!Ts}k zTbAr2=|f6Og4E}2q{X7H8?6~7=&Ticq^ZN-iH}2^xFU!Erv4NNh@q?#2jD)^(fK;* zJS~24aBNe*((+B`x6r!d_Y^-7ybCKa`53XKkY%{zgUzJlG=@35IQ2~>VuQJN^0}?T z>y5hh(Mi1O^~2`2*-?a#jE9j(SKROO#iFIYC|&eGJYx+%dnL30P=TSf^};%CL$C=pm@7yB8`O7t52s91Ac!jh=x7-3S3OXc=zQL1xzmrn;p*3V!a zfHu=DJZEeXS`P_25ZOUEZM3~S?HvWcw;|o3_nqs^Y>8}gz zMvRDW^Vh~$1(1iWP_rt@3BK6?gin&0yWg%)pSww8%jTdD_lJ?4#l&3N$df9mKW=X$RK-N zmh&Oy0F)#NYKMYwGU;%;uw*S_9V@|~)j6rhz#f%f13E^Eqv$Ad(=H=i1@j4zaU$|T z07CHA;2fH+qliQf`4`0Cvn;l(HnpKdn5nCPYkl^u(lTdck8)G6>F`Q3mm8gn>$ZB>lLwWni+5_Q}+LPfkeL_^D8h)@aJ{Eeu1e=TL>Y^YY}E9UvsLe?OjFJ-D6OJpga!|gC4uj2AXe0{J3fr=X@tc`7VaEi9rW%I!Dz(<&ghxtj z(k@8wq|~IQF4Sg_oY%=EUScHZwJopkNRxMXDX^ay0*kuruQl7)YsH}U3wR3A3M7(F zM-(8bTdt};7r}~F&?uDv(?i=G0Q%5^sl)A%;E$U<$MRKdL4v(}65QWvr6n`jCball zgh`^&$&wg^ha0A=2OmY8jiMW}^~7Ibl}eg@3sQU>i|cBR_fYx>wCB^f2r)iRd=jb5 z12m2pnl4NRS0uWBHD5Qki{9J{@p*>MGuRk^N_WAxXprO~%J8s=Nta9=N@~EQXWCJ- z)3{1#UQxwjJGzZ&#IaWBL<;mbvmzpgC%`z|^<6w(FRi(e94UH-4a>t92+UT(^ZbB_DAU&I^H;el7bdkWV@lG{C? zKQcDTBl}GZ^+?K#U1ZY}zn*E_(ZIIvw%+UF8@_3BX}+&ia;b=~_RZX}<1tDGhtf%qks!bUVs zYgWX-pgNK`HJi!%c258j%YFg>sL%<|V1q>jiiJgDqJ+!-s3@png`qs9Qh#^rgz4+Y z>ASb%MhqB%5mM_nNw_e4CGrc?r3_)}vlVIcE69W-@j9U0?A_ho5Lwyv_t|w;hGfWR22@jrusufAzBY&-#-5(bVI%XM z63iPc9%#hZjW7friDKT=)ai-h`#VxE602=9HTGqR; z*cc`r_CSfnFdbK1&AMg)v7qYbLqh@m&tQtx)1Jr0AcJY2&;?e|41u%VT^NcrLwhSWzyL9Mp zp2ySLN0RCGJdrgAB=-66QQyFmejEJa8ZEhXJ-Zk1952V{Zq4>5)XBdExc92#N3(mN5sT zp6xdg+xKVo;|;VB%>S(;|AVT6{r;T(GhY9 { const exportDir = path.join(wsRoot, 'etl', 'steps', 'export', 'multidim'); const rel = path.relative(exportDir, filePath); const stepPath = rel.replace(/\.(config\.yml|py)$/, ''); const shortName = path.basename(stepPath); const catalogPath = `${stepPath}#${shortName}`; - return { stepUri: `export://multidim/${stepPath}`, catalogPath }; + // Grapher slugs are dash-separated; the ETL short_name is snake_case. + const chartSlug = shortName.replace(/_/g, '-'); + + const configPath = filePath.endsWith('.config.yml') + ? filePath + : filePath.replace(/\.py$/, '.config.yml'); + const pyPath = configPath.replace(/\.config\.yml$/, '.py'); + + let hasEmptyDimensions = false; + try { + const content = await readFile(configPath, 'utf8'); + hasEmptyDimensions = /^dimensions:\s*\[\s*\]\s*(#.*)?$/m.test(content); + } catch { + // No sibling .config.yml — can't classify, fall back to mdim. + } + + let hasPy = false; + try { + await readFile(pyPath, 'utf8'); + hasPy = true; + } catch { + // No sibling .py — fully-declarative step. + } + + const isChart = hasEmptyDimensions && !hasPy; + return { stepUri: `export://multidim/${stepPath}`, catalogPath, isChart, chartSlug }; } /** @@ -263,10 +300,16 @@ const chartStrategy: PreviewStrategy = { let fileName: string; if (filePath.includes('/export/multidim/')) { - const parsed = parseExportMultidim(filePath, wsRoot); + const parsed = await parseExportMultidim(filePath, wsRoot); stepUri = parsed.stepUri; - stagingUrl = `http://${containerName}/admin/grapher/${encodeURIComponent(parsed.catalogPath)}`; - isMdim = true; + if (parsed.isChart) { + // Zero-dim collection → ETL pushed a regular chart; preview at the public chart URL. + stagingUrl = `http://${containerName}/grapher/${parsed.chartSlug}`; + isMdim = false; + } else { + stagingUrl = `http://${containerName}/admin/grapher/${encodeURIComponent(parsed.catalogPath)}`; + isMdim = true; + } etlArgs = [stepUri, '--export', '--watch', '--private']; fileName = path.basename(filePath).replace(/\.(config\.yml|py)$/, ''); } else { From cb3def69d00ff60b400cf3e20ca04629602157a2 Mon Sep 17 00:00:00 2001 From: Pablo Rosado Date: Thu, 23 Apr 2026 22:27:23 +0200 Subject: [PATCH 4/9] Fix tests --- etl/steps/__init__.py | 7 +++++++ tests/test_etl.py | 4 ++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/etl/steps/__init__.py b/etl/steps/__init__.py index cf1df527029..b083504812d 100644 --- a/etl/steps/__init__.py +++ b/etl/steps/__init__.py @@ -1159,6 +1159,13 @@ def __init__(self, path: str, dependencies: list[Step]) -> None: def __str__(self) -> str: return f"export://{self.path}" + def can_execute(self, archive_ok: bool = True) -> bool: + sp = self._search_path + if not archive_ok and "/archive/" in sp.as_posix(): + return False + + return super().can_execute(archive_ok=archive_ok) or self._is_multidim_yaml_only() + def run(self) -> None: # make sure the enclosing folder is there self._dest_dir.parent.mkdir(parents=True, exist_ok=True) diff --git a/tests/test_etl.py b/tests/test_etl.py index 320817e24ed..209a2e9a3f0 100644 --- a/tests/test_etl.py +++ b/tests/test_etl.py @@ -15,12 +15,12 @@ from etl.steps import DataStep, Step, compile_steps, filter_to_subgraph -def test_all_data_steps_have_code(): +def test_all_data_steps_can_execute(): # find all data steps steps = [s for s in get_all_steps() if isinstance(s, DataStep)] for s in steps: - assert s.can_execute(), f'no code found for step "data://{s.path}"' + assert s.can_execute(), f'no executable step definition found for "{s}"' def test_sub_dag_import(): From c72f13628c88c72f0b3b4fc4d450f83b5f5495ff Mon Sep 17 00:00:00 2001 From: Pablo Rosado Date: Thu, 23 Apr 2026 22:32:48 +0200 Subject: [PATCH 5/9] Adapt version tracker --- etl/version_tracker.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/etl/version_tracker.py b/etl/version_tracker.py index eefe53c9ac3..d02f1d8570f 100644 --- a/etl/version_tracker.py +++ b/etl/version_tracker.py @@ -501,15 +501,19 @@ def get_path_to_script(self, step: str, omit_base_dir: bool = False) -> Path | N log.error(f"Unknown channel {channel} for step {step}.") path_to_script_detected = None - # A step script can exist either as a .py file, as a .ipynb file, or a __init__.py file inside a folder. + # A step definition can exist either as a .py file, as a .ipynb file, or a __init__.py file inside a folder. # In the case of snapshots, there may or may not be a .py file, but there definitely needs to be a dvc file. # In that case, the corresponding script is not trivial to find, but at least we can return the dvc file. - for path_to_script_candidate in [ + path_to_script_candidates = [ path_to_script.with_suffix(".py"), # ty: ignore path_to_script.with_suffix(".ipynb"), # ty: ignore path_to_script / "__init__.py", # ty: ignore path_to_script.with_name(path_to_script.name + ".dvc"), # ty: ignore - ]: + ] + if step_type == "export" and channel == "multidim": + path_to_script_candidates.append(path_to_script.with_suffix(".config.yml")) # ty: ignore + + for path_to_script_candidate in path_to_script_candidates: if path_to_script_candidate.exists(): path_to_script_detected = path_to_script_candidate break From 2409b36faa2285af14d9319fe9e5640757aaf416 Mon Sep 17 00:00:00 2001 From: Pablo Rosado Date: Thu, 23 Apr 2026 22:40:39 +0200 Subject: [PATCH 6/9] Adapt clickable dag extension --- .../clickable-dag-steps/CHANGELOG.md | 3 +++ .../install/clickable-dag-steps-0.0.4.vsix | Bin 0 -> 45658 bytes .../clickable-dag-steps/package-lock.json | 4 ++-- .../clickable-dag-steps/package.json | 2 +- .../clickable-dag-steps/src/extension.ts | 3 ++- 5 files changed, 8 insertions(+), 4 deletions(-) create mode 100644 vscode_extensions/clickable-dag-steps/install/clickable-dag-steps-0.0.4.vsix diff --git a/vscode_extensions/clickable-dag-steps/CHANGELOG.md b/vscode_extensions/clickable-dag-steps/CHANGELOG.md index 5cfb048f9b8..d4229188d34 100644 --- a/vscode_extensions/clickable-dag-steps/CHANGELOG.md +++ b/vscode_extensions/clickable-dag-steps/CHANGELOG.md @@ -1,5 +1,8 @@ # Changelog +## [0.0.4] – 2026-04-23 +- Support YAML-only export steps by linking DAG entries to adjacent `.config.yml` files when no `.py` file exists. + ## [0.0.3] – 2025-05-27 - Improved decoration system with clearer rules for active vs archive DAG files. - Enhanced error indicators (❌❗❓⚠️) to provide more detailed information. diff --git a/vscode_extensions/clickable-dag-steps/install/clickable-dag-steps-0.0.4.vsix b/vscode_extensions/clickable-dag-steps/install/clickable-dag-steps-0.0.4.vsix new file mode 100644 index 0000000000000000000000000000000000000000..995859d7af123f9a306767cbad9c723afad6befd GIT binary patch literal 45658 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

9vqEAluY-{=u=9ZZPdy4%ZM*;$}<3_2tB{jLB7L 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 WMtr+z7#O6tW$&$3^eX>3`u_l=VW?*S literal 0 HcmV?d00001 diff --git a/vscode_extensions/clickable-dag-steps/package-lock.json b/vscode_extensions/clickable-dag-steps/package-lock.json index 8b0af7a517a..275ae1a81b8 100644 --- a/vscode_extensions/clickable-dag-steps/package-lock.json +++ b/vscode_extensions/clickable-dag-steps/package-lock.json @@ -1,12 +1,12 @@ { "name": "clickable-dag-steps", - "version": "0.0.3", + "version": "0.0.4", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "clickable-dag-steps", - "version": "0.0.3", + "version": "0.0.4", "devDependencies": { "@types/js-yaml": "^4.0.9", "@types/mocha": "^10.0.8", diff --git a/vscode_extensions/clickable-dag-steps/package.json b/vscode_extensions/clickable-dag-steps/package.json index 50467686337..7af9533c025 100644 --- a/vscode_extensions/clickable-dag-steps/package.json +++ b/vscode_extensions/clickable-dag-steps/package.json @@ -4,7 +4,7 @@ "publisher": "owid", "displayName": "Clickable DAG Steps", "description": "Make steps in ETL DAG clickable", - "version": "0.0.3", + "version": "0.0.4", "engines": { "vscode": "^1.100.0" }, diff --git a/vscode_extensions/clickable-dag-steps/src/extension.ts b/vscode_extensions/clickable-dag-steps/src/extension.ts index 8b943f33af2..c5a0c44c222 100644 --- a/vscode_extensions/clickable-dag-steps/src/extension.ts +++ b/vscode_extensions/clickable-dag-steps/src/extension.ts @@ -56,8 +56,9 @@ function parseStepUri(uri: string): { scheme: string; key: string; version: stri const dir = path.join(base, channel, namespace, version); const filePaths = [ path.join(dir, shortName + '.py'), + ...(scheme === 'export' ? [path.join(dir, shortName + '.config.yml')] : []), path.join(dir, shortName, '__init__.py'), - path.join(dir, shortName + '.ipynb') + path.join(dir, shortName + '.ipynb'), ]; return { scheme, key, version, fullKey, filePaths }; } From 6666d2557688ee07151de9fb8100173f3d35e42c Mon Sep 17 00:00:00 2001 From: Pablo Rosado Date: Thu, 23 Apr 2026 23:08:59 +0200 Subject: [PATCH 7/9] Adapt step updater --- apps/step_update/cli.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/apps/step_update/cli.py b/apps/step_update/cli.py index 5a111897340..f6ab72df82e 100644 --- a/apps/step_update/cli.py +++ b/apps/step_update/cli.py @@ -198,10 +198,21 @@ def _update_data_step( elif (folder / step_info["name"]).is_dir(): # Gather all relevant files from this folder. step_files = [file_name for file_name in list(folder.glob(f"{step_info['name']}/*")) if file_name.is_file()] + elif step_info["step_type"] == "export": + # Some export steps, such as YAML-only multidim charts, do not have a Python script. + step_files = [ + file_name + for file_name in list(folder.glob("*")) + if file_name.is_file() and str(file_name.stem).split(".")[0] in [step_info["name"], "shared"] + ] else: log.error(f"No step files found for step {step}.") return 1 + if not step_files: + log.error(f"No step files found for step {step}.") + return 1 + # Define the new step. if step_info["version"] == "latest": # If the step has version "latest", the new step will also have version "latest". From 0ac93145fddd176ee422c3fe6eef6c4348f8b712 Mon Sep 17 00:00:00 2001 From: Pablo Rosado Date: Thu, 23 Apr 2026 23:19:32 +0200 Subject: [PATCH 8/9] Remove arbitrary title_variant --- .../animal_welfare/latest/banning_of_chick_culling.config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/etl/steps/export/multidim/animal_welfare/latest/banning_of_chick_culling.config.yml b/etl/steps/export/multidim/animal_welfare/latest/banning_of_chick_culling.config.yml index 750fe75019e..ab9bec999d9 100644 --- a/etl/steps/export/multidim/animal_welfare/latest/banning_of_chick_culling.config.yml +++ b/etl/steps/export/multidim/animal_welfare/latest/banning_of_chick_culling.config.yml @@ -3,7 +3,7 @@ # https://admin.owid.io/admin/charts/7118/edit title: title: "Which countries have banned chick culling?" - title_variant: "Chart" + title_variant: "" default_selection: - "World" topic_tags: From db49efe7665e8211f42227258f7135837940f1d6 Mon Sep 17 00:00:00 2001 From: Pablo Rosado Date: Thu, 23 Apr 2026 23:28:43 +0200 Subject: [PATCH 9/9] Adapt chart preview extension to work with drafts --- .../install/chart-preview-0.0.2.vsix | Bin 23260 -> 23258 bytes .../chart-preview/src/extension.ts | 12 +++++++----- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/vscode_extensions/chart-preview/install/chart-preview-0.0.2.vsix b/vscode_extensions/chart-preview/install/chart-preview-0.0.2.vsix index 63e72e5f3e76fd9b24dc65ad90633b0a6a46f48a..8fff6bd349881b1db272b215bf19056b1b1f70ac 100644 GIT binary patch delta 15903 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∓XZhFnE1 za9qh3*LfJ+eVLN;I#X~RAf}BiPxf)Tme4Sl*(G1;ai9()RgSLKvZL~ZiHXLdzbJoM z(hFtbS;naxV`|J~0HJHeCR1fr6PyiAhrrfWZ{N;vqT%+s6Ds5Rzl)L*uYYPSD|yot zSUHVZ!kL6c+l*FPu5Yts)crNP9WeJH7tBQz!)@CxFMSe1iWk+bQS71sTU`*1!N!rK zIYEQGj6@G-OL*C{w+bjTCiF?l7BMcEiZjaLhr{8euu9H$z{krw|AgEOlk0M z54N9o0tua3Wd$e;1KguBWy&TqJ2BX3Pn@kZK8iZdRI!*Y{t^c9>_sLpV*)K34PA9I zu9{zh3i9I9Kno}%q3WSnIia_Cboq1ay-B|ENtUo0zV6sLo z#;J`lrDOuJb+beY{}ExKI*;B+Izi|HktQooy)5(_Yc9&)UWdT~KtIEQ1!jR)mj36y z0!@CJ21^`IdT)3*iPyox>7ODJrXF(?|MCW=qwE$%fCX$#4a#WBp$D4j1875>U6}va zDpY?H?tsT()_GFty568aN7`Q+*4t-K4sbu7?^7H0Coyc6{%&ZMJbJ9jNeF#WgC>(C z7a+HFY4)`RNC6m_5gHY@utz<^Kc%*IrQ&Uqi3&G(|B34)qP&GZHkibBh}_(&x>Gh> zCiDs600%!+;3NvJN?iop>SZ^J;66JWVBxq5SkyyCA9J%>z$w}QjclQxG4EZO8Kr=4 zI9$ZrbO>pT{Sgq|#h#Yh*JCj~M?4HOOi$TuG;azY;7L@m{FzZA;(-=Ny25!nf*z!g_y>@_+v$rGyRe15NZha>o&!M?@% zz^LpINL}(k&}gZ_)9GZUC0sG|$EB-YetmEwBLw13Pr~rf`vFCDCmagjwI3ZL()0-u zxI5iBdt$5d`qH=@F#fmRUjFgEd|v0rS{0I0$8wQ-+&{e7b`YSUr9TFi6PNK$%ov)- zKoLBaEr&}I3)R!Tz9VMyewOEdvMGe?-!tru4U2io2=0FVJT%ocA{C72!bo&e7$Mw! zSITIxV4tvo5qoC?e!%57My>aMvRp_+jd(Kdtoq7Xi8L0$#+u3Ya zD_*hyW(xYjqWbpB)c?$|{-RI!rcd?e`z7o~(sU1@jkpY|Fhzv1DV=Jzevv$^BZla_ z$0Xp^T%bGPNa&k&<~+pQev9Ujj`uaxEuz-ae%hIOS2kZG#tpaf`Cu=HRRI|Bq@Tf= zhT>$WEV_h~2q75daph-fJk~$O^&iD4twY#n^W*7DzzcQ!b&%rkPv9>t>Cbkg5QE{v zyA1f*d1&A7eGX$bdQ+Cju{Ctp-dMqA4rkV z#68c8==RY4K#ro-PHxC&e@RlLx+lT^sSCnm`pD{80D#7k|EUW=Kn216Klyett+vR2 z^6g}M?HPoLu5`WsUx$z^ts_MIzn%a4EFR$hjFLc7s$@PYg5)tBWJp}?{{{XZWmvJ$ delta 15868 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 QiXd@F3k3>a^M4or52Z%B*#H0l diff --git a/vscode_extensions/chart-preview/src/extension.ts b/vscode_extensions/chart-preview/src/extension.ts index 9311f5c4723..fd5d9887a11 100644 --- a/vscode_extensions/chart-preview/src/extension.ts +++ b/vscode_extensions/chart-preview/src/extension.ts @@ -141,8 +141,9 @@ async function parseChartYml(filePath: string, wsRoot: string): Promise<{ stepUr * Catalog path defaults to namespace/version/name#name (matching PathFinder.create_collection). * * For collections with `dimensions: []` (single-chart case) the ETL pushes to the chart - * admin endpoint, not the multi-dim one, so the preview needs the public chart URL - * (`grapher/{slug}`) instead of the mdim admin URL. + * admin endpoint, not the multi-dim one. New charts are created as unpublished drafts, + * so preview them through the admin Grapher route (`admin/grapher/{slug}`), which can + * render unpublished charts. * * We only classify as "chart" when the YAML has `dimensions: []` AND there is no sibling * `.py` file. A sibling `.py` can populate dimensions programmatically (e.g. the @@ -303,9 +304,10 @@ const chartStrategy: PreviewStrategy = { const parsed = await parseExportMultidim(filePath, wsRoot); stepUri = parsed.stepUri; if (parsed.isChart) { - // Zero-dim collection → ETL pushed a regular chart; preview at the public chart URL. - stagingUrl = `http://${containerName}/grapher/${parsed.chartSlug}`; - isMdim = false; + // Zero-dim collection → ETL pushed a regular chart. Use the admin preview + // route so newly-created unpublished charts render too. + stagingUrl = `http://${containerName}/admin/grapher/${parsed.chartSlug}`; + isMdim = true; } else { stagingUrl = `http://${containerName}/admin/grapher/${encodeURIComponent(parsed.catalogPath)}`; isMdim = true;