From bbd08001ffcb074b013979a20c29b448dff46175 Mon Sep 17 00:00:00 2001 From: mandalkam Date: Sun, 8 Sep 2024 23:35:23 +0200 Subject: [PATCH] Initial commit --- .env.example | 5 + .gitignore | 1 + README.md | 120 ++++++++- bulk-fhir-validation.png | Bin 0 -> 40835 bytes bulk-fhir-validator.drawio.png | Bin 0 -> 142215 bytes docker-compose.yml | 77 ++++++ download-packages.sh | 13 + home/fhir-validation.ipynb | 479 +++++++++++++++++++++++++++++++++ home/fhirvalidation.py | 304 +++++++++++++++++++++ 9 files changed, 998 insertions(+), 1 deletion(-) create mode 100644 .env.example create mode 100644 .gitignore create mode 100644 bulk-fhir-validation.png create mode 100644 bulk-fhir-validator.drawio.png create mode 100644 docker-compose.yml create mode 100644 download-packages.sh create mode 100644 home/fhir-validation.ipynb create mode 100644 home/fhirvalidation.py diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..eb3d625 --- /dev/null +++ b/.env.example @@ -0,0 +1,5 @@ +FHIR_VALIDATION_DATASOURCE_BASEURL=http://myfhirserver.mydomain.mynet/fhir +FHIR_VALIDATION_DATASOURCE_AUTH_NAME=myFHIRusername +FHIR_VALIDATION_DATASOURCE_AUTH_PASSWORD=changeMe + +JUPYTER_TOKEN=changeThisToken diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4c49bd7 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.env diff --git a/README.md b/README.md index b80d54e..8bf2c70 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,120 @@ -# Bulk-FHIR-Validation +--- +gitea: none +include_toc: true +--- +# Bulk FHIR validation + +Dockerized Open Source environment for **bulk FHIR validation of FHIR resources**. + +## Aggregation and presentation of bulk validation results + +This bulk FHIR validation environment **aggregates/groups and presents validation results of bulk FHIR validation** of FHIR Search results. + +![Bulk FHIR validation](bulk-fhir-validation.png) + + +## Based on open standards and powerfull and flexible Open Source Software + +Therefore this validation environment uses following standards and Open Source Software by the Python Library [fhirvalidation.py](home/fhirvalidation.py): + +- Loading FHIR resources to be validated by [FHIR search](https://www.hl7.org/fhir/search.html) (for documentation see section "Select resources to be validated by FHIR Search parameters" below) + +- [FHIR validation](https://www.hl7.org/fhir/validation.html#op) by [HAPI FHIR Validator](https://hapifhir.io/hapi-fhir/docs/validation/introduction.html) configured by Docker environment variables + +- Aggregation by [Python Pandas](https://pandas.pydata.org/docs/user_guide/index.html) dataframe + +- Presentation of validation results in web UI by [Jupyter Lab](https://jupyterlab.readthedocs.io/en/latest/) + + +## Architecture + +![Software architecture](bulk-fhir-validator.drawio.png) + +## Installation and Configuration + +### Setup FHIR Packages + +Download the FHIR NPM Packages of the [German MII Core Dataset modules](https://www.medizininformatik-initiative.de/de/uebersicht-ueber-versionen-der-kerndatensatz-module) (Kerndatensatz der Medizininformatik Initiative) to the directory `fhir-packages`. + +E.g. by running [download-packages.sh](download-packages.sh): + +`` +bash download-packages.sh +`` + +If you want to use other FHIR packages, download the NPM packages to the fhir-packages directory and set them up by the environment variables of the HAPI validation service. + +The environment variable names is derived from config section `implementationguides` in HAPIs [application.yaml](https://github.com/hapifhir/hapi-fhir-jpaserver-starter/blob/master/src/main/resources/application.yaml) + + +### Create config file + +Copy .env.skeleton to .env (so .env which will contain your credentials will be excluded from the git repo by .gitignore): + +`cp .env.example .env` + + +### Setup your FHIR server parameters + +Edit [.env](.env.example) and set up custom parameters like the URL for your FHIR Server. + + +### Setup initial password for Jupyter Lab UI + +Set a custom initial token in variable `JUPYTER_TOKEN` in `.env` + + +### Start validation environment + +Start the validation environment by + +`` +docker compose up -d +`` + +## Usage + +### Web UI + +Access the [web user interface of Jupyter Lab](https://jupyterlab.readthedocs.io/en/latest/) on the configured (default: 80) port: +http://yourserver/ + + +#### Login + +Login with the initial password / token you configured in .env + + +#### Start validation + +Now you can start the validation and aggregation of validation results. + +Therefore run the Jupyter Notebook [fhir-validation.ipynb](home/fhir-validation.ipynb). + + + +#### Navigate validation results + +You can navigate the validation results by "Table of Content" of Jupyter Lab. Therefore switch the left navigation bar from "File browser" to "Table of Contents"). + + +#### User documentation + +The further user documentation is embedded in the Jupyter Notebook: + +The different outputs are described in markdown cells and used parameters are described in the code cells. + + +### Select resources to be validated by FHIR Search parameters + +You can select/filter the resources to be validated by [FHIR search](https://www.hl7.org/fhir/search.html) parameters. + +For filter options you can set `search_parameters`, see [FHIR search common parameters for all resource types](https://www.hl7.org/fhir/search.html#standard), as well as additional FHIR search parameters for certain resource types like [Patient](https://www.hl7.org/fhir/patient.html#search), [Condition](https://www.hl7.org/fhir/condition.html#search), [Observation](https://www.hl7.org/fhir/observation.html#search), ... + + +### Python library + +If you dont want to use Jupyter Lab as a user interface (e.g. if you want to generate markdown for CI/CD reports), you can use the Python library [fhirvalidation.py](home/fhirvalidation.py) returning a [pandas](https://pandas.pydata.org/docs/user_guide/index.html) dataframe independent from Jupyter Lab. + +In the Jupyter Notebook, you can find documentation on how to use the library, including example with code snippets. \ No newline at end of file diff --git a/bulk-fhir-validation.png b/bulk-fhir-validation.png new file mode 100644 index 0000000000000000000000000000000000000000..b324c5410fe8e2f76dbcaf62922af3ccb0b310d2 GIT binary patch literal 40835 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 literal 0 HcmV?d00001 diff --git a/bulk-fhir-validator.drawio.png b/bulk-fhir-validator.drawio.png new file mode 100644 index 0000000000000000000000000000000000000000..f2d9bf46b23618b89d6ac2604b364e82b42d19e0 GIT binary patch literal 142215 zcmeEP2OyQ-`!6Y@K}N$CBC>b6#7hi+Br25y_uU2LEleJEjQVkXB7MxM9Qj6ZY~a?5&*7pwP$-Y=W}OpV$QW z%rSQMY=UxZ0s``Aq=`KiV+}rnbSsQ0>I@2Lx_nQ7Pe6#9Pn?@iP@7MTO;AQq1o|b+ zBPuR-YB@i`3~9YmkQxSuLZcCE0t&)Be4r=}U6i#c#>ozRRM!T-`1wGxARK%GH$;S% zKRSyD9RMjZHa2LaF4Fi2${u=NP?QH$1&TPLq^+jPCLjwwqfwSf@Sh^m#1aENVv0pL z@t`muyMO=>KM&M+S#vDL3S?5?=NIDP;}I4GO%)Im2Y0@{q=JAjk2sGINYg@`L10m9 zs)LF^+9S-C-(BXI;t@fiV`t1T>as`d)%kF8N9C8_*%67gLxB#%ci(E|(8KmFHpt~v zQ=}ux1hhneO;DbVPX^qBegtJrQ3x|E!U|kiBS1^>C1@d0_DF92<+4#LJ&!)+B&;NN zM&0Ek27y$R(^9v#)%w1;)k3YD6|o2#b2W@95)Dc=bzUx4L;$=c)GSk%{^F zYBejhLJ3+Z+)9J^L1Urk%p6drNW0}{S2EgTFlc*}&9{jr7;9@VhrY>(z+$1H$G_mp zvu7~qm6uydumO|jn;cMrmI(s=W2!F7)ZTn0FTV&FQK)@Tb|oar%zUM4F#*x#8&-(b z%qwqVXN~|fart?C(%Mm3?#9*5#9}a@xHW^e_V#KfD`#0G8tUuSeq5;sOr}5n?3doa zepyO?pg4@N1=RPTH_!+Zq&etgFgw5LRTClYFY{7CN%+2=Hm%-ym6LV_}8e_IHkKkwom?|qb<&btJSd@+Zmj&@%6?{%8Fc@GGBJ3g2 z06wi`z#{E14p7+P@rA~w$8nU$O1lNpq0wG`v83BoHKBp|$c6SQ;9{pD&w z+H%d`mSc)?{8ExIC><2GrvHS2xCFNmRyLq&Yhyd;KYX4wT?(od26FgIEo)0$Ni_yT z_1o3{(SG6oy?$BgT@x_e%hTa&2MWrIKz~6~e&|#1)@$d%H$C~YUIU%^&1*udd37nB z;McJ~p{;1{qIKk`m5Gd?=y4b2W$F0)tMZ4n`E`Z}fc1};%qA{qfJsQKAQ*?`nIgvz z#t80Y4n(k)4Ol>6t~mi=3ewE&t)Q954?Y@W9Kchis>Z7c*yRLp8who<9Ka-nBTOvK z@aeKEeP@la2F1Yv^rBaj*aQRx1Z4!|#G!OBk5^ zX+ZYK^6^09^+V#%(nP;aTrLq`#+MTD<@0=>5ns)B4}VuRXp$ft2n7@lVT@ndP}eR? z0U)dFkt?Y76KRQ0`jyG?b&4n=fudlKbpi8krCjk<)LRj90zxZ7*y$_ud`UB3gF5_B zsn7&QtcYE+FJ(iikj(p)wh00qM_~n5em_4x=Ze_>S2=$L9n`;QB1$rv%Am=|mt`;z z0ILA-1wYovHt6Mk#D4R*XOFOklqEhJEXEN9saBBqUj>d8 zxX=Xa3*bG37EqVsGecS}NPw#Ohkyd#SKo-YzW@|?SO$eb7y(`i!lAE73)0tN0rbo7 z!U7n1AUc0nS%Z2OND^TAtf*{jVBxD6hotSvmAdO6;_P}D`!B}*qHN}2=O=}jp55P`pbAhD*L}c zjK5?y{2=i8`Nd>pAszX*42s`=V$B`UY@qrJelZ!=q8ju{(Dg6j)4Hv(tXcg2Z%FU> ziLC)Wv<4%7+0+nOdG0^o)G)=ESR%39CKxLlj2)841=!m79$DdH@KXKDTGKMY*dXDM z&5eLeHmK)JgdoZoWrFxhJjvmUgzhaDx}5Q!FbtNt8$6@&6J83KuJ+t3Ry?HXqmgF- zf%Q`o5zi$w%(m43h7lcEaD44xynH6@& z7-MgbvHDU91`AlKRXM!cBEV0ftj)ABHlRUxn_xKsVtb%V=mj+q_JAaU=pr#N7D6EP zJ2{QT*aIT=E5Txe#G*hJJok$QL^8tK42{(Mnh3YXsIG9ZP#ySp)I^w?f`+WL0)a+j zoMcw%ekha4vOi!=El6h@gf&F|L$^US4#0uph&%?7JrLstr6K`uwekcsKzOqSiIsN* ztQW+qKv@vRb{MpSJyPbYX|$SiEz7lT;DG)D!Vj2F(1NrZO z3?Xo#130y1$ogs`eSx+wx4tqz_`y?guyKJ_r2rpTeyf>&VA8(JwMv0_tDpEyEK!Esi`EDzssYd)Yw7`VLC_fiG_5m` zM`+negV+DQ0LoY23?yXM(E|!J_(t|F8*aahq5p{Npslf1{yV+;YjFV!Stw8dmK_pO;z5k31BkE?-~)EP-D=?H z+PI}}*|$~1SmT_=XHeHvgUVR;%dcko!9@81zA$INQ)8lX37Is$l-~U>i^H=P_b8i2H)L&=Hevv5yJGuXozhXVY zc|F2;J;E6d#OVKJ)Y&REwi-0>6H`cRHEk_bCIq1-#M}I*Qe|JG&VCo#Rw9R?aIke$ z1N_;Kfy_UN{sMI0ABrvbNv!oR?j-u#x9#u?uA|!ezMb`bJKzW%e8}E^=D`H3p>Hdw zwhCZt{67NXEBLh*)c98u|I0zmVs*#OI;8!7fHa|XNLz=rbx8ZqhBRT}?`gJ9CuHvibSVL1N3>NwqZ8fdQhVt*r_ETaJH#4Aq~UrLz(o0Zv@NE+4J{ z8MQ*I=W;Gr@Dt7vZ}I$jn`I>c`&Ua@ISg@)`T6bnm}@L80A_20(jf)zch6DyiRt#2 zTeZ4J_3I{I(2Rd|yc-y(Z`uNl*YAeuEpN>J^HBmwYg7C_ey}OS7!3~7&^AYblLXct zgt<0$589CrU9X-}0CtIi1BSt0kiL9)g6_)6iO_z2P__a%2on?yUHx#lf|vmG7s`h= z#vjzXdOiY3`tAe+P}1tbXhQg+5ZEv0XhI1V4puf=D~H2^V;)vhmQNbs2M1V#lYH>U zd4je;ZAF@bLx)%LW3XUjw;2ZPf|LK63W7tRu7~pd{&p3xH4lHH?Q*W4o@0vNV++o^ zMPSXqRt)^o{AoT=;je|gFZ*e}bLp>D=~o3J7B3|nzkP+Dsr0`xf4+E!zz3*qP3WXi z&_^q0X@ZHc+-Iu<+N$ZXTHkU%tvm&FE|}}TbdKM@s91Pas{dBS%N_rxD_%LI^Ggu< zuk_Xb-NBw;Jxsp>5zA+;;UR)U>%j8(eJeWg(^ba~I{HK4%cjupjv)AwzPyKY_3VRn zz`!3-{XK#An=tkd0R~e4M`4>+&SO?1A0LoQ-!vi36v5aqcq{IW-7pTNv z{Vu$HL0z!te;H_@!tluXhd}plgh@R7{Q^w>a=_+S!TrSs`T5b(|D?GmvU(~HG(4d9 z1lG;H<-_KGU$e#o=HK`|4u90#gQ!3Va(-gu$zhzV(HO+?DL)D(80#}AGY2f*@LN4& zZUwu(iB*SAnmYr&f@>Yhz%p2MBmTSDe1Gvog>@+VS5USLKVQHM!lFM4Wq%_CffWud z@_)%V{<4PiQwV}!8dSs$zTywRS^WPVl>Tcu$glmsZoB;oueoBot>Bf$s#{CL!5*9w z{$)egS{D(1Dj!4IJ7BFLMEmBPRB$4s1Na)cbzAM<7T}=u@oT=5pYMKJ2e{t=IABD5 zp(4TOWlIg5^!%quO#l{r-w~T)qIf6Ze*j+oHD+@KFQFa~Ug1*LopvkcV+f}}t`6|4+o$GJHlm8}1*AHfo4KQ%< zU%B!%!UJJuhDDk!eJCkqb~ybw+w*)t#Con@4j8)@3uVt z?~wxE0xSmdssHdT$*Zk{zT^^|D1-#Txoh&^@0x;RkFW^vwPg4kD-S^5y1kszCZyuJ zVFS|!WjPsbXTy=AtylGRqGlInK85Hx$y)mm^2vbUBTwmeK3Dv9;;Q*UUoEE>*nY-pM87*FI3S4n)@?L6Nb*&AgRbH$**u_6ZM zdaI-2b+ zBQvq!*+I7G(K)-RgmDKsNB?-KNuapG-Me>hrKPDq52WW}k8!?9=hS9fTykS>3rX+> z5+7#GUiPWQ){;-rLZYHob&8DK<1RI>w~~_&sFt9Q5U@&r`_n0Vdi-tCMEw!oiX^pY z)AoD^>_|pgrAz+}MMEfWu;@mkc=qv_=8aJ4KlzcqM_3Q9d8Hx6efx&vse9gbd=yL@ zfA-@!K)fg3towPu#G_4Q<^7Vg;!#4VWA;T4*ni0F`G_!>#bK~MabjtIVaW-F?q};Ws~V zw}>ScMjm7uKO>ETxjHI0tC=XDBlOpZ8`A6eczo!ZW!jbe{QNFG*{$C^hA-t-db-9~ z{xHwrzyQ;Bs8z)BaTf2M_$H@&OsB-F8=L&t(kB!ra&4F?1$OV^cV+j?WYuhFXb88! zV0f!4Y>$0EGc@lKcD{UY`mxtB;aEq|hg28O9Y{C4l_7rc`+i#)1!*5bjww0fP=hN! zpD6q!nga*+y9cU$I|ElIPp|#rEB_^E9QLn}{qqxR@F-B7D<-3Kx>gnRW5ILFfVv zOP)J&Zi5mNJII24@;vnW?vA?;-i<1P7jzqzO*;OzzHY?izHjT}K!ImfaP#I8Bvb(# zd}D6L_doi+Pdhcv!O7Bhfa#%6tT|BOOH;%AZ6Qpa1e9^LTBje4#1K}7fl>qvPN-k{ zuDw}MM~+S>OtWepB+xN1Fi4)6nK2Hiu?2JIyM{{;+uPfhdu`rYejd67-+4zR@mR8^ z*?s;W`geKIr1ycsm3uO4IewTv_?8lbH_&iCBjNphP0JNiD97D>@IX-5JQrRJ6M25w%e zAOF1AFBPfC;Nmm-S>>FYGpvd6yh9_(KPC$BP%v7rva4MO`6FXI${V6E^(rwU$Qs`SV-yy8O8+XSNC+ zfY%&$ovoUU#ThWTyMz|zy4=3*@ljt(uB%nBk@V)7)M8Es`RDk>7N zczq|!0aN(lJe|kfJCdx3{a2(>JLme(E}1oFnD}j@6;Z90TtJJDX1!9eB*=;Y&+-!< zOAgEX>}Rf@rbyuvGcGx8miJC7Ce)TYHPZu=s;$#_Nn0n93tN4OP{mu?Li3n+kw9{u z(c7W7JROUS>=lvK&KfNqs&Pva+U0vZ1V~vb&l`uGDpPaba^8;h z$afpFi{(1diaJQb>ig(<0Bvu)A4AB{kj4B{c1dQfBvoa9R2G;ofo$rDr5H4C%LsH zk!?D=ZLV&XriOtOmgm*u0?MFP>})oRrS6&dI9DcBZ4>IR=dLcsNN{O4Z^TX(g)j$( z0JpjK`e3aOkhB3j6>uCmF%M=RqkBL9%!z~XMB*-iC6oMvsfL@sASU5(IJTx?<@-Qc-|CQ0v>QBAAXHg#J^w@G{`Mt5;ps%&}d$JvgxVi|lA?cR^ zFn!}uE2hMXupX-(aqR|y9uUb-)i$8$tqVp)=F1f&_w~oPTDO%diWn*?`W-xRpDA<6 z%hA67Z1KU*`DY%Wo1_-ww1#Lc6O$suabB6G1wG_@257_He)_a`d!?g0dr{EE?FGG) z>_OposWPvIH+|^3#9Qf4&DArMlFq|lh2jC?Se$(BV`B+V{|%>@>vq-Ry?pf5o-0D4 zGUQRv*+mnrfLVZO2dd_&vBwxc&0vtz*|_Apd$0B1K{*$7N-?kk$e9@(qh9QHAS@~l zZBw*}Q*3F)9nl(?2f)ht@Zm!NtCp-|Ma2+wOOsH}RcLtZ;~-Nb^QAD9yQYqZ70nsK z&Ia$o(}HHzVJ1Pa?2&%jUc$2WY<(Q<4%(3D+r{z6&*wyVcnx!iXQbD&-Y+On#JQfw z&G-}*Q?@EvXb#PmoV*6FX?N8(p`=>Pqrl;t3Nc}k$C3m6!s;glwI?S14ybs$&^9 z6&Oa|t*)-75~z=?w{0|ViaPl5<;$0erXp4Vzc?rf7G}pq8@!#t0GjT9zc^X5HRet% zw(@|SJoI|<%;yeL>*(mn?>+1bnbLP? z&`CB9AE}x)2C$E)t9r21)4V-%Q6u`+aKLCL(kW0 zW_ZiFoAI!rkf)reZZL7HSpmksH`@N@sSX+oV$I&M9Z~j@MQny!^}0u zsc;j7<*&HBq+dh5;-8Bas}Nu!pN&zCXa9KV`H_KS%$@Lesj5ahVOBGHL_OQvVfC%A zq)eOcH#&tZa5Uf5vo#=An#i3S6ixgXOk%se!WJk46HI(_)e2D#Er<+O^Q79)GWdtr z{>d@IpnQagNj(0xz* z?UWR*hPQ8H7*ns-7-pJYd~uaOp))~!u8-xIXdm%@Lmn~I4rziqa%q9`V(wwn?(MOc zlS;Q00j){Qc!%Z|!eA{jMXK4oZJ|}2UY%5&{?gZ7vGSe)s7wzy+4*$Lz3^+Nj?)FA z4v4Ax5N`RnCDG}#rUpaK0=m)Zz!btKMw>I-KiJ@)!LtvWhS_VZg9AGX_ci#bUq-6a z`2dKeA@Igvf;aaU>4G)%#KW6z3iKQ{@i=A-uXso zI=%9tShz;WaqsM4X)&Nv3A{h_F3qSs=1TY8Z0fOV#+DQuhc@Q=leOk48_o@tZM8VE z3>I;5Cim@t9M}Zb{GoE}c8sS4D)&HiK;jSNA!DideCpDUKlNdCHOG9`yEOgy@Fav&k7G80*4T6a^v zzNN(?;;CfWE*$yCM1)bKkw;#eP3d-QcYtV;FZ1=`-8&*~J>0=ErLA-E^_vDID|fY! zBxyaRI5hFp^p0}rj&p=B)4=*Et)EQFL`&|zuC$qg!#BE;RDYLx9sy*8Jd*DZQ+~v( z$>}QabT6G_Aj79wpz8TKPrbM%e1xa){S$8qTw3u*3(ws_+*2=NrHuMsMze>qYlyss zr5sP?q>aCwopy@Guknb1d#d!vJD?b7iV@t2Z|FG8v@kn;1f$VciJ-y(OJ+>Pw1!nv zj=;7}+i_VT-)UA6ugo+L%pBIU0p`pkRM({GT(MMk_d|ITq(sFZ1jZY`Y|FFTyl)4E zSc+m$WUW>j1FTd*SVdOLifW*l2q3Z&!6)}knUgo%i_OCC)jq&YTc9u)vWqPGcDN~@ z?q_dUgIS>ppYMcUV@=BPCB!mI$FuLYknkg{yo9gpsSuTAZ)JE=fpX~nMA?TixS<1i zOCN_{mCp4J*!nVDkSAW?%%Ov^kf8+PPe}lI;;*;?Fe{Ez&NP~ta1A=K15;0BqD+FN z5yVezwUpy;^I4V|R$T%zZ{n0j^?6Vsd0EW$O9r;r6PS%&C8>oDzPfG3-OS*pCR6sl zs!prp1Xrov4jxg)ETe3ejT9FGA5}ZesGRNSl%YR1Q1R$0T*H1hlj}auToQco>|;8; z&WTFEAUcpnW3}JYoaAW+yP~CSRuQU!d&<93Z|iOzp?O@0#~cZa}=K8D3R;5=0JR{*523+)tOx@ZSLaXQWqm4ct(zsoQ}DIt$NKba4)UpRhLxZ zLtUQF4YcuQlTFVQD~D1Sdd|Y~PLA+vh$8> zzfKm4SCqf;)-&vd-a}uwhA#=saG0@=i!%@=ei??Qy?idR)_Y=*rS+PZ!=vLsC&(ag zdT13Jx0nxLfZg|y0h{B~51Y7Ns39-DOUPpd+Fw_0^5t&VJ0rXODOo+w5k48Ih?3jm z+^f1*hq02&8y6xf}fSAo5LkwnOk8GQ0-4izMUeI6%zUTJpwatO@b`*}(~3+4H!y-o3o z+4mn^pPiTu6$>ogY$e=khK5-Mc~83xL&W`bTa0I?x9Q8b3ydG zrd~(5W9zQ4sJ<$Gto{5x$6>dj)S^!Uw$3-i`*Ub#ukx`x)R3)ed!Ha!CX!g1P9Es+ zZYNQnk8Dwleyc-ZP-?4#=0F4~3V?)`)wPQ=iQ}!GxF{Pbxy&zwRVy!K$PS_cO5fsXF+qtO;kfa(AcFjw-zfl zjtcb0YmAPU?{qjrKhnsj3!CWe&RH50ju}j03WPOVx^a64R_X=>)UlE&V0#zFON`D` zU*DUrq4wflcwVNv`>rQTXp@$4pqt8GvQmz72I9rXl(8>Kz_bw!Fi-O|UIHys6r>WA zjv5548wkK$;bVYJCI#|K)sAZNEciX-9vD!`g$Ff~Hh;>K${O{U@+&c-<@J2TP(w|b zRm3HSq{L}ow&^FRBOrRpzi{sU73Bfj1hF zS>!F)LHhE+Gs)2^Y7cb0;(|6}$9Ue0+UL8*GJW@KiQ1I*?Bg{~mWctxR@0;JKj?i{ zp~j6BFIYDhx;*IF$8dDuoreNwJuyKsT*J)F>~8J6_01SfI%Z0QHD^K$;{p&KUQFOeXq13%;;pwZ7$!yb?UM~Pt(Qie& zwx>MbC4ko0CzVlElRz{xI6ss3@l-7xjPu}~9Fh^8^xf%=`WlRSOb?2@3q#DzGL>at zpfQoElUh7cebLGT8R;8&JvuwjZ*PHLi3xJNM#lL{*wlzOjl384(YaTLwCc9DYz{i; zsv@Ji_VLtHNWyCYw4#*{8x6Tc-#RCto9@dTzjp#5d5X92z1MY@zNjQMGqc++R@K+V zCjiG$Q8fFOOIP34w+%O(+UJl}(09$!bgV5e)8i8ku(=@zPh}}xyLRoxe1YR=$ZjLI zqhq<s)YE>e-0aAVn=)m2I;+gIm(a~OCM7MO z)1kwCmaVk%+;PnT5@P?CN^x)q8f$&~vnUmrQ1BpH(nP7schsKmQ^TWYqZnJP0)z*H zlhN=Xdd@KJHbpMsW@gj(Ls610Ju=icyjb04QrxJI4?OlY@k>wUxRO$9a!K9VD0^Vz zm9BSpI6UUhe~2iZ*Vk>nDIOtHY(LQ+N<>7InBP+1ZQ@6Jhrx+*v-GBp{;|e}Gl9p3t9ritvEDwQC@{ zt=$Z6jV24=@L|xs_kQ8%SpVKG(V$zTux1H6bYHU%Ly0~t%7?+t{L!}lEjw`|!r7C( zrWB{qL3F(FWe;1asY^*=Q4)3|*x44I&|1m}4Soq6(^%o+MAgK|gPKa<9_Xp$N)J1l zaQ-~`nFZ`N&Z#@MgZu>{g37K2)_6fO(h!#{G1uvR)5Sr1;HZpZk&O*cA&zOH4czvU z)R);GTDwVaH?JW&$;ahxZ8wtEHwMjBGpihz34|+2-didhoWR76LW$f{%qM1S%o>G4 zDc9aZk&>_mNgp7FInEs)KV8Wxl59bu&&b}#5Cm8y*UgZ+i90|hE zP{HwR>E~;~E$T7)=%5&V-xyWpRPTw4M+P#U-FRr(sN(Kk#B?t?Ev=eWYRA4QX}*)$ z=%^1*T^2u-y?S?w*t@>5Zg#rS2=nAFd46xd@TQ|?^Ao*;_wT)VbNs{PK;5u<>HR0f zFdCXI(Fj@?E+i+iZXbn`fM+HJ?s&Q(_vq;8=3ce<+i}j#;v`gIkPx6_zO~u+X|*!b z7J@{ksa$2-_8}$1i!P<-6*j-D(;^OHpf*59w=eSMQhE7UH;)#|5u_I$k}*%r!!e+%lmu(u zP8bpYbhn>b=TumTyu{lkKo!9r6 z??sK%O&8kQO+7LsR%E|nA41Yx$vX9D3yi0D&Ny^|=&dXQy|q#@)^S^Vr5{5Lo97%c zAY3VlL`Y$>7+hgYCQ>ELTo?Bqca18m#m9XzQJiX5s*71UTbzc%r^?!o&#D#-6g@H) z#sY4-dPs`G_t;IpalaXUv@7>{mCH6#SZ`teb-e>SIX1@=NsRI_%@P%JPsLeXo#=fp z@FB&`bgPQt+XM4G1D-cLy1R<>eHl{6d?xvGG!`FjEA*F>k)vur;EXD+v)O2CE0#a$}T6-#c*t{cxjGHa4V(MOK6 z&gpap$K_f|Q%OY8lP9<- z^Cvxb=9-MndEhnC^o*hmT;+M){dwK9snpLC*hfTTV`~#)4!_Tp=}lFU;F!|xx@%XB zS4_)w5^6&WY7<0NT4%}j45e-tmYtyQe5k6y`AH@CBMEGv2Bv5-?Jcp>fj8j(li--x zONxM131)n8?&X0gLc(WfAczL4C^qWYiJBVy=bhrLn#qLs*?A9H_!Z9gMH66R?kieZ zrA`5TR!y{>YUZ`S)!A07oL<@eIJA!WRy$D& zpN9y{6YX#Y;BwiGLpNI8s{^{JpEh5`{;6EiHuJMU^$k%T_^`EOBHzU+_Fg`Nq6`c- z;!#^R{R%_Uu+ohH|F?L3y$tOUJ@x_-KW7@BR`uK7B3Fur`v@8gGSW2~Or%8+1wFu(3Mx zvC2U)6GkT0_a%tuNMXs^oH`a-msv`6c2mgC0JH>}elWD&$rvZP=4 zoZ6+3FoFplWF$3Evnz11tNY3(nlX{0bt>*n#~RKttH)36c=`9%A6 zc?6el3 zT8)S~jOsm$Xmpz1%S_}KVeVkE_#tK@17@4W+ge&SeX4$md5dpAB=3+fb!jIR&iLF5 zW+f&Cg0@f-pO^7UOvVJZz=CeF?-&zcvwg07>XYS2Q^p{jlq1S9%+=_jML0lcQX^$B z`&eyt%qdCeRDoSop5i4MP83NqEo;6NW;kz^$rfe5;81kTixietZr|6me|{wFD2jKl zn(BoQg?I1d>c}qoFzB7mcowB9j$7nB4lEImx60NRJN%4Vqh^SWbKlgaaO{Y`osb~A z>);9UiD=)Kz>dc<15OZcM~28S4aA^zyH6F2cL?UM#sWB|GLZ-pQikcrirbxun;5cv z2`oANTjD!_%__1+h0EN#d&d2|wJ%$Q-opKOz2-uDuQ2NAOrblq-7T$>`O3jL&mGI0 zCiw@P4c{F{_%bwB0|g|p$f3<8nMi#{eG40Ww0I&zs$J98_Yh%lnndsNX= z=WSZ`p5saUD1e|kAX36{HVgXJoRf^0tO&?aBB`mW9uOe zi4Q)2h|$+P_6aBnA_U}58GQ6#MvH2+w6vVRAO$p`aNn)FlZ;|Ttgh|!v;h=cIW_|< zxs7DdOg7wQPf2Fvz@>E(OD$FyvfXU!VN#Z%8e?413$!>0q}5 zQ8dSFw?)SFb$^%`_(1Bp^;!ZuZE0}i*$UB`*`&;#jW&QpBL~G&WRjnJ@xHa>!^c%4 z`H4hahTkM<$Mc13ztkeXW<;gTOt${0*Y>C}y~T+oA1DF_ ziMu=*c;afx=RS15>>zjR>@{J0KlC_W-0{6Ac2xDoAz|*RPT{FbCO|dr`#e+fz}Mqh zi3(9rIUP*-#O4-hf@Yw#R#clSZ6$@h^NB$tzV-F!O_wq=n5T8+sS@Zu|xr9BE9jA106RSFWWub>V9AUgb%~Q z^Ose-^y2DfdBu!`sp(~hW(prtZ=awl)>&WWBJVfQi= zd2Cs(wkN>D>iB$H+pek7&~w$@z?Nt65!wh`>m)t$K%N-R`8#66;6af#-IC53MVL=M z%u;*iM|=Tcp7*q?DReUG;(5&DOGL)1z-sw0B=a@~C~cuZigr`xJPg_|E5m?AWj^<& zGMp>Gg*;?L@}vV-tWI|xST-tg_k3c+BEo^T7AC%hgzCIBooG1d+y{;$4+|mN-w9Sk zNRwmS-CKey-GgMGWqhR_&0~1KXWj}Gr1y{k@wCdQgKamX_`Vwp>RTD&0!FWNS2tO@ z>AiUDO-47iDMZzmYLNkV&)Fm>u4_N`!@K)MxT51;a1Dt@GcYa^g30%e?#b6VIsCFY zf(KIf8w24QN~eL5OtO!>OpOhAIJm{sln;ViA9w?}JEdP|6e%>=ZHa$I9D98H*fiP! zX8p;BA^jwhLPuXlzR18f&|j4t6Y&|Tdnoe8FmgC>kox)cbc31s7j=~F4{6I{=x#h5 zQ3iAL-9u@DL>Wj}JKU_Lq}UT3D($sQMX}3lRo9|80&XoHNq8&3Ii&CQ`hxvtCAIfw zdoCObC9>A5Ij29nkYoDxH9smSW@|)=B&&T>3O146qF3koqZy}Uom<~nt6;a}(u~|KY%_XOacz$PRpt%OE<5qa zBi(^P;18uf)S>peDdOPCeS&9RT*z-_{&aNU0EeNYI>BbPugTHE*a`#WwS{0lk_ncUgWq9CG!x={Ph(K?dPjvdjG zF1IpX4cAJzrjHLz9vmZQO|~PCFPo+_Zbhjdym&&;=Hf?vXm{9(kQVN%?%E zPP9cNBh2lpy;VCq<@tt0n1$w{qFQ*+4Zgiy6r@ad%5RCgwa{4hGbUe~GJj1dPM z&LlNX`e|C%ASs^=sW>p5oD6zf4gtnYx79gD3e1qgLrQT%c$-SSFnJrv<(JA#G7vF# zt2Q)l^X&sjjdQNpTsFs0`t;TYcEBHn@9_5GF!qzBJ~iMu?I`ZB*jhbkqI)N+V`~?8 zkFEpP1;wD5@%^DQDopfpVx&1L;ja$eg`KR51Lo?H{p!~_XhqP$z-GNI^VWT~UBF>T z+ok7RBr4RZ>*rSi!iY_~*q*zp!J9jOj%)*A{{2 zI6_MUCj2_r?7HoF{*BqKL?cm$ozeiuefC1CBa)}d@$;wIsuxj$y?OmHf^41B8#Xmv z@(A~SS=JXa9Ig=0u8WljBJ2XOIqaA?ml-PvES%1U_*rsI)$4O8l>M}yU}#4?C5@HQkQcc&+Onl)_UF_K7gC>O_t&KqII_^r|;(sYVH*E>$i?fS%$y@(uYMfKbuuwmW>P>8**^1^%nv+_MWX7978;K7+j-;r0SNEX)6Zy?zLz(gRzQe+onA0@2!yr>!AYKmO;#V~O{g{5 zDvT)8!DfGQ-rn1IwDOZbR~jF(%{DIV@D4qD3rkDES=!uj>BHBZfGfWe#AR3zCYLd| zss>7aG@r~ltT2|cA0E%nhy#Go#nQ<&W$);iM0#U<{}Af=2iBqx45zK&`Au+N(j5gK zw`?Y%v30)4D$}?})Qa;IpuuGpDsLNT#uJH_h-HrqYit!Yw5xUG%m#M`j)>p=RM{lS z9$jma<1p&Uosu&~ncJ;9v=j7Q;zV~Lr2MKrr=za0`P9U4Ap4H7l+AtL0981df&ybn zdv2M}QB(|Ly9rP&vz@#Ad9!r`xd>cfte$E|wc9hrU3O-V-m0Y>qsh`!e8{fIJOwE& zfSn25rQG>g5Z%OwvbL_~n38z^XcP9G@9xT$hn6rHPJl$Ua^K}zyRp3fq#_raV(yV# zuK2eKbMA8S?6bpRW+Bqa6wB%ssq5YrIGLPJRUqn0>*w4C?Sk4(=`0)f89s=u9}L)S zJy0Dh)+U6py0f<{j{rkezPubIs3 ze&f`hw{_tnVjN(a2hiH6##?HOnrEKqWIWSQ&6qvW8oi%1zU<|z?lIq}yG}^bh0Fzm z56>CI?a-llM)$|JXQp~ZUhO$=cXXgaq3-i1I0?*=BQ($h_}@&Y24v;j1{%W- zXkEUFZ9(0x08uBSTvJRwLm<*Lyo#sb1@Qqy*-O@`Hn+)_vhW=8df!I!yGYj^k1v&3 zr^M?Gv~K@^g#}^_#BozSDuMl1qzfSXijH5GGK(>qlW6+OPk!#1%B4cq8w zCT>ylzt5*X@6&jcq$fsr{1(iQ{I1V?R=ol7`CtV~W8X?T&im3EXkKYs7MhG`@?KD~ zz7yV9UtrzU^4tUGCjxw}JF+8HB^h8!(#d{r%@=%4;^|{@alVk6J4tltZggd^5iLYU zcLIMv=@BpB!MzI;Ck}3u#j_}E08cNZQfnDLx#{$h}LN~(XP|{Esbc$<@45gX+3GR z32;g|I_h(pJa2ZX@re{(9I>?`V|AMMcAh%8@O0Ely zJrka~6cal^7u8n@+n9MEQXFr2)96!AizXH|R#k8_e1l&?re}_u8fP?VEeDyZCfllWl^e zS@m_dd?C>nAUI3Jy=m;d%;C+J$ow-eX&~+ou+|(m^tCXH~svw=rjZ{NqDMW4k-ici)hjDxcdC45r-(;L-}Y`xCV1y#MbURHSx8S!bfKm2@)0K$l)4; zM~N{RM#)Y&>;?3p{C@q{hxZ!7FW(T{_9_1Wv*cl<_91puQpW+YNVrBCmzGQaQ9$JO zQQ_XIogO)!Xj7H4z-BT-fn(~D-qzACdXLS3|lZTK`1#(3(C{<6A@^RqNR+BrD}PT#;#KX*B=?X*`-z>g}R@L z9B;>kGr&B$WYgeeF+5LN&04ZhL?o~oO3lMpSbesKWfM2)oN zX;q8&({;O;N)^d@sY%G|)I@8zby4njN%EJ>CVF+}Xu{>PdLI(X%Z)Yf-<9@)u(brh zb96HW(Np8pr9Rm|K1-92lp2+f2FBAfVrl346b)Agb(@9RiGjz%hlnKH-TR`yp8gzI z7e;4I8(pgBx`6C@e@Kf&;DWC90go}ej3{7qSWw}1q-j%AFh}pcxB-Tnm>t+lM;A6U zv`I&AG4R;?fec>?YN>3i);>LcAcZ4FIn(sf8sSMv`&sTi8Yary#3w0tIaK}70s1q( zlG;KjOUomE{_hl^aQ?wyfzgf``zS!eGeGc;D4CndP&(}7QltSEXmnA2Z#YR^ zbQVf4d@R;g*KFNK?W&(qZf$Z2W;l9!mOCZ;mX)2^y~&BYhX!Wj7~#7mqTZigq*M&t z6S8H~r`CM|!>XOaC8~KxAGpXPjUG>!zXN)ZgF_;u2U+;6^@?*E42WCmPX-_B+wA+Y znuVEMq(YC?dw*6aAXk`waIR2YVDV4{3;C$8b+TB`beN_*^#z)8mbe(c_vIO~;UkUh zZBhffiJtBqRfJuDO!v3m(mgYC3O!F`?otBx^`*3x7dA4O}i0MOXrGsURAcF8sB6nV(!{V zdllI{d3KKC%*&z{1vasMOU1N)Cwu#=J$1H>U@$0iicrN5KU&R~&Bz8^^&US%M-F3( zIOyULebM|}B$>ofn@6vnRmmzCy~^5EzWc7%CHM4n1VTyFv%^ZvUgQ3=oz#JgA#%gR z*&9q^)7|g#^|EQZkQi_TC)^|}Ja3b0965$EWVZfz?S^Q>%=yaVL*cKUEL&yAO3BN} z?x_?eAAC4`ZYJa$qbKkTaE~!vPbw~c>wNNcL&M&qKzk}sj%E&Vc4=#hKTX3){W^i@ z=4FQL(>{%_1qYsN<(-=90<_c7@x6@+?4h*@h?8eO&z{A=9|KQU4U>;Q>cTEU-f0D| zfNM`_&Js-nR}*_lULJ$W;;l>CT`}7{H%QUE@7}1vZ7Z0TH~1byP0nDDW2to2ws!bg zy0modWP-IWaXfphxB}bMIm(Y8`#@|#rqs9uN6%r4K;;qMff#*`)*}W32dE;^pFk{% z!a%#kA#$_#2A9W?x_3U{FduuaplqMh%WvLI?fw4jVbuyXf>ifrW0L9*lOma|F21qJ zu(A1U4m{mL2Nz>9LNK9-M9$ zAe!ZXa&(a`crdAcm(zO|#+y5y(l4Cr+>|au3L7Vd4I#X*A0Bc@crii;8*;g6DBO&l zGQUIhEZDsG8nS#ChlvE&4FY zowrQGF2KrABi^_Jkp4@pMa(&|8(0=MXe3}H+_Ngu`}-8{$1dUmT%TSzG(Y+rHc>1~ z^Xg`JKutHo?)>j=&`xQA4%8GbY{6cRQy= zYHNepi?Z3QP|R4%|PuL=oF zpGbRs(RXZ5L~5mWec#5q@djNZHFgvAYwqFJ8f;?~*|nSa`zyOo!7gp+Y_X9iY15bG zsOusi7vMRul>dSB*hVBEZ~8Ky3>zIb$yz*9$`Gn0vz6>ogCUouMbqPJPB=nie_Z9A z4O5S*+7;0Cng?Fa$8~SX^8j9Mv&$#}uNS~KeqQ?{nz21BhUMvj7e_|5U4`zc^bbsA zjJ{x5OZi*Pe8BYec6 z&VZZfQ5NLD@z-+Aj3i;ZHxk1zj&5x|(lXWbQZ@7?Cy71`9N;yst4Vt86Ei?^Uy=O6 z5Yh3(t+3N1K{V9bZ7ExC27i*YzRY_#N#0{|Xvh4Nt3o9(`U9j*E{SE=dM}}QsTYzT z;HH>Le9m7?j+<=CH;~nztRpMLElu~1F?Vm77b2v_X+N!Fq}Q97j<&c#(|1NUCTsJ7 zCNc~I?0weUXIJ;gofTmkn(<|qB1vH_kwyF8)7`Aql89$7pN{MiX>V_@udk;lxJZTb zV$OL+mqQa~WGI|YCzf_Dlv^<6H;S>4gYJugK&sGKK#V8F&tEGdy1 zL0z;s`$|oet&)KzRLZl}x`6w$x=NNGbM7h_1$UHy?&+fm0GI%_EZi;VZQ9M%X zP0HI{p6@U`P#4;ya}yCReU1T^myW$^`r=f+Zjo|ZZ7P}p<`_u32)mhfD7d!!y#0K@ zu%gW71H|%u~+&nvMvyYv~b`rI|-6IEjrK^TQIMe-v; z!)@(1YeN@q!zQBuODr#P&7)lcMojyVjN0CdmE}z>&vlI7LDUkhcIOj>u6`Emw8+?? zVBR^Krkh)rM#B@zs?^c3NU-C z++BH{)+!NB+n?*~bLik-tV5dSF)vDVbI>gcmXTEhF zly%J_ko)TH=fTm(gZR0h_4PZBEnCce60gUr2uB8?6V+qF)LK>7ViB zFP?kGOZwa)=aakiB|Fvvex~ss$uFK877MP^mmQkl^A{g*cg-js1L+HYg9{p zcC*`2ncCWKDW3thz>G1)%%^G&URMM3&BF-_9CkcaqB<*7+0xvn`o+wS%+m4@K0Dwm zrpDd;$iVsLp&XE}JzxVz*cK?fqf1&no_$9poi`z=ER(t9h60*KKof0NzWSk*k*yJ! zm?!Id8zz~z#+w0;9qI~^do!G@(z{!8C-EqA5}+>GxwAVlblJJyXFD7k4ZK2z!S;_E zLLwqNcH%Uv>5y-r9jazjy0v62Z_j@Ibmo89dh39wy0-0G5T&F`YG{xa6v?5H?vj== zNCBy#L>i=|r9rw;x|Hq^WN45ax(1N`)?C+pKhOJq-{*hE$n3TEUh9nG_?_va(U98o zva+&uYcfk6?I z6t5j9O)HAXw!1m;2dBkgOYFISOe*DN>Oh*|76Ue67A&Wa@Bxa}gL@62h`9#r$_c=b z^HnYr6XGEWgwfJc5)KbZsiw27%*9|k8vL`SgB^}4UTP_J;3c?ct_)2@jJarYXfsY+=I9i0g=IoV=*{ z=w5>`?CE>lYn~UCk|H7^vK>7fx(F#XD9!o8>v!rr2z^#jHvf;rp_b~yPyMwhV3kQP z)x$1903hfTB@g<$KtrJg^ayo45$<|45|!YqHJ_~Y0{?(NXb%FjL4T4=`9{ejw0)|R zW+|bBaEji@+=kbWgSnIG&7a`6f%*}II?$e>ieJoCP5j)-6Vy%CKH~B`X4J@U7TQZT zcR@a)_!Rec5Xfwx1j|Y5jKwyt9jP@doRyhfY0*)g;)51ud_?&K<0- zzxPvA{Y>}1EPexIX}#%mG;D?SZ}giUG@1rE$b;g)Ie3^cy1~OtkCK+^eH^_T?bw84 z_FpXknW(I?OhL@S-}O{S^0G#2{i=5Bn4+yj?xi;pK*=Ux3I)o@_l+X@G}0r$KbGh; z2#&EdTn1adGx~4v7Y<6ev27r}kK?+cz4K)KtGf>u9;c7k zD|@+5`7Akl_*}tLy#^bSXvY~_?y|4k``B@c@$-fD^WO!RfkHWM?ZJt`RO78a@8b&C zG)aM?+sj40Z3jX7kTE>6xFWVA_;>$ZUiT1UShFl4JXaoC`PeB`<$$Uk&B)<)Melq% z)19hnuX|iR^-$koVWW=@?;5)9KvIEyXu}*Uw>&si*c?a!vc; zpN?Qfa1^oPSCH&(4_2ujO|$0?UfQ}Nsraf^12ce|PAB_#UiSJoNl)DS1)b+DHanmd z#H6v4+W+^JVRGz5M30)UadIq2E?jAyQr7{r1rrVp{%{S%-2qEBS<}>HWN2u3w9Opy zO<5J8nY~(*-qLEyLI@$O#*mWqyV~EPR=EwOTQs)C2w;+*$eU$&+JB1pxhQndu}E(G zU4jhucv#!$l+x(kaA>0q3G2N-Z;pCl$AX<05?=h=20EZ+UIulRHVUY^*CQzLSnuYt zti}1J^G|jlWa>D2H>AH#uPvS2Xf%@>`Ldh>!pF$n`$!%y0$s2&_`}^l_nr-b zV9=8VEJa#*kxZKkiQGh+%`;^Bjwp=P)OJZcxFdzhm{Fck?%3z`kL{0L2ai3EX;XTn z$X?*6hUAOYb%s>Rd<{J7H(alEoEO)0hp)ott#g2}n{3O~a#<_V*5let;;~8;&9m>z zBjdC8Rm^C61pDQCCi_kNW_a7CCX!5_?UoF)lOm4=FIPJ?1@h-NGR3kCw;t~AsHceY zWwh=KoK9Y|pLgS4ezl$b5i`&!&bxCG;Np5!xxrd?oui$)786{|;Qjk~g=_STuQADM zh}L$)b6?A8H|RGX$yY6PQa9I;;=spauhjfMtiaIDgMjeTI2$ut6U*--VfKpe ze%|g;*NR~mdG2?|6ViTWoz1j4G1*h&-Jz9N?_dyV&57qV=puODZsZ*T|!r10E z?_*EcLmh;_#3=VZ;bW^_9n-76GZ9!iXv9hwg zTGI2ZH+*OxMp{{hhp6(xarT+seNvVQcMXLDF_k`P`)i9|m0KD) z2^3@tI!EKu=za8{NlLjb$*GW)3>;k>@|n`n5)wvSSj%H8;gHj47#8%)J7G}cFqLx4 zu@n{S#h?H6j#(cu_Kqi=vXc`2jb&VyBtf2Fr=vO6{Z;#c2$Kyc;uy^svA*Gd)pjNJ z%q;NRTWL$L1wzgE5qHzM4DuBEnDeUOjp*x);A#I7{i8STP?Ky>!J@wbWxM@Lj{R>d zf7>~~j|R{U(Dn%Q@7J9UV9LY$c^9|Ty(B@HyX%AI;R}K8MX#f@&7{>7BemLoSp+3y zZ_A5_J=`U^s-ck=_vIij;GArc#j)cvHnO*Phg&%vTfa;?a5wcGPbe!2q1Q#<-APPC z3PR=!cI`2!M|tsS7i%eU$i(!Y?a)3oRTH_P_QD+6epr&%+V7$K^H|pYS1XWGY!Li> z0D($)x4=U!k|prHAX|Mw;&Z;gc|Q5Q&~}~S!E!q_KEwa|E5rD7yVCK6{cl32&f1!m znrGbKfA9>Rv@KG`XdBtC*394K_wwH=REv@kGqQC)_~?+oOll_P?P=>3TXe=jEd8F*wiyHtaXg|NpnTaYwJMvy~=Mw z=4B-mR*elUhpV!J%FF&IPNat??Y%OLAYoZ{B>mT|>yH zq>C>ZE?@lH@Cgy)G(HCRMDV+u-&M&Ar^#%A?l?^Jd-!pfvPJ+g4=u9xl`O)v9-*-P!WJPvJyq3^v-2(aX-wC;`dMAOYQNk@mv zQ$^h~-#(|k+kM{yE>>MNa`0|fYYdN(OuDhTxuF^KvI38Adw!kGkCthjBG@M*_3It^ zYgzr5fe%>Q_=YAOssp$%}Sk zllk1dGA`rtDC$}L*(V^ct^)mFTLtq1vNJ-O_=*SY)kb;H`Q8#?Zpus&7lWzmj zc8{eAE;OrDTcV8}xkQtqPD?T*sUQUvv)7wx^vRN00UMv!e;(q@SNHhrhuTcf#POTh z?JH9{vaW5jAPak@Ca(iBJ{rVBpyfhu&DhSpJAvYh3oNj>u?G(T7|<8fy*S_La~erm z0ZPgTK;n~;7UqdsXG6HfykmUMXn=t8F}$8EgdEz@~==s_P8pUib=I!$rWEbsU zez+)*NZGbBe~MHxHr$&x<$R|#sqn>4|Dd|0fL*?6CM8`0+uW>tG+=dH$dKA5SjS@g zP`P$Xk9{2xwi59yGqvAN7&f6TE#v)|?h?}>pScHQ;PNcU9}tf`tNsxZP%!3u9`rB} zbJ|o`*=*6V6N82@Oy_Bz9O6(pv=pukf~vnVkNnS~&e69;mSU}=%W}wMQ$hrrw}k^v zf$DU~euZ_R7CyrZc3>MJ!amk$$2~!G1D_fN_^JQz2^&j<5)(VMEk8kdp5zkB@+s z!!+BdlEl*6+c>=s%_>Chtq{#j;k!HrEt_w_4n^{jW(e{NttzbRBK_F%bncrs<&=mQjsCd!G*sJAXJ@~wO1=%XSbm)@%h+Se;IjAfL&lV(JP!!}-v2sTUw7wg2$t=402_*T=Bwd5Z+!4x`b>4iPL zprV*E{*T9R$MPk7TMGq2;&|VhTFAgu4^7p%%-WE&DozX*-hJ zP58Y4j{|TkK4L}$g<6Ct-@~5&*qenNZc>qlt@<02<+ZOT`~wk_F<-~2p?}O*pBe1% z0A|Z>&q_-jlix8`gAP1Y6<_-r@0V|crHabCJPA_lwu^R*@NHnV9A>ur>4Foo&ZkB2 zg!$#9)nIQ8sXQWaJ7|4fv;RZ}@{a(}SU+S#ml$nzq9bYrk*`i!xmj5?tl%|lC)czKf zb8jbjNa@3WbZQBAY`!P}lO@op;l9F`M!$zzQ)9vo+=)$q#NbX9bWBWjYz19H|A*g< zhzptjDIh#^n;87>fB*yYLnkY9j0U>XPM=i4%|Qpj z08lTh98;KjNCDQ43RAt<1tRz8TjsTj+uj`eMw&~Mu~QcrO8tz2`KWw(s)*7?gF48^ zW0ZMl818bmJL|4t)Es@RF1$u+(CXdr)(;3&l5frYu1_|PD;n0RP}(s{`Pnq5Zc3>F z?NK-6e`JEOL?DkQWC0EipPnUAWIpQlQE z4-v}v3MdP(-&1tho$~aGf(eI1UzlPgkFYvpKQ#~n2ZMNXR$v4Jve4d5Dimz;!|=He zQpsC1^UK&$l-9Nz)-o^3eJ%fnaZTHWA6=^eMXtx^veA$vloZL=)-Vi6p{P9$mwwz9 zsHNN7xS5$XI9tQ|ewS<<_Ry(&A(v{-k2eOOXLC#rM#zZUe=O}GQJLWNylY+wRPK00 zu{q7_?WZ8+<>ISl^It|8N0h3zKy`81Se7OMLn#OpLA4CnXAJf*mdRoG_JzdPv36|n zm>W+BiV|9X#?wsda2uT!V1#W-JS!h=c3>-7tasN~5Un=+Vp}W=rMHVtDyYN53TJ;~ zabsS?Xh^FGA6JhVrQ6zvP|id1#u`RbR)7f?p#z7z)fduJ9y}`Gt~U1p^pl_PbTx+T&DY`h|#Rj ziUmW>n&<oL}`FYB5L_!G^pgRIJaI+vtQi{>fiL$hCTcQx(g`1wgB8MDv z{?8O=;+}XS3r7Pm`f8J+;Ac;XIXbAZq=!k=#mvD8Cr@yRx@qa344@&OKR1O)t2gYA zrkOPW1r&)h%jOu#gBLt|3#L%7`5zeH=x6jQb64u0pRXBR%W!;J6AgEsna}*}bN6#O zN50_h`RT}U2(iL1RTg+K21knI=Rim(x|@Kkhv-#LzWDi3{QU;UU0>nm219Wlk900y z>oy|39lATB_04H(^o&1HQ_ph4w9aRUdUM60i&elf=v~S$dA|#c}dt`}kam6f1?d|U# zEyN0}Qyt?3DgVky1M*C6WTA%T#<1|_*SJqfQLufFHN;OCJ;ex6&Ha*&0cts8TucpXu+Y7*zd=6`_F!&w1A>%&SF!4Nn0Q@a)xImFM%(Zx?C3HNwU zJQhl=QbXXErVeAi>XXi!nHw}Jz;NIHuV0b@fQkGcV0>mq7H;7ChBkh@*KGc-Fv~oG z`1YMu3yttj#U8{jozvH2*2$C*5<)AGN#gxE#HHv*j^6i54mW>^rnjYwF$?-4ydwnP-GjK(dBq}^f{ync zk$9dzh?(W1cQx?= zrhGxOceXu$)*R^U5;!V!QNr%P7`=slr|z}qfE^Ug-Oq%4?$`MmcV0`gn;dq~Lg0@X z68;d#{LHmZFW&sse3&gCge}^Mi7ro=Eq^ab-wnU_v^9RZgvv&C2K@LAY&@CcBLp@h z@})z0Pxvs!<*t8BE!E031_7&tW6Gl-2(LQb)K?428$ERv50f=U~;Hdk2Yko*_6KQL}1{^qwEgt z=CHcgpo{kC^$}wFL?5l&RkO~q^S7>PCXM|bWju(wa?r6HB=H@K6ZdaC{VuwPBXQ;F zLMv{&jP|=Xw&SEO-)1zfTD~$>CpZ*Y&lS9=9bMTta%>8nm3Z)uXQ4w|ZiwKt2n zGOokqbvrupgqb<&ftwt2E?H29Rq5R_dVioVt#uD=Dkv1XbI~Zcv>zQ^5{Ef?5}xXX zAu)Am*;doqA80Std4T(*x^4Dwo^~>~XNWKNnG~XryfF`WAB5X|Kdz93{7&(HN=20b zRB)`>n9}~x#J!}yZJF`}7|ANxMnFRc^5Q9(lWbxku)~x`x*-ySTmPU%Up8`IHK51r zrleNj0V`&uns0+2Xs^iB&7EjJ12HUN-_q_HOQ^*TDD(QxK1Y!ckt)+n*rXr9;S-|+ zT9$VcL2ouQq7mnzNcjBlz-;%)onHkN^$j(SwICm*`m95A-4VC`2M^OY=8wth#*k%G z!R$G?actMny`{#`Z4yn_7I}Ouvc%><$Y2*I*HQ!R-OYy4RJN&;!ZM)OS80?V0jhWw zI0$SA-x&&g1+pg!1kl*CZDjhjW;NSsMP+0_;wa34M9sO2O#kb^pP4oL8oc6ysfs3- z(R2IRT2+*eljP z?r43Bve9WVi%63nNcWBrPHpht5tsyMFFR5%@8^{__KQt@c=Ob{)Bm7S)Ai<(bZ27j zSuFy?QBSaKFfe~BK*PnyFZm~rHX<=|G{D!@ z8+mzDj&>Y_<#mP(b6sb^O`h7`O8PXdw)MdLwS`L!(N#R}WIwMrCkOR1A?z`oanDxE z*E3Tz88xTvVV8!Z1pikcF#V0 z^0j3*z6@@yNW$zELZTw(TX9|Dy$`7ljqC-U^%hcu44qK60)O0hpSh7!x~e0;gWD1X0$4xYIZym;8Kd7bmcgH3LjUCth)y5X!tRbkl zPy7fE6`bqq>;Hq1c>dk0k2rx~KsH&>U6vqK{k!@(f5P&bT*3CIb0Nv?`$HW`<*$Cd&7v(LdhA2`cCB;Tj3%E(p zXc9G{pWkm0@)9Cez8-i9s^$L%^LsJpKKova%3jEqS8D@Fsp8*1_XDvT+u4HGzLd*1 zXpT<2CgfD87L$zlLr#CV{;lt)pZE7Szc7zoKAL4C5k7gh>XjM0pOMCGXRUtgZ_H~- z7EnD@HMa;4d1e~sJ>avKX7&`7Naa>N%`mN`TLcYQewTHXDxhGEGzExbl*0@ngoC|` zvLXSi4<`R~;wX`PuWYMe0!!c%UTr{xsXhC&n^V3wVX7GM`(#%22&>MqeujzRDBp*j zsXI`$yOd`#xstjyp{P{E!I=SB&vW}uur3IKw2d}r(;X&l%=@i8XEo@Cg?{nsuik;O z065i!T0=gL{9Q^!?M9kQM3#$Bi<8l$%mH|MGls$Av*hXlF#{oSKFdp2nx?c;Zmjb# zl3L8+KDJCTS>)KXq&Es!Li7gcD*ZGNMdnV`thnfV*wM3vmry~sw($T|X9niWjBroo?}RpCNhw_ux;p z)5`M|wD4=`mM5<2y3qz6W)>qrTO4QXbMm`ed-6o%HzrnNoAohz%`P^_136c`(Ofo; z&pRO)I4HNALMy7j&9%Pn_EGYIi9(Vy4wR4A0i&bKNqc&1i~*ONEA+=q`};rZvp-dL ze&s2T3l^KMSzkAsz08IUEU^lNj;^o;PnoNq4pnhWn~QmLu5OK4&LUv!o}T?v=x~%e zdGsp;YAUUg-%zBmnxw3-@re#iXabVN2ZaUu^3=0Ytb2WI`7B9;dZMq_{U4j}nEeOu z@^c)Q)HH8q{cD_>lEixrqV;%fH9oJ;w9ch}hX3;TEr+pvI%7Y@_vo83t*}Yj?HZq+ zPH~8Ca~;ukH1fz_0JO92SF?bD>SSC7ib_h+A1X#s|Ky+giBs1hbGl%HW(CzH697bz z9_RD78oYw^fhh2$BoFOLjAjKTnE^8RA=K|Ub@6FC;f$ovbc0I)b_AeVAR@n|+xC=D zkvrH4Tq!{VzZ*`0T+uP3n9*(<2seZuy&vF}A3^ohhXudZt^^xomRtDtO06d4%C|&c zH7D?c_s=89iSSpx;8tzY=k1nNez$w{NZoK@*yqomgxNC(w5mGFd5W@o7JYUlSvY9i zJiRVmy?ouM%Y;%KAUN^IJ<@cHPPWOe=A6UJv{vz|8#KF7Xlp}W_E)q z!`PGryv!(x+}4h7alZ*9VD7xn*$%`%VsZyE44L=PKogD>|A;Bl3!?w4!E&HL1JVK| z28~at{YvHoo}VQjf}%w=U2Z4$e7p8Pf4Gt?ugeRHUhrCCyI~A#@%B?9s=xOLr=*ou+UW6KV7`rugR;+WLeY7g^u8Bk zzp5GcpayZ*9TCLB4jN>K+L;#3_8VX05+@n=bH4O@kg=){VV;WQ6!>OQ=IX>1}76Ui2J0w!4A=>DBjD z#Pf|$=2W(kOVrz^mcBQA&>Z0d$inFB?vSOAaNVy?GA&nu8K9%{&}d;wG`T!jxV6d< zmD0Ljziqp+(9ZN;Yr#9}oV`ZRRu1AN`}*E^>R^o>&v|j?+S$XU#{1$x#Nevm|JZX? z4ah2lLtWhzzO7G53CQA|{q7HK(CKpKlw>r1_{TKQ`!S^pdj-V4f*IYK1zBp^VmLE9 zi`(c61Zd$&>2Z=$C@dYNJl0z&hAJ20Q2!4&(7!(eimg1VGX{R52njMH{uCp}qW4#K zL8ms=sit}<55fdXo6&QL35n!HUY&{Fb+)mMEM0u^=v&h%BtEyNgn$<$Eo3L3HJ$o) z7f&RArC0$Gv?kWE_v>3UH02=nK@!aNzKIgd1!bG)VO;xok{fX+ok*e#k5&19t|q9q zfMBL0_j!v|Glzg$hM2HI-SYaY<6?fw!rVXspr@$3mo3b^B=e8`S}z6URH%ZL#zWL$ zp@m={oT-8zF=hd4+lT~jKtKRLK%q!2j{{}Kvv@=YRQPrqeHl9tmrRO&>dignKt<3? zrl-v(dyeq08wRzNuvvLv+`$sEq$>FoGQwUaz#2cKjL=l8q-&r0Na1x9V)h3Ln0@*} z%O6z$8dIvWTAMgD4HexhcxqGruNRs!X*5@zQow;OIkxZ+-gZ;-eU(`e_YjwO(_!7pymApZwZ_MDfc}8!!YO(Kk4fjjoFgEYOv5203 zUJ(J%%00~J+>_bTBbhfyHYo@$&B@8hbEGhGROW7k_*~qvnbb*!lzMMjfQ>=z#wXe+ zG7#+H4^&_N5HbgF?Qg85^3i6%wlS8QAx>C-a8^0Pp`MMopoqn5TUKE)rFWB*zR3U{ zL`LoDNZ`3A;Kf8ms3@Tr$^TV0T_J^Oz-FUPK>Y;Q?C(bu;@WvLFDbk+S!PNY$kSB4 zt|Ddp5KRdRs3`?f4JW{lss_r^s-G2sMU39!pQ(!%>%P5ad4M z>ar+#b-q=F#~OC{Z>pk1s26ngOe&7g)|94>zym9LA9~FQe!IbeRH1aD?>H)K3;=(r zkObq+rWJE#eWpLaL`|@Izgnj5K%CQ4&ZXroFNhV!3i$Hj=`Q+JVnK(Tl=oj5*GfJ=HfUTN5UbvyknX%bTjT|7 z>ZgoR5JDl1BVDL7p;Exzk0IO>S+w}frSF5Nnjtmd{BK5F(f5}c)$#16e+77Y^^z}z zf+VILb7tO$a@s#Jj&&-zfyTMzLJfO+N+@ssc0db!Wc<=gf^?B^<8YYFgbJdyL9>*({9DoEC(l4v-`Qkt2pq9+qZiFydQ7IYFv z?@4I`_9?LOThlDcB$IbiNB|}HhYtJ^aBz>L%9zQ&Ad|f_%lT&Li$K0as5pVx!3TD^ zCXnMYWb1Rhudmo92C2qCS|`mE=D|O})ELj}v#IP1+%XCOX^S1C zm5tL(zn8`BPqoI_D?ULHS~}zNLPjGKpC7Z_NdQd6GvR>`1bC<@6ZBjDhnMES5eI;E2;CjYhADuP z`?3Lc`Aw#WFc_Xxq z0V(;2{qztBG8O&&{2o1_qN4gF6sTk(*y1A;l%au~O2+ssgSxD7yDH2%0J`a>Ci#84 zBph~S_t#W6S|g2sx1U`*|KW%l=>82rldZz=U+(hm>-r2388gsdlS)%9XkJT z(MQ3;%c1;5RlCYc5QXVOEh4U@1XnfR) zWbTg_wbg{Xu7soz3}>s-e&dyX#E)oz#Bfz*a`qB;rU;RHnV)D9@+fK_>{pn7+CVez z86(l@ODtKpSPZ1C*WpqV=sqCGn`Qn4;lwJQ-LJWqk%~eQnp+6bL*{`|R_5q9$bbQ8 zKe8(-M!Z9$pZ2tpJx2n=XRy%hXURj63!eD8D@rveg+e_+=~j-LO=GTCL+YVb`#PUH}WHW?=r zQ*ie5%HEL{i7GwJcJGmFr2AfM9vy;P@F0TPb;plTpMMQeRpLCo9ouKxL`5YVLEw83 zz^Z~TL43gc!trmwI--vmNq;psylWW(Cli%dueBO{fhpnC)B3EQP5!*By;XtU6kTyD zPGH9sByaqHV);F*+;dtI!@LWu_4l!umuZ;Ubh@Ow`)2b2E#OZ&{4PHH;EB02qPiN< zae44HQW^+wwFRxna|k-=cJ`-b!83H|t0qK+y$ZlE#STEGbi%*n$*e(%@%f!LCE44y zIRVWRGmh&RnZF52A3+Upltgw8ETr#{=Y4GESV`hjDYKQzz~0sw0WoD zR_+55P(L&aSi&x}q(i!1s&`b_I0zF246R3#`>zHy?_++pc7j(=F<|cCkDZ7;n znn2=NR1nPkR^5$+dHV*(riae28CbHUW0LT6iNMnSYyg{u&(1>2?CP@AqeMLeCx^e}i#p*AZXEEG{h2k=il<0}NRA@qIM{q4jJbEZwKf zF%M8Y^uAe{|ogFEWY1g?&OzZ%d#MWlzV$1Fpkp_b#2z4 z9v7h0z{$C6Y~RJgFo@;B4vw$P|0gwCVLqAZVQa!&(F|$yF8VtZhyOv=bNxL4fqhi+ z-FP(r!azvYQikz;3XB2`O^oHaI8Ge94}E~&H{D6wWXo!af9H#;0zDc?1y?Jv+;8`+ z4X%)>T0XsjG{fucfCS-0^3eNr?x4u-oe#cspUI_&}r!*!^la?b2 zbx|*WREfq4`pGN{v3KZ}@%u~FQ}|hI6@eB6ZK)a?oB0ze-~X>(!hnAL{XYTE_VnW0 z2tTIOl3+f4b*}HiSlFv-cRcTO=b!eDe;XcXi6eZig}_FOP~}X#wr&7$w^Y~40Y^reulTt%;vB?=yemD?1T1?Xh5MBtYotK`5H*Yp zOjrBp8k?r)bo0aTTanT5?cyzaBtT(y9K`ndODY3x%P)-6{RMWYkzjwt?S`=P(O(Y^ z^R9DfXC9b1BqaI4i@yScSV0^$8$mG#%$i}#^sYt?3qx_-`zc?i5tXEXR3rbRUOA>r zoij_%F=~4O^AG@IuZH``oj{Bo&)#x#Iu27lLkT^I{zF0VWu1K@o!KecIbxMB=wbUe zbsT6__PXT%Q2Jwx(Yt2iTv+~L=5!XPb%v4@>#^C9tECdI;q3q9(tEpqRY?es6b! za-R2tL&i?JfI9z93`hsVe#nMn7Qfb$tN@um;pD1Qf(ItVDkV zSW13Dpr^I~Q%3fA0!WSm9y<^d;6N3P$!28HF-cH7mo8Em=|AuL!0mU%#)T;!BeydJ z$J;vVj83uU<5l~J(Vrrj9R%6yTXQ;jseaQT z>78A-CRJAd?NJhRnhd3=tcWQF9h{ZjCjgp+f&^naLtj9dOo(%15ss zqA-A#Bl9H4esIRblg`FUIst(*JC9#f#$)t%9bLi3`ua(a2i^dpAsE9%;9nn@am1jP z@}vRmrmOj>4#k6gE|YRBO8`K*`o=UJC@fO?4QdObVarbi1SrQa?HMir8sV58sGBlR zw&4S)yaL5=`X%g@oLf++Jn~Z!3^4#dF*R>hHV0MY#R*TCm;VPo(y9HYq*~GCG!F%Q z1QX)CYk{&PT0ou=l%@cg;y>RO&|(7~oPuDui=}@|`3ra`KbyA7KFkax{3ZJ#i-BZXB zhC()*Uofy8<$#G`Y&JPS{*NOAzKwZ(HJlhVu1%JLN9vU}LUGh$G`JLjn%VxVf!WLlCWV0sxUM3K4 zYt;f!9Jtmad)|}%Y#>DhuiH(HDz4%k6vVo`yj-Vft;yiu$s_@s%ILyiI8NLX5nz}> z?`k|;MvswXCz1q?pFForO{Gr*KlK0sw=%phU8V>Z`X5Tv6dG7YT479P|Fr)ANE5W9 z<;21yD#NkbRD$zIwOMfuI^Q066^0%NKLy#S0gyIn>kXvT_r*7kYI9`)%!pjZ%IAM3 zeY781Z1b~$>l&mG3f=@fKs5dkKyxg_0xQX3krMGt5yZ^dC^M8`h8#F8{xusVy#aqs z+#<$eZd_$tq>PRq$qZ(|`4gfP3Lm=iv%w>X9XXf=mR!(5ECOSh^*=NyCGJJM%&$E@ z=kbdkU~-$IsxTAy*eVg$@!b;OwLnev7?HSb-jHp*-gO)R08GOeMIO`U7a;1R>qU9I zQUq-Eq`DOh3kH&SlZ+f&{)xg-QVG_`$jEzqW2XA0=3pcn7#C(1D}ygA3-n=D-59sl z1Br?ZaG~DSmpzyge}6Vte6w=_5NT`+{Mncf3?H_O9>O1hhwKBh1{FqsF-lDIs~+*$ z4zTr@EAZ_Bv;7eTx+X~Qj!r84OaS3)xzAU za8d^r9B3^1;Al$tBiqSRKHHFvQ-ptkbd^k94ms@OpfJx3O#u@1dS45yK2XSt0n1JL zndg#682r~t4t>P0-+{Y9g8A`&tmJ)kO@KQgaDtb}%TWn*3~cw{;ffx1lBiC_1j_*7 z{QSb+KCj<-1QGi)`x&d?Z!#@AE(apgKi~ZgVrua540};N?~t4jY{oE$)dTVHxHNwYa2QsiIh4C^f1ivO37ve;_yRy~+P=pTFXQBxo1bg3Gi1eJ+4NLm1O>8iDY9*T72T|< zz4W~)xF9W1chH?TaxK|AZPJ=_+cRk0(8=4YyWODKV-ufCzFC#cltc@d&4MR*oevbV6wB zzBHVAX_9~!P925w;R7DJ8&9Q@oY}irt?vp|jB;{(!i>2pUz1}tiasisRt`KxjaS9P z!wbVA5P)^t*+k#WfSYVe2wfu=nw-@tRx6f_J(*y+pIPzzw}K)wh1fb4u@4@V$yH&F z(t3sb*gN5i@0=}MO`0TXp^${Sg+&^lJh;J8(os*T-_T56TesNPIZpV-Gx28%TaVF1 z7iI7%b`{(lt`|NaoW5ShU}H_B-H}xvBFeoZLG%G}sO{+at=!@I;D{A(0taIdd#d3_ zH51IEaj00gBrt~kSwaNwavL&_*TB$9KU!-nmp@z%-mB+AJ1nwY+AinUP^1F$ZDf8_ zcQ=KUw99SyS65K$IN89%YvU&jIcGLip>%5cZBx;da^J*Q zahT7pta~yx6}y*}Y@{(({ltuPo-Dz*E>i+hftJ%2iLj5?{^9W@X|)7C+a~}UoLq>t zluUo7YZD3CbJPVI5uYz9)8!7YEEOF&H(1~ZDcNZEwy`T7*c_uRE3BSJTZD>zjL^Nr z@DT-uq$EQO)yU}RLe<@53{zx$>Wb-rU;I$*eY}f8uCsvgqEm{?KkO9g-;bEa!x4O! zC0Pl+W$V1&#_N7pJ$|8dQNJD9if`W~Y|A6e_tZ|5r;fl#Nu%i8mKs)#y+u17v&aSZ zgoXa^oF^7-6Q^5^qocyfyN$YgXF&;#v(v66FDAmM*uOf)Ih;DWRTUY$VwBrhS}ix~ zaud>KiR6F{cIPi(!X`)^cX@8pxmiEHAVg6RF|8b}FHa5qOk>(y!TvF6P{bY)mSJU? zW;jdDIY9c_{|=Ur(o3^jEbCvwp^zuV2{(_~;WB!Gk_}>4r{c2etvwuM&N` zMm?F*u02N~EtZa2R{YhYn$e2Z)~M;WZP)_L_tovIR3El&bZIhrx3boXE>{*!OU*f z?13nIxd%dbF<$rB4@UG>@(xBC{Rdnwwnz6xqbt?dvij|!hLTvqj)!&}?0!K^BOoWF=3-9_WX z;NRrh-KG;zw^@B8d?PLgxVILi2H(1sd@~eR0ug+v(cIK;)_8R<%$AXD)d@Iv^>3-Z z-qxt$mFW#E!L9$kt7@a#^h{CYYFW52J6bgxMTs2zS3nOv7j&S^#C$=wpOqV@==Kc^ zG;R=+Mvi&TezX%EJ;IJqTXpyL`&QV z`J9xPkwwfNq9+_Z#y#6OTaALeLRa4?zp>V|54q9T`c}g_L6Bm2>ujmjI>COs}~XHV_t;=U@B{(V~J!Kf5jrl`cc5_po5zK6Do zi5`c2@T)&XCsF7#n?NFacu#MXCj7gOhg>uV#UQ!JM4v&*enme-7pu^yy!f0nHNfH7 zqS<7@3ktszS+sdfr|HrCPnYOrsbPm zW=BUynfsV#xdv*gpR4ob^H(_AiuPWhh_>WA@5gfYxU_9lzVMaC)3xeI-2smqJ9wMa zVjsK`KU(A=hq9%;LpSk0>`J7z(M1;Cs);rjC9j1uGGOT_{@@<_wv{3=E|YqJNI#sc z=6>1Nq21td=}H3@YnWtdcl_Jt4qB6KO2T`E4nm*9z~Ofh5HNI6Q&T01boOTe8cJnB z`b*N(cz})Exphn zM~?gp1jW)CqtuJ$UX#xrRBEV@V8K4+@qe`dzKst#>Qci#RkGJ+Rr6%8l9z0$>0dN7 zU)wa)xP;4HJs!9D8pPo?=$5JlN3fGmny4WQEq`t;f6A-%sA1e5>|O;z9)c;3`kj!w z*u|_M(yA!tjCvrM6$MVFEv(rdIVt4d`eSbm*ETx!91azgz|v>To|E~o&21%uBuW6hOTPRMuyiE&r=M-El-o5Sdc zc@drSE+QyEFH;>hN?$Ns7HN%Hl9%b0rWX%#u)vfe6+Q zg9JNcIL~)ua9=*=>42zfT1k;v7CE(R?LOXg-7zpfnfsow^7)V9dx_IX-IHk6yqh;K z^PZ(q@M@UZ(LQ9~DZAc*l^9ttQ7NqYpxZAvF)Zx8aSnACH zIDn)#ZeE!7)M47pUt|NLDKK%jNO{noM}0C5Ul(}&rss$0#YQw88>8nck>QwS?P=Kj ziH44F_I~$Q2{;Ru`v>Ed=cZTN7V=~mYm7#N7?D?FTz)hXpnY#4$nmYK;6wlx9+spf z(O6bGmRqN(hPLw7^rF4%_f4UG?i=LWmxDI|wVTK5{Rdb2`=~38C4WHu_XHAi7MzNo1ekY!mbt z%DD7BBfmZxnSJZBC@%8$#_nP$(Y+<~fh)Sd2H_i}&P~K{(fdEKE(pI&??ag9w)1A0YsjZf30suUhTT{y?fby75JyiS}&`BFgiqK1sODS^nf zYsoZl3L0c+6;}tv#Y94s7&a;&;1eqy{reAekq2jj5yVlUx)d5~ zaD$9v+gG=cL)$A%JnuYLfJnP6Fh>t7CEy8#Y?sFT5=U!`fJF5I+f&|k@X7 z%Xco}P5ZdLX!*gxBB8{MEUBolWTinipIi<8KYYCfRFqrP1`J$~5*b>$yQHLh=nj!a zrMqir1?iL$DTh`N1XNmvt^sNOGvK}7_kZhO|5~%WUT5Z=_dRFVdG@pS z7UWvE$3SJ5ZxN)Rc-)ffD{@Uo{ccbGb z=#eKP3x;m7Se(~~BUGq#%w_Tfv4e!19NN$1gs6nHml3DF^yr(^n1l2zU zC>jYe9ePX3L1Y8e)b>|u!in$LkosUmc|r75h%Z9k!&NpDD#>QI#?d1pejG|?;Si~< zZ8yw=+CQ^U$2Smj&^7mvA%|2=73F2-1Eb8@KbZC;lq^Xo1ZXvZSu6J{zDlLG&k zrQajTq@N$j13RoI=K-J(ZhmREpgmFDM~;fXonXUWBs^ARob{m}f>nh~i#A(=FF6SF z0w6{HhGB=qI4-Sp?$`)h&r)U7_l21813ZPx|AJq8$Ap0(OA3ebx&bRzkAM9mF;k?z z%XI>XS9WApm4%O@eaa65l{9(;tGLbVl&{^5t=rC&2qSHjmwBs48e4H4Bl@~-SJ(T0 zT^F*lvLaMn9k@{TdtPwGdX*^R8xFj`=!)j{CE;781R1XjDh~U z!0Cm4wJNOUQ>v1kBt(mrNy`333DLIf*Qvk!i#B4H~rip#%tvE^Psd-)PC?1z&VF zzlAEg1FB7$gfKjoJw3m$&%X2QU>eu$Yg@pEIkW4y`~9O!3$XBP=Cu6#&Ld(ofkb*J zO5!9c8tI+wc+3J&IY)YQ+wBMqUEX*kbc8G8=g5O(kYVb z{Jr!Q9tmm_#=vwL*L1O6Y)lB=t*E&BHy_VTIqqX=QONcIzl4)TEO$7o!7`A7JOWh? zJkd88`Fw)RbIhQrNn8({dk|7|^t~Wl6R>LYGZgpwS$6Ls(mOm_2_-Qi>LzJ^#y~(z z)c_y`4D5BZ1=G5|QbQVqLa41Ii~lMHH5T7ixz%yeb~TC#LW5wX(%W2L=ToP+Q(pPM zED!fx;nCQkdQwEs(jd2a-(U>V`~1x{#DdJ&t0g=HSrda=2vBwxpv@H~cIjIHWJ5NL z>5_?~4<1Yq4zz6is4_f|Irwf1Pu<`6n#ljbjRO`W%aC$y9!Vc=qx)TNi`0d;831y9Wjd9S=y{gPKIyPo&YPMA__qE<6;cIv4OQYuMrS+f2 zrX~H8T~R=~IDP)X1U}aXy9*pv;)ie4wynPK(bx$e0N0JK?m<{uU|+j-jbr1c+nOEQ zHLy|qm^Pbj_G+l@>}AH2@BImzO-r$b%Ys4HBNg4pjfDD4A0=oB34mOmya93Wzev*~mF5w4D_mvE< z0a?XB?1RSxPC&&6d{a1BOtb!2@<$)_kRuW2B0JU)P#jR48oJ0TYWv}Of@+C%oz&`G zR$#ZpuxK;fW`dXL>t}^$K(~8kK$osSf?|4N?KNf?)>xJk9^QCXq@W7mxcyL`u=Lfj zQhfgE9$Jx1BH9o%DZ070-Dy-G=o-)n4V#&~h0hB}ypwIzOw%|j8-T5gJ^KnYg z4yE$~hxh`}ef6KfEz-kLQno00yU*Sm|`X&SQbi3r7)!U8}V=#Z(CM0c}SS zAP;Um;bU+U54bYybPN{Q!|yNmosDikD>LOYDSB_o1NnSzgD_$U z0D~1c4_gSpW73_CT$~bzovqpY@#fX{hX9Ol`x-!DJyHL-%;|tN`?XF5(BckVuqA7< z(Z^q-f$HkKddx9~wkj;z`4!L5xFUE}rhs?+PrU+O0oRJ%9)Xa8R8oK~GEZ0OD&zp} zZ)I~QbP0XVIR4})C*rI_GIE!O0w_2JW-8Fa9jE?c^Fk0=EW~>#uq(U`#AX5Wu^uxv zODy3$4X$tGt!;T9_{HG2m%xA#aGEk-=_`}^ z@xXABe3M$sm3s5%Qb2I5IUzzp5k`y*dh%zYvbzJUs1?14JT#ia*o1K>;0Xpa^%?5S z;s6wHAwlg=DVW2N1ZsY^W*!&+Myu>BGgu9V)$3OZq`(Bh4&{aAp4Wx%^TKxes8)b- zKU&A{^{TdE1&7ssDK7TToe#7PU_64`wYt}4D3A9~QR1^wkHIyd`v<*ybC@#6`fo~inompZ< zKV5!>6h=p#;d!aWF9Z=kJRAtzYJDD7zJf2_5u_S}kIp$l2BZ}3|&EEQDZsto=8xj<{H`$BF-%NVDzvri7g zX)9`mSdHGFoc)Q0i-$)!4k6{2r;ddy{aXR!)aVBZRR*#pZWWWzrhw7z(TYK@@=yT? zvnC3=SpG}26o~>;~SbPrl9> z9S5{2PKs6s2NM_UY)D9QZLI+A8>k7>Y#3TAw^+v^mtO&45r`ZSBTn}A*x78C^xMuiet;&?99efzk&Qg# zWDw_Em~YIs%g^K7Jo0uG7Fc~$avPgPR#p}afeCc?QLAN|H9#-U#!X`YYonFZ53GsO z#FEo1BCLP@`DgssFOP-mYNmO5|s zx}Nm!89It)k-UFwuPw|#_L`L;(Lj`jqFG&3lRQ3yBwjy-B{LDqP>S)~ ztxppO9uq#Y#>+ijQ|ezN8t#qQ-9Oa|wi5CFUeCrCM{uu{dT@y4c|6DF-pe-a4gu{9 zea)kgBg-Gl9HnEuA+7lmg1XmKJ{I4kCMQ{5it`EeNbzZ{LW8SQegJXm*d|GE5uE8{XQA3oYRL5^#&ah=sn9wc^?aj|R}nf3W{5+W*o@gl`lR1fSrAJ2Fi)P`$MyaX zpDRaU$Qwrk-U__M*L<^7?TCU zh8PnURrTDWfA0QIPlNltXzLkSZO?W3@;}$qoR_~;=4Oun$Sn<$(NN`6U63JBAIOtX zS-?;Du$Sr`sUU_OjXkJ6P^_H?pS;e_t%b1U5RCrN&z&RUyKu{-!+ri&e;&8fGy=t_sfPLO@{ zk5CR5km1}>ZJp%ghM72{+l8e;@TdnL*>XeU zB~W;K0*|FqIPVDwab5@sS@|;`9{Kv3frYDx0X*tj5_aE{WOA+J2zRn1HAv;-NQgp} z&}y7RoT07gEm4-HH}c*d(qTa!xCIj4Yi>0gD8aZw7Z}O%F*rMcX1q5ja4(}SyqmzX zNBVQ+EpTBrv%rqk3{gKU+MUj(&l)_|1g56CiyRvDoxO&dw+C-G7``q$Ce&dR zWxRupIRa59+N${e9YVB0TTHgBTf(cCua?6Qa!ZVz$6}fQ-Y;U6m@p0;vYxDS3E$-p zVE*UySM~1A1m$)8Ii>acbIhOVtZIy_KDW&64 z?pPz+ABEdd$ak{@>|i_e1Egs#VL7H*MYJzjCpYH)f?XKenOb|%mncf7p&u}Ky}ncO z2Kd=6l3A64l9Pb3hG@k=%OIJ8utV*ktRxf)brVc8$ktO(g5Y6+Ycio&rmlh+2sXH; zB2uN{xe5CGRoU73vwpoOC=563V2)^9>ICBARIqB=HGl_VmjLV!e~7;zYyYgM-Oblr z7FcgEh6Mb49gQFV*SK7UGA6sur zSnbvkPp^4)jvGE>hVk83f@|Wf|7_1eV;|E^?!5WogWMHg_?v$y0f;2a&J2}bUoVvI z>FCG_a?}14%lvz09YI3$J_F2tU?e(%KJbSkINrS~Sl$Z%BMm#4bbR?D)x2_WFGEY< zc|}op+k9KqQLR;bcKE@YA_SPSTUAoh6ChoaU;Jm}TaCpEIC1rgr3IUdp+bJ3^<*o2QBgQT&2QC~DbR^}B&ccj z`Cwz3kPmgb32G5FhL>c}{nHH?mIe0~53E23HI^Ew@Px*`&6`hb=ki=@pFh!)o7AL| z$a~y>Fwu1&HXr`VB2bO@;U};USYY`%AwT0($Kw?Ep(EpxGVX*VvSO>kc7#}B%(vu3 z)lZtb{{c~A+rT&_X0Xtp;X}d7f(#*tEH55UknbdYYtq9>`bJ@{WGd8dl8@M=+Eh_| zCe&ADzAEGP_&i->UDs|_ohhYkTd&C4o*`UKwn(K99B@T6JgP{40|1cnq3(zt#RJ2% zdT1M{FN{W}FYko##rToHCt63n*P4)X2lddGF%30+xys;#hV={W{Ws1PH-50|6C#w! zpLeXkqmkV_5YWWMbj1#$63CW;UW2BJ*{R>r!fHd#y&flAmkl|HtBig3PSGG4Ogk(< zPb+{&N*F52oqvgyGj2hCc6iee^2fu)-MtLm!GGRT?1hr`r=hriKHu&9{+sX*=m!tY z6!-ikfyeQ_)oT}{&Y>y)V%D`4XHRlW`m*#-Oz7#p6-_}iFc*DhU2Q?tnW2=%30cpaP zk%0B@ilOg(z-ZPna3bqGm~ws6YsrmZEz3!g$yk5-BjtZm(?UmrZ_1rX@TJ z1w&-Vj`!D8dW*D;hPGH2fsLBA0>4SGHSm_DaEb|DiJv zRU(DAnF_ZH;B)74gXJHp?2p}OLN5T)okZ~mKR2F%I_v$I^Wl7Eh5C+4Cr{)d%hObm z&l1X((XWl?xF}N`0D%`@7Qlw{VUn`3f?f8;I75*yYujEhC7MEWRT$MjzMp>-6W0-$ zv%50LTPLG{^0G3f?n~DU%`F&u;IK59)ew5*<1NHrqPA#jX484L>)#m`YVg_r35o2f zsV=XPeXo{aCtI$!tX4e3Q`Oyc_j`yEt$!SPjlPs_>ksKy5Y>O;nehA}??Rp$THSOv zm0alAX72+9DgvKgEk#3@)$GYkR@M>(7((Pn6V>4E%mS7T^1w&sMDb zDRV)@`4I}x44)-1_|rVie7xEqc`h?>{Q8?(j#=G7H?G(xVJ%g83k2WJ{ z;n#p_l>wJ`FEmoY8@(GHs;TKiqsX@mH1t1|cOI*{xI9z+n9YqO0DglQ?cb=1hCdzV z9=hFb)GJXJRRzf1KLw9?AXy1W13_VXzeFA()1>@>DQ6Vu)1QDx(N(;Z2(?N>jyamL zy~5V7kfdN?o$F zwue>zrAq@*Dl;{8NdoJe#-#C;aL?|uCP)Zhf~m)=n}!urSOj90RJwElL- z=0a07e#J0pO+Y2pazyQbEcO0*{y?1Y=V|TYrz+D(xLTI4;o(lu_#|?TbLS66qH-7w zeV06d2Hpe6mDBPp`P&q$J}-jR_1*i}z`eOD=9L`-p@Nss?RiR5J3W+KAeDI-Lj^l? zVe@Ztoty?EC@UK9-?0)~z$==YCuYBd&@s)5Vu~PG1+n%U&5Ws8RS5J}W(iHRuhTWc zt)mCkZ-Vz&VRqP$I=Gg&=qXh~=Z0hR2kpe*YSu}s@P0nH+UxO>tkUXq5}j3Jkect@Gra6D zKW30SV=as0(Y*6~Vr+~xucTJcjvZd{{o!W^S8DI`GLWTTTXa-WMFHyV8Gj;3l-vXd zh=&Nku6D=s@{>@Dm-f$`^5=a*Q-a!tl&S7E+xhac=UH%1jw|ha;HY>J8H$crxkPSj zRw3?d@)n8jJau(03mOewV6lMr-@5)!sbVoD_TWZaS*<~dUfF$Swu;hMbms2X*HYTnKPeV5i2A||Y zmtk~hz@csZ{TZEkW=Z_?ZC=QtL@itw)%XS_1{;hoeBgST%b%GHV9L-v7Cp!|BM5RY z_NiUgZLmz5?~d5N$^4zD?@bF%1xfQd!W=v0^w%!*H6^0c7EyZUt2_n5xPvSk4 zl%mf!sg8fHE!G%kA$p*=s9XO+5j9>vrf=MWU+G$#IPtAYP zcSCibtE85m>h=3^JaLaUnvdkde2l^%He#R z!7|JC95WL>bkn4=fU_e6h9wyh;pP+mh4rp*3ko!vibtzUfFEVP)pkcOsa5;&>!;*P zhYwr5in@b-C%P08a$xJrL?ret9QD@&5Fy1sYIV{+iZ8K(dDnDNC@136g7+}#T%XrutsLT=;!L~gmuCTX# zEgcFYiA5c#ISZ&vs*X(RQjr?xCO@B-MXhzv%rw|ouSYRD9`ka~3Lp}@!4C7m=Uuk~ zMB@h#_Vbc^q7RH*AZUd5~%;{O;dbaL1cR zi2>e21k`K-yPN`>L|r3GMTz~BNv5=Mfue?6to2UT*YKHp|Lg{fUYKWYae9zwbH5oE zr(hFKqT3OzBK9!bF;%AxFE|nE4;wuDxYDA>Y5fcUJYAuTY9+fuT5s_uIZKPlqr6G? zYC~b*kk_!F?+)1}#H5t%z>(Nm?=zAghK>LdGzi|6MKyHlnhYYs*1pxC7N6)5X!PO= z26Vc7<*C0T%eWd6em@2Va{J&Ek_p1nMW~P36v#c>D3sjxN89tEN5%Q5R`!s@4 zJ@;W!dQG}vx!cx>ByxxkoWxAO6Ej|mrUHd*;ICj#bW-HWst5?OL5AI5g+%svyau#U9tGp;HDL{@ zFERB0BEGi3!O$tkCt<0BdyXtf;D}O)L4#J z8Fo3Sbm`q~Y_vqE=+}$`1^{vm%&%KK1FJkfryQ;_}@27s$SV#dPS2k^d; z{5LLq?0od8MbrRrTA6OeE7V&xxWwZdHM?j~1%nJnWMl}qvmdsp89gBR$Qc@zLWvs- z4z*s#r2LqedZhOdzJGoOj-jhgn@sEW-(|#7Im?0mEGyu^^wQsZfbr7E{pBgrs>Bq6 z?;>L{Fb;Dg`4M9v)9M!(c+%2ZDfK^x=Ez7JAgG6p%lca|$jzHKiw_P0`V&B+`Z~KX zR#Y3=D|Xmlu5$Ti7BuS0fH9$I2%2o9ejlhEF|L8Mk2<(Ubi)F|O$+ZrFJRbwQ*B0@M_>B*)n zF4O!->e)if-Y@};?lST>Rlum;%=f!Z$;5>bw+e2zx2Aav-Aj-=7_hJ(QO3GJrx5jQ zo|mKV3gQBG_xWbHC<8V&Fz?r~FL9LqPQ)AzqNk>rCB*L|Yn9?bi+H$;f$$|xpa-@W zy!!EF&QN3IiG9dVA|rk>o^}9Pnk5DoJ4bSkkJ5v`Ywd8^ijr&<(sJLRE zU@c)6DOn$`0uiU-p%AD2^6)Q8$76k<5?6(@tHsx*;_nz|uShBsl=DK7okbl7zge{5x_ zUzcpf_^F+Egk-XNPYTH&scBAjWz=D5iM|f{G4P}TI`b+Oqk$3omOr5_AlCvPedia$4X!56id1fvKGoIDE)3H{?f1~s+SNQqUZLvYjfERtjjsOBMeRL zJ|=9$K?7@lsW&BaO!^@I`sf|Tr3q~jm+AmzRROy^D!tX8g;NbT(h22k+U~u8$ij@% z%oTz(fw9ug&e&-jc zEwb&j`2lJRl<(waCa$I%m80Ch?^hWcqB5scv~2>_teDIOSySezHJ5u?5H3Hfw|TO< z_Y3hoHRB4m4`j_RlV<?%4ZW0_g24$8qC9j`WL0B@5noJTNW=3MDtMB>Z2dSZpeW&D)n$t6v8&vaBWJAE=;C*K;wyE^|*_Kt? zeGY3|DSw6pOF%Zdc(hzpL~izuYQW}XYJvdgXZXnm3#p1~m>2m64bB3nva<4%(!@;Z z{28HsI@ZtVwgW4mAp&1!Pn|au(KunP1zKIQeyqHak}x-r24FjH2DK-Z^UxZyqLJnB zlj#{s|K$Y$9m*+CdW99iR=Ic10TjkExO9+`l9IqhClK#S3>|539wV^#YMpNOh&33+a{-%D{Wa>Ungf#p@QbC7GRZYVrH}CpI@R?-v?H7@;|t} zFsesV?(c&>t2r@MwuV1)KN512mj=yon*fj_Kyfiwo9T}-g>I@F=MP|Q0M2UeZetep(|53VXOc&uff4&$0?QD&^zeP41ImJTR5hL-3wUcav^#KKwsil(*;-Oy112YuIv3#e-DA2!WVK zu=-)g0m2|Lniw0$k3Hhllke9Ga`8#`#rEedG}&8C(s&3;kziQJCZ>V>v6Rvaq(Q|g z`7;g&lOn)bK#%TZCXHLGQrjOm1#I|R=H208%*QHL7OFl#@Jp)=DvYZPj8D6g+$LY!k3Q%! zL=7NsP(n;tVT*aUuD5>oEA=6f?UPbhZBfS`2e`DUrTNkWarpA2V-bbQ>INTxZq^)c zFX;}7wpIp!V$Mz1-vSk}E9olvsZZdstTE%><*GNl%~r=H-c+*szsSimNkxKXpbFc~ z2PkUEt#9x7U_owWW6t%F!8}={2%UgZ@CYk)I}fH~*DP{gT4dbaCGL4mRz60d)->kc zJ)+*NuEb!MS{JH((#?&j@(hN9X5o@#0T|Luo+vwWRd8>@+@{8lM`^T|F zVcC0pIcd{>p2oP3i)U16(GGp>U)utwXb_xVyAZ>^IwOK4&of~5I^#=Zy2-ejR7b!Q z@(0uzmas1x)B4kl0DMIUP}xXUg4)Q{mcCn+sOb*PiFunIuTMAYX)9)|y|}gTvaYL* z38O{Z`a*3J#df0bZ3y5#V9K2ds4MLl?v0&f8FH{(G*>Ykwah2k!Eq{1t>U%r0}Wt`@`s`4flH?z7-X6VFwuc(dL7 zTb=11;rA=jgblBq?QWb=Xc51JR}@}2)FbB>Y*RbfH(OIKPAYG-ZGG)Th0bu*NQK>& z8PF#IWcnk8k*UThVbc_@D-}?$8!-?_$o0Kj83w# zSS&K{r7fM#e(m(zH=u8jFDQv|*GP98y62LSd9+(U#zm4$zH7(bw`?O3LBMWHG9{8t z!Lqd8%3q!iZ9^KA1Th5rUa$cK(;Ic1r-D=Ep6+hU8k9>0O>Nxb1t+)sG=j?`&0Bk* zDFT5Q2_W6PO^->v@jl%YmYKOl^N3)Y<(>*EGed4~d89&eCOpYOKniq;xv%-@fm$*U zVyNm~ZvDMhA$Af9qf`Mow}iMuv%Ou0^vtE9t$>t-6+IUzN@<_fZ_kZLV+N>GSmyEI zI7UxmPJ>pn$z}5^tUp_vj49E5#4CBQpH8CLcRU6V)oShPE1lxvSF{;9h;pb!!?#kU2GAOHVu2RZ%n8UKgs+igGIe=;qpKtTYCn^1#bt)P`X zUB;{rNFl!kgQij-O4NR4CLp;vUfetWm5a z-X02FR2p#+ytkUYUk9>ApswcURM5@9A9Jusyt(?ipOi(k7NZB19|7I5`(n7e&MWwtle{~ z_5g}O!?7J4v5ELVGNV*NftE;X&}{r4>*d!+0cZOYiRy&GmHzVujX{pWzqp60t$de1 zv;Pu!*6g1%o$X6o6uPS+1sZ=4O2a;O1d9uQPM!7!HNBLBiygry-oIQ`9BO2FBQ3T{noUsC7kWUPbYA< zwy#7NxHQ>g8rfBW`+Vv7DM$mARCAlwl(c;7@*z5ZE5@)+7AVT}P?(A3|5FL0q{!|a zv8Y66%2?uX!_XAw5zw+-@z*QV;T&;Nh`lo6FkF>7aVfhd@-cYxHEzyKSNB403kldi7S#9w%o4_5AHLNAI13G416Tj`uLa zR=2AjJojrbG67aeH^w=VW=F4*BghiN3TVAuj`f$<_&pnY8!HXDVz$^rvDUyS2^ z8^mP&5~!`aZK? z&N)Ea{U4w!|C!k@HU2-|sp4B4tR*P1T3+SY8&FEr$D+TuCTystinHU##SJ?IW2qtv z(%2wsH`wm7OkU zE286oEcl0DO1uFs#@54zHre)=G36X=IH#Xg%C*bWsXQ93dNZT%3aQMD1P0)Djc&Jj zvxgP4l4?0R)#D$YBDKmjzjZTZ(*OV}v2uNhdrcrtLh&{JvJ|vJk-JjW4fibVJg@C$ zogg=yn4c4MsG|a#2~;AH>mjnrk9^{fj1|h*LJF$ai0v(h*MhDCkUikKWC<(0Mbpx0 zU!{>_V<`Z@l20iJb8aC;y7pBqkzU}u@*vTjTrXqYRxwZ&mYyi*YfV?xV<1dt-(%QE z1dx~%v-VQt{f}caGlJhp<_9=9RZ_{Jt5S*pY&ui`RmCMm`dW}mT+IJ4j2CL1`T$_N zJl|@A>a9nZm{@Zx#R&}7mS(#4qk$tC?H)q(g&Dnxyn6;N6Z}?|ued-{fRJ9l3efzE zic-2Z7CG0pYM{7UYXNI-(M4y$_74sc{K4cT#tIeUoR9vwpmQ+98GQ%q-cTAnMZZ-A zXsQugIx*gO5r7SCZ$37-;DJN0PTUYCp&Ay-#CSqFbOFgbPJOpk6Np9a*1(WLRT&~dtOYJ~r?~{lhm;*@O^rG&L*}#Maz&bj!kE)vW??Nik?B=OmmCdW` z-9Q6ycx)-6p)xA`TgEwGgYQb0E3P)GyRs2%2QY>yl<2yrC ztykcN1QbXibK1bQ%Xo+>4ZMjpS>r^GXAIt`U~!YczkH+k7kFb;hi>T#fjk5tL240< z&>tsi3LsHc{5Fe!xz`Y|F|i6Pv{&eX0ve{WYla&z>63u_Nq9BKcJ&4f-EKqNJM*#* ziD{M-Jbd^n|2PGyT|h@JJU2^e&fA_#7-G*^5n&*@w^m8D5wj9aZ1uAMnqB*;k%YD_=&ZKw`}c0|lK z+&mi-(m{nrJTCm6PMLaihC4$;mFjpK%CWTf%`2s=<^EyhW1Cx?iWkd*G?kLsdh!`! zNa+Zg3LAI55Rcqyx%#K&;!xyVvta`&?%MIkc4t^18|UhUvCU%>4~93!j!#pmiJwMg ziRNb?g$3XLr)F{&^G&ze7lpf@^b8;P+#Ma6(HpCG7cz)8zx^lVqJ{Z5n{nt*Vsfl! zm#}7M$m{H>)qdzF6A?Dmx*he|f!)szXH|1KuFaDfK)SM_H9!SVo&E3meG zx&7DU7{vG!V@Ez~eMxO9)9Cgx>BGwD8?l%t*?q08KW)T|DDmaK?U%#&lWQ@V$76jv z`%@yoqGZ&$9o1ZpW?2IjD71D&T#2Enj3Lzie}TkIAkQTd>C~4Jqwp3F+W=LGkarnR ze5zpBZj^kWu^e~4v5^T;q1zCyW7p*OhQA{>@XbeVPVAEK@5)lD++~jh>75-zhp0HdbZ-tEMYoJ_mvW~;!x+_+r1ZVo~}KT zdPl?S-8xi}rm9Dgpy1+HVYwh(Ug??hqw{X@T_Z$L!c_i;%G|bn)MssGB@I>7E98A| zTgvzn)%WVoJ%*8E7iT0ysP)aHT!ONuoifj z*}^}z_-5sV#F@({G$bqa+Q(wRXxkTD3lnytdFJAhF$PO4{gKsr^-`I6uPY*C6;VN_ zgtTAL<%5`z0bt19siUE+6KPY8aV>+wt*^Qe0xY<;cs=9JWAC_U)Ju0dF*|V&% z<7a814MkNN@Sn;N(zIF+_b;;%q_e)({+z>}mWg{TrC_M;MZ?|kZQmZbd!$i+?Z&d1 zHfmr++rf41)mww1@v+>G0(VeeXJ6IHK1SJGAlD^oLjB!F^CWduQApR@PgNR_3q9JR zALD2!o$@OfhFQz#2n8D%6XF@ND%w7z@wlS=6Ewdn(&zAWQxl~>yk)#rK1gE~xpPz` zC7~#I!)`^eqMx%S%Px?JCywFN^$IRcbC{Bnz+tX0md5J+NCCO5;c1pRAZ!7- zNE=&0rDpKdEE+eO1Ga^~KD87#EX6aGV(H!z?=^To0ek6{YxF7rI=yBUNpKbA1m!Ax zffAPpaNI4G3G&~5^s}S1VUAl|#$H3$+i-7ofJO`++lQ%l-$hTApxwqBCfQl>-H%BY zuBI#bptXlYhR-^PKbQYxZ~w{eKrND6%wKC}M^gY=lgPlW6y%cOMwNJr((u^B1~A*o zurmZ;sPH=#!aE^8v9~4UhDRw60f!gEGjz{7` zO@m*b=K>Pii>GaUYvL>ZuikuV0lC%bX;(jg|KP(lqB~de_P^^wLD(>h{jVo17|>iq z{Pl&|ySzMqe8-}U{w`XreYsx=9Ymg%3Y@+a_+aU_nq6Iy$!|r! zqtPBy zv320IWMcKfryueTggz7gLJmE*b~C-MHY!q~0L0?s)Dj7QpI8i28qPUh z{3Qso&4g(|B8%pnD;i(MB}(WrH8%QWhpVtH2r#u%IomL^FrpIBt~Q#8^KZuVUv%$E zO>Y6E#rNGR*$C&n_aBTA?kTcLe1)wj196vI7d5^L&5J$$qx0-uF#{BeH?iH~3)!`@ zZ-VxmRUzyKOn*ZSz;C?%?_+pld2F`Dgac{ZrUW5`=RU5>KUYW@sHr1<{BQXE_bZv4 zvu()W^P^>Fkf3R>?Y}|8z)%ilQ3MTm%n^AJ^JGQEpwh8&`y5mO`@%pucY63kjKg~} zm5kStaFb%0l4GCfO2wzh?5cx?hHs#6w$J2`isV9n?F18#F4HeiFHDXs9D%77#X&N< zU{E%?cvuRMjGaJ3>7}|)FSMiL3VATE&HA<09PXVR)%5B;WuTf4{j>Rz(!75<^I2!@ z?V{#`^YM51^;Yd|Wnn^4m(~th$s2$0TR33nhyC)S=zdT0t)*Z(Kts^Z1F7{_J(aDk zlVLoSn3ro4xs1mI@AtKONN}|!M*lh*k9z7@O)Loc08gVL<&^>X)$jbx zGxFUzd~Re>8S$gozLVAOT|V|%QMXfZ#j$Wh$d6*)-<;ee!;X8gvSzUD8t>x@+dTDD zz==~LGYCTZbO1V zQLVF`UGzC<2Qj*%s*I9I87HF#-Dmh5zioCVx^3@oSYIA)3g;0<3*9 zkm+^qw4d=6dwf&@*ILFDqd;ETAP#wSn2)XF8HYF519x5lp7KfHm}m*Jp}Mb^uW?+d z&4#)%D(JyD1bD7eR(+zYdmzTEw&^Y`3_o^G=z9=D<=dJcM3=04x{?t0dXg_}k(KfJ zn65O@;op$^?H;x%>J(KW&u$(2;^oUB#4+eMkT53lwBGV)_x&~VH}?6aU|CpQg81pF zzrJz(!6bqhYv)vU{G2cb!n75e<`k;ZG|P6i5oIb_8wpXfxZmme5-(zxh#C1JtF@{3 zu7620?!5~AUmPjHPIvlO(9K~%+XPv*AcXeSJ%i$ksm4Tf6JULwES_MP@Y7NNyXQH4 z&NtH#lDMk(1OlN8zzv4tpY4HT`x7=>PLqF8a;fa)it|oD_i2{OW)yyrkD)f_Mn8x! zFe(AzLlWfn=@f89rfSQ|^g{J-Ut1x3f2JqnE`mmxi{nC#IF_Je;Zm6Snn9-1K zBBTNn2DV4*5~UPK+#!=hK5x6Z>K^4(AkUEGE>3;q&dt&q0x2?S!o3arg|%h1KUphm zCkxv8;A)z5{+c;*{%e&@l@QI)0kMaN^_H)wjhcTjFh3b$WTYv5}KR`UNx{roE<2+?#ht_9nT#s;fLA5fqhrW~SzuI$p(tRQA zjamiG%49A6a9VGbjL3BqnmaOrk{Kgei;-K#+PcXZYwKRm%+4+S^uu{3h8~$ol}c)+ zcI8m6Ax*84p2nmU;(AsI^bLoUm?lknF1Us|F%oSA#fGC|j8;xn-tgb)=0W%ZQXjf! z2Yb24+`sXY5B8wW%=?BKAM72utNXc&51Q9U1<6WPRCr4M{KaXrRk9Yb!$PD+npq(H z=s|qxm63+n?zqfy&8@Ai@ICLV zqoKkfUS?ibjI+fYEwPgj`UkON6gZwdZ{KW71gVxbjc3=5$GW1TFkL`fDh|Ri-#^I} zD^b3p?KfENYVPJ)`=(`JY!zV%(#g-6)2M0LZ9{WuMoY$HIofr3h7GY z9*jL)F+%3!plkU+D5&f>igIwA7<}HVtOjG3D0mfVBJl=KqJaw~ni- z+x~?CK|qugP^nFaw4i{*rb8tpq@-J<5!|$*bV+wN2q@jsA&np{AhIbD*mT{wz;n*? zJMVk%{pWrj9zQ$QUTe-V#~eMsgQH~k=IW*X{lSD@B^5UND_PPQ<+r~#+yVaIY(GUa zy^&ElW|kp!<;E@CKxPWo7;8Hc@}8^c3>XZ5nk@_8Y#2!HWy-oJ+z*`dehyu_+39O8zEj6;f^ORlsB@LSi~pfjWj zbE1>=j^TP6Q?iM#t`8@kO7b}>+~dE0f7p{=al-Y(LcrBP#>kri9TNOxgWrD;b317D znBO6EDthUQ7P^lstigD>q z$9W5R;EhyrGhK?NH}Galo<%3m3NzuPp23(INfhFounY(BavyZ>?LS5BHFIZwzFNV@ z@4qpv8X;hsfg9LPvhbQOB~6Y`du^50i?CFxxoe3fR-VMxHl;6%HRX}&aF_pbYvy8< zzqEy?8{TPq5vx;MFssB*_M};bAhYtPkA^8!?|?IM&isE**9km7<4;#$MJ0d`)6B=;Mv)S5>r>-TTV6OG&H)!f#!*iH*bUv_ou4_D*Gl-MBWTz z?)GoDNLnyyTQK5)k%^@Z_=gb%n1ZHs(yAx}ApGcAN;$R)~dNgs#`+0(Q-m8B7+ z=-z*HwKs9P&Ex)EOhwMf?7RqoA{jcoay=wxn2#?eBlOqRgrQ-$V-DX?{ho}Fg;k`h zu({RQ)^z@p1&<~g2pU0wVje}VmA%{iHwJjdP>R^KQrQ9+_=lg-^Y||WEE*0Ark#h{ z)O>jN?KV8g%{$b&&m|Wn&eo~pt7#O6@VE2=k7PS6?f9NZE?O#d7>~yJll{UOeZEu47sRa zIbVmH>ADOOTJ$Xn67|#pQf*H}b6Ok^kJ?0(v`JRBF^q2wjA~yj%z`(GeFV znu-Yf!`IsV621mO@sWfNqhoP|B^3{t@``y_ zvqG!+nesDPwVI8wB;$rbb!>jskOmTpUy+J~BS*`L|PuJ@E;cHfR#N{nb4xV;*3`be(>N93M;34)?xgG5g*k9I!drw4-s zund}vGKw7*DHtdcLmd&Rn%kB`E6Hs7Nc(Qei|7J=jQ^RZ< z1~XCaFR9>!NFFQ2(ysxy>GZaS0UzxVkF~qGAc!Zm+J5}Tt|FMs9T0udCUl)o7IEs0 zOtc)?6A!F>oGoXJ2hO1zrHevg_6o-4pj&27jZK1YsM@&FBy;D6*a&V~XuEfnPm%>s zU#P1^%%nz92SnYgutmw;0$AF|PU6sRdG+RNU-H#AYL~!%!g0+E05`)YJlLy!w$i_> zm+N}WZe`W_F8hjH1Qw2(w1JZyf$7y(!_K)}859G81qJnXybyaH#CwkfF)t!|2Qtx} zvC;Q|gIe85%?QHqYVaQg=OQO-s5iw8ibvjA*7SgbSW8Vc1)$Hh!9jz@s*p&JXK@TKt`kafM(>cnq<8y(vp8S zRu{HV+TFR>DBchteHoN>!1XDR8UW`f^9%9BezKv5IRgE#PUPykIE7MDIty6%Oz_!- z?kO1KXfoWaGZEFdbM~fjkiY4-X(s$ar4fU$K5Un15~@X4jz;F|^Mk;;H#`paPbe1N z`JDb!r=u@X7FPK8u9Z_^x{Jd^gd}RtTr7Lf9n-&uT)C*e@qGsoMiS*~`ZFyV_JbYx z%I2@>9)RKBA*^1T7)O4bYf>6o!TttwF#*L7%6J$xXZtIYk@y)e1_Uz5Cg?8;uKzFq z5ga^n_?q|*8-$r90B+M6K?fOTxww>7NA{EB!gxc%if;jSow6hb<+ppzCd>`x>zVxQ zSXvh;z$zR84zr~G0iAMXkiPKICh~_s@S{I|{ug#!@#=ebh)cXH_XvixUZkYwNRs&g zHy#}24{qEMIz8$&2gXUUXrW-i#X?0B*=c_jXn5{sTHK-qmdKNy5XwxH4=Z{_sB04> zf#e6FF2)Oe&sZDR1?Tm0(rHeaUW~`yE}S6dyU^KYInEbLI1+5?0!1dk&5H7h%H3jKIf#Qz9zL^YHi z+MtFX!hR@Ws0UDc-M?J{(glA2HZ`@_F4^ie03Qy5H&TE?z9D~E_$6j~1MJ6jh=m2{ z$RQSn&SVj3g2V34p!!@DyNd+?CpD{LCXwA!TwZ3?%)1T-*9T}ZdYyw8+}#ceVUgU7 zz{aVDioL0Rvyg)8MgE#aVb>MFHF?ZF5KgYjiqJz)4Z-E?;xhiZkp%$yz)S#fB*x|~ zY|L1p@7f^>yGTkWM`v%~RFdujXlL7KR zW`cMQ=l{cVV9s{l-dCC|#?4VM9S+UG$=wPfrb#4G1pRo4JzxZ2Of2&00i#=XYD<(?(?de zuPMNRC3C-f7vc)yQcA$3Y7*cMs`5UUfs%E?KZ!_IW`!i+j|AbcMOT^Vv4;dRDJ)-? zrMHD4)`RzcWWPh=>ZN8#1CnRs3N*O#f}(5y$o5YlEohH*3WKgFAW31IZ319Xce-11 z11*g>0xW3hkfRfQ<*TR(qigZP3ek5*x-6|urop8M{9H$;9pEqK+OFTtdL%{v?h~qu zA)Y+fkhXpKxqw$smQbN-PyN@`A_4=C)#Tff(L|{wxe?ZfyJJ#nqb~+rV{#ZWqI&MU ztK6N?8i}XZy1N)o zPoHiVem_!J6>MM4>tVY`RYaz9Z=F$qx>` zBqG#5y0Zpkeg6(h9PuP~F#2j4o-X-uYGS^@7f zlI}ALOnuPKGpxR*36}dcOQEbH$fPc?o7I`fTD=Il+`WvT=|Zepe`BE$;W9Jf_u}#r z1BP>ri!!8iwJ$~sv=+x?Fxae^^|CM{P^)2Ck#t5^SWYbfvgNR9u$zjwI;>6aD1r0M z>_SpuA0n2Jb-wW%W2R)d#*7Pcp%$#>U#0vxeKo_k@Il|2;ID<6$0&blk>@oQbQ38? zLr*{W+(YFC!v+DQmO=uBlP3%K)OmN& zn*vf0TpdM$Q4Xe#omyI@@gvb62%aiyYLRq3Mj?r~+H-X5ML>HN^_D!DC1C;xefS6531qFo`pY$!|E?V-Llu# ze+04DU%}?U_CWx7$;t(A76Xe3GWR1v6w*c$f~MaHFGPNfc=$p7P%W^Sx*`)#(7BUSkEGk? zZ1+fbk^@v*UM|L;hv>N_VM((eXExncfUOCzQ3@uVdsn!4U#LU%pg!DSKxIq_wFu?z zz15>Qwn`GxTvbNtGJY?o+YF%ce$!(oXBNlww^}(tUxZDBB$w<^X5)uu!iGh=%n3{zh?pNaldcO&4uHz zpZuHt6Q{>!8X6iV>YV3EBe_-ubjF9$YV7AH3qhzc4uz{2`7pF}=D5Mu=wduFy->fm z+9*5sTJA3k?OwwCnMIDMkqm(()@v&gewOpC5@9PkvQ?||2b!3Irq$(ELF8T^kB<$} zrKIR47TVtgcl(^vw7EpE?o}u2nH^CKOW#V4jUA-7jN9)fs2Dj|Jb3FjNYbe-o&t=; z4^n6nN*}E7USs(j5PA=iq}IX}!NHj79Q3J{ z;EjVfQRs%yG?l>yOcF+ShUmsBdvyy3dW{ouf% zO@D{8-!23Cvgd!0M5Hlcf#)ke@6`7d1WUdP!)--g_%{9-G#n1|P0b%wM{v#X%IS6H z`LSqQ+4>AdP8LXi0R$1oG4Sxs0V#VzY%sV5WxTE{z&T+C(<-LG4iZXr?KZ33eKw*H zW#F@59BZ4AN~3KZc*|Y*aDskGS>k$-z_Zjwv*_kwp=W!NrFoA17V(~+0GdDNb0krO zUpos~-NA5g-$Dp0ihVrEtmd(J(B=%Ea@P1<<)e1`O+h^~-b#D8hhJ|Z8fc#l(7$|& zh`_2;+>w1P4g)8nQEi{~!ta8QNg>KTz*0rpfBrbn&F(Z^=Or%fx)`lvv11Uy=A3I; zL6^~G$EqZmUH?fl-W6F&9P;y=-P-?0%hp%*RRxy$>WPfyO&Sr2CYLiIqh4|{(}SaN zs?MlCbQm`~m!dg?RN3<$Q|Vd+@=JJ+Y~1}h>Looo{Em90*00q*frj#7z!_pyP{{a+ zW%OWc#(=SGtVNct@*6NMfA!H;zgQ&J+OZm?(GX^Ou5+E*#^NA4Vv~^qIiTm^SxP~8 zac+PZ;zgcI04QG{I~VPOveU!~DMlD`Y*fx|kWJ@t`N6>0e8Ef?1dl2f-C?d6x| zVS|hmN6~hfL3Hdm0n!AWZbu2k9>16U5~f#8ptTulp@!P?_I1k} z<3Em%afj+}_tAxGj`&yKJNseCs3(77Gy1hy2f%Z!^&6wSQiO_p=^MXtSh3&qIB2I> zDGZ}hAA9N`j)$RCLrf5p zO!=~+;--R8x7rk>F^QgcRXdHq9o@)-9@5z%CBkrcYSjsJ*5f1w`d3UV8Wb>-z0SY! zHSE+^^zh1YmaPtr?Cxx4;;B_NZaLNN#A_i=S6)O705S{}`w58j(;u@ASJ|v=>U*q~ z1`gar#APRnQ9}=9^i44chUf}=j%oc+sRMEM`NoxObRQeQJtG{$av-Y*y9o`i3~Q#g zos6qV_>8d-X#k?8XO;X=iVp(*24ZXC21;-|V2Q zr2`afbgG;Tdmn+zsTy4nH8SR*QHhGVrgz8BcYYWiHF0WI^=RWrD6PH1O=rGE?|V@~ zDF)bdP!y1=1(Kof@B9YB40#6{h)UI3@F9Jy?bC?uF*e7w7y;|OPe{Xb*&;nD6wzH8 zkF^-fq0HmoTaO;(Nr&M`S-+(3kDp26SxY^{6){3@+u9!E$1k+S8maOqAu zA_*`EZ)kJ>dxX~JSGS;Hd&`3jv37r+302;RM=L~&7L;Ouf}t=MFL{sFVCpq*rA>D3 z%QObqAi&*5)XGy>f*+PY0l#};Qu{7cvjqBO3-KR^LCX7$d~?|8%zYI>pTITM7qU2% zpyDc!x;MaYKdB6`Fyb)8p!ue>X;AUvV_>FZhXDNrdx2?SKA}49u}^SQPbTm z&s>z691wsz+34Y>F_AtEcEWR@m2>gJBQSBKAU!E%Km?-4aBJM}WM4-rXU~rCy*~vp|^0o;lSNTNxdf{0=`3A zl=sGN#Kz*Jao~*!z`v!B(=t`7tX)iEdfy`f6F-H6xn5%45c z$E2u=cPdKRju7b&1{nHh-VBK7JTR7k1nvcFA0!TV70O`*!VXiJLBD@JHVlZhfMqo=6 z@`pL(LPX;mrRxDi8+-&NjgY6Yd<%EL1@;F+)%Pwzurg1<2;>!>(5Axd=)eFhNTD0h zLmcIsQd9wpBF9_@8`Rj3-Uw_^e`pf^&2-v?NDOfCbMIgVFnJ^C=1OkkhmD$FB+S5D zI(qPU-g1ACYXxQZI3o91=8$$N-`q>Ea9`LjohVaCsB&U|6iTJp< zG=O&Ja<54aGI;<}2+E|WMP*tI(sTu@Qjl4KLHO5pfD;h{I9?bQrbFnWfMKuU|Fj*3 zb*fmjjsTtIy{IyM!BYxxf%Yc*|I^+UlrYd8o)Gat$K`?|0^oIveJfyOj8_o*^pcbT z{sagiKzI#48Yf3`>2bsBmRFrxf7UNQNo{ZnzmHl%Cc6w^1y%Pce+Y9UP+w6EW3PO@ zAMoWI^~ST-NHXGVbsj50Sa(f8RB8}n&)Qy!d~j1#3ZUogIJyH^Ab1o74UG$+g1GE^ zCZIJ4A$#!)4mK&Gar*-;DJ_uWxkF%{ptW2Kgc%k9d+&5Z*3WVSJ|R=*0# zQ|zv3EmZ!KrI&uD#ec5J!b5z?c3k&)fJ#zF?*p=L=9$@)RJsnj#cl%q_ug+8{$4sq zrk=0c703Uwlze@MjhIS@=?**b%*g?>Q%Vt06i22{Z{3HQ3gND_eB}^Y*uop;*7J%HwN|FuZue4v$5Z*q^ z=_GrG%lk=s^+jFm%0_NX)I^=8tJz|4;&@Pc-lrezwv}L- z-&cJ=6Su+0ZwazB;xJmk=a_{o57L)IPj83`)_x1d5jn4ZQDfOh&sw@PK!si4v{EZE zG9HE_Vq?GM0oe)juDBv}3^Nr?60t>h2cL!@KVDHk3VF$R^t-Wu*t9J{cDr?}4C(Og zR|a^u(1GG%FrE7z`$8MTp0budtgTx^#692}{_&}ysCyaXXx+d{CfB-V#)Bl?Yf-5N z6_GQ_Ko98bvj73%4WLvI>vmG?uyB41DqIm&RaL(G_hb0YSh#@nfTSw!)rY}@^kkg1 zrhzMKosW=2;(m_IQ%RcMTf_(fYBCk-)Q>|Efs)Mo%lRen^2Vf0C6U^^O8FYW05hMw z=s|j4hLU>H5DsrnN)Em%|CO7&8(QqBQt81LRX10LR)ms8lAgsp)>AC(JHaeWUVr~) zFmk3=wi|4Ke+wpH3M1u^-FMi5w1TG{L*z7`{WwVfCfIt27=1A&_pVi4jCGh5BdU~( zdg5uj{cBv2q$V+urquU=f)&MqB@b*k_^bTwk3KOfoM75hyFPjr4h+E2QiHZw>tiDx z`AUne<$A0Tj>rSYnGD(O%E~0wxzD6g`kqenteP7p4{rLVtdEH(-~-Y7S8`S|L{VT0 z0ZEv9&$AjF6o(lBGQL5_XG8h7E^740=>S`0w`Ho>wRhb39{=QYD)ZLX;;VY0+zqCB zq^IX}63^#S-e-&p#aep(aWj;H_XNevzaB+w*u)6w^``^7^F<`(H3=m<4IGfO3CG8% ze0O_lEBh_40+4Wnfk3Kg`2GPkM{p&uKr5`C4EPvSkikbJIt?Pe;qc4r83|cGfwzQj z;5H5p!$1j|8yUT+w4I}-)0zgMY;aNtuq$o{ZaN$Wnkb^$$~3~60TZ+QOPQNa5P=K^ z-2KvhGwXaMOLm{88j4^wfXlP0Y*ap>AlLCsNCp?Imj+4m5e^3k(8KVdyQPzbV*^`E z2@qxwK+@HK&lswHheHu>JMh|f@qHbT_n^tnpm8j-5u^(r16^pE=8unAD+jhexgk9( zxK9UF)3nQ7Huc~DpJnon6FHy&E zpByEn2+T@_x9@i?d*)hH1nQjYan+q2eykCiaZXdP6)Tp~pL(9o^;`F;zP`&Vn&*yI z0XClQ0g6;#A2cm*&e|j56%N1U@30y3m1V>e7IE?q;| z#eS?u{iS!oul=rNyzsg~j=)8sG;>uDNRBh|E{d za{@~IBre?$zP(obvl8nkB_;wg8o5^JUxII9Fo)?-^}l}-pLXvYTa<=pzI_x*%sA^T zL(>4nHV+{l4H3utK&de5!Ux5kQY;fqnz=h;H>0G3G|S@l-Q8@n<6|^SOVxulyGpwl z_Sch&hbCIFqEpM9+jFq4>r7rJbCkFN0LEd1FMJ`le9j&VN zuIkNL$*rn{Nooduiz*#ndrqLA9~r1ql&F0sXG96+7JL_53vh)TCeV`sc}yn6m`1YT zQO=v;)>ZBW_Ixci_@Ji{Y=}Rqbkn<(R?|tLLD%>Rk zL^q0@>sH!~WP7DRQdOCBT=(p zPQxz<4?(yT37G^9AJMZ2FuEBABL?sB^Gh2W8+Wq{IsiD{a2yOvQp9&QDgCcOY0c3K zl{e&lKe!R_vzt0a{Ky!R*hvZTILvWvCZnybZnNBOCllKg%?)cTH4f0UGfFq#wu{zl z48Tf#pGx_FMx-{4{tfZ+a?8+rb>bj$GtumbiE<>5G%Xii9845Zon-W_HRb_OQm;wH zx|@6*AN7`_Z5wq<3>^2bJ&RE~YS)0XGuVp`oAkAs`VL0=+mOYBXplb-7(dTPN|PIy zMvv3z)0sP#B*wrVe+p^yOuCmiBGxZ=COM=LPPK~W1k2If^lubD_)^bgboPo7+;g0& zHNB>E;x#kep#*{(NJAeRRWC&?g9_q4DI`%ZRaGiWtY6g*(7ly66}GX`nY%0e>M!h~ zOPS1F;q3+<21BLYfE;OG6bo4dR}GU=fB zlEk<-O=BwLF^$NF9Gjumt*bM&j8pL_neqI4W?b04;=a_Ca!0@-GU~9NskE`zd!3jV zwdK;!@}Np9fRW6$hPSHj^~;$LFJDoXSWg%ivM5THknAv&Yo05M@B$|+pyItS7^0KJ zrA4gR^ByW-{U8bG;jns55XH}~dl`~-nIbg&kT;p9SEP2)d`G~3 z2gNcYXisSV)kXqfTr@a!urG;}ekc6$bDIPq5Ue@y=T&~EnN@jBlf47Etrtn>M2iyn zFVy0!(rPb%m1mjq=a<}b!o+%&aai^pMdMltm9{`+nN)>HyoKjn$obCLl^*eVahN2g zLu6zmBwR^INXk8q_pZ-NsDQ!NK7l=vP-0#`ai4Y~F4=I?2>_=f9!a_5nWq>2LiVkGZ}0G>## zq;Y>CB~QwB&We`sjxWzh0ox;8;1J|js%QYU!Q{P5Gzn_o;gpaICCLFJ0Qw4wgQbCP z6%Ih_$=l4(E`!hJAsyCv!v&bz-+^P)$*I%^TwQ~B;A!{5iKuX#B7nB!Y>{~it_2-R z(wWJ=c|Z1s|HA#*0lNK^dcGQrFl{_VL&K4R!csr|Bfu*td}?Ar1ZrC0k8!{2(M*6? zX3qC;kTXQ@#S{{9?tLX|R$~nm737})O_)Zk;`3~9jytVL=!aWQM*V27DoSp{}szkI%wVep;f?P&%pBG1fw0n>XL)>yvAk7Ac&OR>z3gj3!I0t>mP6cyAjq@mg;)l`% zv@zL>xV$~I`uG*z!azK@LR0QQ$LNNBQse9gQN$N=Y$+d1gAjrN2t82O2@_EO0~vsv zAlR=+JHZA4Dg~kzhe95(TH71&1WmOoyyzJ5%;Ep`>|zf0uAspP1$_oik@mG)=EwQA zr@y*JBp_q!6)ro~tP+jukQrjLx4(jd2eNt4eBy{p8$>^O=(;^FqtyYI#o%6s7QZ@7 z5K;jKyoNKqJ$Mi0vne8e7^x^PZmEn(*hS`Zspq`e>_7PvRrQRy-o;>poR6 z)b)*nAKylwea)>eXQ757ew54?ih;TuGM>1>tbEhoLmHx1@dr(AN=DPc8CQPw($|l< zA(((;0U-FyKEvs^7b!|j_g*2~9?xO7tAMVQ9$v#!_>dyZ6-m@%$x2}Hb+||YPxj+S7pY{ z3;(ci;IxG|x0JQ2i6FdZU6yt(;_}xW{n-Iad&6Bo24s|~Uk)UTn!ygDE++&dlOnF( zTxmrOZHh^V&AA0{OVUTJ(PS9a&}fJT6g@E!vc&w3$gQoH>tCS!ww$x_AyRfFv!uqG zbMERqzom1)30Td4$mM^;@!*efgv&Q?dF%|CuS_XXrs-29q{p{kb2iAk75UVZnSzUh zGOac;(`}XFvntXzmM^w}poLgan_?{gxJfo*9MCcEB zi+NpidKW_kt^#l?q!gy>abaPtBhfL8`Gen9RdSRFeM4x>q zR|f%%g75A>AXNvr%mmV&Uv2z;%Kobs03rDi>`Fj@X(+N6^IwrYFy|;RuV4+~z>97= ztdJbfCJi$3fww@qPxBpZ9W?B4CLpti)e>3o{z*R{fq&$kf+R`lAmieHL|n*;tb zMyL?j?Oj)WLKSB|%|w`95mdMYk-DJZ#Sdj5wQ1ZC-J$V@*9Vjkfw=O(E!Kan+2xY~ zXH7x054rvTd_hR$OU-u$nmdx$C-n@Ki%KW(uuw0s_1sBZ@z`|Jmld3M6+7Ds8!;E% zxh(|HgcI#KI5~%9#g0^JPqurZV~!sUC!ZX|=-8x#rs1!@y#$~zrv(RIXFI7Q#Z|Kk zsi*7amNT`^8%*gfkA!lQUuny3+39{=2E9+*JGbJnh#C_g*#6GL-$fv%re?_k$!#w3 zHiUBIVDVN8l%lR;)=K|}A#0TA|GaOjaLsNq_{WL zx}pR%Az3-y^b(_b`06pKlql#GD=I^C*d-ga6zWgQv}9%^!^}azkXSy&)wcNz;9=Jx5O(sCpUK`8eoaCsmN8OEc_u5{^R`#Dd>Li z2UmAMaGA1p{yhaU>Hb{Fs_%|FIO0&~9v~f- z@(YQy7-e;(@?{ZjL z52GEBI%A=ff*CFKOB}W;Cjy*g2q#aWXJp=usBA7)GWLY6Js~m^O=aT_uRqvc@VSGI z2MH420rK@n0eN?JlrCs?(&zsC)r6_lTKvx%(AamT4!~$tYPt-L+TFd_2k_WSuVdVl zQV!V9X|iBXpm2mg0LjtC=>uzY()1=we}hF#c0&^wTvU4xc7|gcqf!9+7Ne)|!H>6v zQe;H8oW98I549SF`%Zi|A7I=1vN2l<=2B_b*v=NPvuK{4S#|w6a%gUCYDl1-HRq2x zlNeEt(|kVZI5^(iM$zZvN8(WI5e|EO zX{$b>R{046II!#gt+*f8R$rW$Z z>Kw@E?2`@Cp?+-GUcAsi$(Tq6e9fp-Y3}FjM1{AXBey<*M%mf{k!Hzv@p#0JhQdZ) z-F+TMjCc1zx-2__;Yk_N@C6&0?{^{pl2=8!yvLH_UoHmd^DlP`_S6I%wT59{*Z}^= zqa6RSh+*Lj7~=1!IU}ui3}4)unZxrkKk6P@ys?_u`2-oUp`PQF3Mg04s8D4_bk3KP zN;x7+5IfWt*oj(MtQ1k0lq94PVS1*x0~+0=PY!py{>h=seuSLrk9(Im*m~xU;+t{b zvP00*)1$_!8Y@=jI>VelOy1wV&>vdN-n%MeI%quv7+a9#O}*=_3yDOyH4gF((Zjc6 zr_*grkzF`{#baAIkmt8Fu6@G9xD6RuZ=*x$fWhVMO@qF}$1WK1XpRi)4J2(Z{{HQ< zfMSiBtu1?ysHAc-vCotE`7fXvNB}|Wi2qlLQ)A0O1sy;-UpjDP9`+GH-CyX>fB!2b zd70D8$Y*Z5hGEGJ#<9U4ynU%<|9ut12QXAA4GP{H7$V@3++}s|i(~6>7hHdW6u@Hz z^i5*>H3JbzChdZ_i;;d*0y{j*N8P$A(W_k%^k6G_1kCQF?1ytSi3^d4GFk&Mtzt^E z1)0wffee7o!pM|>1N9IBJhp++(VL+E89K}5w{LJt^LRu>70315IBs0O&NmlS{iXB0 z7-%`wCi@P%;R7eiPSBYXM5D)qTP_DK1%(QuoIo%)>%s#>l%<(m=q){rVi4enI~>gw zm0mYD=nSQT)R5d4!bdco=R;whYFg+ap`pVUD#-ny^b@k?XtnU03s4*yWDm@$RTTx_ z+0<{zK*xL z>j!9fjGk}woYVJ|I08+b3w5rEobTD5=SXE?)3_@K2-i~uN#E^XOPo6~d#19I z5yUC(D>!kK#C;ex)Nv8*>1@Lk9q$*$D@_pyS=w7 zgCl~PjC(1{{umni7dwF7*p+6t&VGYd(Y~K5iSAN1Xqz0zx--2AJy?i99nNZyi7ar* z{WdHMEPmg3e!4jV8Z%6m6MrcGUf@?8Ve*Kg(q(devp#oQ$`-P@c~iq&Les5gGOzqa}d~BT~3J(s3#f7pA3$Ze6w!9dr~aj-*R4bkVmjb0d`9TGZ~Me#0AXhmkW# z@9D&Fb#{^=G_L)rUlZO!rk^wwQJ@ozi2J!^ZgP&|;ZdyDA^Ec)YW!BC8~UCrL1EOP zsqG9~6^@{Xe4gteh?=>s4||~OT=!<)7VCVOB9yq?b=4Qi3t*E2f$^W@1tF3SUGrmg z>(yA!`w~!X0UE~t&e9xYMJMC?9%#Nf+t4G=b27vis(~G;s6+Pq(&h)@hWkKr{XY;_ z@Dg0%Kh0NAGn<~VF)=Z^pNGfCU0U)r8~X1JUp@;|w*QSl;W+yO7ls@1FcL3$5y|FL zQzKYmTBKJ}m($ys+O!p7yKa>d4yraTq)!_ZE)y8LwvCCg1&O~iXJ1N)Lhx0blbN|w zDv-b5^mQoXC!mRKd^uG)8hsn<(r!fafwJkAvA0@))aL$=<9|i|atjbz1T}-kf|4#X z&gANB(dzrfTA$zBRL{S!T#zvMdx_j#V0&5?YenHuqz2h#Rs{|Fl5JtU;G^q)=~{ zt#%>s?y!nL)MYbpSma-YK46laHV6wBzpSBIs+@^<*N6QZ3KjuZl*xy}wmyQ4jLiRZ zM;G*xZ0nD+|Er$hPl2ZtHJTvVC=QCjKv=R+R0ZrN@S~d-0Jo^-D+GCqqW}_RQfi4R z{?b=NLkFQ2>T+DL>jZ%JN8+aqr-ld$%fy6w4?+m>$S1Z4lIH+i^>((m5u}pAbfDm2 z`6xpVh@dfDhQEZGq-0~(dt`q@#!1>ZW=w2sbZW|rk2UYdK0cpXTZei4U1X&H-&&i8 zY?M$?RPOp;&+4^G9kA#v_kYin+s=t5Bqq{}zS-aEq}lg9Sp#i3S651P=T3e-2&lq# zeU3vQikO1CUHo?*u$3W>c1n9BiSk1dd>*EmMXVKDHQ0AE#tz=q+X@^E5(K3MbrrMM zo*PVqh#=u3j50FBciUEo9g9qCXY1oRn@${r0J@>2ogH@!cLc~g{uSI8FMNIyxo&qe zL-^5831YCXUPUf(c?mWkrMXr?aV82?e=QtLgTY4=Po${mSs}>O&mDwFwMgecr1;0* z2k9R`Smx54{J?gaFpV9uJsq>%<=X*uJApI-Z{bEz-Ok^-VI#b-;7d~fWi*J3<-J|V z+yTD6##Hsk`t6<+^f!Ye_fT@TFo~Z)*_I(j*ir`!4GZ^7#c`pXEzo)sqJRUd2O{|XuuN7O;h z9+X)Ib!NB8Uf9#o{ZG;Z|M=?PxNqGTG)q7XR0>EdP%>NJ2h~{*W}G60dj7O?dD?$x zpT7(x{A1xt6%1azih1wnr_*8S<}u1EeyNYiG0I2~)sB>ulv1YuW!ZVd2XNWh*$2f= zN5qDl$Dfb$a)D}FIteteJva&dqX&252i)J!f+nOc>EGq(aD3h=gqXz^@>S_(A1-Mx zRy@r-RER!!cxqdwo!PDsLRRR!u>a_r5J%pC#+iO$;XurbkS2v<#czn@0)D>&=d(i9 zKKnckm%QHsYR^hWT{i{VUYX;ctCqO)&(=M!q4Y|i_nhCa(GA^R^$6WQiM6dKJK*v< zDTy0UWlha|N~@GDu~?zorAl*7iZ`nNbp)OdztS$eOO7|%S;BZ$pC%gn%u}pu{-8oP zi}v->{*sJOf(D zvdz*!_fl87@Ha=n0ztt7qVrT{HQ~sf2YRnRWuI;L?JIa|9V#*z6Nfgbu72%lvtAOr zQ6b||n=y@<-I#$H!0qI&!9o|2ApQ|YW;;c4$9(c!{npO;ZuG!v6tkaZEvs^a_?P*n zj{RN4^V4ru{ERm01^kSfyQD!+Xf3KsQ z1@=M7`o#hG=2uKYsO5Dn(bGMsT-bemPH6aCxA6pLc# zO%fw_cf4EidYvp9C1f>36Sb`Th48HKmFdZhd)nU+KMcIRw|3N~No>qEU%ydq(LLD8`XzX&Fq=Wd-#enk%r65mc7?{p8fGj)&kljR*N z6m6jdk3%?$Dwh-<2U*>3+d)gg+VXJrRFDpJbU!I6t5z=_a;V7prLMruMrv8D%aC&A z&#fjK?`1Soeu7(CxA!R=eLB7mIHL1o-(nGGU;T+a{G~yBoK?IPt1l4bbl&C!*#TkE z&2(Af#yhpeSZAfNoFbj@_VXhr1DlAHM4gP~UojLVJK*iBfW3kHvoy&igQ($8pQ2W{ z$n$mC3gquB;r;xn8ON#|y{!<}O?vHaOW)SB_^$l!>8*VA1m(R(c3~A0bh#&2U(;!- zp1b_4&`>4mp!>$UIT~dVRXCofT{!gVQ%(Wf3x*V&?X1nLbl#WLtGQ2FJyuWOe-WJ& zXxlutShS;gd1v(*9nnV=A>1oGrB*FS9)-{-^J}f=3Y91P?OkFF ztNLX>ajR)D(Y;<>@6O|=iz*2TR|NRU0$-@*Ygo#Q_!kb_=?9GM#af;kXoc+PxSr6g zXWro5+c{|3?sU9Tsoe2R&?jx}CQx~AbEaP75&tA{mS2__7YoC;Oy|mMNK~~!x1o2modq$seK26umlI#`i*-@>OP&wUV__)V_c6ae}vKOHP=wz0gkBvo3 z0i8v>yi7a;-XHh!DRZjit7RE~>yS)zSE1Ptx-n#CN*%6C*Y%nZ!>XtxanZ|IQ8{ni zq8zE5{WSgE(zQNL&Jh-|n|FTaMvnhE5QFQ;-ZAzv#^;9T2II3B;>3#i=;3lUD3EV} zPyuWL(})qpK#}eC`}O?ZXoMhQ6)C(SDkNJM`gLS+pl|qh=8nR5!P?TtFOIaDSyex3 zW>|fM_tw03jpT}9(f>J4=bOlPKa?{@K0f?eVMvpf!?(^~ zPkSxY2p)Zl5S(ot*4!(*!-utYZ4NPJ8bS zYYj&3?DlvqCzZj;9zqWfVI+^VoTQ6T#snmLT z0?koUll={mO@`a&ek-pj##qE8wW<+})hMO;EJ1Eft**#0;+`%h=eUt!U5sN=CT2kEw~Q7>DIgQJ zo|>b-{!m7VIw3o9?D{a=ORP^ox`4D-jeS?ehr@ZN^o{km&_5o$IHh8=)W?O zk#7np+`s0Ap{eG4)cjf2(rSPx0kMZObBrQFtT*#a*1w87I>tuUXh#HkoURf?*5p~C zZ87f?OLRZU$K_Lo)aba*oZ;r`i=!4uw7*KzTqZdE^Ie=@e^a{BGb z@>e(dejWMuTv1!6Q9j$T14d#wQ*&tg>l2q4G7H}ri}N9nlF8ynt$w~g9G#n*^$X42 zO7jla)EZQz86nsM%De68E(6AUS$C(%1R9WCWQF`kUr3Hubiy_=H$}=)V-7U8(+#y* z@RcnMG?R_qfr@xgaFKGLPG)9VS}TX=c#lu{>&T0Nna8%mws;L^^^qG4!{Y2n0wHfd z9r3g$7_+Bex=}|vmF2f}s(;j~%8ih}hAr()AI8ZARJMVvs zTI$Zt?8|WK3Dw7A=HraR2YYxUa9=pT4US{p2_6a@-m<=Pq;K ziZmP3=O$6!#+-C&-4Pb*7v8#mIg;S%sDN_RS0bDd8r`ibm%-16{G$(q69n~GxN#Wb zn}@&h2t}K%{60VaR>mST=o|==W#a#fx3`RoYHg#&j|c*yfFPhqgLDZZe8|azhLw|~b$QFCS-IQ)dzG7{ zE-#fj_ zVZEzmS=P^|qecWk_aw%H^9M6LT>J88%)8;VhEq4TgqNQBSoCx^yuJ~?x)3)G6geI~ zJOx(^uwi>k;D)kmSOnmcFU|K{t6j^~POrh68BCIR%^cuDfaov#qXVyQ;NqN6P$?xg zCwzGDQ=fo68%vD8n@QC7#ZvmGj_*YeLJPCCIiWiZMn0+;*calANhG&ZUSXshVzZ+{ z;1Hix{Ov4>8ff2*+u1e}rZh7&5payk?lSVL6WW2nPaJkzQ#z&hT)a=`O962iRy91g zs*ENi{F|KOscG)He0pY{xpJbZ_1q<%Ret{|cWvsa^u(K0g|H|8;Q}FG5fcHr4j<=T>0nX$WL92B5o8qD7p_kNe zwl>vmKkf}CQhmmk1z2W0X6%~DsAYL=#aEA{n`RSlIQ7y6PLQ}-X4i=aivznEM0|!M z^lg3>;?Y4yZsfD~67O8Bh@E)E#$$*R;2QK`Pw}%%|fnPRHz{ zebJ)AepE+FB0-=$$YE&ufelTl5L?5v!DpicDFUr4|Dxd`5v~cGPcc-T2({wXJ!{-_ zHOcOuVdssCe(h~Qqm-ER-x()k+MM$_pLsx)8oqfzLz`$>4=Z(L?B9ShBP`UtcN zk*c1AD5rx@e_BCpkN*m$`-SdEmFMz^K)=8-KBxnd!0>&BOLOv<;KxL4_TD!cvkMeg z&iI7O1|O1rQ$Z<|sWo6!Mw>AR9`p<}Chet!D;kW~TKrspS2Bhym;D&&S({*rocFSA?gy>}ET7wDk+|p# z5x4Tprwkx^l4#j|QpgmY_+6u(V3jw;@*75fH9D1bcuIM2#5}s{=%TV9dih6ySf84F zcK$?lx^ezeb>^LQ?ku6i6y3KGHYIS#q$uo^an9dR98RuUFtu@v@QamE0FziWwbuMerI6+C2~IEYA;}ZR>k)#LMgU-5|HU zL3L#j@Jq*xP=33X0`%4LjV)@Mi|;NQM8^ zeKftm;+o8L&2i!f@`SxDjJzir-QTA)#P~^vN%+3zcP#`VTZ*6KF4HeOO4~Jyw5jRm zpr3|QR@3rfQus4jjm0$G-i^gH^_;!+D7r4_gKhprDRUlf)ZL7-tqpd;4>AU%4j#@M zpZ)}2(rl=C9ShS&R9@12$ml5MtX_bKtWr~-#RTXU5h}ySDALp0-N5tA?C^T7nhbL^ zej)xQK*v4>)a_lx?4})QcwzdH4r2DP*e9t7;{znQtiB$@kfhEr+TkUnm?}km}YnyDv03YnW z%D&5|JNDv*^T)3c85IJDr`AuxMx&TfldCux9nX|ou`#A-2-z~2SeF~zye$h9>iKJ* z{1R?VSNA#3_q*KnO51LW`5FE0$@>*mMT`}9j}>=aKZAX1619eBm&da7-RVbD#?{OrJXHaH)$bZ34?(TI-B)HYKX7caUtR`nB9dJ z3Jdg_<5FwC2B|ArxD`AJ-(@hpnmX}{U|inU7Nfp;Wcb2RgeLPUztq!sc7S9r)H+L$ zEaGZ&|6`2cUxfiTRTbmKdb8wd4aPm_~JDe4nz{jPN!WWEeVkv=!w`@b}MswS)aiX&gfO*c@hILMLJ35SHw68 z3WcQP zavC4pN_dzw6XFXMUNM-%*eU!8Jl<<>v1ja>tQ2J_`Mp0+TPXI8Iby9pq=fdPcJ4D> zdaT%9T(RBBYb*;GVRBf0`tX@=<&s3wVm>2$uLj3{&-suY(agSeK8$Ly;pYQx7VphD-f)+6MtnB|NJIS7wXN`TqE9wjWm~D|qGs8rgLhMe=v^RHs`C3umysIT7YJ36gy z;^80cxQuzy^n_YJm51PKH2J=9{X~=5ZQ;r#+pnriO^mhc1j}lYHSInrO9VR-PXk-$ zF*2|vpl=^>0Tnw0-PMmQ)nhA(1mo3xw{pWs{WIESozVJ6vg5^{SJ8PSw373i&9a8` zWATzjM4EQACdM8JqG3XFt&*PLoUDP2(rBAyYZg*mEG?LCwmC;M#23kE!wMy*FAw`<@Sr%lXe^f)+KZ*shk+7;Gb1#JBZo9lrn? zB?;)O1z|uxY{_JjZ25sM?(VZ?poM)<$OLxV2g%Wwfs7?@A*BLyvc#A1_XfdRrB&=ky>ygEe@fg&AHD=l5c zx`sg(BLJ2JO))@xO?dZzTU|nz%seANo{?oFG%)}Ym@dAsdY_N{UfdTqz?_kpP=*tX zS0%-(LLOJeMxw=l%s9)*Ib^kmSyjL^CJZWv8Jv2!N$U7fOdH2nb5a}`D8Efh4H)@i z@t1&(J|`q*j#ds>6QS$Mzz>iS#oyOz@)I!eWN5-y#vqj8^Ww%62EqY25wrFuT;Fv9 zKxnW2k&X;xB4o;7`udUhsrDipHWrxi1)vpIrQfKG&{B@xW_$^P>ATnG1ug{@n!%8Z z`PVYx<45;@`zsQ&nO$5?^SQDGD?)l4yI}MQ`=-Lj@P}`B{r>x)*5Q=2e1s)vGXr$Z z^sI*dTEs_;M2>P?7fk5;^~%Jg0p~=fhCJCTPLTu7G}Rl2o^#eAmuGWlhU)jw)-@sy zCyeB*pk01GZ`F0nrALz|4#>dg>$5&qWd@2n*BO1iEF$5%78&JPRuJTUtg{n!YmL{yNC3;yCl1 zh3D@+Pm}PPlVnb;pT*D@>JuL}I`~rI7ffhQo>r-bHv};$cmlGNdZnM8c)Bfy?0pv@ zu7iySG^k0&pkuV`05o%weiX2(OuAqvanO!}M{oN!+Md zCq6KK;4vUOZ6MWhN%0`^r5bUOj<=roEVE3VKWKQD3D+$R6-8f+2{9HJ;w6T*MhF1Z zTXRPABrb3au$H6e@b89{Q1y*wF~K&srFX>5;$ zSt1U$$+=rG3q0YdP7~`SrjN_Lp|`nMyOU*Tdt+qctBstdL!V0G%s6UKmZE4wx_MoK zD$aO7+mCZjV6Y8I;&-&mei`yf&x{=V)1|S5c+--Dgqd+j(`no>ikls7b7r!- z_h|6M!*=414#G6ubbEDNt?%jFv{VEl>k2Nw1>e1X{OyXHUdqwvqrHWIz-Z?F;!UqY zLIC*6-e$mo$mX#u6Jshd{Cx%^-~0k=9*m6;4YhKF;1Jb|trfjlU8#!cR`ea(A-nNI z+e-dHsfx?Y6g|^1&Ej(?mBuUYPdHE;J+{bB?GV>&E@RgLsZE^`eh!uM2ez6Te+}>F z!`@=$QTJD+iBfb~GD(E1pL>uBf@Xn5X5+2G;OV=e-eQg#TvK?{CIT3`Nf#1}FQ7aiQZC+ExP0H7d(XHXmDkK{Gh0 zKme$7IQ4P3D5$pBC-Q2s$SCA8v6m;-Os;b`S=HM^RyxI2Gg#)V5Oy$)%fXvtTXz^$ z60DO*#fXj?&d3ry!p^%%B{g_CGAD6MIq3pb1G`d+N~epct9TrN#9ORF+cpt)L#lI7 zly`Fq3Oss}t2yUr(=cEM5NO5q;e!#HnT1nY3Z+EY&9*QgD zk3ZMY%UjU_-0H{@dUDHX(DkyN!Hd*HAqAzo!Q-3IW>t)dFyCe{2 zbW|k5{%8fyi|XX?_QZy#$KSl6C9l%k_Zs(CmqvwIonuzrje8CB^oQvvIb z|7}+({HXZ#2v!%<9mgEsb{kMubTg#txvn6i$?i2MEEG`9R31k-HP63WrSBw-)}@G? zD{`Q|eh-Nyog$7E3U1G(g~Qzm)sWWvo{NuB)tVU27LlfpQBD>$i#BzdYe=_j(dUMW zUG`^jzI;Vi=ZO3oYy7%D;`;ENa!U?a4`la+TVR z%ml@Cny;3|_}COLV093;xqXXv)(}1~CnEhj$ZMJsGc$pB$$ib;(HDo_F-E7?v}J)p zDQJPL0$WF-L5+ir-X!j)q(C>OllMpSy16@X3nj$JlA}s`l+~mzW%L}J(*G_vh_$%b zDe7ZEL((V4Yp60JF$+zU)ulqmfQPfgnR~pmf!SS6_8#CdV4f5IV?7aOQ%`ZR;XH~Z zGdBP&D8srp?j0b+zKA*1-+J<-jb~TZ2%c4DF*Neqas)7vmrcf%BTkP%5)F`{AqD5Y3-W+C2nr>sTjYW>^7pNPeBPtMms^w?;!^kLgYcG5S8p7r*v66HI>90* zDqbY2l}NGJvEj<`5tju-<9%+^5pman)A`=&y9;A2)N#t{DwCCScJY4Y$xlw1w0Zos zLjTa{L1LBfxa6Fh_Q8ATeqSCGE!cWZfw<7glj?==Sw}I-3%0luyPo^rDA}RL6IP2y zoF`Q76h@0f>ybUR1GiZG8=3FeESJ?(c3RGOIVV@lL@RLp${eAOgN=oM*5iUEhie}u zDx6ZTZ%y1f$h~N8F1m|Y{F<9V9olD&;3;)H6a1t(S;>Z~SfX#;VL_zv8g{)Yh|Zfu z{HpAxo`{AI8N@CC_BXfdYQ9RZ^8T^;{=6EKkoB>e0ZJ-f)1&H=?(5ejQcjr*tJI6s zJ$VoN(jP^NCzQp%D_3|r^I*E$>TAe%Lo4c6aJOX!-o}A}iO891q^gqpIbInbcL8v` zB6@_nM8WDzKHHPSY!j9avXgF&20F~XY;17-G;jS|%bq7?#_2=ZxTnwRi*L3sdstbT zO2wu_8&zLh`Y7Lqh-0c0qZ$xxiQ8kL8G54Nkdv$vnyBBD@T|$qdYY3n6HNrGH#~6_ zRaV%@NgCHnVK)W}SqXw80PYzj{C`1=*QEvsc%_-aB44D%Lyf zCL=|pddY|CRKju-$$X1K*30!3LN-%oQN>WPb5exo74qI`!~R4~j-?X$1!-MTm^S`v zQSEt}ORMJ7?Vng~Ou!S;Bdz5*gxRNgw{~(+r$OKQoMMXNbfj{6`;wNnfeXPh-TYg$SWTtsx*ubNoUxeshY^|DS$`OR)~@>dlE`r{Yx zMK#2LBbe-p2#Zc}lWVg@L zt~U|Su^+m6hm9%w`2fTc%#Bp+KRSWAQIzbpbr#x6437=v1X*b6R&n(<#R5zUM@>xsg8^BZcJ&pAHx8Jhmp)Bciy@;J}ZDNXro!BV$JL6nDq13 zR6lJnUBY?d3}-z;&=+DeRdA6I4QV>I_pd3MPS;FTny#5>5U=e6MSqi13r>^xULZGE z#f#wqn^~-;oH8QM5e+CGBsS`a5fnKMov4l1*TSm_omzD&gxx|A-8h$Y*TICZ&`aYw z#nhHX;V*?u-G5cTDyQ27ZAfk&zYhg%=o&E(^v}LEpR<)0=k#E4VS!z#TDxSJdSS~2 z;^nCYrM($J(X_&=NKSlrt^eXSZ5bYszySrAfc;Cpn9@eSnNE;MUhLQXS?e!+ME8?0 zoh=N@+?Q=Y%67|Vh{i7-$QIGkbnI-+RXwFhON#Mbc(=IVllH2XGTVGSTwP!WUu$mq zLj--?+;3ak_I0u*^+!*ONM}jiQV_Op1a40k`Dsp0Z4r2{68{1_JuuG^$~BtmZAA*; z5ddh2$IMx4c(myWt$pv3tZ-QA5-5y`vb6e2>!<5YNtg{QLNapb9WNXgP29KQpwU^r z?)wR5qqA-G>eTXzW(xa9AK+YLo3-jpg@~D424$paRY+0u3#6$O&H@N`)%Vb25>*mE zXK!kd#Lrz)=nPN8ap+NhAVr8UWbj3aG-q85e}EoV@wN)jlcA#c*$s6@T5%`;gBeFN?`nG7FpRzn;F;g@}T(QSb>Z|A45PUIs-78F5st4S|EJJJTuUmzmEx@^uk+I43 zQs~rQI-JmQW_@%xBSki#zg>}H*LHB-ak=baoCvP<%=D<7Ta;{QTFGEOyNNJT1-WY* z)`u@66(Bzx*#nn=Mlkuir7i5vpAx_P)t;$C*u%^vPAn0=oqBiIOY9Kmiz3pr<6${! z$^%yAt${i|xGFjiUg!9xEzlHIe8{ISk!DqxNxH34!Y`ZfcwZ$V@AoLzY&WcK0V6mSAX{yVFq$GT*u`uA840NRnZG#)!lHkc$Xv)%MZK~mvK;Z#l7=E+`ds`+M%E1AN+(P3J~DJe|DT@VF!JuoO`uBuwII`)vr`Rm&@A5SZPjd7RQLCFR+tSgLwd_n@}^P zt+o!CzbR5kf9$3L{yHI~@`JRl1$V$hK~br@%|mQ=aUer>ivc8ZpFhi6+Reim zds}>tUjo$TimkaE2-^*{h@xZbZD}+zV{G*QLS{CXaT{kad(9+Utc$P6W$Ie9dtS&ALL>3F?8SRRZSuZVok*>@ zty62QA2Vgo1+p3)%Ie|ybfn%RJF`u=DPj>PBUjkRJBcKAiW6pGiWBt)4#g(TUtX(z zGu`hgA}n1WAF>z4^E;(@c++xbOd-g#D(P0x1}_&=X-*SMxqDrTFFmdk2Zqlj=UluM zW#ijTLie8?XELV}Gh4Igh$*G4q}^;~r1c}$W!@_1k26k`D#%|>eNvum)|~|&us+jX zo0?{Z8~o*rLduWvRbs!8eRz|(pzsO#K_=PpMT z-t=y${M`67NN?YAAYgArYeUPqfgl9g>1@2{YXa@15z!!)*}d~=2+6aA$9gGdf8%7? z8I8)f01?LZZzsg8@@tr^J0{joXVRtFohHHvjg)BKcbS!>d=p@0Th>R1jfY=6^{lX@ zXp=4C`Fexh$X^Y1J?W>jD2^X#vI2-p!z&{5p%&=eg7v&sWy41-l14i`$c1cm4P{wz zL{_Cc7D;NFR-GnMpgu1w?~P!ZS&#-0iltz!1#*~bAZy+&xV<^oe`55v6)aeCtt&y` z`3=ut_06T)rP}eaQ7Q6Qb^I@d>~DopsN9RwXveukpOf7YPts!4_K$Ow1&cZY-&BSp z-%i(YoMVf1`5?ZqP@!N@IRkcw%I3pI&+mcNHewEFBMBv)tS>Y`p+V>}TcB8V>t3Wj z=!Mou*+v%qv4Z%r>xtwvtbP)Y*>z;l3B*g>g4Me%H{R^N{i$hb)9{E=<1woKtodN$ z%ftEK*|{wqEUm*YTWOV~f5$z&AkW8vREY>GS_)W%62&>yX|QGZOL593VKI|xIKftB zYSMj4!j60lnevV`P{SPVAg~&AtBHW^Pim62f7;gr`R?KIG}{fBORX#w=cbzFaCoT9 z3fPMH)dYygS&+YCLIy@_lnM;j>?61}P}=dGmjns@&u;LSGRe~sOn9J2m1y$D6nu^u z?c_EJ@JmU>2fHAN+M%6Qtui_Wr19}6%}wbsKC!qVo4q*`kAc;YRnA}*9#t((TL;!A ztZTWh$rFWhF@Lhz3H?fR8xAYca6)4<9PTJ26HeLpz3n+(R4lLbePYs#$snX?YNBSF zEHthP9!UM~#cg6cQ)G!FM z_KiMQMn{i96^QfRQ7ouVHEtFX%O|JZhSKYa{<>R!|XB<`0Z3?tSl)+T}9nzc&qbS+swwf5J z@C97m>$9!dd}%|Y?!R!q>^Sx_nse&sGx{7;?vmG>_iE-ZSLA6+XzE{ z&L}S2;WA#vddy|F%#%`Fc2h&d;$>5-=ckfrzjWWo>XWOo?6&iMRF^^fkkU!5b#htb z_6yO2+!VKV7It5%qiHKMc@t0l)cR$|jacB>Pj~w&7Ct3d)Jl1&Xf?a_>I4{$tKstH ztVAS0FN|2b(s1Z&2babOYH%ULt8EFk!oYi*h3;cQqebuKceBmd%ep0wH&+K+&qFP? zEKenEge`heb6IDL)=Ryak;`$LKYz8zE6OwMk8+F{u(7*DSq%B?QZIQ%SPNP#iN-yY zAh-u`z9MP^a2g6|9*wf*&&h8&z}@fkZSN*-cNOZ{eWBHsRrED=4Bu!odA*) zvPx`t8OAljgl(C0y6%Pbco?~kY-Ew7ShQRAkR2($ltk7XbeX!en3^Rr?N_IXeE>(!UCbmEKvEcLO# zuBm9$GiYnQK-E(8i?x1<2jJmVi;2CY>AFdg^#Pc7(cet!%r0Swma$vwYZ{4gp`B>ZiG%-hyym;wzALEvNcNnKr zdJ#9XM<;tUQ}+(Z@h*&6*(i6en8o(=(lFbog!;3^#b z2Y+E=#~0)CwRu`4Qi!-K+cn+wU$)e>$0(XRf|vYNsO%{o#6u#`^zqvuOmU^DCsntt zY~Q_W6^Bm!$_h4Si$7O!3Lg3gcp0wf-#vSn(68Pm^l4{zrZ&5Sh3*b)xc(^WuH9yF z&iX-au`;ZUk$~M-$k=~rtv;Do3(oi$R#80*Z;Udk>s$VTH7)S!i)fQ;)AT3s%1bfp zNb+t*6qTXm7rG;319j0|iL0EvXT(+pb`3Ug9|a(<=}hfo0vGN}R~SnF++PY>P1WA7 zgP7n2gUP8b;4=>deRzMHDm733?lkXUT9NB%?zdasL`dtkV$Ua8qh&l6k71hDupVymy~Z? z12}4m*qr3#KcMQ)( z=ezp^aoewq4*s$RS!u(SDgQvB>;rxcV8{LAAL;dM7;s&R-&Ao<4HhGecH5*;-K9T3 zf&gGu&ceg6@Nhwb55Qs{X|VPq3VW({<(&)X``NHJq#bQGqt3z|EafkZ5We>|AN3pN zN`zAo^f{Z{>nNH%r^K^r)&aFcM%NdeFlg-3avK-X+2$`BJ%p)PiU`6iCv!tR%yo4K zP!ycJ0ogD&^f#8cIL$p!*gW;63c2#>u8r@I3ISZsS(?x#QAas6SbSSRyybD`h!i8b zssLCi)H}a_`#t5DWY~{mM%HK1b ztOz+B|9L$^)b-rH=eZX)x?;ezx9nuS-rbT*i~8fY+cb{=p;&ZqfL+ZCh{W@SA|3*K z2lL+FODv$ZWknh@VbBd)4jA7o_}`U$Mq?N^Ms}j~KBH5;#(SFp4B)2zm&AZ|29p|z z57?ST6TBq)!tZYYZ8?+>7YG~~g2beA;ZtZ;aoo!c|0;?EHQ~Sy)}7`sOa-RCoUt&N z(J91cLjxAr&TfT%wC@emowpYzMofruUKnz0uCK%MJi^>2?Ls^>Z5pfcqZw1;A90vldsS(V;&vA+tt=YJ* z0O&NY-*htJB+L9gt=A&@zo+$o4vlMB(1;Kssjla6@)rNE?)(2|UIcn;&P(&_3DRdgQV6hcIr0+Q!M&zM zth+bRV$%>}fnOYq;+Q{RSbGBlw^l$m{5vK%2GEm$hqD5Rx}#$gB?ZN3veDle$ige0 zq-!LAWkjOjZ%#~Z{)NlkS0q#JCisq|s*dIPtW>uXBtamn1kbP@mi_a)== zd-}J#B$@{@MH{98im73V|0%?yV@-l=0F)1=oq&ZV+K`?$Ur|}XiWeg^q@Jdgqi(^P zKd|6@q`iMuTyGSB&mjoR`k(K*o}@0MJ^8FhGVtTE|38-eumeH=xzV(&rjwOxAA0w9 z?Pl!<-4qj-snD@+EXkh!;Hzi5HEyw`2rOe~yI@eSUjL)Rz}R|EU2Nh`LV?Hn zL3bKniylSM(0tn|?sglSV&F(2+vRf^57C3pw}cd|-`Jkr*O^I_{7wPZ3#e7Dh($U+ zV7`9*Um&X~F2aOE7P~{=pqEkU)e2n|ZAki`dWgD7sP)BACVWfyA=4SQayKf9h zJ*Jb@%GT~zMMkc3BDt1?no@n1M(F zwh}1>VRi$cx?ou`k``$78xB8x7Nb%8PZYfS;2(F*T50f(^>aBYA7KNxX-OxmnXoqJ zv8J^ve*mPMQ3Jw-tw0!w0srs3GdA<5F~-@tHR}XeGiqg`6~zNaIwY z*B0>d)5H0oTqy!ey=h<#o=whIRdYZR@a$+UP^!!U0pA@LLPRWXYn_gB@@I6g`^>{7 z1$bwwt!^jkO(7hoU!~Sh-n!>f-PiRD6f&^qPm5T`Qiw9 zBr%~3DVhrTgooQg~vnUNP z$=V+ROWpz`&BykC+nyp}uB>)_h^T_Wk#6a5P6z8$L8antWpe|1k&t?~8>Lu-%fDC~ z+}(7GS3hHq7;f1RY2_8FzJQv6MF}jsC zqX^(@73Ne&Qgzq;OouQ-db(U=?$4Ftg6wONrgIUiFNl1qR-1q}ro$1Vvbz8`eYE6y zz$RCadL4xs4$nJzai0DYg+bOe(m?&3KvSzf{i}J<;39J{_`XC1g0ucVZ?5F8td0Ru zf;d$&7pL9JX^y+O1FmFBc6;V!Ls$f)PUsB_EI!Uq>voIH*j5%;^YPWzQ!RFj^Va+P z!BlfKPc3!c{>VoA2*s+;`GbWbC5E!N&!PR}>%G6~iQMAf)R97xxe%i~Gtvb`utjYc zS6m|pR3vWiWQCtKBR5GYp#@C}^ggJ>0e-6t=xo4DeN9pGj=lK{#O5fp)dN(8@*(Jl z=VT(!%!zTzOXPtC*vc-khJrlpJ_Cp7yROr9Sqiw0ptP{b#&TsgOTb`OFwNEyxM$M1 zz@mWG({s2C@a;c}!)PAxEMyHWd&Ipx`4UcNM+n)` z&7HJ*fVf@#!PazaXmB-hEGImMxr){*wcaf#-uQ$4Y$?@zQHqP;*KM^1e?_L=X3kIv zg1A7ki^UR+h1F$yiHWQZawR*T+mP8qkT|n6yE9=j9^cC$(9ckhu4*rD-nI z-TCo%q|!%w>6Tpl)ugZ>w6iy*P;VmK`u zq8jUoGo(c|gL|0pGqdLs-NQ~?4~29aR6SGY5zW!LY zZyMD*oQd)()}(cKH1=+T{oHmZsh)-=XErmeUDmZHWV{_6=_@}QgDym^AHCIsDeGwy zn45NxTENw;lykY<_1HF_>1b5NF!AGw!mOqFq)nMT!7$Am{?N>ytr^Vbzoh+b-SNZ% zJspm=0haT-THIZ&I?16n(*R(G6izI5am<%U6Lm--t&={>2%bEBgkX%w{lT;Qxyz(Z zV&F%%%g8!w$9lV_ryNJH@@@uguh9>R!>UC`JrxOp+%7!LMlFv1Eatc(foMk5BrE^o zE)(IQjH8v}GjwIl1mFPc!&;e+i-P&8X;PP7;^{A|v#WohxoEeYFC6NrqL8*R=|#CS z5(H~H6hqj+fyzo;l49l}c7|fep(Zmvt0KBX0MNADcO)xQP5mFCzZO{PmHKQ(4A8PT zZ?CT&!+oknkU@F%8rXp}&25V#&|_O?mt3es8q8*t_=7|9$%>AAUx`~9jN&}OW7H;M z$!;!ecZL3Qn{_TchGAuy*iay4^LL6mAAP-X(hFgU0WwF<5z7>h^Y{8(KVGbL8PqdQ zxV#zKcb!l4E+ahsahYF+&|lqaRj=wCPRra#+cZDHWN^OSof$1qVvL8qZwkpZrNZTK zemavk)i@iLxf;0F!~e{!?hh%6$Zf4cCRBah7~4XN^U5|O414cezx~X49-oiD=HyAX z@tfnjFvi&lksBkmLj~Ja)V#lCh^`M(B77#EYq8&xvT!JSliXe8Xvti54{_Dha6}Nb zQN8B|J=pnli<}mZ*1#~Lu#`KBtUjaCK;qHaVFHt=YkU>CGvvv5_=%w;H!sGMeXI8# zgi+s}UMT#j$5~b6eXXFN-^DvX74ASPPjG9BO|*l~jAZk7j96I%Fhz@e%%Ju0Ju+?V zsI5j3Q5Nl5PzImNuT?$B3kb{q)}55F7Om;b+ho7Dj6Jim9Z7QsA07_0pkeEEtNu8Y z{CpZ!lwgOtfZn&krS<|=2AZiwzs+64-@o90>`A_xXGrhNxNIcDi|imF3RKUiXKZ^9 zF+=txhfmF%U4ryR&%08w^O%fAA?*1aC=c^hHtW=ec88**)hEwRJlHvBqPv~mCLEzW zc?m{bYeYhFQ~NSCsCjHz;}pl&n6pC!HHlo@uqYPnvaM)1FlqksdW}ni`Yh9HpTWoEV(OnPVZKvxQb7k4ZxWZN+M>cU^Bevca_WIiO$ z6(XcGLGpE0HtmtX*p~^h5|`exTD{E{On*LUuCv<^t%+S4!t#}#>M&_*2Pr~WYtYQ^ z`y_Vb=6T8@4zu?vTkbaJNAuDn-=94|wE0q5v@BE~UPMPMdWhSRF)4SL*3GC@%;!)E zJw!l?7sI-qZGSk89Z<_4YO;wkGVmXK!)iSIB3%TB;UPiPZHV)3&xF9YUCF^~!qKSBJ9F9?`bp zFTxQ8Q#0gb_LaUz0vEeExg7l4I^;3ZDtEYqIpg5bqc%&JtQO(e@U5s8OGRI%y##;A z4);EdV^RYk_VZg9#F6k1ls0?`-99|vWUGTBHx>Eqx;-I~dvJ^Lo)PD;1p2lV{0ENE zXNY(1VXwR2`wYIh%`q(T7Y3nIn%KAEVlEkAA2=OkKYj9$cjO#PR56^2|0VSE*Pp~$ zOxSwlq>i5J!M$dFbZjHh-!6iIcY^&H#m+y zYgkxsm;6-3$jJ~4d|76m)lgM$$+^5{pd zN=63`X`(+R1#ggj>BX9IrW6O0a$0@acA0FYunI}gO+vEjC!B}T34aoca1qjx_x=#N zkYAa2`4M(vczw7H`Cyq*1Y2-(XXP&293lp+@<3X@#ey#^s7VZu4A&PK$DYbmbV3Bo z*O&L(3m|scI#blX8gczBG8;YLP2v*NXS?W2wUqJ2o+tM(q2B!Rbb5Yxm8x2Q!Sz5o z^{cDrlVV<8$HLWcWf9xYuiK+s?z;@*r)uXND6?#fY2k>aU*Z_aAs;??5b=fSBZ)+s zYB&|FJ}^n21g~Q4mVU@IhS6+wn){}EG2V(XBT0MqRB{PXoPUFT!K8JqY!y83DEMAs zMcCE)a`hyv%?;wBJ#hbxp6hG4cKx<~@8L7nedkezVQ^gY@>)4N;~cItakaB`Gb^(k zudQ!z1*eqVx4&OGKB7YyPoJzP8f@#ze_%r%~%e}seQtfwd$k! zYFE$Ez~XM2O>kz7CkM=^&u`P9TE0}&a$mf_er1dVA{W-N=La;X_^zN6`;KZcGVsG} zYc!Fkem;zyMXAxc28Zn)2LhnW&DQO7(omS7d~FspQGxzJ`Lrq!Rh0L2k?2LapdN$? zCA_hIQDy6HBM$qqG^P``EzvPgc3P?6M@9T|=qEp3IHxvH*(rPV4z;1Q^EjB?| zPu6Gs-nKAR$2D)C1I)K{yuHkS*%pQ z*F}c1G^d z>C;28bS?B}=Bswu^cWb#g`{szE#6{Kie*z5Pk)LbOX`3F$$s)pYJ+)q5`X$z(|J-g z>9?bB*TQo5ic-N}GFVw=weP5`DM_kztKLr=rr-wTGyOU~&(yzw1ys)`%$GCrfkR4GExOSI#=nMd{X|@A>mf>gp>ZwcZ^1x9kngn#i!h` zmj{*33#0UBzK_a3$+qA0O>N)8(-@<`EMq_&6G36|vcjTz!ZO%5a7Ovj7mXqB{DaKf zQIgwEN)n6mqm+Oio++?MgljEPsTMxr*ouD*{|V#guBN0JYh9modhw3=&)32IUsD_g z+U%i%i!S>Q60NO;%Aj@DAL5Ok1L<+{VMo*|{l~$U@uJnu1C2Xgb~wwYXJn8FB;q? zOBuwDD%PW={lBdTHfjvh=8Y|vcvgVb@0dEmuS0Am7o$;-2N+$i@bsQrSNxcX z63C(P>itJt-FTL|gqjikZ%g4?@j(*lsknCOuN5oOl)d{ndiun06mbZ9f-v)`noBj>&M?5j#J9|z!0jlR`BUQ@_ zq9-@kYfgQ@9aah1XWs{bkR2oI#ZK2Ctm(7m{0YkmO8OfoTX6;FA&HgSNVX~$Fn|U! zEva-<-_&y>8qdQ4=@qjJrZ4vMs>6JiA`lD=!cJzdNZWS|p1&<>T*rt`2(D%nho__D zD|14y^A-!8OtHw1EW^w1qY}u6!^mB4i zVEszOZLjm=_=;3fj&dLClO_?@^7CS9&3L&+Q=>(;pT{}!SxU<{Zr}ia{eNqgo0`)n zQV%a?%`AI>ho5LPb>r^0&Mn>bWJkY>3dGP0P-~JC$M-@zku{D|oXIgzZCAhZp<+F* ztJT^9RxP%6pP{l%((&_wxzAwmSWp@2q})xHw?Evo9Kb z*bjfWnaV_2zNXSfbsL<`ZQ=)YR=Pr;2D*-sCFa`h4TVj{3BB7N2JSywun)2n(pz$? z3OQMo76L~ti1XQgLv0#;za$@;$#khdTh^b;pLAp~Wfx_=c`0ln-?3G5-aSEaLB+-^ zA?8{0sP0dyU6@WpV5#y+Q4(nn8T>NcZSMtMzSfI&pZvufZX8LXuj5Wua3k$hA&1wE z&;HcbpN-><|=?>|F zy&MQX?ma~|`^psH_^r{Y=+>=U4C}c1vV!3X%PV!FkjDe(%N)*!xw%G9sbwa%s2;*M zV-J5*nVMQCCh|>)|Am3?)#aw!?(hG_^{vKB&O5U2%#=hfBK`KJ^y;)Ox1~wt)L|A) zmLb@7nm8)qVx;Xp>d*$Jg^MYclU(WsmaB_{kus~x=MOD*Vzt-IO*c2bQQeV4zvJ-_ z9>(gUyzRmWdh&SJmi0W4awnp2ZHBAEQ@=7dgTtkFV{%q`sx^v(kDuJbxT{F>MgmGI zLvX$k^86}T{NyUEiJmL@!Dj?QZ9M@3yXAv#x|8_WB1K2@E2I5KF;FBtpp4v&3@)SL zXM91%+1VCv~Bk}#H5iai<;*^^T2?w|1ShqSS zOHi0udxul|Hgn#BdzRnMJ{IbhiH*A*-z?Ktb8qX;kNNq!z@~gS?khIM7 zt)dbV&RKPkck8WRs{D0o+4P)V)cGt~dv1n4MQ6@NXo2*$=xLl;UJ;Xo4PFfq#tJbG z<9=qaz(rk|y~N9xpH@bvXiq8&R=b)`f1bY@)O6l3?)=c`{ zc;d%XvGjb*J;N-XC(q~_YOEu7l?D0jl%KjycbmDc=;;dEUtP6U?yuyho?ez#sCmm5 zbr*eL%H#$wuswz`E+lUv2cPG;s1RpyvI|sK&|b;IZUf?cQe?ZgX z*D3Q25^|6gEvj_*)#qh)&^+eTPoI>Ks2a8habaCgoOhb7oLI+;-SxxV&NrNGmYQq! zO8xei4e{2xll#rFUZb9k^3pDOF)>H+F?g9!5a>RlxV`pQaU+Be+iAVX*2c|BMuhua ztew4m*GanKo(1Lb_&iGyCFMEJXauB5F!c2ee$i))#7kMjLQfcNZHRfE^U&oE=zY${ zb6H+3So51Hj@9F{ziNVuLtDJ|LK~tT{uueDe%h3Kfa#S_*!g*|9Ju<*x?pIiz9(T` zj(f+|4aN3ft{i!>SN?t_vTfVMoOhMV>a4O9!p)M%mrO{m>rVK0F*%&CSO! z^dsi}kaiC>w-%>(o_06&kmd+Axmq_h`C6Rv3n7g7=voS{cQ%w4%LGY@Kfpfsc;%!ts%~4D>R9Ru%YJ0@{iCfgrT8Kuc}1bPfuj{PcY@Ct z{h{%q>U5syK9;B86S#w5+~8$qr}IoUwt@n@HGHT`D?~fCg6?7$7EV5DX-P@DXdY+mEfW%iIONjeW!soJ8|fPlcjB_zO_050f6}m=1^REq4WVkN zheW>A(Rk9_G6p1y2%3%=&|?d>5uEqv*TZ?A)pdNYwPE{+s3ASO(^3K^$G88TtBUTvYq zntDlN@b7;`pyb+L1#3_cRrpWI>mKn@3V+}}J z?4}QzT)yw*9K02oragTuK$V|x_x6;4y}RgS4G)751$&O-^&~E1bMvtJZ4GevAP=#b zdDu8?b#ROGoBVpM(g2+rp@|SbE7T-Vb~If}PUE<}-8)Ed2N#!}my426y!l=vZiS9Y z22*U`eg8#=_M40L?I0;GDKo`m=*N15>7oPmoKng*T6n#a{Opa)z8Rnfi>F2BU_J__ zw;xbh#wSE$R=Yc_l(@Su%w)ps?4LS{R~46)v{tzKOE0`gOY8W72&AAG~E$!8%62#;QA=3rc#CM3pj*58a+eYFFje^cY`tT=r z_x6%26!Z7a^AmQTz7rf>C7xo|UG9(90CxQeWe7UbN30K!OR&fKNqMAtWxS=l`XL8{ zr8W^Nt$PM*fDA;NpC-eQ?{i{WU&GR)qY@fPyXC9BHrqsxc+Vu|gG6-3i*ziy? ze;As=R>m?hM%6`$T8!Ab$Px(E;Cj{XmW!l7xZEwn>)I)IL0;Rrn5K+m9M)>}EdrfJ zjAPiEpH+7jmz|x9(meOkr?C;rnxfHpNqj3PFVK6PTP3oCd9f4N{MwvVQvBV0^t+YA zRL>74n%F(J6GLA-wBRe}V0l2s@l2PtP+x}~3***Vr%#U+*~^VH1C}k7!;z?4S|lHB zzt6IB@UoDa=k^Xv5}=7BAHW8|nJI6I+sY@$SSJodtc{xZe)f_eu+E5@&)X`{{m_cO zCJm8u8xrX;uvu}RBI`s<-?-qV4QZ7iPKXK#-9{yjX_1mMtb#d|y%YH9`qJT@1|&l& zFP77OihCEK=DsDkrvO%X)5gM60E1V z4?IqsS0)8G$)jQ`FWx;&&Jw7(SUp*2CIS5ZX%dY9u^-1eGxIb_VpR%rfce7=#YKd5 z_PQKRf*&T4jFlM+2*+BMJcLn|2Qki`orsbEzW9l1Az!kxT0S38kbrg;Mgr*%^_<`J zD|wW*#c4eVn|BnuW}PcCH@?mu5qnVM9$DG&u(Q#p97A=Uz5RYbBPMXSWA!9V5jXBM zHDHle%p)!KL04GV2TX5y~iGpIj@(+`a`PAIB`=^ak5Pg`vi>VY({eVEARNu%bmF6^SDs%6|;GJ5+^ZYJ` z(c+S~GyZ4XQa-W!gH}}BIl3!qVx*$c28a6`@qqz118xQmwu~QSBzyA~5+LafpB!U-Pd0A7NarvIJF?sG1^0vSUAOl|T@v%4D3x;D_;??|7Qw?JRr<+S$GDl8&N6~p^(NO{YEop1ZW81+ zUVFxMFQ)a==oHif958&qR|EMgf`HV`yodN7wohH3!vMZ0Io!>^cJ0~+81k265xGFh z-7IEd1JiMZ8f<=lY&?L`T{5Buq* zc*pFS2zcq=_wR`({z7|o1j$WUo}My^Oi4GxuUr8Ccqh)&axJd-H7zxa1KRbCA4Tac zcxgN+z$?*<`<3DKJB@!tL_|5netOAU2rxdq4jS|r-k@80dy{dQ0{=A}JU2QLSP5WL zO(!GjZBRG}y)-;LJVHQGh+>EpQA>2r?kjiz;#WVx#qj-YR012Y)IpJzuo>yHQ6UbBZafcVXZUCg8LD|E-P@)*lBZUbzUJ=u^DE*=ty|T&!pX$Q`D+E}uW!($exCh(*m&)$PbgPnh=_K0~~kXnw+- zX;ZTo&*5xHw4ewY1Z}VWCi&-SG87IB{hx=ww;!`la{Z0JhIV^O5-;9uG{f6rUzY>aFGQYigZ_3O4wq`rC<@c88~kZs)D+=P0=@_-R{-7Nx~?aCg|ZWpE)=^R`61o9tks%w2t`&LGI!_c ze_Eic7wCu``ny?LS~`7Vj2K>CKm9?q*}*+^E5E1=Ix@6$Qi(53o@azlOVz+k;XkrC zSo54ey|bxZ^g_E(Polh}rL@&`W7L>uY;Onq=i2piUtHSsBcfUdcLnq33^#K#+I7xP zkNU{&1oIzflJGgn_nS7CvYDVKO=z33D6E?v(7NT4@j}n?G^=#VEGnE=?73d+l!{}R zItV=6UoNT<>)GRA|Mu1*Azvbw>n7Na`4@5iQ+n~3LOhqJ-l;Y))geR!YWfT;v_LDa5> zgB5%d5rZMw4`+kWeruT-TcqcdN#gaD=(KKfx(}m#Dlw+CU={w?!#cGdjOes#I!#pg#`_R;wQN*V|Q#MbPnQqM?z0b^;<1$-L_;13B|YiwOzap=u3Jm|JAN30sGc zUr+8>@?*>kQPpzRf8tD&FFZf8jypf1^mNI$P~E(GZ&01pA7B5t4OfnjjahzVh!96# zBZ-0`=xJ;&E(@Oh(lwb<^FKk zAQ904X=&X%Yqzf(j6O{k-@BSwW_I=T+k_x+b<@x4^#YZpgrUq`-7gxbOG!Xi1Y3sT z;X=o?moUlsNuWs$%tk-F>zQPKc=v1Rl~3Mt9JhXV3j@PvCbY&gaOa!#lzOSzNU@+i zQ>UL=LsVndjY&@bmyStGrU`0hA6I&GcZLiV-(?<1pDV=U@K55Vlm4Jm9;o zGg*xoY4+`v-pXiUaSAzxOQ-@6yowk%$n0(nxT5*!T^WefYv zXJ|kb(8D=_S~4DE)mpqH!}bW~X%!-Ty_r&*W$*TVD!Rt8hP?*g6Z??|RuCb-IIIOf z(UqP=M6r}N3Bvo!GwB+^@pQofnFl|RxHeSX^s!5F8y@)Wl+(lFN6lS|!`qUgx^>GG zC@mQrg-8cBWjxrlSXtiPtB*<{DD`;i?LRdEraB}`&hQ4j<3L( z8NjN$BAeVV@6R4zFnz`JR!|q4PHHI&-%m$4xaRp6pLk(^ewVu{fR<<98ada0Zv0}Z z@CT;?n@utwvLCZaJ6JWPns`v4*c6SdpSOfjo2-U0!a&QTg@Yr~_WIsI8Onu&gPX%* znh2nNBOC69vv0^$vFPVQ75utW&Ketv>F@0uL%^3~rcL<8eyCZch6A9^4VA}HqzAFz z*G6R381-<+r<`Cry19c%K7YS%55C=uXl|yp`g$1zqn-E~y7^5Gs(|fp^n(}ZsG!Ci zP8r4z0&U+e#hk}n^YC!9(JiFf0!I)u4CwA7I=jh8A#V;R9rxGAX!$|N5Cp!iC+BB~ zXOTfFTZT)`)eoiIvS`=wa_YuV*BX~+8vPBKq}{ybs>rxNyzo9g^n;VsQvRWJa%ZLe zs<5cU=%coxtY^YhWyxi&Ct=N*%Og5D~!*qXp$@lKHbs~Lh>-RIDI#_W0vnH%6 zSKS;xzS5g2C6>kEz@z|l&>=!${)z?wv5fm)@Q^y-Ol0t;pvqG^Uq9uUyLAnLJt_WL zj`iwhh@U4~8}ixwam#9J>te?=`}Tu;$2JsA%%Y#o7KJmw$_o^M0f(w3uF+9a`-%tq z2^bgKD#a2`<*Hj$6HiF$lS%fs;exrahk(S+Z*;b*e=_+M(37tlRC?qS=XILCr5Ety)c}(n= zbmh8a(XxDGfQ7rPsL+!^7+{As?@h_qMdnc;`+IT%XLdb`Wv;TM40AoY$JJG&-DfO# zyKm`=8}r~Ha>@;QrQ_PJEOm$IOdfWcC(8X2Dn6prF}@RWXy%k0L*-;j3X_y-*wFFP zU>x=2rrAu2PKU~8O@cKn*=KIYo{t*4GA7eI8*2{|PR19%5%HJajM#+u+Wi8kAT{MM z&(L*uZ-RXxhI| z^);f>UTSx%qDhnJ#BA1jeZZ%N-)=R$s)bc~smC?BAzo)j z9(8=jODV4iDoMNeo2o*@gVESZZ%X%jm&wl?<_dgr@qEr|t_fhsXZ3Ygtf$-#S`$uN6MhUYWG9TAbp~Yq?IyvKVv zCisj+i6Eb#e@=2{EN)DOR?9$6H!kfy#ZJFeS4up5Or!lhH+dVm<5(epJE}bjy$#gRZ6y7;%8!>A zzoX|3yg^q`zS0M9!~ON2t+n$iy$(BX5s+7c;l7EN7b2X;Jxj^}Ud>-`%To}7m3c|t zuO`W4QiF(@9MAxm7{E)p@=*9TkYCFE^L7S5=mleVyxC;l3)eojf^@iOoFXTB=)-*} zJ%I5;Ib=Quk6G4fj_amL)sx%bv!x#j1L4gpFU{opjVE?Q=>f9NyysQ;CSFqIv-~6j zjO3AxDDXMxp4h3CTfI80ZHMV%TJ)0z72nr$+ zCkNFEc$}YZL1qzC*Ihti=r`UWwPhX`=U-ZtIVwRJXgv@UO)awxjZQeM%{^>@|f!3RNn$wwA z?0+3N!P#G4VOLsr09QIS9>uCaJ#TIu#xf5l`Q$s3JNXZY599@ zxsm+RP&e~7WlS9Qv7?oW6|lv{Qc}c&-^L5=i`4k8*$j+< zBZSKwL%^*4^Eyynj^<}o{C3GV$Mz^o_f!BKqF)QLpm`+2||oD+2?; z-hxMw2g26-@xlBQK(c3r(b-V%gL0O1W{3w)d*v^GC+@V6=Tsh+%%tFzCAN zuYKzpi{(h6n8W%gC&+Mto(`**ah%J7OqCPS2Yk?#O(~J9dZ>vfnG0LKCxffBt;A1WDBrh-zd5- zvtG8o8b_6^6KVX(1#tJIyfQJs>yf>tr(Ye74%N~yR4Sc#bt{_Bgx~aPqL7aOkPGDt zaMS+IBXBu~7x$!-NW90n^U>*|fHs~22nl0D{itXWfg%$EimZ#f?nvg-L&G4~g@*}A z1^=`j%yfLOVjp-2gE0!8fbmose#gTuK5EwLEpOMOc5PWREW)d61r8&w|GwusZX0kU zv*rGTJxr!*-3niQf2(9#W4kC@u|H}$-}!h`np2zolDhb-Pvs?$;9({5AuWlq*1N#* zy!|WhV?uOpgMBB#mzpH_oCm$**LX_0e;b%#Eu3zp~U zj$|L7lRFd23d41FB#NHwQV*1r*Y0T$Kqon>`A^o8a{g_F@_nnhme8$c!?S5;pt2|R z!O21?RFq&23L$+0c5D(}coMGf)CzQb#@!Ak@I?g&|3`>)l+!+ev#`@8ae)tw{)Fwo zEmp=McoYA@DwGIx6PA~TwzhT%N2hGs&BDca7g;UmdHjma+LQE-uEpKn(a{%_BznKN zjz16Pz`Y#(RylX7%6%eoa>76}Yf#3r1=Ms@Wq(^dBo6PhLLm*fM|%Gc7eaYBYMSq( zUZv%JG~Y6}f>>-l+qB#jMEaP<op3 ztJ98m+gDTj^3rP@R3Nqaj=_D%Bt_K+7DWXCI7YI`7W7I8F_JwkOz$lTK0K%7FaHMb zE))p<8>vAoqnF?l#&~%Y$ep=jIQv<_KEGr0$0oPEUf=+S2%cW}kx_N9@H`w4n^!Ir zOr!+Bfz@k{QNYo^-RR)YOjs>@dwbUp_3~ zT?jqb~>eYK+FLXJuSYBVxeOh7tNu_-w`_9LLZ-s*k#NS2i z|A=E`0~9T_wltV}8|o}@M14#HSF^R()Yy{5vH1^wz6Po6mHoz4FwmsQtY{t)VCOAd zr9rgm@)?PAUT~Hvugp&+02!z(MeIy))CF{th|-`ZS**~oi%hN3&Nv&RJ3v@28v$L9 zi=Cb7vBO$Oq!yIk?6KR=9!2Kk5_(!wbFI5*;b{N$akdDEWbww*Uq=djlDGiMOYo5K z+AXo?lTr5)Eh%UT
%;WHYT-L>%{dt4JY1&CRZ&>1)%=zoO|v{vsNuTBFbfetUs}sSlQf+1O>w74yH5L&C)f( zGKWif=TE+qpFhyc!<3ZErRKzTy(wlnKSX&crEDwfyD7#1hcx{P@ZO_`ItWr zU)Ws!nb3)jMvSUS%*zyv>fvkub%iUKOo#GR7|0YquPiZwv=xg3tJ!V57l~D$#?W;f zlT3O?b%JZY)__vd=|1m-(LKU~v9&>}zAM3^7oIBZ;~KddO+=yg0bW+M!h3kuYsXcm zx5@ckKXv1NOla+EV6kbuscYJ6Zr@nC_Q^Fxl&oy6yxJ^}>n62RW{a-BQC{m|`cUw#XWnnKv!NT<#tk+*SrK8^r&i1cJ=QZaqJwRGAv`Z_dAVc% zn^{w0`dVNrmBc%OD<+y!=`=ii|gj`D0?5qf3DwX8ASOpq;oo<|rm*f-%YAE9hw zrC&8+ZedZCMffq|Y&+P)mDj0w)l0|B4|iMXbK&~N@^Yx9+p0Rw;n8eMam8IOo=#X2rTFot!MTaz&vR52ce3NHmC7d0=cJvOf z`Wei-+*UJ)LhmE{-Ea3$;fBO4Z6m6y!i=ABRr$Jpo)h-KpaNGziRw7lgOUOK&f?GI z>(&Z;bWQE+VHTv|SKgOh!2G@&!_W-vGE=lOrz`1FH87%5{ZF&Xdmvxty62z2f2Iq< zBB)-{C=hFPi}CAUBrmdZ|gOEkyJ5h^`vD+!W)CS{=Zf7t*uc z8fn{G$;p3P;HO)FI_U1gtf|umJ9rW2g67g-{1^0QrnMUz;OLM)?=oS zOcETgqu%GoRr>KO*!lLJMq%4BfKD}AyelP`pW!AZS!{h1Ms}|GG<2l_xGsqK=KTCZ z6`EaC>J$taa--@5oKA%`%y}W=AG16jxz&dA3xf>y-*dnF>1D_B=hcKh*G0c{JPDD7 zLhwQW`()H(B>qv*b5qP6Z9zU>CwX_aW< z0w2JVy)Yb8Y~AbM_U)M+H7fPYBJ?fj$#qQAfkowtr3V7GD3b`%=q+CrFKyTvi>iw_ zf+VSQ!Fd0PTvl~*E&4{QZRs#^W5eDp|CO-37Cjf?k@@=_0?SeLf3a6$C?HpY?|ecm z1xUPvR^C2|wo}iA@&#Q`U{`65a6ILFyr7cw(sq^$;ENiahlk^ZH+seus1(KrKW9?3 zTHIA$>1XD4vQwIRk3%(XXDyUzj@=dbcy>WyO{qB8ZB2J)qiVAg%lAWkCH@eB1F7UA ze8z0KQ61TW*;#V}g$xV))!h>Erp&*_wB-g+9cIPXN<0ONa5F2q73r*Ut3rZsNHktG zc632%B<_x5sN}>8ZhRXh5R{x~!nwa+ZtvI_ucP(oh4=|LRD9k~)W?j&`Q*XDS?{pD z>s+Y#Tq|wDt+LO{-|;cmY?Q~3#uxb=N9bQFG=Cu+ElmG09`-#zH5fV*Rl5W0lj}lJ zF+0F^%O&wxbaba3x5>bC@z;K)l{buwFOW6Pul9rS^Z2RT2_i6?zqPes5f(_Wj)-WI zMbV47OoZL?EyC5maZRoCZrNZ7qcTN~y_;r1JAroFL{kL*7(AWuzkBCVQfv4nPs;b( z)MPt>DUJA(l^XF?K5_@OA8;pS=90eUV{>g8qPMRAp1@1o^ttR#n&Hcv$k|fBbXHc! zWEVs6p~a!e4P>J6=_|EFf5E7UEVyDpM({d?d?Yd!bfs`4ljE-(z_52Ofv@k>_!M9w zeWV1w$-@T^C>T}qK1+AB0Dtix7X=p=Gi&sBA7z$R|mzk41(rs&-Tak2eOsZ^dQu^zKp$WO{ zuZ2!jIZA=Jp@fXV4!p3tj!*mtcBT){+xwvI)9BhEX;P8tpE#Ybx}N}wO8=sbSBRLE z0o0MC2wC0S#Qe}SGE!!lU^e_E$;g^vj_Ci(v79te+xCY3qF0zYR!he$!gAHi+NQt1 z(+8TX(5NR_o{86XA>gxioqMG$JSxqkU8?~Y70Q(!+nqTH=j}$q?~A(4K^;6SCttm; zz0x{<&v0L@K>SkF+0mGMu`fhO9TF69J=1SD<@JLAswAzD zBqkOO;9(+fkgKw_XpwP3l z)RWRT$(OFspVQ2uS`&x`HJQ+-C%-zEM(zQRpu-_a1? zxIO8wj&5_Nx}(h{ClONctnyk^kX0VBDQJKW@oRq%d3T!>ZMmX3r}?^W5Dt`sEEsyt zSl-}l+^qgt!Ggc`sSc5qGl;Aef_4zsM-9vZ>M3p8amJf%jMjU)M{$ZYe)K9^k@yT5 zglg8RCbPpKb6{=v(|SdtK=yo1vIoI`uN|*nzfL*`fg)~SUEg4-$)f_-?_;85JQkpeK^PDusubGHw>4$F0etaq zFW}dN%$5c(Y5Pil8wo=gt_y^SUf%d;)xzDO%*6|QRSn7tjl8vL4zT$}>A?q7g9Pnb-KW<5BSZUPhGC*S&6Th{uK~0=BsWn zgvNHU^W)U{`jjk&G#Jke6*hK|0?ICPxw4AicJb{7RBwGl-cdr3 z;s&bgJfn7Km&f@o+~Mx8VI~6K1KzRl4H>5!i1FL3mkhPVIZmog-OGghD}Wa=^8V%& z>t^+Ckl9G#{rUk7B=AVUhv}n3rcNdg=EkPZOUK<$)(Z_fqU}t@E&gW=*rk7_MQVMx zBsk#Y0${D#H59YqZZP^KW$^`YIE8Cxiyr5O&PVf+`gf&cSF4Jj5t2o)Hx*Kz6 z@Lyeug%wJE`t#;amYiEQ6%&tr4%PEkJR}S`3eF^P3CO{??M@qGehXk>xG`7~x};1^ zO~1cx5d2phYg7!r_-s51xR}ziaPTL%m>dDx>*B>{a9YM>KHfWy%}?2Ho38911$UJQmcps`P%^Z@8c5YvqaB}%}>kr2_Px%vPKd2Kk9 z%Bjg@MlKZoGeGQ&dr4&fhzj0HL50b;<+(OqflC1YlOz>9gh{uI_P-tTyM=lmfM_%^ zK9c{lsxJTR)eGmBIs+K5wB^5#f;9h)&%L~HK)UJy0Ae#{Ue-F8tDcsV!)UFw;q&pw z;}Xda3SubT`}p;e=~slc7ySv+)_TXr)Wtc|vq3KtpoF`vsN5%<1NWeBWr^@1j>b>I zH+}tadDf7@>K<`H*cYK72GberD9-){dWGRu)Y_F<$}R_XT<*$3woAjgVjta4y#iWMG%;^H+i9r~3lCvuyV7cX7C*eLW*I^Fpu%l;lD z>^$COBQ)?X_uJ(lasieYF7prEQ?3tBr_QA>xa|jdWBHt)0mjrp?M|7!^vJ^5O>$Rx z&;#7mYHW99$X+Demx_3!KE8H5qAxm0Fqw|A0@=;9&V9KO}2$innWhVN8wr8WnBvW(?B1_^xH445i zyhMML_f)4hi!RmQW5O`|M26dPlEjZ?|2u)pTH`sOgoK48#3-wnRL$6&M~stKNbkRm zGM!y3&fhLzV+o8Xg6^3(pC2t64qNOv`Y@K&5f?P$x2@TghTs|o$2Gl6iK{cN18mGw z>(05ja71CbYk}-h@WuCgghJkfxkP2Af$Wt|`;!?q{4D_c-r7OHmt-x@rmCjYqU)%t z2wxh>sh^e`b8N=PlN}9~)#5|3hznXexg}2@Y<_ap3{J`%EE6NJt-%(O9s#~4ed`m& zJpQ}EshI}>6Aq+5TzrT|9V+&;Yh91*K3VS@A($)X3zKMSz0DcxWUYbq79Z*&$2=nj zOXzGE`7Z<94FjDOU5k!@faHtfgbv9YewAETg}(Fs9j18vw|T9L23)x}>R-{E2SuG< z535J|IoC#2Ya(W0(JOWdXS{Fp#mWmb7<(38rr7V2*PXIgTvj-8v^ie!aQs6$nJkOQ zkQQ+8C(h^Fd*&Ak*{PuF7q7IU}J~x_Y-jb=RhEx~GqV`j)|; zQ37h|9u0uHM5KhmiCJI`gUz{sRVVPlqUBd=PZ7U{L(b>)0QQpY+uN)#mC1cq>p*(3 zB@nliArc)GU$X84G{>;8Z}1kjp(@B~hk4XUy*PnP<~8)zG+DfWX0KauVx-Tu3R@=A1#TD zGazVW%T6d4iq&l5|3)Aj+{GQjaYg6+`sg)-T3-bx8JJaK9|7C7h?! zBfp3bM+C6m!&%~rvihz2tx&_kkqbJ(evcWvS6a+%ScN#q&oZ!+on)t;j1v;NXmcnd(4Eu6Xo+-r^O4kYUk-4g8yX zU|oHX&)MPxhZxWyxwJ>QG`RR+hyDXQ@5BSO@SU6OhHxSkTwi;Cl)j>`;SUZ64pRo7 zy9S1r!F|u}zR%3T6IW&Q6ikO(*h=S25@dG3KhPG*h&28ykO7#{eLr%8*Rh_;epO#$ z6SrLLnRlFY&Tw6p(nbqD%Ga{52v>*LCyr_V~igzEB*BJ%3q8O zlEf?M+bvyZ?-l}Q_YH`N6X;xtiNixiASMH9m4Y6FI}7z~9~u3%awchg-ozIfcD0FM zLh#TC7|w|-@jDKIy+OTBMUApPRVUz@OUnt;3jcWUfa-laR7o%C^ zR<{84+Sc9O9dJ-0Smh4)YL-G%_Z05}d&Xrxo2{Hpy-IqbwFGNQ(~FMW$Q?1^^F0Z4eFrki(Z+605HY`QZ=QHi!T{`f%IGBf1e-K}#2ZcWO z@wJuSJPUp5Lq$+Sz{;NGH_P%H#8gxWO!QH#T7l*-ce)sKI!Axo7rP{Npyshm-L)`Z*#KwixR zV+G0Um=b`U{$Ppz|D`6+0I1Kp;A%hu2SNy1fPEqLX9rW-{)P0o|2i0;$^gpJH1nN= za5!P>^$cb1d?o*!p&Q{lNETw4=e<0x={H`#wBmw3C`**A9=qHg)Efj|2`Ec6(b#_KH)A9Se}P1_Z8YL_tG?ZE&tE+OvHcAwT2af z0O_c*=LZm&ucUpz3^Pj1hm*2kyMR83z1mw6-ME5r;2$$-kpL+CaC$a%QFA)Ec^0qX zakjUoWWNGJ!Fun%2IQ)D@t=H#s}qabBZCUCzS)&zvacZ8OWk0Ndiq`9^mR2zO0n4+ zP;K8l-`M2JOL`7i52e_z`fO03uOGpARed9)ryxD^{*b0)+_=?u3}9H4x7+0ZN8NZC zP=s_X&fgR`^df;kl~}Z@>7Y-7;=kC>26A(~J{m>=j|~wtd$3>_?@Xf<&e`kY;!<_G zO@6U$$N48SBXuPq2#Bh&aee5qyY!c!9X86~+C87w-rG{F4xq70nZV>HUA)sbHW0 literal 0 HcmV?d00001 diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..be37048 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,77 @@ +version: '3.7' + +services: + + # HTTP Server (Nginx) providing FHIR NPM repository with packages from our local directory ./packages + fhir-packages-repository-service: + image: nginx + restart: unless-stopped + volumes: + # The FHIR NPM packages (.tgz archives) are located in local directory ./packages + # This source directory with the FHIR packages is mounted as the Nginx http server standard content directory /usr/share/nginx/html + - ./packages:/usr/share/nginx/html:ro + + + # FHIR Server (HAPI) + fhir-validation-server: + # HAPI FHIR (https://hapifhir.io/) + image: hapiproject/hapi:v7.0.3 + restart: unless-stopped + + depends_on: + - fhir-packages-repository-service + ports: + - 8080:8080 + + environment: + + # Load FHIR NPM Package with MII Kerndatensatz module and its dependencies from NPM repository packages.fhir.org mocked by fhir-packages-repository-service + HAPI_FHIR_IMPLEMENTATIONGUIDES_DEBASIS_NAME: "de.basisprofil.r4" + HAPI_FHIR_IMPLEMENTATIONGUIDES_DEBASIS_VERSION: "1.4.0" + HAPI_FHIR_IMPLEMENTATIONGUIDES_DEBASIS_PACKAGEURL: "http://fhir-packages-repository-service/de.basisprofil.r4-1.4.0.tgz" + #HAPI_FHIR_IMPLEMENTATIONGUIDES_DEBASIS_PACKAGEURL: "http://fhir-packages-repository-service/de.basisprofil.r4-1.4.0-explicit-versions-in-valueset.tgz" + + HAPI_FHIR_IMPLEMENTATIONGUIDES_MIIKDSMETA_NAME: "de.medizininformatikinitiative.kerndatensatz.meta" + HAPI_FHIR_IMPLEMENTATIONGUIDES_MIIKDSMETA_VERSION: "1.0.3" + HAPI_FHIR_IMPLEMENTATIONGUIDES_MIIKDSMETA_PACKAGEURL: "http://fhir-packages-repository-service/de.medizininformatikinitiative.kerndatensatz.meta-1.0.3.tgz" + + HAPI_FHIR_IMPLEMENTATIONGUIDES_MIIKDSPERSON_NAME: "de.medizininformatikinitiative.kerndatensatz.person" + HAPI_FHIR_IMPLEMENTATIONGUIDES_MIIKDSPERSON_VERSION: "2024.0.0" + HAPI_FHIR_IMPLEMENTATIONGUIDES_MIIKDSPERSON_PACKAGEURL: "http://fhir-packages-repository-service/de.medizininformatikinitiative.kerndatensatz.person-2024.0.0.tgz" + + HAPI_FHIR_IMPLEMENTATIONGUIDES_MIIKDSDIAGNOSE_NAME: "de.medizininformatikinitiative.kerndatensatz.diagnose" + HAPI_FHIR_IMPLEMENTATIONGUIDES_MIIKDSDIAGNOSE_VERSION: "2024.0.0" + HAPI_FHIR_IMPLEMENTATIONGUIDES_MIIKDSDIAGNOSE_PACKAGEURL: "http://fhir-packages-repository-service/de.medizininformatikinitiative.kerndatensatz.diagnose-2024.0.0.tgz" + + HAPI_FHIR_IMPLEMENTATIONGUIDES_MIIKDSPROZEDUR_NAME: "de.medizininformatikinitiative.kerndatensatz.prozedur" + HAPI_FHIR_IMPLEMENTATIONGUIDES_MIIKDSPROZEDUR_VERSION: "2024.0.0" + HAPI_FHIR_IMPLEMENTATIONGUIDES_MIIKDSPROZEDUR_PACKAGEURL: "http://fhir-packages-repository-service/de.medizininformatikinitiative.kerndatensatz.prozedur-2024.0.0.tgz" + + HAPI_FHIR_IMPLEMENTATIONGUIDES_MIIKDSFALL_NAME: "de.medizininformatikinitiative.kerndatensatz.fall" + HAPI_FHIR_IMPLEMENTATIONGUIDES_MIIKDSFALL_VERSION: "2024.0.1" + HAPI_FHIR_IMPLEMENTATIONGUIDES_MIIKDSFALL_PACKAGEURL: "http://fhir-packages-repository-service/de.medizininformatikinitiative.kerndatensatz.fall-2024.0.1.tgz" + + HAPI_FHIR_IMPLEMENTATIONGUIDES_HL7FHIRUVIPS_NAME: "hl7.fhir.uv.ips" + HAPI_FHIR_IMPLEMENTATIONGUIDES_HL7FHIRUVIPS_VERSION: "1.0.0" + HAPI_FHIR_IMPLEMENTATIONGUIDES_HL7FHIRUVIPS_PACKAGEURL: "http://fhir-packages-repository-service/hl7.fhir.uv.ips-1.0.0.tgz" + + HAPI_FHIR_IMPLEMENTATIONGUIDES_MIIKDSLABORBEFUND_NAME: "de.medizininformatikinitiative.kerndatensatz.laborbefund" + HAPI_FHIR_IMPLEMENTATIONGUIDES_MIIKDSLABORBEFUND_VERSION: "1.0.6" + HAPI_FHIR_IMPLEMENTATIONGUIDES_MIIKDSLABORBEFUND_PACKAGEURL: "http://fhir-packages-repository-service/de.medizininformatikinitiative.kerndatensatz.laborbefund-1.0.6.tgz" + + + jupyter: + image: jupyter/scipy-notebook + restart: unless-stopped + ports: + - 80:8888 + # set custom token + command: start-notebook.py --NotebookApp.token='${JUPYTER_TOKEN}' + environment: + # set credentials in .env so this docker-compose.yml can be fully versioned in git! + FHIR_VALIDATION_DATASOURCE_BASEURL: ${FHIR_VALIDATION_DATASOURCE_BASEURL} + FHIR_VALIDATION_DATASOURCE_AUTH_NAME: ${FHIR_VALIDATION_DATASOURCE_AUTH_NAME} + FHIR_VALIDATION_DATASOURCE_AUTH_PASSWORD: ${FHIR_VALIDATION_DATASOURCE_AUTH_PASSWORD} + + volumes: + - ./home/:/home/jovyan/ diff --git a/download-packages.sh b/download-packages.sh new file mode 100644 index 0000000..04b0673 --- /dev/null +++ b/download-packages.sh @@ -0,0 +1,13 @@ +#!/bin/sh + +# if failing because of missing proxy parameters, export environment variable HTTPS_PROXY before + +curl https://packages.fhir.org/de.basisprofil.r4/1.4.0 -o packages/de.basisprofil.r4-1.4.0.tgz +curl https://packages.fhir.org/de.medizininformatikinitiative.kerndatensatz.meta/1.0.3 -o packages/de.medizininformatikinitiative.kerndatensatz.meta-1.0.3.tgz +curl https://packages.fhir.org/de.medizininformatikinitiative.kerndatensatz.person/2024.0.0 -o packages/de.medizininformatikinitiative.kerndatensatz.person-2024.0.0.tgz +curl https://packages.fhir.org/de.medizininformatikinitiative.kerndatensatz.diagnose/2024.0.0 -o packages/de.medizininformatikinitiative.kerndatensatz.diagnose-2024.0.0.tgz +curl https://packages.fhir.org/de.medizininformatikinitiative.kerndatensatz.prozedur/2024.0.0 -o packages/de.medizininformatikinitiative.kerndatensatz.prozedur-2024.0.0.tgz +curl https://packages.fhir.org/de.medizininformatikinitiative.kerndatensatz.fall/2024.0.1 -o packages/de.medizininformatikinitiative.kerndatensatz.fall-2024.0.1.tgz +curl https://packages.fhir.org/hl7.fhir.uv.ips/1.0.0 -o packages/hl7.fhir.uv.ips-1.0.0.tgz +curl https://packages.fhir.org/de.medizininformatikinitiative.kerndatensatz.laborbefund/1.0.6 -o packages/de.medizininformatikinitiative.kerndatensatz.laborbefund-1.0.6.tgz +chmod o+r packages/* diff --git a/home/fhir-validation.ipynb b/home/fhir-validation.ipynb new file mode 100644 index 0000000..3af5cfc --- /dev/null +++ b/home/fhir-validation.ipynb @@ -0,0 +1,479 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "70659ec5-54c4-4eee-ba6a-c3f17ac88638", + "metadata": {}, + "source": [ + "## Output options for rendering the dataframes/tables" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "98078b40-9c8f-4b74-aaa7-275df72c9b79", + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "# how many rows of table to show\n", + "pd.set_option(\"display.max_rows\", 1000)\n", + "# we want to see the full error messages (often longer than default colwidth)\n", + "pd.set_option(\"max_colwidth\", 10000)" + ] + }, + { + "cell_type": "markdown", + "id": "9566f3ad-3587-415b-a49a-02ffaee35b34", + "metadata": {}, + "source": [ + "## Validate and render validation results of one FHIR-Resource" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f93e44bc-9644-4c50-94af-d9a29a91d54b", + "metadata": {}, + "outputs": [], + "source": [ + "#from fhirvalidation import Validator\n", + "#validator = Validator()\n", + "#validator.validate_resource_and_render_validation_outcome ('Condition/resource1')\n" + ] + }, + { + "cell_type": "markdown", + "id": "e0cd94b5-3a97-40c8-9a4a-d5d33feb9d32", + "metadata": {}, + "source": [ + "## Bulk validation of found resources by FHIR Search\n", + "\n", + "Validate all resources from FHIR search results" + ] + }, + { + "cell_type": "markdown", + "id": "d8ec4f1c-d933-4222-a35a-178454aba98a", + "metadata": {}, + "source": [ + "#### Validate conditions" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "42eeca2e-8b33-44d7-b194-e72630e66140", + "metadata": { + "editable": true, + "scrolled": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "from fhirvalidation import Validator\n", + "\n", + "validator = Validator()\n", + "\n", + "# Set auth parameters for your FHIR server (if you do not want to use basic auth credentials from the environment variables in .env)\n", + "# Documentation: https://requests.readthedocs.io/en/latest/user/authentication/#basic-authentication\n", + "# validator.requests_kwargs['auth'] = ( 'myusername', 'mypassword )\n", + "\n", + "# Search for all resources of the resource_type\n", + "search_parameters = {}\n", + "\n", + "# Search resources with for certain code\n", + "#search_parameters={\"code\": \"A00.0\"}\n", + "\n", + "df = validator.search_and_validate(resource_type=\"Condition\", search_parameters=search_parameters, limit=10000)" + ] + }, + { + "cell_type": "markdown", + "id": "a400b6d7-2565-4c06-8fcf-354cd9f0e970", + "metadata": {}, + "source": [ + "## Issues\n", + "Found issues in dataframe returned by bulk validation" + ] + }, + { + "cell_type": "markdown", + "id": "001dcc6b-0517-4101-8270-686dcde78e55", + "metadata": {}, + "source": [ + "### Count of resources with issues\n", + "\n", + "Count of resources (unique fullURL) with issues of all severities (even severity \"info\", so maybe no real issue)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "efa56586-2b67-4219-814a-3d679f360faa", + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "len( pd.unique(df['fullUrl']) )" + ] + }, + { + "cell_type": "markdown", + "id": "7e0fe487-fa30-4c64-8ba2-b13ac20a7714", + "metadata": {}, + "source": [ + "### Grouped issues with aggregation of codesystems sorted by count of affected resources\n", + "\n", + "Issues grouped by additional aggregation of Codesystems (e.g. ICD10) by removing the different codes of same codesystem resulting in no separate issue for each used code (e.g. ICD10-Code) of the code system\n", + "\n", + "Sorted by count of affected resources" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "09af41b7-c4c4-422a-a1c6-577afbec98ac", + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "df[['severity', 'location_aggregated', 'diagnostics_aggregated', 'fullUrl']].groupby([\"severity\", \"location_aggregated\", \"diagnostics_aggregated\"]).count().sort_values(['fullUrl'], ascending=False)" + ] + }, + { + "cell_type": "markdown", + "id": "e4761060-19c3-4a9e-84a5-ce83088caefd", + "metadata": {}, + "source": [ + "### Grouped issues with aggregation of codesystems sorted by severty\n", + "\n", + "Issues grouped by additional aggregation of Codesystems (e.g. ICD10) by removing the different codes of same codesystem resulting in no separate issue for each used code (e.g. ICD10-Code) of the code system\n", + "\n", + "Sorterd by severity" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e596c4df-bfc2-4faa-b63a-b606e96dbade", + "metadata": { + "editable": true, + "scrolled": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "df[['severity', 'location_aggregated', 'diagnostics_aggregated', 'fullUrl']].groupby([\"severity\", \"location_aggregated\", \"diagnostics_aggregated\"]).count().sort_values(['severity','fullUrl'], ascending=False)" + ] + }, + { + "cell_type": "markdown", + "id": "b84016bd-2aba-4c28-a20a-f4b48a497234", + "metadata": {}, + "source": [ + "### Grouped issues without aggregation of codesystems\n", + "\n", + "Issues and count of affected resources sorted by amount of affected resources due to no aggregation of codesystem (for additional aggregation of codesystems see upper sections). This will show a separate issue for each used code used from a codesystem" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "83f03e4a-d3f5-406a-aa16-de846a72b0b1", + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "df[['severity', 'location', 'diagnostics', 'fullUrl']].groupby([\"severity\", \"location\", \"diagnostics\"]).count().sort_values(['fullUrl'], ascending=False)\n" + ] + }, + { + "cell_type": "markdown", + "id": "227a8710-5b07-421f-91ba-8a2a5ba25172", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "### Filter on severity \"error\"\n", + "\n", + "Show only issues filtered by severity \"error\"" + ] + }, + { + "cell_type": "markdown", + "id": "20b5c938-6a08-4698-9297-7d2764c49838", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "#### Count of resources with severity \"error\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5609dfb4-501b-4cc8-9318-b19cd6399b69", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "len( pd.unique(df[df['severity']==\"error\"]['fullUrl']) )" + ] + }, + { + "cell_type": "markdown", + "id": "8e72ccfa-813f-43f6-9e1d-c713c03c2714", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "#### Show only issues with severity \"error\" grouped by codesystems\n", + "\n", + "Show grouped issues with filter on severity \"error\"\n", + "\n", + "Issues grouped by additional aggregation of Codesystems (e.g. ICD10) by removing the different codes of same codesystem resulting in no separate issue for each used code (e.g. ICD10-Code) of the code system\n", + "\n", + "Sorted by count of affected resources\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c1205db8-0efe-491c-961b-97ad7d8149cf", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "df.query('severity==\"error\"')[['location_aggregated', 'diagnostics_aggregated', 'fullUrl']].groupby([\"location_aggregated\", \"diagnostics_aggregated\"]).count().sort_values(['fullUrl'], ascending=False)" + ] + }, + { + "cell_type": "markdown", + "id": "1a8f220d-d314-4053-b42b-1ef6bf9a9bdd", + "metadata": {}, + "source": [ + "#### Grouped issues with severity \"error\" without aggregation of codesystems\n", + "\n", + "Issues and count of affected resources sorted on amount of affected resources\n", + "Since no aggregation of codesystem (for additional aggregation of codesystems see upper sections) this will show a separate issue for each used code used from a codesystem" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e12ab11b-c245-440f-acfb-400cdb24e6d1", + "metadata": {}, + "outputs": [], + "source": [ + "df.query('severity==\"error\"')[['location', 'diagnostics', 'fullUrl']].groupby([\"location\", \"diagnostics\"]).count().sort_values(['fullUrl'], ascending=False)" + ] + }, + { + "cell_type": "markdown", + "id": "ea051ae1-6698-4888-a672-3bc55c6740cd", + "metadata": {}, + "source": [ + "## Resources with a specific error" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cef7c2f4-22a3-4c18-8eb2-ae7f811df532", + "metadata": {}, + "outputs": [], + "source": [ + "myerror = \"Condition.code.coding:icd10-gm.version: minimum required = 1, but only found 0 (from https://www.medizininformatik-initiative.de/fhir/core/modul-diagnose/StructureDefinition/Diagnose|2024.0.0)\"\n", + "\n", + "# Use Python syntax:\n", + "# df[df['diagnostics']==myerror]\n", + "#\n", + "# or use df.query\n", + "# https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.query.html and https://docs.python.org/3/reference/lexical_analysis.html#f-strings:\n", + "df_query = f'diagnostics==\"{myerror}\"'\n", + "\n", + "df.query(df_query)" + ] + }, + { + "cell_type": "markdown", + "id": "5f4146e5-ce88-42e0-b1ac-41b93c1d59f1", + "metadata": {}, + "source": [ + "## Info\n", + "\n", + "Information concerning the dataframe, e.g. dataframe memory usage" + ] + }, + { + "cell_type": "markdown", + "id": "2be8ee0e-5c48-4453-804e-c2db23115bd9", + "metadata": {}, + "source": [ + "### Dataframe memory usage" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "73994859-6824-42e3-9ee3-9570ef9183a8", + "metadata": {}, + "outputs": [], + "source": [ + "df.info()\n", + "df.memory_usage(deep=True)" + ] + }, + { + "cell_type": "markdown", + "id": "c46b93d4-35ad-427d-bda8-44c42f6b91a1", + "metadata": {}, + "source": [ + "### Head - Returns first rows of dataframe" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2e521216-ad7d-4ca6-8e04-7d86435a3a6a", + "metadata": {}, + "outputs": [], + "source": [ + "df.head()" + ] + }, + { + "cell_type": "markdown", + "id": "6311f067-72d1-4a32-91fe-585ebfb74c55", + "metadata": {}, + "source": [ + "## Snippets\n", + "\n", + "Additional code snippets" + ] + }, + { + "cell_type": "markdown", + "id": "ff1ed096-dc18-492b-988b-8c5b7899adb9", + "metadata": {}, + "source": [ + "### Markdown generation\n", + "\n", + "How to generate table in markdown format (e.g. for CI/CD status report)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8843debf-ca4c-409c-89eb-8eba64432438", + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "# Reserved char pipe | has to be escaped by | (https://github.com/astanin/python-tabulate/issues/241)\n", + "df_escaped = df.applymap(lambda s: s.replace('|','\\\\|') if isinstance(s, str) else s)\n", + "\n", + "print(df_escaped[['severity', 'location_aggregated', 'diagnostics_aggregated', 'fullUrl']].groupby([\"severity\", \"location_aggregated\", \"diagnostics_aggregated\"]).count().sort_values(['fullUrl'], ascending=False).to_markdown(tablefmt=\"github\") )\n" + ] + }, + { + "cell_type": "markdown", + "id": "a9dd17c8-3249-4959-967c-affb1d30cf23", + "metadata": {}, + "source": [ + "### Navigate validation results dataframe with interactive user interface\n", + "\n", + "Use interactive UI to navigate and filter the dataframe\n", + "\n", + "Documentation: [English](https://docs.kanaries.net/pygwalker#use-pygwalker-in-jupyter-notebook) / [German](https://docs.kanaries.net/de/pygwalker#verwendung-von-pygwalker-in-jupyter-notebook)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "086cda6f-2508-4b04-9c29-2894cf3d8b4b", + "metadata": {}, + "outputs": [], + "source": [ + "# Install pip package in the current Jupyter kernel\n", + "import sys\n", + "!{sys.executable} -m pip install pygwalker --proxy http://141.53.65.163:8080/" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e4b8b1e8-bb9d-48ae-818f-b32b75b47ec6", + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "# render dataframe with pygwalker\n", + "import pygwalker as pyg\n", + "walker = pyg.walk(df)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "054d49ef-1c15-4ce1-bc0a-d941446e60dd", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/home/fhirvalidation.py b/home/fhirvalidation.py new file mode 100644 index 0000000..e853d0a --- /dev/null +++ b/home/fhirvalidation.py @@ -0,0 +1,304 @@ +import requests +import json +import pandas as pd +import re +import os +import logging + + +class Validator(): + def __init__(self, fhir_base_url=None): + self.fhir_base_url = fhir_base_url + + if not self.fhir_base_url: + self.fhir_base_url = os.environ.get('FHIR_VALIDATION_DATASOURCE_BASEURL') + + # Keyword arguments for HTTP(s) requests (f.e. for auth) + # Example parameters: + # Authentication: https://requests.readthedocs.io/en/latest/user/authentication/#basic-authentication + # Proxies: https://requests.readthedocs.io/en/latest/user/advanced/#proxies + # SSL Certificates: https://requests.readthedocs.io/en/latest/user/advanced/#ssl-cert-verification + self.requests_kwargs = {} + + # Init basic auth credentials from environment variables + if (os.environ.get('FHIR_VALIDATION_DATASOURCE_AUTH_NAME')): + self.requests_kwargs['auth'] = (os.environ.get('FHIR_VALIDATION_DATASOURCE_AUTH_NAME'), + os.environ.get('FHIR_VALIDATION_DATASOURCE_AUTH_PASSWORD')) + + def fhir_operation_validate(self, resource_type, resource, send_pretty=False): + + headers = {'User-Agent': 'Bulk FHIR validator', + 'Content-Type': 'application/fhir+json'} + + if send_pretty: + data = json.dumps(resource, indent=4) + else: + data = json.dumps(resource) + + # todo: use environment variable and set it in docker-compose + r = requests.post('http://fhir-validation-server:8080/fhir/' + resource_type + '/$validate', headers=headers, + data=data) + outcome = r.json() + return outcome + + def validate(self, resource_type, entry): + + resource = entry.get('resource') + + fullUrl = entry.get('fullUrl') + + logging.debug(f"Validating {fullUrl}") + + outcome = self.fhir_operation_validate(resource_type, resource) + + df = pd.DataFrame() + + for issue in outcome.get('issue'): + diagnostics = issue.get('diagnostics') + + diagnostics_aggregated = remove_value_code(diagnostics) + diagnostics_aggregated = remove_array_index(diagnostics_aggregated) + + severity = issue.get('severity') + + location = issue.get('location') + location = location[0] + location_aggregated = remove_array_index(location) + + df_add = pd.DataFrame( + {'severity': severity, 'location': location, 'location_aggregated': location_aggregated, + 'diagnostics': diagnostics, 'diagnostics_aggregated': diagnostics_aggregated, 'fullUrl': fullUrl}, + index=[0]) + df = pd.concat([df, df_add], ignore_index=True) + + return df + + def search_and_validate(self, resource_type="Patient", search_parameters={}, limit=0): + + count = 0 + page = 0 + + headers = {'User-Agent': 'Bulk FHIR validator', + 'Content-Type': 'application/fhir+json', + 'Prefer': 'handling=strict', + # "Client requests that the server return an error for any unknown or unsupported parameter" instead of "ignore any unknown or unsupported parameter" (f.e. typo in search parameter) and getting all results by ignoring the filter criteria (https://www.hl7.org/fhir/R4/search.html#errors) + } + + if '_count' not in search_parameters: + search_parameters['_count'] = 200 + + df = pd.DataFrame() + + is_limit_reached = False + page_url = f'{self.fhir_base_url}/{resource_type}' + while page_url and not is_limit_reached: + page += 1 + + if (page == 1): + logging.info(f"FHIR Search: Requesting {page_url}") + r = requests.get(page_url, + params=search_parameters, + headers=headers, + **self.requests_kwargs + ) + else: + logging.info(f"FHIR Search: Requesting next page {page_url}") + r = requests.get(page_url, + headers=headers, + **self.requests_kwargs + ) + + r.raise_for_status() + bundle_dict = r.json() + + if (page == 1): + total = bundle_dict.get('total') + if total == None: + total = 0 + logging.info(f"Found {total} resources") + + count_entries = 0 + entries = bundle_dict.get('entry') + if entries: + count_entries = len(entries) + logging.info(f"Starting validation of {count_entries} entries on this page") + + for entry in entries: + df_add = self.validate(resource_type, entry) + df = pd.concat([df, df_add], ignore_index=True) + count += 1 + if (limit > 0 and count >= limit): + is_limit_reached = True + logging.info( + f"Custom limit of {limit} resources reached, no further FHIR search paging and validation") + break + + if ((limit == 0) or (total < limit)): + logging.info(f"Validated {count} of {total} resources") + else: + logging.info( + f"Validated {count} of {limit} resources (custom limit, found resources by FHIR search query: {total})") + + page_url = get_next_page_url(bundle_dict) + + if count > 0: + logging.info(f"Search and validation done for {count} of {total} found resources") + + return (df) + + def validate_resource_and_render_validation_outcome(self, resource_url, resource_type=None): + + resource_url = self.fhir_base_url + '/' + resource_url + + # if no resource_type Parameter set, select FHIR resource type from URL + find_resource_type = re.search(r".*/(.*)/.*", resource_url) + resource_type = find_resource_type.groups()[0] + + headers = {'User-Agent': 'Bulk FHIR validator', + 'Content-Type': 'application/fhir+json'} + r = requests.get(resource_url, + headers=headers, + **self.requests_kwargs + ) + resource = r.json() + + outcome = fhir_operation_validate(resource_type, resource, send_pretty=True) + render_validation_outcome(resource, outcome, resource_url=resource_url) + + +def get_next_page_url(bundle_dict): + links = bundle_dict.get('link') + if links: + for link in links: + relation = link.get('relation') + if relation == 'next': + return link.get('url') + + return None + + +def remove_value_code(diagnostics): + find_value_code = re.search(r"Coding provided \(.+?\#(.+?)\) is not in the value set", diagnostics) + + if not find_value_code: + find_value_code = re.search(r"Unknown code in fragment CodeSystem \'.+?\#(.+?)\'", diagnostics) + + if find_value_code: + value_code = find_value_code.groups()[0] + diagnostics_removed_valuecode = diagnostics.replace(value_code, "REMOVEDCODE") + else: + diagnostics_removed_valuecode = diagnostics + + return diagnostics_removed_valuecode + + +def remove_array_index(diagnostics): + diagnostics_removed_array_index = re.sub("\[[0-9]+\]", "[x]", diagnostics) + return diagnostics_removed_array_index + + +def select_location_line(issue): + # Get Location line by scraping Element Location by regex + # location_linecolumn = issue['location'][1] + # find_line = re.search(r"Line\[([0-9]+)\]", location_linecolumn) + # location_line = find_line.groups()[0] + # location_line = int(location_line) + # return location_line + + # Get location line from FHIR extension http://hl7.org/fhir/StructureDefinition/operationoutcome-issue-line + extensions = issue.get('extension') + if extensions: + for extension in extensions: + url = extension.get('url') + if (url == 'http://hl7.org/fhir/StructureDefinition/operationoutcome-issue-line'): + return extension.get('valueInteger') + return None + + +def render_validation_outcome(resource, outcome, resource_url=None, do_print_linenumber=True): + from IPython.display import display, HTML + import html + + resource_id = resource.get('id') + + resource_html = json.dumps(resource, indent=4) + resource_html = html.escape(resource_html) + resource_html = resource_html.replace(" ", " ").replace("\n", "
") + + resource_html_array = resource_html.split('
') + + if do_print_linenumber: + resource_html_with_linenumber = [] + linenumber = 0 + for line in resource_html_array: + linenumber += 1 + + line = '' + str(linenumber).zfill(3) + " " + line + resource_html_with_linenumber.append(line) + resource_html_array = resource_html_with_linenumber + + # sort the issues by linenumber so status info for "issue 1 of 5", "issue 2 of 5" etc. is in right order like lines of document + # do it reverse because we add issue at begin of the line of fhir resource and multiple issues can be added to a line of fhir resource + issues_sorted = sorted(outcome['issue'], key=select_location_line, reverse=True) + + count_issues = len(issues_sorted) + issuenumber = count_issues + summary_html = '' + + for issue in issues_sorted: + location_element = issue['location'][0] + location_line = select_location_line(issue) + + match issue['severity']: + case "error": + style = "color: black; background: red;" + case "warning": + style = "color: black; background: orange;" + case _: + style = "color: black; background: lightgray;" + + # Issue number and navigation + issue_html = f'
  • ' + + # Link to previous issue + if issuenumber > 1: + issue_html += f'< Previous issue | ' + + issue_html += f'Issue {issuenumber} of {count_issues}' + + # Link to summary + issue_html += f' | ˆ Back to summary' + + # Link to next issue + if issuenumber < len(issues_sorted): + issue_html += f' | Next issue >' + + issue_html += '
    ' + + issue_html += f'{issue["severity"]} for element {location_element} (beginning at line ' + str( + location_line) + f'):
    {issue["diagnostics"]}' + + issue_html += '
  • ' + + summary_html = f'
  • {issue["severity"]} for element {location_element} (beginning at line ' + str( + location_line) + '):
    {issue["diagnostics"]}
  • Navigate to JSON Code of the FHIR resource to location where this issue occurs' + summary_html + + # add issue html to fhir resource line + resource_html_array[location_line] = issue_html + resource_html_array[location_line] + + issuenumber -= 1 + + resource_html = '
    '.join(resource_html_array) + + summary_html = f'

    Validation result for resource {resource_id}

    URL of the validated FHIR resource: {resource_url}

    Issues

    FHIR Validation returned ' + str( + len(issues_sorted)) + ' issues:
      {summary_html}' + + resource_html = summary_html + '

    Where Issues occur in the JSON Code of the FHIR Resource

    ' + resource_html + resource_html += f'

    Back to summary

    ' + + display(HTML(resource_html)) + + outcome_html = html.escape(json.dumps(outcome, indent=4)) + outcome_html = outcome_html.replace(" ", " ").replace("\n", "
    ") + # display(HTML(outcome_html))