From d2987cf9b231e4bf157569b931a6605db26ac138 Mon Sep 17 00:00:00 2001 From: Kieran Leschinski Date: Fri, 15 May 2026 01:03:01 +0200 Subject: [PATCH] Add hubble_ultra_deep_field() Source template Builds a single scopesim.Source aggregating thousands of Sersic-profile galaxies that mimic the HUDF: positions, sizes, Sersic indices, axis ratios, redshifts and F160W magnitudes come from a vendored cross-match of Skelton+2014 (3D-HST, J/ApJS/214/24) with van der Wel+2012 H-band GALFIT fits (J/ApJS/203/24), trimmed to a 2-arcmin cone around the HUDF centre and m_F160W < 28. Per-galaxy SEDs are assigned by a Sersic-index cut (n > 2.5 -> early, defaulting to Brown+2014 NGC0584; else late-type, defaulting to NGC4254). Each row is rendered via the existing extragalactic.galaxy() function; sub-sources are summed into one Source. - scopesim_templates/extragalactic/deep_field.py: public API. - scopesim_templates/extragalactic/_make_hudf_catalogue.py: off-tree Vizier ingest + cross-match + trim script that produced the vendored FITS (re-run only to refresh the data). - scopesim_templates/extragalactic/data/hudf_catalogue.fits: vendored 2378-row catalogue (168 kB). - scopesim_templates/tests/test_extragalactic/test_deep_field.py: 7 webtest-marked tests covering Source return, counts, FOV cuts, early/late split, amplitude pass-through, mag limit, custom path. - scopesim_templates/tests/test_extragalactic/data/toy_hudf.fits: 3-row fixture used by all tests so they don't depend on the full catalogue. - scopesim_templates/tests/visual_inspection/plot_hubble_ultra_deep_field.py + hubble_ultra_deep_field.png: visual-inspection script that paints the per-galaxy stamps onto a shared WCS-aligned canvas, scaled by 10^(-0.4*mag), and the baseline PNG it produces. - .gitignore: carve-out exceptions for the new data/ directories. Co-Authored-By: Claude Opus 4.7 (1M context) --- .gitignore | 4 + scopesim_templates/__init__.py | 1 + scopesim_templates/extragalactic/__init__.py | 1 + .../extragalactic/_make_hudf_catalogue.py | 146 +++++++++ .../extragalactic/data/hudf_catalogue.fits | 306 ++++++++++++++++++ .../extragalactic/deep_field.py | 147 +++++++++ .../test_extragalactic/data/toy_hudf.fits | Bin 0 -> 8640 bytes .../test_extragalactic/test_deep_field.py | 75 +++++ .../hubble_ultra_deep_field.png | Bin 0 -> 45808 bytes .../plot_hubble_ultra_deep_field.py | 132 ++++++++ 10 files changed, 812 insertions(+) create mode 100644 scopesim_templates/extragalactic/_make_hudf_catalogue.py create mode 100644 scopesim_templates/extragalactic/data/hudf_catalogue.fits create mode 100644 scopesim_templates/extragalactic/deep_field.py create mode 100644 scopesim_templates/tests/test_extragalactic/data/toy_hudf.fits create mode 100644 scopesim_templates/tests/test_extragalactic/test_deep_field.py create mode 100644 scopesim_templates/tests/visual_inspection/hubble_ultra_deep_field.png create mode 100644 scopesim_templates/tests/visual_inspection/plot_hubble_ultra_deep_field.py diff --git a/.gitignore b/.gitignore index 4c8e19f..a151067 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,10 @@ __pycache__/ *.pyc .idea/ data +!scopesim_templates/extragalactic/data/ +!scopesim_templates/extragalactic/data/*.fits +!scopesim_templates/tests/test_extragalactic/data/ +!scopesim_templates/tests/test_extragalactic/data/*.fits *.tar.gz build/ dist/ diff --git a/scopesim_templates/__init__.py b/scopesim_templates/__init__.py index 76a97c4..4a98e0b 100644 --- a/scopesim_templates/__init__.py +++ b/scopesim_templates/__init__.py @@ -19,6 +19,7 @@ from .stellar.clusters import cluster from .stellar.galactic_centre import galactic_centre from .extragalactic.galaxies import galaxy, galaxy3d, elliptical +from .extragalactic.deep_field import hubble_ultra_deep_field from .calibration.calibration import empty_sky from .micado import darkness, flatlamp from . import micado diff --git a/scopesim_templates/extragalactic/__init__.py b/scopesim_templates/extragalactic/__init__.py index 2320e39..cca72e0 100644 --- a/scopesim_templates/extragalactic/__init__.py +++ b/scopesim_templates/extragalactic/__init__.py @@ -5,3 +5,4 @@ from .clusters import * from .agns import * from .quasars import * +from .deep_field import hubble_ultra_deep_field diff --git a/scopesim_templates/extragalactic/_make_hudf_catalogue.py b/scopesim_templates/extragalactic/_make_hudf_catalogue.py new file mode 100644 index 0000000..e4473d2 --- /dev/null +++ b/scopesim_templates/extragalactic/_make_hudf_catalogue.py @@ -0,0 +1,146 @@ +# -*- coding: utf-8 -*- +""" +Off-tree generator for the vendored HUDF catalogue used by +``hubble_ultra_deep_field()``. + +Pulls the 3D-HST GOODS-South master photometry (Skelton+ 2014, +CDS J/ApJS/214/24) and the van der Wel+ 2012 CANDELS structural +catalogue (J/ApJS/203/24), cross-matches by phot_id within the HUDF +footprint, applies quality + magnitude cuts, and writes a small FITS +table to ``data/hudf_catalogue.fits`` next to this script. + +This script is **not** part of the public API. It runs once and the +resulting FITS is committed alongside the package. Re-run it only to +refresh the vendored catalogue. + +Usage:: + + python -m scopesim_templates.extragalactic._make_hudf_catalogue +""" + +from pathlib import Path + +import numpy as np +from astropy import units as u +from astropy.coordinates import SkyCoord +from astropy.table import Table + + +HUDF_CENTER = SkyCoord(ra=53.1625 * u.deg, dec=-27.7914 * u.deg, frame="icrs") +HUDF_RADIUS = 2.0 * u.arcmin # cone radius covering the HUDF footprint +MAG_LIMIT = 28.0 # m_F160W upper cap +OUT_PATH = Path(__file__).parent / "data" / "hudf_catalogue.fits" + + +def _fetch_skelton(): + """Fetch the 3D-HST cone around the HUDF centre (Skelton+ 2014).""" + from astroquery.vizier import Vizier + + v = Vizier(columns=["**"], row_limit=-1, timeout=600) + result = v.query_region( + HUDF_CENTER, radius=HUDF_RADIUS, catalog="J/ApJS/214/24/3dhstall") + if not result: + raise RuntimeError("Empty result from Vizier for Skelton 3D-HST.") + tbl = result[0] + # The Skelton 3D-HST master catalog mixes all five CANDELS fields; + # GOODS-S photometry has Field == 'goodss' (or similar). Filter by sky + # alone is sufficient since the HUDF cone is uniquely in GOODS-S. + return tbl + + +def _fetch_vdw_h_band(): + """Fetch the van der Wel+ 2012 F160W (H-band) structural fits.""" + from astroquery.vizier import Vizier + + v = Vizier(columns=["**"], row_limit=-1, timeout=600) + result = v.query_region( + HUDF_CENTER, radius=HUDF_RADIUS, catalog="J/ApJS/203/24") + if not result: + raise RuntimeError("Empty result from Vizier for van der Wel.") + tbl = result[0] + # Keep only F160W (H-band) rows. + mask = np.asarray(tbl["F"]) == "H" + return tbl[mask] + + +def _cross_match(skelton, vdw): + """Spatial match (0.5" tolerance) — integer IDs differ between releases.""" + sky_sk = SkyCoord(skelton["RAJ2000"], skelton["DEJ2000"], unit="deg") + sky_vd = SkyCoord(vdw["RAJ2000"], vdw["DEJ2000"], unit="deg") + idx, sep, _ = sky_vd.match_to_catalog_sky(sky_sk) + keep = sep < 0.5 * u.arcsec + vd = vdw[keep] + sk = skelton[idx[keep]] + return sk, vd + + +def build_catalogue(): + OUT_PATH.parent.mkdir(parents=True, exist_ok=True) + + print(f"Fetching Skelton+2014 within {HUDF_RADIUS} of " + f"{HUDF_CENTER.to_string('hmsdms')}...") + skelton = _fetch_skelton() + print(f" {len(skelton)} rows") + print("Fetching van der Wel+2012 (H-band) ...") + vdw = _fetch_vdw_h_band() + print(f" {len(vdw)} rows") + + print("Cross-matching ...") + sk, vd = _cross_match(skelton, vdw) + print(f" {len(sk)} matched rows") + + # Prefer Skelton's spec-z where available, fall back to peak photo-z. + z = np.where(np.isfinite(np.asarray(sk["zsp"])) & (np.asarray(sk["zsp"]) > 0), + np.asarray(sk["zsp"]), + np.asarray(sk["zpk"])) + z = np.where(np.isfinite(z) & (z > 0), z, 0.0) + + ra = np.asarray(vd["RAJ2000"], dtype=float) + dec = np.asarray(vd["DEJ2000"], dtype=float) + m_f160w = np.asarray(vd["mag"], dtype=float) + r_eff = np.asarray(vd["r"], dtype=float) # arcsec + sersic_n = np.asarray(vd["n"], dtype=float) + q = np.asarray(vd["q"], dtype=float) + pa = np.asarray(vd["PA"], dtype=float) # deg + qflag = np.asarray(vd["Q"], dtype=int) + + mask = (qflag <= 1) & (m_f160w < MAG_LIMIT) + mask &= np.isfinite(r_eff) & (r_eff > 0) + mask &= np.isfinite(sersic_n) & (sersic_n > 0) + mask &= np.isfinite(q) & (q > 0) + + print(f" {mask.sum()} rows after quality + mag<{MAG_LIMIT} cuts") + + out = Table( + data={ + "id": np.arange(int(mask.sum()), dtype=np.int32), + "ra": ra[mask], + "dec": dec[mask], + "z": z[mask], + "m_F160W": m_f160w[mask], + "r_eff_arcsec": r_eff[mask], + "sersic_n": sersic_n[mask], + "axis_ratio": q[mask], + "position_angle_deg": pa[mask], + }, + ) + out["ra"].unit = u.deg + out["dec"].unit = u.deg + out["m_F160W"].unit = u.mag + out["r_eff_arcsec"].unit = u.arcsec + out["position_angle_deg"].unit = u.deg + + out.meta["origin"] = ("Skelton+2014 (J/ApJS/214/24) cross-matched with " + "van der Wel+2012 (J/ApJS/203/24).") + out.meta["footprint"] = ( + f"cone r={HUDF_RADIUS.to_value(u.arcmin):.2f} arcmin around HUDF centre") + out.meta["mag_limit"] = MAG_LIMIT + out.meta["filter"] = "HST/WFC3.F160W" + + out.write(OUT_PATH, overwrite=True) + print(f"Wrote {OUT_PATH} ({OUT_PATH.stat().st_size / 1024:.1f} kB)") + return out + + +if __name__ == "__main__": + build_catalogue() diff --git a/scopesim_templates/extragalactic/data/hudf_catalogue.fits b/scopesim_templates/extragalactic/data/hudf_catalogue.fits new file mode 100644 index 0000000..0a15cb1 --- /dev/null +++ b/scopesim_templates/extragalactic/data/hudf_catalogue.fits @@ -0,0 +1,306 @@ +SIMPLE = T / conforms to FITS standard BITPIX = 8 / array data type NAXIS = 0 / number of array dimensions EXTEND = T END XTENSION= 'BINTABLE' / binary table extension BITPIX = 8 / array data type NAXIS = 2 / number of array dimensions NAXIS1 = 68 / length of dimension 1 NAXIS2 = 2378 / length of dimension 2 PCOUNT = 0 / number of group parameters GCOUNT = 1 / number of groups TFIELDS = 9 / number of table fields TTYPE1 = 'id ' TFORM1 = 'J ' TTYPE2 = 'ra ' TFORM2 = 'D ' TUNIT2 = 'deg ' TTYPE3 = 'dec ' TFORM3 = 'D ' TUNIT3 = 'deg ' TTYPE4 = 'z ' TFORM4 = 'D ' TTYPE5 = 'm_F160W ' TFORM5 = 'D ' TUNIT5 = 'mag ' TTYPE6 = 'r_eff_arcsec' TFORM6 = 'D ' TUNIT6 = 'arcsec ' TTYPE7 = 'sersic_n' TFORM7 = 'D ' TTYPE8 = 'axis_ratio' TFORM8 = 'D ' TTYPE9 = 'position_angle_deg' TFORM9 = 'D ' TUNIT9 = 'deg ' ORIGIN = 'Skelton+2014 (J/ApJS/214/24) cross-matched with van der Wel+2012 &' CONTINUE '(J/ApJS/203/24).' HIERARCH footprint = 'cone r=2.00 arcmin around HUDF centre' HIERARCH mag_limit = 28.0 FILTER = 'HST/WFC3.F160W' END @J^;p\m?+ @5$?=p@ @?$ @Ps3@@J$;@Y+ @9h?ӕ?ۅ?7KVFf`@JD;c{?- q@:?ҟ?(?֗@@P@JJ;ˀ3r?F]cf@8\ ? ?`?׍OKff`@J/;ɼ0?@8n?ݲ-?`?Ƨ53@@JM7;ˋ?GE84@9"?ě?\ ?@Rf`@J;,=?<쿱[@:ؓ??x??|@C3@@J"`;q?#@8r-?n??|?T@E3@@J";;C|V?#x@7+??C?5?S @J$w;%?գn.3@9l?@z@? Lٙ +@J/;Vsyt?+ @7?M?A@?=p@K @J3Ko;ˈD?\>@:Q?-??EHf` @J7ML;9?,<쿱@9n?ǍO?`@?* @J9-*;V`^i?,@8 @?Ł ?5?? I@@J>;_'?/{J#:@6`?֗@?+?bMJff`@JBcQ;Ҁjk?PH@96? ?|?vQ@JC?;ˈD?*0U2@8r?b@?M?"@ ff`@JE6z@:?@b@?+@O@Jh]k<;6?*0U@78Q?C@?~@V@@JiQX;hwe?9XbM@85@?Ͳ-?㕁? +@@& @Jj㣨;b煶@ +=p@9 ?v?`?xBs3@!@Jk<;k*@QX@:n ??5?? @533@"@Jl;?9D@8=?? +=?ܼj@Jf`#@Jn~bn;&q@˒:*@8?n? ?և+@J $@Jq?|;Ǹ?ěS@6`?š@X`?+=%@Jq?|;C؜@=K^@7 ?x?x?-`$;;?j~#@:" @?7@@I`?ٙ>(@Jw>$;]@Sa@O@: ??t?p>)@J{Ž; d#?!R<@:5??ě?@;33@*@J|c';ǒ:)z?Zݘ@8 ?`@]/ ?pSs3@+@J}^o;y[5?ěS@6T?&?t`?~U,@J<;#_?E@9??? IIL-@J p;)?+@9?T@n?(@.@J);@~\N<@9l?ݑh?"?hr$/@J c;n9?tj~@933@?+?A@?\ I0@J@B;?c?lC@8?T?C?`@>L1@J1Q;ḍ?n.2@7=?׍O? ?`@@S2@J";]|?*0U2@:a ?-`@ +@?CPL3@J};R?˒:)@9@?(@ dZ ?ƧKff`4@J[vh;,s-?A7Kƨ@:?° @`@?A@Q5@J+;̱N@4m@7 ?z??O&f`6@JC;?73@:У???;`@ 7@J=-;Ȏ%?TɆ@9(@?G ? ?ա.33@8@J=-;ǴP?@9?X`?C?b@233@9@J^o;̔@O M@8M?`A?Q? @@!:@J@;ȹQ?0 (@7`?Η@?/ ?G@L;@J#l;?D@: @? Ġ?z@?1&(ff`<@Jb0v;A,@^҈p;@8 A?S??`@T=@Jaf;Gb!@tj~@9? @?l@?bM@Oٙ>@JG;@n&?s@9 +@?t?/?"@Rf`?@J]Av;HC?Q@:7?t`?\ ?hrA@@JJ;?C,zx@9t9`?KƠ?hr?M&A@JTɆ;`Ɋ?n.3@7_|?t@p?@TB@J9m;-?A7Kƨ@:m`?۶E?t`?ȴ@@FC@J%(; ? +L/{@:=/ ?z@? ?-`R,D@J;ɪU?g8}H@9h?r @v?l@@Bf`E@J}Vl;<٥"d?ěS@6B @?z@??1 P,F@JB;Ȳ3? qu"@8`?E?KƠ?ڰ @P3@G@J|n?;Ơ7@Q_p@7kƠ? Ġ?O@?Sff`H@Ji<;1d?E@:?ɺ^@?x?܋C I@Jh;Ǚj@43@7`?T?A@? @DJ@J?;̫`kz?-@:?"??@AK@J?;t:d@ (@7K?z@?/ ?-`@4ff`L@J{0;NF?GzH@4I?=p? ?*ff`M@Jvݭ;ޗl?73@6O?t??Qf`N@J@Bo;8إ?>BZc @8j?У?X`?l!O@J\f;˚@Q@9;d`?ȓt??O@Mf`P@J\ ;#-+?`A7K@6׍@?ə? ?VR3@Q@J;Q~w$?rGE8@7R-?ա@ ?R`R@JƼS;;C,?跀4m@9+? +@??@Bf`S@J1;gF@@5?@ ?ZTT@Jȣr`p;/%?:S&@:P`?&@L?+@EU@J|;2]J]?$/@9^?9X ?h?(IV@Jg;h@[9?C,zx@8?@V ?@EW@J_t;D@ )@:vE?M?ٺ^@?@33@X@J4U;Ίar @]cA@:u?`?hr?b@@QLY@Jc;̭%g@m8Y@8 ?͑h?`@?€@Z@JD;yC?@8)`?+@?@+[@JԀu;}?!-w1@9?@ ?r @P \@Jb +;SXl?阮&@7 ?"?ě?9`=L]@J#;QzF<@ +=p@:;Ϙc8|?;dZ@6?E?;`?X`LLl@J +|[;E@ 6E@8 ?X`?E?`933@m@J@;}-? qu"@:r-?~?bM?+=n@JzN{;Ƚ +Ri@@8???"?`?33@o@JC؜;;v?_Ft@9? ?KƠ?`A@Op@J~E=;ˇH^=?W&@:dZ ? @?|? @q@J~E=;{՝V? '@7~?$@7@?7@Uf`r@JLQ;N/f?v_ح@9?@ ?G Bs@J};ȼ'cX@ &x@9"??|@V ?@6ff`t@J`,;Żj?4m8@9? @?KƠ@Pf`u@J ;Æ@ nt@9 ?`?柾?$ @,ff`v@J;Cc?A7Kƨ@8|)?b@?;d`? &w@J s`;D?ć#@9}/ ?T?n?~Px@J +Z;伭@B@8I?`?7@?l@F3@y@J wt;ǠU@ Q@8\ ?ۅ?щ7@?̬@;,~@tj@7?@@?VS@J'ܽۘ; @q @7?A@@?@93@@J*{Ԍ;Έ72?RT`d@7)?9X ?`? Ġ@D@J+nz1;"x?zG{@:)? @ I?1 ;f`@J- ;c{?-w1@:@?ȴ@?^5@?bM=ff`@J-"; # @ߤ@@;-?E@ +-?x@K @J.@+N;&#?S@9 ?V?+?(@?L@J0ߛj;A?Q@4c?(?I`?t@R3@@J0ߛj;?e+a@9?`?v?j@3@J6>;.?y=b@93@? @?`@?/ @J @J6?W-;,d?`A7@8?(? ?/ @A@J6+o;\<?C@6^`?I`@?;`>ff`@J7GM;¤T?y=b@:?˅?Ԭ@?1 D@@J8|N;ɃF?Ov_خ@9-?`??$M@J:i;ᰉ?$@:$? +@?`?ȓtP@J6z@9X ?;d`?Z?/@P@J=dR;̛8:@l>B[@:t?`@ dZ ?ߝ @B@J=TF;]ce?@9`?n?/?އ+T@JA [; ҉@C@9&?@j? @J@@JAcw;i' ?y (@8?M@{`?Eff`@JF2;$ ?O;dZ@;(1 ?p??蛥Iff`@JGMA;ao?n.3@:d`?Ͳ-?V?ZR @JH˒:;ln?\N<@8"?b@??\)K33@@JLԻ;GA)?oiDg8@7+?5???=@JM@$>;"?JL@9"?x@;d`?t`@JL@JM߆;˦z:?dZ1@9@?M@+?l.@JNwm;Ȇz2?#9@:?9X ?S? @@J@JOag#%;6?S@;"??|?θQ?I`@Eٙ@JOf;*?_o @6?|?@?7@QY@JV!t;ȯ 8?+ I@9?l?`?v;3@@JZ;̳!?홙@: ?X`?T?AY@J\|ؘ;H.?ըXy=@:@? ?€?pR@J\|ؘ;Ϯ?˕$/@;Z ?G ?"?@@@J]:*;Io?o@8o@'n@ /?7@F3@@J]_V;ƈ72?ڒS&@7.?7K?+?l@23@@J^6;6e?M@8T?ě?ޗ@??|@I? (@8 @gl@cT?j@Rs3@@Jcb;:5?F]cf@9bM? @?x?Aٙ@Jd8;_'p@l"h ԕ@9Ƨ?`@P`?ěJ@Jf—;:>/0@$tT@9+?Гt@/ ?ղ-@=3@@Jg l;!x?Q@9Z ?(?Z?܋CR@Jha)$;D|0?n.2@6t`?r ??;d`@B@Jha)$;s*?1o@:?"?A@?33@R33@@Jhwe;ύT? +=p +@9R ?KƠ@ ?l@:@Jk"ɂ;{Ž??@8g ?v@H@?t`Pl@Jkb +;4z[@u!@:? @$ ?`AU,@JnJ;cZ?9XbM@86?Ӆ?`?n@(33@@Jo~=;̀ )? '/@9}/ ?v?hr?`@C33@@JoXD;j7?TɅ@:3@?~@?b@@P @Jp +=;q@Xe+@:a@?Õ?"?ɺ^@@;@Jq {;۹Ϛ?@N@8St?/ ?X`?-`B@Jqk+;"h?@9 ?v? +=?@8L@Jr)Zl; ?!-w2@8=?Q?7K?(@S @JuB<;e.a?>BZc@7`@?˥`?/? T@Juv}5;Մ+sK?VϪ͟@:_?Ƨ?KƠ?Sf`@Jv[;˨-?C,zx@9Z ??^@?&5f`@Jv);Λ{?>6z@:H1 ? ??zC33@@JwBV;z:?3@8z?x@ I?@R@Jwc;Ii?܎qi@8? I?@?v@@ @J|p;ɦ@=p +@;p?ə?z@?;`@Q@J}c-;y@W'@:Z ??1 ??@J}|,I;ϗxW)?@9=/ ?v?r ?b@T @J~T~; tC?S&@;#`?A@?^5@?n2@J;?lC@3.? Ġ?;d`?1&@D3@@J3@@J!Z;غ@?:)y@8s@?G ??@ @JU=;F#п?n.3@7A@?;d`?`?hr$@J+;y?Fs@;I`?@t?nU`@J!5ڭ;ȴ'?_F@;Z ?bM@^5@?T@J[=`;HZ ?N;6@9@?`A?\)?O@A3@@J%f;$>?oiDg8@97@?д9`?l?Ƨ@A3@@J%f;BP?\(@;?X`??׮@JL@J>lLY; _?vȴ9X@9{?j?z?l@@Sf`@J;V3&?u%@8b@?v?hr?l@@S@J}0G;ť~k@@1&x@83@?1&@Ġ?+%ff`@J_A; G?Gz@:v?ǍO?? &@J;z?qu!@8?€?n?ȴ@F33@@J=M;U>?ᰉ'R@:?I`@X ?Ӆ@2@J_c<;/p@;5Xy@75@?Ƨ?+?`@Bs3@@Ji;f#J?/{J#:@93t?Õ?n?+@CY@JC|W;Eg]?ɅoiD@8x?1&? ?V @/@Jy;4&x9?Չ7KƧ@;?n?O@?@J3@@JZ-s;&+9@a'R@8!G?ff`?`?`E33@@J];ɋ @J#9@;d`?`@@ @?QRf`@J};Ou?n.@:-?7K?n?z@@Qٙ@J:l;y|ß?'RT`@;n?n?7K?`@F&f`@Jo;f?T`d@9?У?33@?ᙙ@P@JbA=;٥"c?S@:X`?T?(?@H3@@Jn/;@R?ʳg l@:X??|?h@FY@Jwd;̩ymn?;dZ@8M?ۅ?ě?ȓtT3@@J;?D*0@;\ ?-`?Ƨ?ݲ-@ff`@JH;AxpT&?NT@8?l@?dZ ?z@N@J]B;;?PH@:Y?;d`?;d`?p@P@Ja;8\g@$/@9@? +@? ? +@@!@JýYC;ɕ?tj@; ?dZ ?Q? Ġ@Kff`@Jğס<;:pe?͎!R<@:r ?X`?щ7@?^5@O@JɣL;%t-?7KƧ@:? @?(33@@J[D;R&=k@p:@;ؓ?G@?;`M&f`@Jݹ;ПD?F]cf@:)??-?;d`@S3@@JcA ;uL ?lC@:??öE?dZ ?@f`@JłV;fDw%@:)_@9M`?33@?`?E;L@J"f;AvSC?֡af@9 @?@?"?~@A@J >c;N? '/@;=p?5??j? +@Rٙ@JA;\ +V?qu!@9?@ j?Η@63@@JӀE4;~I?@7?~?b@? @E3@@Ju;46?s@9?ff`?x?9`@L33@@JbC;$G?e+a@9" @?/ @ ?|?أR @JԿ ;;X?w1@6+??l@?A@@+ff` +@J#g;q?9?vȴ9@6+ ?;`??j@Tff` @JBZ@8?M?`?ԛ@Qf`&@J~D;_?qiB@8?`?33@?zT'@J\P;ɩl@ `A@;I? ?n? @Q (@Jpa;]tO]?@7?Ǯ?;d`?@Ds3@)@J/;٭?lD@9z^@??&?噙 *@J޽;ޗl@#S&@8r?^5@?hr?ӕK@+@J;;˭ +?'RTa@70`? +=?`?~!33@,@J;7`]y?tj@8?/@M?z@R-@J ;#[N/@ +PH@;^@?t?1&?ӅE.@J; #!?F]cf@8v?1 @?=/@Jd;E,Y?lC@6\ ?Ցh@Z ? +@Q0@Jݏ;GN?{J#9@;Ơ?? I?`@@G33@1@Jh;i +?NT@9`?KƠ?7@?z@ff`2@J @1H;A["?j~"@:`?\ ?/?^5@@@JD~;a?~($ x@:?"?+?ղ-@8L?@J~E;\FQ? ҈@:?ļj?M?@M@@J~E;JͯK?- qv@:R-?bM?1&?噙@Rf`A@J;z$LD?+ I^@7?v?Ұ ?1&@@s3@B@J"[t;ˊ;W?@9;`? @@?GU C@Jv;C?|?@9??@&?ӶE@ff`D@Jw;ĒK?ߤ?@;'l? ??CE@JBfs;Z%@:@8v? @@?+@KF@J _;f?1&@7@?p?1 ? P3@G@J `;!ݠY?,zxl"@;n ?Q@ @?j@D3@H@J 8*; +A%@!.I@7€?? ?~#I@J!9 ;bfe@ >BZ@:3@?A@??R,J@J">i;>B[@ =K^@;~5@?O@|?`@@@s3@K@J"_X;=-?L_@7p?? ?Dff`L@J#cW;̼@ATɅo@:gl?t?&?9`P M@J#ᆘ5;}=B@O;@;b?l?t?M@O N@J%|K;+Z!?Q_@9?ff`??\)@R3@O@J'Ӻ;m3 ?R<6@:f`?`?l@?ۅ@LYP@J(};ɟ¨?ߋq @:h1 ?`@T?t`@HQ@J)AA;@?Q @:z^@?/@h?G @>R@J)b;L]D@YJ@:?+@ +?@:S@J)&;QXq?Vu@9?`?"?KƠI3@T@J*#;=]@~$@:G?`@KƠ? @KU@J*^x[[;Ș=yS?|hr@;?`@@`?j@NV@J*L;v_ح?ۋq @8#T? ??Q.ff`W@J,H;7l?lC@9Y ?˥`?V?@M@X@J-;<`@o@:`?A@?9X ?E@Af`Y@J-@;V\-'?@:yX ? ? Ġ?ȴ@8Z@J-@;#@FA@Bѷ@9?`?z@?S[@J.‹*k;ǟ@H@:7 +@?`@ @?T@P`\@J.;k<?겕ᰊ@:O?33@?ff`?x23@]@J/@_k;D@-V@8`?`? ?;d`^@J0͚R;e<?Vu@4)`? ??@@L_@J1Z>:;R@de@6j?C?`?TI`@J2f?e+@;@?+?`?;d`@?f@J7ML;̚w?fA@9?`?j?&@Ef`g@J8f;O;u?&IQ@:@??r ? I@C h@J9W;6?Fs@;E?bM?t?KƠ@i@J:8? ;f8C=?\(\@4.?? +@?9`@.j@J;>o;ƻ#W?>BZc @8 ?n?l? @@"33@k@J;`(^;?{m]@9??I`?@+l@J>;D,?H˒:@8Z ? Ġ?? +@>3@m@JA*2;6G? k@:Ġ?t?`A?"@Ef`n@JAy;0X:@($ xG@:A?ԋC?`@?t`To@JA!;GN@Ϫ͟@;5@?1 @?|?`%p@JDAxpT;ν?'/V@;W +@?z@@7@? R&f`q@JE#N;uL?g l@:?7K?=p?33@Mr@JE;>?1-@89 ?r ? Ġ? @Bf`s@JG#;۹Ϛ?YJ@;a???x@Hf`t@JG@JA;̢G'?!.H@:;"??|?/ ?VJ@J<;5;K/?Q_p@9K?̬@?"?`A7@JP"W;gΕ@*0U2a@8T9`?dZ ?`?@1@J@ ;2&?u!.@6} ? Ġ?z@?ղ-@(@J]V,;P?ڹZ@:?д9`?dZ ?l@E @J#;Ƌ\w?N;5@;#`?`?E?/ I@J'RT;Oag#%?u%F +@8?`?"?QE@J];Ь@Fs@8Q?և+?G ?@<@J];25?Zc @:`?Гt? ?t@DY@J";#B$h?͞&@9V?hr@?T@L@J;2Y?r ě@:a?z@@ Ġ?"@:@Ji;;׭_?;5Xy@;q&?"@P`?Ƨ@Es3@@J.#);nj!@`A7@8?r ?7@?ش9`@Uf`@J!j;&Z?qiB@8@?E?`?`<33@@J>;?ᙙ@8l?ڰ ??^@Ps3@@J\(;ʖ6l?$/@:?O@@?E@Ef`@J};?Ff?(@8f`?l?hr?n@O@JD,;@$@ h ԕ@;?Ͼv@ ?G:@J3n;?B@6 @?ם ?A@?땁@3@J>[b;RC?Q@6K?|?9`? @J>[b;q8?ڹZ@9Ձ?5???r @Df`@JS&;нk?P{@8@?bM?^5@?V@A @J/Ɨ;c?H@:bM?`@??1 @J/Ɨ;ţKۡ?,=@;z?`??@5@J;;Ͳi? ԕ*@9y ?"@ S?T@Jɴ;|^0?D*@;_;`?Q? ?X`533@@JEx;ȩދ;2?lD@:?`?^5@?@Ry@J B;$\?O;dZ@5??KƠ?j@133@@J_;Jѫ@:)_@:`?j?h?Rf`@J_;ʷ^7?*0@7@?|?=p?MEٙ@JL;ɂ_?~($ x@:p?1&?@?ָQJ&f`@JeD;aܓ-?Ўqi@9= ?$ ?ڰ ??@J);jn3@ -w1@;??|?z?~@U`@J);ǝ't?L_@8Ġ?Гt?1&?l@8f`@J&;I N]?g @89`?7K? @?VT@J@W;@ +~\N<@:{?@??E5@J@;Lab,?ѷX@;?l?O?7@@8@Jfl;ɓm?$tSM@:p`?1&?+?zIf`@J1;ȧ?E84֡@: `?ա?p?-`@33@@J;;̄]@$?@89`? ??@N@J};ˋ?Z@9? +=?C?P3@@J@ ;e@tj~@8@@ f`@1 ?ə33@@J]Av;>?Fs@;~5@?I`?z@?T3@@Jy|;̰&?_حV@;7K?v@x?EB@JW;ſzԲt?tSMj@9s???ޗ@As3@@Jz;qC?u!.@: ?l@@E?I`@A@J\_|g;˚3@ Eoi@;g?\ @@?ؓt<@J}k;ɪU?柾vȴ9@; +@?v?"?b@@4ff`@JY%;q?zG@;€?+@0 ?@S@J?;dz?O;dZ@;x?A@?䛥?`@F3@@JB鉜;պ?JL@;?V?C?ؓt@R3@@JK;łU?z@8E?I`??dZ ?33@@J;˧ڤ?⻘A@:0`?Q??-`@?ff`@J; S.?S&@;@?@??|?`Iff`@JfM<;BNY)?L/{J#@9q?E?|?|@@JfM<;9C?@9`@?/ ?z?\)I3@@J!;ȼ?w1@7^@?щ7@?? +@R @J&;f?nO;@9?`?O@?G @:@J_;ʥi4@ tj~@9?33@?^@?ěFs3@@JN;s>r@|Q@7?G ?1 ?zO33@@Jc;d'&?@N@:Ѫ?@?އ+@33@@J|n?;863@p:~@;X`?@E?Ƨ@9@JM];=??Q@7?5???Ƨ@F@J!;q`l ? ҈@8?ļj?+?д9`@$33@@JA3;zcsm?~($ x@;Q??I`?@A33@@J;ǦXĽ4@=K^@7N?KƠ? ?SMY@J b;bZh+c?Vu@6 +@? +@@ ?z@Q@@J#;ɿzԲt?&IR@9`?`? Ġ?@=ff`@J=;ρi?s@: C?n?^5@?E>33@@Jl;GX?@:?`?hr?ߍOS3@@JqG;˔BA@Q@:?@?&@T,@JqG;$FE_?㢜wkQ@8b@?`?"?KƠ@+@J@;˟f?c @: +@?r ?O@?nLY@J@;^?$ xF@;u??t@t?@C@J@;vA?j~#@9$?A@@Ġ?|:@J{;?Q 9?q @8?`@@B`?ա@E33@@J .;@ H˒:*@;R?€@`? Pf`@J .; ?1-@:h?~?`? I@U3@@J];įk?`A7@:Y ??X`?Q@43@@J"i;eK@g@: ?t`@G? @J< ;AA\?Y|@:K ?;d`?l?j@Qf`@JHD;C?=b@9!G?Ձ ?b@?Ԭ@@'ff`@J‚=; /^?Z@;]p?X`?(?Ƈ+@U33@@J`퀡; +^?8}H@8 +@?Q@`?@Q@JCk;I?4֡a@;n?θQ@A@?I@J~#N;?_-@حV@:f`?A@??33@@Iٙ@J?;̏P?cA [@9?öE?9`?€S@J?;g?hr @;;?-@Ƨ?V A3@@J*";ʇ]V,?]cA @:?KƠ@V ?|T@J*";Y@(\@7s3@?C@y ?ff`@Jd;ʪ J,@iᰉ'@:y?@?Sff`@J` ; ??@:=?ȴ@?-`?A@633@@JC;,@Ъ?t@:3@?G ?@?(K@ @J;<>t?Xy=c@95€?€@ /?hr@A +@J;M*[@ `A7L@:`?Гt?z@?Q@B&f` @J̢a;Kjb?v_ح@:?;d`?;`? @@ ff` @J̼,;ɇ@)y @9l@?ם ?E? +@2ff` @J!;Ρl??@9j=?r @?VE@JB=2;"F{T?)_@8?ԋC?ff`?ӕ@P@J©;Ǽ“?sP@:v??|?M?@H@J΁;z@ g @;y ?@9`?EP3@@J΢a;Rş?҈p;@8`?ļj??G O&f`@J4U; :2*?jfB@8?^5@?t?T@<3@@JA;_ND1?@4n@:??5??@@@JϞ8d;w@aGz@;?`@@`?R3@@J=B;>RY?$tS@;d? @A@?㝲 @I@J_(;?-w1@8-?=p?dZ ?|DY@J|^0;"BJ'k?䎊@7G?ם ?t`?5?=ff`@JA[#;F]c?A7Kƨ@7d ?ӕ?33@?X`@9@J;S;c$?q @8$? +=@ě?@5@JF;ijY[?L_@;? I??ݲ-@9@Jb +;ʁ#?w1@:$?`@?? Tff`@J<3;К.@Z@9] ?Q@!?V@#33@@J֡a; s?)^@6?Q?l?-Q3@@JG;f?*0U@;^@?@?/ @U@J@n;@G,@o@;@?ȴ9`@t?v@C @JbR;>BZ@XbM@; ? I@ C?$ L!@J`?z@??CC#@J;٩T"?ӼZ@:A?E?`?ەCٙ$@Ja;}At>?ߤ?@:f? @ ?QS9%@Ja;o`h?@4@:? Ġ?`?`:&@JEk;?dZ1@:Ġ?dZ ??|?/@BL'@Jѷ;4i?Q@:K?bM?j?""(@Jѷ;ɱc|?@:G? ?`A?֗@@Rs3@)@J] ;3z?*0U2a@8T9`?ӶE? ?C*@J] ;bYt@b}V@8?p@?@Py+@Jޠ3;>A@%1@; ?n?S?\ Cf`,@J(;*'? @8?&@T?7KU3@-@J"&;fA?D@:?&??ƧR.@J\̉;n"z?n@9?ě@?ꗍ@@R/@J?J;b(D?ۋq @8?b@?? @4L0@Jfw-;͋@ M;@9? +@@?Η@@/33@1@J*;ZS2?&I@9 ?7K?X`?QN 2@JZ;h?W&@:+?p@Y?ָQ@73@JQi;~?vȴ9X@;v? +=@S?hr@T3@4@JX;ʲi<?T`d@:H?? ?If`5@J弇+;Χ +?@:F?և+@?1 @F3@6@JB1;g?S@;n?"?9X ?bML7@J<[;F?ڏ\(@:?|??|??@QFf`8@JHZ ; ^T@12W@9T?1 ?X`?ղ-@G9@J;fA?D*@;CT?`@v? Qs3@:@J ;;!1?`A7K@6?$@?@Qٙ;@Jc;V2<@r@7?€?|?h@03@<@J||;,Bf@Rp:@:Z ?V@t`?Ѻ^@@A=@J?J;(ܘ?hr Ĝ@5? ?/?j@1ff`>@J;̹#x? +L/{@7B?~@@ ?@R?@J|Iz;Į!?\N<@9G+?Гt?G ?ڏ\ Kf`@@J{~ ;\ޗ?qiC@87@?͑h?򟾀? @D&f`A@J#*g;ɥ{?n.3@71 ?"?旍@?dZ @T&f`B@J&Z;Q\?a@N@8??|?`@?-`ff`C@JPO;m3 ?KƧ@;xQ?Ԭ@?=p?Ѓ`@OD@Jl;},?m\@9޸`?v?"?9X @B3@E@JH;ő]?a@O@:o@?V ? ?@&33@F@J#x ;ds?$/@8? @ ?b@@G@J];FA,?Q@;`?9X @`@?l@@G H@Js};"?dZ1@5$?O@E?€NٙI@J\);Ѣ@ +~$@9Z?щ7@@x?@P9J@JG;f@;z9?L_@8 ?`?ݑh?~333@]@J; 5?ݗ+j@7;`?⟾?Ցh?zS^@Jo;Crq7?ᰉ@:q&?O@?V?/ @B_@J~;(;?ʬ>B[@5?O?\)?\ @Cf``@Joi;ǫ+'?,<@9+?V ?n? +@@I a@JB_ !;r`o`?@:??|?j?t@Tb@JP;8&?L/{J#@93@?^5@?|?M@Aff`c@J#;4a0?S@:?\ ??j<d@J ;Hbo`@oi@9&?д9`?(?^5@@,e@Jc;TR?%1@9O?r @@?陙@T3@f@J_Js;>K@%F +L@;wK?v?v?@Eg@J :2+;Ɗ@ +JL@9(r?ȴ@?އ+?lh@J cV;ĥ&?=b@;?-?ě?$ 33@i@J +^;,=?+j@7?7@?9`? J3@j@J +`Ï;ŎC$A@2W@:l?l@?33@/ff`k@J ҉;fP?Ov_خ@:\?? +@?/ l@J \;4E0@-@6. ?bM?C?@Rf`m@JW; +Z?@7? @ ?G񙙠n@J<%;ʩ?Q @;f`? ? ?@U3@o@J^ ; +6P@R<6@8K?I`@ ?=p@:p@J^ ;Y ?iDg8~@;:?t?/?ݑh@As3@q@J~E;̸jr?GzH@3?|?ە@`?\ 8r@Jb(E;q\c%@lC@9>?t`?~?zPٙs@Jb(E;4hY?- q@9C??`?؃`@)t@JC; ?/w@: ?$?j?tAu@Jg;.fDw?)^ @7_|?? I?θQ4v@J>a;~~?qiC@8?A@?Q? @:33@w@J[;&]?W>6z@:K?hr?G ? @Ex@J[;ʸ?KƧ@:??M? Dy@J[;@?tj@;?Q@?Uf`z@J[;833@~@Jk;} [?睲-V@6{`?1&@b@? B@@J\;ɱ ?}Vl@83@?$@z?+@Iff`@Jd;/@jf@8޸`??l?Z@>3@@Jd;Ǩj?!.H@9Q?hr@l@? ĠR3@@J7X;ʝԝ@ D@8/ ??"?V@F@@J7X;_?84֡b@7+ ?ڏ\ ?`?@!@J\FR;z?JL_@:ٙ? ?? F&f`@Ju;??8YK@6o@?M?7K?◍@Tf`@J;7 ?<64@: @?ļj@;d`?b@@Q @J;`?hr @:o?`?~? @@J~;TXG?!-w1@:?T?@? @Iff`@J!9; j@ +=p@8c@(@;d`?KƠ,@J"W; M?P{@:aG?ղ-@C?"@P33@@J$A;{=@ ?|h@:n?S?ղ-?TPf`@J&z;<3"?֡af@:5??`??O@K@J'=[";\@@7@A?7@?Ձ ?=p@Uy@J(b;ҁG?@7?O@?\ ?ļj@O@J*{Ԍ;8C?u%@9?=p? ?xOY@J*b{;X?nO;@7?-`@9X ?ԼjTf`@J,@Ъ;:?zG@:A?A@?j?ݲ-@I3@@J/uK;dM?!-w1@;Z@?t?Ұ ?G@&33@@J/];b~ +?l@5 ?Ƨ@ ?€@T@J0aǛ5;ġr?-w1@:\j?KƠ?I`?Z@S3@@J1)˫;[DT@z@7@?9X ?hr?`A@3L@J3l ;>_?H@;f`?@?\)?@)@J3\[K;e=>?}H˒@;??`?x'33@@J5;Oa;e ?Q@9 ?@?$? @$@J6޹^[;вQ?@4m@8Qh?v@`?^@A&f`@J77mU;:%?lC@7`?=p@X ?p@R@J8? ;Ɛy_go@ *0U2@;)??땁?hr?33@@J:};Š?Q@:?n@?Q@G@J: ;[>?tSMj@;2n?"? +=??|@>@J:i;Gw@S&@;6 ?ļj@?|?Ǯ@K @J;B-k;46?d7@;.?@?ZD@J>P3; ?R<6@9?KƠ@`?pD33@@J? ?u;d"&?%1@; ?/@/?1&@FY@J? ?u;PS@hr!@:ؓ?ě?-? IR@J?{;]H@ 1@;d`?ff`?z@? +=Rf`@JAcw;2@wk@9x?ȴ@@ ?n@SFf`@JB=1;˴=J?/v@8b@?ӶE?"? 2ff`@JBI;u@K]c@:?v?㕁?@'@JBQ~;\ G?6C@;Q?j@ @??|R@JC @;ǝ;̫`kz?oiDg8@:r?"@"?K@JD0;WiJ?<64@9G?Q@ x?^@2@JD0;n&NHb?/{J#:@8Hr?G?`A?`A@S@JFB_;9?/{J#:@;? Ġ?z@? ?ff`@JF; @/v@:?/ ? ?Z@T@@JF2;ŊڹZ?lC@59`?v?dZ ?&@533@@JFR;; ??@8/ ?Q@?G @D@@JH.;=B?nO;@;F?ʟ?G ?@ff`@JIbI4;ҤevG?4m9@7`?T?hr?l@Uf`@JI(;$A?Љ'RTa@;6E?t`?33@?CL@JJ›c; _$R@sP@;`?`@?`T@@JK;;W@+ I@7?O@?-`?` @JKc;U?g8}H@7?`A?+?7@@M@JLaJ;9yQ?W>6z@8?`@? U@JMa;x>?As@;?Ƨ@ I?`A@I3@@JMk2;yF=?K]d@8? ?ڰ ?r O@JN;%eL?ʈp:@9p???܋CJf`@JN"7;™L?lC@5O\ ?G@A@? +=@73@@JN~+;~?üZ@:`? @ @?dZ @%@JN~+;ż+4@}Vl@7`@ @O?x@US3@@JO;̀5?kP{@:b@?ff`?$ ?/O33@@JP"WB;ȣax ?t@:]p?-`@"?ěK @JPC2; ;o ?C,zxl@;??t`@?-`<@JU`;6O?As@7@?z@?h?1&@@JU;ǑĹ@hۋq @;Ġ? +=?33@?33@H@JVE;?ײ?'/V@:r ?"??@M@JW>6z;+E((=?}Vl@;?-`?ff`?T@?3@@JW f;ً͒?>BZc@:?j?ڰ ?A@@Gf`@JWV2;6s g?sPH@9X ?|?hr?7@Rf`@JY;9櫛$?y (@7?V ?O?QNٙ@JZc;wkP?=K^@7A?S? ? @JZ;إH#?4J@7`??n?+@Q@J[>7;aFN?p:@9? +@?"?ꗍ@@2@J[x;ⴕ?SMj@9v ?I`?C?4@J[x;zp? k~@9t?ff`??`Q@J[W~;5;K/@ 6z@;p?M?(? ĠR@J\c%B;@-?zG@7f`?5??ff`?MU@J\fw;-@?QR@:&$?(?b@?A@@:@J]=ȸk; ?>B@:`? ?`?C@R@J];mZ?sP@: ?9X ?5?? @@Ds3@@J]#;Qi?O;dZ@9Q?33@?(??|>@J^cb;2@YJ@;?@(?I`T3@@J_mX;EgD? +=p@66 ? +@?1 ?ᙙ@L@J`A7L; ;?lD@8r ?t`?I`?C@P,@J`|A;\|ؙ?<64@;J=??dZ ?Vs3@@Ja$FE;_x5@~m\@8O? ?v? I@!@Ja=1;ˇH^=@@:?@|?`@G3@@JaM9;˱s.@+~($@;=? Ġ@1&?L33@@Ja!o;̽# @cA @9|?b@@1 ?Vy@JbȰ;ȮG?索3@:3@??Ƨ?^@?33@@Jb{;ʅݘ?BZc@8`?@5??h@7@Jc-ת;~1U?@8 ?;d`??h@G@JcHj;gM?v@9= ?v@Ƨ??|@K3@@Jd@8;,g?Q_@:&f`? +=? ?ᙙ@!@Jd@8;i?#wk@9m`? +=@?@@IL@Jd8;^1 ?W'@:V?/ @E?ա@K@Jd8;Ǣߓx?Ү}Vl@;8`?n?KƠ?G3@@Jdy;#*g?eO@9x?t`?S?띲 UY@Jdy;u?- @:`??~?=pUf`@JdTi;Tz?H˒:*@9)?O@ Z?ʟ@ @JdTi;:N?rGE9@7`?ݲ-?M?ٺ^@?陙@JeXO;{[?C$@4??t`?`T@JeD;ͽ@g?ȴ9Xb@8 ?ə@ ?z@Sf`@Jey; 5;@ B\(@:h?`?$?`?ə@Jf—;̱]=?1&x@7`?€?󙙠?K @Jg#$6;ͧz3?C\N@9f$??j?F@@JhJ;?l'?}H˒@6F$???Q?33@@Jha)$;F]c@ᰉ'R@;@? ?T?@T3@@Ji];ϕ$@MjO@7/ ??+?t`6ff`@JjG;?,@7=/ ? +=@?1 TL@Jl?;.;BP?YJE@9@?(?`?`@:@Jm"BJ';vF:;@ +S&@:G?Z@`?G @R@Jmz;"$?QR@6!@?^@?`@?13@@Jn̒;@ ^5?|@9\ @ "@E?l@L@@JnL ;"BJ'k?!R<@;U?"??@L@Jo!;θ1f?>6z@9 ?Ԭ@?n?ղ-Uf`@JoC;ɚV?*0 @;z?@1&?Гt?33@@JoC;im7;?5Xy=@7?˥`??"@N@Jo\-;Ƃ@4?n@5Ǯ ?t`?9X ?"R@Jo ;{|x!?s@9??9X ?bMP@Jo];'(b?#@:?l??pUFf`@Jo];;u/@ߤ?@:?׾v?|?@R@@JpM8;>?Ƨ-@9|?`@??;d`@S@Jp?-B[@:t? @ +x?p@Pf`@J{ 1ί;Óݗ+?+ J@:?ě@#?;d`I33@@J{|x ;^?_o@;Ff`?O@?ݑh?I`@=@J|ݩ;j]k@ u@:?1&?V ?j@TY@J|ßa;ņDR?h?xl"h @;@?l?b@?\)G3@@J}At>;& %9?}Vl!@7-?l@n?@DY@J}o ;ɸU @4K@8h? I@ `?߾vPf`@J}o ;$[)?Q_@7$ ?@?`?hM@@J~d^N;|<@eO@: @M@Ƨ?`@E3@@Jo0;'x ?,<@8@?&?G?$ @Df`@Jo0; ?N;5X@6`?@/?@-@J^_0;O&N@F]c@9 ?v?t`?33@@J#[N;¦\{?p:~@:Õ?-`??L @J½R;"4H@> (@9 ?V?ӕ?@A!@J{;[vh5@?Q?;`?@?f`7@JU;ǵ?A7Kƨ@849`?Ӆ?A@?M@8@J`4P;~1U@@7f`??`A?^5@@"33@9@Jӕ>;F8u)?E@8N ?l@@j?\)*:@Js;as@ r@;3@?p?€?v@K;@J_x5;Wx-?|@:?д9`?x?@A33@<@J$;/ ?iDg8~@:gl?S?Ͳ-?ާ@)33@=@Jʅ;϶.n?ꎊqi@:Ձ?`?=p?h@->@JH;Sy4?ߤ?@:~v? ?v?@D&f`?@J ;f@ + L_@:/?n?$?G @Py@@J^6;;?=K]@7\?Z??`@@333@A@Jo&);ħh?YJ@;k?O@ȴ@?ӕB@J^;!Z?TɅo@:3?? ??|@6LC@Ji;Q@6C-@9ix?X`@ ?`D@Ji;˴;ͨ\?g @9?p??t@PX@J>˴;^|@ݗ+@9??KƠ?E@93@Y@JӪ7;?vȴ@:z?v?"?Ƨ@PS3@Z@JB;F ?ceO@;&??Z?^5@@33@[@J}|,;e8h?+ J@6kƠ? @?`@P3@\@J;ÅQ?g8}H@8(?`A??hr@CL]@J|;NzVC?u!@95@?A@?hr?R^@Jݾ;[S @]ce@9?ϝ ??畁3_@Jݾ;JYe?=p +=@6v?ȴ@@?9`@Cf``@Jݾ;n;F@K]d@7r-?r @`?l@Aa@J> ;ƾ?ae@7x??"?^5@@Hb@J_c<;Xp^?ѷY@9C??v?@MLc@J ;Kր?8YJ@;5@?t`@ Ġ?陙@Sd@J3;٩T"?#x@;u?ě?V ?dZ S3@e@J3;CO@&@;d?ѩ?€?Ԭ@@Rf`f@J D;̎y?M:@8@?x?T?1&:3@g@Jc#;Ў:!d?ߤ?@9M?t`??`@h@Jc#;_QzF?͞%@7L@?v? ? 0i@J^>2;ȧayW?@4@8|? ?㝲 ?~<j@JZ-s;EkD?MjOv@9`?33@? ?n@:ff`k@J;Ⱦ]?PH@91h?٩?l?Z/l@J.n;ɦD?6@9O?"??ݡ@J m@J|;w\?BZc@74`?Z??E9n@Ja; hUS?/v@:wK? @&?-Bo@Ja;aՈ@wk@;<?G?x?QR p@JN;}z=?ԕ*1@;1?-`?`?nGq@JT;gȖ?,@9`?l?? :r@J`H;>݋`@ +r䎊q@:o\ @?|@ ?ff`@S3@s@J;ˋ&9O?@9?bM?`@?33@83@t@J5@? @@1&?xNff`y@J@g;{A?+jf@9? Ġ?^@?`@@V@z@JH;̫`kz?_Ft@8^@?柾?I`?Ł U3@{@JH;L<?*0U2@8?KƠ?@?^@&|@J;bh?2W@;E?5?@1&?&@7}@Jb;.(?(\)@7U??Ցh??ܛS33@~@J~1U;˒s?j~"@9@@z?աPY@J # ;LƂ/?QR@7??E?`@2ff`@J?9ѳ;ԥ":?}Vl@7?? Ġ?b@@7@JłU6;|ßa@*0U2@6 ?O@??ݡ@333@@J#;F]c?b}Vm@:E?7K?E?p@U @J#;A0P?g k@:t? +=@aG?z@?ff`@J>RY;ǛN??vȴ9X@7?Լj?݁ ?733@@J!laR;#cW? +=p@;~v?@ +dZ ?@A@JΑ;?8}H@;(1 ?Õ??ěO@J\ +;@m\@;Ġ? ?(?v@B33@@JpL;H@MjO@:?33@??`8L@J;ů߃?䎊q@: ?\)@9X ?д9`1@Jɼw4;]U?֚,<@7Z?`?h?Q3@J! ;Ôg@!.@;`@?KƠ@`@?@S3@@J>WS;&?KƧ@6\ ??ȴ@?@JY@Jˣ!h;?wkP@;F?&?+?lPf`@Jͻ;D`@,zxl@;Ӷ@?x@?;d`@J3@@JΞ^$y;U@ '0@;`?b@??S@PY@Jο;G^cc??@74?$ ?bM?TML@J|;ǂ +0@_o@:t? +=?33@?ff`@ @Jп`;YW?RT`d@:z?z@=p?b@@Gٙ@Jì;҄S?4J@:-`?@ @?GM@Jc;E??@:?I`?E? J @JG;螺?ѷY@:C??S?@Ks3@@Ja@;ɟ?n@dZ ?`A@Q@@J֝0';Τ;?R<6@9b?S@^@? @@J^ F;Y?I^5?}@8?(?`?@Hٙ@J;C@m8@;-`?`@@?$Ss3@@J8;6z@:d?v?(?`(@J@f;~Ǝ?MjOv@6`??`?`@Rf`@J7 ;Ew?nO@:3@?ٙ??KƠ(@J#R_;}$ =?dZ1@7?V ?7K?x @J]A;F?'RT`@9~v?`?+?/533@@J]A;&dA?S&@7`?`?1 ?@T @J]A;#w?5Xy>@7Z?(@t`?"@@J;3j9?v_ح@:-?KƠ?n?Sf`@J";M"?ݗ+k@:e?hr??ȴ@Q,@J";ݤe?*0U2a|@; ?@?|?v@I@J?^W;\?ԕ*1@8?v??S@J` ;g{9\B@As@;R-??;d`?1 @S@J½;Ƙx1j?zxl"h +@93@? Ġ?أ?x@;ff`@J`N;F2?a|Q@9h@??$?A@7L@J;ef&?bM@;? @V?|9L@J ;L<?As@:?ާ?ȴ@?◍@Sl@J;~ѿ?qiB@8B?@-`? +=V @J>x;̉'RT@!o@81?v@h?E@N@Jd;Đ>?T`d@9?Q@`??|@Ql@JE;ϐwK?GzH@4_;`?`??@@F@Jᛐ;O?g @; I?^5@@/ ?p@$ff`@J;އ ?g8}H@9? @?OQ@J43 ;Ǘw?M:@8`@?۶E?n?Ұ ;@JP;6v?E@9q?5?@ `?ff`@@J w;|AC?2W@9?Z@ff`?@U@J ;;ʍ!j?l"h ԕ@9 ? ?7@?G33@@JQ;9.?|hr@;ؓ?-?߾v?畁@J!-w2;M&??{m]@7b@? ?t`?T:L@J +;i?.H@5ȴ@?`A??`A@@L@J ;ɱo"@ + qu@;׍@?x@?1&C@J!}(I;bT?ۋq @9?ě?(?@M@J!}(I;gU:?u@7Z ?`?t?ۅ8ff`@J!}(I;me^(?hr @;`?`?O@?ۥ`@ff`@J!D(N;W?<64@9Ӷ@?;d`?E?l@,ff`@J"4H;'c@iB@:?|?Ƈ+?€?/ @33@@J#j; ֶ[?1.@9z?;d`@I`?д9`@J$=);oڃn@ S&@;/ ? ? ?\)@G @J$Ȭ; j?bM@8?/?ě? @Vs3@@J$v;"h?{J#9@9?Ցh? ?@DL@J$/;Į!?8YJ@7@?z?S?KƠ&@J%|K;[K?\(@: ?/?t`? +@@G3@@J&q;Cx$?'/V@:h?ȴ@?x?~V@J'a?;\ ?C,@8+ ??j?;d`@M@J(mz;q?|?TɆ@;?̬@?V?C@K3@@J)AA;˚vW@,<쿱@9? @Z? @RL @J,<;Ҧ*?[6@8?߮? Ġ?9X ?33@ +@J. +;ȇen@4J@: ?$ ?I`?n@Aff` @J/aZ;c,?S&@8Z^@?v@?`J @J/{J#;=ݱ @/hۋ@;e???C!ff` @J2;γg ?73@9+ ?ə@;d`?=pSf`@J3aV\-;){Lb?Fs@5x?`@/ ?@I3@@J3Ko;ГI?E84֡@7b@??G ?Q@Tf`@J3*b; /^@{J#9@9T9`?dZ ?bM?1&@733@@J4;V`^i@ @:?@V ? Q3@@J46;|ؘ?S&@8>v?bM?n?U3@@J4a;yB =K? @9H1 ?T@n?ѩS33@@J5&V;@??'/W@:q?ff`??=ff`@J9`s;ƙc?ѷX@9V?ᙙ@C?V&f`@J:!c;弇+@m\@; +@??"?5?$33@@J:}O;=SH?Q @;n?ʟ??(@H@J:8? ;ɖ.?䎊r@;t?Õ?ȴ@?`@Cs3@@J<}^p;½Q@F]c@:`? ?"?+@8ff`@J<쿱;Ŭ?Q@:F?j? I?x@Q33@@J@9j=??|?1&?&Df`@J=v;?쀝IQ@8 ?&??G@C&f`@J>//;SeX?73@9/ ??7K?l@M3@@J>//;?hr @5?V?n?t@E@J@U;p\m@W@8 +@@ ?/?5?33@ @JA;e@x?Gz@:.V?O@? ?vPf`!@JBA;~7?$/@9s3@?t`?€? Ġ"@JB +A;[>?$/@8L@? ?KƠ?S#@JC^a[;djHs? +=p@;^v?`??z@6$@JCä/;z-?Z@; Ơ??|?"?Z%@JDAxpT;&?E@:Z^@?"?/ ?(@?f`&@JDAxpT;̝ZzJ?u%@:X?n??lIL'@JEh ;Ĭ}N?ᰉ'R@91?z??b@@ (@JEX;=?@ }Vl!@:p ?I`?9X ?T@N&f`)@JF2/;з^~?"`A@9?9X ??@1*@JGA);Ƿ]??|hs@:{?`??׮@H+@JI3;ţ@6C@;&?z@??ԛ@833@,@JJb#;͎d1@?s@;?`@@p?*ff`-@JJj3{;ȏ&9?c @;?z@?j? @B.@JK]c;T@ }!.H@;ě? I??^@US3@/@JKZS3;ѵA̅?$tT@:;`? ?z?I33@0@JQ;ДG ?MjOv@:???$ ?@UFf`1@JQe;@?ﯷr@6?"?dZ ?j)2@JSX;zyl?b}Vm@9C??hr?׮@<3@JSE ;Y?\(@6 A?&@@?t`@Lf`4@JT?u;ݵR]?tSMj@:?/?bM?&@G5@JT~;?[W>6z@8?G?I`?;`-6@JV3&;%J4@~$t@;`?v@5??Qff`7@JW?$;N"7?@;gl?t`??EA8@JX;̗AЄ?ߤ@@;]/ ?`?? JY9@JXUP;3?u%F@:A?n@ +@?@Aٙ:@JY!;͊b0@_p@;׍@?KƠ@bM?EO;@JYBu;A?;dZ@;`?Q?=p?b@@Ps3@<@J\ +V;ǹ{0?@;`@?$?-?@;33@=@J] l;_ô?TɅo@9?T?G?r @S`>@J^ڵ;$?eO@;h?+@ ?Q>?@J^ڵ;\ +V?=b@;e`?|@ ?Q,@@J_ !;R?73@7?|?\ ?/@ff`A@J`G;o0?:S@:@?`?`?և+@"B@Jb#ᆘ;XdE? I^5@;?`@7K?ٙC@Jc{Z;M@?A7Kƨ@; ?T@7@?G RD@JdY2;z$@ᰉ@6@/`@`?"!ff`E@Jd7;͖}?\(@; ?ě??ff`@,ff`F@Je@x;bEo?=K]@;?@?b@?@FYG@Je;h?tj~@7?Ƨ? I?`0H@Jf#J;G^cb?5?|h@9?33@?v?ޗ@@Rf`I@Jf?b}V@9?Q?n?ҟ@Fs3@J@Jgb;v?oi@8]p?I`??`JU@Jmr;о3?5Xy>@9@?`@?@?Q@Uff`V@Jn9;??S@;4?hr@?C@Mf`W@Jn~;ʈs?&IR@9`?7@@`? @9X@Jn 2;̊X;{(?v_ح@;F?"?9`? @<]@Jt}^_;Ρ@W%?#x@8o@?ם ? ??|@ff`^@Jt<;d^Nj?҈p@9|?(?€?V _@Jt*,#;a Ec?u!R@95@? ? +=?@T3@`@JuK;?@:$?Q?Q?T@ELa@Ju`;G^cb?kP{@:Z ? +=?z@?t`@5b@Jv}4;)W?=K]@9`?Q@u€?ě@?33@c@Jv}4;OQC?%F +L0@7V ?ա?$ ?`<33@d@Jw?;L"A?%1@;@?Ƈ+?Ͳ-?ȴ9`@B e@Jx>-;Dž t?U2a|@:`?E@V ?֧@Of@JyK!;*") ?I^5?}@:P ?`?/ ?O@@g@Jyɟ;},?Vl!-@91h?/ @/ ? @Ah@JzA};̵$9,?sPH@::?l@dZ ?z@B&f`i@Jzcsl;ܠf?m\@7?z?I`?`Af`j@J{՝V;`c&?m@9z?z@?bM?$.k@J{;[c?N;6@7xQ??@?&@=l@J{0;Ύ`sX?9XbM@8K?? ?Z:m@J|c';TCN?$/@:E?&?? +=@@ n@J}=B;ץm2@K]cA@9Q&?"?b@?`Eo@J}^o;ƿDN @NT@7F?5?@ ?@Rp@J~AN~;ğb0v?VϪ͟@;|?G?ff`?$@Es3@q@JuM;ƈC[?Q@4?€@ +Z?n1Lr@Je0;??`d8@9Z ?^5@@?E@Qf`u@J>;ȴ?+ I@3;`?A@@ ?@Nv@J8;3U?xF@:'?\)?l@?"13@w@JT;UnŰ?+jg@7F?X`?I`?nDx@JaN;J)?ݗ+j@8? I@?TTyy@JC;W?ěS@:b?@?ff`?=p@M z@J\w;φ;Ø?- qv@9y?&@7@?д9`@C{@J};8d[?,<@;???|?n?ؓtNs3@|@JY;қ?64K@8€?G@ I?`T }@JD;`+?ᰉ'R@:>`?Ұ ??A@@;33@~@J`sX;,G?7KƧ@8 ?;d`?S?Ցh@L@J`sX;ưcz)@$/@7`? @?@?Q33@@J;ł@@ /Vϫ@;??j@z@?@J@J`;!x?^5?|@:`?I`@/? Ġ&@J +;ʯ6d@)y @7ff`?ȴ9`@`?t`@D3@@J$t;јZ8?\N<@:???Q2@JB;ş]?_o@:"? @@?Q@Ff`@J}ke;Ѷ=>N@ ?H˒:@9?-@7K?홙03@@JD,;MrO@ (@; ?@@+?^5@@T@J_t;-Dܨ?L/{J#@;N???dZ >@Jwc;;o?@8k???G @Rf`@J ٔ[;˝^J82?1&x@:Pb@?1 @ff`?θQFf`@J;;vy?Z@8Լ`??5??O@@8ff`@J_I;vݬ?<쿱[@:? @@ ?`@Us3@@J%;MYO&?Z1'@;r?hr@1 ?@S3@@JBC;~dž;?Ƨ-@4Ġ??l?@J33@@Je;D#@ ݗ+@9???@IL@J7;u6 ?qiB@;8?5??1&??@J$;XB4?(\)@6@?׍O?Q?@Kff`@J^w:;h?C$@9?hr@ "? I@N3@@J{;̥J?R<6@;`?@`@?\ L@Jb;Ûˣ??@:??l@?Q@Q@JŤ;•c?($ xG@:D??7K?E@M&f`@J@;AS*?{@7`@?&? +@?;`@C@J4X;Ҧڜ?%@:l?д9`?"?@ff`@J݋a;'@:)y@:??$?Լj@Tf`@J?;W}W?>B[@91 ?׍O? Ġ?$(33@@Jͫ;Ă{o?Ov_@7.?Гt@x?`@J}N;ι䒼0@$tS@8`?z?`?EE33@@J;;.;*?@9E?Ͼv@y ?€@33@@J+;ѿzԲ?O;dZ@4_;`?ff`??9X @4f`@JB +B;J? ? I^5@:?`?+?@!@Jbk/;M@$>@䎊@;?ȴ9`?@?G?3@@J ě;Ǿf?䎊@4*? @5??@?ff`@Jᴻ^;Œ?}H@7=p@2?|@€?j@P@J_;ɕ$?%@6l?A@? +@?S@ff`@J yL; +D ?D*@:/ ?E?G?`@Us3@@J|n?;׭_@+ @; A??|?ȴ@?@S@J!;ѻ?S@6`@?G ?T?t`S@J=;Üb? ҈@;2n?`@?T@JJ;ћy +@9@: +@?V?`??|O@J;&2?궮}Vl@5P ?š@ G ?-F@J b;k1)?-V@7S3@@`?+?5?@Tf`@JÛˣ;H.?g @9N?`A?7@?dZ R&f`@JDN;e{??@9 ?=p?|?أ6@J4m;&_Z?/V@8@?"@/?;`ff`@J4m;Ɂ?K]cA@9?˥`?5??◍@Vl@J=;у +?r ě@8$Z ?;d`@%`?̋C@VY@J=;d"&@D*@;x`?;`?Q?z,@Jγ;ΛZc? '@:b @?9X ?`@?h@K @J;ğס?C,zx@;z?z@?C?^5@D@J;˗$tS?Vu@9&?5??1&?+Mf`@JOY;ѯ{ @֡a@9Ȓ;EgD?73@79`?ȴ@?z?@V&f`@Jȁq.;h<){@䎊r@:YX ??ە?$+@JBԐ;U?$tSM@;h?O@^5@?,33@@J};Ňa@ F]c@;e`? ?@?+ff`@J>}Q;@ 6C-@;?° @  ?1 @.@Jʣ&;ȋ?N@xF@;?+?~?@@<@J "K;̣,?y (@7޸`@ @l@?-`@&ff`@J "K;Z[(? @849`?Ұ ?򟾀?ڰ T3@@J_8;UW?g @:5@?C@9`?"H@J|; 9d@K)^ @7`?9X ??@Os3@@J©;Ĉ皮m?w1@:`??T? Ġ3@J΁;s@ae@:J?x?ě?I`@T3@@J΢a;H!v@ }H@;r-?l@?~? U@JѢ;Øc8|?)_@8@@$b@@\ ?TR@JHE;2`=W?JD@9@?@?땁?އ+Pf`@JA;îM?{m@;`Ġ??\)? @R33@@J=B;ھ'?%@:? @Ƨ?7@@E @JŹ;py,@2m\@:v ???`DL@J5;'?j~#@;p ?9X ? Ġ?x/33@@J$$w;+?v_ح@:?t`?€?@=3@@J$$w;cw@nO@:?v@t? @S3@@Jbd;ǴOz?'RT`e@8(?dZ ??ȴ@@ @J՝U;F?W>6z@:-`?@?֧GL@Jվ;E?nO@9z?(@j?CQL@JG;ͪU@ & '@:y ?r ?/? Ġ@V3@@J׾V;CE@',@;z?`A@t?@P@JƋ;v^@ O;d@:?dZ @?щ7@@@JڠC;bU??n@9:^@?T@^5@?=p@R3@@JEk; ܇T?q @;1 ?Õ?t?hrA3@@JS;3aV\-?zG@7+? @?ާP@J?_;>@u!R@:@?? ?x@33@@J(;iaiw?iB@:wK?V?I`?`@@L@Ja$F;? '/@:%`?? +=?@V33@@J߽jY:;ʰ.?!-w1@:q?ě??j@$@J\̉;HZ ?C]@7?ff`?ڰ ?z@S@Ji;]x??@;ܬ?ٺ^@@@?hr?ff`@J?J;ه2?+jg@:`?A@@?9`Pf`@Jfw-;__ (?{m@; ?;d`@M?ǍO@D3@@J;Ľ&0?o@9~5@?̬@@9X ?S@Hff`@J\ +W;?^W?4J@2 +?@BZ@94z?ě? Ġ?(@Lf`@J> ;\f?&x@;-`?v@E?° @R3@@J!h/;ίF}@ |#x@;,@?ӥ`@t`?v6ff`@JB;Ɍ; E?#@7z?? +@?Q@J>;?j~#@: ?l@?`?֗@*33@ @J!:;C,z?}Vl@:i?Q?G ?S!@J!:;Qv?g k@:? @ ^5@?\)@:"@J ;̀S!;&01?O M@9?š?C?L$@Joi;ˡ]B@ s@;`?ě?"?L33@%@J'c;цP?NT@8\j?`??"@P&@J;e{ۜ?O M;@:v?z@??|@-'@J.3;ϒ8?~($ x@6} ?p? ?G@ (@J_Js; # @ r䎊q@9*?\)@ (?@0ff`)@J7;“;?o@:`?b@@O@?bM@Pٙ*@J :2+;ʷx?٣n.3@;?`@`?7@@+@J |;Ź?tj~@8t?j@?S ,@J PG;ο2/'?"`B@;,?Ƈ+?$ ?QL-@J A;pGJ?S&@:8Q?ԛ?^5@?@Jff`.@J A;Q?!.H@7?ա?KƠ?+@P3@/@J A;Ó +@K]d@8>5@@1`@_;`? @Pf`0@J ܇T;кK?ڹY@5A?͑h@ p?9X =1@J;yJE@zxl"@;?`?l@?\ C3@2@J;:"`?GE84@9n?Ͼv?`A?O@U@3@J;z-?B@:V?\ ?^5@?b@@P3@4@Ju;'ͻ?0 (@;X ??/?݁ Kf`5@JR;ĞD?ԕ*1@9? +@?~?KƠ@R 6@J@N;@[9z?sg@8l?Լj@G?@A7@J>a;˄ۜsi?Xe+@:\?ȴ@@/?E@C8@JD#;$@5?@7?1&@b@?\)89@JD#;}?Q_p@9z?x@ j?7KOf`:@J~dž<;??|hs@3?۶E@ě?7@;@Jq;?!-w1@:[`?&@G?\)Q3@<@Jd;z+ϒ?@@5\ ??@?pG3@=@J;?l@KƧ@9$@%7K@`?ȴ@@J3@>@JȽ;[?$tS@8y ?1&??`Qy?@J`;G^cb?Xe@: O?Ӆ?`?@UL@@Ju;T? @8XQ?Q??ܛ2f`A@J!9;ނ׶5@ 0 ě@7@?l@?+@B@Jrn;SX?B@:Ơ?M@^@?`@Cf`C@J>';s恩?$/@:@?X`?z?`@IٙD@JB& ;q?As@9B? @ff`?@ff`E@J'x; oz?\(\@3dZ ?t@v?\)@V9F@JCV;I8X6"?@;A ??n?ٺ^@4G@J`;( +,?H˒:@9?/ ??I`@OٙH@J!~;-^T@(@8"M?`?1&?;33@I@J#Y;Iҍ?@:`??|?"?E@VyJ@J$ p;[S??1.@;l?Ł ?O?"@Iff`K@J$ p;.b?nO@4X ?@?xL@J$| +;?s@8?̬@?Ͼv?n@LM@J$| +;Ÿ@*0U2a@9 ?M??`UYN@J$G;I?8}H@;$?G ?O? @IO@J$G;7w+@$ xF@9e`@?/ ?أ?@A3@P@J%=*|;Ŧ(F?\(@;`?/ ?Гt? Jff`Q@J%=*|;Х?u!@;3@?@V ?`R@J%P@;;Ę?/V@: ?v?A@?@Uf`_@J+#8;˕"`?1.@9;`?-??ݑh2`@J+^R;ͬ+?`A7@9?/ ?z?;d`a@J+^R;á]9~@>@:h?O@5@?\ J3@b@J+&;F?\N<@9Ơ?&?"?@Cc@J,@Ъ;dz S\? ě@:? ?|?A@@:Ld@J,+;̧ayW?C]@9;`?\)?v?ěAe@J-";}r?nO@:?/?7@? @f@J.}A;|?s@:9?/ ?33@?V@33@g@J/];'c?ԕ*1@;\ ?\ ??l@=ff`h@J0@9;~1U@4m@8V?ە? I?|Mf`i@J1)˫;WU>?Xe,@9h?ʟ?$?-Gj@J1;.^;Q@eO@5;`?KƠ@Z?`Lk@J2a|;Ո]13?@NU@9@?ҏ\ ?€?V @Js3@l@J24~;Ö9?4m@;m`? I?j?7@Um@J3@|;㸡?'RT`@;`? @? I?Jff`n@J3@|;mHIE?"`B@:?/?`?1 ?o@J3μ;Ǵ3?e+a@;$Z ?ϝ @ G ?&@Cf`p@J5m;ʸ1f@vȴ@:Q&?@@?Ƨ@B3@q@J6`&;;@=ڹZ@:Ġ?`@`?`@ILr@J6;LƂ/@8Y@;@?@?-`RLs@J6޹^[;ŎC$A@@N@;@?7@@?jH&f`t@J7GM;ҡ?(\)@9K?z@@\)?޸Q@Pf`u@J7GM;Ǣ'?ѷX@:?l?ȴ@?Z9ff`v@J7~;p*?'RT`@:A?ѩ?dZ ?v@F&f`w@J8' ;ܘ?o@:?n?€?n@SFf`x@J8m;+ ?,zxl"@:" @?z@n? +=@My@J:pe;ѭ~?[W>6z@80 ?C?9`?+8z@J<;֔?g k@6?O@?/?~VS3@{@J<`;ΙL?ڜwkP@9Ġ???O@|@J<};̺@$?u%F @8T?`?@?`@O}@J<};?ۈeO@:b@???@~@J>p;͙?֡af@;???l@P@J? ?u;`؇?zG{@8b@?dZ ??ܼj6@J?|h;+ +a?P{@;2 ?l?Q?Q@J@n&;d@rᰊ@;S3@? ?dZ ? +@3@JAA\;EkD?@:?&@9`?b@@@JA0P;pI?qiC@6q&?@ ?Ƈ+@?@JAK;]9?#9@8Ƨ? I?`?5?Ef`@JB;rif?84֡b@9`?G ?`A?+@E@JBI;şU?vȴ9X@;? @`?Ұ U @JB;F!@\(@;`??|@~?ff`@#33@@JBb=;?m@:|?9X @bM?€@U@JEAR;ɚ ?O;dZ@4d`?V?dZ ? @(@JEAR;ƤLj@6@9G?`A?€?Ѓ`@Ff`@JFB_;δA3?҈p;@:6 ?z@?`?t`@R33@@JF^"S;? ?u?1&y@7W +@?׾v? ?S$ff`@JF;PB?K]c@;@?Ł ?l@?G@R@JF;Ϫ%ם@~"@:>v?(?ڟ?(@JL@JF]c;О?\N<@9M?;d`?$ ?V@KY@JHp;a^?|@:V ??`?܋C@Eff`@JI;yF<3?_o @;r?д9`??z@U3@@JJB[@;@? +=?-`?@JW f;ȁUO?_o@:I7@?˅? @?`@ff`@JY_a;"P&?nO@:E?O?1 ?C@ @JY3U;шh?@7Õ??j?MU@JY3U;;?˒:)@:X?Ƈ+?V?`@L@J[0H;\N@\?@;7@?O?7K?@I&f`@J[;ÙË@q[W>6@;Hr??ff`?@33@@J[vh<;62?-V@7/ ??`? @JL@J\ F;u?)y @9&?r ? ?@P,@J\fw;z?+@5?;d`?t?`M&f`@J]U;g?!.H@7E?7@??@Jf`@J]:*;љgD@@NU@:?n@?z@H@J]r/;.@O;d@9㕀?^5@@Q?ᙙ@Q@@J^|Y;a?E@9?ա?&?"G@J_=}9;⟜?64K@7^@? ?X`?+@Fff`@J_';Ǻ#|@nO@;?? ? @ @J_';'Ӻ?wkQ@;r?dZ @w?~@U@J`H +;Z}$ @@:WK?ղ-?33@?`:L@J`c&;If{_?Ov_@9 +@?Õ?9`? @U@J`|A;e7@ 1@;˅ ?-`@;`?˅?@JayW;'w@ $ xF@:?;d`??A@@$@Ja!o;J)@ #9@;ؓ?Q@^@?`?@Jb{;I3@eO@:5@?X`@ ?vff`@Jc#;NL@+ I@;v?"@t? @Ef`@Jc;ǃ{?v@; +=?n@$ ?"@J@Jd8;!F?C,zx@;^v?/?\)?bMU@Je;†<`@_vȴ9@8X ?V @z?9X @2ff`@JeD;/#:G@iB@:?˥`?/ ?ӕ@JY@Jex;Ǻ{q?tj~@;~?Q?x?5?6f`@Jex;G@O;dZ@:M?`@;d`?t`@9@Jf@=;H@:)y@;cT?v@ O?P@Jg;'sP@JM@;A?E?ff`?@P@Jg?[`;- q?/v@; ?@ ? -@JiKY;c8|t?@4m@:€?G?l@?$ JY@Jj; D5?kP{@8 @(@=? IU@Jjq;_i?ѷX@:N ??`?@A@Jk@;īi?5?|h@7@?|@?@Rf`@JkD;ʷw?- @7e`??? @33@@Jkb +;Om"B?o@:M?33@@?ff`@?@JlaR*o;ЋC?rG@9 ?/?ȴ@?`Rٙ@JlaR*o;}@|hs@: ?`?A@?۶EPٙ@JlaR*o;ǎru?- @;?@,@? Ġ@ 33@@Jm\;D3@@Jm\Q;XB4?C,z@: ?$?;`?@@8@Jo~=;&E?c @9?`?֗@? S@Jo ;J? ?1&x@; C?\)@1&?v@33@@J#;(}?+@6 ?̬@? +=?"H@@J}Q?)^@;&f`?C@z@?Ӆ@&33@@J\I;ЮG?GzH@:J?֗@? ?@(@J"x;v :?4J@;hr? +=?/ ?`@@&f`@JC;k"ɂ?oi@:0b@? ??€RY@JC;ʁE?ѷX@:A@?@ n?Լj)33@@J\$;m@& '@8 ?V??׮(@J;ߏG@Ov_خ@9?@?@Rf`@JM; ?&@;\?n?ě??|@Q@JT;Ʒx? @:?I`??~I@JT;ĭ%g@ z@;d?l@?(@9f`@JT;µ)?1&@6?`?l?O@@.@J4"F;ъeI/@^@;+C?-??`@@Jzt:;`=Wyd?'RT`@:x?@"?`N @Jj;ACg?ℵ?@7Q?~? ? U@@J>i;-Y^l@.2X@;/?@? ?C3@ @Jv.;>@eO@;v ?@ p?`233@ +@J;flf?Ov_ح@:˅ ?~@Z?̬@Q  @J>E;ŝ;D?<쿱[@9;`?`@?`?dZ @R @Jqd;N&Ԁ@l!-@;=?š?z?^@@N @Jӕ>;Ȩ~8? M:@;i7@?Z? +=?ѩS@Jӕ>;ȏBQ@ %2@;;`?Q@?l:33@@J}c;6?"`@;&f`?n?/?׾v@@@J_ô;ʣS&?5Xy=@8`@?`?ě??@Jߓy;@bM@:?n@  ?M@D@J Ԯ;޽?l@9f`?@1 ?`@.@JLv;ü]#?e@:T`?t`@~?"@P3@@JdN;Ff#?3@;X?@l?bMQ,@J׿;Dž}3?1-@;? +=??ԛ@U@Jw;vB||R@ѷX@;9X ?t`?=p?^5@@G@J;Ъ[@5sg@9=?p@ +@?@ ff`@JCg^;ĸjr?Ov_@:T?"@ +@?`@933@@J?Q;.? '@8j?;d`@O?ԛ?陙@J#Հ;Ϛ? ěT@;y ?@??^5@@'33@@Jf;Q@1&x@;D ? Ġ@?އ+@J;Y ?}Vl!@7ff`@0t@?ě@7@J@1Hw;KƤ?O;dZ@:x?Q? ?ļj@C @J;; $ @qu!S@8"? @-`?b@@8@Jw);A,@L@:??E?7K@. @JCX;6@qiB@;3@?/?z@?@D3@!@J`ܹ;Jw?@;?"@? A"@J# ;ʯF}?_o@7T?䛥?\)? Ġ@R#@Jް; EU@hr!@;t9`??T?33@@A$@Ju[;RG?'RT`e@8@?`?33@?|F%@J;ˡA(?,=@: ?bM?߮?ݑh@TS3@&@Jj;^~j?$tS@87??r ?+'@Jqy;6@ZY@9?"??/Pf`(@J>˴;V\-'?g8}H@:?G@D?:ff`)@J!5ڭ;@$?qiB@:š?G?n?@=L*@J}0G;pޏl@2a|Q@7ff`??n?Vs3@+@Jݾ;y@J;_x5?C,@8b @?ݡ?j?$ R33@?@J oz;aiv?{@3e?5??h?jAٙ@@J"^;ɅYp?@4m@:޸`?ȴ@@,@?@Of`A@J~య;nC?*0U2a|@8W?`A@-`?@*B@J~య;ıxp@Y>BZ@9KƠ?`A?E?׮@,C@J"[;̇H^>?3@:d`??T?j;LD@J;!F?y=b@:8?׮??ݡEE@Jä/;8%;?s@:8??@?1 @CLF@Jğס<;5Gib?e+a@: ?$ @`?-`JٙG@J0;Іh?[W>@75€?݁ ?M?@Qf`H@JCE;NZ? (@:@?Q?`A?1&@II@J!laR;ѵA̅@f,<@:?KƠ?+?7K@*ff`J@JɁ;ڋ1@-V@;m?1&?/ ?E@P@K@J};@@K]d@:?S?Q?ҏ\ >3@L@J> J;D?8YJ@7?A@?9`? @I M@JϢj";̉'RT?Q_@:?1&@ +=?j@$N@JϢj";ʍ!j?hr @9Tz@$??M(33@O@JAS*;1a?iB@9w@?`A@=p?-@P@J|;?m\@;Ơ?z@?dZ ?r 23@Q@J|;*?'/W@8?\)@n?QJf`R@J_;},{?&@5(r?`?t`?&@FS@J ;S?҈p:@9? ?$ ?Ұ @ET@Jc; +6P?g k@:??j?&?l@$33@U@Jp;$[)@e+@8,@@!9X @I?׮V@J;#@FA? ěT@9?O@ bM?Ͼv@;W@J֝0';6V@C,z@8?٩?I`?If`X@J֝0';J@Ƨ@;G ?n@ 33@?Q?Y@J^ F;9?D*@8׍@?`@/?ȴ@Eff`Z@Jb,E;½?C$@99?ě?-?1&Iٙ[@JBZ;L?RT`d@;?öE? Ġ? @@D3@s@J_J0;D9?*0@:@?/@?7@@>f`t@Jݤe;БE?՗+j@3e??\)?ļj@Qu@JcHk;i?KƧ@7޸`@Z @?7K@BYv@J鞔;HY|@8YJ@:'?ϝ @^5@? +=Ulw@J.;ʖ=Ć?6z@:`?ȴ@@p?QU3@x@J.;g#$6?بTɅ@:l??/ ?1 @Sy@JB;۠&@TɅo@;޸`?b@?p?G@#z@Jc;j]V@ 3@;`?"@&?۶ER{@Jc;GNΚ?ᰉ@:?`@@?@,ff`|@J;2z@ D*@:yX ?KƠ?`A? +=Uy}@J )k3;ōzt:?ԕ*1@7???v?@Kf`~@J;=Fk?S&@8?ȓt?z@?pS@@J=_;Q~x?\(\@7d?x??ě@Ty@J^!;- q?zxl"h@:C?/?\ ?dZ @J@J-;L?sP@:?v?r ?׍O@"@J^L;_@@;F??"?dZ C3@@J#j;ȵ`@<64@;Ġ?O@+?`@S@J<}^;}w@(Xy=@:7@?hr@ ?I`Df`@JM; Fd@)^@9ٙ?ܼj@,@?xU3@@JaM;˂½R?7KƧ@;f`??E?33@@ff`@J~;w>%?wkP@:`?=p@??ؓt@ @J~;mr@.}Vl@8?T?C?$ @M3@@J](;Ғ>[b?'/V@: ?1&?G ?Oٙ@J](;V-?oiDg8@:+? +@@I`??|@@JD;u@@4n@8?1&?^@?ӕ@UY@Ja4>;`Ï6i?+@6?Z@t`?I`T@Ja4>;D(M?`A7L@:i?ļj?x?z@@U@J{ 2;+^R?nO@;@?n??€@T@J"$;Q@IQ@9v?A@@`?@D@J ;ĎT?!R<6@;`? +@?և+?T@Tf`@J?;-@9?? @? @1@J 2;YSXm?W>6z@65€@h??9`D3@@J 7!;KCW?Fs@8?33@?홙?M>L@J}s;d?|?@9 ?X`?"? +@@S3@@J}s;Ub?nP@6s3@?@@?&ff`@J#r;ѽ@ ,<@:?G?KƠ??|ff`@J@;pޏl?6C-@;?ɺ^@?E?V @O&f`@J5;>oo?C$@8^@?j@`A?@;@J9s?m\@; +@??`?ۥ`7ff`@J\W;'H@Z1'@;? @,@?+O@J\W;3Ko@=!.H@;pb@?ə@ n?V @0f`@J;ǎ}ܤ?- @;?@?$?@'@J4;'c?<64@9`@?`?33@?O@@E@J!u;ȣV?=p +=@:?@@?`Q@JCRe(;'$18@`u!@9\???&43@@J;ʟ{Z1?(\)@7t?"@h8;ƿe@쿱[@8,?X`?홙?$@Jm;;yR5?Z@;6 ?@2-?I`@ 33@@J ;J㎰?Ӡ k@9:?@n?C@Nff`@J! ;$h#@Y+ @;$?öE?7K?`I&f`@J">i;HS@^҈p;@8f?E@ɺ`?-`Qff`@J"z;ȟ/+g?C\@:&?^5@??v@&@J$>;{?ҀIQ@9?C? ?t`@S@J$_Zj;CG?0U2a|@8|?`A?׮?@R3@@J$_Zj;!>>)0?E@6ٙ?G? @?Ds3@@J'Ai +;z W\?IJᰊ@; ?͑h?`?I`@R@J';[W?~$t@7`@( @ C?$@@J(^ڶ;`Ï6i?1&y@:?bM?x?n;f`@J)*;˯"Y@1o@:`?öE? ?VP33@@J)&;6?M@6#?/???33@@J*9;^Vl?Zݘ@6??$ ?V;ff`@J+ʫ;`Ɋ"?lC@8?C?7K?`@@LY@J. +;ĊG?[W>6@:t9`?hr?ݲ-?܋CM33@@J.]\;1"?$tSM@8x`? @?$ ?7KLs3@@J.oK;̛A94?a@N@7[?Ԭ@??;d`@B @J.;Ȩ~8?˘@@:@?b@@O@?@A@J/aZ;ߛi@-U=@:`?Q@S?€@;@J/;_Ë?eO @8=?~?`?և+@Dff`@J0OY;ȾγW??@:)?`@?t?V@I@J0͚R;C? [6@;vE?E??ȴ@@.@J0͚R;|^/@ I^5@;)7@?`@ +=? Bf`@J2;Z? '0@8$ ?Q?ȴ@?p@P&f`@J2i;!n@sh@8! ?E?^5@?v%@J6C;YW!?o@9+Ơ?33@@0 ?P3@@J6~AN;yW@,"h ԕ@;~`?hr?\)?M@J8!;ǵ92P?+ @;_|?n@?~@43@@J9-*;U.r?8YK@;-`?n??9X @"@J9`; ?ᰉ'R@6?;d`?M?`Sff`@J:!c;7X?᫟U=@8;`?;d`?t`? @T9@J:}O;IM?S@6`?|@@?(@B@J:}O;g?=K^@:q&?@'?b@J@J:T;!:?H@: @???S@Mf`@J:T;5Gib?@7r?&?I`?233@@J<}^p;c$?73@8?|?`?lA@@J=>N(;g@@ӎMj@;u??@? ?`Q@J=ݱ ;i?bM@8T9`?`A@ "?+R33@@J>@W;?u%@8Z ?t??J3@@J?eE;ӝf@U=K@;ix? ?€?Q@ff`@J@|ѻ;˘ƣ? k@:?@?x?O@@'@JA=s;ڜ([?P{@8$?&??"ٙ@JA; +#@_o@9ɺ`?`?`?݁ 33@@JCg;}o ?!R<6@:b?Η@? ?S&f`@JCނ;D^ԡ@ȴ9X@9O?=p??G@P@JC=lr;ˁ?Xe+@:@??$?O@JDH;Β͖ @`A7@8Z ?ě?"?@R @JE6z@6?^5@??C@JQe;Ã?e+@:??1&?Q@J @JR_;\?C,zxl@8_|?n??Ձ N@JR%S;'?$tS@7Z ?͑h?V ?"K@JS!;"?C%@8.?p??ؓt@&@JSCs;Ƹ\J?E@:?ə?hr? @JT8T;S?a@N@6ݲ ? ?z?\ Pf`@JU!{;ðݾ?_Ft@8R-?O@z@?D@JV>';СY{?RT`d@5/ ?׾v? @?x@ @JV7];U +?@:?`? ?@ff`@JW?$;]B?I^5?}@:R?У??T:3@@JXD;"XZ?xF@:??|@5??`B @JY}I׺;Ȗx|`?O M@;E?^5@?+?@#@JYe=;˝8@33333@8j?I`?9`? @R3@@J]\;Yy?Ϫ͞@8Ġ@E@G?$ G&f`@J_ !;̠]+?a@N@3 ?Ƨ??7@&@Jabf;@n?"h ԕ@8 ???O@@U3@@Jc ;$? k~@;D ?Q@h?Z$ff`@Jd;E,Y?xl"h @;G?Ƨ?"?T@B@ @Je@x;ٺ?>BZc @9?9X ?Z?Ѓ`!@JeWm;P+@Z@; ?Q?"?E@S"@Jf+;??l"h ԕ@9?@1 ?`@VY#@Jl] l;:?㞃%@9E?^5@?Q?G/ff`$@Jl] l;ɘZ8@^5?|@;lI?b@?؃`?vU3@%@JmZ;jf@S&@8C??`A?ەQ&@JmZ;! ?O;d@:}/ ?@??`@2L'@Jo?R&;Ȇh?{m@;? @ I?\ @23@(@Jp*;@@6k ???|?;`Mf`)@Jqy;`x?Q@9+? Ġ?"?@O*@Jq۾;łU?Ş%@9Ұ ?r ?̬@?Ƨ@33@+@Js`I;ϑU?- qv@9?@?&? I:,@Js*;8:?g k@9?$ @n?׮@K-@Jt<;)AA?ѷY@9] ?? +=?/@/.@Jwl ;ˋ?u%F @:#???ٺ^@9/@JxB0;ΐ 53?s@8?C??O@@S0@Jy=c;9$@ + J@:?? Ġ?V@Df`1@Jy_gn;ϬӪ7?Zc @9 ??b@?`A@*2@Jy_gn;~?Z@8?M? ?ܬ@@@ٙ3@Jy];$@ aGz@97@?Z@?M&f`4@Jy;;ƔWU?S&@;l?9X ??@@VY5@Jzcsl;ɑF? ѷ@;z??;d`?-`@O33@6@JzG;J!?@8DZ ? ??r '7@J{՝V;Ǔ|@x@;`?;d`?E?ff`#8@J{=;}2f@F]cf@9{d`?`@X`?Z@59@J~|;K@ (@;z^@?ě@ `? U:@J@; b?u%F +@8 ?ȴ@@?޸Q@D3@;@J;s?@+ J@9̋@?dZ @-`?Q@Dff`<@J);L8?oh@:?v??Q1=@J);(b?qiB@9A?t`?`A?㕁@N@>@J;ɷa?@:(r??l@?-ff`?@J—;#-+@{J#9@8[?r ?\ ?Q@Cff`@@JL@J;¾ac@]/w@9ȴ@?`@?@?ZT A@Jrѯ;Nx@思IQ@9YX @A@@,@?@UB@J72;?S@5|?`?I`?@ff`C@J72;LJA?"`@9V? ? ? @SٙD@J] s;#j?a@N@8??ě? ĠAf`E@J'RT;8⟝@H˒:*@;+?ě?"?@A F@Jޠ3;>oo?K]d@8?V?|?@Bs3@G@J~d^;Ϣj"? qu@4;`?€?`?+@VLH@J`sX;ȝ{i@ k@;?;d`?`?@Ps3@I@J};}Z?1-@:|j?€?Q?"TS3@J@J`;˖[ ?Ʈ}Vl@9_;`?Ͼv?G ?A@@?PH@:?̬@@?^5@@K@T@Jf;[BE?+jf@9}/ ?ȴ@??1 @IٙU@JBZc @9v?\ ? Ġ?G @LLV@JZ;̶b?)^@1"? ?S?C@I33@W@Ji;{{?l@9@?9`@y ?VTX@J'gM; !?_F@:??;`?1&@DY@J~;H?"`A@;m`??7@?V @JLZ@J];Ͱ$Y?u"@9$?=p?`?7@@2[@J2.;ǜK?3@:A?`@?Q$\@JaM;?5?'/V@;d`?/@-`?J]@Jh;H8}?$ xF@;9?b@?^5@?<^@Jh;˳@ ѷ@: ?v@9`?Ƨ_@J\;j7>?oh@:,I?-@?O@5`@J~8;R@84֡@:o@?@??-`@S@a@Jދ;2;u?⍸@9|?dZ ??&T&f`b@J*s;ìax@ R<6@8l@?hr@ě?x@Q3@c@J٩T;Y4@Y|@;S3@?ȴ@@?V@2d@JB +B;]9@j~@8޸`?@Z?ԛN33@e@J\6;˅?tj~@9+?b@?l?dZ A@f@J);ɍXB5@iDg8@8?~?/ ?܋C*ff`g@JZq;٩T"?3@:?Ѓ`@r?&@;h@J=;5H?U=@;?t@?Ұ @ff`i@J=;Ñ>E?ˎMj@5?X`@C?7@JLj@Jn;/uK?*0U@9` ?`@ ?@@Ek@J;0?/{J#:@9ڟ?š?^5@?~@Sll@Jb;@Ov_خ@9A? ? Ġ?QTm@Jb|;Ϧz:?]cA @7?t`?€?O@6n@Jbfe;_8?1&@9'?E@`?@@o@J;ʌ@m\@; ?$ ?`?C?񙙠p@JQ;ŋ)oe?qiB@:S3@?E?Ƨ?@Rf`q@JP;Ôcϳ1?tj~@4)?z@?Z? I@Tr@Jn;vF:;?|@8?|?͑h?`?ӕ@>3@s@JDP;}?L/{J@:<?hr?ě?p@ +ff`t@J!y;1KL@*0@:-?ě@1&?`I&f`u@JQv;b= @ $/@;^@?(? @?S3@v@JQv;ưS@@:?@Ƨ?1 @Q,w@Jʣ&;x>-?($ xG@;R ?V @ Ġ?dZ @?33@x@J "K;#*g?E@6?`@?t@Ly@JB;}wa?A@;c?+? ?@-z@Jy1D;db(?y (@9 `? ?ݑh?SP{@Jy1D;A?8}H@;1 ?KƠ?`?z@P|@Jcˁs;f?B@5 ?n??@VL}@JX%[;Ŗ}@1&x@:?bM@?(@P33@~@J_t;" 8*?H˒:*@8(?O@@ ?dZ @733@@J΢a;Ơۭ:`?p +=q@8`?^5@@(?$@E@J d#;oŊ,?쿱[W?@9 ?+@?C@233@@JTCN;w݇/4?\(@6?dZ ?n?bMG @J=B;9W?a@N@;l??7K? @K3@@J_(;Kf/@Zu%F @9?ղ-@ ?ȴ9`@@J_(;οLP?8YJ@7?^5@?`@?@P@JЀs;MW&?Ov_ح@:M? @$?ɺ^@@U@JЀs;ɋś$?tSMj@83@?KƠ?E?׍O3f`@JŹ;ʹ䒼0@@;?M?`A?G @Cٙ@J;\@҈p:@83@?@s@?V 0@JҀjk; +?&IQ@:`?E?G?`F@JF;ƅz?Y|@8?`@?;`?4@J;ĪPy? k@3?v?"?◍@@If`@Jb +;AvSC?:)y@9p?@?x?݁ @(@Jվ;űH?u!@:?Ǯ?? +=V@JG;ˣe5@@9Ơ?r ??@@Of`@J6;y!?`A7L@8ݲ ?Ͳ-?bM?@Q@J&E;<[/?䎊@7k?`A?`@?ӶEE3@@J;)t?E@9@?dZ ?/ ?Гt0@J]g;~?!-w1@8Ơ?j?`?1&0f`@J!1;BcQ?r ě@:)?`?bM? @JB1;ŶZ-s?_o @;E??|?`?`@Mf`@Jd;uK?ѷX@7C?1&?dZ ?v9f`@Ji;@R@U=K@9? ?`?1 =3@@J;>??Ov_ح@7?bM?`? Ġ@T @Jj;?Q 9@O;dZ@9@?`@?G ?@E@@J;ۃH@Z@;5@?&@ ?@Oٙ@J O*;gf@?tj~@5"?l?z@?޸QQL@J_;K?#9@99`?Լj@b@?+C@Jl;}z>??@:)`?Ƈ+?KƠ?@K@J@;ǾV{?:S&@7 ?\)@X`?xF@Jz;4&x9@tSM@9@?Z@?C@7@J!-w;fb4~??@9e?C@ 7@?@2f`@J];7?zG@6:?ȴ@@ ?`@Q@Js}; xN7?q @; ?@@^@?U@JG;νm:?N;6@9?KƠ?Q?Q@JG;![Z@B74@;9X ?`@@G?ߝ @@J'L;'w@0 ě@9 +@?KƠ@bM?1&@K@J'L;;S?iDg8~@;C?-`? Ġ?ܛM@Ja E;`Q?@9W?`A?9X ?xM@JaZ;~4E?lC@:$?$ ??`@J;Ɏ"@Q_p@:?O?n?>ff`@J. ;##e?$/@8t?x??E,@Jb;s!_?Q@:Ġ?z@@ ?@B33@@J]V;ϟf?4m9@9?E@ v?ȓt@P33@@J*;!?P{@8$?޸Q?@?ff`1@J*;:@S@;?Ƨ?Z?v@8@JN;Dg8~@#@94z?ԋC?Ƨ?(@Ty@JQ~x;ÐI ?XbM@9Ġ?1&?|?`R@JΧ;Ϟ8d?B@7e`? Ġ?G ?EP3@@J};J{NT?%@; ? @KƠ?v@3@@JHo;œ?fA@;f`?Ł @Õ?E@P @Jrv;:lX?L_@8r??E?n@3@J!:;"?M:@91 ? ?j?&@3L@J}c.;M㸡?C\@9`?`A@L?E/@J4;%_5@-8Y@: @?° ?A@?x:3@@J_';*?Q@5x?r @ 33@?S&f`@J;l +"@u@8?`?E?ղ-?@J;%ԥ@kP|@;`?@@?`@Uf`@J 4;m?s@;x?`?~? @T@Jne8;˨ņn?~$@9?j?n?ݲ-@Q @JC;̆z2?O M;@3?@7K?S@C@@JqT;&z?@9p?l?9`?`@Q@Jd;]F,4;?\(@:} ?(@!?)33@@J^;ϣY%5@7rG@:-O???1&O@J;ǘA;@N_o @7 ?b@?C? I@J<;ѺQ?j~#@:p ?`@ G?ǮC@J`;<@.zG@:?? ?C@?@J];?S&@;G??j? Qٙ@J ;X@m@;`? @? Ġ?ٺ^@Hff`@J!_r;ˠ k?zxl"h +@7o?ě?-?أ@C@J"W;(V`_?oiDg8@9?`@?3@J#Y;!F?H˒:@8\ @@`?ěK@J#Ɏ;HE/?T`d@8l@?`??t@@J$ p;QG0Y?ې@9|j?ԋC?G?p@<3@@J%;:;ɎC$A?p:@8?̋C@`A? @;@J%J4;-@?ߤ?@:?n?/ ?vCٙ@J&Y.;cfץn?p +=q@9`?"?l?љVFf`@J(b;y^@ݗ+@:?C@=p?E@@@J(;ɨg@0U2a|@9ɺ`??7K?A@@H@@J)K;ZGA?L_@:{`?t@?@0@J*k8;lQ?H@;o?`? ?$@C@J+#8;7a?+a@@:@?Ł ?$ ?v@Ty@J,@Ъ;1DE.?(\)@6}?n@ \ ?@M3@@J,+;Ƴg ?,=@5cT?1 ?Z?ش9`V@@J/];q {? (@7 ?-??Z@@J/Y;z:@JM@8f$?Ƨ@hr?&I@J/p;}9@JL_@7|j?㕁@5??S4@J0;C؜? @:?hr? I?"D@J1]p;y1DF?Q@5>5@?t?S?b@@ ff`@J2m;xʼ?Xy=c@8F$?33@@C?Z@B@J5m;-?JM@:?ݡ@ S?C@2@J7GM; +=p@O͞@8??`?O@@Ds3@@J8? ;9?L_@;p?O@ +E??|@<@J9}w;͚{$d? I^5@9?;`?"?5?@*@J;[;"H?n.2@9<@T@ ?@@@JA:;ѩ>!? +=p +@9a? ?`?ݡ@2@J>q;;D=G?~$@;?ٙ@n?r M@J?c;`sW? ěT@;J? ?X`?€@8@J?|h;"BJ'k?ڹY@5?€?$?@Qff`@J@n&;=su?c @9?@z@@h?٩@JBb=;r:7?'RT`@6??V?ە@33@@JC @;Kf/?)^@9?Q?5??I33@@JDܨ;<@8YJ@:?@hr?KƠ@Gf`@JH#@F;ȝH?*0@9lI?n@Q?~@5ff`@JJ]#;awi?~($ x@;?hr?l@?bMPY@JKa!;i@ѷ@90?\)?`?`A@@L@JK; ?.2X@;l? ?G?G @PL@JL<;XĽ3?C\@9bM?ļj?x? +=AY@JLPr;ǐdf@а{@7???=pSf`@JLԻ;Ź?zxl"h +@;}? ??|?5?ff`@JM@$>;ɲ,(?^5?|@9,@ff`@Y?j@TFf`@JND0y;oeP?@NU@;4z?/?Ƨ?`4ff`@JND0y;̳!@ +:S@;? @ ě?`5L@JNUa;"zB?,<쿱@;?/@Q?SG@JP];G8@?@;?x? ? Ġ@JQ};FsB?ȴ9Xb@8 ?z?S?I`G@JR\&5;CA0?c @8$?S?j?^@Uf` @JR;9?IQ@8t?@ix?;`0ff` +@JS;ȇ"y?+jg@8?ם ?C?@T@ @JY>_ ;9@vȴ@7&f`@ +=@?$ @Ns3@ @JYO;Ʃ?{m@;`???7K@D @J^|Y;Ȏ8 +?ߤ@@9K?Ƨ??lM@J^|Y;=އ?@;`A?ə?|?t@Uf`@J_';?L_@; ?b@@;d`?TT@@J`H +;ɋ?A [@:Ұ ? ?x?n@V3@@J`A7L;DI?'/V@;ě?G@`?`@U @JcZ;Py }?- @9 ?x?h?xC&f`@JeD;PO?iB@: ?KƠ?G ?z@@0@Jf@=;ƫy?xF]d@;CT?b@@p?`@@TS3@@Jfzr;h@[9?g k@;0?M?dZ ? @@Mff`@Jk@;>'?hۋq@;Z?;d`@Q?G @P @Jk}:;׾W?#wk@8{d`@t@ff`?ǍOP@Jl;@TɅ@:/ ?b@??tP3@@Jo];Ǿ"?%2@;I? @ +@?I`@733@@Jp`+;8K? xF]@;?Η@?S? +@Af`@Jp +=;ɂZ?~"@8?$ ??`>@Jq}g;ɣ;?6@80 ?\)?"?/@@3@@JrC;P+@oi@;r?hr@|?X`K@Js4 N;ƔWU?Ov_@7~?Ѓ`?hr?C@<@Jw;4@mhr!@:Ǯ ?$ @@?`@@9 @Jw;?e@I^5?}@7???(@Lf`!@JxF];ǖBZc @;7@?O?^5@??|C*@J_;>q?A [7@;?Ͳ-?`?1&33@+@JY +@/O M@;Z ? Ġ??p7ff`,@J;LB@_o@8?-`?Ƨ?`A-@Jߨq;X?u!R@9$ ?z@??@=L.@J]|;n>h?N;5@; ?(@~??f`/@J]|;y@6Fs@;z?ȴ@?\)?lC0@JU;@x@3@8Q?\ ?p?9X H 1@J; +=p? k@8@?ա@z?@=33@2@J~";<}^p?5Xy>@:/ ?@??"@I3@J~";Ǧn?C,zx@8?$@ 9X ?7K;L4@J!S7;,+@ 0 )@:?I`?z@?(@B5@JD;LJ?͞&@:?/?`?+PL6@JD;ő%Vў?@:5@?θQ?S?=p@Q 7@J}%W;] A@[@;7?E?n? +@GY8@J T ;ʢXS?Q@6L@??Гt?߮R9@Jӕ>;c?畁$/@5 ?ȴ9`? ?tDL:@Js;ǝ.Y?u%F +@7?ԛ?hr?l:;@J%m;##e?<64@8 ?`@%`?zS<@J Ԯ;ȓf8C@7KƧ@8A?щ7@@}?M@F3@=@J_,A;/?H@9;`?l?l@?-@U@>@Jք;L ?5Xy=@: ?X`?z?@B@?@J/;ƾߤ??l!-w@; ?/?㕁?zP@@JË;ʐ +@䎊r@9?`?և+?݁ FA@JCg^;ƖnTq?R<6@:L?z@@ ȴ@?⟾R,B@JvW;:W?@5n@$`@@&?`@?3@C@J#T;x@e+a@:߾?ǍO@~?\)@4D@J#;D@ xF]@;7@?l@?j?V @TyE@J#;Ů*?L/{J@7ܬ??? K3@F@Jh;΃—?ۋq @9j? ?? ĠHG@Jh;E84?\N<@9G??bM?5?Ts3@H@J¨;XUP@`A7K@9Z?`?l@?ϝ II@J`O;ȇ+4a?>B@8X`?öE@33@?٩@J@JA(;{R@@4m9@;n?b@@^5@?\)K@J;ȩXS~,?@4@;ܬ?n@€?V Gf`L@J;;h?B@9?@  ?ZRf`M@J;;ɚA_E?傩 @8^@? @@  ?r @*ff`N@JG;C?֡af@;`@?KƠ? ?@U3@O@Jz3;9`?{m]@6\ ??|@ I?x?P@Jz3;9$?g l@6? I??7KQQ@J# ;Qa?Vu@9?O@?~?33@@;ff`R@J!Z; S.?֡af@7n?+?O@?5?DS@J];ő]@%u@;???@,33@T@Jc|;[>8?4m@:X`?`?v?I`@Of`U@J|-;=:2@?nO;@6;"?S?hr?E@T@V@J +;&+8?~"@3q?ڟ??7@PW@Jk;6]@K)^ @;`?`?bM?ȓt;X@J;b= @x@;m? @?/ ? ISY@J;Ľ# ?Z@7?ꗍ@@|?`@@,Z@Jܠg;]g#}?_Ft@:1&?͑h?Z?◍@7[@JE;zNz@z^5?|@;?Ł @n?@Uff`\@J!;>B[@)^@8`@@\ ?x@V@]@Jb;ϣ ?"h ԕ@7|? ?33@?1L^@Jup; @ 빌~($@9\)??^5@?Ƨ@"ff`_@J;")@@:l@? Ġ?V ? @R33@`@J`;ț8:@74m@;`@?@ Ġ?EC3@a@J}2;2%?jOv`@:S?@@?ěA@b@Jȟ@;?sPH@9D?G?A@?-`PYc@J>;Y@vȴ9X@7\j?;d`? ?=d@JɁ;%}R?^@9?ʟ@A@?$2e@Jݹ;ƍ֥?`A7@66E?M?Ƨ?`@@6f@JB҅;Ȅƣ@ק&@;3@?KƠ?G ?7K@)ff`g@JϢj";bZh+c?Vt@:@?ě@`?;d`Th@JϢj";ȳJ@[q @8!?A@@ +? I0Li@J >c;?>p?SMj@:? ?x?E@T33@j@JAS*;Z?˥S@7 ?$?;d`? @Tlk@J;ѝq?N;5@7?X`??~@Iٙl@J#g;@R<6@;?t@\)?"@<m@J@U;ˁ?u!R@:h?? ?"Rf`n@J܃#5;QeMa?-V@7?$ @`?G @(o@Ji;ͣ]g#?ohۋ@:`?"?9X ?jE p@J"f;xF]@wrG@;r?=p?@?q@J~˷;M/@73@9T`?x@l@?\)H3@r@J~˷;=d?C,zx@9&? Ġ?C?ղ-Ts@JC;X?oiDg8@;n?`??X` t@Jߠ';ߗ?!-w2@9?@@?@J@u@Ji;+6+?_Ft@9 +@?⟾?E?"@Iv@J&;:[h?m@9t? ? ?"@Rw@J\;O?ڹY@:?@>)?]cA @:4z?7@?z@?9`Sy@Jz;e ?a@O@7@ȴ@@`?$ 4ff`@J{ 2;uE?rGE8@9p ?j@M?`Tf`@J\P;QzFR? (@5š??ɺ^@?z@@@J +c0Q;ʞ#-?E@66E?$ ??-*@J #^;{Z1b?MjOv@8Õ??h?x@'@Jߤ@;=jΫ?1&x@3 ?;d`??=pV3@@J;?p +=q@:0b@???QK@J^AԷ;^Vl?sP@949`?7K@ +=? @J3;*2 h?ֽ<64@9/ ?t??!33@@J@tdV;łZ@ +e@9+?S?O?/ @J"sP;˵|N/8?jfB@7 ?V?hr?@R@Jƴ;Φ?1@9?x@W +@?EE@JT;6r@w+@9M`?C??և+V@J;?bM@;3t? @ ?^5@@I@JOv`;Wn?g @;D ?-@?@@J\|ؙ;̔>?s@8Ơ? ? ?@4@J`;6?؎qi@9o?t??=p@Py@JJ;fzr?S&@:\?r ?v?ۥ`UY@J!x;I@.}Vl@;/?@v?j@R@J[;/uK?($ xG@5;9}w?R<64@;I`?7@?`?ڏ\ @?ff`@J%);W}@kP@:8?X`?? @@9ff`@J%); l+?@; ?`?/?~C3@@J)&;]uq? qu@8?@ff`?33@@Rf`@J+ʫ;^_0?@@8X ?`A?X`?T@J,C;ʚ^w:?O M@89?"@1&?jAf`@J.]\;;D=G?+ @9`A? @`?GJ33@@J2"@;̼,?h ԕ+@:}/ ?@ +=?٩@ff`@J3?l;S?B5/?:~@: ?S??ղ-@Pf`@J3aV\-; {j?Ɛ$tT@8}?֧@KƠ?€S@J:}O;@R@_?@9 ?-`?@? Ġ@#33@@J;D=G;dTi?'RT`e@:@?n?$?bM@/33@@J<}^p;^h?:~@90b@?/?ꟾ?߾v@F3@@J?OQ;]*?ک @7;`?܋C?n?F@J?OQ; ^?-V@:Ұ ?hr?M??|@O@J@q;%_5?ג:)y@9>5@?@??9`@O@JB0;Ƿ]?tj~@:e`@?v@ ?v@@f`@JB0;s!_?O M@:X? ?"?ܛ6@JC\;;?)^@;V?"??O@@H3@@JD|0;ϥ8L?L_@8s@?^5@@?ȴ@@U&f`@JE^;0IA?+a@@9?x@?@U@JG;Ǎ?fA@:7@?@??Ԭ@@OY@JG;M΁?-V@9 ?X`@ +?33@Gs3@@JK#?;C$A?NT@:P`? ?G ?"@7@JM:;0#̎?C\N@9o??O?ӕNL@JP%;QQ?=K^@;>`?`A? @?x9@JPaAcx;ů?U=@8?1&?ꟾ?Ցh@Of`@JP;1N@ $TɆ@:Z??I`?Q@L@JR_;p&@cwk@:*=?̬@@ ?@R@JSX;u?=b@:X?33@@S?B@JVu;#?+jf@9Z ? Ġ?9X ?`@@JVԪ;dTi?#9@:^5@?M??|@Jٙ@JV7];>h?O;d@9 ? ?Ƨ?@@JW?$;[ @@4n@8Hr?`@6E?^5@@T@JXUP;3!@a|Q@8?dZ ?r ?ى7@@7@JYBu;{{?{J#9@8A?ȴ@@ j? @NL@J\ +V;7y ?%F +L0@:5€?;d`@? R9@J]η;0͚R?Ov_@6?ě@ě?S@O@J^v;ǫCII?&x@8Rn?5??ݲ-?`F@J`^h;@P??@9 ?̋C?`? I@2ff`@JdY2;?Vl!-@:?̬@?У?ff`NY@Jf;b(?d7@:*=?`??O@@:@JhI;#g?YJ@9 @?"?Ƨ?K3@@Jha9;ҿU?m\@9 ? @V ?=p@Hff`@Ji{);Ņb?4m9@9/@?t`?^5@?ěI@Jjd;ͷZt?@N@4tz?(@ +=?vJ@Jj;-°@_;dZ@9z?ȴ@@;`?OL@Jm?{;T`d@d7@:3@?33@?n?O@P@Jw|;w>?8YJ@8`?ȴ@@C?n@13@@J}$ =;ʮrKw?<64@8`?"@?ě@G@J~;w\@LcA \@9;`?Q??^5@>@J>;œq?_F@9\j?@??@V@J! ;Ο8? ?]ce@;KC?t?ě?$ @T@J;ǒa?L_@:T?Ͳ-?-?ǍOL3@@J;C|V?bM@:<?l@z?"ff`@J—;ȩދ;2@ԕ*1@9"M?ԋC??/ Qٙ@J;a@cA @8??x?r @4@J@l;w?>BZc @8&?֧@?5?@'33@@J@l;bU??'/V@93@?`@?`@@J@B;]D?sPH@68Q?/ ??`@J@Jft;NzVC?1@: ? @`?N33@@J~c;Ż~@ T*1@9? ?^5@?M3@@JT;pC?˒:)@8 ? @??C@33@@J>;ϭ $?g k@9n?`@?r @@JbV6;ɄS?dZ1@6 x?9X ?◍@?5?Qٙ@Ji' ;&E?nO;@7? Ġ@V ?$NY@J܏o;8%;@!-w@7`?9X ?V?(@4f`@JFJ;Ag\?u%F +@7`?bM?z?`@@Jh@!-w1@: ?z@?33@?SI33@ @JK;t?B@8_;`?~?b@?hrA3@ @JA";z?E@9"?+??+Tf` @JbT;ʡr?O M@9o?b@?Ƨ? Ġ@" @J;$h#?"`A@:?^5@?z@?`A @J@;{z@sMjO@93@? I@?ָQU @J]V;|J?JD@9?ܛ@h?xF @J0;˖Xu @ %@;V ?@ ?Ͼv@F @J~E=;ҝ%?ᰉ'@8`?`@@ ?+- @J> ;&|?3ߤ@9{`?G?-`?`@ @J;~mH@u"@9>v?`? ?Z@Bf` @J}c.;D`?kP{@8ܬ?@ ?A@@E @Jc;ȣ}?%F +L0@9?;d`?\ ?dZ @QY @JB;ˊ;W@K]@:;`?G@?;`@;3@ @J +N;u?]cA @:?Ƨ?? I@Q @J;ՙ;Ǜ @ }Vl!@9E?1&@ ? 0 @JW;̴h?C,@9(r@9X @ O?l@Nff` @J;ʿDN @JM@8j?`@t?tPS3@ @J";̙|=h@?$/@:?`?`A?v陙 @J";Ǻ@ߤ@@9/\ ?hr@?@033@ @J;R~Rw?64K@87K?Ԭ@?v?x@C @JLf +;h?ěS@9p?öE?t? J !@J!jf;CH?XbM@:`?ȴ@@ `?C@L "@J!ݠY;{?*0U@9e`@?E?ff`?٩5 #@J"h;l {?!R<6@6;?33@@?Q@M $@J#=;\ +V?ѷX@:3@?T@ȴ@?ļj@Qf` %@J#Y;̾@Bo?\>@9`?`?x?(@, &@J#w;62?As@9u??7@?@R '@J% Z;eD7?|?@9\)?Q@z?x@ (@J&Y.;/jQ?θQ@8|? ?b@?=pQFf` )@J'Ho;v?C\N@: ?X`?z?€3 *@J(ٺ;ʶ(Eg?@:`?M?x?S@@ +@J(;;KDs@@H@9@Ġ?ҏ\ ??֗@@.ff` 0@J24~;i?SMj@8 +@?;d`?睲 ? @SS3@ 1@J3"l;;Y}I?1&x@9o\ ?"? I?(@U 2@J7Cc,;#co?O;dZ@7^@?Õ??@M 3@J9}w; 7!?)@:? @?€?ff`B 4@J?-@p?˥`R 9@JP~;˶>?Xe+@9`?`@`?Q@? :@JTR;̕bV6@1[W>6@9(r?@?z@?S@I ;@JWV2;e.?JL@6?և+?z?p@B <@JY>_ ;o!?A [7@8?bM@ +M?\ @R` =@JZc;xʼ@ߊ @9/ ?KƠ?^@?Ƨ@Kff` >@Ja^; q2@ bM@9 ?ǍO?\)?J33@ ?@Jf@=;_?|@7C`?t?ӶE?睲 L @@Jh;@|ѻ@(\@9cT?\ ?$ ?`@@P&f` A@Jih;ˇH^=?ƃ%2@9?`@?\ ?@T, B@Js!_;;[@oi@:1h?j?`?U C@Jz,;Z_?m\@:?/@j?\)@;f` D@JV!u;˭^?($ xG@8(?@@ +v? @M@ E@J*b;ԝ{j@+a@:ϝ??l@?l@% F@Ja0n;tN?.H@8€?b@?X`?"Pٙ G@J>(;!.@8YJ@9 ?° @ + ? @P H@J;˰_A?+ I@:@? +@?t`?ǮB I@J$(5;ʳ-@ zG{@9!G?G? ?vT&f` \ No newline at end of file diff --git a/scopesim_templates/extragalactic/deep_field.py b/scopesim_templates/extragalactic/deep_field.py new file mode 100644 index 0000000..e2d1c89 --- /dev/null +++ b/scopesim_templates/extragalactic/deep_field.py @@ -0,0 +1,147 @@ +# -*- coding: utf-8 -*- +"""Hubble Ultra Deep Field analogue, built from a vendored HUDF catalogue.""" + +from pathlib import Path + +import numpy as np +from astropy import units as u +from astropy.coordinates import SkyCoord +from astropy.table import Table + +from ..rc import Source +from ..utils.general_utils import add_function_call_str +from .galaxies import galaxy + + +__all__ = ["hubble_ultra_deep_field"] + + +_DEFAULT_CATALOGUE = Path(__file__).parent / "data" / "hudf_catalogue.fits" + +HUDF_RA = 53.1625 # deg +HUDF_DEC = -27.7914 # deg + + +def _select_rows(tbl, ra_center, dec_center, fov, mag_limit, mag_col): + """Return a boolean mask for the square FOV + magnitude cut.""" + mask = np.ones(len(tbl), dtype=bool) + if mag_limit is not None: + mask &= np.asarray(tbl[mag_col]) <= float(mag_limit) + if fov is not None: + half = 0.5 * float(fov) * u.arcsec + ctr = SkyCoord(ra=ra_center * u.deg, dec=dec_center * u.deg) + rows = SkyCoord(ra=np.asarray(tbl["ra"]) * u.deg, + dec=np.asarray(tbl["dec"]) * u.deg) + dra, ddec = ctr.spherical_offsets_to(rows) + mask &= (np.abs(dra) <= half) & (np.abs(ddec) <= half) + return mask + + +@add_function_call_str +def hubble_ultra_deep_field(pixel_scale=0.06, + fov=None, + ra_center=HUDF_RA, + dec_center=HUDF_DEC, + mag_limit=None, + filter_name="HST/WFC3_IR.F160W", + sed_early="brown/NGC0584", + sed_late="brown/NGC4254", + n_cut=2.5, + catalogue_path=None): + """ + Source of an HUDF-analogue galaxy field. + + Loads a vendored catalogue of HUDF galaxies (Skelton+2014 photometry + cross-matched with van der Wel+2012 F160W structural fits), trims it + to a square FOV and magnitude limit, and assembles one + ``scopesim.Source`` by summing the per-galaxy Sersic profiles produced + by :func:`scopesim_templates.extragalactic.galaxy`. + + Each galaxy gets one of two user-supplied spextra SEDs based on a + Sersic-index cut (``n > n_cut`` is treated as early-type), redshifted + to the catalogue ``z`` and scaled to the catalogue ``m_F160W`` in + ``filter_name``. + + Parameters + ---------- + pixel_scale : float + Output pixel scale in arcsec/pixel. Default 0.06 (HST WFC3 NIR). + fov : float, optional + Side length of the square FOV in arcsec. ``None`` (default) uses + the full extent of the vendored catalogue (~4 arcmin diameter + around the HUDF centre). + ra_center, dec_center : float + FOV centre, degrees. Default is the HUDF pointing. + mag_limit : float, optional + Drop galaxies fainter than this F160W AB mag. ``None`` uses the + catalogue's own limit (28.0 mag for the default file). + filter_name : str + SVO filter ID used to scale the SEDs. Default ``"HST/WFC3_IR.F160W"`` + matches the GALFIT magnitude column in the vendored catalogue. + sed_early, sed_late : str + spextra SED names for ``n > n_cut`` and ``n <= n_cut`` galaxies. + Defaults are Brown+2014 archetypes: ``NGC0584`` (E0) and + ``NGC4254`` (Sc spiral). The kc96 library is *not* suitable + here because it only extends to ~1 um. + n_cut : float + Sersic-index threshold separating early- and late-type SED + assignment. + catalogue_path : str or Path, optional + Override the vendored FITS catalogue. The file must contain the + same columns: ``ra, dec, z, m_F160W, r_eff_arcsec, sersic_n, + axis_ratio, position_angle_deg``. + + Returns + ------- + scopesim.Source + + Examples + -------- + >>> from scopesim_templates.extragalactic import hubble_ultra_deep_field + >>> src = hubble_ultra_deep_field(fov=20.0, mag_limit=25.0) + """ + path = Path(catalogue_path) if catalogue_path is not None else _DEFAULT_CATALOGUE + tbl = Table.read(path) + + mask = _select_rows(tbl, ra_center, dec_center, fov, mag_limit, "m_F160W") + sel = tbl[mask] + if len(sel) == 0: + raise ValueError( + f"hubble_ultra_deep_field: zero galaxies after fov={fov} and " + f"mag_limit={mag_limit} cuts on {path}." + ) + + srcs = [] + for row in sel: + n = float(row["sersic_n"]) + sed = sed_early if n > n_cut else sed_late + q = float(row["axis_ratio"]) + srcs.append(galaxy( + sed=sed, + z=float(row["z"]), + amplitude=float(row["m_F160W"]) * u.ABmag, + filter_curve=filter_name, + pixel_scale=pixel_scale, + r_eff=float(row["r_eff_arcsec"]), + n=n, + ellip=1.0 - q, + theta=float(row["position_angle_deg"]), + ra=float(row["ra"]), + dec=float(row["dec"]), + )) + + src = sum(srcs[1:], start=srcs[0]) + src.meta.update({ + "object": "Hubble Ultra Deep Field analogue", + "ra_center": ra_center, + "dec_center": dec_center, + "fov": fov, + "mag_limit": mag_limit, + "filter_name": filter_name, + "sed_early": sed_early, + "sed_late": sed_late, + "n_cut": n_cut, + "n_galaxies": len(sel), + "catalogue": str(path), + }) + return src diff --git a/scopesim_templates/tests/test_extragalactic/data/toy_hudf.fits b/scopesim_templates/tests/test_extragalactic/data/toy_hudf.fits new file mode 100644 index 0000000000000000000000000000000000000000..4a039ed3048eccade23dad2062a83b2a3ec8cc80 GIT binary patch literal 8640 zcmeI0F>ljA6vqn_OC?6e+cGdTX-nFI8oQwma+ErOxFU41F7Y|Fl-SYPl^Ujs&j3UC z7<>TKm8um36B`pOAR(0xz}-DZNhAk__&^}t8yw&1{LBCS-{th2rg_k)83^s7l(5kn z>V$z8(td>E5LHaOiJ}+>E~akEdNx%y?S|Q!!`o&&Oer2B7snXI!vRUBOlGaUmf2*( zRDF5I3r_lNLQ&|A$$p;%ksk)p1TuAJv~0uLpTo1K7A|-zU<u{(lE}JJ~er)-KAGP0QXZ*Nog$R%@v32bc~~jN3he$Y~7C>C}?h+rQdBum67k zEc)?6djDMH{e6!F-T0XI6D3DyJ8x({bstpof#f%8P6v@cRtm&pEV3okDQ;pl1=Zw z$rmqpXIJV^4uDrp9?8bz`b2$m6az3DkLv>-dy5m1jdy67Ht<~1mB8cqZt(q=b4f=6 zkLL?KdHIg@$;x+AQNN= zQiph+gJ~xsouz9c&I91d%NKZ{3}vhbukV(~H)3bF-*JMabLIP2Kqf`hX`--;U5X2qT|~3mhDDd&FVK;SxH9KH$mG$A2HdlX5<*|Lc-d`XBjN zVWC%FUb474e{eC%zg_*Ned4ohz6hV%#}SX$`t4-=*%P6cV9c&J^y;gX(uMYdF-mt= z-+a-oH$>?7&%`3_9Wb=-@XYu-&NpGqt~Z&E(b4;(JB;z87#v?~9}>pa>@)hUWc-!O hzP!>OpTUH>DhHGU$^qqoazHtt98eA@2mY`FKLO)jib?= 1 + + def test_galaxy_count_matches_catalogue(self): + src = _call() + tbl = Table.read(TOY_CATALOGUE) + assert len(src.fields) == len(tbl) + + def test_positions_within_fov(self): + """A 6-arcsec FOV around the catalogue centre should drop the two + offset (±5") galaxies but keep the central one.""" + src = _call(fov=6.0) + assert src.meta["n_galaxies"] == 1 + + def test_early_late_split_by_n_cut(self): + """Toy catalogue has 2 rows with n>2.5 and 1 row with n<=2.5.""" + src = _call(n_cut=2.5) + assert src.meta["n_galaxies"] == 3 + # Each per-galaxy sub-source carries one spectrum; the SED string + # is recorded on the Source's stamped meta from add_function_call_str. + # Easier check: count via the source catalogue. + tbl = Table.read(TOY_CATALOGUE) + n_early = int((np.asarray(tbl["sersic_n"]) > 2.5).sum()) + n_late = len(tbl) - n_early + assert n_early == 2 and n_late == 1 + + def test_amplitude_passes_through(self): + """The brightest catalogue row (22.0 mag) should drive the + brightest spectrum scaling.""" + src = _call() + tbl = Table.read(TOY_CATALOGUE) + i_bright = int(np.argmin(np.asarray(tbl["m_F160W"]))) + # spextra spectra carry their amplitude implicitly; verify the + # spectrum exists and is callable on a wavelength grid. + sp = src.spectra[i_bright] + wave = np.linspace(1.4e4, 1.7e4, 50) # H-band, Angstrom + assert np.all(np.isfinite(sp(wave))) + + def test_mag_limit_drops_faint_galaxies(self): + """Toy row 1 has m=26.5; cutting at 24.0 should drop it.""" + src = _call(mag_limit=24.0) + assert src.meta["n_galaxies"] == 2 + + def test_custom_catalogue_path(self): + """Pointing at the toy file should give exactly 3 galaxies.""" + src = hubble_ultra_deep_field(catalogue_path=str(TOY_CATALOGUE)) + assert src.meta["n_galaxies"] == 3 + assert src.meta["catalogue"] == str(TOY_CATALOGUE) diff --git a/scopesim_templates/tests/visual_inspection/hubble_ultra_deep_field.png b/scopesim_templates/tests/visual_inspection/hubble_ultra_deep_field.png new file mode 100644 index 0000000000000000000000000000000000000000..fc88dc1ed40124ab90d59d8d5ab54476cefd417d GIT binary patch literal 45808 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 cx1 or cy0 >= cy1: + return + + sx0 = cx0 - x0 + sy0 = cy0 - y0 + sx1 = sx0 + (cx1 - cx0) + sy1 = sy0 + (cy1 - cy0) + canvas[cy0:cy1, cx0:cx1] += data[sy0:sy1, sx0:sx1] + + +def main(): + print(f"Building HUDF Source (fov={FOV_ARCSEC}\", mag_limit={MAG_LIMIT})...") + src = hubble_ultra_deep_field( + pixel_scale=PIXEL_SCALE, + fov=FOV_ARCSEC, + mag_limit=MAG_LIMIT, + ) + n_gal = src.meta["n_galaxies"] + print(f" {n_gal} galaxies") + + npix = int(round(FOV_ARCSEC / PIXEL_SCALE)) + canvas = np.zeros((npix, npix), dtype=float) + + # Canvas WCS centred on the catalogue centre. + canvas_wcs = WCS(naxis=2) + canvas_wcs.wcs.crpix = [(npix + 1) / 2, (npix + 1) / 2] + canvas_wcs.wcs.cdelt = [-PIXEL_SCALE / 3600.0, PIXEL_SCALE / 3600.0] + canvas_wcs.wcs.crval = [src.meta["ra_center"], src.meta["dec_center"]] + canvas_wcs.wcs.ctype = ["RA---TAN", "DEC--TAN"] + canvas_wcs.wcs.cunit = ["deg", "deg"] + + # Pull the same row order back from the catalogue to recover each + # galaxy's apparent F160W magnitude (Source.fields holds the + # normalised stamps; the magnitudes live on the catalogue, not on + # the field headers). + tbl = Table.read(_DEFAULT_CATALOGUE) + half = FOV_ARCSEC / 2 / 3600.0 + cra, cdec = src.meta["ra_center"], src.meta["dec_center"] + cdec_rad = np.deg2rad(cdec) + sel = ( + (np.abs((np.asarray(tbl["ra"]) - cra) * np.cos(cdec_rad)) <= half) + & (np.abs(np.asarray(tbl["dec"]) - cdec) <= half) + & (np.asarray(tbl["m_F160W"]) <= MAG_LIMIT) + ) + mags = np.asarray(tbl["m_F160W"])[sel] + if len(mags) != n_gal: + raise RuntimeError( + f"catalogue selection ({len(mags)}) != Source.n_galaxies ({n_gal})") + fluxes = 10.0 ** (-0.4 * mags) + + for i, (field, flux) in enumerate(zip(src.fields, fluxes)): + _paint_field(field, canvas, canvas_wcs, flux) + if (i + 1) % 200 == 0: + print(f" painted {i + 1}/{n_gal}") + + floor = max(canvas[canvas > 0].min() * 1e-2, 1e-12) if (canvas > 0).any() else 1e-12 + fig, ax = plt.subplots(figsize=(8, 8), dpi=120) + ax.imshow( + np.clip(canvas, floor, None), + origin="lower", + norm=LogNorm(vmin=floor, vmax=canvas.max() or 1.0), + cmap="afmhot", + extent=[-FOV_ARCSEC / 2, FOV_ARCSEC / 2, + -FOV_ARCSEC / 2, FOV_ARCSEC / 2], + ) + ax.set_xlabel(r"$\Delta$RA [arcsec]") + ax.set_ylabel(r"$\Delta$Dec [arcsec]") + ax.set_title( + f"HUDF analogue: {n_gal} galaxies, m_F160W < {MAG_LIMIT}\n" + f"pixel scale = {PIXEL_SCALE}\"/pix, FOV = {FOV_ARCSEC}\"" + ) + fig.tight_layout() + fig.savefig(OUT_PATH) + print(f"Saved {OUT_PATH}") + + +if __name__ == "__main__": + main()