From 678736435e23f75a21c84819bbe5f7947b29b66e Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Sun, 13 Sep 2026 09:00:37 +0000 Subject: [PATCH 1/4] Add standalone create_probs_histogram() prediction distribution adapter and vendor rtichoke_viz v0.22.0 - Vendor rtichoke_viz v0.22.0 release asset (SHA-256 64087fe0284ab2beb6e664dd419504a56000e217eaf403f33559896b67fff94d). - Implement _prediction_distribution_v2_spec_from_performance_data in _viz_spec_v2.py to construct canonical v0.22.0 PredictionDistributionSpec objects. - Implement standalone public create_probs_histogram() function in probs_distribution.py and export in rtichoke package namespace. - Update RtichokeBrowserChart to support single-file self-contained HTML rendering for prediction distribution charts. - Add deterministic unit tests and Playwright real-browser acceptance tests. Co-authored-by: uriahf <11351434+uriahf@users.noreply.github.com> --- .github/workflows/python-package.yml | 3 +- src/rtichoke/__init__.py | 5 + src/rtichoke/_renderers.py | 74 +- src/rtichoke/_report_browser.py | 18 +- .../_vendor/rtichoke_viz/VENDORED_FROM | 8 +- .../rtichoke_viz/rtichoke-viz-0.20.2.tar.gz | Bin 169338 -> 0 bytes .../rtichoke_viz/rtichoke-viz-0.22.0.tar.gz | Bin 0 -> 179268 bytes .../rtichoke-viz-report.schema.json | 925 +++++++++++++++++- .../_vendor/rtichoke_viz/rtichoke-viz.css | 335 +++++++ .../_vendor/rtichoke_viz/rtichoke-viz.js | 36 +- src/rtichoke/_viz_spec_v2.py | 197 +++- src/rtichoke/probs_distribution.py | 104 ++ tests/test_probs_histogram.py | 355 +++++++ ...test_probs_histogram_browser_acceptance.py | 156 +++ tests/test_public_exports.py | 1 + tests/test_rtichoke_viz_vendor.py | 21 +- 16 files changed, 2163 insertions(+), 75 deletions(-) delete mode 100644 src/rtichoke/_vendor/rtichoke_viz/rtichoke-viz-0.20.2.tar.gz create mode 100644 src/rtichoke/_vendor/rtichoke_viz/rtichoke-viz-0.22.0.tar.gz create mode 100644 src/rtichoke/probs_distribution.py create mode 100644 tests/test_probs_histogram.py create mode 100644 tests/test_probs_histogram_browser_acceptance.py diff --git a/.github/workflows/python-package.yml b/.github/workflows/python-package.yml index eea114ee..6febaf96 100644 --- a/.github/workflows/python-package.yml +++ b/.github/workflows/python-package.yml @@ -52,7 +52,7 @@ jobs: prefix = "rtichoke/_vendor/rtichoke_viz/" required = { f"{prefix}VENDORED_FROM", - f"{prefix}rtichoke-viz-0.20.2.tar.gz", + f"{prefix}rtichoke-viz-0.22.0.tar.gz", f"{prefix}rtichoke-viz.js", f"{prefix}rtichoke-viz.css", f"{prefix}rtichoke-viz.schema.json", @@ -60,6 +60,7 @@ jobs: f"{prefix}rtichoke-viz-report.schema.json", } assert required <= names + assert f"{prefix}rtichoke-viz-0.20.2.tar.gz" not in names assert f"{prefix}rtichoke-viz-0.20.1.tar.gz" not in names assert f"{prefix}rtichoke-viz-0.20.0.tar.gz" not in names assert f"{prefix}rtichoke-viz-0.19.0.tar.gz" not in names diff --git a/src/rtichoke/__init__.py b/src/rtichoke/__init__.py index 896d7eb1..ff79f37f 100644 --- a/src/rtichoke/__init__.py +++ b/src/rtichoke/__init__.py @@ -57,12 +57,17 @@ render_performance_table as render_performance_table, ) +from rtichoke.probs_distribution import ( + create_probs_histogram as create_probs_histogram, +) + from rtichoke.summary_report.summary_report import ( create_summary_report as create_summary_report, create_summary_report_times as create_summary_report_times, ) __all__ = [ + "create_probs_histogram", "create_roc_curve", "create_roc_curve_times", "plot_roc_curve", diff --git a/src/rtichoke/_renderers.py b/src/rtichoke/_renderers.py index fae719e0..2d10c95f 100644 --- a/src/rtichoke/_renderers.py +++ b/src/rtichoke/_renderers.py @@ -8,6 +8,8 @@ from pathlib import Path from typing import Any, Literal +from rtichoke._report_browser import _resolve_render_report_symbol, _sanitize_nan_values + Renderer = Literal["plotly", "matplotlib", "browser", "rtichoke_viz"] _SUPPORTED_RENDERERS = ("plotly", "matplotlib", "browser", "rtichoke_viz") @@ -46,31 +48,69 @@ def write_html(self, path: str | Path) -> Path: output = Path(path) output.parent.mkdir(parents=True, exist_ok=True) vendor = files("rtichoke").joinpath("_vendor", "rtichoke_viz") - for asset in ("rtichoke-viz.js", "rtichoke-viz.css"): - (output.parent / asset).write_bytes(vendor.joinpath(asset).read_bytes()) - render_export = { - "roc": "renderRocV2", - "calibration": "renderCalibrationV2", - "precision_recall": "renderPrecisionRecallV2", - "gains": "renderGainsV2", - "lift": "renderLiftV2", - "decision_curve": "renderDecisionCurveV2", - "interventions_avoided": "renderInterventionsAvoidedV2", - }.get(str(self.spec.get("type"))) - if render_export is None: - raise ValueError( - f"rtichoke_viz does not support chart type {self.spec.get('type')!r}." + chart_type = str(self.spec.get("type")) + if chart_type == "prediction_distribution": + viz_js = vendor.joinpath("rtichoke-viz.js").read_text(encoding="utf-8") + viz_css = vendor.joinpath("rtichoke-viz.css").read_text(encoding="utf-8") + render_fn = _resolve_render_report_symbol( + viz_js, "renderPredictionDistribution" + ) + sanitized_spec = _sanitize_nan_values(self.spec) + spec_json = json.dumps(sanitized_spec, separators=(",", ":")).replace( + "", "<\\/" ) - spec_json = json.dumps(self.spec, separators=(",", ":")).replace("", "<\\/") - html = f""" + html = f""" + +
+ + + +h;CUs9T~B@aITm9!vkqCTguat2W_m*EE{G?qHI5 z8tIasD^>e-GkLuC7QeKi#XRrC^pkKWFBfEhg=YlsDVk>XEubDVw52J`JX_YwL~I&7f2JJEhMwve zpLA~gKGdw~!*;T-{>6*G$HJ2L`kX*V7z-|HqyJ?NNCjnM#B}(jOaT2jj8YlV{m@`Y zwj^MQSj&9m$xCC7CQ9KV4L&ccKbUzbd+v>wyjpb|5vqq1@Aar?MHNIe?NRNfpC6n5 zg-1E|%|lDtQmlVX_4Y?IfeyFsUodtp{P{V3v8J&}jbZ;tu9YGWF6-!(pE{3y1FYbQ ziP5cJ3_lVaE0~!$h*ap6?x~h`7R_5b>rC|C{ zZ5vhUjx>8YNbqFpKp% #kT%|L5F?d()ZLu4kT%kR_Ugf 6|{^otQtt-lc{5vfi^|E&C60hsTHVpYBD=p-9Oxoe`6-w@U6zi6zlM z8Syhu+=gzfoZeIfmH*R-Mrylz<^C!G98d#Ia=`0k$c1hg#%NDtAJXqMWyqg-dxlSd zU*PRWx&oB!_dcz_>svrCqCh#lAmM_Wv vQ0aSQZ~QVyJ3nqbr2xi2vIn(W60>#rCZgfKR5eO*|FGuI zZ9my4{`#87AN$MU5-v&lUEN4-_R(9)^30cLx-9*Re81t26C-tu&%As>tZxdEHY92M z*c}j7SR($fWYxEYQiH&n4Ei??ubfb$RD&qs>RzAJtf3WMm8_$Neo(7K4ppfaz`}o~ z7B45$qBzCyu!4Y|@u?N1u>lkMxg9}UT1 fY^)Vmd41I=%Esw5q4%C!hr!&EXlN`Lh8zt#av)!}{5{eM`;YI-Z45I^4)ALn3# z7Vwm_)xU=6-hA=y^^;?-1ARKaQjv~-m*+Y^p`f=DU+z!g(O%Bws5WiL=Tl|pUgxPT z0E>SJ@*G(p$oDG#7UZc-{|NH=B0NPWoxlM|722? =fM1OO*SL*w2eYwL zk|tF0t=|`m8l6Rtmyzsh*ky*dHikKZ83L;eY-{xO|A}{J(tpPL3L#!sSDm(k!l2<# z&aapceWuM^rPcHLiK&5Yo)l|@pS{(K!)BZ7z881)$Ymd_{e<%}8sI3V`ZkSxnXF6a zz`t_ddaiK6MDgroU5|TWRfFp9QSO`M0Yo_)ck*HzX6)7K|79-2mp> Ai!6TL2_N3$=@hWSl%&pcjFx=g&oH(vDpBDA;s6a69F?Rlt|FCGK5W?qo`R+5c{ zUSX;ZI$^ 7T2N@o&7J7+W zU41{TPAO@|&AgD)>=o@Z`bPfI-GgoZ33e OT2YKS<550o`Zvm5l@$8P zmA3Ge7L@DIaj2L+QwoYYz81`;7}u+vb%S_Lmp=M_yPg@kMVNVV9PRtL=io_b5b9y+ zvOp!QBUrP+H z3r >2w#Hhq~KU6+T&Kq2M#k6oD6A8iO7prumkQq|LofxB!5udt)pQSb(v ziB)K8M6jYA>GC#|jU+rQ{LA d`^7Y( z39jW)wvqvB?9=o&y7kcgea^d#l4D;-afG1s&;fXJ8Ra1E6DmPf-==E#%N%bd-)Nj% z;KG;3V(o-xIQRZp4WI)Xb)c_(1d?^7C0q%-0sY7P!KG%)IcUghc#1u;ia@aUqgZX} zn}ysfF%<-VYD&4p;}8B@0s^@plSQ5~MWzPK{{YIADJeEU^gf`1@RzRG-Jciovx7G| zSDrdYyvr^_^FUFnPz9+~&@;|P3?~Bt9gR_EMT-;115!h>lTrDGWDFrCF9-&D|4c<+ zGX6$UvtuSN2ok}nct>4ws38Rm(f|e_Vel8GegjGgksyHRu0YY?FUOKI8^Ag>9|3-k zX-N_a&hR==T4gAJ8vBWPg6y9|nm`WEHBQ!GLdu;S8K&qR5kz~jBJ5F3HG)!z>E{QE zvxt;fH@2pe{6?W`YSwlKo&86_PE)Sbp6yTU{2qU|yd>V7s-yz5-k2u|@y$pGsB>;$ z*QkfVZEv+!GLy`e%uc=_O`J>9v<6C^>nv)I5xQUgh|248Vf?LKB;Rnp^kWtCQT81# zH2-8icf3TyPggU!b$DW~g*nx5jCWunt eA2=k#V|m)$o?YJ%ewP ++m8g+?#Q237@^L$mC$s$trNC^wfw(tzk z*d0*HgJd_$Ve>~(k-gIM$_9SdlB>`RVoy#C>LDJy9>Xe+3Wy+?#zAD=WKN72Iu7&$ zKO`v{_y1JkfT+k!tnCm8;X*h9RN E-rd`5oIq_~Is^mHOf2?`>an5|I z^@P}8)RyjGmVThNN&bJR&4XPgb!#J)Bj_iv+Q_=rQ1>5duUr=Y!= %XY280~fTf0NoV^$*lO z(s-b@Kp&Ci1GNbs_xQ@h_YqO}T5$BE1f*DpBHyxPgxr@d$j?iC8+`M3X7d2dCb9&W zJ;(|$o9BVq 2;Y^8a_twh`?q;h8z7-W@q+ zYs*dYA^RWUtb+-LA6U^Wn;u-1lg1cBC0o0YP9F*cpcWN0$E>l*o0M9; hqI#5Y Y*8{YkD1M#`^i+%~&wB z97mpvTw0H0+vU)!aW32{-AMQEyuolx^9OQjXkgaT1R9Z0(LI`9H?L*4UCF9np*7WY z^luYv8gaT>mm41kvl~u7l+d`pwEr;Z@L1Bls5MfPS8%S*h1ewN;CQ;A?P_PK(MgQB zL}{A8^v?7$(qX0*s yAqd@ z%+;vvrU1A}#)C&iOW0XBeRe7Jar1+=aWXx!Exp=TJ~tjxld3L+4eEmb;I2g|WmCcp zK2~T(my&-N#U|R5cS|dGtKM~LU0l+Kwqohl=_0UGmd`7S0t(+4*Xx22K?kLQu{K+t zHoi2=2LUBsTJ7=}0_ ={mnjjDp$6$&FkgdUclHZK8zdCXp#MXiYdN;sZPD3 z*}d8NbmWQ&^U||P)UkGU>HL~NG+cv=h8xowzjb|~w&h*wdO&)WQKw f&Ki z38^Wg*DW1<1|z2B4}ruMgF%qO$)yN1t~bTtgPYwg1$<~ku^ZPQM$r3H(5PVlsNy>* zW-~(Z26G|0+h*o)l#h3Nw^WDzGVr|A--FejW+*J_hG(G|iNcz{T?g6v(G!K;!Wh(@ zffuLsPIR$`6tx@g2?qBozbm2BisGq|u&i#TbY$*VF!zks;sMWE-dxzK)|lgGTrb_j zq<{7r^lX0e@(Y^a`pL}+2kDkThVF#E>Z_ib!*ct87K4j;WEA$~p4v6f*S4)=yrw&u zsSScb?NL{;KB<|`(AqC2j)3T&w*#r#Z$?BMLi>KnaI4af1th9(BtK!AlvDeZwqF0r zerwD~bXb(dZOTw*qKBn)&!-&Ohh;JF% #n#%+@n&Z3N50l; zC%qNhX~a;48E6pt q0MjAs{1^7v_eOM>BuiY;U$x7 z{CNi598M>_A1_rW-+L&wV6p8L(Lc&A`IYtKv65&-U6kTXDvB2;FD=DezRBCK7M`sR z)&**r(8A3Fq5?hTB3I(uOpx8Iw?o@9EwBa!SdiT~BRmXaDmxb5B>ebYMEMg^EoyLZ zA}8LgAF^WoM~w%HUSQsB{O+vf{sRt(iI88 IPiiV3&5^+~L!M7~l9`L8OCC0S?a zUGqt2^-OV-`@HV^sX$Qq+l^nS+QvfHSaqV#-*NPoT+`n5Rh|h-g_gZ4eup&Iv6Pgy zJQWlslhFDLt4q}Rnh4@$5<8-FQ6|+7Pu#di)i_I7h$zrCnK(jvX5!D3Wyj{l9;mMQ z8r31c3+kfe z{F2ylzMS$9Hn7$(^s+AP&&0{)X z$p;lLInegMNj7_D{kJ;Pl<6Zh{$Mm$pvHp*7)YSZboc_qGJCgVLP^d&l?p5$0lDYl z3$M%?KVc KYjw^&zWOFpAGc0PM`sz{&%h<6mWQW_}vwM*hO_X9IfA3zQ?1 zm)V3XoiQSsbhyyyst+z;c@?muB6mi+CB>mOVuP#cHL8He=|%$V?om=LHf4J%louQ` zbV2cN!#Zz#eZK#_`|M?8L8^iJ5A)wJlVFFGRi*=v37kGjL69uitW&$rJ9{#Z<|a1M zS+c7$OgM#4zzwt@Hgd>(JQd^i#lTX_*<45>Pm~4wAN&|3(-E-Js>?PE+|-H;dEm#{ znZs@tSYG6TA86VV6@T%=>wzDy+aLJB<%YHVZ+;;0JoU|Q{zK;S#ZW=a(DVt-)tuDN zuZVGh6$`MC^d;>~Bg*FtV@kbR?1NqFdnm!c!vaiU0hx)^Z5vonhP H!@g-;;9< BaH_ znHJFu>}Heo{Oc}=LIT_E(wfuM4)?aOd~MiZQziz*f#JyM(;lei)hnJeE&g9+eD8nN zah0=Ff1VWZuh(D8R+=%DT}1g@=4Q}6lrlWO_^#F<<*Ux}?VFC{pOEcrdB8kYo<<}j z|M*l9uxzqXc|gMGNnU6qX@WOS>)b44_R^HO`G!Zo{iGFri%H;y6Fz0D#CflLatVXJ zdq?<^hROe4sVN|B@l#d_={v^ej?>x8=g>HsRDY@_LfF}SV8+WZv{cDgs(p-lRwG`X z)bFahbo&m18}6fS$~C~{R>p4Z-J5*`2RfafLiyCSrSjaA>wulS?fA6Z?RYH}ec?UU zMLgTQs@r}tQ Bdr_4M@S zy}dutN-o9ps5n- P?UlhGc e z88-n#t&+fvve=UC&eTlLr_YDKr%LU^i?pd&G~bqE*JJs}(DFz6eY(?=r7X6vW41S( zjzJ?m9NWCA?i0;&|Eb(pK|@;lINBh=W0KF3h)M|PRr7eA*y5};GCeZgqxpWnSV5@A z+QY+2t!nPDS=Gpe `G(^*QiLtjgw#+!is zmwIW`e8M6EPdqGMu6ynqco%*3F|F;+xX>YKe*dY11Bc}4) fVYKN5S~P=*!92 z9TDdro;9Z`N5g1FV1$OiQh5=g(O-*SMxIlax l&eu2e$bJvDL7mu_9mm{ zd3YBK=~dj}lvlTVcsyBEw>C+o>8o=L(w-A9JqO2As*}Ua8|)dX!e20^$ErEr72Ned zMm+<_UVJ4x9B91jqf~m)XZ<8pvwZrH*{1XDp6saueobC$gL&2|ovgj`n2DZ7M?qbY zS%r2e#~EAw%c3#9_wFt+787xWl+DWKGul7T3ispTPp{Zf${gz}%_ a(KGa-MO%ZSwl*~cr!=ToXwTI$#krdsLg_k9O zY$<*gJG>m=uzXqf0cUaPnGo-M^*gG#8|p)O@Aa xEyJzjgtM&VhT2}&*4x;tP{Vn8qq~QzLk)%rjHcA{;Y#TgSbG==ornf)5 z;|+$o+*{j}Qm$pp59oI?TCv;N*{HRNah1usl=`EUw&1>Fx#>{zZg!}PJ{7Y1tisBy z($&VbMS{=*Wz6R-p~Uz*m@6`qNOy7AvZkzkO@&)}0u;XQWGpjNQFx~tE#1y<-Fvt6 zy|k!&r@+o$7;%H^nCT@~Js7`*2z{f;$P|-3DBzhFlGsmAoL16{0k!hOaV@UCu%DUO z!0aSTWUF=1Y^XJ8@#6VRDDlg}a;N?LLk9@OQZ(71d@(OJ~oGBo9gWgvS0X67Tu#; zOR`>2RsI24OR5!2n(`(VC=e5|UhpNOT1#>a7@UXl_8O4T&U2|cvd*Jh2a#YFOlE~5 zjR$BP9x)}`=&I6AWlrOc2lP<8N@iP2XZNa~;;~+=B>zUX4sr(lD7OIpP!JWWlL`=d z{)6Sw26BK_5r+?lQ2zE{;~id~PzD64M+qJDO|4JpfT`3~S<}4Rl^_S1CgeHCi#~e9 zifi1dgo-=yo{_d_uayb>^ry&$uuGYaH4lP^(E3!Sz8jVA1N&&mUP{|zi+lG3DUX{d z#HKXKQ`(Q89-0rhH}~0HqR>z)Hf4%|{xUuFWhjAAJX3Sw%L^txS=LACjOKe9b2ZY5 zKQnh4E59$oRO6yI?sjoYB9b!qvMVn}zGKG>cYxSA#)LDS*I=Bv4z;ZvxbA1LG&W7R z4TWHJk!Ha2*YSXWI;fLVtTwR^drX*;w_K%A!{ij=fi5+Kt2M<^=^J{=mhN^zZLp9= z+wS>KmFo_*8R)mAt)9)^CgND*6boF^A^1nL9f+KEknR8vlWx#jk?>k4UBDbuF~Zv; z0;Pa5nhR7wn9K$1Y}kjIdg~{=9%qBQe`Zw2o}Uoi&sq|Bn>T+OCiYxfS> +OlKAQYdpg^=gSwv-76u}~`Bx<4{GQGxeVnwW6Wvpu(YRJ)g>M*q%v`DUGnX-Z) zw0J@jpVo`RA&=Nrpg%Nm51l_^l4Z*KnAK;mBpf8okSacF8SY>H%-0JSPn}XWLMt$^ z_~q*X 9=0+MKavh)Po!O57yCb`d&{V}wq{)zcL=UQg1b8en&8s7JHg!v z8l2$n7J|FGySr;3xCafI _eV2WtGj1)_pJ5QQ#EToi?F~H z_05g78bcEujS;<|fy$1gv^}bkcGOueNm~PZL|=^n2jgvELSu6f1fn=~sazCXitbPx z*tk#g?Y_(&wgS(ew871O`HR-bOWL4jLabACS{lI0Oo2}H?yAaf7sxoJgkrtP9+I$P zz0=dBu3ieg_asl+$L%*_+M}~}IHFaarG*PTqOlqY r3zltR6^)M4H* z3Mc70Q0kQQwS$FNn*PTjnNjbVuE;YvsjOg%_^}Bws#l4M5k;z=OJS3(LE=`aewx~- zyT$10V$rD*LaaAQqJr^J )eplXjEcQ`O)Yc(7F@Yfg%-2 zcC4u>TyH)l#XKh9(byurQ`v9{66q+%SVnaq=Uf0mTUebeCz|`Uec4}xDng@uWc5pG zpSfbFHBcp;*GAd2UJf~4^IrWmyfAlaafa@Cj$BUn$PjgHWztr}mAOM?d{d^c-jKh_ zuBMxt gS6u@MNZ$^0Q&L;&maFV^?5c2fcCUugmB$AI;T zxc_3kMB^XU(;orrB^rLfc+>NM^?AVh{EPKt!1{3krp0lc|9s)6==b1&-p}xfUoM0Z zy^yefw@jzcv;QP3#V95WD3Pc>-i5Rawhekm_mG|+NGP?JGQz}lwrAG(HKbUwc&(W+ zm*XWXX;s%wLPa>_c*#l_2!<=DixncPo%~+wITJ@Auw8PW{+B)Gr5G!SyPj^PYGM;% zPbNZFgwwDxd#XPIsDescf>reb$xBDRt^swfUD*-YV-qT;co=PGVO5~c3)Af^N$-{O z6$r-%VuN0&(0mJILeqFe^*(c=9H#}xW=kYYP#@Tpn9hv%-&9X7R4}al`qTX%BvO2F zCG%51Q1Q*V$1Ro#lUF%;0!Fkq>hejZnpzFbdKBC_SLTYN&09EQNrFN8r&xoI=_E?J z4^)x^ISkUPsX15aHu#7Tp6nk+lsOaxDHJijvt%);WDGgh-D*N_?0;RCu5kKVYQ8)w zs^Y^r@1auAW?=11cKi2&l{m*DcTF0VQpo*PFkM@*Lp2rT B`>aLz1fGh zE;LH6YABsc#V#AwhY~b%=YhJG0&n`IHp{M7j+%zXqHk#ei?vAFbXN@)M;fb8dU@rZ zv7512$baG9&{|=unA=P3O_Rgu@DcN)(ePqD>SLo^gH*OUogcCW7?q;f@|AWB6YUxX z*Ug=Ic3bKR#D%WTLr6*Ogt^|2?1og2C9~>cqw?WFM`*%#`w3 4aD+XcDcvRw!Y&%N2yU z#h5czFI(9x@r9QhSNJj0%DV$vvrnkYs+}tloeP}8i!vJ7NOauWcup@yh1t*)akQ+x z(7GGRF+x$_JZONf7}Q`XNdZiI9z~QA0)r_Z{%T<>nv_+@hn4Sio#p3cnS*hb)s6N~ zu%|O5+HZo>B}+Ea$VgBklZ37A9%-Uyb>L@6^V^0Rs7SO!9Dt?SRPOfsDnp&ql%ZhX zGxC9t(c!8B0yWcn$^ZR^OJENS&8CxL&qxy*ufvrd5~Sux2IDLFPBo*2vt1o?vU }UZ3G;PMb3ru-x&jX6u)+k&v+dyqmvegW -6TKfHk05I&U5n}Y1FGrylYG}$kl%U^1g^#Lf}bt^HKNlv z`zgpi5&jkDZ8*>qD+PzIsLKpFPyqu^Ye)A7QJ_76ALOf@PzNm7hYvWz0D=a;wK%2% zprHYP2n`rm&f5Y+&Rb>Ru>!K16P2u?7Wp;>J*s&BIp{5H_-|bcuvOYe^aTV})E-p| zP1h@kre5xMUlP5+vm&VZS7W=$=|7w}bnHdvSD+U1InQb^@UIGXr(9~yc}7qb>?2eF zbs~Q}R6rR<^#K-K%S;Lp6e$q&t61B%4oVM@A)|gAtC250=IiYR1Y&T}@36l(Rl*y; z2*k8^D%IunEc?07UFJ{Q$bnB^qjmIeom%viL{QBity|Q9HqEHBI!(pI>df;dyloyR zrciE75TZ0^_FGD-EJ|!gxr|C-n7N78>d}-KOYl!TM+R@YeN3Ss&yky} qy#;(M0v*3&Q4he%^L%HyUyN*RNXOesRTa@u#+EOEp^w z&z5v;%j=rLi;ZdIy&4~j>$s?JzCHk_D ^!o9NM)YJS{oyK+D*EVQ0^FKHhXTPNt zrAN+C2)Gp)Q9oB!*@qarj$~RycbnO!Mcz< H(MNxrO>PDUg?Ui zz7Oa602=I(N>MfJxJhFMyOo8&mWtK?X`4NUFVb#T6eq`0E0hS7tsL4?@c92zDVBO* z|7>CHLVTqxmkkM~|1x^KFDzx3vKr{he;0bBD${RwZeA?@JJ8+_w8VHGx2x|mL+6q< z949 t~chJ8{ micPp0gR4Rc77 4+DAanwYE }2F-NnFa&h?7*$Sl(iX%3Q!p%{1(zYno(gMvZK9|t$DjEVa0b>Q#~%*0UJMw* z4GQ%pJjV~Nl@oY7y=^(1wtcpBYYEyM^+_$yJiPW>k|GK~JSwFemGgE?+&`xV4ih1k z2)i2!-0@;vNF-VdupR|iFVqLDzaIH_>*=2Vv|hsU2{zpmuwDWW?hpfpaDxK>1gsZ! zasqFs_b(J8lCt$Yq+O(>ef9tmApK6LE&^SCMy`-%ntPQ?=wJFK)e5Feo@7gXS%Nk( zzDk qsqd(dMR~cDx1Zs-21L`SR-IG}1X-ccP{(f(qCZalw{Ph>u3g^v4Qdax&7jFqB_} z60W5p$vG^d7685#uE{QBRlR+YO3T$=9m*6l%qq*!&V75LYnrDN&pQ7`E7VK(C%)F0 zMA@)q5QRSU4}N%cwNu21Jby1#_z$lQV|tdALTW~Zb~Tt>sHBhQE?>9C7Dk29R*eK6 zorTGocg;&d`0fiDh;Z1SYpV0vFF;%Gy(tkwI&LqT6|ZXG^LhNMt-dN3&N^ecFy2DQ z`=K|HNtJgX-eUi1EE(JS!czS;@>{|>Kz9mWnNZWe!acx%yYyN0Q(e>c%9^r}>xo{O z!N$sx_L|D~aboK v{1Adm>YehXHd|ULj^<3< z8x2}CR+`kcj_ZCQu@Ctx(ILE0;gqj#maC _ZKt=PRDe&mw$tD zR9PRhTn`0cUfoVb9zcxF!sNchz&Pd>!ZM?`|AY#{ f+8202};;^cX5e;b3kEUN-nAq3o(-&C^I|@`0i&TcRa` zQr(Gu{FjB6h0s$Nr?&zN^tt=}KJ26(sE1GmPV` ?yw@+;j5CnUxc!~YRMd=-jbof( zXdWzcs{}`B0CZv((J`frl*D>PALk*$Vc5D`{~)zA{B4>OVe^uM?vT+fek8Fee%Yz$ z$0HGq_lOV;&95_`}JVnd&QBf1If>i_L! zy{E>EyzQ3ixi_}LlISMN)(V5GLU|jvGM!LDan2ABK^1SLu%b rAJ5oU7O+T_W=KkN7PEg+Urr3bfSf8y*eag9v}_^+U-nHQ}i>o zF~K{ypWaJ1IAu6t7WQ6qHMkYLj&vDW&}==f(cxlLq{>|&0Tys)t0yaVxE(0jwfw{E z-`>4ZHwx9k`u9T2x2&5N_E0*k{bVJ;jTQ#7K^W {sCwq9|4;u2ID@!Z#k-PD* zqqIqjx32o0 4LtJsUPIP z9;V{DjDz2HaxWCiywyLl7Gzfd6y5=#(60D5D6q@}pn%)}fWo`KK|#Ox1r&m{|CO~A zP5m=#InnqZ$y&DF|38tn{11SFF_fVWRsmSi{@d7)GdXl;NL;2>Ea~AG>T2iF7rGzH zu1(f|I`WE>7ne;ApH+=ElRR7D_};BA9e*0sZd4QRB!7KESiQuTUHV>OKOHD)yq MCQM+iZs?4Tiw!*7aRZ=+DbFrhxsntyB z=NFxApfyiJDY_nPV=1}&t<&3RRERdyRw~l^!BsY#>pqeqI+!GGW#haGnhCYMTU~I8 ziAe2ZY2T6DrHdKe=dl}RovQOllZvw=i~Z;Z6jAkXZ>I3oq(;yZa}midq0cCTh-_ zY|+|fV+nHtk -BDjv-EAC6`g9s{EzP9QU9xvi)5M@z=*}{6_oI@bU(h7~_a!g#M7&X9l1W zTM8Bb3MgTG+=HR~Tu2@7J(Zc7eH6KDVHwaurC-!NRfk=T>Z}K) ze*shus`5N8fHUOsTOU;aJ%hivF8@dA;8`%G4;Tk&x_ip`t=)&7sX95}kc;x-y4?mJ zNFgjdfY&3H*#V~hq!4XtLjRdU5ZSl>PoxkDqR@ebLM#Bor>O{pf!c+Gtp=%7!P)es zD#RKm8^L?#3AzIn%zi{pN%n5PZ6`!pJ1SnFj%) 7VNYoSd^1iX29R=F$D>)1B^gjR&DW=7tauXTl6 >5PnEo$f%1M2>OX$o9>K^K|x_g8SVqn~{VDRl8GC=z^KDo5~ zs}wRIZtH {au^2^=&2<7J!iiMB1aczCKok^Bz $SoTqpXLpw`u4)$TS0 ~E cxY-&^nC+=eIU@;*#-{SOJ&6!ZcYb1*_Hh`C2bKDQQjECVA zGrp#JuMhtwMnFD`f8iZ3b_pYo10ia$Nas>EK?+Jp0DEvxv8Yh-YTP dS2ABrT2CvFB2x0@ pf~Y=+f@zV+%#_lNjNh0N0s{`UecD6Yc| 6J5g zCDin2tw-dnSA@pm9AzPen!RUrMX&Ms*B26dCotxCV2QqTX;q-r4Q^8!v1-bP=D}rA ztDsgj#uh % z;)z@^{`V-M9r?0DLrr{fHKb^HQx)dDsMIf<*k>6v$PsuTPINgz#Ve>_Nq1IKH0T^5 zf?4d6 -*cYzD(JS}C X74oEPFoqo;-y;k^dJmvG zG(1JTQMCR+AZoa{!xQ3H+VcTLp6foQr{p6kJB*djM-znRN8*Yt)d*pNOsg9@(e4dJ zXKQ~I_(a0?bqEHJggp(DE`(pN`K0DCq9;L|gG+`#g?y|+Y2QI`4;+55)om%h<+aEG zlIYCxZ-TlI$ehzw-Q1BSP!GBUZaJ?;0^tcQ#4|w@ H*N$P1v{=ISYP} z9Z7N^d!El<1K?U;17~o60v93YG$tbF^eXUR2!J9yoP{B@D5 q4fhQR9uEcgWdtJ>re!yiS~M+!5!rCIehVuaM&rbAV-EC z$Z#DbWX{`vP;?O$12o_a(lkirRk~*wOuFY8O!^~^2qf6Y5-4-2LV o7m|u`L8*zdE+D9933gXhM=8=$86>zULcgf76cl!>k1wvF z-y*mYrHH!>@_7X+EXkDBLPGisE{?l+Q$e>Zz}$vmsH4SVeGmSxHLcgU9U%@P)uVOs z`}9kiZ>(xHnQcm043>G`w)5wYMMZVTvQV)wTaC#c-rw^mi&N1>Qj2KdGCGIoyvWoo zyCZk-u}$h(+mxbXgWr>rehK|tE2Gzq82o{AwJjY%k}I=}3#^#LWMGYnI8T9Qp;OvM zLswy6QRVGWbuu081>y+s){~Tv+M$jh?1Drs0TWJ#F3!I}sH}PuPK5*gk>x=`Wasdh zsW8-;0%U{p-vy}JKLHAxvLxI6zYS1j{~n-zl*sO>WVHTgfXaFaP &s rl+c#;oa__IobgJ@@U>=3vJ6$A6D-f}P#pujdD1uA{YS8Sl*C~`tgcvr@R zRFG_lS!&2pY))AuT9j;uUqo#(S%a`{KpF^|G*QuDD|3+c9(eZ4zHktY{*?ZaHuV!8 zDn#oY(pr(lFM0EjJ0qW|A}-#x;*A&`3i$%p`&Z$fW 17!?g`1ccycw~ z%cyHi!DL&)(1dIxPOezARCTgDL7%<0x^Twf=bjD1tYQX((Cf&c)xp17t$r*l(B^$w zeRf_r&L}hM(&c*GE!`y5*ywDwy6RK=^s18Z*?!@>SD8eY4$oFlDXy;$*W+qy7 XSMRNeg7^{_2*}>N>Vo&z(pLG2Fp_>5Di=rzC{Y@}bxQ?SwRvn6QF(xw*e5!X;rE zj6u1wrnENgb?0_>RE^356$Mw+ 9Y(UM#woUZT&y1WS5M)YWleMT%gS}aVU@wy!S%Jytn$HP{d^;J zc%{H%Wr=e?g-%}g>&?~)cVG*6Q+`P_L1tz;urb1JtbSkHTUmp$fd5gXHYgJcahGE6 zVORAv*=y; Fcv8NRN$zbP zy44*e z+Iw>3qbyJ=YMXx30ViB4Rp*lOFCn~?@xO%duxYO7VepD~%$>37K2Oz58{L9|-aSj@ zQn$#t)I=+dLC(t1Bl~ZyM7$h}iZ=)A+%q>BMp2P2M#03ozQ3b&%G!Se%YU;Db(%$N z(9l{_ws3o1C=IS5+1nZZ>wc5PefR!7>#1M;T9jgHU;>*E-+r+a>)EmeDa@Pd_H5aK zVu}g%Sb2%2p-TtxQ6}MT{A%Oipz9&^6jLtY0^1PZ=2BFxMKVuw{V=@XE~ByHgfeQF zpBD!D9qd>cqQn^aHHY%t-)gLDumu~B+XCyC-d2zEwHwHsw5(P6SmR~6^ZMfltW~PB zXK5PXxi3i> z BGeZp4I}Ko!dd^EL$8)aU3#pUM2C#i%-f~s{yu^YL5?wn| zP{YRSN*HV6m_l%qK`Yz#C Jze97wT3$4r}|gNT;qIC ztlka>Iknr|5S)E_d*y1hvK{8&nhV{9N`p&NB>oGo^@!C-_tRb<4RKZ?T=ci+@gZU& zmDcVVm {wIB;!R0IJD zJPVOAaPIF2Mu3jAmNA5Eqd|sVertGVmyc5IwIFL<<7L#$zlB>s=8%guhbS*N_8VfI z+#!MzvPm-t+aV&Xo@71OQ*#bMj2Lpt3Q-*ng@bjRzGMca&Lpg%R-!7gN+trht&j*^ zh~f>`Z=J6xr*~TRbDA{HVN=g4&jQclzqfs3e*66V?mJR2y>hVFa_d;u)e-T_i?&^0 zbEA-YyFaa%(k1 aK+S_?x>-HZ*F=Xjt=?2Vv?#S;ZeWLhP$ iuTD}%yOpJY)ck>o~4V@gdwO$#ziy`y-D+%bF*sT$s`?H!>=5N2TG z)qvCKVFWm44U;)eb*+H$4@|uT4_f>#lYM-kP9<^A?Vhe)yQLJO?-t7>T&T_~ZmL22 z!^biM$<$Jf($r>SH*0qFrOW2P_lK^4WNrq 1B8XP*0;#VcuWvz4}7>Pc{m{eiCV(6l7$ z+*nyiTJ~q_b8UIWZ9nTh6(2j8IW;-wMZTn1rkx6B#foER(CCz3xOiUs?fa)%tM)Mz zEgychT0Yep7BP2qo)5~kETtB*^OGqVOTkirikQc!Q#noCA s z*@z(`CBb_u%D7G(;Mn_{-pXLOfP85Si%sit-Yi+7y5>q(GE70UQkdMa9=irr5tpOR z!!Np WeJNTDD(<%;JqTBMq7BWQp<;OUX8 (BXZ0;@%wJQ_5y*uwNqw3EBtlGh{?sbm(?peVKzEaHmhGoPWLCxCw1hc z(jG2vmU+g5;apGS4ycXm5!Od2pE6?b^bE5Or0Lea Xh $H EbP~@rl26i)l5Vrv|)S%) OWvLDoSg0Na}x{n;v038nL$yD9?N?1Zjh)%>8@<2jIJ zW3ee`NAKKYu|t8`Ez {FV*QX`FZPkaehv0jw6zMgozD3so?l`-g&TZ z8=vFM&D^y|K~k>s6V7#~_{ufVu5Hu~H5RrWp(dSE?K{k0&>%{a>>w1GYP`8h8&qX> zrgWPWQJ`ET2;z=iB$7wKwYIn (3t0>lXX=E6VWo?+?;iGCn#I z|DJqA&E{yC+T!DQM#<*TX$c|`G&gI9oJynQGEWaUkh{o4%;xBEE`)lfK$m9$?)2 z-uu?btX+>~C CWSYdyaj+~nS*TVPMNEyYIo<<6oM%w@Y4*ZbOjHu0SBVwsuIIC9zn z<{<~+QU59G%TqjeB8C-k_nKxdr8`j>4x>Af^|&C6y>Y>G&zdH3dz7Ub dqOIwJOFnfR=ntucnbua&(4ke?pIa)ZR?;xd#KvCYr!N}Rtg6t@bsKXDxS zR2zBAU(ebIvD(@c@l<;N@b9cATjEpg>o}HTC~uFrOfAiTe6l$8&Y{43&~xLU;2wWw zHb@!5xr5bqS{GhgWTDik@ZbPSS_D!M2)4-((vY&i6{SKEcB3te6z=)j+vCy}(m+2A zh?pghpm;}FkFT!08~&8ge|?nr$WpaFxv44G_(&*sAjC2PVK^BS|K??mb>587j>C7h z$J;^~=$jh+`Od(9 1Gr;@HEEmmc@05CW)B#^zF9m#c-3sv47#+Y@chr#u?EqgTY3kld27J}A ztbnNu>XQWEt6$;(UyafE+gFE};GoJCdLB6eUv-l?F^q#>Ec)A5h5q(cA8m+N !_mQ zG9~FPX&7+yH1{^gwuR;o*R5=#83l7+^eVCow_P8VzTHnH2IdjD+9^@$O<)W!9^k(j za)x_Qr`}p}{;0S`ALza0Dyw+9QIJeeZ|A#uJAXh!e(kfL^#Sn~R8i*$%Ym8|4L#Rq zy!^{Rj 1c{9u&p(1 z6Li?1rCX|6(}oCt+@bC`ElpXvhUJW~1=`CEWolY)-8vhpY`}IMYtJnp)0j?5Xqn za!VmLg!{-k6Ms>Yt@&L*K5^!h#j((|fldEA?Lp%F;C+(H6ZY-y%Yu{L`zrbdv{=p` zvtPfAg7wHF?XKjSVGPRlJO#pJr&gEy>&giw{LKk_!glz@M`x2p3C84YWZ#~qXu}5& zvIKi u{E$>`l;k?jV^|@QUM7@YAy8`sZYjwUU&mBxqM>T1qH3i;X)UX| z5-qjrQWWr0(RA(2!)Sy2<)~ZS81A;(nu63~fA;(3F{fozo?v=k%MeHPzz;LjngKoP z85snPtC;PEWl0Z6Iu(rZh6UQDfe;J}zUDte3|-gF5!CTM0{>J9X2HRfjd?=%97|bE zat0f^qL-ruEQnO|!}gPD62p`QY8npQANT!9YdE=a@qrinAz;<>VPOX>u%YvurWdfz zjp|kU?Qmaaz)>_>;R&B?jU&Bo>iLW1IqLicFGIGl7u}9JMu-mUgP6Q_SOC7boHw~T ztS85KGvT_Smq$~^V(-3#koH$zXo~+orFf#%{GCkTmH?!e48V^v4_%UXqrfQuz^KQH zjQ@=U0KJ@fh1vmH`3LOFmv7y*PhxA$>N%cH KYZg4+(6 66JVCzp;*QFB&Jz{jtRAjvj_)yMmCBzfvV)jZul-SOHF)*4l!PvA=x3T_&CK( z(}ByK$Tpw_|Foec&8Uj02l m7;0(X`+sZD9xE;lv(!n2$Se5 oW5m7NFGNuW0u5yD` zaad7enFS6MIf?k_`|$xAeCBH|;=b6bki+VnEOIjMCP^ywW@_>kDpHtH{ 7>-S^=OvsOY~EpX{yZB(sZlY$fz-+8-4S89 zKqqwW6ZIIOSt82#nggi9Jqr#wvSo7gXHK%{#2lnJ24ZxpQZSi^uVR@r7A=schCp`( zZbs^^i6{O1tOxx&rd`Wj=%e_udAOjs BlO2dH0j!CYvC#k0SsC&T#DTyfJ@eqo<2 zlMYv#ehX$B*0o`~VG%n-aewdacBu1_cKe}G%@zhhSUPq@8`t8ft9sCQ&hl;lFrkIt zg%uAJ78pF= qr_m#OkTIlmH`5*GCk|)tz8EyK8TLpBgcpGvn >=Uf zXBxGbPVe?>lcIdH+_?zr&QKl!lKIKWNnf`vM#w!1eq&D<^=6c(pT9H6`#gvfMU;Y% z@rm^BP{O;N`h1}SV{0DHaScVAka0|MZDZBCt~jw_tro+R3_1xU__`H6gMX4F4RP z$R&`=y}D0{-bz#lvS4fd8aZA6Ar-w5?XtvqoqzoO$9>21if)8Et}hJF45TyF6~PPE zwr@NwGjwjiRkx@Cci+s7U8J(RM1wsmethxRPp>dAX!NRRVkU%XTJrSq2tL%Qx;;7S zMa1n`gd{fz?WjH@k3Mk3{Z#!^^Dt)QTqCAa4*cwHf*F`?bvl9=CY`ma-uR)`Om|Xy z!t`$R_=ltg@$!RUjlZUXqYs6uys&1EdSX@pSrqE}fQ9y#o*6P4!#a;JZF3^$P0EP$ zXL6k;4+0wu5|ioPglL8> R8>46fo}m`=0}mstWT zcj&W)a4rWESh^N>PXo)iw`!*vQs4+KhdDdu`%92lcHa)#pon+aI=)fp^~WCvkoA$$2cPw$q~rCr`cqf#ERIHVILeUry>wd zv9es;m4;oUgw7FQDT%Y~plV6|+1za|EaVe_rh(%*iy~-^-E{c+dh@WVF7->6S xRXERPj6$|f zCyk>6m?9lWsmh_eE-YkMu#BOb (i5up=+5Ubj6!6z0rOmS4oZ^!IhQLkfG8KCRS>n z8;FcKE$mrPOi4tY^5tM a+N1lXLbBvkUZ@tw^mAX%J>I`9S}* zl8ieeNkjo3F&u09S1sK>U-TtbnQ@!mXLLGeQ|{??uHPJVu|%f!9rZ=ST3K#!>G)eS z2~uPvS*9evi$2E^d^#{E7_XhOjZ9z>Y)CsC*Yqda;qOV^*)O19!_c_Ii|O)y{yawx zDW>^4t53;;0kms@Ex#~->McD9aRXt%E!<)kCjTLLsHJ~~C6F6ul!ASiC~xi(%bDi0 zet}2WF*N7{=`Y3JxV7DP#oqcQ`d#b(jCnh5)C$xFYWg+x3|K1>g*SPUhux3)AnJl; zJGWu!tSVBfem#PSTm+z|o_ls)*4`ODtUpMZS1;!(aG>rY^#PeMNlg?{d0~ +i-hFy)c0SNyIzmD5ozIJGf`> z47@LQXN(`h@#H;>Cq~Xqc=Bqnu)qs?9sD>MPYW6XMFLJ4%q9F}Sow*fGMt>caqn!i z!{~A_N$c9OdInEVe sDvdV4xlg3RdGC^hkqX&hVBzlV)W$pqxw!I{7++dFD)Ovyx1D Oq4J!T6XvTZ z?|{5kJRmt_l^$u5lvJTX&XIIgn9n3@l2i{%D?kbZg+Y2S+$q2 bU`e5tOvQH0h>{Nc2NRL`N%FXD{EvyiLk6aq*X$5)754 z>6_Aij@b88r_^551>}<@RmwxB>PKmE&Y_X5jTe<&!ISD{akRYac3A3i(qBjw_?z6W zCNmMF*V2uTo@ftmyqJC%q^KrVFd#KW3L*(Q&CHAwdDUDNgRR*s z<$GIcR=1;69-^dJ59khfOAlB0yxF-z-?1cVd3me#Tu>%|#T_NNZ^5>+Y_XM3l&$w- zNF+@mln^S!O%LTNC^C~5%S?o_|AMp*yUpQY#((YAX_K}$LW&{pohc&8!OK%PG7%_= zdQyz~s<9loU3`|CWuGzV>sJ}yDQzCDcjqI!$c%7fwt1BhUJSM;WBxQZ%Hk+lL0=@R znk8mdB99+`o9!>NYZIR*-V6Z2=QzGpCUq&dbS^1xwU+EktQg-gq#{6Z&dvi|o*cx; zwWeN}^Ufd7J5ds9wqJoZE4Fc;La+M0le!cV2HLksH5cLyX}XTzmrXxzV|t%R1r*R} zuH0!nej6A4hF$-yDZwup)#b_Q4Q7r5)=d#}aqSPY#> %vcW5KKrCM>%(_l zO{=dXwQ9sn!&luMq0IDc4GWy7iDiZdiv q&U$D1QrP#^Aorprl!<#Hev0<8P|c!u5aYmndT2xj-;JK{$-y*19)SKAE{ z`rg(s)E>1cH#Zx-UpQgA__`rrVxR6O%7SeZig<1i4L}rARf0EiUcrK!Tr<}?*QXDA znS#E77`&7pj)t!#pMPFhxg9IJld`rO%q0K*+-z&l7Tv{PpD?t$pyjaP!*3MY_|YJ? z^4D%!Pp_z6 X+Z+tU z$Ky*igMP)~Fnw3{Atq^q!`>aCIQdIpq2%*JQc4tZTNA!HWs Gbgs;L{1P$zj!uVnRzF5l(}d{f27(+ywM}!oHjrSCg2rhH z(bOZce_=NSj-R}pErG5r{~@)6It+0hS4j}d*C3fLOs3)#Q*YfpaliRMAVweB< zl`FDAQ2=+isj#-TCi3d1vA#2`?>CIBnc!jYXC%twPcrCE>X&7ftqz|Uh-07$gSrRC zzHyz?%?tgoB {>cdp+H$Ov>5bR!bpJCf_`SPmW%^NuV@S88hUS2ti+{fIm80VP7T6IkO zBpHwBuJ6i_uD!r>^LmiH!P;j?;a$Mh!IbZ`aQ fi6*L^C>-Z z@(8Gb>`ex>1P^rr+@EawYYC7AEb=P09}3uz^s$U7`p`=51%fh#+v@^5zppiViI~9` z;H|G|3^M#eM7{UoWSA~Xg+}3*m^x@2d0zeDEqEK{@3>348Mcr2ZheZ817%yLJz9i^ z$2W8_0^^L!a`*1pKW6_Y%mI1z(aGoXSNqcuko@>$&;kB= Yj*ziN 2hY3^zWzJj@4AB9<}x^|7-Lnz(^c)T 6<_! zF0qVWW~8L;z*2W_eEl>YBdk5yJTW1kvT47vGAzjN96cjwFS+c{-jI^?TO4#H+3bj& zdeEZ3{kFB^d(OTik(dP9cN_nxuzQ;#c?s@Q?uapC{3Ag@j*)}gIgb*2|EZfnu=#r; zCf{hOJh!dM{rhnK&u6R*I-F7WnFle-d~9EK>)Pd@kp~F98xvf(8#9o7FiiHZsuz={ zc%<*N)R#K3wb;02h0vo>rjlQ|*E*Ev4snoG9pTDF&wm!i8Xca%VF~V52wG`+c>G@I z{4-JyHqw_f_~ wv&BoK;Jusq(P$+VsD2s3;K+zce)5Z@?5J| zTPg;RYS_C_$+LQSBw(sR>L9m`>GO#E(%oVvf?l?M{|)Pe`D3g;SXFV*{E=-#GBNrx z?W0W0g@7}6(+v4Y>MP+QcsTp_-pNhRs)ktHQrT}hCyHI!nu33MC)pWOE@KVyy}kSB ziWza|O87mM1G9Q+_|V&79T{?6M4fpv72*DS5r+}Urzt1Pf+u?2b@z_k+X-ak`xa3* z=ziNd;i5z=Ur`OgH^ZSlxxUPYO`?yV(EF!88_X7AJ$_QGnEFgp-|Z~JdOj;GtoSjT zac%1J=FGOq!yCi;dpahe+yT6s7_h FR@kG~dJ2{e*08R=(4B$@{c(D%I)EKK)qRz|n>e@wK N2S1+69w9qi7Sc2xJBAbniLaE0AG4{Z&&+f8GW#>Tfppcva7s1mq= zz4np*%Ezt5rl=p8dsB>;9bUX>{7HyKaFf5tud_hQV(4QX1wCEo(A1}wjn5VaFo*>M z(Z%)m7{WBPj1L#D9{fV-h?%djomzGmNOy4x<99Ecvg&{AOl2kh*!l2CpXt>l|NjAQ zK#{-0N51a&kH}j>=g5m+Xemt6$ny{Q8B;IvWbXDb6a4+c@W!kZekS}p9lhywm$2_Y zO%pu-$ozEOd-G^`6mzDOjSYFwB%c}ak}1ZQPZ? JN`{vfR5z z`t#mBG9ny{Q&NEAns?GU6Fu=A53IuZ^Lb|e{PX7}kHTqu{=9b&cg^-)Ys@Q|GBQU; z(R=rB_ivM{@;on|Rfh0q2(fJ}oWz(>56@hsh-C^eH0%-%J>b#a4n0Rl&&Fl=jE8!A z;aLAH% j{5I%|J0c+6y?cmzfjhBn>1!`BQFq zJ21R6GeA#R7`8n(JY!~JVoqv_AGa}safJnd9|BPTc%D@WCpX}+ *DD#I+N;4CkHH1P2!?pT;^ODsa++Y`OL zi5|WCD1`;(vM~ 4jK@9+ab3jZL-Gn$(_U#2@C z5)Se0x7f?_A zZFYm1oC~WV=!!+{jym8@tQrglorL}-8OX21P$MvZ?9d_qiG$W*B%HbSF~>2Jj}NLl zxgWE)s)LNCWRh+Ps(mUcx7+7&crhWlNe2??I4?%c$VfKRWX7K!r88oVCYABUB-Q*# z@FO;KC!_QS9-l&i !An*dv zbYUikWYocNgLr{t>V-%a#sQ=8 LXRKGRdJqt{Fs3O z6Y~og(07?6 d~AVTyDrGx&* zPI{iD)DFL8fTwDQk`pG`V!1;leU1;6@kaz8{(_C-__HZ_h!=Qf>Hg=>mwXxaE6D|O zP5(XJDo# u;&YTAC`L+5hl~^EraqP^v`u!cU7r)sN_u^lt8AvexpX*3AGL-ql zfU~Md9^3xRXdtJ(;akYP&s=NYT%jqQTyNY<&gd(vSD7X#v-f_;Dv(qPnY*b>R4K$a z0^4U~k5I6ip5;k}5#pNPJleJ#w0n;+mm(^WJ_Kn99U|KK{P~RjIi-JI(m#jv&jtN+ zLjRo8Kkw+DpXs01^v_%R=YalsK{Y iDRS{<)7{euJ}Z<6pl%LcjLzkl(-jI{fQ@cR&3-y}tWb@5~|( ze@yVhDSh~ceDQY4!>^Cf0}+v5SWJg?Vf8*8*rq{6=-)i*eQTm^oyy<8f7E+Uk7!g$ z@u>H`NfjagJnFqL=-ZEvdWY=okB^uD-tvc7=!@9mSS Zt5X{bj*>sM+s09%SIb|#~VHiVz7ds zz x(A*QAVnrAwEsQ zsDw0XiFqxw*5A#lCQ^=3f3kw@|0JhIQEx_TPQ1*--~|y@^t=?rSj|QyuLH9ei{%Ev zH7dewO-~{-!%s)S@xa5Dh0gWR47=9hS`dg9=7~vxK#@tock`K<(M|Ng-b2Uf!KZ6+ zSl(sj7u9+3sZ#9Uk)PWioUW1fukecN9J9ydlgV!S&B*~CD=R7F__-3;N#>kj3PZwQ zC5PR6A}llCotc>VI`u^6Ya*^jW?D;f?Kw}-zXKkq!viJ5j5SI;oe}8)L1NGII;a7p zCiJa4;2t<4=_Du#M;P98@Zv{b2i)ua-We7c4Oo?Lvuw6c)(=&U%^bM6R8o+U5+Q z#oqNybecjl{NaE9``^0{&wA+8(-mIc$1m?EUj7fi{9oebXZ-SW;$;WF>?B@x@yjmH zetthq%s%so==(g(e)4MDt)1?j;qa?nPG05;oyH*HI=La5Wabf280}`}`7BtUlFq~0 z=MJg1kLB_hwiz8AyPQrs)JI439sTxV-L&`MK^MUykUSzWc`!uV1p!E(x9~H*eAT~q z&%1+9a8Wf;C28%npIAV2AL4Q3R?(AqC(=cf^dNpF7>5}4LkxGgz9zL6sO-bqf^HF* zMTk663Jj0>J+vGgen+(sXe$P7aiFb4L##wYtf(QRdyHY&lOFo?)Cf0wG%^m|uNQvD z=yrSF(0Z_Qjf=Q(k!T-xGt0TCoWrm7Pn6cuIHNuCXV7k64;+5|V`;{K<-}y(yqtRj zhclM2X*WkZVaG+Nlj)0k0RQd=Q_sC1?4xUUlCqUIhUa5%C@=9=- _D9q`-Tr?i9O`Qs0*r~cPrTc7$-x4S(e8Z^Rg51&c58{D)xvU>jU(@N<5>R=!0 z=D0=OGEt<++4GV_^s+>gOON(Kh^m25HDXi^4ppNYBV!ytjedujkI5(t^UXz_;KuXK z<>nh2V=`4StYJW2^!#Xsptlcpx=-UN;iD K%LRly?%}HOkM3YXpYgu~vgG&3j2vXuP4*>z?(%?fEm?Go?sy-wjJe_+ zZ!VI 4~tlj6yLA#d=fe*AhTx4;fpfIG2s;>FnwqDUNwNMcC? z;Klfjv+;`|L?yTRX4$;uIT?n}p9!eFJ3E6J{m~zA0!}o=_E>u(p&J5%Sudei$}>^a zF!&BWNq>qd$;W9Y6qs=og4{7|V W{=1%NDocCh*RFp;FQ@}seRoJO wem?r|@qhn&jHe_z2;buw#<_SfBzHviVx3{kmL#=^-2u5X zviDc#?x#?fgr}J|e1>3pxI?!8MhrEXfY;r>2IShx9wX>~Os@YLoTT26J2b)@a)l*) z^UV~!As1!BH@NYXByR^UUAEX$#9xCqe7V1Ixg;rlG41^ItAmIr@kQ3c*Em}L548nR zfb0MFSAwGc!719XCLt2Zptc5hp@)q{ZN2*!*S$taCcGh`%KTD{X9!(i@fp|VFAo!w zo;`#CnIqi+!R2X!WTh A}IpNjOF<
BUFXp2L278zy)BP|S%{?rx><;iQ##!$rN{c1TMD7pyb%`0T#7-u+ z`SxBv3GFMf 950cv^>Z`~~7FNX_lu z5kl~|8=m}sz? #8k| A7gHAx@+myy+9jF0QQG`@}0fo+n{Ypu`YU!0j?Y0iKsofN{3ADygU{ z(NW#y*K*o>2F4O^864HX?iEmP@$>1YSVe_4GXfHEN?s(@*`uh1_qmwFk3F%OG#+@O z;%HD*NXQv)luoEb*f)niJ&75pk)7FB(Y-PXJbJ`EmF%c*`Hp(ip(>a&N9c$5Vjes> zXr=*oPl&heNt3NRJA0(20fEJB;~w9|!QNgZP^LZt_Rc6J7!a8Jy!u-h9B#97TB6IU zVoxpJk#ju6SfIZMTy(VHtQ*AE{GFm{oYHZZ$B7l><~fi5pI&0@%;dacH~O+v!o7r1 z*x=4iFSH4Zlu^CVtSovHPQEP2Rf-FZJxy%Y!~^NxFQi#V=5crMF5#Yrn?;{ch5 8~Et))}%E8Ac0v`Ve6X!>9kWP0K)9i yS)nH3w9oiZ%`xgWo$8K9Pmq9ngJ< z4k&Lt%{HWeV$$9n96I>b$nVge;qT$}C}z=B8@z5`lI*`Z6|);eyfg7T>>IUe#9t=l z%Q)kUPxeU13#*`)MDUk$(yjwD`a<|^{N-EHus@?R5ko`1o)U=rX6Hqcxuu^;oBRw^ zMg&PjmbowF1Mi-%aGsda1aPv+(M4iEB^<~eId~wt;0^=9c7a?=#sfES&<<`5QRR4x z58>`(O@&|=khLAW5VytOGq(ejX~10r UfFhV$hLz&liR^BHEsu9 z(RT2I*qUDowu3`qJNTh+J1|H1D|TQOU5lntba(g+O-G`M#A6-g+*R89l=*&;lOOE_ z9Dk9Mi44@|&jq!jk9(9?q)b|TS6<|6$dV+?PiE%uv(S6yYvDK+=@gO%Cjp-?%Y@`* zfkg@`oUlmoUW?n>Yi4kQ2IysEaKb%sI(s`B!W@l4WEt{Q%n)i 7luWQ;f|=mTvsq_;wP<``%iqF=JQ&7UNm+m)B-tHS@7S{W|#c#^WUeU zrRYiK+L-#{5}PK^WW-0%9&R+dWZe@k H+dbGCXm8B#;(8}j`H$ZV!p-eRL6DjuAD1>w7CMj6pxd* z@*u13Se&ShFaFzfuPTH{ZpvN4@s7MmT+Va{dtM|`_c&3yCtA?H O%oL1Z{WR)2 z>=E{_|8?$u3PPDTRuv!y>Mubtz)Q==>Gh9Tuh*08)jv(H{xEN9?O(m-SqOqB;sY*U zqgjr4z26;9%Jin=3hU)EJwwsbPD&lI2JR$rPxew=?sTz_a~C^Zx6^ptQdaF9<$eZN z$?fOtb$zTFMisMazYA(Bj$Jzy2j=W`KD+i#VAoi|9CmHNnIO 1NE+G%MXKhCl;}_#=K?|aOQGYr3d55}R3U1L(<9Qbu+qcVLi Av}k;>PAommEX{duqQ$v4V)>t)%-ZQSG%@RWCVBXM zigvL(JN&G9$4%0tSf=t~CDNNiuY=%Y$Ht_Jj9vOl6ljv8Vt>yZ9E$FjexC~2ND!7i zRQAy7V3vHapL{{RAtNa0#7`RD4Z|`_u_*&}kZj|h)F(13ie?^ZIVpb-0{qSC93A&i zH`DjTv(nxe7bJm7_U8B}3GJ~r!#{~@sXb!<@QP~rF#G}We87HFB`N)lDix&cuXhuS z7isyOzIgC>E9N4e8?kJIC(}BAB)BM#lisjx_g<{i3y^x!Q8QmN}aTSIn~18&+m9 z7*Vo@&n*9y@v38WDcgZwm`Bzz-phD(sn oMzQg8r!(H_5J8F2>?Y#Q@x$`RF zX8Z>sNCcX)uV_g$Z(k9x+}1}}kGP+I5xsVu@Ru!5wwdokqG7^M(TO>FL-6OG$U={v z_Z>0n%DH%rCawS-gzvK5TC4|aqwM$ttquzq`}|8 zIk| Ho#I!^R)8m*o9 zITzTQT5)If6(IjXtv>F`8L5 AY&g?BN@AoFE0Cyo{qA%VCJ@kC%U zeoopSO@?$sU)9;MBwAI`lu)beyKqlgk1l !jH zO{>pLuaf{;M5U?@ajN>u1Pdv63PYO!?mH}}i90l}A$Jp!U Ngbod8GSF#*VOm- zuM^)zeqle96|x&>W{(;1KPA|@#L;Xw7zWt2R?mAd4Dai;y#KpP%!z{mX7V|khIDUZ zFlf}#Xzepyz#xXcN9Ni7F0t9c%+E{b+`#c^CukO725@mUZ6S E8Mlb` z{gg`;63bqm3Vc&%J4)$Cs`?Yrx}wl48z)bUl^xun^bIc~KeGjv`UC%sRNBWl;vYL` z5w^#sKk_W16>Sqoka1=A?r|JE_kNozLwzJ=eqy{WfB&e%Ezsg()L|E`pPlZ?O6(l7 z&aYO%j&ucmLCO5*G~KZrhmg_joTbU@qOTtdzyA0-f3W}IBq3OE`ZRys>9C}SJf!Yi zPcUnnfZOCbqmn{o&+Mfm^as}mSQvsOEXO_kZ&B^R)XbRw8Fk}~IW>PP602{iSUo;& z)7cqXAP~0Zj_@Xk4_-;wu9qT&^2arbfDi Tw)3@yw1T*i1K>x-j6XRG*&G3!4|*c4 (HbMk?O}zb3c;{Y?!+XZ#H^l z>{}nqs}{>GcysGlsx;%>(V2BzfJat|Q&fVYhQq&O`}H$C-6(?Cmd9-Q)RLXY(20~X zN9ah3Smz(`>hB@UgYNOuG^5Co8g5BpZxd`Fu=XdS=7N|_BpO2L6dB9-np1R-Rm#s9 zGr8!>F2o3Ht4n9U(-Y>uTQJ|BR+#U9>N3c l6x?@L@fQ_Y@yN>BqiF_8LU)S zx|K(cNy2$*fnT!r^QaJec%rTF5+|0>tLmM^m$3bxKPSJ$Wpau{tyQQ@91JEj IF$V_yFg^; rc4nj^&R<`P%|gBT^Xuer zqnB^Fm(hWBZ~t|A!r*(PJOn|nh%cmaAH`$j-UsdzJ9X~8;@)vb%f0Vjr>8J_{rq*- zGD08j@*g;Ke&XKq`#9fi;m-G-f4LxLOnZO7PAxF>_M6wKse#`9_L?6sc8=ZqlY1L8 zSwHY^!&CpB`8c`iu(>VwGCW10*S~WR1V(+&$|SYew)b&zL16RV$LR%uZ9*R><~g
AnS`<0rbq8*IKEqzbV%teS1AA)RDPTAtp Lzl>j7di3Q!euz^f4JLX2!evVsV7Hn>Tv|wL$oSnnUfK2`{mNYVS0W zFEU?@h3+Eza^Xj38P4AIF@GYBY*n#S5sTP)awqCYA(wLLb0C`HUa(n8F5a+0Kd}kP zkis{{=)8T?`53=?)1mh07_HdN0b4S6VmmJ4T1dQZb||z&&xZNJFSu^@Qe;C8leB|Z zYzPLmtYD7)@{b9V!K~3bDI2Xj3Zr$Hbe0?r)sN|+`X@b9CnZBgePRehbzb989TpAM zJ8`Ja3x?_+VW{2}4%Le+>&`d40Z7WS^OQFuKJ+^H`kLTO!$=H5e7}jtp-p%tNXixm zgjNUFi91mJ5Nfsq8k0JiiNs69w)+$Da7B$dS?xTH{`qkNQ{ww?4^>5OyizwAxH+K! zl)T~W@RH?eN$k 5L4=?LCjB5gfDZY6rnaC0p|Cjp<`~kqVXAgN4`g0Js^SX z_o80KOHH6>{8Fn(Ofs%2Axg>VSh<^S1b$>GkI3qiX?8_nAc%6zIjL&`(ytFQ1n@ zc3DaS0-me-u1LdpOSEA?ZfFWO_#@l1;cFt5iSP1r_7gwd0L*WbFbPu?f@2;4xcu)^ z`SCo9@>9P6T>f9h{AU3tgbRO$rJ02mU;OW6b+iC$5c3zn<^M)9|M!ylKW63UvkSR@ z6n4zt9@8O81%jh?_~@T~vLv|OO(;)l`GXij^&I;2(k4&t5D^1>Hb??=IbbhRs1qMf zp>Hetc$~1-`a{5gc)q|s4zZvL)k@nPZ{hduIeTc!L iJ;$i$a|0cb~*KL zVrEqI>yZdq(P8_Zb3CB9V!>_lfI{aN*K~GMli)A-9(gUsI-ou}*ji>TIM^y=-ZI$w zVIDHr>R?_m*xYAsF4$CNo;lb=W!^a0G-PfsK8EE;4QvwO8=B~eO^LyCtWDfwW6FEQ z_)X+;P=gS)^+mSjci!qJaty^n KMx3c(*iQSa5 z0d( (m+z31Dy3vAMH(GSDBljP6vE-oJn+y@J7{|W!?atBUSoAz1 z&fL&R0q3D0pl9ZhF}DK4wmzEeJu-yU1>gbqnhXMcO?qmC`T&)W-;$o8Z%MBWur+zi zp>lIX#42*6h$el)k>Xn?&5%)nPBbqWD;AAF=pNAQ;A*1tSj?oMZX{jK_%wEe6OYj5 z1%}4gN-*L3LpU=9Ir-x*5wd$Z*@bZsN;r8XqLC1?yNUUjJnmFJS&~!HIbt*M72%K; zg%gew$60R^^aNv&5G3;WU5NNa#dD~N@iu$Lxc%ge@hj(?yp8tZ(jZSG5o$8X69SbA z^0Y_{0rmb81ikiM3!P%yp$|UvGw!A~xo$XmOK|1RqOM@-V84xd@MI7&&qf`$M}0FB zZ@9Q&N5}jvMPZ_dx<=|1!SOn{!y}KI+?w*=a%(E|e88G2dOt{B7d^Mc{ 5PK?pA+yJgol;uiY#Lbi?iqX7X~FB66%db> N|>bkJ}|KwfV-(6Vshcpz~a(mb2vQ$aiW VTQV)A6-J^xS0(Ma%%K2QiUOQf&UqTsicFUR4vSmbA(A*V$2s1G zI!QP!Aqj`|kpwG;BwXf@gtIJ?a8ZRMyvrmBhbkn&NRR|SO%mQ%qYs%RA@Lz535gGs zBv?5l;bj&{c$Z5OPO6iHmw6=NJPG3@ha~ukC3If0gx-k@gY<=g1`&He&+-}bGtVT8 zxl>+aUUM^5&t(H~h3Ccdm^-n(71nFzb><9TzwHRC%n|x=av>ZBm|u#~g{b!$@wuo@ z8Fy%rgBsj{%t1}G-f(41TEwk3`j*Iq!nH;kE3P!+@&EH@B7gk+`Gj5_eoij}e56r~ z&*{q#G|P`Hv@sDlnyHogQuMk**WBWQo|NgjAg%5Zho8I{x{z?nDL7u1`P11Kr|m&< zTj9C03mz|4Fh|MpCcPToMl&dDIebVi2QGVRJ-n)IJ>Y4MP2Y)&!Hh-mo$8`^Rk$eZ z%tbLzEQ)!0QM@Tx6dy7cg`K%5?DV4e?&cT8N!Fs635#N$xhS63xF}AFw0?KRnftt8 zLCk~&akp?m{FFQmF}}&h-cj}pyg_ eZytKT+rV4@r#I> z?R_LK#c}yZoE*O2c~1=od9|^aXOflYk0f(5@;e?CI``7E>bGR>-<*Qnzl-%Fy2A4E zf=@BeI19&L#5{;V 3;7#~x;wzUfPP+8)=5Ra+@W0o*G&~Rs|C!Z!o|p&QS)}viXb{rF#X3IBNxkE~ zq2s~15yxbgIuaMY5kKPi+gp=