From 8892d58e66b8725b5af44b11eb0d933b4b2e7c4a Mon Sep 17 00:00:00 2001 From: Gitea CI Date: Mon, 6 Oct 2025 20:21:40 +0000 Subject: [PATCH] Sync public subset from Flux --- assets/logo/logo_1600.png | Bin 0 -> 197091 bytes makefile | 169 ++++++++++++++++++++++++ test/.gitkeep | 0 test/test_all.cpp | 2 + test/test_common.h | 52 ++++++++ test/test_eye.cpp | 155 ++++++++++++++++++++++ test/test_interpolation1d.cpp | 155 ++++++++++++++++++++++ test/test_inverse.cpp | 141 ++++++++++++++++++++ test/test_lu.cpp | 169 ++++++++++++++++++++++++ test/test_matequal.cpp | 108 ++++++++++++++++ test/test_matmul.cpp | 127 ++++++++++++++++++ test/test_matrix.cpp | 164 +++++++++++++++++++++++ test/test_matvec.cpp | 236 ++++++++++++++++++++++++++++++++++ test/test_transpose.cpp | 151 ++++++++++++++++++++++ test/test_vector.cpp | 196 ++++++++++++++++++++++++++++ 15 files changed, 1825 insertions(+) create mode 100644 assets/logo/logo_1600.png create mode 100644 makefile create mode 100644 test/.gitkeep create mode 100644 test/test_all.cpp create mode 100644 test/test_common.h create mode 100644 test/test_eye.cpp create mode 100644 test/test_interpolation1d.cpp create mode 100644 test/test_inverse.cpp create mode 100644 test/test_lu.cpp create mode 100644 test/test_matequal.cpp create mode 100644 test/test_matmul.cpp create mode 100644 test/test_matrix.cpp create mode 100644 test/test_matvec.cpp create mode 100644 test/test_transpose.cpp create mode 100644 test/test_vector.cpp diff --git a/assets/logo/logo_1600.png b/assets/logo/logo_1600.png new file mode 100644 index 0000000000000000000000000000000000000000..3f17bda752029ef7169eee9389b4a0ae24520e63 GIT binary patch literal 197091 zcmXt91yqy&*Iy7K<&bVhNh;l-GGqe*=?pI9Srn%iZ7cu8*^%x1VeNnkqZ+ z4G;=(!z83&WjeUP#(B4Ab0}N?Ca(kJq5gHN-@I~HMlNC?LDi5`1i3iU@O{GTD+x^E z7ZOZ3c(X7U5qGYK#ebnvBSQ)+b!Zg5bE#VyY^zhL8_HNe+HHB0yP~>11hm zSH4Zob)81;c7B;uC3Z!Ps?+zcZ`U;ApG1x7Q!;~OVwBouRA@t}Lclq+{h~7(Z$pM6 zh|P9VI~Ac)@P%D}ZW+?cUDFTJ*$=!b0+D}EHsZQE$YFnRW7UZ-{X&9^=y?Op!7g{12=KOZK5-ui${IFg0 zTH%#Yh7fVMi%Y_{^PgV*-%p#R*2`8ai@cYjW1St^HuW|7xRpz*N^zS{Q1?*1Ll|B( z#8PyA`m)cz`)c_wonurhOc-^jo1w}GyZV!Qh;*Pw$o~%Hx`9Qap6nhfjS4oDOV|BG z5u=FeM)!WU7xBZn``G?j=EeUm_S7U`@p-s}r1qXTyx-sFGRv&~G1?XuHwZ^fYH%0l zCj;lgN()~<|NoM)vP>Q_y7()T(;bqym^fImJV41k_bZcs9~7+BS@5KWBxj=8#T3N?#ZdRk((foP? zseqC0ZM@q5+`JVZQC8ez1two>WHuf+WRfnY?O4J$;GK+&e*VFPD0?H%9rm_9nq6a`T60^(afqjeL*LbERPze&(*QpYx67Ttd z`|Q`%bBo2@j8{QikCNqTw>j5dl4l!Wf7#vnfS2VA6J%m7O4t9G;_ANjI#PqD;+MjwIzUBUlap7 z#`xkyncVG%YOb;Q$z5wU#y%qHt8nn#73!D;-As+Jj;;;{M(*WZwG_^#x1q0?Q&M)r zX7-2ZwL7<)|EvFDT>mPZT*OV9&Z05|czYf#=gVYXZVj5EveC*D-WtM$T>GCDc>X!0 z)k7RD`Y~RztHy2yQ<2?_e}U)6Yqk|>(5c=iBZf%Bi+Y)#1=64#Q6v10F{Ux5Xt@N( zfjQRr#lm`QIEpGw3|$VNE9&1QnUw9HWu5uld>#0W0(%fdIlPr+>>s;rbO~yN%^1nV z9$Box3fr#Jx<5(}#7&uYH+cR?l_#YfQNg0v%=HdTz&0FDHa2M-# zH+=SgNEc>YXujCQ&?FCE_(|IfI7r2|(s}9}CDVG;Q;t?kaMX6l1#p@e_mT z@uzSZ{hVN_xlHTxWPsJGBwvsH^{IjbgHK^O@csUN_Mv|!p-7W0lC5Z6w2<;faJjOV zN{p=HJ-fC=@NFIr*tAKox4Q@%fn|`Ug3%z};B7|0`k@EU0COH`xr? z%0=;fxu<(l(56QLhHJNoLPWZug==-vSRkfuHi8<(lLyc+rTGW^GBF*{XtGmQ82wM$ z9+I5`|7ChxJ;EG589##)P4V2iHOw4Vrd+iiIK>9I(Jf~eE-k_X+?(FE6kp5O2lU2h zU36lMn5qWJ&@H*=S!^^=AW0C=t1;(`I*Q?mSGD(_&$nQ5@)QJQmd)B05_j|yJT8bA z$y71R$C_~YN%^=TRP&TbCAseIuk(-&R7E9%C(|aZ+F)ZB_w(1?>8K~or|+oFFu-I; zGML>YAdUJeB#`#AZ$*o)76L~x;t+d0F}f(KRq}t{>@Im8a25P0E2^>B;n4>?Q}Qq0 zl;TbCPRwROA(*P%Kr)nWs;FioIEX?B!U0bF^`yK@Rj-V$nXE|>{>nM|Tqi%y4P2MZ z=jQ03VU*dE+$5-z(i3yGqg<7QS=@?qa*=NpNTRSK_pn#>qO8c1dp)|zuyNHW@Y6c~ z+~B`3m3#P4FQWo_AUg46J?Z#w7hO^(%ul?%v=LKTfL`iGhlif-J`Ry&6z9Z6fv+h= z{J;YWoyhq2MYDuPp*MV{VJnmsX$sFPAWgJQ6bA~WE%S|-oMJgqnL2qvH(x^P?kX}9 zu7brbPpc~Yxl0Vjd&h_!t96qOdi?L8EddGW3i%3cE1QL&H)6b%YzmP#>C3dS|G#Qc zs7JVBB<%!uEBYiEu#Vn!ML~zJQb;CZSY*!q-7NjzIoJfd)$lZmoOQ}4pE(SfWnwri z6f2GsFgZn}n^_ZbBdeC9jxS$_RHVwiR&@bK^EdP!#=7c~{8j9qzgorNq;TK`O2`}X ztj`=@tHX@S;XhYs1+9)xtYwMP51vjLM*EGb2YU;<0Iv1B!JuK2+(@sw(p*3$U&%6QD#NKp4 zQ3K9Bz?lLF6DW1=BpzcZt6Y;`n?Z!>+G*@gNWrkA6N67ELN$ZrmK+q=QE(9D-j!sp zT;~RK#!n5Frfcw`&;L$f`*(r`qm0^~prE=PrFgEw^Se^90W2%Hxq~-is{Q@92_X(c zb7R!3g}^6Y-|3CMfzK_SyM`spznjRrMX1Fks!*n3d2|<(UN6}}yzbroFb^m+A5f@_ zyK|chW=8-K^lZDseh_@BqZ4;554ZdDPl7A|9Q~PqgdV#?6z>MJLvt%kZkmxwohf=l&A`~QhS>3fbS;wqZL1GS9^^S1aL;D`|u zBaLko{w4R?0~eP80XOk#F%h;cD~G~@P1*4PB0bLOQ!)IW-9iW{c?|qZsup~v<1ZiSCa70X{lN7mp4=YbLW5M}`0U5-OxOFQr0no7`2?ob zGm9+wUZ}QP@X7myA`aoZ@WuRdf6wJ?yZt7}@+fsezY5Utt58-&$^#T)Dqn>a$Q|xH z=he$n1l0#UN{h=~zp=OrFQ%WmU~^L^?D%_dUS6){JD`4K(2R40&{jLmVDjd|h#tfh zOo)8&HBv60_!sI?OcGT=a6z>h+9&-Sh9A|SHu`Bh7>rx)Jdo+#Sy5tXURGo28H{Y% z3eV&6^;+D1co1tbAtL7)ee}P7hiD-uE`(5S*eQE|`Ll{k6ii1)AKZHkI9%-9tGG&w z9GY>Mg}D2jq+M1wyH7*#xmQ!~fr4)NKj0p=#t_Nkb8Vxn|A#EWgLoCcj)L~{43W%j z8HDXli+kO{Hb!kBstdj&%frA2ILy*HbV8ebI;yRujzpjd( z0)W2*HcQYnj`P9_bww&5eJ=DkGlS-@Euz2g+?AZq+Y`&|w0gD;uu)gf=iHBO89gXd z?hf)(ZkYeMCyfRPNYJj(wLZ$Au>^7m?Y5#1-NrXeliIlwvp(H<5Gda+evqOD`jvDa z$qZ6RW#H~e#=HYcwZtug7b-?~YCXjUH*p&O zN^{CfbVHY@0^9t3$5CdP4BJRn^>Tvi*t*Fybp-CFN36uh)JNxwn?C}4DiCz8nTb>! zZOlHDhpgL)&h<(dmfOqQIWe`K+ecO8Z;eyz+hXct#sd$8>Ljs^Hg!kGsA2FAUeUqX zfq6r9_zWfYMa|-pPFlnPY`*UQc>vrGbOm4#wQ=z)Bu5vRpptjK8)gP z%T0?#QPHFs{Rim{`ZM?Ae(D&RetHCxQaSfWvvV+C$1Lo|>BG7KbMRR3p;$H~!i^ew zes0k7j;1`XU4l5&-BsTmLVt{ua`#CPO)^Nun)T7&O9VxMIoV*}!dH*ji9B*M`-2$8 z;7f}#rwYc4W)98DGeOY^nv7KGa$JsO&>i23ETw|?Vac*$KQk~PSN;XVwR6>5W#Bx~ z{K#Nk`4;joJ~1($9cEf<{LhMM^k9&8BMUTpQf&##%oWUE~ zMuL;L^JFsKcb<_)Zzjl_uS3)+JaPd6bI6agWbYro(GRm=!pZ5ziH2+-Jjn=oz$O)(-k40(Bq#bkxBCgABrQwGT)OdnPk=})ByI6;(u>K6cX0ZtX#0i`5;Qo zN4``eV&GY~OB-q;&m>an%cHgSg)~vEQ;ORZUMU#z$UPgHu}dM)4Y0#aE} z&6V^h4M9N)%H;{nSe4;s4iJqJ#6mnDJ}mcRY4)TeQ0N-|#baD9?j@?NN(1bXrc@9% z03X;@K?!5HZN~ZjV?#6at>}rkhzng-at=H?k+vTzvI8> z1s!Y_*tkq2UhF$#fW6`Pqok6AvqehuJ+K6|3c^qCI2Id#XIT*!u7ceWotI-nyv@a2 zZcmeW+;Ox7z2S>&voGmx0o-am31EU+=GM2=ac_QkgP4an3~i^l0gBBdM1Z9a;rFxQ%q#O~j1Dd~YCD zG|S8mIlo9&Dr!S{DAzIr+HqX|luiH?Sh68?tU$wB9;W~<1_upt>Z`p<7A@ViZukQrQ+|jFhq8QU z>$c{fdmGqZvW%KwJh zwGCUMIZR69JeL%9Gm$taS^+mUR6IC1m4Rv%d)$-|@YP`iqo@cMQu=#WFW~+oIbm7; zzu-%-Z|EU&ihNUHC}c)Ak7tCg5gY}c5?V^VXI21suN)@&z8nC9KqxWB;QkrP zW6YL3f2D)6Th3o*SdA{CfD2aVPw5Qw5k?vG@aR0*@)x;LRH}BhE>sTdLOoyg%LD?3 zN?U;Jhxn_SHWM}SI_SRb0zaNk(7lQ*YG!#z0o2gW^Mpc(MoO~o6$WDo^EE@P;DY$do#{#wmQf$a%u_HQ;d2X9 zU`z9HFso_pLaU4Le8Nez#a%bc+E@7*yJf`;u(zYliyg}r;Vy;Y!D=XXkiCedJpDn( zjA^vi^QAcKeuM6#7lAdHCNX$2coZ~4aT{XQ_94)j(BDKUaAH9a`{yi!=eUJ~3}vmO zoG2TxJ&*s?&zHGWx;G{bZdobh)~IRTy^6!4 zvs;~dv11*Rk@ObrP6Hw^UuzAXecpg&R+v-?Ye73pwN$C-&)ojInU=}J(p&l{7TpQ; z;Ol@dtbRHNe9FkYD@*qXg*B9ERzK@&+ef(D(f6A@ZSD@V>7~G%(`4)4Wi?F4{fssf z4~@Jw;`H5c)oVqDvL@I(yLDK5vdD1xm%_7@_CQ~#HaOyLCi`ho=DE_!B@mfdvnTNc#CZaO}l`c}e zT_ax^U9#bGMHfAMa&`q?lqpMY@us_0X;{j-lVBrCtiPzM!3>k345<_cOWP5eFgaHC z0rHnnm(jMUGwyCEHF_~|-o>b|X_Eh5R28cV3egXi1WBgW!#323nkGl;nSFzJ9(2B7 zA>>#YzTlh;5D*nF&nuoh2=xLva#=eyO#5w1blQYXArGw1kJ3>dT^po&t+hAqNUXw= z`oOym>gJ5S1=7tH5BEx)wAWrG`_u*dL1q%EPtl!O(R>9?;Q?iV(WAniOw?5dQAlzk zA^--SbpuQo;xP594Y@%mj`5GtI6R7UM06J7rLgVS%PuNqjCyT1Ds4~`b+P*7gBVih zOv)(ODF~3{D(F!!1S69J?(T5Z2W>eD`A}4AAyznH9UEPj+MRe;+7`+g*{zbEs?reo|fzFwkxa-^H@2BJD%znGK8-;icY++MUraXuUV0%0-A&(QQ9EhFq3|C|cWEHWIN{iQ|on>LWxxifaSP|lSb09I8lB4O3h z27yXIG@QzzKFI77$5-?M$TfY!M(+uR8va~Ig}u&9_T`5>t~@}RK2wWr#J3ms>4&mf z+kf!xMF{_@)A}rmph>Nl^6}`cCCA4vvp$bhyW@`E!s3IN_N7l13>NogOFjp15ZO`7 z3U}A5SYXufdqzMZ(vgi~$w^bHh!LlZC>Um6?!m@wcSC>_mvvs71G!M{s6#rp?jG0s z(<=Dz37bl880EWx%s|W};4C`2Ibo*F_s<+i;=IjhRlj>Fy#37wcH!$fjIs3wC91hQ zFE9rNBa!^~gzoIM_4r@^;}5^q{`e>bESWa^d8ESgDts*g!;fT2teoO@cOzWi7r_qt zJp!x~$WKB`74Ar@x5$Voy%sUA@qRwqPS2`}bX(09>b9&x0ow00MV>l##hMRNTzx!y zmnTR4znT)5O*oEM$dJvN=*Om`s1|F2Ggd!60EcT6^fYmddbo&|#o(y$hD=%NG{-#E zE(nZ?TOHGqYj(M4YqTcOKQ`%Gnfr@93tccJIGFKqDy<)>Fw5I8eodIo2bx{>lBUVk z`$Q<7A@?KOCl4Zom|wM1tuMSJ5?PH+1N&)eZ-2xgMUTSnA`Z9bj z`5bM^oik>mH3FV=5zJ%7qm^M17}+O#B>)8s)b)=y2#e^eS>o?Fa=!G3Dqz*ABI=yR z7vXb#0}0Ox8JQp{M&Uv483~J?LA`d%;9w&)k;prUP0;AW@(X+(Nm~#Ct)l&7Os#x8 zP(?gTO|Mb_m7O*ZHz07r+yqlh9X*Z;=HK9UIKdpeO6M7M9(>lS^@#$9ls#1!T6%MXOBNULTxDdYtG*mI|GLD;5`%;0SI;OpuI zer&t&k~2$q;?EuwekQOe*pYY-<@hJUz6UFN@gQnV@gny_yDIS?%1ZE4lf@zhAbj-; zk1Q`EI$JS{D)2^7&@;KkhZjP`eClx9YW%>2Soxej9o-YCv=mTZ1JjW+4{;jVQzJW8 zym(-j`RC?*=szd(yH()!b(IZ`%1^jFwCrD3yJ!(@P_%{9#t~7U*9z=FO}nN%T5k@h z#l+P(n@kCt*r4?KW?Wm02Dq5*=Tb0b5tgwn`3=3_8~qJahoq?+j5c7SSe%~7o9=`6 zyp49xe(thR)|AK@B5asoN2zfW#k8`O1M|ERx5|pzD_OJD|DgiSk+N6^AV73b?9>qq ziVzDSf5nqf*a6!{B`}N%zBU@t_4He0qN6sm(CldXPCLLLOEfXFz|3_I)c`c`@?F|O z0OvUV8xN(2QSE}5ks0^@?*bHHnyO+JR|JY7d$@?-dm(wnh(Dj5YH?gh&8)tNq#c#n zL!7+ovhhru+qKd3`UeQrnTKsE@89XzMROkv@a`2_Y_&|fH@?O+Q7Ja%Jl>7Q$BP); zr!5ggn(BII2MGDx1ID)`=69SJase3BG!))@{j(>=0Q3SN%!`F%cp$S$7*~Hv$0R{F z4x%THdY@y|;?SKybP>Km!3#9_V%0{Ee$9f^WrqKVpf1OB7$4nw>V{u{ZGO5lIMOT7 zmMN?FHjU|*f1=u~ZBKYRGptAcT3nW}8;Tg_P=|e)%@~}wA9?mi{C3<DA#?Et$d82L zelCEnvQ#7C!n#I2HzgzMOvfu7+lui==x^w6{P)b(94eFqR%wpeSS|1V4aJAUpO0AC z)YG6SL5s$oE<@Zq@WIvXnO`yHkfB?hC$UP=C20YyrJe>a zu)Oi9aTRBJ4Y1Ac%KMRGcd~q}fO&tVt9_p?Fz`}ARzmtjnfyc2WW#^s080P7M-)B3 z89-TNOCQF3uNzaq>A&vcgJbOfdY!HDx&;$#vPCPM2KfYU9BY0D32^D=x!&ob#lK6m zWZW%q1V|=Bd6~P?8=gkBFBZo@7B53iIAFd3YKv=5T{bDjP)#oV(`L+pU(KR4&S@)N zv~|54=6if;Xj(o&U`8+FZRGJyM8O!*|13w=)twiZS#q(54(jtR9SwV#%QIQj6&3Rc zv_YEKEGoNe^An#aWiELKPpE!ywr)Q>LWGj%Bf&?ewJE-q$?@lW$}E&H(b^|+LD zQ8E3O4OkxVG2NI5yfFz=S8)8B8|JH2tx@W1kQ)pxcK1T8O2GBuf?Q=|7n}46EQw`L zjIegl(J6@U#_uB~jQ;F0_#h0nUX1w%Avhte z$r%n+Y#(?B$Fma5bTpo;{*@wEY^LJN80Z|=F_KwGtgn1-J02t0H&`z7w}!z-3h2yI zCzver6ENg3Uth$E)?xb&rPcECG%$aU1De$k!)8*Cial>tB}$r>J);R%&E^3&{0=b+ z&$`V2eC0zypd!kfufe-a&HzHtN_?x`Nj{KL7Rgi@*^X!kvH%&RGYEJ5elwu!`~Dyu z=X7g)@pV}||Gi3z)e*ylcZ6A;7WYs}WG#wa=&u+#N2(Gpnkn`UFb^QWFs{zJJ?~t3v}I9@wole1?CLf`eLfqiN|#l31`I`&nKQ_a&O0=aAus@ zdlT-)#H{XHNRU{|erWS^b_bdz{U1`eXs8T2{_q{%9hzQ$aS8rcM^N{OD`Ms;YZh5i zNf7yGUoEX{Fg8l7#X>DL9DWaqT8BiLMtFdi{7*m|jMa>#kRWY`=7bV;A$Xo4xs$|o zLN~6ldL6gRz!wbdxz*|IM@cfzM^caGPK9k0-es5(3>J^AL?2yXiT2 z6Du$|Uvd5gw_C*O`fc%9FsXNJz5xkybAzFHm%#SjWX!?r7Ykr_gQ8Ks?C?cTCnjf# zs5U?$u=E}G{!>Fgg%F}ML#W$VuC&FKH~UuS%z$#VN*X{y{5R1%brsS17%RzVsxS9J z0$&clrysjVT5RAVULjtyv*XI1j7A%1cQQ3Y0g`*01`xGRhd_ZHq^x=c1ciT0T}%@H zoP)5&L?W(IppbVdjCg|(@t=zwjdHR{%pDg^qx{RuT7-+(#>^dkR54|;@HDyY8*^q9 zJt%=1y)Q31Xs1fq8JC1pFe*9*9azbv^E|3m0%!(LaoU;Np@Nf2*ly4p&o4^$WHa+W zwSzGjO8DFb2Pp9!zM`LRw~=eZ02Q4n%SU2BMyJmm-IB3wPD8K7zcQ0Tc#wD3;w&s$ zhP*-!1vtnUonRY3f#-g^n_62;-1Z56Zq2J6f08t`3O*N-_ zl+m~v{11Fu{piqy43eoCz=bUTB!2PrBo)9Bho<$NW5u$IFIMRO{@8(RK!LeXU2|;B z4ePd_yCre_7)+B5!4e-1R4E;T9Z*t!V9Fm&>&#!~jhr;54XD{uViuBLdu3kx5jt4O z#VC{HC7JxgPk1RV#_D5JFr-Bp3~5c8=uP>H5AC9fFO2gk8po+Dr=(!qG{<_BkqA}t zf-6h11U+pYO0#|rrc|pBkrW{*xT_G2B+TDjM`>W)g`t(h&;vK(Bz_-0 z_jl_3SZbx=)?u~4^^3)1GZ&snSO&`y$u6`$dmp~1hdyR$LTjaS?K84q`YY&QQuYMe z;i7T5;RkX08&%lvXWTGjK?yn!`V~t~730}!%fe`HfMq**jB!OiPBlh7PUVlu+`2`M z%QuUn;gnpGfo+ydfq}a3x{X!_VxAo}iEQC)dN_)TYQ3)0UBLsh58Qg;m?3z*h%M{N z!7O?FRWpm05}ZUnmqDVK`%B|4P9hy~AFmK&zZWG1UrWKf)#}`Y`MMyE`+Di?_(V7! zwzuO<;{>tHCN*XAoJgvd7+}c;sQPM1mJ)h0NkP-c8I~MPMg%cRo|?cGOo$}B9dUT% zM^g%^W%8i25pu)gD$h$`VV?}Csrw;NNfp6-aH%rgV|_^_qINxFMU{!d_Dldy$JQNk z3q%ibj{R-`po%y?T$X?v$LFiBZnATp@t)L|L%98@Y3qI%N2Em4Ugh~bbF@5t3fs)5 z`Qa?QWI-&K%j%~vlW=b^KaM`-+=%+DqA&$nv8dOQDMt}>aE%t);67Kn5^WF*1mGTz z{>jvJo+(*TFHnzDQUG)v?~+G*j0t%5w-*Qye`L#l6B3q#37FbuPUpoj#vEo?ikZzB zIdNOC511I3l_s+Xk%pVj68bF%o7WQQxYkhtw;y9do9ATf{IF&Yca44mjbHFWYHex& z^;Pe#?~{*Uz7AYRdZ0l{c@fLQ28?3kpLQ3l8F?}}-HV1OuQNKLs3&RSOKN~UJ|%z` z*TL;{^*WP@q4;JzReO5HHY)G-Y8L;ZR;S9JDSs*>BWE7s06v5`j8QC`J2EHd=Chr8 z;~a}=Dk&OMevDH9rC=BQ`ag4}0Ml;N1ZPvJ)A%_ny!MWBL;Hd7p(|wh(1pI-+|YAJ z#7YddMYADDs8BZ#%>!1J>UFFc0AY-=jZh(I$5S~h4>b~+B8=#KuOAgao7rlbY* zsiT}PYqRHPl!)2v!tNu>>dg_VbT+1U-Co3_-)3T(#Nl2+TOa$Cua9qRFCrg5X+d-* z;>LN0MlIz3%cxK&*F~su!n8pg;1Xlc)7y1z5Jjeg6x`$HSOCcGEs&-Jv7|ciX08-&{!_9Z8l`&!hg;(7wNgcFh z`1!ubAGn(cN*fdmp)`#85vq6_(wK;egg>v?eHd7>`Ahe7u@(DW!=%S9y0Y43TX_#) zPDW*6SKeI@AG|c=>)yNUPUCx41$VPXm7v0$*DS1ny#W}^8`=o$MEPAVh5VsI3F}x1 zk$BZnyK|`fSzr}9bwd=zlc~gstb7}kh-rh*wE(VYW{}yc{)+XBbyw(c`?9YAD&KT! zS<;AS*-BnyAqf!pNYp)Aj_IK1(vackf4-%BYqOs1bPz=t z#0`HAZ~fgdjkq9}X6dtUKly6N3xg>eK*ovc!*P7v1H{Y7G&p z*B`9PUrL*BG94E~bLeJCK*jByH30We!)8I~u2?pzECFg0X~~ba=h@WWQ-d6JLIgFi@sWDgBlf`R*xbL;wyH~SyU*t{yAZBITqHQPFz!@m_>+l_c6 z*L(&L)8oXI21H0_AbF#p!uM9 zumQl;P!aDCB~jXpy%K=KXnp#g3f#T|>J7MElRYA5(uSywr-E(T0Nq+3$|`nCG&LJt zV|pryvU(zG?(`D-@(2L?g5f8SE6b*8%J5g&T>wvBsRgW1Eti(9R(kObToucwA35Tj zN6L&n7^rPw8M_8&Hkp3QfwIbyEp{JJo@K`uqZBl5Zw)9u#{EJYfVH80E_9SelVADa za|u&1fHy7skON@{=5-51Ev8WfEa*pxg9ag^DH#5O<7#Qx<^`Yd-de%eA=zHO;H6on ztRhLb5v<%~M(gRrbRK}-ao6~hzgolQ(||KKwG?*~@Zlqkd}e`CgiSGw-hvX2-+YHg zgT1nLZlL;PWozYuJ@H$ek8w)wuIW*6LvFf69&D6^TSI>hAWR}j7|ZPRdNLoy4J|9j zOWOj(-9ANHE8{yVrx}XW$)G_94&0 z+M+2+32)wJqgf8emmkeF%-E4FfQP`_F-u)hGH6Tuirsp6RY(MP4hKx;P$}MWTEO;J zqy%$#KP3RS>21E*YsKKGaG{LOk9QW)a-{Kg=T|w>)L8q>{v(B>s9V;jB>;Kf2ybkd zTVLtL=lk{CJha;oBHiUmNe{S+B@RiNKYu~xTpxQV83@ysqlh$Wx@4GZA5|jrm72LFjtCX zGSi`|eNDIficlbnLZa!@+YZwuRAUsHOu``4mlD6(c;ppr)Q^Or?MHT^Q>)3~uws6nNR3NeZjL8c*C|u~Te?1|Baj462C0939xT$%2S3daF5BZ>5_($kVZIDA z_VR<>QTjyk&K?8Q{&yJoK+ui3*9>p{pkh^ud`uC3I79AjivYIEoE=OZJbWvxB0R*a zb$p))3QD)Muj(Y`80f^QnsOR2Y7Z5c?1h~+Sx*OYqj;cx!rWD4L4il*69ScbI@cs@ zYXd~xK!*;;U83O{#7rRs&PGa5|N68@T$d_E}U;N4K0FZPcX=S!fl7HzsF&szj zuGDs+08+pStCQ{_FeLDm6qC{MPrsc0Zi{z;NqJj9-TATVWCezIm)e0Qy4NloD)(I$ zpU*!>ucsdG%!|SabhG3C;H_v1##nPjZgbfAhlD==i6Ts&rKDj?=%L0Zf$eI@LzZfQ zbV|XV4k#?Uq`RWI;BzxVtFux9g|w|DPUFV-L!6R?cG|+b;iKk!{jv*%Cc&v(Wyq~) z8pW(FOZkC4GB<~#@v2cNnPqO$B2gd}iUXO}K|FEHp5P+|J<^&eFXrUxD zq+Eb=ju`^=+_Br6^+-qa^UpQ*`_>o0Zv3@!%MshuWex8LrnD$g((qD*2YbW%G z;J`!sV0y(H1RJcnE_=0VswG|&ws})3;^+!-Ue<+TC>E~{^VNm!{RzRI(zG@@jkn<+ zo?02{SQTZE{bjB8>iX7>$Wsb(R;vkuqBuaa@Uy2op?Lb3dHB6s3l>1Ge@rU%%MREe zVbe&D9HoqK^t>9eRUS19x8)VtuEQKS)Xlq@W3wo{1RH9u_^WTkw09inOprCvSp=c? z3sE}BCT#kXlizT68y1KEs=Hr9=|bGG44jcEv`Zbdg_bJ06jO9lw{((sIQPT2d%vJs zxW<~gvD@%DuE?1>hEm#ZDrm0PXW>W#rq#t`rHWewJKQ*@^9(m^F?*$fY-xKxv`p|O zH>eSVSrn^SRqlGavu<=W`_(505+Mth>?4^(?wp+FLIUe#-_fzs@zT%(As-`PiI!8h zFTEb(qwvd9ni({y-5Cf_KWeB6me&(ub9P2r-O)%U#Wz9&_t<3che|k=kXgiGS7g$~ z#gJ6l{Gai#O^>c74@`p7SX@^PccNK91u9e}Lti@HBaO?W~_$ybIWzN$YC9MSn?KI2`+E1g_R&i!W@qu+}I1qm<0c$+5UV zv>HkV(I{+7wzlq0(8b+YWC3?P#+1fhXclAAYtL-I$zULM*6x={P=k$2uIsPw6#0u+2-$4 zVeM!Em}p>XVI7FsAHffLJ(I0YfErNF|Az^&_DxR1AH}@IN;)K68SSTBBNKu~gMeLW zay?8J2-OGX0OzMl!o6%%c?`DW=;`17#ev&~u)s!cV$aM_$!=Ktr)8Lwm}bA{i>3>2 zAtG$Gkm`Gz5dp<1`zK>MxR|}dVTM&0F?p`3aHnBKerVMSNl-u=j96@mU#sc}(vjQa zym9z$=OSUYoCQ@mP=vw!)x7Z59TldqwD?u}omQs?Ma|g{{Ju_>8g&IXtZsR_BOl35 zS#Ti&)2blc&)d+b;{24k6ac(Y=TUG88^qh7H3s*;@;x;UX_v2*yduy>r^r1o{MmbnmRTj2zebO%7V%uSFO#uiCl~0a~~bj>||Y z;2DU(`$G?s$8oqWM;!S3x5K~wL)*fUQm+D;?7hv%y20hU+pYV>=C9N)`>Vx{hfh4% zRaO6@M>R8dv=cjAb*iEUr{j2)TEU}5PAtT&(>K_#!@}u*sCEc7$d)^wVGafyhQ8_v zcp8*dO-uS;Q2_BIW6qqCKLX=HJgG{^o7)5^#RLf78>ALBMg@DF;PNFO?wHaTM9GM3 z)_A_jW(K_hI?60I;+8$`*+`O)AA4!K*Y^g! z7>Pv3^tmhU^xs8Y($=P;G9E$8!izM>RrPi5H;KNWW*QN4OmyU|zE~~4v^>m?x9Xbz zZ6h_hM4liDBf1c85xX(J-;i5Prq^@$g!b0j^3N52gr)2n5DalQCL8)G8=qjT<9&+M z&?v#aW#|~MBkMMr2TS1> zjDY-M^wllg6%R)?G%vPC`11x^@3f*%FTKgAUhmaRzVq(%aa!8)WU>< zGMRGaV?_fS`2>~aUj|xV9N=q^4Sn)R^JU52;kJoG+2ptJJ1DC-6RBEu5ku)H^kU@$ zQ6Dwxa;+-ihFFi~d;x*N8xOw8q{hbtPMmbq6*A45uL(9>F8{R%+l=8Wa`z{`!a4(^ z8~!-IA}^DAwi8(&n$T#WCLTpuV7h7xIN)=V1G;N=Rj<5(0?1wP%k6aJYSr2&R!!a1 z9Wb$kDXU!tK3G~k`v<4;AY05*nc4za;V<`Dt1>-iIJx|J(qw0miU=&}g*v|YBdIl+ zvuj~7QX^REZ2zLnpWPW;YV=|q{rdCK<7 z<~DB;BGNwBN&AUTi0TP8$Z~uFSi#?SFZLetEeQ~`wx!c!(pf(gR3-S|YQF>%rgMpg z0;`(#d+LuumfmOY-rq?6kE#qqx$q5(@mnY9&GD3fQ3k(Rn z{$*%1S;oe+r%HFA^XS_dFP!d8b=5LcrD!sFP>E`2h|Gozu^*E&vofZPN?RGj41Wx_ zHmY^>cQ6@j3d_|j8~vS6%z;et!2G4VT}CfyInS~06mzl}u>YL72<%WIyaY@iAIA^h zEdO=Nr8B{NK;3Ye*IKJH=_4a{*U%(#hF09VXL1b!ET<%3as!Lji}B^US#4_Y!8fk< z;mvcdP3w0~>w;tes7cX&#gPUWm zu`)(CR+O=0q3(XC6gv+l(h<5w-dW`Q4(XIAtC&QwfBf+9Qyjj#s|Ng6OnU*#06$v_ zoSMFP=9SnpVXvi^2Mo?dC6Q%?R(%_L<`O1`i(Z zed2YjwM$^r;SoMj$8Nt$*hZRe7`Qxn-`_7vq82J>k;<12z}JKvS+hYrk1_Ew-Cwo@ zPAEcjduzw>4>37LcRSufOxL83A`lU!AC&9((&{-&pF46e7fz=2>Eih2-=;If87C|% zn3UE_*J&{^CAp_z*DoW_+J#d)5|+u0oM(1{$Br^9Q(sGZ-3f(mggN*j3bK@NRf2BD zMspsUd|q-aO{v4m+dL51M{wwe4|FxB?|8518$F-5Gsor1*>9fQ_cRKB zN7XeignL8PV0BaOTP(iA(n8QLvQ6Si1whG>g&4=ajeID(4LoLsau638-;GOHpXG;3 zdi&f4R;5&yf?v|g#QCxTEl9{eSBfPyQ4+74KKWeO(A%2!RH6s=lI{V|vN3APcU{^t zNLQx^Hl;HSUT>Y}YS31;HCA zIlNM8eXeim;c4+1XRhmm^MM@8>dDdVpDrAbpW$Y&ULv6ofax&Mm|gOQW^;9vD3N!aT5Q0{Qs@9Te7 z+J@}hPpX#pb^p71PtlY^-p)8u-29}O@tSp?ZZ3t5o)VuQ-!DYBhLxQr4H`ERvrXBS zT%y>u$E*8YpK7G7Pd%f1-=FqA8$Gy~qCF=(6NCAYPKHEurltYyG-Gu)DBBmjp+2cV z??VeUEF_Lmjuo9nVGbXzChPSI4(N^-&XgLS=;3P%gWi}^)s$bkn%TYWJjt_C-;T)@ zP>c1eo!`Yj7%48)zqpm|(2-0y{Vbvyfoza4C3cN!he%AVASBJ`nCAnRlctn;;$G1;ST zPL_32LU_AI`ckP`FTA;mO;F}4lY8eA5gh^?uan`_18m7#S*z6ZJe7q<1Gn-gqx^A> zRoOSVnCh?jPzlK&-Wg7x`f;D+#%t6j1Uyl0I@7(%jYFmEZr)TYdVf!s-$p~rC)-F(lcXfG?Q&PYzy?s08w^shf>MIA3U_U~Z%Sd19p=Ho>(Mk_f_MRR>G zS3AY)M!SShTRw^AfBAhcHzID-7%=0~78dNk@`AcaER&x~c1om+8OjqG|oQ*Cn@LQ?#}9_FL@t zw8r2nso9tKGA_yRK<<_jNfb5I`+32d1*JvB%P$5qhLKD@zf4xR7-1*Ig^anDdEN`C zGDx+ zp0l%e)xKi?*d6;QXKTBEmL>Y*U9lEP7}f%T>u@*)0(g-0?Uk!ylt0uRG>GNRd{+fL zp%L%8Uz$V3M#cvumykOAyPLP)EWCU5(T37UCnIT5qA_~P%~nduYh@tUF&z~TNA9UGK zJ$sFEixHB)?A(KiZd{TY`CCUD4~Qj=JXM$ZCrmvR!|6A)h`CU!?yE7Yp0n~#4`483 zE0T{$lNL}Dm{zG0MYZxUVSJBdA|}+HFH@hk~_JUwB@(RK=dOfv>qp7?iyw`=UU1y z2WI^IB*RV@ep!&sk9#9=WsipwRZO8i{-ah~avRJ5&Z$IY6#KIga6zJ>M}*{5J`@A#)FVl<{@!H2b_S#b^5c z%vgT@vO_$%h^jNTvlvnptX1ClK%uE$a-6SJXEWL*a`rv>kMo`0M>|Q2LH?FhZImTc_gsD<7m@MSPe@3x;m3{m!feLH6F4kx&rco%**}* zX#r%_#_@fpA0P|A{e;1! zd`X&>y-hgAo5xgA)<5JBdH3X1K>D_qNz(uE^xg4PxBvfV7?qV2GQ$zd%-$8rIYN=_ z5g8|&WOL5lIu*$=vQ-YUX9rp5&dSb_tU_5C$98Of*XjO#e&=5v@Avz9?fJY2-r4I$ zduUQQ(K}ymR*hur{#cttmF!g2A33!h@ocrE;-Hhq*AaI+S3`+G>3to6ci~#6u4awp zP79&NTla<>o)dcKecCBYCW}`yySV*VCJ#5-NKc4@?&3Z1!gJZA%?HxZniz`AhS1m? z$-1@Xp5|!4(yHSZeXA$s$i*{otIrbg{X1JU>(Ctk8n_VMM~I^962Y7M(8rk!VP}VW zsabHGHW?9)A?Iet*+bmF2S1mbQ*el5eWMAh`$1iHl{@4hxwf8lpBN?{4Wp&xEX>x| z6tOJWO)Qt<>G_!WHU3#syN2v#W8LPs+qp}3;NRbFn1?97Ww?64w0#z++%R$Z{<+rp zb92u~*6KD?*N(iA-u`%3SWQ`n3YjF_Jia-o6{Ekl3ao2~v_+3_QDa2!9_ zYDYj%vG+lcy>t!wvspWaHHm)nlk?CP!Qg?WuK`ix`+hlFqlfpSRo}c#`;uJHl&xJ^ zKP=gLl(zPdi)7VMam5%n1f)6crVsf_*t!NUCqpNeQsqq+7T%SiNvl?YK-VjHBKPI(XINvXJxc2L^MYZ2II4SjaOlu8T2-4dtg+lJOfN zDDS66(z)@ULq0TxtwS53oD|vd==ek781qRjR=%%yyHbK3cnasou^%PsHO5d!yh+Bn zX)9_~yVXNfk?>dS?Cee-LX?Wk!V8%+Dtd(ka(|enF{jg6!;?uNAmTFHDQhg^<=Z0y(-KOq`l{MnV&h zzP8m|M+M}sh0G_MPoINMSd-ony_bb@Fqx*P_tCQp#K47zhumHRgORQi=XNvy6i&K0 zq{b@%0$0=A+4;AhbsL%|s%?!FDMB?%ujKSYb2a)dH9#!g`MhPsE+em5Q}yz$s{Q z8lf=|p{zf0LgiiCFL{h0lyS7-?aQQ4QbO~DzX>ez~G^VS&4yX(rcv~ z8nLt28^934@2}%IbLtianq#*jVS6K5evq7dms;ei<`7tO(zNI2v0HER_`G9Vs>@uf6q~R`C~L zsjFq{46UMgQ}1R3oj`WNQg1yxh#rJ|wC3DmFY`i^H`WkY8e1@?#X|yla}( zG5rz;ay`rD>&tgV=cY+^BqfrDrjft)^zwqnggHr*^n-MQv?ngwJ+JbOnxR=Nq<6!N zx^dYd7y7u7H|PyTp5dgrup>c~W}2Sl|GUbC`8l^N-JrGvdq@no>h#SrQT(j&Yz<@6 z#yk-;u}<_(ZwX_9SCMxfw*~buD0OwNALbc_cpP869Qd(Sz2?o@`)SZWBrY#bf(oLX zaQ$rsn^m4pqlg7>|!JWK`-z|^ z0TuxMc$XCCs{N!|^QLL*=??Ht@sj?LdKU4R%(3=5aZ>O9KBrX(9nrx;8D%_qXoE^0 z|?5OPMw8S%vhX-u@bzRK?S~DOtIdTbp`Ij zcVM~jqj+PL68+3V|2O4ZsC(%u1*g*Eu!L-^CYCaH#E>J8ts0IX^scw!@kM zgVjS{b*``EXJtROQ(We?5i$I_AdMJFq98883-Lm|={cABzsbi5wT&LyW`afzo|B+Z zI2L{Qqd)W5qT61XR@a$090Iyb-*98k41NgnaN7IlFF_vDq$cAknU5rvA2V#t8hN(# z;NH(@<+I3;^DC+o;R@FG@8$>&MOZWW>RE02*GW6i&bEH@w$aXD6gQlW)JIE(+W-BQ zKQDkIcfV=$!~>>L!qyMGDZ{HQ1oi0WGu3BL3B%ZrSbmA<+1h%UZ7FAX2lBwq`i3;# z4#vk+_ip+t11ntXUZ_=P8OXx^M%c!}b1m`ZdIcZ(LU^V{cU{SdUNg>;$@fn z>oh;yW?6hiH{-3k!9sdSEJ3S!DO@IBAoaw*Icdlr*$B0eX8V0@Q`m_K^}HYgAtOlN z^DdrFb$|*FPm&iFet*mC(o{hF`19qr+Ro*ND2c7$D9XaF?D*F_qiE^d;a!YBSbp5y z`-PR3)XN~4!`k4TANh789F#}L!JBlOZ=!&t0FCfB-Mz5b=l5rh^agX_p*`Za=$1qX zmZ)VKWVBR*rrWg5jq?&qVvho}7;Z+@s$`jYa@ibjFInWY46Rg)_N z9DQRM!|!4L&F=^I>wNPsCZv~`*_#3w0s1AV7c|0sZ#5tLJDYTYKWAU8bmMj?RA}x@ z{2NvEORMQc@)&!QLze9fN~5t)0}h9KXX;6{O!d2T&$L70+4H1eleM6U$_-xJpF%a! z2)@z>o$tJ1#L{rnPG2AsdLS5(b4HGwQsD{GdwG{7jAckn-PchP43I=zo6VUYFFk1B zOjNju&tUXGqTR+~PQjFK;RV`;55om#UgB`v$MG}o(r*4tJWP9A$E8BA@|ilok#s8v!yAW3-%$Zu3`~hUTQ@_bfw6T2jv%c!&C^$x?06?1;J4 zcvIHNWY$8ry%EmDZ~6JJc0%GKF7RGj#Y2_hHJmQd-%$FXEGuvTa~kqmf3@ZWRN-dYi+zg~weR~=Z;4$W`@1eZxB zi29Q%&wHky>{4tTLPrBD`INy|UlY$RYb_WK7b~r$2v%0)&zR+E60;CmoS733j^6Lr zMewQ-yta*MRgJ-34Q!Y9!=op`4;<4v&%CXyUc z5FKcCV4hC3h$Da9FCz7ym;L!*A`C^IjE{E$eE#!_a7H|poyd@(`R`ou`$aYFJ}R8U z)|#0O=?~+AU(}p7WrL~@YrQ)#i%!hn8W)J)+kKvxwa^+)s`bbmaqPn3ut>m)^Y!^t z17a9sa!u}4?Vm7@gpeO}GmDXRZ;e4o$ruYFD$ooXL-5^hI+ys=Z+*40{YeWW3utrJKY z&hqs}7zp7Q9fpq^y)hLMF(SLfhnBAHwrVgG;vbu90wMHxz;iM0TRamsFz2?v?hO}^ zLN*gb(JUQCDN3oGKiL)?_iCkDqmV{;z52+OIHS--y1IKXQ_T};I^bAV4-0{Tt26*e zC7#$oXm2vwXW# zeoV5+8}1aJ4l*h`un(M>-6aOH_797*%bq%xAZ=TSDB!Ak}+=hR|&BHwH|i$~^9GX8wD*k;*29mQ*2J+mCl zrf@px=_>qH7X?H;)-URCN9yT;$aM8e3m_#o$}D^(U0g<+Glg`!@m<}%$_Q0^x3m)Q z%MA-0lcM+*JhgA{snb(1 ze(JieZnImN=1*!3v5JlpPNhHm(RAD2B&FD1at?)5N2b)q7(^c?S2WEoqn*#h#Z#ED z=1@;+QWzAB-R)I!%L~7kQw4FSNYRCl>j5Z^R-y)T*f**W?SL1IFZgd>nHbs8Ih;|@n+^S}cF(oih%|9Bj#ZhQiV)?C^LwU2O21=}>&dS|1o?l+|b(j;# z-BHfAoD?E@&kxcB+R+ccA?d)_f$nPwNt+obRbga?m$G+4z9G=86VeV?Iq4c+i)L!n z@z!9u(rSwRje8mGC~`TF8obm~P3TZNRR?eb_s0_DaIIPY!#utHWguz&n1r}}ZtKkn zj=0B!S^W{g?TbEq^`hEdj8u9%kI-3!HcgjUN4Lzxir+xKGxWSoLr_}fF`AfBQGS`Z zgm60-jb8y#>H83sP~mo9hEXG2VBOB1d>qd?7tqk&LH$TtBW+nT*DCsy5n8OG&a(Ga zfH2YVkJ*7%G2xqlXVYXn-aK{W(A+@o`U`?9QVphJN)8H$bfVJ_c}~#5Xy4oo)u`>1 zaDmLiyrGH2@S7dRy5J|{(feWdu_tpKv&!k9(oXaY9g)8H&4V&R^j>|BLlbMJcER9t z(IV(R&$fnfeBj85?P$W!_5IaMkE2nlIwl?4W_1G0L0?3Adr8>o>h_wzE($*#f$WCw zpAD*|*b`5CPw9`mCini@8Hn7)Q`p#ikbNS^PScJX9xdA}l5O})=D@D?Rcj@*ePU4I zRsnYWz;gJT=$zifv{Trw?}X}4uk!^)L1EARK09cbLu-c`%2Ri8VaSUxG3d*x)0e`p z04mVZKOOYt1Faqiu`1mArQCJB&54~eE(eOk->HFCb|xE_@tA1wX`%1)zA2;FEUbth z>H=WNh%j2o!O+3D<2c=>Z1*x&2a`o^daDeef+LiBM7f6S>R;}-Fg~Q$f@>7al%6Fi zW7uXFwlfi$ykNlMZA+;bY`J?-SorBJnlyaP+YPtT4{ZlHgT~NQ#EzUh{yV*w!(vJM zE&QGPzR14p{8wwWSYE7PpY_`0RR^aGasLFG71FJok(e$^%vEq&qAIlgj*mMR8DAN> zS+4S_ziQ1KZ^vYFMIzvi@(vUrUEZ>*K2jb%dg~E1!j$ygWT;5r9;liL%?{~YBlAjJ zf0#LH@}(A21OjrCx>ynPt%*As9~#vY8(|lR53Sb=UVK7yAFqRN3!+T>yt?0NG)G8h z|Dq|zkba0j_SU}{qA#z}SGcfplm~a0QbS!pu0mprw=0m@NR$_KDnNRA82G`IC)mEy7*AhR5 z9KJi4*F}=SDuRf4Ki^RUKSMtT5979|d?q1~jS$gx-BUiWv8KspBS?6rE7zW3xHe>4 zvPixpSC6CYO!w3q`Jr8*n3}fgDPy9&Mo-W!o^O%t7S)|A=CIn4L$f!NISR<$?D!8> z71^(2;GsiWb=g7e?31YDg*a{%q`&?yj}JEmq3v?>A#YLY)OAf_BhxpuN7aSwDz@>kEbNr8^R5Z}>J(H$V8>{%r00g>%pTF_5{>by>g8Q4Qu#Kk$#Qlf@N z$2D64?ZuGIeG?J&Jk>b7+x+>RRb!ND?%?^IKF!fc#_v#8$jA`ACgVx~^4XmOThM2@ zAOmFkK=2>03rsUmsyq z9G-!rx(YOT`h&E}@cYN%;->{===8=m8|ENq*Izf`_O85BrfdYa#h><6G{TcP>`c(D zH@`p|vlhknNh_}M^oov}cK>FlCrOX!?Fnp3b0jV7XSfOm@b=iosxt7Vv$5ctwfN;AJ{ST**6+gtyRQsuV10M};qWDV2os;&& zc`F+3hlUt4MZe0A_H2WtemuPj{S?){fn+H5 z2+jKIDjYAAg{M-spfWidbajm{e^o%OA&rR-UJ(YB%36g6^G+`%<7Z+kwSC|}#k6}M zcIds=2<;T-y>ZegCS0PuK1Y*xJCDF`g*(H(D(DBuXJyKtJXW&n)^tFk&TXxZ=X0ox z!xDLB%S(pG!qZf>=)%hMs{1kBo>jh1nrLJQtLU#Xv3iPy2Gh3S=-@`E=U)Z*z?QAs zOHVBe53uJ_A|PxTqTXx=E3e$0$hI{KzX%c^{}5a24KGOe6;^s`&-z{6N>LC9xIH24 zV7%dgnNw1v9MgKEWeWs9lZX8zIo(50u}7l~KKearR-Sm2JG1s1iI6(Bctv9HD+QgR zunY<+xIdT4^4P6gJOMI8(>`!lm|$jCc3FP6N+8&C6=s8FLK{3ntpsPIrCHv}e6b{{ zdj|TSxG4NyjMfR7L`a=TV=eq@@?~QWJm&|1RP5lF4rdOkpuB8Lp1taj&AQG#^qI=` z$#&tknJ7zO7N5cLL*?&Iq%Dc(xud)FV1g4=EI)iY3Q?XubdQyO*1O2QCO2BO73%ru zJUSHBi;LJ1Dt$xI-t_HB!p!d-SvagGUbSQNNL$9@+-P-^z7P3IOXvqjkUl23{acL( zQ!1W}ASd2GVNuzXee_o0+R*{sY%q7wBg!g|m{BmOEY)#si?95Uex|J#>;?ogbFYpT z7~>?akn2DvSL|xW`1A@o-lQUvcrX}I;&~GhE;v-qW_rLm)I_xmPrA5Uc)|LBeZs%8 zUwPY`WbJ9+cNOfazNe|TdvN`O|IGrl>W{!wSd(&}_-w&PhqdaTScvG5*GS$T+6t|+ z<^VpbYv68vfkgYu=RND84mD{#JKkpfJNy!wexJg>Mx0b(Q29dT2Q?#LiD;3eG-`Or z7$)<_Z@Vj6VsE&iqSwIPEFd$4ivx^HvZ$n$TT=dQkd)*RL5HL4U(;J1+d8%)Fe+Ag z@}h9gTcz?EcDa@hL(fe9$&H?BlcI&E8h;0f8EshkOes@4GDI2p!#ug^weS>IUsQkX z2mO>H6z3Q--<81j7)J5POoNdz`M;4X?y&6O14RTYD*pVn7wTot@kP2H(sP%Qo{C9c zpBIuX)+TdFodtUX2yHzKr9xsF@9ie^;|Hm#AT!QV%Ue(PhAxe3<{&Xtu+=*0HaRoR zNP2;Ocu0r52r)N7iFZTm9+|WSC3*-l@!2@dM|4-%ZhnqL6`T@WCLpwo-fLJ4Zk}5S zo@g0(G^M|MfhNM-E=0kKaEifylj28J_{R>ipuqRi2H{`jZ)WCmTBAa(hj?_zEmJr5hBj_);;(xmCn zhmb3^^7We@wJ*u`zkEhxHbXrR?i_g6Klj7e7NY_7U9N}r*Ds&nD-PsE#XvK2(xbm| znP#XidkO($FDOm9?7@bR3R4i8>6ZWz05|)w^1;WzFB_xaN5SfE(xt&9T^$MFiK1OvY!b45t3R&8O2Vw#bSYx!!0JF`jFA((+T2#v7AY^)asO6D<72XVG}h_y^}i z?^a3y|IkC9SXJ+g2c0r@_NGoMoXGY*ji7Zb=)=oj7h&3O9vE%<1&ixj@u+-i&F;sR zzzv49F15$BcT)pM7vejhhSqe|m&s41nqT0MlE5neNha`P{CNHy~y ziH)p$mXqWF2{sp}Zhy7Xaot&H!{ym$jmTt3tU@k96FY8_veP}#vf__T@F?-z8;q8e z1uz;mAF7 z$eT@AJ}&h*l}p8zZ1ne|XvKm*&k5le@4lKTvTpL)$_ne~&qYE?{+KbEXRw`7)Kk4@ zR@(rnwy60_JFLAl}lu+kQ zC2>tV|34n_rcG4_YBx=I>p5MfPqr>g9TTmoxVB`Sdww+LW`p@wwnl|A`r!m_{$9AQ z?jX%v7VD?zkl8QuDhtNIMu*1&lX&5*9HTMNRCr{*?@lcKj)0Q@Tpc!ObWdQyoWJ#< z|0Tx{X44bJIg5!4=ga)*ONo?0^Xx7ffgDej9*B*q!%GMoK?EJ zWl@$ZPr94r8QIk(^i1c@Fc|SK;OZ%i1;I-hB#m^Qw4nlhWs-)j5w*Sd}Y`8~dY-o|)GJ%2%vG)6KZ#u#UPq3M0zztjZcAVdl3 zwdDBc5($Y1fN_o-?ghIMVS;})9Cz-F44>o@X{I`pUR17!RVn$z60TW;*e32W%~Zz{ zM6oY1XMoNrtvsD?3B7@#ESr|x9=;Ht?hK?DTIyQ0u5a~vl>;6F$sI@v{GgHd?@o6- zzkWdE8!ZOD6O!n?iF_MNTE=lhju@#c@$#eQ^i-&=H(l`uo@^QNtTX=!$-!SK&p>!| zRNGtT1XyW~^55vUKDKoqU=*b*fffgiKa&8GV#UCro%1vQ36Fbwhn$XvXEGr@AAEnZ z;;B3faYQ!8SAYC69%1QQYp4%Kx4tL&yXlW4;kQ+|gY>%Z<|xER=20{~j|%cOK}iu5 zr%E-OsH-HCcs+7JCbpR)n!F{rfCyAZc(T-0wPr6@g*WL=woEziK^;sdOr;)MGgs@9 zd1*nP$c?-@(Eg9Dl<kZek z+r0Znk(wCa?bgdbTR!ROJ?VXxN6Rp_c)Mtu9kCl;m|gaE8Oc39meL_M3WGu^4H zg3m{8WkcYN-^FR@eK&)2B&b_4YzvqAaOoVK2;)&{rEZ-6TaIOq%OsddY`rfCkn`Yi zZaX*vc}ZLKMKk}d#iQ+$rG6#P6L9zC$A(F#q#o}TQj9B4iV5rKhk)GpC{96r+NBD_ zI%i1tkr9<`RAX#7a0rN%xH6uLBMl5gvE&-V zBA~2E`#mo`FhI=>2f`u?RTt4<(9at|vGAOqQ(7v)4BlD)!MK<))#mg1frDAzUBXa9 z^qOV>lIfS0^xTSF!_ z1{@O;$iD0AU@)q^=y<~&#MEIKerr04&yxKJdpg9UZ{KK@HNY6W0-LDN>T!n#>8Exq zi+5{txq9)Or3bxst$LBjUA~pR`6JB?vd(%eR65TcM7m*YL)A}w#^J;Y&7vouJ~>4* zy2;AI+K}(=LO=RQdtgHBYGD#Rn2_OuTpZ-{_y$lcQ`+QvJ*<|anpkAfiv^Oj}-zi&DWa(+%{ ztOE@}n(Gltq|K?C+))(@;cTaIY@r}lK{-lb#G9rrQjO* zDd{fhw=MIYy7Sh6FVR(@{BJmglhY3o@i|uN!PRugvdG4l((RU|Ll(pIMy<}(Vx&Cm zK~;A5{e|gG=MFb@`eC`fM%?8wQp;(f=(8yWVDKPLapQZz5%bL#YQxN z4RSR4s~l9JhO|CB5#3B6cuJfRp7Bum7EMwkF1x81=`!bm;$e zt_+?fjBy)72~DxG-Y_EDk<34F`@vT1M%k1r33~cg94cpm?lirNFh>6KW6UQF$9)w< zjyJC0?TnBSk|RDJ8gIQywHx(G1Gy98%NBOp>O^ogMd^OSAtQ*k$02tX9fv&Q8Jpx& zEX`;qZf*v%f+i+zkEEaeG?1W##IO6gx#@>!XE$5^)RK|6W${qEUvGz~$CCrsp0GUo z#9=W=4Pa?|juYyCP*jiO2DhoaS0H(*?f8n6qVR%Ey;RTmoEiJzj3u=b;nF1+;JvfD?r&`li-MPT(Z|lxf{Hl30Q-n@rJg_yP;=pd zDEWdHma&zZD~7w)dDHq62ao0(hnPT@aU4bjV&_CsA{u+qk6kIg@5sV2Jk3Kg$@3V7*4QfxPrHo=@q`jFvK!4<< z3bRGs%e$_S+R;NN@aklQr=jW-t9oL2=4*llEwH7B*{nV?>THjG3aAW17qhqL(H2#8Y`!Yk#Z84btm(wa-o z9?O}3%eT5W^oYH5cE`gq%Gc{(MPqmo;WthCdFOH@k*TH`g9`|40oa&hsFQ>1#43-I z9ixo|Iw6B=_!8G1JoF~&w6gQViDO7Xw5;BLbT}^uFqv3gekt#hv!joQ1*>P4L! zZG+nv`_36)T(@|xlRx8MF-Fiy-tiw=#FOlokO&$vVlV9Ya(9bqFVWpGUK5!wJur6QKs7a>;|2H&Ht_p5%Q#ke z=fR(|zkRXQ{I48=`%G>0SUz6Jyq`Z)DvDi4@C(hI?Jn~2!&fSSv~EnvZVmocEw)0l zR3=;7RjlCF?mu>QqPc5F^x)m_qjm9q)sL}Nf%V|9PuAeEd2C~Lp~q0A?~9M z^}kf)+V!oNs@td^HD5&@pAHS{PSIih&nSmH|ErX8XKqLL1ZKs52zTke8wgphILK<{ zRC=x-0{2mp^^We$y@eOFJ@|>TVpCzac-uN1V`8KpR*}m62mvM%T;p|Z;*98s6}DpU zPP6Ms1A~Eli;4*27%KjCQyIE2j@0lMThXwBjCvFks)VS)JJ1jL!|mNktMKK z&^!66_js~{e;!4dI5pA~0(Vy!?KI)z(3hff$Qss6UF|NquMm*DAC!jQS3&VTjHnYrjdCZ_9-#o%0^%j!#T61A`j&1X?I0dl*nW?8b2Yf;6$Ifft zd8g3e72>MDkxa-%jxbi^fko)VID0OGege%==`MR5CHeg`p^rij8)Y!@iOsbQNZ==q zGLgOS58GoXVk!HO(gW`aPm&n+EWdOnG|crjUU20o{QTg%G&(dnk(7s@xeqL(0xf7| zHxt!vFh1btuUBIkD*c4zIg3|<_b_t8?(nVny=Ma8N5%B4bTfr=Q&$|k9TZ2E6>I($ zE^&G9@8cWfOSM+oQks-t#c`Ec2*s*Tzr@g@9qln{nr1GLWn#Ev^grxD?$V?YA{q zgwd)UbB|pIs(+Bc27@QoNI;T@SzX|5W1Z6{`g|?vTwDqEo z?H_3gmF|rIU>xgZR`e!jQkuR)i{Dh5`d{SL0@HnII!L+zN3b^1rciT!wCX1QoOTE~ za%_}3m>MKoj{5aOOn@7zD-C)fU( zo2*vqB#{l8$T*)-JoZs4Hi{i7e4l0yITH*rHm|lrq04>|~f)tFO zSE!4@L6L0WeP%!DGUyd*F3#L?U>eo-lGVGI&-*G;_F+ZESrRO-Z&(X-G1In(2s5v1 zB@BCvJ-y8Sp0V$7KKu4+ys1#Y4`vV7+Ws8kJK?z}@fm_Ld8$*9o{=AF&a@Qj17m(B zDfeI5M!N5YP8+yi;7&Sroe!vpv?~?uG0!m3=XKWLB&s%cJjTD>gXAYAC3XQn#_;3v z!BpEYsT>J5*uXF9{HU@?2b^Lsr#Rf+iLpni-6W?)OBWmG8`^1SMXXI;L`E<_rDQ@D z;A{%qE@l%R$aO^!IfQ^J5m=B^;PN@K*-5wg`wD0l&MI*`oit%^*Vhk8Byfm37jovy zO=&q?ALSit$QmB_OHYKI7Vu1m!H?t^M5Dhx!w?cA>|Yk$ zXRYD3_?KE1Ek*173kzGh?p<=QoH&QF{B3jxQXE_9n#HsbOPIZh7nCVcof3Cgp1E^6 zV7TF!1)E#BB-M(9#?JsQ={}I4z3P^zb_B%Zn?q8h3109GI2>r8o(21UW^5O@;0E8g z*JP(H_ESBMhp$;;)Th#_hNxS2BZK65goiUpYsAvLr(KOa|l5`;l7QgmL?J$#t5 z%o;s!`(=dG$irO0x^i$!VwO|x45%*2(IL8x(5D6;tU1|^nk#TSeJ!SIt*xIdN{g;bR6F?WI{)$nN@6KX8!yFef1PRy( zdiA6k61MBpENNWzfZAnm|~=>@QZD zL*eC#lJg)l66o=EP#f08Tfi1SGvP_M|M}gbd5m;ZrJ~Mj*WG@VD_IQEv7L``bJ#4Gc~D z$>1iK`hU4~u9N5E?M^%GWKmj1EW4*n!`SKRe51BECBqz*Pj?4|+Jy1+>v)qL3$T|Qr z??Ww`sDeCEeaZtyxGgxFX$bO%!`?fA*$_@2naNBa>mlmT`Y!DR(E44Ga%f7?>7gf9 z{hW&Z{a1*R=<@B31Bg^){R`2mn;nKM8}T(D0%!EpR{9dq+RumQTlkzE|G!CY%E0Zow+LT{0 z^H;jRt4&?fSn4lZoZOyOcar32m45$PpS^rpeRxZ>_OvkJ93mEdvhLU8%=UW4o6 z)!P?P$A;T3bwwpl?o8I*yWwv?xZJS3uwOL3wV+s%+ZMk6YMoT~W6P#3K;Ric5qXp` z<8dyG&qu-MG1n2m&j-Mtk@{BfZS8$mHup=&OuD6W-W*e|>}B??`z}hyl`nUt=#%A0 zSI)+On>%;<*qurc-4Gjw!jXyVcK7f($5ytGu7xNyM)6dpy#t&|`8fU7+uu@!S=a-p z;z}$rhzVRDLc6Bo4PjWns&~+RMPx9R>RpE~xv)TwpJDW3)QVkA0tm06XV+7Qb$>wQ z+)p7Hp>6jxev6Wa3bb7{vXt;M!UwNEt(-HBW)PTcdin)i2S8#M&8)d3tRyg118zAG z!>nV^@b2qdcl`pF`~XP29`mS}Lmp82t;5D>FnWN}X9cGV_(xZLL#ukdhes@o!C{T`;} z=e{iMB^7)xv=^jV(!O2ZJ`Ltir(68|DxlACjj#nsiHq7*V3dhn@#9@58laAex60}$ zJP!Fcu1CSXN8uRdr%MvRU4eO|OQhWPL9ig{OUlGN6WiT%)2$mI=UZJSOOl2Of@}Fv zi~tLkhkde~6Wn6}ey!K-WYcP}E3TL#;ol8)W|qovmE1l|vZgsAtuWr}&6~+R+~=lGI5d?7pr!`%*$^@f8UZk$ca758|g%YliJ*AZ)Q-QTsL9 z~K!{sfG|Au2Gv0z4jiW6{H+meY!SF!wz=l`1p0Ibwmb#2pmX&)UG*m!yyr5n{@ zl@uTa;E*TbsAk%wg zzX$g#+XS-Alm8^@uP!XJ%e~7sQ+&&fq`Et-Gkk7?Yty~@^SDu&_5tz>5iLV={+MCj zV@JHD&bs?@-e%v65JeCh;|8Q)FZ?3F&y=55UO;+bk_Pn29t8Svrh96?Z5;qKtD@;4 zxZBstfgR9Ql0lN0+1uInNfq|`&L6v2?Q6|LiFXv)kp=*$c3tu0;iefr10Yc!45+jBjk8}GE9juR5{$nTwMLrF7 zh#4XGCqx?IR2;6)lBuE?f%cp@;V^&WI+#BP7qYo_cz-tqT3>)A{32MszUZRnC<*Qs zvPqDL90YZLwV)~|R5XNJU8Vk-maakukPSw_qukEz z-*Q;T1ziASj7EeXujWg-(9gaFbJuHDr^zcbkXHsIS=MAW@+Z&`v3hLe-JE?}B>5`g z+H`m@uSLuQC)d^AgR^K4_MpgpUJGRa)}!j(sK2Y=a~ADkkzh_k(A%vu`)f9n2Mox$ z`jZiFyw2?#k~71LyMVxoAXD+JB?AY1zu?Mot#4!6AgPNan9B!`K$A<;7Qx97BWzdG(j$S&XmsEX@vNISKXW z_O3Tq|M>XdS*OpV)ybKoyuo>ZtDdiw*Y7z0)FT^_k`;)NF6WG1;s7H(zi$FY@}5Js z!5CdMeq(SdT26<>Vsk+bNBGy^Vi{|AmnN5>l8%99bqzCk5p}r)#9EC$IyH1 ziZT|!O8x#HaTVVX=#i0n?)Ugs?2$6%nz2x=yCx%axfzbAkbEr=m`p>Ocs4U^v3k|64z zi8C)7GbN9oWdRkot<>8l4-bB9`LeEj#04q;{|Aeql_yT;zqu1x$~9FxR__pfq4j1a zYnW6&JBPlEtQ}sW(bC)xI3Gb8l;^P<>2tVFjFgCDSkAs?_V%wyXNMVlsf=#3li>x4 z)QF|MAi-@rUA{NRM<$h^SSVnnffJjcdQR+j_`INZq#%Bg_Ac7HtbjdZ5Pi&x$q0|?LZT7l6=islfO z;7Xp;i-p5NCQc!rot}Kwjk?zC24MMPZ(Q$U zva!AKShnKS7}OD5!!Aqi>J0#oKV52~TlZQbvNujadF2N3i-p6kQEj-X^CL^2E$1jvqA~oodDOpn1r8s0sX6@D*w)>@Lj3*h zbLv0)pRg;=7)DVknwl^Gh?}|Tk-7_7Rfv#$tzA$O_3YxkptyLi9) zX7}%Xb?|17Q!S2j7xM&U6izx}4FS$HGq_3=uXK*$H`kdd{66;DZ{V9nCrlg?U))^Y z`%ij-r9XptnK#CCip0+DYe9X_jMTv@>UTe`!OUSIVKMMGXOx3S5`jl5z~)^dfct#7 z*_H2o@%&y!I|UBRI*ek_@&rM)FjZmcj@P3o{gm`I&2t=>v%fl@m|NL+#(=ho!v3takwK$Z^C0{D5tlHDod=w zZE_h&=7U#+29hT@Ae8#~Kd}kX)zx4sJZ1xkYp&nf=h|s)wj8UFK&ZeP{Hfi6%AU3m zthOi1h;|Rf!}cVErQeqQ%z(@B`$Q9hF9E-=0{lJ{@4`@=wR?ZzGCvo)m~)3`bnx5X z3!W8>y5vfdGYQM`c$``C40~j^b;5r_wfr0xi0Q^O@gB2>R$nL2uH6|>M;zbQcBqXA z^EkGmNPfRd3>jX9v-|R_#NC*ig%l?!n1T?MzlG)GLNGo@$QErYOLHZRKysoBJ{^9# zXPW=v<`3OZTtlVU6?@nMxbyRWI=x^U%g5lsRAs za!2~0q$kOKGITc5=y~9m)SmL5``-UT`FI4qWab=B9b@~s^Wn&q(QydCCi7ui*?IAG zm2`!@EL1nD)Bf*yl9R7B2NURj$e2AgVzd!LXYQK?)O)k7t@lG_^>^>{w|tWjJ`Yic zRNYf^6rCviJ^aS97Z}!%pLYq$Dt_A>rD)wK;DmQ)h29pj2cRoXB=aHFVO7uy^T)4f zXw;Ky=Kn=2E*u~h#ZF_i%^$PU8^u2;C%oIaxS-X-8l#q@$V?w0fnMhE8@M3c3IoGW zT@RY?kOJkWl@^Yzy`1}AfbcwS1DX2sSes3fi@g^JD;zN=K|V9|+z>)_p9WAZdoZz^ z2cfHiq^In+HXjlHJDM{Btu|rf@QC5FHytQfR{>Vpg4qHMlT(*iRam&;VaaRsbFUBg z8*O#d?2Vsn#%>%Z>*8wU32fx?t>CkMsUJ0!FBgh|`ero;cZSeGDyf5g)$QpIrDJ&M ziL45pHi-JQW_qc7S8<;crPtxV0^__+o7sL;`Y(<+FMfC<@U)KuaEcJ#?cN81qUZ|_ z5fhW7G!ipm_Cg7~3G>oGE5cCML-tlilm3x($N!`1s{@+e-v1YbDB%n`M@dUJsEin8 zAYCJbi?pQVcCQyFg1|sJt~x<_2qGfFl$O#Vr3eTJj*w1?@8Kid`}^(xz0Wz%dE)iN zc^(I8Zg>e7;w4kA0i$ZMeYmsin;nH4`b~1llOxP3$;;7f<&gV&O)GE>WiE6vbO360!(bmq zGDc}+3B0uaa&Y~zL=W6+tS%rGW*WcQ0Mrs)Gs~%$uzlq2hpjZ$K3RD`VN!(d9}s<1 zlhe@s-^jQUnq0-|C(!4+&_L&P1|hg&+2kV69zs76RJsNo>t^ zk=2@!%hgC~2U&HJV`%UEfhkD_8?aqI6*$X5hyfEA3&4{VQWl^0f&j(2;;il9jukc# zURboXq~tN#_usk~#Y8SjvS^qi)K2?7A;vFT_VEgJNm0YD^*Tk)gp*{(Jd^jD@ioxF zKNX%nk?}PBSvmjDVBgZNF_n!z%2Gp6ewG0^f0{a!CGuVdC65;oKj%+kO;!jh)3wZg#wq{6M@n>^^(5K)Mr9FHug6_|II z(K)1^)Z(<(=XV>Lu8q`lF9Ma;Ik35hpkD=I>8tUpuFtWrBl}Ma%^TNGwf0T^ig8u+ zbXsvaP1!6hnrby8&H{b-KS+@gl#UOL4}3lLIQGLMvKYa1uI1&@!yWcbrmalA#Pz#7 zp|>3I_)4sck(N5Wci0IcNyhJX{xH4K_RaiZH}7V^O{w7oxStx=6FgSm-au zxCuM&(mV}xxb3fJ-%T+?U;>>xszeT}mUW4uK$ark;-DnJ`yb%H$OEqC0$gpGtRO>u zbgR#H0}c>F1Q>xX@G=OBhDBZ3DY~Uf@c$W;rb(YQnXQXBdTr#&ZEhe$qGDLMA1xSP3ycZs%|79EXxph z<^~uXBh`^MH6AZ|u#*$^A03Fxjy;bj2kC(QpA3p@{U!t2&ssJb~NAP8;2lVvLBq z<#>+w=YCN_kETJEHeWp663c`ekR#@CfH^s<2g-(a6jD)ky^hC^mJ}7UI$_Y2@CAss z^c96sY2jUntq2w_IKH`a=p0!W8`%7{I^9%6-_--1)oYsADlW40|MK0PDMnj|^H-3& z_Hwx%r~im$6jMX$RNo?02;eRE6xc{3_p4$1Hl~V>Me-hWk!^SUZSXT* zaG`slY)K=vGV-j0vPkJR$38OJ=Ai<^qxT8OaWZGOI^SSzf(-rQQv1Bu!>SX0_NY3Q zK~5Vq-I^VtwCI38@#n?xO)qruG%|KVou)F6p>d(a5s87`d_?U(8zR}~#fCQLq| zeqD}Pm4~MpWQqXXmJd9M+U6ddu>52s%it%LQtw+r-ZXYh#g=BGWd)OoP9P!|7KrM$|_vuNHz6)Aje%XqLjVA<$ggL z9;UdgZd{PMwzMXS9RDnmXT3&n9sqO1a5?B6(oFSVL|@l7&;IK``RFHCAs3$*Q&|%5 z0rKCgnMFK&$6j7v$Wmn(R7Dm=;Sb5g%ZhM^XC;eVO&Ln6dh%%IMxEPMX!C$f$qMQ5 zR;7dP;A~Lt&`;#}rLkwm)XQKl4^XWp2RBjTOx+SDlNhNobPw7R2SAT}I66N5IVdJA z#8vyo%bS8>S_hYYU$^NYF_P2Q;*Jlao$cJ{A1{j7;Caus>T+;fnGtTHn_7MjF?D7T zHiJy{1L}j=s@k=s{KjUo7Y9X~W^R&xKuK0u6w+#O=K(#41~vYRyuJz{edzlk4rRye znQC+?l0)~!Enmzo=hQM26!`k0Md)i@l*y~>E-`vqj@2_#-Ra8~uLaH?(567`td+RV z$TS%D<{TI^-2W(6qS_rcT5=3Lui`>9bRNk_&=cqKMsae$*+)ju5W`G~X!FQz&*lNP zXA>vUf>;S`hQy_X2l(hu{%!?gtX;mx0g!l;_Sm)+Knb-6#7JDZtAS?br=87^m|-bl zkE`gLK|DFnYP3wIE`k7qLwq}+UcTRw?LX#OE!CX0jHPO5_4PR+f{|K`;`=6|b2 zjfr4(Ee0qaLQM2!#IU!YxyWh=f1SOe|6NOG2^*@ZmnhOEc=pi>EW}{jc>S@+)jE`o zQm}_V`U|5%1F;#KM1IV4CxJ$q>xcDMB$Agdm|t_YDC^*W{@{Rm6@JufnD>lSmUz5` z+@!Y{XjP*Osf5v2*JM9HQe8j~V4Jg#WMIX5O>O^*jLbd!e&TxMFu*LzRFSsn70Wek z)3VKN4nqBhygPGU6Yb{Pe@ggU0V@yIeX%8qV_UuVXN`1D69_iML)8GzzSPM>kX z{}k#ON$9|J)y`+R`iFm0!cgz+EgJ%qtYg+Ak;!KXFSfX&#Z6|^_wi0@3l~`_-qFc!Z00- zR6aV3bL$V%Unl}wW}4(l-8xM+wIAGJhh;bFXYq~M@;{7izNu{Xb!St)@X_SdZ$~}j z##zJ@Ts*c?{F1w1e4~wAv^g3TN54)pBEygc1v&Qbg#L4!Y7m3WYZPY!bJ8li2d7SS zCf~2uTT2bG?)Hw*y_Dblw8(VQGn}vvHSJ8?4#H6Jp>jGuQwgi`n9=qKF{}(|54H0l zSI9$TOb>G}_5(duMz_gx>o9IBZxqYM8x5VaKx~V9SboR_%AIT;gt|g;E{GQCU0ZoFBb7mq)<)HC{SGp?nOMdtso~liHdQLF64N$*b~*M% z&#IjsEM#bXL+{0gNK^V&^1w3g?CU?b3!w3W^SW7XzywM4R zuCDK##Sxu|vi6SMp`F^;dBO4AIQKvv^e8=ZPvW*Jr79^6pd>DZ1xQ8pbvx<~&+SaU zGR^{FcXs(PwMMQ7v{c14J(EAflhhX`;o0P#r+UhGTo&4Wj=*Db&JSN<0o$dqC{NF5EEKRUBAd=EsEfjgGCLYA`g2*jLK*(AhOu)m!CEmrrEzzH!F$e>=$420-%43Y3kjX3*g0Ah=33jg=kxKz-ibWwH)CDuXE(cAYDdSBRsnes|C zbwD$F#@k;~iFvSJ=6B}#5ZWGkn)8<^5o8`B$HN=abk$N*X_>#B$QPREUxanvXF_0< z&kdB_PG!%{+;lXuQWY_05!ZxEx3&vhGUl&ynfg>S3bALY6F%a5#!}2 z6=#)!0!x)hy}A!ge>L^V7uKQI#28!M2`7|J;tm;w${QUvHm1L1*SvEk-VGj?@Ks+}}-K z4SyeOYYMlM@_0CP{l|sX9s|e6d z&iu${DzQD=gXyM?Nxc&f19?pPOtXhCPNQ|OvpDW>ClH)5lABa4o}|OSxI^5+-NjNp zO?Q!`P*j~&z({Jc0xgM`gdiO|e_~N<+z z!I;oO+-qDjSXYY_hT5s0s*@7+pa*rGBe5US&@Xv?Xnf-E)AxJsuQGX6#P-MxQMD%x zGILiq8jN*+=n^$$7p9MV|B^MKNZQS_{}4!)*goX=(!uQz2k8Uk&+B#-?jMunLM-%W z50s>USY03?iYY=^X9kWO-(vs#1j|+djX0nJ|xa#E9Hsx z#|Kqve}GpLJ&7$Ak+u0LE;um>=N9-0-KJ4bwMvgz5M&_V1lk6grPq{x1Vl1k@S#U( zOrIV5#Xu(XVbV{wxmK8ndKp<@2;IT2zgH-dYtvtMFyLT_Q-Vl} zt2c^bOx%65@+mv)49Nk);SWYjN*vgpdyKY7vt&g}ujsh&0~p_EfS4 zn6Q!?Dw!s*@De$m3+~|YkFwDVyIU5WW*1iuS>jdg9{{5?;u zlJk=|Up4iKO|Pk6aoS4^jGtnIG#b5gpzr3l*U9FzI%dUV_2>3JNAwtnmR)|7(Gu&0 zMxj!J+CDkOMFmnMDvsOhDj|w)&K41@Ofp5)X%4RZ2CAL4Nko@tQ6F}XdB|>anVf6? zd`Ae%2F)7C4ug^0P{S60j0wPLcur6dq;gG)0!|kqp-^?!2NG7r@5fyDNVd=xWXZF@qytCLv9ug@?EB+U&!&@`agwBVRjd5$5s3vJi!WfXaR=(NPc_P3FLtF zn{45#zx~(F5=#R$-oXasoDxR!vegeMLjDyVHtC~U0718@jfYd;i;0 zAO{KE& zv$f@^!7U*M%Gx5+4w%<_(q_q3%6`{$2OG(p$)2pgZC1vR{#oDcJlLEyB21XHb;0qE zs%|0b3F5R$FHpn;{NUrMY`1-&0d5FVXURSC#1Tbg6o64*l0ZpHYjZLAJ^W2OKM39G z9#jGxe^#a@y2R^YJiyJ=vTzz9s+?&@ktUammG8@9%o{FZ4w<3mUa+^1BO(m+1Kxb= zd^xE~-OncGlVd#I5g^4WI{f#m!&;%(ZC{>jF2t9YRdo_Cc;gvc zyUa{Jhy&{VCG5>;XMDSBA7T-QXQQ*t{(Ua%@+5_ns=TV3(~V+?ijdQW&y|o=Nla^I zZ#`U+19ACN_5d*S#g6`8#f2nCQOP)qN0i>-I%7J@*c|36$zV5Z^jX)Q}2R>}5 zNMX~k50T@(il5vMkB}^60=LuWEVQ5ch46Ph_&&(yl6T3|H%)ihNmUyiR$pVT-%Vfp zl2F*NwZ!bP^)icZZ5#0+R{Dp`562Z3kFi_tv-qB1gO04OJXbb8lx+|^C`YayLyvj^ zbtM7@o?#^Z`RN{bAEMuv-FvX(H1JyTjT~{Lbzp3U4Us??`SI+QlAkm+rWs=lVUEM^ zDQIi4*qt!81V|91+ITr!BY*GMjSkh6MNY#uT)(q-ozlG}@jMuTh=$ca6j+NQ^!FqV zgr)0ati5C3oJxRI4jkP*m`5V#r>{HMhPS#(z&0D)|1^M}q&x#0Hds6)h zgt{*S!v$A*fY;+xJzTAy<)ChAXva+0X##5^IG%Z+<}XlaiC_4G!WgWoy6tQFzko=S zjR7ZY7*Ybv&9uS($MDjrIwb^J5cgf;oy7zE=;h^C-^lMH22Wat5_;n3e?q(YrAW~Y ze2QJicX+KxLS8Ts{hr@3ZEkDbL&J)<>cr*8OAOr{8mz=J`_ckV!II>_$Lyg)= zWyq|Onr2f;92dXE2{b*VwJ$puM$$tKI|Mjn-66(fCB)yA-NQ49FURpKUd$JmpWF;b z)yZPR+#o&$5oyMda8#4budLBSm9ni*IYllduL^@fZRVPfYeNid7;2cl=) z(^b5{z%XTkoZ)MnlVX9E29mj0wZKGA_VY}_&H~c|bfhejx7)5Gg{*jeR7C9@a>l3j zP%N$agrr!8X&7Y~!l71L$Xp-8tNphKQOCHi1$>qzKljNW!rW%4Wiph7QN3n-qlRg@ ztpiMFb^M<$Zqi+9$fF@wv2#2=r_CXyLKf+?z#dn8UNbFhym9M%jq!Q+_yNZHSH)S1djn=Gc)K zrj0HJwnFor`US5Gu{Q?5>!%{swQ|AnVnA!Uvw~f@bZ)>wU`ba-I+QF8o8a!Bb4(AC z06F})!dbgR76JZ&K5Vr3n7RP6zAr8eppjj^zFy7k**x-N#F9nV?Na(paBH9L0ZST6 zFn)QWL>3{-sqz%*brVxw+nrLS;E`Z#4GQ(hQ~#RM7Y`TU?iNjRqU}B5VXe93(VN|> zGK?Q29 zPnUWh?@k|(dPs`C%arqD;+Px)iGMy^vq06{S^{lzik-n2$O~|wGr--u`d11D zZcE%|M9Ty9Yu^drildOd!FIky0T)i@c16%H&>DX6%=esaHuUQYBU~5uzJWBwb0F9T z>e@a(eWMO3>nV*6NX*yhG&`kq+)50|>j`*Pju4ZWyH$EMV5S4*}wY@iou6Mtyn@!g}i9|yqCtG236qG zA)pE9wSXBDVQ+iD_s$^y1k&K5i|psk;yvJ?FrutXwxAD1xkR2wQ8wJCle`{b=Bcny zNc`LC1~VQ%!PVt)sHf&Hg3;>A`vuYr;cE!{=iu+(HK(3ML2LhhfDS!784XZli7X#bf8Ay9z_@<7=}d`fmWu3o1$AyifUjx0Eq3 zk|Ao?+{Ls5MJXlUOy2n}dl2N)|4Y?^UrIBtNN6q!vxX0Kzwq~=r)zDS6bM`FiX|*-j{Ithpb%m`w1ZSRsthCj$a`}>-F2h-L;X35i3ov`}&MZvv6 zR}dzTBn0yNd3Aa4(WXAYR{*^hC$x)Ot%i~}kmJwjw3T_NTpy9bPBL%_RMRNE< zD*P7PN+l5w&?+Y1+UOlGGTw{xYj)A{IlXA9HvKG~`;bN(tNt{>@g3IOeMbT_?Sp5k z^M8?VA(obctda1zOoti7ttQ)Xnu!>9ie?wPxI(VVFU{rpZth| z=4P_R$BQgd!d=~WyB<8f?{;jZ5qeJ~M23>kc|0{6kN_r@p+W zXC3)r&Wd&O`u+DA5XM6M?S!iEH5QX+1x}y~HE;fid!h@r899EBGr;C92nOsG*W`w% zldg3YZp7go0cU=`veY%pi)kT{UW4J+&c*>nzcck9V27ltjA03h;2keM02JZn33avJ zHF}>0NhR*k8A(rIwF$w6!@6PXw>bZa?V0C9G_>1&!5VyK+qCZT08L+JiCn1EG%o&i zM?yU`+b-a97VgC^U(QcUNrl&Jo5twDUNRU`e$6cQXu)c;x;xkp;REA zr~of~yL7S9MHMsUmZN=dAHtHj{&<*n_$*@KY*18c)#V%8vE1&cCLil!ZW=VK4BlU; zx(33tRX_{h1vVLyxQZV0$J7GK!a%yL=M$i8BGHMwMxGIN@`ZMQVXgo@9TNAmxvb#~ zGp3M0VnfSZQ~EwcAR1x2GX497L?F>3Uw^VQ4D%o^n@C>)SZkNOb5@lPX0h{+2c=A? zOSg9Dnvw~zVT6YD0p8uS(}U+d(@D@i>mfNtvEZu!vb#*R;DrFX0Qx%ZP8_|`J$!N2 zb;6POsiFf2yi?JSh2}03*~9@V)|5|Nzt)+&_3R}&dQ=eoqzPnBuA1|S`*hnemDnP- zIf2urq1kqjOqag!)upy99>3<= z&1>i*>2MPArp>;*b!lM&`FQ4AwEbGdiOqJ1_MX<_Ilqu4PgkBN=|bL6JA*aKN~7R7 z>22s2iM1e?j_VON!y)Tx5T`{ zhrUrg%)^5arFbTD1H4*-Av~>W@D~t1cQ=Yw;wz(fB9LNKlRd}mAA!`ZUg8_R^6y1Y zIfQapyzIdtfPy;UQa?CRAI*8u25DaHTGZeG)mrep@wIdlHwk<1%lw88go>hlO%H1? z-1@0PCQQS}B`r^_E0C_E>L_=@QlU{Sj9_VID@mk7m*3t=%8#Wr@k^s{3lL+QEqgR1 z7e5<~Q#d{wf1m=`DKoH=8&QUDx>yYEmwny&5k+q{vcpdAHFcDU$yn1z)zNz$*8mWQ z1-wOl9!U)93*cM)E0**MTN%ryHyfqs)Mxjs}I2n3VNE`a(DkVRu??ych2tUy zkLHYAvx`?P?NX>&t&?b=9$D}J^yl2F(?ppryI3s=fDPQygDT)+!f&eh3XC~mwqrl& zqkmbB^2}w->rt|aOS?CE9vxt0Bx1?*;B&WWEEZHV!?O4wAkXyiYwXkMv}=1N(@vO; zsq3zXto>CI*-d9E&VX3-MBi6-+Hvl(4>}7v z>cPM2mbtj`SsDZ(u4`w_lnZ0a2Y`i2(Z{SoK#!PcsNSda^(f31{#;h%A3VmOS0$X> zDeUAB=5u%%Ly9$LBD3%{B!(9ybfBKnN0V()}T?+dVf?{~0Yi zG{uW)2h76|A&uO#KhRzEPzsmnqmijrD~zSGcCBT_>W(3ZU;OuZlaC2cf1FT$l==lb zA^vWPzWdpGb4ksH6p$5S$E-MbMvmJ)c2<*WQ$pW-vfA8yJYv za0oEFa1r50CQ^V@}7Yli}1f3ubOpp<12^K zi6^X1ZFgvC^3KTCZBowt>E7Cymlxrk-{24`ps6}y1m1ox;KYpH)&GBrpfVw`iv9d4 zpa`lRQ9C8z=1$n@aK7zJYe;f97v=f5$D7X1Zb=oZj}8y*NF{GDqB|1zzNXDPQp*oa z1?P%2mp`0ngtmcf3Z6HQ_lV|3j26l|nsL{6^qM8)xHY*QuZCNQ*x!|0vH8dLDFa)* zYO}FrZr~}G%qwmkXXQmfBEam_)YIuBTXl;`QkRdugcTu}b){p8xMX)DiVN}j%u>9x zW^~Rcm95sX;yGS|Da|@)70QnJh~M-Cy27LeO8GmMhglh342YFSoW(4BN|!Iz368$O z?9m1_P>0Dgo$o3}n%;KQxvViYE$C2QSs#3DC-)WSxvcO_eiEUa=16U+CkDzb#uF0V zaWYd5+|nM$DL#bn5|=`d@zY`0nKyh;FIGevOZ~f_NDmci^MYP*fx=8a-U^IE>lXo+ zbIFipr>97D9=zPL?^3NCj0}nCDjHbV+lHQxH1W{Cr?T^uK|bf!HZ`tT%>7GZ;Ca75 zbQ>3uk9}{5NH~NDorY*mx?$7X6W`RpQ>gUBSE-ki)^VLyr`DMlkC86H#iH2}cl)o} zDieTT6WQg_z>Sy&qH5F0lqhW$CmRM!FKzj4OQ$-fUcYYG9um-rv7?d9rsDM#UEif8 zXar3)xV|3^Bv=T1WzT$^kO)yqz;|R?9$9c}MRY*2URatGQd##|dsVLPMv%+ase@yZW!WZB=8!v<66Qs{PMsKBW3N+h?+b3kXh2srV+fz9!nv@kB)19YW0#YJiixg9p+Zx&yp z(ln%>r!+x};0sn|{<^aE2C0Hz|4h6ka%^2=nN2=-gt&53)Z-YnXv{_!1kNS&Q3LV2 zM=1EG02Kf)LgId6OSpF4s|QZx9P)Gc<|aF3uaADFv?v^X;0tq_nL<(%@V{<$dPq&u z8Ki-?DODFdmNKH3$TOXh~ z^JQmoTHgNCWPqmt_1HgNsgoTC`QZhThexJOiNCqBf(xq%@D+W3=WYpjjD_y$(_3A6 z5{^Q()_Z+9-VEFRMICp4tOV-l1Mm4P1V{NMTs3;kuyMZqnaJBV>asPVXnn< zH+ z&DL{Ghj(v{3`9B(l&n3_a#>Q3*{ajiZF+6sc--b|ItRaEeZ%AWBj}b9Z-e#{X^Z@&i&I}i2ud^?EQB88h zDU4AHW0nxLEzIJG&Zz)!!D|T1I(b<}+ty5;8OP)J-hHseG6`uqE)l{kP}xio(k^WU zxITN1r@vGWwljVTQyeG22eo*ZQhDzK-eh?G9{L;R?F`r@B<$iZjq-ST{iDoN-+J0J&Na6d z)$|LyYZ%i>Q=PQ>hl$alz{z)*QXnKIzvy-n)42v=f~Qmn{PoMwO)Kn!wPy&d(h1AXY~n^X-lXKbfWKK&__2$lH!kuYmqJAY%V=AbC*<__dOk)wO)u$ zj@b{>9>3-g=G9+Qicn@!3dV>m@V({qL?Fsx-31!fN>?eqv(`z6KA?3_EEm)^dHuDG zDtPc@-e?0nX7w-o5yF0`zJQHn=gR?>n6MVoEKD6-fMNiQ2*M#&%kG5<$${Zh>E2u8 z)-HVM8bQMk4DaRg#h>q-y=12_k>sIlJh*mmgK4APJ*PSD>JzTEx!6BaPew^OzX6jM75c}tQCe(f|ud^ zBdX`m&#>H`SDPm^wrIauKA&s(nM)XN`Qr8SVWhL>*dReb9xck8eOL`5Uzuwrq!`Tq zwf2u2C$3S6MFY3ENVUm)eS}rmZI%b{Icp(ONe55_Ii_?iu5lsvhaw&8)=aLYG7~Iz1LmV%R-8_79 z0c!JNDT;S#^4O)Gv!q$Z_*dcMo1zbLs|HS=c*&{a_VeR+zAJ)R4Tc4<;#7@2_4mGa z|0OOBx&dBqCFklemZiHTG|L30@wmlp{KRi!T0$-0q8DlnP@N~T6IJKF5qLYfaNb*8c6NmhGE}-kH5W||zdOXJp^QrGiPCd3s$g9<6 z?TMne%ddxyqWfz}f;dkjUPt)mHBF<6BJ{SpU*HtU@d1ASt8&$Y?=%J>Lwr^OE_Dsi z0{1w}jH~c4%b^LVCEwDEzw^=~S_a|lPX`2Z^tWELSg>0DNa46|^4jH{Pj7XW0##dE zuu@@z^0bGMm-B7JkZzM4dFU@jE*a{cTEEK?nqv^^0^??Kr8%m@QC?Sj2_<0#kPz3n zmvW@b;MB6<)F_lB6L+@iTs^_f^?^0R+u8T}aoZbQLzBI&yOGNo6TzH{HnYc~&c72& zV_90`NHG4ja_4LQ8$QehI2Ysdww7=YRMWY!S#k}*$?;(z`ai`o%TCy1*|cj%!LlbKbs z=o*~E9vt-&A&O>4!KLkQKgX|SU_CZGo(Wef9}~f#0+yYjHA>Z#bbH{vHdtZS>JYj5 zse+4bfNfvx-PS0yBC7p3ujcxkt`GOsIl#k$m`m-6RI;e>cdxx8yVV~b4F4&4duM*K zK^4CQ#+)_nT>^Ua-F7%{n66QsIDv%E?e<et9-QNlqXXS2 zCMAu0yHrnws<_lC!}7Y>d&I|R4CwFU|HeI$yQ_JD(wpJZk0H_El{8%kMAP_gRta|7 z?lrq~vxmPcVSjNAKY?TWY&C2Y5Kl=BpKsRiZep*%gLc2J?TPxh9H4k~nh%dxq7%um zd82(o0xH^H#af(5bjLP=73v2YUoZn%aaU)2pB2s08${Lx1QofY%p~X9`A1-j-vn<+ z3$pitR>0ib^CY>Z0c?h#)yNLAzHTwjBgB|}f6`sVq-bGU9Hh;jzPyYwjAA5QII@4U z+5|f6Jg(I+X8sgnp&YPj=?Yf+M%+swzbh@Fsn(lULfvEW-*I0AzLfq6#lX?gooC7| z?k+4fal$Ld`!CWP(i>|94C5=8@6PXS-sHr)@N212*iS}h&-UH-32Z_L8s;E#pTA_8yQnI5@iro`?b z#w`LLWIDui89w$*Y{Ccb!yAZcVmPohiw4uG+pEocO1Ecf5@`J?1}<3XVzI3y)%VGK z%J9=g4u=KC8P+e8S5J?X5CqDhrllULKo$pJqn+%xw5~-XW-kEWABP-gA{JY{I(5AV zQf%;kXtE&qbV%0v?d#hYSNYzud?c487f7#<`AwxO+>@2(%MC91bC=^Ht5wrlKttF^ zree^0wdpvKruC9kj4}O)BsEoh;IOpUtzRP6ZCV*7k;eFoNHjWNS|Mbri211Xd9yYs zCK9de7VDm|NoU}$mQ=UzBN7x2&god$l1o1#|f%gA8L0h7XZFStEqRM$k_TAzDC zXApK$1z^dm857nb;LJ`)=YVT(-rD`7>rYY8bm?pXyz=QalCI1(lp&T4*Kw&f_G7JE zev1a|{K5~8l{X3jpKQ+0l;WzP7U)Jrt4(Y2kNqu2LFTN8mdD9=E6Nb}@Vf@+=N4tO zBO--!jh~OCc8VYQfSy^BV_65ySLUf{5sy#js(HA~rQNvZfVKp--1`=c_!nqL4l41x z;+&LaZnCe(H3nw|moy2Obn+}_$v$!O(KK^eCk%3>H-!FZiDrt6?67v1eL~q1v=Dr# zpH<$RIE_;_s4adU^sm7y!l%=33X+1`NjX9}mOvqbz#d{OoI_`Xu|(8^-^JMTFC$D) zDo=aX&Zd94ur@^GGLO1IlQL)ec8@&W;5fcFEp+mSd<(DIK)SUA+>zGd!?VG{n8{Z5 zF_?|0He@~IUmWW-8EYv11ug?9t%$TJ0YZd8r@<{<8DBAz>{~+nML?+UBtll(k8Ls2 zSilk1pBkv2AIfv1xRiZ&ySc#RVjO+Ul@~=OZ&}=p^Ips^O-t@|&as$$-lF>JM|gh| z70=d`5*Rla!xID=`0XoKSY8|<$1J2X?25(DoelDr$j=S0b(=VeMH()0fA6T1Vu@^W z&6P?3N(dmw{V>;B5*?GOfZ5}rlI#oS#Z~St+al(-DR$+&;cW>04}*8DQ6(pKpy|cU zi3J7><@7U$FP=da?t*xc{|;}cQ9B7d^?I5wY^{rQ7C%E@x&nHPEpbc?9RqF&6gh5A z{K9v_{rDCmi9pnsZ=U_*?t^IOwT}q*V7t_&&8eH1eI7Kj)jl@~$70yZ5rTU2CrD&+_CR z?qAH8Y@yNZCzt)l{&~gA_u90#J>gvi@GY` zb4&!4!nIadBQs zR-JtKEPC5BvKYYK@c{A=hfb6&#R44nJh-QS@Pm*VPQ0;zFSP&RC#y=I4pHO-II}dz zEgX^Orp<#R&T_nu=fSQR#@Nw&NqSglN*q9Eg~DkgYt`*SNjWCMPXd-G~b;sAlb zKZ5tgp5|w|hrbL-b7Q>yH?a#~;22aBJLMiuIhFB?G3BhHRQr)O!Qw*|{kYDT0g=bP z5dLaAS|ka+O}khYC!j4(U5;Dw!rLfXR3AUfHQegTs0!gukK$;UG;)gLQCQgOyhB?1W9 zQEf@S@FAfyhPY8p&q0wDupAn+B?8p9+ZH!eb(@xnk;Av;{;o@?O89jx zKU9eZbdqRTnly@nWY10N_YD5EJlV?fuL~pZ=}^I^{K&NpNfuL-Y8B_FYGDjp5m^G!E-Z4I}5OpKm`7Nl1x zQ9qqCE@?5AoTL72yySHf?4bNjTN;=l`MEtI*PpdC8RSM({-tTZst^-IJ=yTn%UfZn zxMB}w+9zzxAwPY~tlRH;-(t=Q*18$xl>A*BhSEa_V$W5vyhR^=1)iRjOE4HF}7F!5T zS?Jow`NDl7$Ui>~jGv<`k61Co$e=?k>q&qNTw_@rI;JVtQxz(Wvmu2SQIdMK6%~H@ ziO~?H#dz#bHpD2jT9V^=8nJiACgJE-nH*6ia66XHKIgVwawZ|S)YrT(7JnOe0(Y5l z!b1l3%Si1_rn&hOgVh~`m9|-%DDG_RDO(GH4M<_@#e-Wm_FH}ek|_G;E=SqH1N-jc zjs#Pi5Ge0=tv&I(!AqgAc1sS>-5KM6F+^os37xIIRKXT*)slE0_6yv*6aW>?2f-^J z%$~78w5Uh2am4`}Y8S5dEg#^N{^Zqx&#Z_28Qk0ifsYM|rnB&sb!A-?K`ZyaEV_wm zaw8Hf=2i44P297EMyMUm(C~b}9+-q-n1Y!`7JL*^I6|`wtY__v$y=LD)GWXtSO3Ex zK`iKATn-M$s-p*Y*G0+9wg1c#XnBOF@QzUldjCrKHGko)MDsS~3*u)G9ncWS3gFMv z=q&fx8$cbrz-oW26`3?4X9;&bJ8J#o=9a1h=0gR`aL74OtbNX~Xg57ol1BE6Dx!M&8eNNsU*(#g4*||h!dr1{ zN}LxlYg;hj^f42dJ&&l6FT8kN!reezUErwR(2YkLSq+mGpuio z)m=DXpMCQ}`^rE{pzYobb3tS`?X8Dpoc!~Mkxa4NZ(RK5=?3+at@p{Y8P3)L>ra9J zpuhj0Osw&uK>!hFQSf0Jlrj41LcHFMwI@VF!V?Y6KsOA=VYxelc|4O#Pv~z)bO>~Q zM2kRs<(oNaxl_ba&qlz7o;)`FQaWiQnS-RB01JTdwDq;q1+=z|ukNM{Nf*-}m6N&I zOCqIVTIO<-69nmE52;oteH!B{rqC~QZ*JZf7X@9!QZzy!p??t@QablVF>hE|_R*AW z;U#s`1NrJXV4hl{I>2$^^-#h9&GK%J7JY=QnItGSsWJr}0_OiiSv_CaLZ44A^&%ew zVGMZQ#Gk;Y0^FDj6k{|!O!T1!=!5c(f2l|8w$~fHm0RL;NTv&R8k{NK7v~B*TMD)<8IM{1rLoUH zHbZC~wVb>E;+ATu(Vw)7k1kFvoFnjx_;OTU)^9q_F|np7dSN*O64!oaR_wieVgEOz za}?%gdtw1J?RTRaZ4pp^ze>{8d0H3ZoWt8 zHu3_9G)olrG-k&^O%w3XLd9M_)Tq9Il2ovQprfDe^f%rlOM^f}^<>3I#T_13VXFU_ z1c%Pg!M~r9)d;8gZ*#*sbHw^xCU>1G0KD+TfoS$HEZd>?))6u)(J|OQ{r%ow@z?~* zx;R@S-V|})Y$P$V z_z{hm_@Hs-d~_7&<|)#jL>jt zGyYpXECjMo!%Um{F!0Jp_Bt;n7WiGL1p4#EYu46fKDXq)w?F-s&bD#V$2M@<`*HV4 zgb{3mvR$?B$0JO|14HNrik>&+Nx}C8F2jor!ifK2RqFz=FuNVPP}}Lel>aA-U-$+<$}qPMLPq8rwWRy)V3Ymmm5?fn?h1e!pBKAt#1dNptmFhi|FJfLKy+h#&k;~6;Rj=^>j(n2x=s0KrN2ERv`*30 z+g#VEa7tWN@e6KA3}+2bP=bMP4Qr7vWjJeIE@E;2>M2JGZJ+pMn0a-;`H0RX65NKj zd+=fi+5Fgh!n=3&6$JB=U&30=WkdK>aMxQT@BWR`ly9C<2j2ob3!6)loy;KccCq)| zJcICr!_nHso<}8-Zv8y5ns3{Mb^0N}Wqu5=Ve&w>w2{@NetWssQ{HNey0poh z38yH5p*3-x4&=uf&L;Hr*??#huK$>e>aXQ!Jj=fFaSYUWED0$$v~!Sf^f++Fko^ zSlI3B({ow>$JAR#McIAt!$XS*h@><_OGyq5QZl4;hom$}H;BT}FmxLuNS8>%D510r z(v8444BgFpKcCYKFqgTQf@r+sUugB7q$0nlh*pQRZgx z|47h)6wUuL?3|)5I5Ex{7pTEBRegm>7C`*MzkXLn?{F>}^ht+kt5ks&px7~=R5Qz%UU-|r2SQdiWWejq6$YR%_`gru zX6aM8_6N?kmjp{Sl)Ph!)^=YA;Zu{Y$UtF2wUWvE}Nya%w>Hc>>OI$ZP@EVtG zk=CkU=GX92Q{zV1xpbXXVjNKvX#zRv|2@c!Z1J#n>ZId2uEOiqw&Kv%e77+dQWlUP z-lo898EuqrG$rSv$z(?-@G$+Cp6t@BkRJBmrkxZ1dZ^laHIQ?iOTbw0ze7*4EfTtJ z;Bx;TcxBkVg+mTci|6s7v~5np^gbmZ&&7sH&ZOqtSzUi_k;284Kl;*R#VXJ4M0OeU z_#^C`dOt;LwTsiG;D5gE!@0jpL#}`a6l1IOIsezhc9H|+V{oQ%y*!22g>5;Zx<(x- z`vNgx;5CsI`@A1FmZ&R{zAcw791(nq12rJc#b?a<-|-~=_o&nT|Bi#Po_|5&s$}GjBxtx6A~i#bGd0 z9Dtb&=q$v-YeuMs08f;`L1#X=NJ7+3H!)*%DC!^VyRpVT4GRQZGeFhJsk2PowhGii z1N;~CP-HeP4LH2nBJ=xlY6-qIE;9}@h?)OZ7PLTg-TGz1{lAAR+eoE@?403gU?Ll> z`rL;uYP0tLIv;^~KSnsRl-d;xI*Qlvf3bqs#B5WwRwMpjiJ?Xz%;HVt^4CGflW>Z! zh9|#?iXsl@IjPTiDrb1z;7M+te>=?dp((9t_xTZ*EoW@@tI?NH$4sjsD}*blNK&}d zq*x>n6-^-e?z#@a;*{VB6ut2X>G0|f6I2$ENVFN~sqHY^Ua-kKf=u;L;YQU1!&UQC zagQW$mY#17HAz2h8&|!leIC7smxI@xDb^XUs?wVPY=T_JJdiU+y`|6opWXCOQ6%C8 zPF%hiGJ-Fe{e@R)Qyd7dG-$0B<7HD~g;zdLV4RdZi!N_S59)sqjC$d~ep$msSD|iA>gP5CqW8c(E3!!2*4tK7j&& z_}Wj;J5(;$2=-<74`cTXko+qLYh(7vzuF%6ECQc+28TU7$KQ{z?Q${^Sla3>C>eD2Ae6GYW5l-^!9&2 zg&-F;@Fv@&e}sQ&T1l3lXQ^ou9~>lu)1Kz)O5PWaJX3!>;?{nm49to_z-T=P1V9Ut z#RUi23{}F2W?tv&UUAn|MLw=pQ;}80u9q5N&GbdqDNyLXP6UI#&|UD0TR3Vu!REdM zK>$Z*V1NPYQV+pLZ!bJfmC1Lavq+THr+OUL6qfNt5AaNtWm35 z#@b_EY*|iwFp(;W78o75)(F*Z3G&eBE@ix0O}sOT>>D01lDNa~%HuVz2HQo$ByrAV z_ElqxucHh%(If!Sts6iEsUDTq00Vy_c^i@SFm45R9<{tSig zwTP~cR*v?KvdNJ5El!02)Y5qr^}Z?{Y~bsm*DNp?&}mgb?F`xA&W|$yl~q%8Ee^R# z?>I%hDRqWQFA7QA6Qoh|y4I{$YT_3$ux0G2B|91k~ktneepe=qOr1{8AQD)4kYxUl{YST30rRJk!67@y?qq* zp6%Gm0UxBL0COmgWJA|y)13L@soKxqx8c5QPF8l-wsI)!T_rLZIRP+hs1!b=*c0@0 zGY6!WKZDn(^l`UUVgvtuoae{U!rx7R-S7no=sNEAqiesu*aWyLpDlaBo7kd`z#ns# zBdg7BJL&^YuH61%70nut1}KD0_aNAZebxt$A1gDPZoAC8U+0K8v#{BaPNUTsAXc1U z3A`Fm_7G#p0}NuXgnbRQW*GK70oJS^adPb z^#8gAq%Qwb9DIV!u!D_V16(BZDTD>VUFvNI^^lvB#2r(VcJe&CUBTMXM*)g@@gAYR z3EfEal)`lzbDnCnCiq9EP}O}ME%WxvOL4=@?B#BUUnrzJ@U|XG78x>2#~DS90C^Ix zPSmj3Y{7tckpSi(>EH=11s1eicKMpJ1mu|v)9L)^55`daDZEZx&C0I3Jq=hn@sL&E z5$bcAs-SPRB3zt=*F6gU;Dc3Y+X&KAu6Lvavn&vWRNq=M`j%3ms1%F5;-JI ziWY+M0OCn}_cY!GtrfmJyGh_3%y2cB_Fr@MSpgnTHSR2tcvvb9L)HVS3L6HmSy-5$ za?(zC)};FjFOKkCc`AyW=e^I_?GT^Qz+grA2{?eAQ$B^ONaEZ22(pR7$8!AN>y|F1 zC$-|1yEt~8uOuB;wj+1Uu5}!;4VJyEE#|N3HOTM@&1JtmeEOlk$@EHx@U?htB*4zc zX;4+XivR2GQmNl`8SWR^ALKuCpKf%ZCocLq^ycYYy}*8>&diFy)&`TF$h!5)c7C?K zl_0QjDHRdSsCjuI*7$vdz#S(n$4}H@Pv<;L7zPuMUe2fq>8@Da@T(9;en(g|c(H6{ zfY=W@tk#4T%cS3_&43cspGvAg2jzLjIHuh)G` z8VZ)oOui$jNAtLDIkFK^h@36+B>zs`jC?6{9ba&*TK-AQMwCI6asuJJvwBF|s`yFK zS~ePAzr2!bYf$0dg6fv&YX!`H|0hI9yY4{=rQcDShL3>869Q=()AI915zL9TC5b#;c@``^76nK=OR$(3MBLwIBs-z z5rnCslBDE#FfUi)`bv}&t-*fB~xrh3qYj8 zu^AGMr>-GvQ-bK0!?EBaFu3$cf4Pt*!Us8s{bVWLuqf1SUT!7>re0-6UUYRP;`7Ur+T}lz%>eAY%pV0WGrYLqOM605Kem@R2<8n#_wli2cdc3(`Zi!WmutL{6 ztGLe|gR8jzXPnc&BV~%G;%|i!dtavHUhi`5iTo&jBgfm3Q=ro83?1qAZ6OF!ZuZEe zEu$|J4YJ$T(9aktAw?g%kCUuQ>MQ@Fb2x8;1LA+%j0uofnds?nbgw@n&Zb&8u&*h6 z1Y>ft7;2oO9XaH(q&#gBV9Owq;nffIeG0Ukoi?4A1 z08TT%>7*ZD6Ckkc(uoDH;o2rk$$q_ux!U@HI4gMfud`rB2xkmO7grRzH!qbO-lt#_ zvA3)0m2rGk!5t6Fh;D8Q3Iax)jRaqI!#|Me;$W%$2d|V=EJ^saFVBnvUex7~rb(ET zfOIm%J{Q?i`0$e&h0=Y%Ala|cGGf+?lec9AJ z01)N1tTm)yFb&(y$2!vk^dzA4id8Q|PJeEUhz52SxG?y)Hk>z&qXX=A&un@1MI2O7 zyr)LcNE65AovqVIB;W_HLfAT4!4gD*tT#!98)~TdZ!A!HItTY1upOKJa_P;N(%GvW z1pW6Cw#9~#m)cN(pk)%aCWp@28?Oa-KCe~OKve0X7w^%5JaKElS?1wDN`93tO>RI< z^nnJ6Mthv`we0jODUe}5!5$lARB*5wsWBn$0wQQa8)BLwpTF!Sj zfExT4maAx$-i2$loMW)Q?icZ>6ZN~Lw$`@(3B=il0(CisyVO5I*k{mGbRo}w*&#Y9 zZ$L}`Vi*f0BDuxA?%Zzo)l&*H)4%&I5S5Dix58#CZJ3qGvNH*|tC|M+Qi^&>jCdy* z=5DMX0dUwH_=ndcbj3SiI*%ww(jo$K+=bU)Ls_bQpi{t8S{&AC94RTVtr35!L+Mi(`rq?m9dd--dD2neUgXJfn;d&9n z3=9i{Na~o%pIc=#Gdrbw3Wb*!&>PYeAS>Y#*l93R;T&vKeT2FF&Y7k4oP zDeMbZXmh0gp@N1=0AE3$!v+G9Ad**iW;)Exz#zTUJ7sF|cdM|X;$T61d8?n6%KNh3 zQoPW8KB(?D%Bu4Vxuj#Jjsc7KZdRt;_D@Bu6!mob%(ia&wNpB+yyx~%7WWW}A};VL zfzFf1hsMyzFK%)YultIB$bGHR5w&E{Y?C&qs@cH5_mEqyY&}!Ch*X8;x1rn&ts-v2@umNh-!^}|tNFz`sL3^M%{SxA?+}IQ@L>K@+wu^E5Crxqi zWJTtyAkIV$Euiy7*?zFB?ep92Q5~enq5{(iuK|96e>{vDx*TcZVS7m%oeI5l!Si)C zIo4l*ef7EXthl)qwQN_HZpWx5siZ3|7H2A2eOTQX-lc?hO&o)zjmF1b3$0MD3y9Cv zv_r#xkLF~yS1qNf^ll*LA8EH0eboz#M>xMGN`+NJL&2?NJP&>nAol9b$Q4z4KO%}- z+cP{B#W8_!36~&JrZOH(1TCh2vk+ijZv@&B9xzx8Q~>{ViwbHg&(6QPOBa9@p%8q< zQZ@7nNPm4qrxWnac`UU#CM)lb@lII|3bYzkIuIT!D@s-PMh73e4`ahmlaH2e-0 zrajShDZsqdCEV)70{*T1HR+TE0Dskwk9uOo;nJRfu9I-=dMRnxoppSgj~*@!(p@5* ziF4H;BJC535&(38eqRGw_7p2q@fX*aT|#~Rz0-uXX)f>*sF0we71K2QJsaLNe+=FN zMtA8FKeoC$>zWY;ZpDof6!rHpX%o(`!rR*fuQZ>?P|P1B;BV!qJDx~?W|=iWGH@hl9?FJ7(}&5Gr{_`i8(XP%_*+ zjt|IEJ@uGXpWIEpE#Ro0|GmKEanFcni48LiB;a!|GKa2-%D=j`JK^&AO(g$);%6t< z-L~_rOS+Oaz~J!H{@^BpBz;iK5_M6lkQu#6^mA1*eI)*wtX{$zVX;OQXLyi+8iNZ7tAYNPhheGxzK4wN| z0b(V%CI;Gv%E$v`Y-bw4gY22%3EI{at=$m`pI&Kxb!i=_TOIkrDt5$LGVLW-_= z#10m>cv0wGX<)2_*;_S5;Y>&~89V+rZ>jqD;Sd|G42Ae%r%v{;)Y5T&EzMcR$*Afc z^?bDot+XCG+Z^E8GPdDXOb~LHaeOeF?BBDDT8p$H4NCa~!iLRVafY*@{0D%ySP0-1 z($jsU|EWnNDNq(Wp%UxPd`303lpc?Jniy^dDIpPL57i%+nQ8 z1nFs;2kv!8OS+x!LyC4>1ul=b8>jr`!Z+U+=S-@pp?Gi|u9I#IBE$41f4}ld?((Yh zG~ZJdm9%C&ZUGfvAChpaK#4Lq0!wV}nt-4;@f7=_XWcXPOX51Va(p8zLiLT-!0cng z~H5cmfFutvPE!6QE5+#l3{wsYld==u^=hm?e+Eb$# z_xwy-ImU~?dnvW8p9#fUgcpI>iarkb_pIc=Z{fVgMT0tNV|*Avs0>_ZjTvWQdNa%o z9sy%Xf+a>zlZte0Wr)Q6zNEc<3}{#MG*eHy6OIlDs_x-q-Tk@s_9}zBG^nBf0)G$3 zW14Z7pVVB<1AGhhh!_^55W;u4P6jW!^GmP8;!e4$vCjI4lB__g=9~N% z=nn`5$T+(;$_lZE`KfR7`diu3G~YhyVD~&DB}I|G&bWqp8}+$Iskdet*{9>`h-Jxn zar>$Xk^Tw;GlOpc)Z8BgCD)X`Z<_vxVO`%ggyCpZ`Eqssy~8kGUsJ7yO0Pch9L{Ew z^`{pqj`ft8mYhyN=*vybKH0GsD?qo`KRdQfFz9Vh4~h8`e&{c{lADj-HvO+EEKMVO zXt-*vfA~pA0vIbK9(QhKmQE|NWFy~1=FojP3g4)qM{n`Kt>MRx`fGca`K3F3$qk=g zZ8|yd0c=@WKu-pecFeO+QK5@l`~*{&fTk;#hVKaB&TB|_Y{6f|oI5A`%9;PQy!*_P zD2{W^Q!eB=xfyWLIh8PdozAJebkALH%#}Z;Fmxo;F=^8OQUd1@ML}A`zHbZ5xn8NM zKf|{4c0}#9km_t~iRL9o-GlP%P1|r;wJkJtU-<0Hubw=|U~kL5Ba2jCdK@p)qpyxo zS?mLU3DoX4dBYyC%af5XADO3M`B`KK6DPPoZP0GldYtMEx8T^qVA1aH3JId%oA%Z; z11q4<;%C5}E)xrEQ8cG7=~hhn5~qEPe8$ZgPs??Jhry!gl{qmqwk7w=&eXi@pvIL)M>f2W8vDt1pbdcC!_X9Pa8!& z@SCj4N^JH+osz^quVxVJ&~4A%ol+c(O3ATe>OW?04i$8v;a%SA4KGxx3Wb-tRRIu? zvu13eV0p&YYm2}ypDr%8f$Clp^0b!Js))f&YB@#*j+ls!7uRJ#N>LnK=A(D$`k?Ka z(YhvLeaq2-(2%;1=S;ONF74zOt~X>kl&mMO%4)60c(#7--D9*qFkIrO{MpvR^2@uB zWWn^AB~BIQs51n{9_DvKSJrX8P^Ri&y$LM<{D1cum%^*@`$49j)MC zI?o*~1753u%?KWqe~fXly2YBUXg)?a$iL{2Z+5fY5*Et{s{c^wYhRrZ@u29R=~j1e zE9mLxO(_{AAG;$91d7lo2<~To)Rh1bwm@yzvh>~U*gpvY#UTJN-0_At#OMQgO5j-cX0l}{;WDqaP6MIn64zsYLw-2e-XqZ25gWmWo* zM5OiOK5%8zvqp<6d*bk#j~yx_>cC=%wWm?U=r(8h)}uKI6}Ts^{4@WO+MDYlN6A6Y z=qermdi{>1lRD>LFpudQxHI~iDkFTfzb^Ji4);eduGVS*LuzW`ZIeS7BB>2arKVC zGKOc|%Q&Xne@9q)dw5SFv`t3^|0(s%w;wL2Iew1s4%z`zjiPib{#F8^+~Sv+GK_Cb z;le!CA30pOT)SzD0nBi}ut<2yA1+-E87?$DISO(b=N^@YA#6aQCR9s%JIXJvWzMw+ z(&GEh!m(je1s@{2SQN^x1aXuGm4woHr)m?h;fuS5wmjm^X!fGfHYun!#-xitg1aM`!xuHVAc73taw!X&be)Eai9&_quI&xRr zEi3kqlg?0G7_9S4fbwdDZQ0uLhmmJ`>=8uoYeF_}7Vvs&d&pQZKzW2LOkRt*jqrdt z=D=p!FsgpiP+h$4A&P{{&`-%KyV_U`vW%lMO{!+2iNxDxGZ&a`rXy@{yM-RVHnnoA z|K`|902ekk`B#aru2Oa1J(G9g21zd3=W6LA?s@l8-s3TB2k5`BPyobsq3m{m zmWi8+yICe6Zg*VT?z-EAH=)ic4ak^D4!SLB^J-M&lA8HYx?Yt|KMPUVYbUQ4TupAe z54|M4aC=4WB)lRjK4w+`I|of>$58FJek`ueN)s#k%62_QU-}>IS0RESN?A1SM9oZe zGzB&d>4XWUee&wlhHsr0zB1Vz%ln&XFh2D?;XXraCH3)9V0OAB0QYDHj^=6+-}LwO z%AH8x90%BVjH;6F*a-LS*NY;o-!>IgZnF0UY5@5?X*&m*rCxw6!!ZGw-~lTPY*`~A z*oStO&)Wus7b=lu)Md_uM+D}PF96w8*(9kE>(iIE1EsWjGrZtUmk^56<**-}G|m!F z(ej<9#z1lp&a$GnS`|aL?fv`>4Z%MbQ|>O8(ZA`)TRFpw9#ZR@6<7iTo_;03Z(dlA zvk7md9XTI(uCxHNbtTo9OH1v-?|axDFs2N7!l|56<-$7^Ye#-rmBd!CZEw+DeAU;P z1xv_DE?G(2>J>5QYX9;ih zCK=?8$eOwf%(6Iu;biqlAA{qFSsdGS%@o>`Jes~55V6|e&;hmc1lq=>n{+aH_TPMB0 zm|t2*;4Xw&9w38Ga1?Q2NRb8VW}{Mzhmr;;O66R8A=`19RBa+1`px_i7;GczOrkSo zHZv<&6bl7lX*Gb02+-#?J_7J3Ep(*FF$^I9Rd~>BA~{KdoPrDTnhlY{`!hV> zZL2@2JvsCxs@7wsAOVGDKe)(85XE&lG)7+W7oEws`KVL@t;b>d{RzU&Yg;^D=Gx}uwmMf^vLH?ZX$8r_f0KOfw3*wXpSNw7kdg!WF4u*{LBKGu+_MPMW^D{(y_tnf^^Y4!lqHP!?o4#Mj%!Yf& zo-J7>etDKsqMB2)8&Nh9p)|FJWq-k_BHiWiiwL}??O$C6bc=IgGXRebcX)OL`AoK- zOgpj72wi2y<(zRTnv%7TH)BWST_`+Lc*g<`NZ1qYn*)lEiAbTSh5|a=TeZvg7B;95 zxFAo>ijjwGogr`otMe=puZynP>hINQPb5BdQ=}BHTV6mGN)_RCRKx~bnn-4Rq?$qx z7|_280C)|VR8dVxe~;J$HM7HeE}u#V3W8*w_kJTCT`r%KN;^~hW@K2qSkgBi#rK-O zH=iA&r@!19a2_7ME=c&_0%BSl4GIIcGgNV>r*Ot4&(IL`(w*}Po~@xs$0BdM!$@+o zd5vwvl=m+1@6}OXMG<5jq^h!bVEn~a_Q?J@_o^D_{S2~e;v{o@BiRh*qj zlL#?Q-3OE$M`_IGyL8m_Mn&V5Ct4^6TjgBplr{B8U8^AMSxp|f==`eS}s47 zjT4~C@>Iz4l(1}uJVhrg2HA0evrBKZ`#v0c47oBA$fiq`YTBA{Uo!7xE&JoHcQcV$ zF0NdYtVOWisiGQ_u5UVQJfk`kr4QUYSDO(d8|jBvA)#G5SXAgUmL=SHm^gS10O#kr zMRi6`KRCd&8#mQFTX!G-eKhhrR2oNLOkw${K}#iPmN-cR*&~Wi|E=VQS)iBzbVkVY zgSpG?d&QRzP9WN60syHfx%gA`tM?4L4aLO#<~_2_D6N>wVs01uaw-=cc|8}Pdv-N7 z+Fu44wEl2@wGewv{AblP(bcowzcDg-KiHqS&ecRlA#pk5*x_52>8Av1s-4X5=5^AXs5M|?R{xV`xC;DHnxhciBk^&Y%2YW)kxfE4UU zO+wqHL7=~*s-d^uYr4$BPY!9U!Nj;=IDYyAWu2ajn{hemq_LgQb}xUUvrhC)$cUR& zTl*GLc8t`&VssS~^*0!|SKLT}#IYEZmy{=``c0U71AD{_573Z|oG{c@|E%SZH8~bK z%=`VLxAwU1MKSNbLFJ8f{AdYV8HWsxus4SQE2a`i@0mF?LyoVkJgFun24Wu`QmI!& z#_;fb-T3Gg^ZM5$RE&)2{-VXP&qftwSIvI*?E&`@KfE{XRuup* zC5U+B(gqG=q`=95#gV(O2IR$MU>$9pQ-~IO2&WB*$0>LbV$S&hLOh6{jP=2bfSWej#f`j z-ncdA%?gZzePWzwZ7c4N6+JzO%$-d{27d=glznVRU`J9psCEP|dOShZ9(rVO&HUK> z3;Exgs61^@1l_9^<7@u*4;#d3$l+}{TN#uGE9jhRi5$P7g3|Hb+zErSLU$Y*KkQ7t^UWrxrm6A-{R*&rNz|VH$7Y(HgLj3sT5uB{^W0;w9d-MB~fE=-H zM~lkBhpE989X3XhZws#2l% zSa2bDMCl%a0u^M(tzp_C6&<~IEV!i2{qM6&8GivL5sIu=lF0Nqxgsozthsw&$tX+% zF*PQt=*TN_cFJIJ=`P-4Ij)$|M_E#!eFZ;LCE`qQ<~C-A`Th!^D3cXZ$Xfyb(u}zV zBVR-SzP7kQU7R;Q6ip-AC<5987xMZ_lr%LOIP>Rrfoz@B-&;Smpm8wi<@KSI#?$C5JMKWiIQTJ}+MVRn+@x{F-vZ9;^I^9jP&yY97 z=#rGxT_SzXyz$ar#mU7>VNIfTu?jB5YkYM{1x^{vQ@CpM2z$Q>82X9RBa>UMm|Zhu zTV-Zq=nQ9>kVc}Bb7cF<>2${7?7D4;uAM7{g#_@$G8NKAH*xPfC8Qd1A-Z3B7C8Cf zGh{B=bem&S5mp@#Vx)Z{d&x5!Co3WKe^>yQ)bv6nILqYg&&e z%EJlfJFtRl$TJ(gtRo*lZSzQqwg@qfm|Yk@R&CmQcqUqs)2)HdIW{324UKxxeDmva z;P?<7$BR3xFlJ)*@Z?OQWflU%J2P>MfsdKZFMR;;-%4`?S+zA>hQM1%Aeksj9Detj9g22>o!)jviGMA zO^ky26&mp!oFICIu*;C5BTaLC)Jr5KQX3ilwsLo3#QH+5&Dx(2($s;VzDz0?6KyAN z0XU@!&{;1C`xQAAqjrd=kGcFQC8s}KzuT%LXlC?s66#C%NlF6+*pp3yjzvU6ONZp9 z;aLL-j_gnpmBO*s8GQlo8@ch0PRXdM+i?Cpc({uXrttUA#;)9_3!7R@im4GctB-Y~ zG8+~4y?uF)`|KT2A0@o3~KN9BkHE+$v!w(jC}1kV_-B9%2em~|nn z$9%w=Sv+Dr!>P>*>!%&mc-jd0)n(tA@id9^*JbpB#AgaP`lo^W;VYZcxIW2#kPThK zD{M#*EpCy{??Qy9tD5|EuIMVE#9x$2;CFu4|z9vRSHn<3DEd*_u&NZ2Z`fa zeoRJmzlNvnBi6SgTK<*ud-O`E5M%>EGZoXSZ%qNym(%ZCDxz2Ka~MXprB*)P_cauU z)Tsi&G_gFJeBG+U&Pj+nxA{d^ZfoS5@=7u8fYl0}8J?_5)p2&8o9StGB*Z z(Rnus$5|A&&BGrJ6M<-Rd>sCXZ7`zj@O6F<`V@W!+=W~}&RAfJgt%GoVw<0vpnQ4Y zfKHV=`LL%`LH=xuEY7~rA^s4?s-J&e^u)xfX0ITUJ5gXg|1<^Xr-m!*BUXSJw2SIh z%k!vt+~kcdlRsB~=|%b46OpY@Bi=|yWISg{{G#uxuZVX5DtC2@Ynm4>>_F zO^Y+dCv43Fc~mpKEeN+e&8QktnO`>=iPJVE6Gr9CoVaED^>RGRo`7_O z8xI_bBpO4bEbe>e#Xl;*9#ydX^lufojK2=kZg-WcA4n#cx-Vv|9|H#w8{KXxuR#9u zSDC0$g`P&EW_IYEA#O^Gf>oSyuJ5i)&)~o^5&_DuefmI&uCgr z*|l1%_`uK=O_rW?T|Z_Fub8)`3%|~ZU#SxDsyVt&QKWct_=?O1QmMrmY zf{W4QvLAlc7P$B-e{g4^criCpqjpiV^Te_48aTB%n?Hzp!D!9eh6lSm_G_!U%+D}F zW4=i@Z~1%sP5brlC%*T4A?|;$_Zqa<*v*VluKrs25WziT{jhHNQpti*Ie@P)`>RH6 zOx|oGl7OID3wkorl$AG2=_kZJRawo^bbD5PLj2IyqM_|Q8<78=&b-?Wnp3wXh+qJc zv!HJ{PUZUxQOycji}7K^EZeT7m9f@S^du>8ZmW;Md%9w^*eZ>qwW-MO zJ{#*z9XT3I&k2e_@jNzZOBrh+XnzL0LhA;#cDGoOJ%KwD3#uB-ActbVdVa+>_1MBZ zIi&-&d}-ZiMiMQamaZ(sMa2Vmr#)P5|JG{vH=pOr;c}EWRk7xOi^*oBf13_GP{QT- zqgM#w8J%m5P2*@dG$~><`A7`+WiQYFpzvWVxP3D9!AQY}_GkKkC@Td2J{mUT5sGXw zdsA+6VDL5Bk8NYfHW=68oS*!w55)i_YkJ;nqC*)%L7lFj`|))ID;}rUdyCTe&a*o@ z>%eTl_vW!DLvP$Hp!wY?(2;H41V~)U#}=>_8DOqhsKos2Nz@Zk(_4=H{*&YIjcB9-RBexqbQ)sO;G6 z-`UBTTp{AUE+daJ#Es>9)F7R|(Q z@iEG+-HLte497cYT`JV*nAxoC>d^?ct^MQr4UmPX93E1a=rBEJ2@#0dDDlS~gzRkJ zlg)XWymf8JH)^d#^(xY~n80p4TGeYKW^Am9~_G8@26N@(N z+i-CEUc|2+pX}%)!7M3o7s)~pfzR*Zq?tb(nP*nfyW6DrMWnBN)9s-8&m2%9Nk7~= zA8EPH84_Q{@w;sef7l{u$M3oC4n5_vp2~AN4S|7%x4j&mYuo2Vdk;9EKW2zA)%mWw z{M<;!VNgZkBH{6+XZY&M8~&L?nVI`Q2${|E=H4=BVQguOQ)n)`@BIRZ1P%;w`Vpzt zNmbeHZr?-_|3p>@+@GdV?WE#D6Q|{GU>VD377nxM%M|j~D4$_9E>*IkN8E82mlX!N zOd}pt**YcW&IaOUs_$8JO<5hEnW+7epc-$I!g=&$=#^MqeEF3Ly!3NW&R+Tjg&ew~ z!d&zG{Jma~s2_T8hB;SiEo=`@AxYBaF_tU;OnD_Welwtx7l>nl2ITP_UwfF#|Ne{1 zvvP34p6r)pIde6)5E< zKG9HO$;uU)@n!S=cw{@lG-Nnb_pEoA8PX_o2`dvUOREl#tFwCV^U=)_m&41i(dhlE zr%2;-psBLe#P?J)&aD==JDxUyK`c19$saJ8sJumb$-<%NGTc-%2N!7d$a?!KC!lGR z_G{v{;d^JP{tdH&y^|Mb{`^Vlm+`;rK*-)VEpdmG_}-i|dmF6LrR+zrCL3>t_vuEp zh;SAj zL~xY8_4te`+6M!{nMXPz;7wlgAManS);rLqM-M;fMrz5X1l#@dY2P9@f?K+BUiD}yAJTiPW~V`FtOFt_|UE1sAqN4l-k@`%BR zU+FBiRWMm(kFOZylL}%v4yxr=Tx-pA7oAa8)7y(3v<{}9r_)m0J0(I z&!3fc3J963XV`p@a8;f;J}6>Ztr?}BPd@|x?TyZxt^6;exP1M+Npobo{#AO*v#-QY z1K*(qpEjBYv~Os;4Q29Urs-^(fx6Jd%)0s3VeRzx9D0k>T5b%sV*lF>M7bB=&sD<2JS#0@Zu!qUoK0Pp1E4Mc^vic0o81g{PN#yuv6m^_ir|5( z9U4yXDICb;FuFw6KyuN67&{fdjl^9B(TFt~4R5Q9UWKy!6;H`aCK9|awlH-u7gqVT z-g7!OQ%1?GH&pGbVnk-m7oXMidOIJyO5Tw%?m+%Ng{u!c0+{{lo@8I`Q-QTxPfPWM z2`;0mOm9yG92BlofP#1AmZT+nSji}NWfAr#8`2edNNj)p4lzHxUHn$KB~_ZV<#XKC z(ifSB)ATaGTko)lTjN01U3MK%1oBsWnN(DD^m1(RpW!9A9}r5udtBjU(We#6))^8? zQ_n~sB}Fq%(%U7GrsH3QaT>zk`&c7d;#1vHEZ2-{7n{o6I>x2HjNT5&7nuE)lZ^1U8H~PoXg61&1}+Z zp?DfX8j2V<+9$0_0?K^fRR4eUx~2%QB@o5BM)Ds9X+0>33Zj~*G`9#KC! zu^)Krdqw;ZZLWxV<8VW6-x=G+=HQeH7kKmeE6*&{6 z6N!<~=pM{Ee#7Qay}O{x5@4p&St562g-RV0mE@qxf?3h@%}Onl7*dH?d7qMXRJ;%| z8#Poubu`?nKfKMqlH2>zox6Orv}05X;y1j_w$cw27ZpC2H6y=|tkY{6Me&kFnd-C>|(S7SI-3YKIA|Y zgf3;y>_=*Bv^^r^TmOQ`nw=x0`&%72wAoz98~QRx*>%Ek_N7EadDjYWG|X-XvD?zq zws2#@TM&P`G!4XZc-y0)FFn(d<0r^jgTDM_t?y{7>nM)(KW`6-2B&}DH#mPJPN{K$ z_@;%=-v65Zp)4N0tgc@XVe`3(3rFdcM9lwvy%N)f&&gcksEqlZXyd#+;a|c;L~FD* z@PP1pLsz`pTIpb|l;IH-H_bkR_n;+2yIh(Qqtq^QXTJg}Jtu!qk|uH#&i{8oX$WC> zgjT>I`xN$zFH3rk2IdbxBwIDUJMWhinlL-BljOQ|C0qJR5$J9!xJV*LkS0;}PNy;S zXlAMpQ@uaankrtsli*ZT%IXeDs`~oQt&TargoO#H?&<>Y)J%eQ*Tc}y#4f_>LsGQX z#WSo7FYFeX0VRY%JPnlRw+&KP(mH$#!+i zp!B8ba;^ysU2bhp6XakMT|<7cx5`Y-EWXlPj|i(XOojr_)L^R>m~3Ai{dLmHpE6*{wSxUD%8 z(0ks5jdUHDr-Rsrc;3x*W+JY$5WK%=bRyw)w={EQD{~m9Q}eIt3#{gGRnLsgAi1;b zA7U`?^5n=YnS2I$znuN6U;re~(!UlVJ`Lp0Sdnj&4>L<;T10IOZ@W32s;##wYvzFt zfE(t7bIVPo`!Sl84=>|ta*_?TMy7XHI) zftI9w{S1sT+fugA_UIeN#6`=Jf4AB>1qh{GhVFwM%Cw7oM^A*HqJGl~qU{VpJioo? z3Fym=lWU0!gkozSy=s}jO*ZJG<-S-}$T}{}3w~UdzN3xaM4#p7oq79Y0b<>*kGD*I zX=ot)*!CF@^7BTC-BrJt?##VRLYQ&~s^N&HouKlVa})SK2us{`AK^@>C48nO$5Y^t zQI%x#e~L3gsFmRzAr!q~DJ7#xkNGqE75T@ZB-$Cjls#0SC~^BH=vl+G8QOekI6}b1 zL;iA6@|%!`G;%magAOo(rsBL#J`4o;oyl{SLC9v=!5QyP2r22Nkv}$kOJiF#Cnk@B z>#p3A@q~BCMmzt4${UWL9o`v7FxMHle|i1w&vG!9Yf>=NtblXG&QqrLf4_BL8X2uO`$MYwU1+E``PeD9T6nG^ta6U~#ab^D|H5|>?$-Z)WZI$^Q231u?6-T`N&-vDZe zsj+NL>7nT2mARsYyVfSbkn3*k)nWG&RTh!;%2ebU`{0_XusKhuS+k%>48p|)R+Np& zezy?kFxGj{k?$W0c-yT*FD$%MH2BeQ#(zG>#ZPGWMT}F;^KXQu@e9O1UeY4olojgQ z)UkmnerUsvZ9i7^opa`D$!gc$H>R-dy0a&a8SuVF9Nxb48Tknx3C$e$^P7)2G@wEC z95d`=1eO!`jcU|ec!{_@ z^8-05(+i*4htnS?Q_40?jqS5ArGP1lL9`L(Pz0C=M=rhaXKs9Os#r-bQiBk5gUyN8 zlpf5zwUSbqKf6Ux15KLfO{(gha28Ht8}Z$#;H&Sz<4LGey&6j&aj|LC;u(pa8cNVxFfRm#8+MF)OAya$(Az;i&r1IT@KKHzKtm6Zw8kDcK_430 z>Ss~i>_6iSzO0^&r7vF9m_E~L7yN})+M3JNv9qF+OAq{)r zOuupdA~1!pdezY8h0UnX{8KP*U|k+00_zfbMcW8)60g97+=;-NOqPAs{I&h3(EW2J z=CAVC54Z_}k)yX6ScmWk><3Kk+vOsT~rXGE0obvj@|Pybto5YZa4-gbVa4C%C= z`w4mjGAn&@xn(iy8j5TVZ!^C)z5vQ)+|nxcBy~6_Spk*x8cu@GBjElpm>X_3&dH(s zMH1)Mb1x0;DjCe<35`6qD_7QWYxoz!df<2lJ&@XWd~*;^!!aPmWL%@U@;EDd^8xlP zss^r;TpKu_Imrp|f4bq)D>)ml%{^@zswhMofitoE?2i#K=0PESwH)%2%hJv z%;8^w%65?65H;RA?YO)Nquv#(bOiviKC0l|Pow+Ne=Z`VS4_E7sZ8q+C~x`!fDIxe zpf69^nE3R9P(%j$>CU+LXY!>AZhP3E1~7A#F0&Ln#v3uGX)=d)jiWR(g)ifb@i#6> z-G)z2Ls|K{+tOIeYNP|PmWIhsbRh4_%6t$8O}%X&emOFNMs1?HdCm@qszaH)PN=MQ zKH!An2U`G%vWk8H^m{e*roCG^(Y`y7Uek(5mu=&9(5xPxO#&a_#^e0P&BtFRVJ`4; z2q81VH4?NUeuZNJPSp6%Dg8-D%|!&LHA?au>*shCsx1Zr;+ZGm9`(t!6^M}gmSvV% z{y4UR)v6iy=@B5XNR4{0W=O)0=Y}{6A5LANRKn?7=*7NG3TaV-iMUp3n9v(l{rCg` zaeUGuYS=LkwyWoFAmk7XY!zS|!+etvW|puHk(x-fGY2G_Ff(a0a>EM6!Vx8IuQ+Z4 zKTaFz92DaHtfPz+`o1)cg47Vfj-?eYM3O8@nc)1YJ5ValqC~k3lR+1 zpV#A|(q7=vfQ+HeHGQbbcR_Q4(x%7X3I++v=wAab&=`Av{VRGw+d^KdCaCv1WDZCl zIHUC8)L)fKR(<&zm-`3JI!f}crFq@DCaAkr^W2=EUTS%NC87`tHn5CLj1=0L*Ak5V zjhd0rRp7x4p0jXC-gIqla9Y)0=(CjI0~+jMrUi!F3+Nk1`q1SZ8_$Pa z2v>qpc5v7?r4ngQK|+C!tj3XjBWRxHnCLsf9Q67%4 zts96JAOd>ydBKhiqK4KDybrhF)ki70*=U+@KDqjGv|nyrG@^|I2z*P)i)LO8>zeq! z=o&?%w{d`!{=?mTTcT@O_=8UoHw0rDwcij57C#wXQe?sNJj$L8I7gBH(*gh@qSh*# z9qvqwQ*k8i6M((|rtPiZs^eHZWrTa_hoqL#^w?8&RpPtf-#v%|q5;#X92{@ix(>PP ztjU)vsckDqP6C*@8#8d%-9m?3lVO{O>q;VS@Bnt~1U2$4*-GX&?uawOB!%1g}R7 zeq7lYzX*$C_l+;!N`k}Q47gt2jmPrsU)RrB9YigU?j|V`nm&-udAM)$MM^zy3_w(m z&mMoT9=XV?V|9;5@^u_UvL2BJ0(*Ac9p=kfNwr4#WdNAYn*m>c{klUf9Fp;`imVCHa19d*BVd<);|-H|6S*dM-Nrd1yygyNShS;=M6UkY_J(N9 zjEvSznJcFUMi$jx+6((a4imUS1om^v?a-To5V`O&go7CmjXjP~MlDQxK?<`0n5>ho}S2O(;zsY zi}8A^o^TAL?WT=UrQ|Ew6cZft!R5aIZ9?^|yxX|=FK+;3Mt?&NoOT{u(9o=y{6Gug zx97={uJFmm&bD)mJJ?i{!~+hpx#fX>!OuFGh$Hr{`9MFCewqiJM4A2xs|;xmIk2+4Ggpe9jC;ZqSST)Bb{EI^Kfw87%l-zMlPOB?COjlb01 zLKOy!+>jt?ZxK-hW(wuTuG~b@%S61zOWh zk}=FeToFwudC-1}fY9&eP6F5lI|9fiwCE`XDGb%V)*b0{^)tRMYZqq+A|TLv0P)G8 z(!pKDZ;@-9-}u+=Ky`5dWdLrO>J=9!HO?`3fWSQ2y9lXr;9uB=)yRt6MD}UCFN;d@ zO4l&Ce`@+xy&HE0kCcZ9(!$axv0pn&JdQ-9{x+q4v(KPDZTiUg!~Dn=_NUFbY; zdoJ*GOGIiskaOZEqFCGiqF`W0kXG|aaUfFMN5f5xGE%-(oj5(H3=Q`M2Pf&Z4haiVzv59BME@O*EpNu% z@sUT;hJUV6D(`G2(#lwh0B>Tg%8=WTK>ck&)y73-v zf*t~i;B*mO^M~rD=I%?UNf*hNWPR9tFz|1rBm2wOE{o?b$}4xF^!S@5dwY~P(ZhK5 z6b-d+!`lG-Oc0J}Q~OX`oAu?sdk!+f{G(J2S;Puuw8+p+NG`+60JH7 z>Ya2p-=gD%Zn%NYEzuz{gTNn`Oc%GQ)i9+i2<&os$Qy9Y_5@QL`VE9;wq(Q&rLoKz z=Ip<>`SimRqxAFZ7Dck@I|5(<^S_Mt;-W+Hp{N?$&j8h zUk7cP^q{v>y+w96{`1BAbN~-$#RwQ(BbaXok}#Z0y-_}T^T~|cg4$A`I~~R(sAGwF zg}wB#xB49UQ2`O)GL|Z~2R1NY-0v70mkx0!Uxl0I-8Avft-V85p_);FwhCm+cg5{p zi0)UL$>xT7luOjCIOa@|w72moo_Jsf!aayfG2y~5rWesoDVKzm_(vh!7~Nqan6EBi z1HaqYGKjpm%UrTbdrpe{@PgS)G4_~l=+h)?RLD|+C++Q)-mSf_lHAegY9i2WM{mP(ObqO4c4 zMkOBf(ZCgJRNgb8;O_Z%&X{oqm#y>FS*2j>Q?6|Ml~>&D*z#WTitXy{wG zz?)>gB&WUo`-V}-VO_rb9Z|~C>bE(q+@%U?0>!`o_AgLpKK)zKKU{6&bA-O>a|*h^ zPCk=%)(u#VWPrd%y2F6dQZK;^dHDKAlL8nHso{y>QF+hhU{Wns1ps7rIlGMEo0Ow> zE!6%fG`DxtTwS*h$}0-ErRhtUr1`KfO52ubOw?$-~G&-AmjA;0odiN_4jX_rqtqpqrxFwalz;3-#f<5`!syxXOovkD8heQj5yDVUn|GQXJAa`J-$U zkT-K(3@{6pLXxsRfa+n;Gn%&*f z>;MV`E!97l8p7k(v!+PiDga!WqP5zvWTE$#kC1UvxNJz%@?NS)O+!zh7?QP`pt2kW z^TqQBn!Or9ZzoCTYptA*fbnXj-R+aYjx`^ADt%;59cYLx?ksS|3s(4#YLSK=KNu>0 zicNc2TDh=Jqx-DOn7C?G@JmRvI0R9yw-7^76`K64G1(Y+f`<* zc~;k*g!bc=F#=enVMJD14*JExdQe65YqG~){NTamU zjCor&TkiD1j`LfZ?45B*p5E+EPj-8_dOua5eeLxXF zNZEtHXroRjV?^W1Sb8?!EdU1Ki%jYObX}k8>?AI_H%M}h`E}#7Zz7ribB&Q6k}mGE zpsOrHxY)qDvoLd%zy7=qXggAsH4RPh4ht(^+MjGTzbYR?Z!)%X>v&J*;TpbCp4-I-iC9L9hR z?h8oDY<(~rwT;Ln$2^X=a(BGMo9+Sv0Vmk4YbXh&{ZFf&<63t+lArhe=2m?9436I35|ib>$Zktpx|s zQ3X8)$Sck9DEEMm9;OQQ0*$_a+cR64At`5y5T(isikGhYo9$>mFZ5D~0GO{q3B+Te zQmIFn63C+}P$e-&=ffjUDtF5_0V~PkV`%G~r|$PZ1+TV{FT3~e6CZUPk9|W6U7Ylu zlQ(}q39%%xJc<$pqVwvij6c2uGN1uM#kqfzA5eeDZ5#xlHJ}BKwgyvzO>)Z|A5Lwm zAZ_VDoG54e0da6w0FA{T4TuGJ>m~v#y8-aI;`TW z6sW{;H;h`V;N~}z)X!gdN>-+^xQ@@OX&E9kBrUagRBnd5r0w!y%l(WA+ZX$<5wML^ zmc4OFN%!cqrZO=$ox%zYZ^w7NsXAYGwLqg}3IPdu1klrHZcSnC?Me~E)a>!7ua1>Z zUkKaDzM%@IQb8jFhPNo~T5p*Czd&PgUs3y(HqCNx`}9h8SO`9la!8D^ud4~K0R2w+ zw&5oWr33(uTBGM^fhVqlRtm^iYDl_3cBm!L8M?x8Xt)?JKA``+?(EDW_OEHvTH-tT zxz|4!Q@ww3so^X_0+b3KrLG_R5d$`wnkWTpF%6L!y>JofN3sn-nM%p3(uEcRhXT^! z=O~9+GJx+6pYIbz`7bSdtPQlvrY)(RDi6D?#0(g5^HL?C3AY~#c9Jcf( zRh+U?`&V~&Krt>zh~SzzV4#gN!Mk>}NynN~`3tM5ZZ)@z@Sj#dO~|8`L=e`&sI#C) zI7A32YRrT0HF9_mAApNAHLK_VgqF29{lNL^v}|H9~>4-L1aq*ItQq$0c2u% zouPltvQsu%(vOe`1qw?>LtJQ0>QNwFFW!%hobxAMF$#? zWE>D3G{ms?Q(mpQ%%C@|un~BA!kKQ~9!DDu+vQ%lwPIkn6i6^T$|VQ~sVO{IF!vrV zWjd31sI-yKqtykZNQcB~c*29^O!KIXgw4ehe5o)djy#`w$EKX@0lHfkpVm=slpfuKKTJtnhL^6i6xSQxxRMFR>`>m4p`EStEpxJ!OjW z8sHi`7c=S;c<8_ZCDb}E03tahr3~*_BopU1K8NkPW%=d1Hw)d}r zNKFkFllCNutRDOb*LVz_r%M~-HSpP6arcUJTryQ$KQyr7IcEsY1n~sksQ~6(x_N#` zrocOQ688i|+vHChLmYl;Q;UxAGu%dk2`-fM^Na8&x1t}iQ`_(Y;zl8qbU6Y1OOaRM zZ=msf^a6p_Xs(GH_FY2?qt-ND&jZ`Am>Y7ywz=x!XsKq}3u0^U96SLq9<-Ush;4u5 zPd0|681aG-OOT3~0Zk{%CW>(qP1FJfR7xr4T;%IS$w{)A&Y}*OC{bXhD_igHR_T>! zIAVrpZ4kwy)+i4#Mj%TU)Fi~92cQe^l$d90n~A_p4a;sK(kpxcy?KH^XbRmUXi()8 zbcQ7zlN(l)v%i|#Y7qVhhcAoPJXCPB`GC56^!Zc~5(JPhLahlAqDTfmb zk}A&$5UdDCjPgK&Vw}l0jyem<5^gz3l7{%Z{r?>RH=^L@6bf z2%thvCr*Bg5k;M{;=M)1Z>9K^C>av&$3Dp0YHUU9lM(Gzu3eII4f2Y*zS4y&C3?O&Oq1j>|$`h1{ksdy|mqQ`VdJ8Ty z`o4KzZ%Ya9{RY%+wMfeF)OQx4zC>6YsFddU2Tkgs)TuiLZ=0q#c- zjHa>tdJ@in`+i})iZs`cOVJh<7DxA6YmRlwRxTn#3IExAr=S^~i5D)Tvl*#grd`iFt5x zFVRHxG2s85El)BJ5-laLI#7#2-S4KDrE9w4c3*=rAJhf73nA?G(4xf%FhE-bt)ot7 zQj=Zy;{);3ZyCgc41%{+S}*m50iTc`9s=ZBCwXBww%=mCRBd24>X!)|UX)cIHj?SH zWkDYsmg!@YqzG2kEv$oU8W>273PpC#2diLrkxw)vtZ{!IRN z8t*mYHYQ!SkL!?J;x$G%liZ{Topi6`?#p62Ebct#yVI!|9#ygiAmA*QPe4S2Fl?pGXiGkINRZ6=*+-;y>8@MBYS;|}D>^HYYhem0Jmr;I- z@_bLpn$Pw0XJ&G@lc~R|`mj*H)47b{*eq3kP~<#E+V-bJo~Kt`Vy$$|8_NN#%cL`P z>;qKVvxIBvDMh(?J#~RGJ>4LsM=PfFtIz7}A5SrSR9R_{SN%f9{L6BZ^3-dcHOI^K zj+ue`x3BY0A7-a=amTfi1v44-p+ohKo)jaldeQBw^;HgTeO!;@o<2gtU!Yie#%9kY zAiD_A!h^UJ5Rp&X(z!gxYF6>;udl1B=qB=|gygZWr>BTn;jezTHEte@4u;7uFS2u- zD&#$`gFAT%n~29`Y+KT-OHA5_s4i^RK{;C5@UOs1R(n#pNNK&bFUc!m<_j=8U|KVW z-KOOMX7R|Aska&ar8wX^x5YG!#%K^7O7EE3fC#aKb%Wz^=2+48X@i8cp8#z!StB4Y zugmyOuYZE)f0Go!lL< z+Tj}K^h3Y@%zo;34(@5{-&BFl5eVIpai!VNq<4bps^@soddnSePm35)trj_3m1FEI$*J88TZcZ*B$K80<%9CoB#xf<=Ynyd#qktx8M)@6v&{h!&l*e)u5Dxh9GmR~5 z@x0ArL7{;`jU*{q=oGFXQi5xR;ozU_BP)(8lg>Aa`C)7t57y9Xb=r^fK)fq=s`oRq zc@lrhtVH*IexC!1DBFK32#|JqW2#GBJ8VDH07@1-VKO{myQ2azq=lJd^-x!AHXE!X z(I@&`+Ufax#i}!0l?I?LJlYi*Yy{~40g=fssA;Nv1<@B@f<7+Z^y|dRZ+ZJ87!5ZO zJqO?P{x;gt|7kPUBL>akS+^^03p&)t9*{&*-O6z^0j{%sXhpY1;W!Y3j0`3QbPz#UPBiv}cMe`qN-|`5I05HKcnhP>k z7?L);cmsnhN%+Sn%9+svdb?-7rKi&|sA4u;Ix!ydj@doMlohWniUYhmBjb14#_@V$ zP_HC@0s3;H_oYskMX+7E_xE;Wj&g;@STATc+RmJYtK12c~9i(X1;y#_>0y~&6 zSS~r;2Z)ypJLGyKzbDxiv>G}yHM>kU*L(?(6RRoeq0eG5{I_Qmq6{D%AgAehhr>|| z2S}+&jN7l8=3iC7s9V-boMfN}&)TA~f`Hbg$3OZVLP33+84SvYzuaKRb*h`-Q63wh zyeK%z0tN8@h)$}Y^xNC{4gZoPJ;xefm-@R&t?z<#o67QQJut<6>&3SXOaV|n3ZByf zk{|;lk*!Vs&k>~wPFc-U=l;85y=@{jC;iTD)x$q1HRYQFqrU7>zBQ?Fvj+tDtTmn= z|CN)7C*G@A{j~yr{k-u}HRb39WiFFgGMkU{8=0#Iu^XJekG+J}9mHmwa26Bjm#<@6 z%Qwe2^6V*U$YI}y-#Un_nr3eip&wZ0Sm}fZ3m854x%8|$Gyq5vtsA~1DE*2TrqrCy zmRJ2HAjlfl!O9OlHc3i)&*ntWqVg55rv&c!TW=uf-^S^=IKvBA-gze@sTQ=}vn1On(p zl$=!B{$G|DJo<6~(}u!n^FYO{b1AKqyUy!Iw>HuA(aLb7lSWoSv`ouURjf}|AqV7w z33C!*7#PfHKv&isUW7|5aqq}k4R2jLJW96NQw0dfE#WXi#i@V$a#5wYE74KN^oU>l zilG&VUqTrW_x*i2eaENAHjX7c?bDVQ{2tl9xMgNPGw&VyTcqXjob8?uzDao&iF*oP)4eCp0^#Jx49MOhzS@3hIID8PO z7L9xmwzIj?CPfQri4-8(_atlR7RV3s`sm@vA2}M0*OL&@}16@|HR_zS>oyH@UETZ(e;M zQ?S>E`AQj6e0{Cb{TsD##=B4Z_}ff_7`WQ;qlY|r*wp;G51+$9sG6x)|4Q+tz)wIb zjyDi5zx4wZcncYJUoW1)z#s0(FF#h8rKzipM&#n;FgP?nM+tNEOFZKg)Cf6B%yo)n zNgb^w{r642Y1SbAj|E-gXD;5CA}Z^Ir}S^V21d7rft1?Fp}DX9_qw4uvI}e2NpiYt zUSq^Ipfa>{t4^S($;NyE3h9u^(GW2E8YM~|934pR{}3fDR2l5&{Ktb2h-j-x3p<1x zPGatMg57~)#uIH3dx0uy1_F=g3*Yg)TqztsUj7UKN*`W~P|v0ML%-B83ocD4?KouuaWWjX%(pBCUL0$`XWYRu4^(vTn# z;Q+?JEJR*EeA|N$4BdTlK}6|QO)}ptvNrlXQDsc!3TaZ`J<53kyr!?tY3Bup#kH7i zJ9t8I0x6+39D~Mka}JmWLJBmU0Qm8kd;R!K^Pf4n{!M*LC)TmV)t_8G=a*P+4u?=6 z9pga^4$F0Ag?i!eP#*6TZN-mm5YT=~oLp1k66R>)-@8bY8GqN2)b!{jaM(943XsNJ zF6?XF@KCb%JRABRw3U5#k{-C+ef4oFm^Txn2m4@6IkV^ytg+HAXgBJ47r91sU&&!Z{#8L|TM}MY z%>zhFhCff`GOo^Hr{&;vjQi&>Q~T?K36V3W&UYx&h!|JE1YCANV?7H*vkOTDAT1A0 z1Ax+mPiH~#URP`UV4NHxQ{v!M=iI>I!4Zqh!>-ouF;aY+fFCU_&zw$6@#$AMvhqNC zS=asght^*DwGRQTpA}tpsjt)(6Z`8b-lKDhO7YJu{7am?{mkWQP}qwc5P7A?$0~!( zy>_x*#|CaI*g|-|T9&I9mOo|LQ4s0`n);k*qd`3HWIx5E(K!AOS||<8~H%g}j=g zPryWZpcHYkHmM7NeQtN%@LOZm1>*N>ykrjb>`p(>KcAaf!JN`(Vt%7!0Q8vM>uW;{ zx_LZI2niza=l(uY;5cv+h_mQM@){jSb+Wk|h&ezW)k)k{XP75) z{d~UH{m3(b9pkv0htm>E%c7)l1?L{PtA`ihmC;+~Bz@%o&tEAKSp11cOWg9ESbG#P zxQi}(+}Zn|8QG=aeom>z`O`(2jRyz!pk|*1^#E!QfphvI-^TgL4#|+*mTMfJ(%WiY zkH88vo++=xAK)pYk+{8C8_oXK?Y@D7)ufz)_e?d~LflLMeHl>hOC~+r45ucNo_z+X z0fr+1iDn6)U@2$A;t#!zaENmIqnjd%P$!sq!B;6j5xGQk-%#~A4)USg#G<+z}O+1;v{-PkP?s%YK(E7 z?A`g>k88@&t1AbBOL9&zV&~(|WVd*x)st^FE!02Ie$(5aU_Dz)V!>nfy^HO@O_JHX zCTW!NxnKS~a0ZX^G5SPw#kv_$rusv}AX(hz&rjGfXQlAy?=N#?n}&NBD{;o#!V$0* z0quIo@aD0%nMM}AQT@-Q@jY($azc0)MQFxIU_`gqjkn1gnT8LwFW&@gh`4k%0R_rp z^TAcqq{!8zD%wi@bixC&1%`BgBsq^Vw^&U_N?ZB0!Vm8QTq&rD><`lfE(gJCW`WQ` z(e})WzdNcqKtrDplE%#QRFEn4lJuf@o72Q$qiK)bh@{y`eMb zchl?rYE3D>M)|u&H8G+(TpK6Pk0BEzC=>JLjum#R?oFcGZo6Q4b}-FUlk(~pH911&!6iWDhJDxbR|kCA(c?A7bxZ?~xWGxv zuxnQQb9lp6tZ5u^wR*KP?*WNVdHwJg(EBH7E=(497m$>Oi5&1QsW(9uPp4-JxAU#r zUC-w{bcUb8b?`|!(0)DUwS0gF`-}2(%9(Erru=jdg=Xe{W$Q&c-`?<)#zSbunx8LH ze}d4K9U@0>lsBvM@G_yyaI6`2>?yp^@-$E2t_Qv6gUT1-9@lK%IJW7^3;t)N%lp?X z<<-IV=f$YI62u*~NNp$DaXZ>lYDrIekMk zA-X>ztd>_H2Ccze(c8H=w?;K8{#Iy)F3Kh70tmw?Dsv8O9X97K^rbIhh{q0gl8vE9 z6@~94yP(_BH#x5ZP)WV*C&6fRBBbU%4_);0uM$@u6NXg6hKTCEt^w^1_#DL+fi(N` zyh~s}+0EvRUyiLl;%09U0ukwCi^S1PjJxx2wItJPV69;}=Ow_Vz4G$-ZNBe} zAE@3}7QVR~dq}oiwAf+ERS7F!|xccfON9AOz2H}c=Yg}+^#}N&eZGNm`2AwC_yh&x3h9n7>_L=a=6@M2_JE{@#rd6E?acIua-&Tpsj59c#)uQPs3e)@Oq>(R0^ae*b8K_E0EwRadTU{>1@FN?x@WkuMCKI_5cZm7JSI_i|KBHU&j}&Tw zrh_k4T6zU0q;Qma&D?_O;kC)NEE)_K8ODC%0c17Qm3om^2%xvGC$=PQkc>2q+CU%3d(uq)FcmXJGHG`99D*F^ z6M3rFUa4p@_0ETseYxc1r8pJNjZ@>xtq2^O;*_?K7*l}r8s^Qk3CG5;%TO-(iNoth;{zOH_P5Gp6B(X-R`S(TG#1Omn zr`S{W-B$$mq@zn`C>HklDv}d9kGO;YvQOuCm-v>!G3uT7Oc;MQ&fb%6{HMr5&|3aa zG24^2vh~-s6ka>ADJ8kRYUgwEy^Yw$#9BUwoS*_X7?V{$ry!6pI_1eaGehIg;^r`r zSFC!u3$rsnAXf*?5lRjWEncIh;`KfFFYih#sZ7=UYDYf(`6Wb*U2$Y(BOp0;LYf_z zj-|w57aNuegV6PPS6}KsDWfKLW4DtDr8jE(^-n%FjmXpciNC6gDx4JDK7K4+W~?fc zH`p+A#K1nkCV1#H7F8Xh>?y!k-KsM%qEl`J4Bpi!pENCkId+TjDSk|!!Sibmj*;MC zuaA$t!4qO1?QkhY|I|UI|5S>LRc{cFo{fv`=a^^3(ppB=cdKL(pFXOhkXNs_0tOr= z#GZ<~D{HApbFwR%+J1aW3^jZfdN7qH0ks2$UdpHJ@zl8CTnmqX%qm>Wk60O=j+$Ra zf+lw2QO>|XFB9@TqT%R4;oc!+cnD{R_tNO*uQ0iLwgkU|rW+!3>m~585adM~&xyqS z7n?Q*$+7+_PZ;URf&MB4q~JWT_m;v}2sk-5lZIUPee57O12+a<9oamOKvl5MZ^oX+ z6bfV{tOz0pRVDw$jd#+dNb1klzhy&n;ftKa$4b0fohy@s3*iXSx%=0|PPF&#O}zK) z-?E<~zKe~)i3}B{(b$jg7oZ|9O}ReK2epPTpUBaU0j5@i z^4wmtxo&CCTjz;0p**v{DDOgPX;AUBTGpK_y5dW7o<2fg3^R%YnyM(wW_Pc4%Mt62 zHNuKR#~bAH`r^`Ea%aVZ@d!27eFEOcPT)wt@!pbJcOxFLIgf_j47XlQm-?brq??EGmVc7oVn+9AJOLF43AuEkIl{2p|CWeq82w&K0S zTn5beAV;2jn|}2DCubX#9ZX`qw~!Rr{TQEG+NCqGi(TbO7a-7 z#_3%-u8?A25iQB9aJ(FuJ^2Amr&Y5B|})p&igzdTrVMM}g8)8!O&aP|Mm zkCXPvIk1757qS9IW*-uQTd3xCvblh1;&w=?G{cn83_sAl_yvA})We^}JT!K71o(kt z%k6Ye`9l>;Q@91kIPAL1PU(*St@v@ctL`-tHGcLN;7*5R(bJl0p3CUi7a%`5F|H{8 z(p*!*A#?e3^Zo;93fkPd74eda{2)R%<@m+x=JuN=ywo{xE3*-g&EIjb zaGJP{X26r+Z>wRZxp#m8J*m*6Fhj|VAf8#n>l0bz_%ew`MA5eh?F}Xe-+1VbQ%3T( zp)2Rir!xP=38Mg#7s<}K^K<;OQ)Bp&Y*(9-e9Ud=XNWFCu7qaYzt7mM39+KnL0c|( z&T4lVU7+V@I)w~SaI02?6ZC{yipGNMRq>NKz&Px1gc)-ZDy!Wm-w^RC&XH(3soCng zF;@i(u)_zkze>#I4{LX(9l)Mlxdjm^&7i*YI{a9xu z2yXso(cif;*68gayktxVNFJd_q-}{@B3HaY- z0puQcc9-kB{}hsN&P*S(e$h)anQYkdI79)hjSmPI$s2|%MoY~+-XSF=U*of~o09|= zeY=L7#UbAXYA3{Yr>tMOjXpl{!%<=zHMt3>GKAX1mBnX(DsYau!&q0nv8q1_(CpT_ z*b}Pr4NcJEiS5&n2ICzNw9Z+Xg`DL}TXlw+L`P|S%;Ylx?5Sw7S8Bk2YtfQS{l~~h zH`)8~RAeOv7!t~jKUMT9)1waAPtObohV-OrV8-h>$zov%`vhvb_gA#|;=B=;wyoAA_neMGu`$0*CJgLm&*#pAVc} zf@7o-V#lagF|{QEU0HluXtwd?PSWtFmGi2$2jCb018Ao%h(c;G+Qa)mtNC4qbK|Tf z$S<`}!0BzFra0!aQ5hObM_KhCf2%!K_Hv#Xn>-!9kW)kK4=bl}8ZJmZTRQzTqIPH0 zd{NL%B6ljH0eYSGgOv~otdbW^3;BE zX4B6GEAwlCnY`+LW7f-?bJ7OF!d0BIAk7}3oGZ>n}za4F{2hDiXJ4j#qYSN9DGlb zgJ${R9{^1?mmOwu~_xB|8Z{l{gHB>#}A8u#{G*FQDzNg5{?>i2^ zRZ;O=3Pq>SG7^v-pzbB-zh&LP_Zmp{X4<_8HwC)^`)3{rw+S1cc<4-<%Nv=_0ov~& zb_vI2HLH_~gan8FT~r39!GGaci$S(=H#ZMowV<-6n4cJGG#d?10Sz|72whzRG+de@ zUUs>x%+r_uek4)vGDc&4+&*Tc4n3!;v9u6@)SyiXN|iiaqs*a(IIK82zlU^6*{wsL zI8)vZT$m-_YmA+cxCKH@k~waZHd={Im+8P4e1nW!gUOUtfGScJt9AKPyz7u;xY?#X4ioHOu(Ts75B6^%9hFhcpPm%~=cpUFM&ch#|eC|;BUoO)Do$g$5{ zKKK(b+&q_UEiC?I@@IthE9L=qEH1qDJe1&9+mKW^fLdIUa99OM(#gwI;*@fC4(a(i z0e_uSFd?=A#Nt+>TSMAhwFS=9Rv)g8^_OtxuC$s0&g@2nQcAV#c>eN4IeAqg@)ZMf zs;Qs zv7uH#7Q!c*GllwtuDuXlHNHTp&L%F!S~K0jVr&@UbwMBK?hgELj&8D8`w8AI6ZV%f z)AzV+XsX18*7}o>$yk5--FR?J7~h(Vc49Xg?F)+sr!>Mb3LU`5BbBEu9VQ|vcH^H2E%_f?D#ssBhOvE=p3pq>`9X%aH+NfK4$F`n2e6QP$nTzl zV^}yGp7q_1vtN0z#GOwdpYq@VhRMk1{g-l3B0qDtW;5RutBb8_bdLctdp-s{l}cUi ztUVjJ?uToLvjSeBw$R1D9*OBs=ddPqS6s7)P}+xQBI;P#>)F$XP5okvX7;`D!Ec=E$B@X2urMz37QQJGQKr00ThG3;A;u#!WSW8$G*$JFT#K}RI zzPHc1cRcAVLDHnIi9M$VZ}=#@wu8Y8zBJNJQA`y2mywmJ-i<3Gnts$LWQ1pmZ+gdc zQTynegPl5AQg5!(-}!0Q%dEjRmdr7(881QJ>mar@?yC>;9t!R-8KNVPea}Uo+8~F`OPI`^WS5iN;p_ec{B5@HT>VFRstoVhep1@%js4+`HoWk zD%`hU+S@u7xhB!h%fxFa{nZycY9iRJi}ly2VtbwHYjchzM6obl0(PmLfA;saiM%ro zv^n8e%ho3v30WO%16pdAajreZqU*b@U}GK~cJ83XKfgRSq9MJMpaAJ1e-QG;);Hb( zAcAsC&p_6C$4dS4xbh7-=2@qVP?Vf78Y1$>tq`l{$Mn3>q!tVP?al zc0ADL)WaJ;YInR{VCV&*KQka*DJH&=^ACFhtk!Rv_hF27!qhr75|ICQ)kt3E)k=p9 zhU`~>XAJxZV7 z`vOZ2zs~%0BS!9_$m?Y%OP1_yHe)05zu$(uGJcXnxG93&g+T;O8(>d5vyj!DfALGz z_6(tNiC*(YOf(Fdt_lN9{4yOI-;;juq9oy@Xc_Zc|D*(nvQF<8mEkZllBYNk|9uyG zMAy1D`I$5nFj)V08OQhWjVw-h{SZs8z27LJqBo`5X|j+b?Yd}Z$lA>r%+hDUwq_00 za&*4YgbEYRlA=cjKZVTc zb&^zegCirud2pl#c1Qfi<^1D3zaYGIk^gs?PYWR%f-%l$~ZsLH-KNKqh@zWDPWO{ohq18Niavoa{~I9uob9nVQ^7UBMxT zI5{_bv`gB}Zs7VM+nP>ajo?^$@kTXG%-r}$(f_|dn1_s@wIoJkRv_n+5I8IiPBzxN z=3`%0>m*ej)8bcoDC6s=9rB?~I>$sW|9_hoaIp_xm2D*qwQv~g4mNh%NO zUzF;|;e_FQc=G=-b=3h;ZcTrKP|_6yX(XkUZcuWi1f)|^y1SOE=!)c0(kd%TcS@{+ zl7cP`5+dP(lr#u@hx@(nz3=n)?uj{b=1lx%rZWa-gW5(Z(c7GvJGeT~BTC?5sq%{} zvPT~o*#8-3G=d%~1!dCqbI(AVTH#-SHk4*fcF=dQGr8W2KZul_bVx4jldu~T2MV(q z3MHcZG~XxrJ*$X@2hH4hA@j<`{;U ztz*Oo58pXyIKumzDUxDv#NfS};&hT$BpojfmiJqUMmOe#J>*z6a7ff__AS)qoG0Mg z)8rTL7|`AEdvzpL4b{u1oLmY_wJub-@)+5 zc_e{C8jjgy|4t(Dnd#*|3hM}7e=%O>eg|N!tKtJX@@}}2bgQU`pRzkUxxSH9lX+{o z*j8w+eDs59pW2&Yb1}T5DY2UT3)72#?txiGDzS30ZoP%IGiEucn&yT-#9`oS{PLG4 zlwX2gh2GI+Y2zW}WK9Z_A4r22;=iA)3Z4?j4X5&=L68FzJ+1c&%~d}2?~ra=qh6bl z#c+|YgXC0O&!o{w7}-S3@KJaHgI+G1j0JHpj>*d{5fu*Kt5y`(ybYvaiCQg zxZ+RiqLi=?`q;6MT29RemqS4B#!p$3vlmT0a8)&~D?|TXL4Rp%_0wJ1dg;ooob009 zWQ@4_G@MI=q#GD0pTFpqaZMBbsSf_e$uUYC$VL1xkn2P{kfYF)_uYVf_76EvelttBOKlpp!AQ@@scTQ@dqyp0Q>#vGnWnQJ3Iy zNq=24gmcP4N)jig&2YVf@MqlRifw0`0AR;5v3fa~dy{|ZgYLYh-qTFNI_9|o(IQhwueF&nbC z=y^er^br@LL-p?&x)Vha<%xgZUxrV?qdWtpC6&v^ak>-?5C%t@9p>XGxrDFawU zLoZI0aQ`bzJeDzgc4|HX|HT4`<_)atP+=bqU*xPEX%k<&My)RF75m*SdD%Ap_l&I#p=TvWEi8~8+SzT6){JX(oM^` zM1+r~s=N7+X>V%0-#c`7)!BZfFr3cm0k0kjXs<`&ZWJQz?Mb?lJ8`0bU3ji#`wv0Q zmXSwHF1``6Q?%RPnyknK8GbkUMN7fyRXa}+Rl1Zv7_jbaNfM|}l20>gb29h289vn` zZblXIQl>zw6$lxIBOwfvm45=6H%~y5rz~b*j}Uw)K|LM_hN6M=>?-A#)Mq#vU@gj|<|@Sk|KYq+z22o4e(u{h za(!wTBq4jG15eQz!fWBl#%#uaSCF}joXBw+ zgRu*^lQKj9C~~mo-X0Z~!b-vdg=Ln`y#)XH{{GX1<%26Sdo_?? zF7I&FKhhk&q;A4Q>1oWf*ZiWyG8-Y?qUsefPP+ofD!x6U|DH^WU-T`R}rKdop3+#>n=CFLwXFe1|UsWP4iynmN|#sHiRbiaSQc)NmyLGZ2Av-Ng}wW zNh}rSHun%WD;|3~_d;Z-8+|(^m!V!zVKh1_0bSR{I1!OX>{?$8jEFK0c0Z%Xg~g8G zY2(K|6s1^rMd4u@`4Gk)1kI3;`Il>IC`gRz&C|%93DZ##p+D*B^ z@*%=c(GeVWr@<;jy>N*Vn8m#ZVazgiBo+g-jhTFK2Q6FA$I*bDZz8G`D|=8K%Sir` zi_ZTndQ>gm^N}zzbuh|{*CiPX*MvTYqdsy5)<7$jio{2?I5|FDUD1BsT+deUncugQ zV(F#|tVeTWU%wf~G3FkWL2nl)nGDTiN1P6e#U%t7`;tP_rP9EJs1TT@MNZeqL&w zaOdFl*EkI32Nmj`H?lBLFuz(UFa!6`@z=~G`*V7CpgQE#I<@`ge>~@V_o}uf6*Rqk z2N!`0GgWQK;Aa26SOUEsIzwHebMro3rVpQ9L|KXu>M7PttskyT3w>me`-c#tHV^r~ zl|tnkAD{APWMFD7@d#|lR3fAyLHe;obOh=dhh09}G@#Q*QJTY;scNta*-YFhqhk1j zSUEO#p`rfp~~We&&DZepKq7 z;CI(Cr?~eoa?bM+Q?Q8;Imj%DxE;+D{0W>_qjN?j&gY|yPA@{vRDeU0)xS~@GEe!1 zcZ`Y~IKci@@)ZU8AQM%EihaFWW%LN9grT?CKCV_0aE_62JbN%*G}=Cz&}*kN(gnGY z+9}Em$;_=6k_oi7FZkCI>Z@>1s3{lK0}?V-=uUnz){t8P5v;ff&AXKc3%~z(nZl}A zfCjiz=^Wdq$bruB4{6LIP0p=_5&?)o2RVosi!&VaVJe!Hj$%W?nIw0vN`uR=3ZUee-7XsLIE?Ci!)!t4k6S1sYWRRB%8ZN^aQ!D;uU#hnf#oV0U!P9JyC zUJ`JvDfQKRqwaS}x|bMaW8}Xw^?~^8KiiqWu9`y}C~a%9j#{aaQAs;Qb455A&b%3a z$ih5@2T>)#pOgdyCsJP;qWZ+@><^_O|JvOt{4nw*0#Q)J5B?-dB>6Frv0x)(6W_67_MX4>gMnQj1-Nw+&F ztH0EXahg;WZl6NM!sdo8+_CR7B7t51Zkf4lBLgC%Qg+#WqI2B z-#ykxvP>-pR{!UO-+Dm zDTj*-<;foA+>{X-DKXFqi_GP&wA3vMYdL%JUnZRfp=aVfqChU4Nl&0Qx|8&?6tt@0 zxN#p1+pH;acnB+k4<(sqK5}=he7kT`1WzcteZ-XQQjs*VL{{9z^|%l4n*?fCAdm#; zbjkmoUd=tw`}Y^6d^+vUIL$b_pHvB4jy^H%xSisF#oKpFTFW2-FO{a&`KjOX%Cb4~ zq2x%tr)w>d@%KLr30_a&>;ipN)ZOZcDs%nEzgUMHQ480jh!3Tbs#fa%_f4O81R66& zJ3~Yuc^_N3OD8MUwt^kEW`k5a^+3xm4K4HWPcLG9ZInm@v%eSRlPcalLkkv2!r18{ zuyUwy?(atIL8!XU$(~t)LoB;v`Sfy-q7~534h4WO`&s>U8RK*+Cy8h1-RO-vg@im= zBYc|&^{WaFJE=J_kHn79wa*w~k804pSYQ*wb6orMw+$u|^X@Bp96qiT^iI<4k2Su_ zSDY3>sz3WABs;u4X=kEP_8EEvRgksfMR#bi6~O1Mv9+Owiw7;0C_lEF{MpyRq>C$P zmY4v)uEQJ)_C?p9Kn?LP=D5CRU9Zpw418C8Q?XM_%v~CpG6&E~r)hXq3)l2zgw)N5 zLcGZg?qgE<)$AVUgdyb1mKJLWKp>Yz68U^b$TIy+Vs=jGtj@k~}#0)1G@^)9df2OY>s`!lrZx z6AVwBabym!i+=XQny;#zu(>*%Tr`V0>%d!MQtNy2p3l$~$#fON=5<^gtR#PaBeHo*rstjdOwNBTd8+J=gS~8kNOWk$3PtVjk9OeINn4+dvY+S{(AOt ze;S4D$Z$H;zy#uOv8WIm&{c>vVj1$OPsq%S2dc^{lQYVc{_v=(e6#LB$8&0V)&nWL zdfS+4rxfS>6~y-w1S2hCkaU2Uib&EuL|P|UdUG3n5TYty>uS%L-e&%OELbV+bHvge zl1kTd?lmi;k-I>myt4j}M0xWoapK%?lN1I|qt{CB@MeIEk@Umv<_}}9;_YeXByjg} zln9?-Re3265}^;Zu^e`{RGBIMTpcf5+p3)-;3g1TW$55JX-Xj4=G-W3j$DbIQ9CJs zdb)Vgxhx7D2|CEuqtN}-6YE?kko`Y?v$Bs$tqu>D!`Y2LuBi2x*VK>fGP=}st>Cnx zIisI(&f9Q&C@B$(Mf1X!Azm(FfdY}XL86`Ee!OJLW}Dzk_n_Kz2sK3h$rfu zfgaRv2RRN+=1lQ}qZneG3FmwlqH5~~Z=4y}#NSicO*62cPZ9bMZ5pv6wN$qANJq>c z<{eTP_?Ql{3e|&p5_<}?&5(WLAtV%b4c&75s(tR|pJ)VzWLwedk&hF`s1DLtw03K} zRO*R%Q;@|Jyy|H+zYERom`3M*bX3|-S9;g5z(ZxWivA4;j+@5$H0>WS+GPTyS|BxSvV@Jja|e!+W%A!F8d2k=ucby8$A#(!

0@eMY ze^{k8@E@2dH9DPeoG1;L9)DZ8JX>ZT4=x$ub7_+mIpp#7kG^dKSp2vLL5MicuE*R3la&kOmbUfI(Wz=;R@LB<`!uriDA#1d z!iWlGYI3;yx%oqdvvGqA_C&y%7Qsf`#^VywXTO3yhv+1v>L*X-f_iNmkS?v}lE;d` z2kSCJ;DsQnsEYpT(?TuZ)k79FK&Lc1wYW|^K1y-gnS2t7kQgz?3SM2!5O^NB9tMtC z1)r-!-MzlttiAT_4f9MdH0h=5BIWlZ?X|d9f)E&=j+Z18?dLz)T8{!gu;8Eq5njTC zjxJ`r)1#q?=@-E}3dDw347F5pB%Ri?iXeD{-gZFob~e+JYIEGNO;`!0yvRsXDsU*m z%4e-?bX;@0InSRalCm<%f4lv8SVfIbKkw@(y}J30fVKJYEL`Zvb}5dN+{eIK#2eAsxmF>axpiKp^m@KJ*3octUKe)XUXyI<6V6=kO8 zvdYLFN*tTA9Qz`rdA4C#7EaxS3fqt{37<~dX&%-HN-igqAjfv6v8(ql5+WikS24ZU zwd?2z0pVry2eJG6l!P;dLo%JVJfX$Y{Z|4}>lfEgtV$1>=dEk?>JBoJj0>!LT3^5O z;xB@fe&JH1B59V z2SG_nflc@vshUd#J=BYsHKVD77YfXc8g8q5sclEHA=N!B5W*V)wX1oNOsz^(G< zw_PAyV^2mczh>$8-)nOlB~gy0KfKj$ka0qz(!hW$UUxccF!GNhEoJ7^g6-B4Nf zH;d>L&=@2NDtv8?!M~L&E%(7LKz)vsw@M&s@-32ieD~R3J8k4RqCy0@J!lWy@GC`r ztLD?zyOBz+DA*$N2b~;HV;B z5!w75znNJ7jamUhRs`4dg>YexwJGnb-o2F@ZvxQh5N!U?0G54UCAyWMzILnueWTu) z&81^88D0+}O40V3#}5{Mn}FoZv(d^+4uTju=qzy?6M`Bb2U;-U+|_{)-KS`Js2ONQY=@=laE=MPM7fUwTM%#(V&%5W>bE(wmMEc5{`t0udMt zPu3g1TCB5_6r&peW>B?6?=*Z}V%m|xDZ$TpU3{MXsC*2N$T&HqK*&n*hHM-gWFuqv zovoK@>8&GFGx=t)LDqp2$TbMfKu%T{4RFkF;kI;kr5>(o(lDOEbMgxORaE6KNM8+h z8mZ@(W(bZ*FnX?rI?cohpq9VpmR1RIS>@HdM>nQ;5{0e961a#jMjB}g-ZLP&w8xzm zXBr|AZdgt_bDeNjEJ=&FmE|5ryeWzYbwXN<@Yg)3?PNdx^@JXNoXnFs1 z$P(sBGDsxNxDKA0`Ok9&t`jx2^tt{U2~(|o0Ag) zo{nY}1sqfLYja(7*r#ozcS4)6XMKo2s9IS=d{^}T(gQCFDVW{>;t%AmZ#8xwW&w$! z_P>9*;F*~!MAQ5_!2&DzIKN&zt}nWkE22H|Jv9WGK^K*Mj0~kHdNj0+q-h(gmuo)$ z`60}M8&jTEtK@PG$s`cEL6rA(ca9W=ea0Q3gWuL%+@68ujLativ^o!mQ`V162b*g) zn?F=-osq};*AAfjmMLEBj-IR;MH7b$1#l+ zWd@RtUI{^z7LV<2r=1`&PPV2VUGHUXEs7}@fzII5cFf)Kurx@TJRLds_?wtWHzT6- zw(EpU>}8T;XhyvpKOJpJQ8s>w=(`QdS!+@SkHGkTdp@0reT`#siM-WgH&++1M#)1^ zN9OaS^-Vnqr0XwDI+k_ytKOuWgX4@bR7v+N6kL%uM3MR?$J~k>1ib)pL6@i44b4!Z z&D(R|WRDmOmU(lZUB*-t=6-ba>dtK%kwi8iWexD}qDfO$=FU?0=wD(57y z3Z&WomDp!Y>ouZCDJ|L5dv^}ausz$7zlfRX5fS4Se*;ThUg{XZPAP*8Y;5GX0hk4e z)lO0`>8E%PO^W2VU^c4{{>Eq^DA>ZMV)z=G#Ox*PF=8|QVqx5U;1u;6!v~z}mobsZ zZK+Dq9mlk%BP;A#HX{ccDXhUM{%XnJ>nJzfCoPJkGMrXFG~DE?xfHBaS%NLd{&^R# zgUiVJ=@z>odDG0$fhPR%y`du}aV0+D!-|4>n4b;2K4T|DqM_mI8^#sq7y->O z^IFm&(zo?KdySzt38l3mYs*aQd*aA;*TzA0q`A36zrvGR(ms0R@$fxC|lq~k@>tjEhmLVk>n9s{)&a)PZL}l z+l~3ssv@XeK5QI|vt3^ws*^6|Q6d$B54cyhoAY_xX`?Bs^%)9ePwU7!VAlk(7b@N~ z*J8VCoASun62)RreSpP9sfjuXChuWUvj!bEEx*4Rwo=+By;^w$!h1KVO+{2lJseTe z5K+?!HXjS9fLm7#5BKKrBhigd*!LaqivjJe6VY?91(Z_aD}WmQMnnw*`GiX zJ*y&vhEjOTv`1+fV&5f89=qSkhqJ$dQ;SqzVKgD)9Pq5{t1s` z4!3!7?=SDsWdE1g3|Jy@R=CK@-?*wH?)f}dz?DymXmiI zbaYe2^<5t@Y~Dh8dDO(^<4Hz!(!clUy9Eeh%1QH};Y}}vkDE!msiRxD>vG>uEwlz? zk1bAP6vL~2Z?eE;&eIj0k%nX>=NYN~`Cl(mNB zk&Cm;O{6TXBN*us)XJ{VmRR^s7mrST--?5w!8J<252((sxxowNQ% z2H%vUHf8WatbbiHv>LkjK6`={!m#u1b6r*3ZdWdtPkqgOwVbD-RnnCcB=9DgkrUxfsZ65U;$8~*J>h4o1(w{A8=2JkjN;u! ztEKVadL0UEa-F?^bn95ZR9Y1e`7s-Fk#RMFr-HP-{7P&qG>>H1ir?7)#@-h#MfbY1 zlpAwOd7$}udZ&zNG)ObLX;ETdtW;96+$#-K?{S6(4Ug;0D*8(u&diJ}-mu~&u+OOt zGoeZId%D#o7jM@g_CHDF#YFINZEIy=mNHb^42$PAEg_(2uBdlBL%90X%LEQY7= zZTXyn@==NV%%o#w^EH#YS1xe&rpO+T)O(X4@L3}X$7;?_0^ff9o?F$PVAhwm(qnlf z{xb4ebOuc6ZB;fBz?L`(OcM28Dj0vrW)b7NpN5cyt8=?LoBA(B0{AehpnCUobze)KV&R(OJlERz!wyG%0 zvhJ6g7q?pdY)SMF*A=_VdyvCo?BM8deY~^MTxHhex)x-?a?WvJe2og(1@$T^I#gVP z!rCg_)3El@?QinJN|6*O@es<-u@KGgx#I0-GqX^y2aSWx^7P|Xc1*J(d!5hgxTe*} z$nr;R8>mn_CT1br&M1GCJxF&8q0LO6UdxsR#(WtOl;pZUBfGd-h7&S8wFudWQdd)DO2I%0qPd$LlJZ~bLulq1a!VSibSx2L( zVM;EIt8k9_F3gej`k#&~gY8TQrU}tIxmW-a&jff^NlJeLL^G<1$asGj_~+aTF#7$p z5VQMb^HqdK7PU?e5>m~=NUymq4%z9{>e&)8WhXYh+ZGn#3jQc86X(1UuA*r}LD>id zqrX90nxBv}I}sy;)H(&C#k!dseyWgkhjCfmRe6`*r4ij4t>NVECtOq*oO>L%u&}@9 zdBBUWJ7|pa(6zf!-gB0bvu~QqOXx;RLxaN~PJ1eo-QJk8%{No)v`0<|8vW74AIf|Z zyBIqtI|z>?Ej9ED0+i2yvrlJ4P$zwZCRs4%eY3e=2qNNT*7B@3JmH9Sb-jPE09DVA zNi}B#2^c}nmWt|GH>UUe*$O-ac#6^T>Pt?p+^dLVX#T*sJCN!d`&@nv$mSayGnC<+ z_BB@2s6Th{V`2?14B#y$S{~ro;Od3}R|`V3`JL%EZ=Mbjiku#KP%H9&;hy{N6VA=4 z$H(Drs^QJ!@K=dI;Ki$m*51_T%C%_WVf`4$X^=Wjk^2^o6SvxJZ}WB1Tq_BRV_lgJr*))tFn;I7Y3o$7<7stx*)=_{7 z#-hAaMoF!wyz|Y@A;W(Bl71IAODH-rr7;OS5i>==k9GvsH?Q;M9jC^~xj0yLe9%~i zxf4N-(tcAundTTRl!42Nu!QwZ&ab{y0nI07RNCSVv$HBKn9$lDLeLq-`-=)Z(-u7q zj57NY*?zA!?J?y8V5zI**vlSG+LPEC2~|8bA@D_`M`U}&>@A_4!#2BU?OFN!R7aza z`fZ6qb!@v%+~Cz~@1=YAj>tG@;dxCP@953lc)Mu|%Gu{H<9&7%Ak}yAud*ihSlK1h z;OwJxHq{mbG&czQwJXede+vV}4%L^o=I0sr<7N+y)@RhVeB@YA?6 zPRG&FmwF7@k}+6|tAEUarz>bdleW=0&u+kfwsdZk!XvJrM?rbzuJc?scO~%QCM7}} zoFBX?LSigWzES;gE37Xy%fB}Gd6OSFpdSYscL#VxwmiSvz?$sOu{osuS?8QMns~Mz zlgY2Z9jc07TM(*}EnTkvvOLaVXEjH-l5IxCY!e}#qJwwDk-E9gFtDFUJ|HIr#w({r z-1j_(L>b_I;;D3f{Mf7K%O~kxQDsjeT~c9oM|ts9j{8>wNR)HVouWe+f6C1X;476t zV%%PjMBQ<9n-wil#+PB)HK}AOrkFi)$^J;I$c-jMaSf9BRa~zt2C>G>mn@{p?#xPV zF9(amT*TLUuo3r58cQ!oPk=(w3S)~cXw$OCfn^L2msG|Q(MF6cPbo2+pDIID`$?ah zgmZ#`#)E4BUA%pr?W_u8U5A(1Mly(y$5yPC?aT^9<*o;hgvJ|=)SZ!1P@x1d{u=Qo zS(#=^f21m@M`p&3QlZtC4hBJ#GmHwh_d0a%_oPGj<9IatAa?hSRo}aIu3Q#GJ0wrP zice400+?5cXfK#o#dvCk8dF!5&`uMuU3m$A(H*gN*^ActSU;8o@+uZB1&`vG{kBZz z1`Trb9Lldy46+4I{PR!#&DT`_}0YDfm0A7=9;EO%)(}jUuG&2E4K*~mcXjDxTfh4Phe+v ztBNeg));Z$Vm&M&%xU)pN6QC6wo5=qG|r;Qt7ldJ(7e{?53#9g*2V*TO?QKy=`?Hh z%lI~;FxgvpfOt>D#@NV|sfC4IvygD~d&Tq}qDj9Hdvo|Q#HD~}RQot;Sh7do-LmaM zV`$Dcr=76NuH6Xr=ZBN|9djeek;#%`HCIkk#Ptp8U%coqMpOZ8qlvOnZk*ZU8YP~O z8JZHgU9C>nW*4jz0u@DinC|T7U~SYoLqJcNtSxMf5f7mPv1M4i7C-0qRh@^hj+Q1J zulZiiHsc*-&(}M+eAUh3cw=wkJ#IBx!@+&%`22z7&f8@Kkh`8tsPABG5;G{oCI?N5 zcaol&V4TIIBb%E($u6wk2p&nCz45u9LX(CY_w`D)i`^@%D_fUl^YuPWkdXw6x0+OC zmJ=zjL)vof*+(zVmIb%%L#iwlZMMPzQ(8JVd|6g8|LMmZ29?>P-#lgG#MDv*le)kU zEk}FD(9%MinQVEh1B@hit_jkJpjTeYf#G_ojGp;A)n{f8>#)zjCA5a}4-xGmCP~)Bx1? zB}2A91cd*6xS0oPQ9#rV7B`QA+GzAR_q=!ACUiakW@#FPx>YQBPA zY@&4l*K=|Xm5_l{V=`gvjsep=x#z)8Nm^tOT&eVn>KL$Kw9IonxJH}p#Exz5J>VFV zuyFivba@V|{iAaIKsUzEFO5eM4q`DZ_G`&m@9Twj}`~W6R9)Bl&+N zVeuPL1jy3#xmfzX_w+$4DF8H;m9Elo8yy`)*6W*Q+~a#V5<`)+p;c@k+|x|(wk14Y z4#iJYC;LOaSDwE)23&15WY8XQf!!;&C^vKIed)Jl)T(Ih51@pkeYV;EUgsd$eZ}6C zl*gX>k~4~8i2`7Ym_B+%3w)Aq=nF%AgXARnv5zunh@Psy0I8J@j1L3QSSAJ~xgPFH z!3H0Yo(8e|VLooqp4;XG_`cGyaLLyZ(|_mVjN2LJB_D{d^nnQEhF9if4=bdp;ClYo z+GbSIiOYk=3(oQPRriO|H8)#b4)`pG8KV_M1+ z`CeCV&P;@bDlWxk$?fZ>kx^#tv5E;Dl#y87$P-^1t9_%n$yg5n8?ph>=o~CJ?iGcO zBPd>KtbWT3;vkvP4*NT1^D|O%Da48j#he^KJ1WtY5Mo^p>24f*4VpXF+h6s~Oe;_>P<;i&YcPuNaTpwG#Dern%D{4h&k7@= z>dyKWh#C#dKQ7nfu?Q0KESfz8>`RFw-RwJAL+TzKY`UYQ+ol6CC1;sPv_|c&k_qJ~i zm`QLL_bFb^ru0ncn9HAt;$Hs{h3F#!Ee!6-Gd%>#G;{CTq=>24`H z)7SqIb_b-Pq(=Sp2b|af*wCya_A_<6_y;~4jJWPZY;h!&d{n1ja~9Osa!=oso`w9E z{Je}uI!<iPc~;Z(#FDKo+j=e=OAK(M1d( zTbW1op2w6fzk`R3c7zp%MFvT%#TNYZAi%N*9n%o)MAq{2MdYYex2qVP`g+kPpZLB{ zVkJZy8g6cC&vo~&4e(>i(P++S`gosausq2J_YY(dH{Wz$t_oZvN70(m%D8e%=IP(H zjH^-T)_1xK!3vH52=hvf&lLRXW2_eEdjQu_R*|GP~OH6}DLc3uhS|?N` z3BJCG326O?zXGGWpv#Fqc|eOTbN8M8+o&zQAD;tFk~;?jQ5-!CI1~`836y`a292{F z?pY9aLV-G&6N^Edib~zv?*oS2wht&G%%kFt%*pcn*R$IkP&r*c!yJx)_;MdLXs53q z-l$xe)LX{As(uzhI(QKE2;3JysC`;rZq7x)#tbU9cnPzhJu3-?)gEjQv zh8<+#;M>DWUAcfbKVQp+g7Q%%MV0(fHfPM95OWM~ZWsrL@f+S}OtBZ+^x?h*o>`tG zYedSPY5pqYCkd~BTo}L_m>Pc$g2o3Y0NNYZr#;;G*nD5VFmUv_O50If6Nw`OtpH?+ zQd*wL%^u|Ky|4G6wl&2F6O}W3Pc0`_F2@Y-8eB*pWBVli1|PtL*uENZ^XuD8{!x3( zI?<{8yvymAX*P=#*O+~^F*>PnhsoL)MG@DRgZd*f&U;np;PCi0J$WR(*pWikK7`N^ z!`QdDWG$5o6@A|ev!F80%&aSrf+l^qPQzWI(aB#I@34b>F6PP*6OfK|ixyCq zFI!oddAlsak@m7`!g2T)*9H{NHdUv9LV$!=o$c@gVfxxb^AdkrVay!4Enbp+X{x}=brP}#P zV(%s)^1}niN|-a*j@g8KeN@Ht9L1$cEB@_uLx8h?L{x7BJypPReRog?7gX%C zE66&|)WnqA?F?R;Aw5?Y)PYE)%&nZ<5%TTOfC|7b3bRt$vdCZJiE ze!5*gap+tQV@o>a&+f{5P61>P8)EfJBB^@k=*J%~5mg$hrL%iiwH*2&49-73-I6bw z5gGt-`qlIq9gLbcrtsdW7Hu?79=WBj&LfTmjQhXQsIz#Fi^k$?Ziu(wA$q2$8ozk#y=B zP7O+WkX7!cDjEx%wvyavKiD_NMntf;QV)U-a#WRegPFUr6@IZBhVot?kN5Z~qCDCj zpAF7LbWIr>dK^Oj%2c1$hc=)Rb-lhSuJuKn>|T}ad;Lqf zRqP2r-ri`}PkM#^>o0#oZc?SDFOsewx11WCL{qEAkG>pZ^jzB*_Mfe{>Rl$-6Gxf(} zW*tX5Ve&Hq9kTc@m*CNc`mbqYa%`SvkhB2V~Pp8ul(fXYt|to{(RnEiCsrk4-`rW+v`mT zAG42sR0S)8Z#gWyTa^tg^gb2e0|>8GMbCL6%`hWtC`^3oopK5ddyy~YI#l$7B`_67 znFno+2(DALH=+2!+XeA?TF27$y=0e^guAk7*f~`(4_sgXdIX93wdJiuSH?DoJsNyx zQxV*D|0LPHWT1GB>Q4pM3prW(_;Bje#iXsf8Z~*TjOpGxYQK$tijgelOOX7@3!Ufrxn|TwXR4!(>MxcvzY49P<*v^u6%{MdJYAfZ3Fx}{wgqwYE}Ak_x~0GRG_s!Y_wDUqH&+<8oS51T zg>F>C=kDy8H|KFJPI;S(u^54M%ErvJwM+SwP`R-q-@)}tgC`SfYb!nuqO4qVqNp~F z=N=$!h!xooCSzCieyDbiV5l67ItU!)n;sRf>b_QAX4eU~@$iLlnGtLD5_LyB{Zu9X zH^nJLNS(koZ*a`h1av8Hkbjm^?^JlLZl@E(H?enl<@@;kFjOO~^T>ylK~m@|(^SDWGidt*GyJt7@6dH=^nOQYTCyTw{!-3;i?Tl#k;{AxxEjQ{LGF|(q=BRCn-qgLR<jy<*Wk z!d!dvQn=f;*3;1og>aE>k+C~RJezCi#_G|x{kiu)u0-=Miyj zVxJWC?za-WQSR(G_Rqn^8q{v|G)e>F7Vz{(11@_z#B+6DNk0wUXoH92;;ucpV+@@q z-d)fT3=ZU46(ypK>)$!)I zcPj}UrS}ze>qZ7<6VUnhq-_ii|C&ieMZJ|v=X0lQp$^W+l1HCGPB}UL98Rk1e|6qA z;8*6DH=P?7{glV)fQF@^x+XYxJV z@vxy8{_}kSiW&}}TT;mU6o1XOMpsF)bc~Ua_UlrzB)nQ@E5b)~!tbDf_z5UoCUGT3 zB97K=+)a=3bMA`RWLDP|po{K?3RLP$--^4iZ&n$(+x*4Si272#jLVnVAGYHQIov!h zVsq1gXGUo;k|b?b-&3g}B8ljC&8!pNh%LD}>VU4VPgtVuQTebSO<67cF_(hAK}i_P zhVjNnRZ5qRcm1x!ljL(-0)`R!Z+{b`sNQc4nF; zp0lU7ODH}YMHwnTO8JFyj%#k1Y-u8Yra0w~*#x`WQwXcrbKA_S--mZ z%MW;pSPK&r z5MK#F`VF)`I{CM<U`Ku1&R;osw&&sp>$*Jq+r zmSFvup*-!;{vfPsr!R7Y>v;Xfoh1nAB0VaM`{c3UHD5aKTdD_GOSjl$Q1^d;eKqJ6 zU-?u{so7CJfBf4Za3s#!9T$`I7m0x36vL&%>GmL4bGi!P>nAq3)+lq-v#eyN# z-d8_uV#m4&;BB^2dnz;wvL&8sPCj;znxY?OdU{SdExb6=i}W<*SHELT6}L+ma+Xw= zlo=-?o=?Gb>Fg)80-VwT7vmnT1C+M%e9ZS=H4ehsKE~7 z%tGPDI@B(vg*ZLa?CEcz3Tx6F)F2f|xOY=P%E5V|$0IDy%yPLrpe@9~@Eau`ibRO1 zo}r%!e&7r1>@Owi1#4p249Ni%3&h+ckQSOp6yDc#Bge0%)aHW%FeTAahE~5hQC_gH z`1`*BkPzBJ(O9=`%J{&3?jz0wCBSXPO%TB3arPL6N|x$Q3B+qtC$+>DTcl0o8g+`k z;L`bGXoQLzij492e$EWHLA&um(uCI&I-t%`e<>+u4{Cj}1@_#^OWbKUsg~6Hs+r$* zuIq*GqH_TVA16vbDRouL?0s_?ntWR$2a7q0L&r>P4N43pX31g)ze*rWYB3?aK`r~s z>`-5MBzD~^+A$^vC{aup?B{6Slr^nmOWQSbILL0QiAH7-|AI3UG3zQkYjvu_)N*fP z|NN%4eUf$Cj4Yg1`X)#E2(3ziY9}$q8uEwsxml3B(2Z>O)yg;U{51cYn-O!h=*HU7 z?ouIjVbHpXq*7qw=wnHAS@XArX7qs{A(~PcN#oC}te!ywM4jQ61?}UE%J0( z+;#>lv%D0Q-&1_2(hS!b=;cT2Dl8#zUZTKid1bXXL@Y(WZ?#%sLF00Yj# zMX3F2bvZfWi)psIkAs+PD?bb*y!}ai1xTv|cN|HK_$iusBI-@2iw&uz1(Jwcl97qHr*Yi5z z>fFOarLmXIc}Tu#b>pXF4n3hL?1NwDZ>kSq$4?`HhaUl7sCR6yP~l3cx4T1KO_w$t zo(=MY7_8F2GR6!Er(Ho;In$$Uvs@vzP`rls-e<>uAvW0b= zg98-s8{+)1O0Ci@aAl8FQLX-gOGh@iF$XnRHss{%byTV3G{1c8w|vngvT3RoL5{Y& zLF@{5@aIqXS0n%S@=`&v|16M6?OC)Ksv!C^$2<;wfGJVH$D$VzTXfa2Sr)4a&W|nx zQ+X$2qtb?#*5cf6sI5*+o2%EB!5sKD9c`D>??q~R)A$Pv6C$n5hC4x7o4-GIGHS>& zti4}kSzXm)@Gs9?^nr_Y*{1%Sgo6T^d$3sa4-_XC3mam#9BjP*tqDqyYwGrfIN*Cz zQ$P8Knxp6I+?rqbZ$eFgpM*E-1Z?uWkfohZ>$Ug>bR$i08P*G817kJv(=2e{oO3`v zfmC?h@_WE!{gp~)`f^+m4Z9Y~@o<)2k1+~SQXg&JUHp85$Kpr)pN&40Tz7qAGs6Lm z_s0u4L>pw6zz&c(^QV&kq4Za8-c6G^5!`FsM~9w-DYy7u*;uq6_Zo4_} z&Ua)vI3n+Xsj^;4Y<;L(M>moj+`&I^=kLjSG4+5y6xB!uuKxMw-r@lZztm`q=f)@| z?LV)i>&eDOLC2xNG~PyF-LW#bD9up&>1b1z*ij8b!4?Y@ZBBhYp(WScm3IR zT|ZJ(%lVJLZ+S5zuZwy<(b!COa6+rp{^UuUkDbM)|;K)MO%uZM^EZGrKYf~HuA1~EEpqin2;HRHc(M+yX=QSco zXc6>koyVMZ)N_2eK}i0Z3xLQssCT*`w(i*a*(%L(+4?*k8i34Pu;d|ZUS6)c4CEqcJ%H2>DGkMkBl(qqF>G~Ck2H3U^`~f>=rvRnEPa$2 zbFTMX;{fTzD&6&6S;dLZ%?i|(azGI>GtmXp>f+>TcUTSw5TKR}({>0S71i)-98?_d zY|f%f4Hou7Io)c@P+myiMeSpm^Lesf$U#M$&mV08eO19kbYhA}_Evkqd3`3Qj;H8Z z_%Y0j+pXGjRQCUv`to?FzwiH9EFoksOEe7GD{EPMXB(pIYnF)YgzSvgN!iA}7Zce< z)+|$G%aXy^nJ7Z`eg9qWcYVIU`|zK6-Ph~hd+xdCKF{-icjWAmIP z#ldxg8?xJmgaN4(u({mmn^hVHH)z|H+rg6*c@CaTleM2Kh~Qkky=5Nf{zM z=Xmm-mza14&k&U$SwzMums6b7LF_xcrDa4&>h~M|N`lVf#%RgRK(xu5tbHlf-RR_G zkaGAa=xf+EFx*b2OdN5PSeW~H)2H>W^eaqtSRrcfJ$?cX6;x3H z0Rp_$p)}}OXeRklr{C7?6lhSlxlKh16HnLdc^;!SbCCDIPz0fPDyU&e_C&S#F?gOE z{=E9R*7h=o+63>9b^Is10#aK7z7vT{jFW7T(rCCtj6zI-On9Jd$(8|W+O9sX1$kkO zjI;u#DC}ezbpA62I_FpUNe(`gCt>VOFELtetW|Yq?}G5kfIJhX9mWQ?f*qN;d%u;_CDeka;lNyvi_VX1P!xnnWzne_GyLnCDde9V}@ED@&9w`c}>hcS3MtE90qltf|fgmnQL zm=*NM$lbdg7{5hJJT5%N5J$xm^F`*mj6?xSWeisL_TQ-xN#2GG_H#WkrDpJyUZIbx z((aWf31ErhjzP}Jm})@;AmwNCPJPEG;A8M8eEg?MZ2Pnp_5RzVyWs+E~o0smUs%?%dZ^-`M=dQVK7E- z+#rNuVbvVf@ghw@mpz~>!lVMJXU5Nv)^bJDQVfz2o_?Mo^@$RZYHB2Mp}{^tt}BpQY9F7xBZM-|Y>Ii^bL!i(GYrCrsX7cW zeCc4UkmvA8@}+#4+UI_%<4}{HaH1N3eCPo9s}E{rp+0KWDibpK?g-AYqI`djdWs6! zcBfT=6b8=ExWCii1_R-}fG~}Qq{cb`bwo4WaYC|;k<6d^#Ee3 zl*+$BcU9x$94*aYE{X`CDV(|A&uSvU^h&qVjVihBgXt9WXG0#NM;Jezlc31yu;);5vhKXgxM6&` zbJ}FUEOqoljY@K(@a`>V zrsAj?hU3yJv=L9eo>FMUAw<1I{^)n-V;$m!!^d@rGYh@~8B72N1OS>grQ7SOCv%}N z@ryDD4!o&d7czH%^Tft`>&b80WL_R~h9Oa7Pl-f@)L9Q94I(2a`8c8%DF`psA#4d} zzYe{?WTN(@RxC-21|NNn`}m4D7{INxZ|~pHzJFHFX9&ZsvXC>p*CPZox7N~m1Wx6> zWE8tS@v>A{xl^sRd&5#RVNa@)5rdKAyL0-tuCIuo#t2}1v^F)eFnsNJ1?<;C3J0kA z0GA5&uFfg-Ex(VuBU_Yp^TQ4wPT4~vWd&6!a+-VRLfDhpl$T>E=FS<)O zB|y4VeC2ESO!+5f(ZY`~+|`p=Nk73uL|MqU2?|iGSryw*S%$&M3UEa&O%KUwzWn^m zhm{u#flk2X3!YEIb^_W@(2IfZg|%>v`|f2=mo4ky9xyxaLxJI1l&QH7oRj9&4VaxO zck2@Tz}z(K)klo17Gc6J_#C%k?}sP=hU5sFaX%#2@Z!sZB&(&!`8;e;)#@AQjheeVqJ`ec0Lik3tmT%XiF}DU?;lAo2`5j;i`wd%^AV)6~(=VkKiGwZA3a zc06(68F(9++8gt_R}n?HKvHa-=Yfm3J;`Q+6;ku-}voV16puV)r%C5R-G7iJz` z)mZx>10TyVK3NFp?(>|G4)4RaA8N#qa!ev$&YkvILjcIdbcT_X=R)v86zffHs=qJo1+J!@A`;Xr zJckAkA5D&`TdIs*0EKLMwbJZ;QBkijN(r*+<9p*2TkWz?y%(73TLdq(7kV7LRy_^k zc*Q+zAP6`+P*r%RrmTQiA%kuV=F0YC@eZTP?+sVVJ8k#nC#*D67uSGr;ej;_a@w+h z*;iItULb96dFsx%u`pShed6?)cc2kL!?j*~&S7SFiEa|~eG{0<*jo9$hALnkSpWf8 zFxSZYcN1}BZ7g_QWRLC!V&a(-m&DhN{kI#HdRe6g#U*lR8;z8UKbPW#vA}YOtJn)x z*xpf$qy@GfTVs)RroE zx1NeBnkFn)y}1b4%!CucjnNvL~dchgmy8==R>gq6_*$>O)) zMN3n}O_{un(FU{jBv&A|5;*nL65`!n#fWg}Nli57SXXTZDqX|NF}4DP|~$UUf5w98~Rix5**LW;KbHqSGAN-j}IaEwj=T6PHx6?ARj zSO9}OIp30tmU3$0XCF-t7PTQ+Iz2VWz54G(S8#7b^RBC;(FavMc_Slab5kq#zU#(P zM^-5UIEm~@)X{k&$kBhCE|hYbsB8tAscrF@=osDcbU)e#ehGIG9+2U9e|znm8X_&_U0sc4Ub^F}u&!E$hi<}IJ{825nyJQ|JQmwvV^j=*=53`g+x$fZ1_Lji5f8FF@ zs}>9BqOD>5z?j_2&^4Ou6rKhhg*)90ZbnL|YpF*89uKFFK6ViWp^Sbsg*o6p1NA9@ zB;P?X4+wUc1aOFyQ^ZQr3>EaG)_nI~ukergAqXF9i9!KO(WgjW%YZ;|#2@+iOD@S%|$mhK6bG+lN`(=@)upFnLtcO${xeXMyYxQur_c>Ccy z;%*);cgr*Or6x@dJ+>15@b|hsNE|hQVg))}d-EJgUEzG7adOzk+#DERrc~?KO}kN9 zZE^n$1*Gd4hHN7n$zQA{(S~6`2tyuXD#qmE94Cp2>N!_My1g1I*Qd8KW9U*iV96=# zpbMv{&y?G9{Lso1RyN~7gqZrChWl+ns#Z_*WCXBIIjifIWcMyOijo}RWBtpEwtR>L zty-#~vLAUlF;eEoHtp*Mu1T7Ynml1RF(m<47~cSDHX$146PC2~=mwpJ6|oD{Y0yY$oane|>YZO6ovm*@f40czMza)CB9xhi!OEW*60P&1E zbT8=HhL6gRh?dz7+~29m%kqDi_~CU{P5u=ZiN(Yp0tnLzH^>r7GNC{z~D4u298grP*G6I2iW~8l>?UhZ)VB%RMk+q>~k;?X(DTXM%0RY{VZ(U9L z#280Ul5x_yNf^OPP}bG3p}=J?Wp)=n;pV7(f^Bq316nWsnQXWTlZ>7a{2?Z|N zM4sI(WASqntFKk@uJs+!O2T7I3M&4in^L@yUHt^SDRfAlO(~6BnUu9 zPiCYfDp!b!M^0>Bt4u_o{2u(LQEn!Tn8P zLQOuAa!mUUS|0JBz9K1`a=gn!$r!(b?qJk(6_$`jRr!obB>L-dc zr45m`H&?xFpL#`@aYr+Q;e7lq6rJCtBN+*<(m(&Ti#SY#KizI;;`#Q-wG=Uxf~i(O z=*54KGO}DHIF6QV7QFh>8F1y-mN6-WCSgMBY_SmGL}w&RsZ0zyC#f2o4CQ0kzEGNb zT;(TCLnv&e2aKe@_C*WWQ8nR2m2o)koL-UnB<&^MWA%JF-}8zzHI8l$^Aa6w23(kA zAAUz?ipe8tU{-BByQ;-}@b5ffXRr8KiLdPMnS^7ay(J#IrxQyEj6C3&Q~I^K@|gGT z5SbeA zK`3Wcm3RlQBvXeH${c#nKzA+cc8w8wzs~3;zc(kl>}uq>wXLJVs|{{hwPbCP*veO! z1+BAzOr+Q6BLjJ^ufYkfVN&0jupx{LigNWqf;wj#;MHQEWQ`)T$l5MesNF9&xcW@5 z68`{(^LG=h?l$DHr{!^^Tgkuhd^J%|YfkjW#1XX4Hy;>ryc#1ML+))h2c}*@hQp`0 zIu_uBg}v4+=2+EcY975;@uSQ;w?D7CQ2S4YJx89MmtlB+<>W=$;N}caq9RGg1wKb| z3=>aw$we>IxK+vWc}}Q{?2ogGqZ8QZ4+<-37oOJ$BlJSPpCFo_>P0`D1zeMcd>u6B zZ9+B2rk_QwV*X=|JLGEts3;xzoFX^MXQRnBpO2Aen>zX&75WFbyJGTts)dzXo&dE( zn;=sjX#405SSN#t<`wR}L%$P&hM-2FJzAIICP!P1&yDJ`2o}(5lu$)~p_;upOi5PO z^UEqO?rzvbPNi0sCpc!`1yM%k1t4#%id{1*QUhcNAvxPQS?FD&i}(d+Cm9j2AU9$^ zFsyWt-S|)Kor@Ic8tx2n=e8O&ke`(HpAxIEWa2?p;yd2zpdr8Eb>&YyMb~j;wjvZq z(bk;8>bZ+0corUQJx#FoOh|xe4^Q8;}xg_V26+XF=fzITl-4zfNwlp zVKpHpW(ky}zD^xjsK8ggXn8=6p;aYx<9lB`TmM(BhHz8bBiVt@T=mhW^-2I#riy&N zpRBU?L?87)8hG2CJ*ZG4k0i~l(^ITZ3r7JJ7~Mb>pdtcIK%VUvZ|Ir^CmRL!!}*nB zl_mwqSp0nv4l4ne1XIKb2%2mf!Kd&-vR;X2zc6_ohjPwL1$!`K9fH!7w+Hhdr#<;K z9|9es*fD!C9hIHPch;6_Wtwc-#6O&or^=A^sZT7TwG^C%pYo~CXq3|?0Ck}6z4a&% zois43LQtSw4##LnCPZ97QNnsOWq+howO%QoLDgTpXHSJnp$NM2JsRwimbLw(j_}-Z zvLW69YyT_vQqR-h@~7|{9_6W5CZuX**rwGXKAlyH#C)M@dB4V7)D%Y`yF-}f0}(`D zuo)tbzNl2q6y25}UW97o_fN4h_JylWHf+<{ptP6S zc>jo9DSOAJ&XCVl#V9{*t>J!CqMp)L%EJ0a15&wUWF^UkMtsPGY4`nIQY)xt93Zmt zrnxEd^M38*t><1SS}#SK9gVE_50|Hhgc-Z2ej1}8Hz^y0=cpJ~Td8L_43{-7wM5`U z1ozxm(K|D4+EKZL@NVzbKubxb{?8zH-n>RSYgIZVZA5T@_lQI#!j(13M zxP>_>8)il4z13@Jjs2HqC$Q3y7-na~{S7~hZwj%Xse_gPd~{+S$HC8$gSSvGw!NDnF-x=yA#mS;WPl z#q{dl+!*ZlwJ$vm*m!3Dl85C^K@h(Xs_9Cb_rq4#IMfJ{cs4Ee2HL3h%9Vf0rDC`f zDH`0_kxIQYG#k}C1cAnqZ3pH|4z|Hdvy!AUBo3;Uk&ms@Zkl6_Z^A`O`CX_0yo|@J zu-^(*Y+mUZm21;^_+e%t4q|%Ue<3?HQPNGE2$TLQu3to3qDEjWW8!w}5(k-lRht7l zPCtk^OC%?vF7-dIiEIzPpm(o^m5;rZAXw{OPfPSW_l17Ch-dCTDf8s}9DeS;ALPMG z3kdh<^qRN`SzdG$P`XuQ98!38$Mc&cH`LOSFqFO0u++ThanypV?-$-6s7!B|K_B>M z?eZHK0>O;Ii}Sr5k_#2l2!MKcJbI(JFf&`!>&UgSh0)0P5GNTSviptI3;i4#MV^7$ z8lHN}0+P)X?S0x@0Ytx1M%tzS9LfBzrk=01#BOkwNvw4co{7H=`F%obY{PPcE2ZkU z$W}Y^of_Md^)9D~@s?ldX3RbNblayf;WWSvVY365Hud>f7Sku=aq8dpYt{2}7MSu2 zA;~LeNsY*OpRB&N=noeh8*;^Aiitq$np%nu=S`}aj#`OA?BgXL8oIsnYcOygpr5(M z4=Plmady)={9VAUf&Yqeb$5e=h4#WZ9vbmglnYG9K;>5U*B@p zRT;CI+L_MjnAM5*GW`gwI*ltK7Sf56qa4bF0(7XLe~PXKddJ7vZ3dH~{ky$GZ|1||9Dgh1Tuv_5k@^wE@1O%hJEa^E>MpR`C!?nB3 zlLANM8+P~1nRxW2uiuJ?c#>36Fo zI2KrBS%zLenp3lh!7=b@3pkq@$6wt!DxWaeO|krGLCj?C5)3q)Mckd%Fr(k0TlpQH z!})ZZqS1|Z`55{&FGM&oy)9o>XL0)(b_;fXV*2}b^yW2G-qL(UaM+KjnAqIaW@869wsn& z>F^^mJz*O$r><1*86tt-8JE1^|54Z@5;v=&GEbdIjQPN^qCg0exh9ARiM8e|(BWd? zxue?rfYfq8Fbv5W;}9%Xti}BHRE&{5XCK&-A1aggfJUER*^ScZ%E3g^1gyXxV8=}P zA_b$Sgb$30D$;rljq|PO?7W9jHuu%ZHR7Y{h1kg0wFpo=+uUJcmBGn+2+kPEXU0A! z76@^tE*Q%uZn}vLNXJi*%YOX4%dSq?v&)pSy0MulrT)FXzN070Su2H$;j2(uxsXzB z#)-A-iO&tJ4+CX2W;ZXlhHi2g(9ah`l1tC69P@E8F$fHB-MquMc=~{P=+Y;TP|ArI zFfgND_WOb?Johjd7Hn;>uN(p)mb~*E*FNf2RKqd|E6a~1j}4LbBAB?2!JNrGW}B7H z-$egttdl#d_;pIOlpW9w^jUS8LNHj!wp^ak}8|(aOFBHD! za!@ha9SSVOMIf?hU%dIjw|J^9>N|%Tof9)FDkZC9mKLAUU)5Mup%T(E{E$Vb#^I@# z>2iKZZ~z7GQF2*qUCR1TyFd8Qhgg@#8lH(7Y%+|C;Qq=G*9%tDqq2z>Fbsn^v_m`LnQ7O9I&$`d^+shu**^o z)88Edt2gM&x}h538Fqrkf+i>-0Lu;Wm8$RH4~_7D@KnE>EV9U>K`r`2BaR!EsAshX zSF;6coFCE^0-iIKQ=l`c`nMs|dVR1H9IOCx{=_NLQ>|wzJti5Ic$RUMwEm^ZEI}S`ASurh-#x0_62xV*y z)fsnR+|!Bh5{HBc&V9vhC47*!3x2`3C^lznw?DD{k^J|z9%YKN9(kLcT(p$>u`y}^ zh`ni?KfUQsz5L}xK$9|Ninuqh5GPqJgBU3-Z?RKFP2^V6y9ahMC?|#Nk?0Gff;LjVU2M_$qj^FMv#fiiOX*-qE8CMnU!NUh1j8>)(K3-dV zs2{{FdJ~O%2T2Y~Ws%nHeLNYgtQLoh;5%gUxKQe&ZPN)kdRo}I)fQw^62sSp1uo%i zzI47hal1giBaF-PPyUeaZa+-@v6V3!j%C3{3)c$ni>(Bs8asr2^N*(FBvBk%*Gvfe z$U`<$rjkZTCeOnAzGiWuBFl?;vA7C8uIpRmN3T;p`$>Ad$A!lA$ElPIT)b7cBtDmD zV0C!e=KM+{RwwR9PmxqxfwdLc!HfAGT;^|8{7>wJXkO-`EBl3G1w}nVFSa2jln81d z-YR2qN!d}Ttyo^bW}G^BR`~oTmm>e19m*$|URYJdg7)CnxaZ9)QQsLY91=eqvf##H z3jt-zxG1F76I>a&>D~QDK?U!Oz7~WuM;a~zW#0SOHRRIh4dt~t$A7N zM1!4q(W15&>nwen__pSr=&=o>(e`7rsW2-FMdaL|oz;#QUtoR1LzS&ZRdjr=YFpJ~PYWko z_1i3`7o=(YggxqTlQFLQzUMv2JqD_!yhLNmGK9@z6zI-h-`ex$=`u~5#JD)Wqo1XE zQr^Z|Q^K=<({!}`g4w_&@9QDM2?LX(Rar+xLi+>Z+nWcz$Ct`le_PtUsO55^74qWq zc!Dc$-_x^zSWq0)|D?&w#O+xs-`jog!Zx=MvfGL=ImI(qgO_Wwq|rB&k!Rm=N6o^y zDMN-fEMuMZDi^n(hXpgz2a9=>Dmj0!>_ths7C`1IBS-U}bhGPi$_oQQ9)i)7Ss$m| z7tzWFs~|Dwl(779cS*1~r8Qq16??3h`1^5pfZcE}xuk7xA)7>dgGLF_#h4%pQZoNT z%0Pu~?Om{CE!7E0Ry8WR9Q)h%gW_;vZ;MgpX`6TAyB#TH4FO%;9F%buxQ!SkF@JreQckI(2R5|{=ztK%Hc;tTy{ON_wXu= z`-(;izWm3*+M%y7`myTrIl%ssuV@-zT8?r)3g#bP=sj(uz%OGrFkP9K1Kt0bNQtU_ z{@bp2G)xt*SvL5fts7tO5Z+kgh*Al<pR&mx#I=W7y&T}C%wz5EsB{kT zKWwJw6NMEcKOPGx-kN}){#do$yzU@2yzD%680=a$xE1j$$lftEJ_XW#>s0c*zs#-z zOIc3_lfYmn&qwZ=*x-zjB>T|w>1q!jeRDcIiyQ|6R`>GvsN)8i<6*l& zwdO>u`e^F$g@RL~**UxVHQ_E=C1tpL$gaK0!C7;w($~(tUd=y=O|q#^h6PLC2$jq38DTKg0WNeFD#%0mj!J4 zr_0^apGvqMpWV`$Bfi?Ub!Q)Ter-kB=lCT#>xSPsXOX(dWXHm5<^E?Up}=!KyZUO| z`KsN^H(p_j&(BWNo47BFf*EzGrxGzqdD&Uo9^Tf;^cH@CrU<1cER4 ztZY%_F4MIOhz=KnjJv-%!enmwsH&t1&h^@9k8NkpCtYy4v6Zo-h&qlE5nO8mOq^AD zc+3YX)29Qvc7_G_WZ`~!vE01bzkV!N8s79aZ@ljXd=a(Qa|+7%mr2?`024t_*}MlI8jb$CH=XmUkjW1Ly+zsQ-i*};UHen)|Fq`*Sdx44PWL%(2^!kQuz zrzRuxL7+<7#NunfmQTAl2QoPbmYA8^jbq5Zf9VC^V1qLOZNHPOot4s z5PsLPLsN%u15;dkN|h1doV`=q4;L;Xx)V1X*S@TFVm_vW5n8jibA_s4rP7+(ov_2a_T@k9VD--B39C&7HPX!>& z|Nnz#?%<&xa<{)#;5md-oRdULE!h}+w*s>*Mox|1M`u%dsj_A z|9XO{Zd|f1luRe)v#B?K*5o~B*;~7>?Qdvet|0R1Y?W%WlR2z-7*0lrYX>}+{l_&LrI|}&PvcCw7n!E`Tc##P49pKWUPk{8i#N?kJd~AeHV`orex1YjP zBM=!dPEe+%(}Z_Pp47{*dO<)*EfF{DU7T{!OxQI)i#l3*`xq^$%0l1ndNUq^(%mY5 zipy)M3}7+zI{|JLg&kYjXgRq5bpS`OHddJ%Gk6MmTr@p?l4EwgvcC5zOV4nLd6=y} z`56W!9%tqwqmg=19j8HvI&@#P87b9z_vdIr-XI=YTzDng296flQHIv4XhE=I20`T00EtYYa2vn0S4A0V9`M>Pmc{Q4zZ8X z*GVE8tXAtD8=&hh_&n8A5qXKZg-zetb8Fd`*rx?)Q=Y3g%Nzs;xG)#_CtyKz$O~Mq zRsaqsx+WCIEDg_Lvk0}#@}Dm~N55#ShRi(4H?YeupO1&8?*djV| zL_JbZZj_(E{%0xPle5}g&&&je-Lw!-TS`WWqs7EVr`ij!L;GX}K~W#+YX_!%d#nr~ zr6}7DU8#H5_X7r5d4yPj<55UHjT>d8pm22iT1T4ttr`HRG2fDP;b$UOz&T|CBR^7Qt+8kMK{?SaOf}_*`<{t#dF`?kxt07t|KYMCHC`)Ab2`wbYFXxgNL1p?nX- zbTrJ_L-Va8S#~y^Z-?f|p>+^bLa2RsE0h~HW5D@YkJN{!T<2f(nahR!7{XLne9*{= z79b0uJ}>~(;qSoDe)wxl{LLJ!`pk~vN(83*?TlaHxp@t=cR~NJFPzp32ZVxKr~qM8 z!}cGVv8e)whYvwjUy~%BmN-2_v^=i*2E+S3dK_0+BQoiCGsZ9Qktc|wYD5M~q;|A0 ze9!q?)Jgh7kj-Hc-Z{)iGh-=)G>YFxWNnqdM%Dx5mj3zCB}9hRL-~5_hpQ_hBu6|H zzqhH@KX8{63W9YqRhzY?T5V~0=SuM1`W6+8N&0G8282Aj;FuJbtFerTLd~SH1gnNv z_jF?_R3^nlob@{pnK9q4^y>q;QLZa?FGk4O*6|K%maJ{dj@|?KbWU3N8;q$^ z^u?V%TR8dIEts)E8U;oJj?)0ftuIgXz~(?ly{q?X84H^A4A60|tfl@T$(mJzCH;E8 z`B`rEo;tcf6@5bTNyk6Cq4VqH+U)$~=wm+YZ$L;d8$%U56Rrp@jb#*{_Gc2ge${ta zU-lp$W_5LdIjA*P%<-NF{MV#HN>yjz?-$(U{F2Wg4cY8qH_I<4b@gcuFP+Nts zwY#I1M9B7Yoj}*V+?`B!-l}t^@ojs%_qsxF9k^(fS#lYEY?#`W7SMKoBRDOV z4?)=o10P%*rrMC8fFBbqet5#_`qR{|0|e~pn(L3^tX8sD04Wwi@e654TTV~Xw1uDH zKT?ppo@7`un>&xR)PmV*k;YVPO|Kcl19eu{wUK}w{W71f?QdV5B5yi?|KV$D%=TEc z{Bqt0ssi_q6*G+j0=mSEyGi-re@JDaNf-@*+}-g`dq33~v}>4>;n@?8_iIO+#0DW%Z@qm-~H=uJJJ591;9#zbO=eT{bu&82@c^EJdEz zpac=YJ-rfKCYgrH80A=o^<9|(x12^6iz=;qx`5>Lr@gIm{^Xe z{L26e^U!|uqAC$bHvNhPwV(ywK(`=HJ{W%$)Sv&;OozjD*2K&>DyUH@YQ)$86RxV2 z`F=QAncnOAXK8+Prir_$&p93VP$LnA=XN9Ubg@TcXR6f+2N;d_EW=KSDZu#sv0muN zh7z*1{3BOD5l}NDm5v zL({++UW@E;{yT6`URvklSRvlrS_+lV%Fg9=PSxD{?M?Jhe{H<^qS4ftYO>BY^v~u7 zFC)fCQV!KN4H&C6mkCXugp9nZ26W*o`<~z{#whe9(i?!ZOFsvC-_&j8-i-&Pm_nw~2CrX18wH(*R#ay|T)Y}yC+_f3FF2^v{4sD)$2uCl{vqv}1>l%vO zv4F`}Hu-pkiJ}+uZ?Q960HqZ!>s!>n!I3j~n$P?Hf0c&&^I&}Fulc8&ufnzOsWH}`P?JwuX3*`A z#OGJs$ns>5f#d~o6b1$6Whsn56!i?u3+W#|H6Hwbv*Kd#o2>JinmW9{QtIbmLkWKoe`mdwtyFEoN3nJQ|5D}IAAONj^kcdNjOzwK+xS) z^ilu;BHqLK1(~aR-YlhsO+J9g`d3EFr3KCUHdsx%un310h{v5?D3}>w=8i%XoTgY! zzO^D6ahu?%biKw|rr^QoQG=W2D;iiBVir)IL5*ZZy$@hzpob*-RtM0a*1skV{@*&1 zsS3neoyh)6=BtmL*QAyrYYoxLDXyiJSV`eevWK;FCI%kCw^(@m4O{8a>YE-rM0_JG z^efW^=WUNvw-+fOC1d!N%)kWM|8JWzV(t5OpKPZhrn-TMcdt!_bupbDkn-)-g8c|5 z3%i-?^;5+Wfw)*)Jfw{cZ)qzzW?%WBm^&FR!tfvh=j)An!nbTlc>a>QcmetSB$DU9 zW>htf)>)(qCn^^OjP{zlWu@{_MHeuV!AiZdJogL@?z|T>&B|(P4NIiIeB6Sk!pCDL zL>#-BTl-C+YpstKz*XmOSN5(eZI2fI?J4g8If{`-uoD010o&@!(-xrap)ASu#njO0 z9cGUTToua9m*6u9(V})Uwqtj0tMh=+0Xth^0{@CFraZ`#+w9tNzytxj|G)lmYOh zjQVb*Kuj+OiBuq!!CJ`k)$q)r@Ktk1`@2^?I6bBzo~~p;afRw_N^luwPB|;R@SIEO z-W}-ftcDJ*zXBssUc9E*9q3&hK;_~8^t%a&s!v00X`g!_x52~PCF#VEhPoSf?^u5&o8CYo9*K==Y4h3hxvCls zybnpVDS?1U*Dt%A0Gk)a)8RSL3(x2d-gNwi>wTci;CSCw27K zwyn>p9obGJwSO1sNGWie%hl8n>2#3F(w3+E=(WbB?AK^)=c9|SrK!)>M!34UX66kT zr5ariUhI?pfEhV^$(EG?PN8y!To;ANIwhnT4Pzk7pYPsoReX!_U5+JA%%+)7y1$b9 zX136&umG|RxE1*m)3CVfesH^oaRJ$(y)caztR|OgU~T@v#A7x;pH)$?5DT4LA z6h7{xhWneG4%!inQje}u$lG$igAn!+yIr#9HgAH8-$=Zy)i3d{owlvo2#MJ%>-q+Z zg&EWbL2YMZ*`K&URsQRWAX&?Hd+_t*mT}*#82McbZ1Ny|nddhSp4;|xZT1ZBRl{U& zw0GKV986-9-38NnIyw)|7*;H_8%W4feCP50Z&0Ycf*culIY=;|m=p13us0OvhcDlR z+7V~budv6h=)`y(yNXVW_+;*!+Tqn(c=C0ZkIDJU4`3dq<~6s2C6WqE*C{Y3(}Tj| z9Q!wBT;0((6LlzG!$llo5G^j=)60pF>iiY@3Q= zi$zuGO__)(HUlqBH`kAtAwG!`M>+aGU&jv0+BS3W^u6u>iOCa3-~4=uJi0vWhQ#_z zB{un%eK)k#XSdUQ_wqWMGHi%THgDAXzfa+F3}JXL<`I?hQ&?iX>ds7dgXRE5PAxeR zNAV_8hSXpM+jp3$aOIbH8!}W{sqSE^@!y>4g?@x-ITKU5uSuPI>jZz?-G9Cgf=v#E z6rUALZzFzU# zeVzKe1`4}3V(rSrz`=%*h_ejL%Q-kE<4j6s^NAx!USoQfDl(hA-dj}FwfpE0E(C$URm#aVJC&WvVM*9DCK7nAY+QH$NX6Y z3T^ih%j}+j+}n96_}ht+&(1xf+k8IVG(x^(`NpJaN1QZ{S55XGAj?pqX`ugYQ2x-0 zM4u51+Hh{@-+C9jZ(muj>y#g#QqRsQu+cW| z_&aXl?&BoUw@xsLURZ%ah5AoZ$e;cs7t@X}n`^Qtk9>q;lM|uHVmd&5e@WA<>pu$_ z94uTs&(Kt<9sB3o2`Mw7V7G>EbjL00^7P+ps+8u~qBw=WrRLXFR75$Jr_9NckSrX= zJs?uj^MhjO&!%EzV8Aa)eHBJ?`zA&1edH+B0iu6g6R8Ig-27t8Q8;&xL*(xS&qw0z zrJNlcW->qCR11#JC-(-w@`RJ|OP;y|e-AN?Wu69rHKT*PZ(}0E3dcnan2xp_+&w4|{ zlUzeB>pnEtW&08{l&{QLG5spV%Ieh@;XmKTbcVrMH#D1MMsncF$yP*6J;b|GKe;9+ zG5ajI_o9q4UfRSNHfsIn*D2B;AFo734w6eE%oY z1S_d@?TiUiR(69tcD#nv3)Cb;Q0nl`&qK(&f`kbrMAlckKkG(s}PbhI#f!>a!D5go^&mh=GC1*tu%guC?9d-RENKy5*RmGed8b-_b~{KLgLt z)1JB5N8!xi5e1&4qv84URL&PT=%o9K)VYtBENSmn#5iE1);%cShzCtNnmF&-^Zxmy zw^H?jqp-FOL8)WgA7;(i%jf5LHps;!LOB@N;G;d|b$3+86eU8(eJuZUOw`aOk6wP5 z@TEwlSubBleLKf#*PGH>!Ws@R0{DtLX=Wm{1QtSPaq2)`q9jduy|Ry~=0QZhz&v(XJ&;Ebp%2B*%!hX#jK32Kd@E8%M2T<$h`q3a4ekXX?sVKIKDDlU>? z^3Oao|MBcTKl^2xRk@pUeY3z6lB}1U+)sao+IpF;?~iKu@NBMYbSTe$SBT^ws<>Z_ zcf^m61hhoEQ68{`iaxpN99XD8^W~~-8e5b(WcMhk#HtI{<_%b)f0PAk`1xM>Z~XxG zDKRmG8$1o-GN5*F+4Ud8Q&+_i=Ow>e%;?W|h8D6nn+*C~SvQufcSii>0x)=9E&VC$ ziI!7uF6*>VwCAj7g8gsalMVI@s^D^`t9|LJ&+f2zaFu3lFDyVgARKUWxOtp*3|E-D zO0#*GvE5Am=hf##j?_!PW{cXFCDsS0$u9Pm{60;3ec6`G@K$L_L}sMfifw-52afLY zN^_OM#AF%ow7<$u>c%X2GzP@*-pzCsMvFta$r@t75q`$^4v7UH`YLr=R0IYH{SpYe zuFeJOmh)fE8#o+IvwwsezId^!bny(_<*`&nfMHXgQ$nI%ac1hDJ$$HIVqI$9wU+sA zqHg?I;+Clr(~zhHcWkm1CvFECog7NBH0CgR6@SsSev7h!kzu_)re5o9_g-tUf(fMe z^*qHJxP0mVPP8J_7L=H8x^HP;EOLm)43Wu}+I&Uf!3mVcz}@Se{gc|7jZ}%3K)dT! z46^r6oKRr=n#VMg!gslE=Rh7%WE*C?xkkY*_h&3i7A}sOvi{wCeDtm+&dx`zAqMI0 zGwTi{!DRowi($NXDXmkViB5KP{7m-0X|G5&MCV7lvJd56_aGT&|Bxxhm?$jWwV*oi z7~`>JQ@*n9M9T7#ScR6qbyylH-Fn(t z=kjVuyGqGALng~%rbJ@>lyxBK>S?1>yW5!R=~KHA&gvv-@+phxu8F@SwOI1n0{Y|CKb|7!n^o?Tg;IA^|4M?50`t4nd!7&Mi|^0XEXWj& z%i8~@lq@`C*a78bll`^r6=U=9y^j2B>>R%nH=@iiC(`Wj# zIwhQQn^Wq(iVOKzp3PUs-;kGN)aq^ilcUCORFg1I-mLx*emg2iE^Pcga-yhN zM~Hs=yb`JQR<9QLNY9>a-Uy3QZ#KKp;wpq5Yx`AR89H9d%G<*E#h{`QM#IBy**8#j zcC(z(s{ewb~6u1*};`u)M<^VAa+3{;8O1t;F5GiqHh$KF=jxcI_!0>*#j$GZnVULA1HATJu)$ z){^$R|G~v|B_n4c);pKf#%vZ%FLu9^u{qLdhqd*ff09p)DIijWj8f`y+%Hvr`m-w} zBLgAk1BG{zk`q6qE88DY_U>E6oj0Hr#{2kf%Oy%UXgt2okBPCkGkzoXxZhygN#XDhDCCD?B69_ z0suX@pBSk8W@9LL{z#_l*n}!g+65TS5-V?>i8gk2dOeSj%L;){Q2GS4?}{Pa(aJSW zdU>}JMpkKGFTGs3AjP8dXOpovH_wE2PG^SQqTfvsMbE;l;Kh*`cgRPX-^ZTzmNNHO zFeXX}OI4rqjs8tUTZ#x%{2}!hLE;g0{=!vcaLH{>8XkQSi4qLPD=GAT55IwNad^lZ z&HrY_YzJ|dYIC-!0PXIZNNYFKf$@WRAPseGO%}e%_mGj+fD*0F-@Z&~k(%rU%CVM; zmC}OE2O+)3KMTGqMj3hj!lZ8ewLb1W{+qD`aOCR+Geic$tp~w3NtB33$BuY1f(yj! z+N}ROFH5(`q=DMgwYMCXL9U;UPUkR2g)a%PKxRz#mgF6&QE(slqnkzfv>jficO56)vTw+o*ZwY` zb0rEIMCKRzyl3>~s<W zj(6mecMCe@A%3zRMBI9EYa-eqj+0Ljt>>`&)`=$62CBl_-l?QpA)ngAXx;d~V^?w- zaaWi$A@y~z?=y7w-Ieu%{Y3w2`5-X*eW||;3nPd^%vy^( z51P#M-x~c9Q@2IPYqymzC??sVWnqcNgk(xxTES4ofiufu?p6>B$nVVL<6M~%oCL#r zX^%fSyHu=#{Ut%z>HZh@2txL-M+_p<1_TpTr|x!N-HNu z=cCR8N0oy|yT^r9kcZiOS{MHaX$9i0V5xgkLWy_$*J@x9;C1Wi5qAUg%a;_wmutGDqKYNyd<)f zy?;-=dw;$^fAnAX`Fft`8ISWg=lMJVFi+h>kC!qLu<%ph;Wq_jw@A`&Y0au8!G7}v zuS#=BkZYv$HsyrD`M42Z?*9IgU3N72e|g*CINeYUYI%uRU)gb6vz_=j@^Pf2>9K`s z5q#`NbTTb>(d8_8rGVJg^Ru2NMGapwr#1Zb;Z}?u$!m1<1uR3Yo-Dj z?fX|d$)64Szk2)^=?sfkESKJRj+KJVZ7HA(yvROgM18C>fVeo_P(dBB*Aywe)sC!V z0_qk@U6Y0K*v1T%{}0o5=13Gm%9X|v7tTajHMJ47s9JVqJ!lI=CCVE57+I@cn-(0H zbpGbHJN`cvapZQeB!P^oBXZU6RUCy>|G%GDCTRwMue>(nP+oiSUzO(Q!)*bAVA!0G z^^;NeF?tIHyhIL{nLyXA#~8mzkGB-iV#*>FiBofeBxbDnV00n1Eo{QLVhebL6s*wu zTYsHtFA;ax?>H}UO|+dGgezl#qNGq2!Yqo zt(^zR!-imuZj}(j!bRV>s%@%~fG!u_ntkvHv;MXzZ;L>5UuOL;$PP0g7WLA3N~OAg zv*Y|wHWMBu3;f*vIWmcygZ+eAAo=qHlP<;NCSp?t4a1yP0y@sz4iy+_Y3>P5gd(&A zqM+V<>j@@MNwuDBhX%Ytcns6c5ftuYRD8YXTaR3GCy|{XV0~5Mwsy7%zj%@SoB!E; zX96WM;uoBB>oJ$%;)ST`(CXr8%1T){S-Z7$(48#l;>Vb|i8rKQ=HLad^xeg|z1Nn@ zwhV~)N0?POKfD`?=R`jBKv%=&ZnQKyequHHW?TuEZNL84Y~0I$6?XDRc#@A>JO$HFE z8ugg`*|~4B@5KDzxAUmaJ42+HFcrKw!$@iC9fQox&d3JtX$b#}+K8zFQj|IG zOmrOEh?!8u)rw^#VG&(5(*0A+h7-~4x_eIBSBchhclf`r>QEFfN*|haKlL;hU~@yj z{wSBt_HWUgMSC&CB9XpIKO?AbKh`PV3Go6=$CWI{fp$)vBXFK+Nf8Ch|2`_{R`bZ5 zY=?5Qpr46tp}(Hc)rxUS)g@?}&G|k*0;<78%TR=yQ+ZgiUJ>F9h$(1E-d?D?W@#?d z+IfmP|BWi*Sd*P+1P^y3jT{cO>w?|=fX@*5*R{Avsp&8oqdjN%5v?O$n--GjClQZw^zRNZF;xrUPxQ2(n7DQ#P(74sJey)YlqPU2&#mic$@*v>;Hg&CZ)sy+l; zqnNn1dh0ZL#eW{Gm~U!1NjD&!`WcnCfFB2(krIS2%qMWWs6Wz0B{HXmpl|>X<-X8Eom9pmwwnM(FP0d zjfuNlUp=5R7wvLBOjO_PK4FN`2ApPV38k!fs}$_Z>Q^6c(6}vD?O5GuEZq8udAsiNzFy7;x$Zp_;1Y+)ZclXEr}dNNy&1GegVoO)g(d71FLkn0xD7_a&CoL>j z*=7MBBDt2IQsoyJ@-o~G%t|;O=5|gFUy(~GDU!!OnEQ_*=LF3Z)^wK`@+*Ku!k{yw zgm#z@{wb!80rTxWvHsC)!B)5MZaroQy)fG_0R$uny-`=>38CW+%5&IlhDdO@7D@Iilf%j#mo5*Vw*xI z>zD?c3C({Qh)N_{oo1iJ{qXUaJO5YKf=iU{CKX%nhzC9|+wKTZGR67^qXzu6T-64p zlwOZ9zBCs^hjP~Bp*%Q9iHIwA$wj#Fk1^G7MF>T$@vrEKCvl?U*480bs!1$q|D{^* zB^u7{A=90*^yS{@rRj{?esE`2;yjCBV~XuBBm!>bQM5<^Ie4t*vwF+)b%z@*d<}=0 zP*Kw=Mp&AMOSSNcQa4AGMiQ~mLOh8c#E7otCx z5Hbk87rxa{4e=l&uFWid`Uk-U$*`z6z!O9DW9I)`Pft}Yde4%xiEL%a{xd6hnUFRs zsHOS!5t%y(^i(aZL+7O^V%v$JmN}Z_V($k*US;P;cE@76;gs9M@8#F(C)70t;qmkD zcY4+}7O2n1KgPU7%@)%BM{W0|f0il=8=L-YBqR|#&1TK4Xm?cv2Whkt=(>)SRGDri z_|XTh^b?@ipmwqh8c@7d>m2cj+zG)g3F)-yE#BG&zm46k`OmD~>e|P$xr@@ILy?Ck45c>^F43!56SX<;_6IGyucMLJq zadoRzT$+5xqjMyWpz=TJ(V&Cdfu3YfW9c3tF@Ew(dIDWvnUtZoOEE)5dPQBgXY~my zgh%8b$8T<`ZJe>IBg$PxmWrIMenm`!$GHvl8lC>n{fBT;7g<+qH52P`9k<16z;z|> zOyw!QtH*FYz{81pYez~yb}8Z3DJIHEA?YA1r|YpFM(-b<1HHpy##45WiE;wS_%`C= zXd51rCuv5h-ts=(=`XKd;GyjmytVcDUIAMw)61w_Q5h~g5LT2#rbg%f=QW^+vTNSw zaJMslkokWh+WMs=Q7|F6;2C=7`}nU`sHQz9ZnqBRiW%lXegotw_f9R+vYiMrN?n8Ptxbe z`)mCLI7|%(P8Wm{|46KVya2=86Oh;F6+OST2Pz+@qo&OuSPt!KrHrBfac3iIWDDIH zP3ivz4}ZHXX?l+c@^AW}+@Ucf!40%gYkAMCdE^LDX6y`R&-`(Sg3B5-Zd|Lv)HKBb zpBjC$yqT0hn}ZN_%jtIOPW{JM*O>`ei4HAv#M1vr{wUQJPlCK#vezdN7*>=DE4F-I zut!`ee*}m(K=5d0c^~Tu#Ek^FH;)+BY5t{H4D@w9%w!dir7MDnr!ypFADyN2L*2d> z>htosB_9FT0K8hRf7qFt0u(6z_^gU1{#Po>z?e}7hBhbD`Mr1?Jt%7#;hp8p&lHPH zcDaNOWi&HC-!(#L29=|ZtLt>)$Gm}>rvJG*!D%Iuq=cKPUJ3oP5udXs^&g?gQlMJ+ z0s-_1+Y=J?@x}W$*;^9Ep_wcQE!qFfueT;;qVJ%GXw?Jq7r^;!uA*ioq8y$&2~wSx z=VyrZ1#!w+AbG?O<_!?#taRVs+Cj=`kd1WC1%XiI02qfK?}c8l23^6s0N-Dtm-ZAL z!w{Rxv?IfKgnYK1GC%;eRnK}pw%4H{-MJ-*2 z3KAjx`k!XG+(eYod#|Sacp)AT+4FF-tCvoYp``Cz1cJH>QcjLD%`$VHjQRgiiFS3q zL{a)HY}2YR{nKfv5fZEQsu1=iL4)60NRdpG94~Tq(T-FHXr(YNiis}=w()i9E%M0q zv^d{?KQ*CG9XuUzRA%2{bVd=Rvjj^Ic1B#l9NUs#5IC`VP!~Rk< z7jvv}ixH#JRV2?eHG!JyVaP4jdU0fhl5mv(5=^8hg;Msp@A8v=aOC}s=`NS|;V1kU zO=v;0)e$#0Y=}PaB96|R%WhmjtOHZSB26z1-(gzICZ@R|2Q?PLGB~XT#^&;tH<(Y#;qFbk1@??-2q`+3inj(JDFP`z`GQxwgeMCt%nLP9&YCmLqE@4 zO}ePj3p)7X;Izf&;if2srthJ6NCu4@eN9;8GgBBp>@(E1gUCqk0A7O!N$CUSDb8ou zd+pKJO6t+Nh9)kE4oW9I$D1~=QX>anXAir-GioO14B>~F}%$rHAC4;c-nrsRS_(JSB z5pB-%`sv{gDVuTu1^Ib7@suyMy7fmtwd2nPMzp9A;zaVq1^yKL7K~KWsQV7j?ENMl zlqP33u>=bB-`WifKKHB#2CLf z{h5l?ETR~}L2@K~@KDH)S0m6zf@#{k*xjSkvsYscGV2xvqz3EWswL{!DPV)>*ZM&~ z++|j34zX<>sR%Z<1{)ku#r6FAqbMcAy6o@B^#BifX>KMcms4<8xD*r=>l}F;8Z`Kk z4-GP##5TJ&^1FX=*(^<~hCF70$0St!L0!x}kBnAENuB!7CxU)9}2z{ZVxdW+y0^)akbFKs%n zikt~_Z*>wZ96yxj=S)gKAUP;q=z^z= zm8S9SJ8G(O?18_~qY>Jh(Tid*XQ$c1=o&WIK7?)|Z0XaTxw-9=p<|Rzv&KC2jY9F+ z#IdAQbV2H2*+}2SA9y_|wd4Z`BQ|ZuX>~Av><ZiSLp;k`2pO)j=`EaUWg)B5nD*v{{3mN3G#j3B=i#$A} z*RYUgzy?uf4Lq4SDx6um8Wps88MLL)K_ZBC9M7sfqL4_4x52`PUiF>s?dVWbk9|cEc7-HHz+Na#pY6MH* zN8L_Bk#H4w0-H>(7Pae(-F%|Mb7kHHn*$h^FIh#eZ_D)GqEqk0{8W* z5n%=;eBNFM(vwXXeM}?{0w$JLwMBst;08S4sMD;M?1=}|so$y+w(x7^^0$2MUG?j`qIkx4Uf*}kaC^_$y@By$j*-P{>YmbR57(5oom`}pP9EX{Gn z6xaJe6V(HL@4!gCKX%kth>?!j+vO_lBJx-UuS^gMXe<@5*my3UBaecv*NZZI)|Bq) z*ogH!9L9`J8XBmVscuE(o{9C%o;A}{Wrx-mD!nx(NMeJ6BF&1id$3bVs-bLwc9D9_ zw`a!zN3XsYY8a-C;_Nx;Yw=s|@3sk7WcnpxH}0Qtc2)8BPwkB7ZAM3WJMDAUb?$9e z3es3v3`V5@b*EC)M08|ob9HoQS|@|CjM6*!zfVqqP85a4FwI3AD3W+-EVtT--#%fE z?-p)V`o*;oo%`zj9Z8gg^nJP6DeP`P!cdrxTQny{OS&ZSs&5m_$D-;^@98r?6Qicb zB)C_M1(M(Q^hvE@5k0%I%Dfs2y@*xwEo)MfB~`?DubPmJba5*kT8gvk*Y82DhBoJT z>ELhq9dQ<8|MdchS*MJu_J?e%dnigV(aE0*V^_RCe~3JZ4#64yIR8*fU?uw!Mb=cI zUVVgyEel;hSRVROV}nH2R14V<+O+IftERc96_PH6Lqb9RZqlg0~uHHI$raaY{fJOe|D*75o8G1IGDkAh&rf=f~RuSIiHdM}p+awJ$1}Ktf zqa3Qf<-R7bFoNs~dpl;C#fvehb9^BhM*6xY!vj4}7z=U4X{n^RbKV~FuM)jm>Lleo z=EoAO9iKEdRWtPjL34I!xPZ_Lp1}c;JzxUiy0g2hwO>@Kcw?y zX_8MH(H(7C{OUVGgTZA{VlWJP`@?}b*ssfnAp7Q#d`r%7+CyiRNv9`6xg)m4{;h8x zRTcy=9Stc@#jU3IcR$2lI+3nL1>+hTAcv=PhLda|DkP0RN=ByI#I+ZLcZD)4K_)gb zoCdqpmUMrA_i+?yAH%8Y0HOARi->h_I+vl}U9`PB)|s1!H%_x60^nOK>tpmWXXt+;f^~;MIUUIJAe+VV2!yRd6 zQWwKdy$5z9{?taPAH0L@?1Uwr^}=PZrBCFm+FcW*bpRT)+mM?j*-C-+KY7Zs}Uo=bHl$ds4$wFpf9E z!bBauC+wamBl73DK021Bf22#At#lSD8Y$PNFHCdX^woL`suIpBEj--*P)|S@R@zT9 zRx09LvdobEM^vZ^$X#wnym(Digdl_ZxXXf2pq=ViZN)8c5Jst%pMqx0*R~ zQco-{3$DJDF^c;!jtz1&-PP-)T-naUN!@6H!aoVgAFz|KVFOK9m5KjocIw#BhBg3p zhiC=O3HUKj9rcl8tgb!x+;i+CSyzcUE$P}xGH4KRzg8pvvfIR398C#Pt=_)nWeEI) ze{w5VhspL86+;Q?uS$`(6u z(hl02QdH1?kPrHC)17{s9$z73_@TSO6Vo7pO_A5l6HM;ACW<^3zwPNoIpAh?d=oX$ zDe3u*KGKi6HKi7`H`b9q^U^c!)C|j~E#lY3KNgiZp3PW?)gT-JFTB=kmX!fT%h!h2k=SH#BCBg6jid)j4ETy;M- zTfVBCk&<4zyih_sA-$*#yln1%GoK%Q-|hr*5?W;5$%X0P_9I83UTwr>v~}d*)&RI$8HWJ#OqdDZDFas`ZaLU!t`^nxr5=gF z_<|Olg^?jYGqI;bbM$ItA#}n(ja(Me1MF5)fP49;G-C1-GjfJ*S;#Y^;!koaapQzz z$hGh2`C}jAZA8bnvFCkx>O+D5BgCM!Kr=Z(tAHX~QHGlqg9+oAMj(9dsLDxk$AKYL z=uEiSYU|HAHiE$VDXl;O?|tR6xaIWL?wmZA?F!NZf}4Qvi@8fDRTO>otLv#?ehF?} zuH!Kpbm6Q>f>vGeRt4H6`Jc0DQ~wG=pB9dPXKo3t&#yDu>mY8cws5^2G4Z&3<1I%p z7q9gxIR&KprLRePpq>Zg5@B%TMuCoIC6vvXGz)>T3y3RSwhY>z^l995<1iwBcq#3w z+FUKg(?#s}j@w`S0eO`-f;5^(ocVg%3jilA?#)F?)0n$U{Sp@ch4_x|*BWLB^%EZ{C@<2P?K`*s8Jd zC;nQ5+rhT*8jByF%t5^d$_BEe(|_qsugLo@=vIbz4@u9iLAeZ&%DO~l0W>@1n4W-1 z!Mp1VH%nJZb!>RK?o@dYx2hh}Q%=;~dEMA}5?_?p%A>2ioMyLWJ8qLTyeA2 ziI;p_N?Y&S#dN~JpR@xx+ciatc&!M&^l_R6S$elo)U#^np#Rzsb)>q}>^Ee^%9C<> zL>Y&7lk${8I(CpTR^m#90$ErU9aLBNEI&GeEKcC8+canh@wT;7Cv6eH%};}>C-2Wl zOCZHkt)iW7&-NpJT_@SP;_E>JKsq+@?SW=Oj%CntMMU*P=i|Yk>zN)+3cuevaS0tR z@k}->jhV^^?0UgG2LmcpzJkhSC2B{i(6?tdjXE^9*(w%L(h#v&%%EOpb0Ez4dHzh$ z&aRPKG979*_P)>OUq%bZ!Z8x-%cXWx3`#n%aBaUYiY57~Ezhx7atA+A?g2_#IBm|J z*7y$HHb$Bz&=M71_+VpXgNZauJeFwS@IJNnNR%E3XT9#y%Lz~Y-+6iRP=0tT^$8PX zTo@1~k>dFLkGm4NgYc0ptZ0$(%INnsKobw>*X&8nh_XvyILBpDB!NTyRM4e0HE`EG zAaCB69s!jr(5umUd!#M7&ZG(ou5;Ye*#se~hjlzSW^ao~v-C%pQJC0kL72Nti`F*9 z7U=qdg1l&b7q^VlP?pUu_xYX660>DKuE0hq!$ zgs#ZhcfQylzE0B$n}HL=U0`#ydi-K$M9Z=JU5$@kd&|`SLKvpX`J_1Nj-ShW(wg` z+I1B~+4Xjee(*9=)gAO`qYL%PwFePB(1m3zdnmICN}hG?>W(3DIQuL!E>P_j6t0AQ z;YX)ZwFaAHNwr%d9K zwa35E&14E$UAoNtbQKG-u~VUidPN1e*Hq^l8a-?U89XyFH30hOHl({=)=ib9jPuw% z*SZ;<)&zVvJ-D+{^84g_M}m4!3tLn!guvbZ_3z~T-1kqKAL4a(abDxfs!L!J4d8IE zuBRxM<$b&_2yn0K1M(k&&aJ8~q6GSw&|wK9DV`%rX{sGTV~Nttm>VtG(V+w4I|6#! z+QFCBN>4Cxg6EV(cfEhe7ZLvS&k~QNWK$Q?J*qzb0gz02572dkMZ9ZxTHl_X4C~7# zZ55jZxUbLNOL7gGQkbDG*)->t~bvqL6+(R#wdM=JR}B7u9ziJJdG<7NvQ zVD2S90`=6zs|Tq+7Og1Kj06VyUKKo8zJ7aFlk`36qX&%LK)~eE@nu5BBxD~o%Y$5Z zYv^v91fCzc9z{_6W<@r9PTIZF=va^&ygvX%{3^o)eyaIJ;VrHw_0~nDo*ZPIIZKN3 zWJiMCu2!^?Pgs6F8FXGVcgv{ieA}ph(3A{lbC;*v zBhIz~sa7pniCy25X%*96;C|txoQ<=k&_2V@xE3Lc2IEYe_a@o{V)+zar%X;R9PA$+ zCF@s}FK_c@S-vkaS_yMMwKUpOp?Pj*GO(`qfOb&BLS~)}K+O!y5Y14jeFp-2ZO~YO zRd;G?E&`%p39P~#2a>}BU)9iuSDQH_!icY6v=^*G4f zqSacO--h$mZ;Cu6zaqrTZF5@gSyNNi6(U<0(AT`4slKME8SWcD1+yOs0vW3S^qFO5 z=zP5kQX7>$AK~VpN6!^K;nsgozd5;Xt7IU4A)U}3y_tW~I9yBUI9Iv@U3-Z6Db?5T zP|DzVf8?LQ8z-7t`6;-y;-y#W%sO9sOzaRs`s@(p(CMLQa)X1PwOlww9KUx!;bdkj z9l&YdxE+{DucJlOZ==3pU+3wzRV+ACeM*s`eh)DSWZ9c&@M20F5HIpQ=SY+Xot`d@ zE0q^;qi=tC{oo^!wHph%ZI1Ydy|M2Q;&w>KuY;4+X1FeFP7GPwiaCLSmrApawm$O` zKFbi*9PjSzdNbVvImry<<$Fm@>xIGi^ai(KCECWH~ zK|N&WUUPCpJZ6^yGyvov8fJqA`5^^Ml+}JGTXsZ~tH=Nt2oh1z2-erVeQv zO7@QjlN;5!tP4kxI!J(WBZD`6OT&d*)X}YpU1|o|nRUge^$b*;ARCpaMe&Mj1rYT!S4@@0RT|nD!u4c{C zcqCk81nFjuOh?gr1n6)q`K^zL&)*Bmdq^&S5L!iU3z@&h8VKENSc(26%x8N}J_T^K z1ZwW-;`K22V@xaIL4k!6hw^av7-(wHXOsu1SBl|@Jf0{g#vPZx_xWq64I_ff|0igN z&6Zud%rvWeUVPo0_eRqMN&8 zDsLQQS4y2Z>{FiFTA@k7zB;Kp8!8$A`K!H%0AgCP#s13vlL$gU{=w6Z4{}B8pKnHwT_&B6Fhzk=-4{Ie0++SW|9F zeZJ8zM;2_*Kb>JclvQa9+OFGeL@~32XBV|CRL3G`O*Fi^h>8I(;y*DX>L4LZRNLuM z3P7w9KPXNa!L3(J1qRkHS$eRwj*^Zm0w(PPUN~)iZW21(Aa(sLnd%Mb_1q!G>k&L} z3{-{fpjt|oxi!^epHJk_Q-ho6r|!qf#9eg|J9Yp3>)xEl_nsw`hes?ueQ;|cy;{yW z6R$A%!YyrS&U%hkVM+OWbpL<6 zdjtkVXoabSwKf;WAZFzc{QRCSH))QrNdL2=N@=?w#zFMFy+4>xLT)47g_(qTRfk!A zDCg$p=5w{ZG0_@CcR9P&;?0wIMj~s<c_v}Q43&bu zd+Hq)M)FF!wzYVP&QLOrXVQzM2DrficN_b&3jKaWiJ4@pvO02EFdP;Q?7SSuEj4Nm(xFzUJm8 zs?d6+F=YZ}LB{& zJ;Gqn5Ar8!*S;GvnfvsnnRh1!Asjfqx}p2kWel%QU)p4k&gLDb3oRSnyr&tqzJE)j zTCcN3X!oo^H!ciw@#ii2ne>FM>M&c%ayE?=<*G#IA{2yc`8#DZH@AZ~#~GsH$0|y+ zp=A+o`ztD8D*-ow=uAbYJFMrczM)-`c9qJt*rfhZ!;| zCA^!qOgUP}&sP#|<~Vo%xr$%6@7rj@k;b^Y@Bee(036VDJX3!ew)@~0tdOnWvEc&C71K@n-^b(2G8Vs^J(<7W zxBf{i^;Op>T~u1BUy}K>$qY68b^!h(r{86s?jIrOg$dh@m&NE8)K1ni!p+^8SB+?% zjm%M_Ua-p{Z9W@v7)sd08+NJ(vEgEu<42Fep0@{29?=Y%WXbAgssT$mQ|R{IT1kuI zXwZE1egw0(%G6H{!nFhw!8BQJ@Zx3J^3bk4&N{B+DF$P6aUOK1&}hX~hDBIzs$St; zy&jQeXJX6piQ-ETK|ZQnGP%+-tH`G;47s*^C488@F#WP&r1S8^z*a!?vUdHlEo{=w ztUNQvz(&bqIs` zX&-a>_u)hcI?>?r3%oQu&${S8uOsc5v{;foLa`k> zT8cm14Zi&2^1k@x-hoZVpHC+zf#@*TFAM9kDSTaqjX3O66~+{5hA?{HqP&|qf7|Y< zeo5Hbz{ksVvSzxfsx37dBWDA(niEv+a^b{Yj2&Kae08FUKY=DDMq;DN@h>ZHo$UA! zSy(*e>r2-^9L_cpp0)hIeR9aguc3462Z5YMYb&Ym(S>zj;fUtEzWr63?c3GVcM_LN zd$AQQihKnw=*5ROgB90~^hGmI*EeqwxV)GUh_GcnB_6A~2jz~?H{=P)vcm*i3?vF@}GAU z%3fDc_FJue=rz(<{O_VSms{?ebG;DHwVMb`qqb7rWd1&^o4R=A2^Zm0%ho1gm_|#1 z*QFM}0Q>`nMbG!o;r)(df>T*$@7pAKvyHALD6uM^$wr zy<5_%?woXX`qei{dp7GjPUT7B4|Y#!!(hwXfoAr&y4oAe?TVaU$$HJ5}N``0gV zbH7m}PDxZqxXkB=ANXdeGaoG#Xw4UJt#<~6KHo*@*xc~tE51T$^E8MKNB2{%kiU(a z`zZH;O3&n}&|q$80$CcZyLh|UuKZf~s7iGT4Gdn`Qd&`v9gKWt{dJm#u zI&w51-E^cxvd*>&p~lrNtAF0L0BYhf96LLEbc9z=31O4h?A1b>GRM}%xZeBtm34vR zJU$cBXm+`LBlY0UbD)0bXteS)EsBeSK|Bl|pF$?@jc$BPmh;&w(DGQ)2!2!;qcyht zp8L(BfBu2qJ!rm`g(J~cz(d<_X8DdBS$*f$xMNs4*ove^ifTWJtIe1|F7krj=|w2W zuSesViHou-%GfAurjbUxjupUM*Ipv8r@SsghZa~9+vc;s;&v4~szVGw*B}ou6 z-&^ad-qV$5I7}yaL}kAu6Ma_sP+UG_||rT0=WHTJHKgo47#x_Pwm)c75#*bMo{XwoBf7rELIu=f1uiQZKE$Y z{MXk|tp=mDr=ElVAjS<>Uk}~?tkuDysQdQj^YGfZOfcLB>_XUbS%ps5Tf(pf7UB5Y+uTxVFR`L&JH*1*M zQ^5O*dt^SZgy6J3e4(d8Z5E3wK}Hqf;kE*vyoJjXJ^Aj65D?^V`)Z{AyDLSRHKkc% z^?^a%P^^=YpT)3`$xZ!`6Q5qtfY?kiQbZQOoG|_KI7+I9B+t7vQ+g z@6oc>NFjgh2(4L}-oOuhgt5T8(p>28CY?*Ks$z0_(yp*IEV86@3oGPtN-_dHjD zPcdj91R>>DmyG#Y=t9t?cGiJ*y{PO(ik-|)4o|w)L^+X(?B(Hp6CcWI=K9c$V#~EG zSsN9io@#PWG4=*I?}=~m=aVbXT@FjKjrd~%)PvyDdJqXFaDPv;-+rSn ztBiFSs;=Suvx=JFbByf^ApkJBD?&rd>}EL0E8c*6^Cg}&N5gyWQ$Y52E+6*sik8*B z9rXhT)d$vrW(cq!QjzXJG~A$*uTw^)#OR=2?-pZ$1~SJ$sh@Z+Ymf*)lgl+Hv=sWc zzLT%-S+JfzUb$_D$|};nSZpgG^q#Qgp3-e(#W+-z?s~GFG=6RVIwkJtlx15(8V`|W z#{_@4CmHUMi7#DH5&_cXxZuK5$nk>b+J`L~kAC_eH%HFiN%4?mLKdL1)I?~W z<(Gv~GH~?m7Th=QA;&jSAJo{lg(oDtyvqRl2>1K)gjbYOblIN+(PNEw{)(mh@mXK~ zwKywR_2DGP+Y7)KCep%hq+AP)2$SFYmO)<8Rbjn1)YF(u@#Wa~t`bo)!9?U0^Z2hz z;I=$Q3%38Sd!9@PGpTmNU@~yjYwMy7ThH;j%e`*uK+7NJh@iDulWzeu2tdWPgbYe| zwczvqtCRWl1> z-Za5$vVXi($eiWzy0#{`)rL6X77;5W5+=A7f!`HF&*& zj|82l@;6%UlV{TUa5L5kHa!L>s6VX3U>2=P2Ej+D$;!@pK_#mX?@*TlUDSV)qZSEg zO+JX5HPnht*g$DalCQjx>H6(PFelIztmIDc%qwdc@`?I)EM>-CrG{!?_Jx<;&rhnWs~#7 zf6*DN)q>x??FHPFwKPhzE5Gk znwC6zivij#mUa%9c(Mx1ZeY%^(YmXwW^X7Vim*rj#Dek_bc}EQrp7y+%cZ6L50(Rj zSc2-8@w0`S>0{5l{HfM%W)(?9Rx`H8iWW3s#nT&VC~#W9orCq>y{ofUQr%!04d}&Y z{rr40*ky|N@2(U&Wknn9_EVTNhdG9F>?RBdoCI55>+|!Q*$xl1$L>`Qn|0z2l|Ix*CQ^K< z=YSK1ld7KQm@=JgB}Pjk?6T#VR}+6!@$l!CC-d2!>+1n^=y24&Drw_mnOg!s5AeYe z?sWCc+h!Rj*7^4=sNx#nMH#`*|2vx&Ai1|Kh$UN&HE8Ls9QU8WJ(lS zfgaM~y~rEQFW)T%&W0B+mb=^C8kZpH{>RrGy%AS(cqTHm45J{3CUM0c>1fC@fyW>) z0-C*V2vfjxbA!$5zWKSIs&BAwgA;^2N}WT|;aJxwNZfW^ z(zYQ~#_K-}G)!-f==Ung*>TVF5>UVzL|#eY!20B)rm&X`vGlkAfFj-m2Yl@TQ3?8A zREnOVtg}{8rKI_`+n-)Ziwm40Mn(GaN^r~p>+E6NBt9JnW*@)24vv(=?t3(^BJQxb z)*2`Oc`M$->$F_v0>z=~#D3E&SB3TB1lkuHX{T>*-iP1u6n@%D=YE`}H=qP8awAUg z)#lb-s>ViBbEG9}375H-Ef6jSM42ljis{p>o`solaxtz-t}bqdG|3>r`zi7H%I|&5 zu(*_ZY+0BDPR9G9_assbz8`mW?#5^)S%!*V{f|w00XK6yE)t(c*zV;A;D&zniKi{pC1Z;GCSGv;!9j6STq93OY@Ay{Td9s09kx0l)k_69vuu`pZWw7dr6A9b2gdDHlK`BVGc*gkAq(n`^!H`D`A zv*6FVEELE@D#1TLc&~~rPh+G|tCRyYm$2Y&HE-&kY3}qK^>vT6k*c2QtG4jokl&d0`npLJ9g3i43a zMHJ}@sbajyP3~gxnfhwG8GXD~6CG=y3;Id-X(KpB(+n~MlJ0wxmk1KTB`0qb;bTwo zTg*Ul&oXQ;D(5B4*707ZmNRU0SL}jd76;R(Z^b_d0$=)qitsXc-)Ln^Z}p+ zV%)iOHzyXH@Lr4l+TU?>dJBiGVT6LH@@P%g^WW|EFOYKXKR4u+uRA%i1`!{N=7iiY z*P2h{_&}KEnf}{=54L2&SKGy~sQu3nd=mhp-WqH@^{HSu+?yOa2p~zrla^C03Ul*^ zGd%X=$4eZG7D5`h1XzO7mSd=AX`YHJeOmQZDp0&fZQwB<3$@$-hx9R;cQvt61AwoS zKiP%rd061L6PPF)>ExV~Z0{B=f6Msg`wjgrmWd)nGuZG?bc---vXy>g-{!Gi!+B^g zW|yUGp3C)#OAv_7P=0kP>HhP&n-(Qt8-x4>c%iPRX!?p)1)z2gq$1r-8?hVbU8uZi z`_bQec0_S=$cWx8M*==6M1ZDnvJT1X6bCZ;d%e$NC}%iF4Q>TIuMS?Ui0AwyA$?|QitqDUB`4hA;i5q zV^nQ)5N@c&Xktmblaga|JBGLrthLh>(6dv1bblWGTV*X za4>Q2yP*5+eXZcIljC9W%!CZM)r99PyNwF+$)Kd{%9PCk4VV>o`X>DLefLT7&|140 z&rLl73tS`dqP%7AjRbsBWo?eBhDBZKvAoCeshu0m2~z!B6u>=mQ;a7@-3=~>!rZBZ zhnBg6pXbm-RB70n58w67j)teXa(+?y{?5CE5ALiHZ1Umc8w?UmC}{7P-KFkS zFHq-ttGneA%o1FrQxWF;p*{-$o^vsVEAa7Nqx6q=&byT7yws9W>g_I&c@qF>f;Os2 z2>+TR^b^7o!ujV}z_el4kjp>#(RtU^z+3W_|H}V;PT&3yoAl1L5^w^KFBYqA9)(uU z*+mR&4Sw2_!5_my?-bce(Fwt9pC@&9f>Y4vhiGqy`?rzSBiAn3JyJH;)$7cRJKfG! z3v-{O3azr6S=kKo`E@42Bte{`h6B7~cX>_Ft}$9H^^7}YiT2=BjY+R$ddcRcP0_48 z;mTK9sq6JOvN^hQtT+kRuo|6}UP|H}|JzK7El5^nH87aEvcDtbdADiU zg+KbiMBsZKx;5KuB@=sco09HViE?8y=4}%S^S~Xr%rK(P-2^Z7R$YEm-w0kRM>{hs z@u z7aY1z=IndtZfl<1yY5gd;GM|dHeJZNtBkA6n$0gfu>a#R^e|%egKRpA-SZM7!J^cM z!P?f12vzb8)b+oUmB^kW4QV5WsQr|pKx#so|lpI}gQ~h{c5!-xZCFaK& zuemc*8iX`vC8mU@U;4|XyV<&~ehqvw%ssI5_2({hd$kpSuBG%Z0r#*gDy|7{?4BMs z+Dn*VpBPbEA=slisQmetdWgwc^{{_@Q| zor{iXtO-8@fP38wtCYzv+(#>P*WGA1{<(<2r<`Q@whLO+N!80Ud9Bp1=3EUPwEApdwc=~`5Fv72R{k2$4>yJo z_3h1MT@$-pj8iwEO4@g~O26~`X=e<@EEg?tu%-;RDm65qBG};Xa>5IkikBMrrj1 z+VGu4;Wq6K%Yb(SIB+x$qip*z`-Gch*mOKX zwua*hyD!M!WlMQTQDY(7gs9gngZphq>B64k?hFe`@DTPbeUr3(h0#uO=J13c`tOq5b`khXGYYC){E7 znP`WSDS03C4*H$DLC8^C7nIl!tfwgBrjkG%s|pYg5N28mJ`dyyycwe)a7b9^98XZp z;u3L?mCu&uO5!fi4Rq&^k4Pj2a!f2AK!Zi*2`Oj^)mVB-IW*JHljg-c`G>ZSmhJAm zAG>nDf)$2Tl=cv(TBC&%=(C>N4<_(NFJQ3=d1=6u0_|S8 zv%B8^*xR*)y%FnNq&)E!Z6~nGoh!~9rB)W$pqtCPtZFZFAR#iHXq~AAmWx6*+?t5J z9>xB+&qBM$fZ)Vj->_qm&NeE_VCw_A46KaR9;n=XGs;qd%4NW`?-f1T;KflTgKkS zh4vHLDY*SJZYQtL4Csojp5ss+Sma7tH+as0E3bDSc|+F|JzV&46w2Xn&z7AIj8+4O z(X(i~%o&Nh$;aSxR^6xWZ3WAY|19Zd=9Ww4?M`AfiT!+bH7XDD!+IpFtt16ma(eOH zLjD(~`Yt-2w5|OnU5~5Q<@WV^7NXG_HiWdKC6A)_t?qc&?4VG?_Y0S5u`{$=R`y>e z-1aTJTfY+x1bf*s|A@G#7PoPKMV^|=7gG^q(s6wJnY#E1Np$NsSLkJQ#Y7?Y(>OEL zWzjaw>}k3~U_8%2RgpLLF=AsuFrH9otkKL^a%xaJpgBXJxrt}-9fo*Vzmq>t4MHhZA$FgSx-84r4^ zzE@UU3rD$;qIPW*`_7Re9%PAymL|xP-65J^#qxkl1#cl)n=e_dTr&$1(W*aZ-Em6j zpy(BbPpW7_&Co%w@|SF}^D2q1HHb&Ujg<@S&Lh6Gp8Ty?VjfcTbfEPw19hJAo7ap# z*wz%&5bA-UD@j#b0$`Uf;|8(8#(uvj`R23t91)0;QQF1Jnq5bhE!P@;wzE`Duri!IAbHf`n}IxQrLs*!)E#fkKFJkl!(`Uw(rHDJ z6t&UVE6Ej^h4`Z2;eqZg6cT4Ur-#?H1E<(GSNSQ}1FI@3WWgj$oHF|G)(;lFqzg+CID`vi_&7;<-w-&R@+O2at_Fq{<%<_GhE?D119OH|35LitBZ)PZ3AGQLK z7?v}FCxkBB_=A%ol?bsswB`|<-%W5b3XC6We=n$-w(>daw`h@!qFK1ufgG2cJqB|V)-tyOz&NX>WZGl^VKQJy#?9;90=wh-+1=7WuyPfW!rB%adahNB)G|o$j1Dvk_0j^UvFN_s*;gJZK#Sd1tGjst7?d< z4g3rn6ODNDjt&Bw; zgngT?f!aqVn?ea^h-etE6mrR4f2ym`N?yF;7*p&R2TcheaV8=@nZrp6&VNremqfWdCci^Dpn$Vh51WX5r7l&9F6 zfj<$ddQ)yh2_rDrc$R!4Rrqq_-ZI6`TlI`L^$7v5pBt8j%ep=i2gJtB)tQrB{#Bb# zh$FZ~BijmC-+9|ol3sXyDLC(E)zB??lr?(&y+bCtyF-V!)1Yi-f$iA^$@BE5tE!K9 zs^D%2D_$wYzL)nNTW%kgHqT_vRhM|fK`<;R=9$0k^K+tX%NMAN zpq`{sSLIkRI?(t8F_eNI7(i{EB70I*F+C?r{l&{Ja!ejYiEG7Nn__rDTvj||8=@fv zTdFlNKLo#rs<0g=o8cSqHI_er;MVXQQeOS{W5bXoM%A;g@4LJsv5X#?z6b3lZFe{A z2FS3&jrlRb27UCva;C1Fd$|VpwaOHyec(H|X zE56Q1jCS@nqeiqv++oOH`2JmiQpx@UesDShGaDn->zQLavkdgB{#L$z{agpS(i8$~J0Ny*Saqt$`|wt<9v zr8=JM2)!poeWsn*IkC&rVf{X}*yptEYcC#7DWJ{Z;k@znx2`qXRUx^O_=d2+TVk$E zH{nVuBH1qNzk(Dt8}>X@DgiRdc@RE6s*X_&1wq54?rSdLuW8DbUdiGgg$sjVe?Hm} zc9lUX46h`E|WWWlL<=sW(%C2jXupnEP6vV{!J zwRJ-20HI}xaPkq#S&Pm@Syuy0*qeImK4UhAFJ)IQQZ;jjc3X%CRu>XE3RqL;q1CN; zXRi8`Yr7blo|>Y)eX1lMINis#LdDleFF<2Qr1L{tY76W|xh~dYi+;kwp>ELuI;b_{@CA9mwtkw-ljQsoHFMSt47vQpI4yELMtJ-4_`g~oNFX+nN z$)5}CB8k`NafR&eG`<-$tU%?Yo+8z$${qs~47*JPuY+E*^;2F*PHVf%XEMBNkc9bB zZKWHR>uUMh5mKqpGb8ICFXXXE!MWfE_}i{OpxGm7ERT;R<|)63N~N<=)u3q72!7*6 zrJgaFftSa>GqMdTBhC*s7QG__5xhaU>-}npSUjs;N(l@|k?ww#PtmBFGk7u<)$KDE z1V8J}NQ53C8}_bhEl9sd^?E6|F*(DzD@QE1%_lBP_uV?V&72JrD~kGQK>fHLrTOaq z=$1cY<^0P>XrFDJiSaE^0RpG_lq!`z!@cJ7hWghSFM|%prHQZ>U`9tBwVY6}<-yI- zr-!B|N7eW`yY%<%k|3-C(p;7~d;65PY-YOj=kEh3_BKuEkBIV}mr$4J>Q3A+kA z0xjh{jD7(Ve-^fH9uN=qHL)qdx+*qne#MyB@zvg%c;Aw{oG3G!^XOt}s7Ofh)^LWE z=6m<^T(MEbjaw=zYOObb0aO{1<?oN1jN1p{ z8NkNBeuT7`;eK8e%`m18Sn1+@lpMgx_~eo{+6RXH@L}cW&nG%ci;eW6xHCoWG$)qg z3$kSBh39tBIj8vZLI)lD@s2#=RgpXTj+;AW~jmTTr2v=5n zOV9>@@yIP^$9Op(uiu*S$4?^eA$EwWiVS7Sw*H&5_A&ntzVQ{K9M=BaDm$kG> zDyWu)qH^Bv+fFBD;Ve0fu+8*3U~B?;aI!1GI)C_;YShyYx;PCll$~s8Ac47FcrbS6 zZsXmDhzMb=H}vh(RV43}B_--yjFhGY*9{+`!ytw8&)`C4v8aoB1!mHo=axU~HnBUf z%29UW=?58nwddG5S>^YaENVCef|fDwy7}WB_70X{oMs)?bjp+#tf_}4^q^lETf0uP zW&4D`Fu00^4Q{deo@plZ6~?IV;MUG)(J~n(OiZ+zL)n1vLmRr~*U5uR>D`!WoP$ln zm!GsWF_|5Ri?}`We%mqn_v$#z(D^DkWRYwS}3G{m)QiYv}Ut+XQxt@Jc~xe?|~nO**4P~qJLk0 z3{+(=fzHA$ClFdebL5yf#gn|WjT2Y-z2_yRFvfRe%<00vg4r}DuR;Ag^v4DpkSy0l zM#5Lmz4@T$DekDE{9cYLNlXHi#KVlRMN!3W7M(Xi&EIM1;rR%ctvDJ_l@$oX{u$0G zRS4g(X2J_RmnUimFPYHFOfO;5{BiXxA$VFV$M`$uE377oWt(TIxSPp~a2dXid!v=Y zeLWtMp;3D3dO%VC3?UOc(N%|L!bOPNO9LF;4alZm_13@xZ^$=#li?X3}cB^pODBNIjUl3_SOr z!AY2g+J#?ki)mHdKY`r6dZ+Wz7^21soXgorJ+P%y!zfKjjv%sZ+v)qi{N)W1Yq5Qq=4Zd&ppV-8a5eSn)tx zXtM6CH2U-xF{p@TQHivfdo%R>@t7wo2hp?ebjz0p%exlDN%OL){CY-Y9cUiMVr+Ya zZSXVwteyPfzfyP>i?)lK`S9$5P#VpXQI$4xk+(MP+KO>XI}Rko&*onjvLa+79M}{r zWc`jVT&CFYx7|BYfgrLCH4%xa3*+jjFi?|Rl10nIqn_)`mNFwst2Y-< zg!Z`1M9DUB)#qIrS|inX6cYcc_?>LzbT0G})XCZUD!EApI7^>`P&$%x%0sP%xFZ$15VY1!noSGs~eonq&Dvn*YG^B z9F{a;_l`&?8Tv&MSGF34l9u*jjNW{p;Q0r!M2y=3P%!`;56Ql@sJt)c8hbY1+|1~4 zL5gxjfGX5DNQ|I{EYSa&s-w&_5|bVyl@2eh(yPoPY$b+iF`U4q_$;l0{_+8kQ1{xXzT5pSh@NEpJH+sI?$ZNX^c=u$?EZ{gS87f|@h} zC<>2B7|Q}jTbB6>vg{>omSg-B521>+?@S_a@t3J3BxUda!51BECss?C`ASW$AD~}U ze4u`f(9g=vJgSO+C=L%F_71}YVbEa`ee>H9(T66_Wxcfc{bqRz2X+EMiegFqVyc1a zyp??!;IBNO*6iD%Up~#-;qUz!b~ZeX`u6|^+k}_zEI^1tVe%n{4F(>iOv+)s_>mN0J@o|etf;X+)8xXq8}Cncxiec=m?0e&eM^pG|i>> z;K1K`_uL?4vphCl>@jBh+}gduOF0Xw{tL&b7;5>A7KKyG&~lDcxvWru<<}97%DDCDj1=RW&<_ZKV#idZ{<4!+P-c}x5VtH znDgAHv!J`-`dkrv1bigF3t@aHV~WLxD4F@ z3KVS4h8^{d45b#sY4pD!+v2N@1DlA#t#F(HabP5e0rU7TK_;mM}pJcUk76@c-FH4;CsrCOXEo*GrRj;6JRr2(T6eI=T`Q zutyZ7wWJ$oldI%>naj4cBsn8eK)&w&JND~$iJiE4-uQ@pwgdEK7PVZKoiBJgb3C@t zqF+JZ1Ens2>Pi^h%t`#5%(VIck&$iOfO*fBNHXd29Y!PY&>9&TR0N10CT?Wx+u5=Sj+NeL!N}x1fRU_WB z(Mq34QO2IoP>-O#@)KJ)fjPXea-*e#CxW@w3Frvl;fpS@BD;#MRpz~^NjF1#o`GF# zMMg3|Jg@Q_O?|h_og#qA6=9|eQ>#fip85a96u(jekY&crggSisU?YGP&`-gA!q+cX!}fH+V_qa*E+M|*Z=P$ zr^$yQ!T2v5ut8L3VjPX)Ilrs^;V&L`XCAGR?3x~V{o_LuvG@`4#+1(x{0I!0#Z~_T z^J4_!@EUVgQ432YHsG3t(~iN4eHicm=Qad*(TnhOrqZjnbUkXxt7N@kf)kI3frffy z6=(g^Yz;~vAr1Z#k)|lXxImc)p3*T%^x&#^8a$l|8kYCtRM;W;>qHyVO3R9HmczV{bJaA2WQ@yaqnCC$J^%@+h0gx$Cp||Ch zQW~4z_adHUuT)6-`ZrfB<6P|JWdB;@rosRD9)GFnXs8tbPB<;{3w<|0?sG`RGkre>xkA<-^B^Ae*BOD3_5k%rQEaf; zE6$Ktv>{+PW)+Al$3I6&fQjlJsjdo~Ee}=!Lha8on zu8C4&I^&uD?2QXUg2I4bXL9})HLsohM=IVxDjlrPpRcKEfuDs;bXW#KwZGX4(c`21 zP*CqQ`63j=W%iT#=!c`wUu?blh=_)QahjS64Eer>djvKA*i2$|;l!SKH%7Ae0OFvB zEA=e&jKw9frokTQR)zX;*3%7oG#%;?i%WO)W*4xcW~8D~b)QdXj4LX4_@`E7R?%OP zA39FHq|TF%hwqHyEFC!IC4DXv6q?%U1M>Hy2?O-@IMjc z`rcHlErh(Ozkr_xxZ66^xJ%1Zto_J=f8%bQBC)V7(acBUO_yI7;`Rev6sqVB$BmE6@8k;=X+6vtf5PQ~y=lAo;Rtnhd4z z@at1#`2w*GrRhDC0e*m+$v`R(L1N_vpnK?955Sen9sPpQODbqHrl#Dr`|p+U1C#eb z-TKc+MNXf?UC5 zEm7w=6(uzuEb{kk*0Lw1N~&z-SQ?Em(fUd24iGUet9L`d6W{)siFs) zF9|JR-qg!M(*#p&^WD%S^-~~d5Xa{ZV{d{bo?6fc2TPy^3145qSf`S~WLj4~+v=zCbZfM%%HkDt7vuRLT`PPPf&)@UIjP zCIxWr5Sm-@14CP0W>TksZ{H81xu+BhC4`fAc+d`f0FfeRnm*~mfyFDs9v?3BkUk0c zi2R5qR&LBs`wc#(M$k-kbhaWAwI~+X2=_JG^872}maFJt`~-;2UV=O|8#<*Rq4Dt0 z#zU6V=8G;NfOLCuCQ2khS%jg3x%Rc=skDa#+Snp6ce2`L@)a~NE2>{o9x1v2f8xP0 zM1mSi4*Y9hk>;TPt9PP&4oPvomYY4byAD>W^f#M8dl*3gLj){62zGeKGC zMJz7RbIeY~Ultvvalt*jQx!XXo@6in1v#yPnU9fT9d%&{|Ign?8j)wLD$k~S+0xCZ z%NYz+5o8II1DAre3cVY;=YNIa`;j|I!iA9o#d=`k#;o1DJf}Tzs(L zDr~F9qVq#OVx@}I0JLzm)lNIk&RE)uzK0ll4!i`1V3@wA+d0yjD%+}Wrg*aqSCYgP zh780HfJNG)?rnzQ)6s9CEDNgd>A`+{zD#9}H0OY4q|kCbw!!RcHa#YMOiHO$e*f*` zNmLSuCB$v(E)6w96wk4dGZ%Wi2%|jpg}!rzq$oQrwe{l(kdQ@S@TL$|o5f|GrN3fx z%zQXVf*&BEYn0^MZX6@)5Yfc1Sq25o@@6J%8fL6Zm zTpiNuf|ftV1k{l^so{`q;_cV_LNaI#Ua0epukV&e3NFAiC)+*Et7oPDL38j3d9YaU ztSvoiW3l@F-4m%s9_OAB->eG6bzI?-xZ9TGb~xJTFqf(671Ki>AIhC@>p7Ud8-Enqw;MLFS{>{iHr|#L%>iI>Tu4WP~d}QE8cI#f%Q)oM$)zgWt zV`ZDs20!*U8<4G`e#Kb59(smiYy4gUpRJ|Cq}@;{PRfomT(`_2Oie$HXpWP_xi76v zAyVzd0e!n+xy4Qz9FJqe6)2rS6#uLL`u`8;FjZgP1)@^B5~9EJ(_*0^`CF>DoL5t> zLq8p57cVF&t$F;p7NrI;@1Z?siIcQX(5^r#N=%1PPp>Ou9axI5GNALa*Z>jO7^Z|_7Az=H-l`KONlWT&pPt|C zFnlF4*hk+cJ?g`NL$3w%^wHTLHqZ=dUf{I#zmva8U>4!2FK@4yhQdfuS`Uja3z*o& z9a#zb%GV5hbqn2jM>>Z!k2Aq2Q3(A(zd;#zYe3^ibHT*d%RN57zU#M@Bx)Eptb#y{ z4`WHqR%&-*daUHp_~yz^*VoQSq3#b*#=`0)-z65FB0E5;RrVXO5T7{lUv~~1|JKvU z?(o^KV*nOT5&^(sXG&&)NBtG}F)Gz3_sLX(hWw2G*YQ|MSCp zT~3m{A+|6D-OqFzw&b&%4}zJlSBos}qZXvOyx(QUQ5?dFR(|53Yyae3*~)p=(CwG+ z9vbHQH@j+5E1?tM6KvozufW7#QSm$Jz@O!Fy`&Y;yXzefj1miLrQ6c6Xv=S;bN`@NOKr;1HPiHX?{|qg2+H$S)oPPWVXcIqd*U$h zGruIolv$D4@ol!UEZY5iTh!YTJV#hDsG{-R zGLinPIx|xu0(vQavOz&xMgSyNFcpV)T9!P~-J(Ale+h^)IgR*%=NFYpB5LoC+hN`* z0Q(ph8s1Qh$>J`)Tu1xXb{uWTt(AFq^Hk)%vP4=`)uRhh$WE8=b>v*#9`Jm~iFDT$ z#O!e6WtBfoSv%{oN9wWEGKE}9cMXPLAKV)H^G$9C#4-L_;gED%E?Wj*9!`&^MzMJX z#f9z($)h=w1k~Q2^v1O)3~h0N;z@HCLPWW+^I02Yl4(qim8)@CSHx~`4R+A!hUYd0 zVXKjo+dNj2R;@;mxnr6l?6HJL#{bmJE2#?R%Q|vTycb_04eHL~3wox%5T^2rxyUSu z>B3tbu0=B&x?0&g;$`Hm?yXE=G70dP_4R01O=scu)OHKZnpp~jjPaq2hz$X%6sa4$ zn51uFcamHVt>7omO;j9<`V>02C0r)4Ft60khv@2L+bMEp}TkKIhQ`tI@|H0+PUV9Rt@Tw&J(gB7)WS+fwMR zitme`S%O6R0`@fzE%N~iQAg2lT5ehYye5s+D*N%hammcoz9L*&B40yR&0u1-VlE6* z^6`W6-#yPv2@og?PIMKo+AK8qv3Qk0XVdS;OqWBtUSk(Ea|?~hGmsQi1zjA0}y zzK>T;5kA=SfVOSSXl|cm0?dS#wC^NSavO9O$3u4h)eP;0{8Ah@lB#YKQ}Dg3^WWG~ zix`?ZG7_vsmM}_&#hyo5Hn4n?nVQvqqY1>JX~dEeHX@P`CvI=46Q&L>vveo)7o~kV zfb=jhy;0Z+enYzsK%nhVK@OiGmxQ2x2tgR=0hnd`|2R`ozO zz*l+8%oFqMd$Gwc_EKaJ;#1|G2DPvc)-Qu5CL2*V%J<(N`va9zlan)lh++8|M^N&RGmPIrh zyPaF-`su@HymnXP(^_yKb6%{gr5cWlb>!CKUP2@DT%XHOtXEXTp0$6>_vA?*f)nDg z*-B{P08?psm2=ngkN-7J32iZ0FP%<<`^LBC1cqkdlm3}33QHC3%GcR0!j_zA~UavjE7Kr-hh6$w1XLo#yjdPT((O(CbWq)Zcw!gyF zrk{G$aU{Zu{PTZy{yJsp2(=EN>z7@gIvG1Cvobg;Iw&wTnYUH}^%3+_>0dTemN?rM z)=0FBZ^r5mm`v2&7)WYrTC)XY7mO@b2uAj$O1bNSG35vbU=>cur+~Y0pG;uO3 zYpZLiMQguGWcrh68IUku{-;?=z7yqvR^ge*D^=GH(+~0Db7?O|ZY3qg|{a7;X zdtKzQqdW^YsK!}QKd(Mnd^sP2DNi%ZxmrhCNl|?t^E1z%vq2AMZ{I~R1 zka3v8BXKQr@;-#gw5m>xeo%gujD2Z$>pb(QsYhg>|sSo&%pBbTJ4uK4Dyw^Ghb0M)C4Fm65StsxRi4apYj+*rj71bZ_g!>YtB4 zj6#g|04wy*fbWY;S<-1c7f>w_q_Y6}y*yOiHW;B8_)EFG@=v%*sv9Pyk=UdlM;D>BZ5 z=XLeNBo-zvMU)=lL^j0z&i2gaYZe+T@VC`|R&FJq>qAn0Qe}6o_ZW1Sz;{jir-*;y zzMrOo5q+K4Ac^Y5WOZ|L9p0H7_3L{OCY&P7HLK}C+2$E!uFY?+kb$|IT+<=$G+OM8 z2^=w6j_qLu)@6~w?KfQ5P2foB)Bhk;n&CW#VXxTg84cpQ-f3+3j6N_4l*f&+ zSNIjniR6xf$?r9=@Zl{d`!&uukd3t5@zHh3zZoN-b^0Gbz9V;*tZsUJK`~rmvx3&Z zmSh14+;FTe-gujR?iynw%~D8?5JWtXJgoi?_O{-aJET~4`K`_(Klh70>+)IJdkkCY z7mt^waGr%V%6R-bN}sC=ea*hgyvdJhL@1!*cC5`E=JR|h^l?@mo&%|<^FI;9bUA#M zoOaw;l`cEG8DCTvdb3*(p=CoJ&{2HyTm)@~aDKUGy;ly~^7sQ+(nCqY1Om&cFyJ?J zT`qq;zeXfD0iAizkK;;;m{}CaxP`xGUdiAe1R>)VLwfYIpr1Zp!(J(x`TS*y2Bbr( z>*W47gBybsWv{Pmtx&@&dZCWtQj1cS&SK7RU))kItE9cKH}#kb)Jb<>EhhU-IU`Cz zXU&f2!Sj$44~e{Tng=Glw3m#%#6S6USeu0H8;@oj(M!X=r!!>sZ1+JuOU|}O#;?3* zc#ZYVH#VOp%iwtEwn2O2%i+WSaskScX>35&|KLN*ARz$ei%E1vF&}*#&;OY)YObxd zuCnmK^9}=V?DvY}p@GNK0QboOF=CZc{$fXSYOq{z0G1{}jf4pP4@aA!H>tt)hQYNp zUVyBw4N;!6;U9Qz7mwGfz9Yi+l_V{RQ7aW=v(VZ-+s(jpJyR2z6~a7KYUlKHXQalc z^27Am>+fy3zxcAN-qkj$Y53qY$5Nw3xK3H$NuSYwF)WZkhjGuB&*@OBQ&bX2g*txQcXZ{jmUVHeEHygvx$6GaeG3wl75dto$#j*t?%u(dt>o`G$Hz_7e{A*8 z`XLXtwu7_Y@1n;L+b)d$H&>RUkPV!*A`jy)3fow`#w+xz~%1l&SeTCFbcOVn28PO_W}aFd635iupOu>BHothJKeQ zCCBC~bN$omJbqkGdFoN7_^L>m{eyVv0o5w!joJqy*Y5M>ft@Ii6fWb)qgg&8B`u`^ zIG>hW+IqiojM~!06|n@hi|b7v1&$o$^c>^yWZEFMl2=UEKfo;hRz(FaW+5`&VT*wmgZT4Se^GXJ zN2g>U5#gjU)gbOJC!2N7Gm6U=Pv(2^C@BuHx5HztcSRP^IOJRI%PFWGe-;Rg z`{nb9{a1VEaW>}feM_W4U)$RA0h-Wr{Mqw%>Uz1|iefXz7$3V7cR=e~>Z610OSbD0 zlm@#8e{)Nx!PQLpRhdp@?G+5UcZuz+DSa;Jb%C<&D|4G#JP3|K>}s-ek~&ui%J-nk z{P+HCQQMF79JaJeu7vDe4jlEhqsv| z#G{{vJu=@~p_im65TPW?OutG!WKw#QT;~;qg~|P$M*QuVcZt)`1gTr_v~^;ihs>5K z=Bx4ck%b?vijhYWBgHHCsI25}t=v3DI$jQQ)o+!YpcQ9u3|5$#f^2dA#UHPjK>o#H zGW{o8e?_EMx~-%!`4@Q7Dz67!%sv30iEaFm5kj0>{yeH-_GX~jjNCLBdjf@l?B#oExz+MbB zJ{_+unR19c#%~+UZRm)8wXC`@nwbl_No7wZff&OLbCzPv`M)oJepTYTx9n=Vs~SGb zE6QKxA{P%D#g>-SnLc)fQ7hJsYNeag+>eItSazJB|8w*F;nCOQ5BF{-OH7@oP;jK} zw>jck7s)Ah36!|5b1!H()ESkQO$ZAK$zjz8)*8Y@7rK?&!Bq~gvi?Tes^cc$#$Lp0 zeiUbY-P$xQd%Fx}YO$Tb)iScd|HMyl<{1xoigC2rZCQP|fyV!KL z?+;9ckm(4!fF8%e@5IHQw5youG{bIUmCY=jTjp{CK!d)at-T9{>`ygW=r8xw@Mfj| zs?%`5@-Ljhm{Ydxm0$dFXXHahsbjrE85~;HWMS5n3xEB^kC~3{4T%PO<0i?H+&aGF zX+l=}48Q568a8_AUJa_WIy9Urcu;i@VS-hO#TvM(fVPD~dHV#45IQH9vnexcQSR1A zonvXdKHBcV?{G$oQo9>WcThj{zwnGRn>cAX+J3B|mAvUGegu~qlS!oEhPbdzJ@iG^ zjP5JRRY%6VJL?r=8z2AHR~|Y0?Dc`;moZ2^j#a@jllG@RtkzYL;Q;Y_9P>z{_q zEH(<-!3ARz5W+F76Y=Che0 zdzUCc1j~8inZqn{L1M`WYUKR}B5xF~6W7G#Q{C{2W-qN>BKL+KojS(wK9#hF>qYiW zdHgN&tNLbrYdr-HcOusqPu2zRr#2yYg4Wh+c}|Rp+m@dABIy~Gf8xuXAybZG0WI_* z!UiT!5(#51%ck7}YAuBJ5B9#@fdrI1g@~T02@1YpGB?zvxW7sDM_gnyZ184|~Bk!B(N;5o* zIFnj+1?)`9x7Hu!k*sB+pJ-!mjzMTbkkEh0E*fF!awadTG4-3V&B!q3{y5hj^jVfO z#LaK5q7Wa5#;)u{q0uxHOc(CuY!G%hZx@;F{8^RNGl#Vv|MOIm2c(Il9r-WJ8pkwL9 zo-i*ej{SxU=b%3CV8-aFq+BHJ=zqUD5l^(S@Wv{Px=at?Mjkh=Hgpuhejh9goy5%7 zu4yd{v)@3CX(tJ($^qE=NY|&fvENupuX2s91rv?B=ePe#Sh}k}+&Lw6zv@3;RrRyZ zyTnEODG&=EUI?P7&AMy+cI#uh?n6Ndg-AaLoOu4zUSdfDVmsV&|EdC*rWGmQa^lFB zQNOG3RuelC2)LwmG!2fjiA`0Uh9;#NuK#CIOUC4DsgJ}P;>2TzvEklWb^5CC!JMki zW%NfPpkp#6BtE*8F@afJBzx!{|QSS2b!tme~ z+t)sE2mcCp2{6C?K~}q=ye@XXx&??WXg94N)~F zGs(xC$rn9;|An7moS5DaAZsWsbc>mdu|Ae9q{MKs@Y=9)-ot&V`0WcIF9HvJuSN@H(3Qfq3 z$4fI()$lcg`ff0}cXy`iuj}5@@ke#B9PO$j2^fK#iDBU){{%N=&imGfHKO3e7Xe99 z6nimzX~zDQgl{?V-HiL+jI-t4xNdUYswyJHKTf>o9sIK#@P>21>N#KROiJ400(IYO z=lREXGN9+AZXm*VL9{Zf5>wh-`BFZ#PVyLU$yeCYFO6+Q<-5ILb6vk*!dGyj=!W^WgL;qXl4QUU3 z>Xk5llo&I~?3bilKG;ev;HqJBSzvB;U~b6=r)MGi!?(9Y%Lp`G`IZFLL(?AMF%YwG zg$5R|H_HF5@w*Xuzuc{&0b2Qz7-o?(J7H*=Q?E(LmULqEyJu4&Kw|50R+IR+2HbV| z7DraCGZyy`hg6*;-;<&ZtnJZ~^8`U6M{PwbSqg6^Rbrv{H;fXHC-AW-5rcnycZPHT zBF+Vj28tR2q!A|1p->xs)g_>H zMyBqv>pb{Sdv3jy-{~vUK$Eo(PAdYAW2o3lo;Z^|WowdJ$%I~H8e=8_Xpq3LQS$q{ z|7L=W9)R4tCMpg5p$3`-UFE130v8A*Sfe2$b}Zl0Tg!>f~={bF8Kj zZ7$pqjU=e26VD=?C!0Wm_&Q?1G^`(^1}KKi^>~7_CivXX13TBt?ToE^L|*)hDaVak zFG*$EcbjOU$SJ%1$QcrSDV?6KBxxKFm~|*G1TtfsOTw zss5xYzQ5oU!}Y&JZ28)Zx8esI|sK}dtqeaZsdXbzcWkviif(^878JlqByX0Z9U z)COu^nK^!@QQfTVJmn4Pw5O|~nlb4_Q9O?o`*s(nUgG(5K3i2jq$tarox~C%Rl;RQ zVH{1uSbdesA`!0`$c0QwB>Z z_gzxqMNv_jpdArA<}%%jGn4WH%KZ-t19y?es+13`)&RpefO@tY^d04&&tLtupIXBE z&4|+hh(KOt)EtiRh8L^+Wf`>goozisJ^}Hn>uL>`0tuB9KoapN2wOc3vYt-0 zGs&PcttEm2Oon6q!k(gkeLsU)yrj5OwC1(F_xn=KBM)dVfjf;jbNBDzGLX=pTO~7d zVPiEa)i50t2+n2&TaG6MAV*Y{i!u!9bl4QwbLb`6iA)gTz~ zhIQ_roDofnj6ZkJfX z9u00?|4&iRpfh>2*h5@yjTW@_#S+JnS%*D( zusL3jXfCp}&p&6%m&T#MEPUucO03!f$X=m$zr0wzL_J9H$(l>=1pH*INyhmK)&)s) z_v4Pom-~?ocl526 zOVj6^^JYLZ=;ebR9BrM6#x>4P+_e>p-TMtsfE3D4!FyJ_qI4I+C=J{mM)Ad93dKWP z`^#7sFwqNU2zN8PGB5?HX$15UV&Y2cW~Ns+JfcnSADs1qw4oH8CQwz`hdw*6X-xr* z4z_|*8XqFD)JFvFRN{KZUxl^IG7PqXb?^9J(?{QPXWaX;Ky$1mZq4o2xchnUn;YGj z%D9WkOU$OfzOV7VMKOE2G7@<&8*|B-{U%z7` zozP=2{oU%J$x-6t>=XGiNzD!fZk7aUQ*2j*K&=(Il5w9x>WWCL#(}7S*B9nXAWBE) z{sROBr^!E$(LasMePJrT#He4t7$`G+EA>@s?`s8n=GrIzW=LtYdm{}Enex6B1~*ytsaU>?mcMwLkxHHd-*>u@^TSj$2?`DZ#%Iaih>sdPR_F0 z>>2V~=%~7Gsus$1Yg#O@GES+H+0#yrF5{JR4jAD%5XL_z@K~@K^)2wB#fuJvBTa_) z*5Zzcvrs)!gDmaO#T~k?$+`R?ws}@MsaXxzj_VXsh~oA=-4y;A!+>LSF{n1VcyDW# zm+4Et|HYOT7ZbZ(T8I$)TjP^ES=Ncy7d3h_7R#hvrQP@U;+mx*k11xbnUV1jMLrtE zwQ7<#xYy7)s5IDX@AuqZ{V5CTg&k>C(p=>Y#O%Ghk-(8$-^^f!YG=0dIFR$89`CrrBOi>s270GKq zZrOT{wU%cD)m@tm+Juhr0d#p2d*8NhoW^AbTQPmKMv5wa6|>p|K7kdo#JK zLBiOww~Qn^W4j|$NM)-bdrTAw*>~|=)BXEC^Jl$YKG$`wv!C}lCur}XyRF}2>a|yO z=jKRHQi1pu489f*)m_Zs_=XS}I!aKN!T`8Ca`QycUcwgs;Lm;Tl=JOr%Z0efSC0@vB|eN*ghUnE6!5O_WD!%wO0_& zo5L2yQsn+Zk+_nJyY+}cg|@^;Oov9ceSQ46BKddm!Dul?pKM>=&seq7Tl6k2MsDp! zmF~0g`%?4p$nq3Z<>#ZeVb`YN;}@!;PA!^z{P4iG`LXTLb#z44x0y3kzsX5O-|alZ4cing?)GKlc)M9|j6fFGp_(vDSJHM)NKTFrJ8YT!A?EYBl{G z(}zUzF>`w+uFqII5}%LW+qC;y@~bLJqC%i)`l8+h4h$6SFHP?|{3*=yChOu;6DJY> z9fnDzq|rH`F$x-12@#w>?uK)FL)uM*cJ}+V&r{V|yK$TEJ<;?1Jz``Rgfm=Wd@ci*FKJ1@e7w)wRdg0sDF3mMr}F778-uJSfE1rN6gQ` zx~uVjkMYP_ZoMGq-EFJH9~%&-VLeK;M~wT9(Z>fp@RZfvuDor0dHQ=t2rYm+opZC1l6dnndj9-T`~82U zWg%=sWA4rt-*mF(^{p(vtKl?iq4-kDkN>$TD*tK+NjI~Jm@V9Lzm4dpMj5TON@J&w zeVe^8_U$YUO6D<@xdSjrY%kXGe)@xw`~GDRqhT)2Kn^1zxlosk3uOVdzS0$cE*;hR zvh^tlUE$qg%v0GkKIzuUEy4;Wsy<*NYK-jJP8t}eQo;zzkO(#VXpKebk-{(k<3}p6 zv7p#-hqa^p@#t=Sjh`)m;;Av@R|kw{B2sUO^Y(r4TE!0M(YIe3RsK|RQlSeE6~PxR%< zkuS0nu9PiORogrAt1%^)#|K2vt=B-r+p2JrH8l53!@Hr{9ocHxXrLZG%^X(K<8G|` zCVA!gVe@Xv#-|43-9v+|>-pOjc&?j%O1Z2$g>RNuju!?5@~i)~Ue77rJw*#_de{ZQ z&%CgRA-$L3Zrm8hq~(=0SmF-7k#>jsT&H<;nP4yBuJ~HBo!925WHgVD>yCevj%q&> z=8CDlZTaV9Mf|+<{Cmmgsenm5o~dR$&9~dTcOyB$<+vd(0NT*Py;nUXTn@ekl^-&%Gvqt(o2FV*4^ zjZQ6Ygvj-s`C9S3mCkoD^Y>53e7{xT-1~bfmL^Nq%WU{Bp{DX16r`Nl8ehCwZjrq# zyyv1(?19!z42)n%rR01xP+)b|vEc>1G^_>lUwY+y19*Puni_N(Il3CI9-CpO8PYzc z)dJAa^ZDDhar!sW^E@JNTH`7fK5am_^Aa|RZ75*_l zz&j7?{p)Ajg$?KbA+<4)lG`DY1)aOP^ZtXyb_0x7u2ho! zUv{b06%#J-!}F=M@3TD)AKXqB@JnRCgtv%P;oZrJV6>)jh=s)E;bv$_xt zA^>+lBri9CDemBBltoD(=F>|y1GL=7+CfZN`($+Y$X$>Dk1EkULmxP;5%i8s36m8) z>cy|`$EJ>1l6;y8BGaES6g#*eoYQuA;->3tk=npH`g5A>nUsm18jvyDzpPQbB#C2l z-hnLt4-3GUW%|}v%y6-3yw?92ek*O|{tY%gv+9^;-~$c$g=>~;V@KfkKcC)zC3_!{ zT`w5=;@j{}=$!KhPkL0y$7otLL09-4nI2tQ_-x3> z*?4c2QroybJ{elD0byx6eG2{5vbF~{W)l#fd!xVVhR>j$_~5}CC*kf0MoO@%kY#N- z!i6Viz;&yd(1D&G**f?idR2vrE=4$70>Lt;Wq~rE`t8JWeTeIhH7y%A_A8v95r{Q4 z*R1}w?C^_U|MB50km&en4LFX^b;mT-n!Bdak{-=J$tyYn+OMA7TKL3AZ2IM?mZu$b zR-NK}G4J!Wtx?(=&~716lg zp&?DYOXa1SeB6q-*|0nCg|hm#v$f4uD$%WjCQ!879iIiu4f)4Gzf#B{oQJfB%2fSF^)xk9)I5*2}FuxG3w)+QWxKs;?G4` zBBG{D)=NKgCm9dw35Igxomw_ct+Wp|dcYdYwXyziJ==iz@3*4@f)Vw`ZW6{o6aR630!N@$Vy3qV!eYTHC! zV`?!iFiqLrqg^Yl_7Q7j5Qo6oXlM!hE93Sc1ZXRkkMTO6)q3%zV}r==bHzcUy0X6>(f@2{4_zw1bWWk7*gUihxYWQ$+1TVWZCLCv<@o$apd} z0GNyq>j|~lE*S}0*LOrrOiPM|6s~a88vxZ3zBUZzh=U&hGW8>(IeZ3Pw|r@=x#}Oa zboHmDogvVQDBcPc{9A?ByLPS#-DaPXkKq6|_gbEb)2_(i`}HQ^N14e2Kq$3!{c`Hq zv*u!ITO+NAtp4J#K5Rt8+HXt^7kf$rgt|{Co_*ble@P5rW-D0jBbtdP6<%eS$|{xv zy*iY7@`-?bVt>Pj3f09K<3Gy_gfBk(UOa)q$FZ}JLTg8Zfkie~-I4t=pg2B)VDqVA z?LM@GbGHH9^J3gFZ#w`=|Cw&@1i7Uadfk_iL9Q*${txYFCdIUa+;gT2x9nMYo^>XP zWNICfbR&vgX>P_I6x@L=K+2v0e+g%iB77KIY#k@w#Bq*q&CW!=q8a>E6{!!ugJ~M5 zZDyljB0&lmF7Y4Q{-q6)NC+kzisvXeWy>c6@$a!=E-V715<;sBB0i`MmE+H59`jd)LhwL4?=<=?*^)jZ!s;3i1h z1!Ta>(x{2(FJ1ph!n?bm+?Ef`*0A3@fj?N_{^^R>6n~I9OH?Y>5xS}OL)46$7wR;$ z2RICA4Kfi(e$b>c_;C46$vqjUAjYv0=)L`lD7^yy{xFcK;f;i9TGD%8O8*y1N}AJ0 z$viC45S{8bk{VF&A-zxQ4_d6JW=f8@_@f{SR|c$vVluWi!0f%EmqdLs z(8*jThc$rH@3pL#((cht%gWe7dPsTLOi#vTBF?Sy|Suf+&n`dg|r& zpS|rvD}FwDGg_g`LmqfkZ`U=7r3I>cOCcw1=gYMhE-69NOX|A-;LlMd+Cawy5FdU$ z;x>a3=cEG%Id?k$25FObEe8s871=d6bPG`j#SL{mP|Gn+K1TYgipYHRif!IR$ z;;YdRB^G?M33{?ZK@Ln^0foL9{<^KkdAQuWL{fY5Wp9PE2AvNnErcd{za<&a>2&)g zIQ_Mo;TzE@bfMzdSwgPQeyz)Yr4SV^v?5m|>tNG2$vW6+0EBn3{Tz?JcrVyn-E_}q zM+{-#=argOSuJ1^@`ZA7vWc%*o zg4i{nza}sL`HOaQGs8NvZAx{;ix+~%{iSQiJA3Bh#ZRy*R)Au8e38>GNV76+fr@b0 zx5Fyz&Sft1h{)0j^&VI>dPWM6CX{Q0cSP@Cs3JZn#(1ibdUxmSG%NP6seQnXwM<%d zXTU!8yl5KbZTz}ERlDz?@#@A6pfAK{1nfbyn`c_?uvCP4bY<#IqG$)W1cWmhc|@p0*X zwrHuDgte;wLYmrO#}ik~aY3goV~nFg)jC3dq_da@!Ng08 zI~2qVK$ei)z}r({(KbxVC92B%tz2j9cAxrAB34CZ&vy|u;I~eNe*ZvYCj&6ZjjwZm zZ{cQv$#SAc)7EHl++vyRkpci~HVZxz8$C+gQ_cABa06)VNc z8zax+9eFPfYez*_ku#5Dy)TT_C^!dXi$lsSuPVFMzhA#TeGr)_Il~T+h2D0fQ+gjY zrZ@pD)38|?R>wjq&A;Ka(%f3F^I*vrEr9lmTf6~2D7g9W3in?n=w^j+M1WqFTBabr z8YvrE*OE)3O5l0$ycGrWoYGnauY><}%|Yl?PN-+Vg$G|3f;*@{nVPW30{MN1mc?He zc5qNy{G4$N1xJ&kf!TEsWq2OX&j7GLLF1x@+hz6~+|E1b^I<_yY+r!tadeI>R(25T z2KSFAG!;#kkub^q4S$3 z)a{s%{8!9FoMj$D1(b2Njr&EM_YM~5|Cj-St91ANU=aXjyL6F_$VTjgRzR0iv8B}wI`bcx;ob$F6PLgry zmw>(>q`&gd0+6S_-jf?>H#~`#So{binclua1^=E8WF=B$@I_li-NiUoW1h(i>R@sL zo0UZ>SU6ZIFI#uk=r=r!`N`Ib6zT!|@kQyq9e^9oVFyd|6l<2_ej3sHX|cOkUi}mT z5vcdh!@nQ3iN&k+HGiuXc@#S7{}5d zgF&6^F}3<d-T8GvNSNow(w>*`UOSZyLuF*iSNK_`!YbX^(tfaSyW zG%0mw#WJ}Ak9CzR?85*CDi~aX>De5)Mb6^@ioG(i{q^~+u;q1ahb}Gb$OT8Z@&N_6 zojt6DEa>6%rG4wuU5!GxOMko!o{W?Za2BnkiYR5^M_z36eGa|Sg?scS1@uL<%i6WE zUEC!s>oS^Xyl6$0$GXDRe=6qB6EdvzT-7Ue@CB6f+Hj%2;r>$zet%fBIY^V|Z|%>0 zy+yrj^X1*Qan9IPB}|$$J%Z0L&h1J3k+UX{G=d3IU;8-esnsRWQg8rjz``O$IMyU5 zTA(2do%tv0%*Wk5`<*OPjK$XuttWtdn47b|&~alqXRSQS( zDU~~JkFV&66(yMxa*mJVVQ(F}i}eADUm|Ob2QLZ$>Tp^RMcqRc-T|2@y5+KV(XfxW6sD=w4^8I;*EdcobYT*ESkP%i!Qy6LcLR z9kIjbyiRHQTrXnZ{J|-olgqw}SR>A&H#8G7isqK&KPRO4yYc+5 ztGg+r(DI7bPUi1lFtnP;2ZnPry2ECIH{Up9Pd${v`7xxPfBkb^2gidk-oHIabzivE z0~`nZ3sYkGW&_FLRv?o$X}Ya{adWrx2S@S3(}pJCK0Z@t}`Uf(&TG( z$R!tp9E1Yz?msurQPSP9GPkuI4RUx(AUR(cimEAbXX;D?%de<{->f%Tpwq+c!PBLQ z_GV0W!TRrePtO`Oa*WzdlAlnlSNiXwyI{`emf8|I38l`vCuUuk)TksKu^j$7{_{M; z*7tz3V$tWX>$c-dw0Gvtw-FUq2D>lQ__&Zueg-1vykghFb2~ILR@XePr7EIaNThE7 zDf*Mu--*2*OUK;SWipFHbF!KNeT;TqP49c84*qb3hry_eePCPt>+Wfd;lpCso6YufnNk0p)nD{pV;d!9q>8}yG#lmo9KVFflprAn(I2Lue%o_h9h$yPV_oZZqc?LKu|5*zq&AuvH z0$9(YX#qA7=qz@yD(6Fd#F6?5By8A^gUC8)OVMS8M{JvZE-LW?$a2HhGRnEHqTFNZ z;zjt-sP$<#5Af>`LU+l6{%&d4AFTcn{Da(sCs1N?3Jnuq&&+S=7T@Z4rwj)}1~g#u z0wTZEn2&K3JjNQ(1@uS~A16=Ek)i`tCV&VQ>Kl_juFqMO#E(bs7LlA$6UvmU0X1`Z zKSocXCM@U{j~8IUo|Nl)+@p#!q1bAH^c<#$ID9~J!^K$FpH_OFIqOx~c+(&!tEp$s zaY%OC5s@Q7*?{+dLzkYBn^1JXzpy5LT^{}ChR2scpfK)VSGL%Y7R4#ijS1dTVXn?W z>nuXDBIc-hby>=$%6p_k3C;ns>HJ3PyAn#;pmmAzWFX*BBY#LY#pBHv?AJ*HALcaSV={$Rur^#4YaJ7Haej z00lieQ@L&Xn!h(MLwBXsy!w~VzWL3_7&Q7o2|uz2QXheZkn=eX7AP9cY9t{XX&m9A`ArjZSas0k}N zE=e4=pdLEnNqB|+V?@8tY1+-atO6VP9!BWR_Yk{;+A2|mf-v&_t(l}1qrTJ7syIr6 z$%ob~6z(*=XfKnKC)mJX&JNF|T1;YoSV8{Ioca6{|M~5M0KD~w^TFpYKu9ACiKh81 zAqrdd^Vfp)#`)k2l5Rc*A{IjFw`^kSxS>W6UejSG`l{g%&%ewjhZQDUMDDUas(UkH z1iunX>XMw8c}t#!AeTgH#y8A(OYE$)`;TEGQl>t0DV{Kc>=?FQMZ7yv9miz*Nz??3 zs|@|Z{L=%Pa>A(j+je?4l#M5<5?{^;)c5qOnt~#RUP)r%S+Y8&J)GZ=#rjq4pQNnD_QLh0SuHf1^p#9-5DaOICOp%!wlX`N_@}=q{xhHSGOq zszgW7nSTkCqXd13;jKrZf`jU)Xgj=!>MVpQZn30Id9YB)=*^SYT+Z_i?6H(5Y9Tq{ z<4=P!@3jfnKkrO;E{G+mAS*R+-5=)7NB=#FZ>F?3&oQ-ab=CFLlXWuudOUCspT&Mp z>|OGjaNbLL5FXTrE!Px(Wtv)iN&l!?W$E(9fN6 z3>e8lJeD*|=z%E0hGvo_(l*wFJ(Cp&G0d@%;Ofxir#s^i0pJJw3b4NP#7X z-B})&_H_9#nfB1QXl!A!g+lpAYpGz$R3vyK!&^`=9?G5IM2x|n|4`_G0O@Eu6UTX*jK!!)2Bheduh(^!EeR-Kh(KG+jdXwvG$R`Q+mif6Rhs{-BxXgf$2 zx|Yf5#1{!0X@9uTq3e#O%c3R{NQ1ogVw%mdP6KSe$*VHh1S&uCII7vteY)GBv=)l( zg#^9kup@(LRBaqdhQsuPF*$_oH_X<5F})|*B_dy`=yUIh3(ef=(}Ywrx)Ei!VlG|&-1UXf~Q@S<8)VGIlIqeYc*-ER-6ffH5dp>f*S7GgU{WL0Z~&K_Z$aV;R# zH@?{A2!t2S+o(Q=he&j>ZC#9sp))zjf^MAE+2V-C$uLd|?F;#TiK0xjPyT(eA53k$U$na{8OVG&6e zwN~0Tw2(P!J-sq%`oS$}?)uwAq59R@IrDQ@;z>)$0G$dnj`Y2i)jv0z>b-E4*F=L! zCtNc1Uy3)O+4^=0-4(Q)8MZExLMtE5eN5qg?!rBordIys=nA|LvSBhzeHWYux01m2 znrh!&)hqhBVGMTakw``wRhbTnz{-JTVz&s2n9~VywVWqR=sr@dzgTKQjzBwYOavBg z9XjC;AIP=3iTa90xx|v1h&4BU_w_xcG&}95Qe7lI{53NJ$y5?$98&jrbT`(Mm`mW6 zoESStF2)#`Js|ZG65;yNHC%r00x28WU;|pPT>gegQXD1=0ni&x?BDhvKK#gQrX+U{ zQ48e7U>=Wti7L@w&BtnXWQXTzQx3vqV9^lb@z~>Nl%egw>Xe`E2P_y<;2XD~Qwc)B}c~7{wBtO?|jkfSy2kj3zI;9DD zg85u}$8awwNZNT?w3^HAkw+^_OQg-K&7dlea=U3TXP|xe^1|x7)aUSfDXazJnZXjF zM_$xzbrzlpOy$q@dy+HJjzlhr3hHZ0PAn@TLpMzM21*i93VkiI)PNh0~mi#=0 zs#vtRB<%WH+OPSry=?Z%=eoi}sEKaUAY_o^#yWb<4Ai!+(SB3zFV*;b@`+XtCaa_V zL@T@CU&PXGp(ZMrY%K^pc-3ratP?rhv)dW}f}M6ta>5SLUi1&82WI!BVa^-5)P858 zoZOaQNbG2bdK(%v)m~QTCkse%KN=@a-P>+5)6NaLv(uLa_-XCo9CYy_<=a?SJ>Q@{ zs_cV)@o#C|aU92ju0+xb=fi6r zmp>v7supAE!xTQQ1gfg;LfVLlU*O_q;Kt1nIHlu|^(rO;4?=|OMUZTOVmV)}xI zj8F+TxgWLW=@;^I>xPxY_f%4-#>U^crsS~0&QLxi-*36!6VuXc86=!PT;(8l9~J=- z{}{Gq2po)@fjLg{bD5eidXN9Xm&2S4TDzoLPgX1a5U}^KwKmx0vu6vX{)3kUTXMQC zo-3gnyi^l+oUUph$XD~RG$c_^eCNp`!@0?0bU)@|A}VJEvj_$ouw%DV(P zl+E_{$qteGlW(5FOLp<=yTEzSU0a%8+7h=>6E&nweOE2U+nkJrA@wdpvYLF+THw*P zL>YqRznfP**6JZ{9>IpKlN1!D$)zZ46NLxMS(y|e)x$Jjb-TyI_uq%a*O<{o$lZu& z^T`&DatNcxMQ83TqOEfF=*CEcHYbdYZ_|D9#jnPIJJ z7XzJrtRA9yd<5^I^?sQ5 zHut9N;%D{ra5LD?C#D|!ZNiZ6YP3_Y-kXAvGEYf)e+W8M5yAd#3}Ix@ z`u>nx+Btd^5WnkW+TR$}wvoa5*mzi!f#6en(}9+qEoeB@{_%L$Pi zwQXM%X&bs+y}%(ZaU`ds`1NWFwtfo@K-mloTnhPpILIC>>k>8m*-dTkdVI)%sSF!` zGL?HV!u9!~x4ArX{oX<6yGrbVop&%r&vWmRr$V%9ezCabyUfJM&!o`Y&!|>gh_UP$ z3Xye*AEDnB|Az%wod{&NiYU12Xa-i2#3PsT1s3YmF^;U7pwu(PDWL(sZ_v8dAj4FV z9=&KBk{&x&4nLpO_(z@5jts#5jvcxLfX|x}i{@GTD;x}Gx@_*h@Xu0RoRJc!Up0Ea z*@tl1Ed=okyFo+U-@K4gH*TukHv87tu*!O+ z9VT3d-?3+CG75XWUZHW;V53eXWusL0GRp^x!5j-O4O=QZtqwIoJ>-_@z{|8{!>E~R zT0ZWNeSqq3Xf28430Sr)qjzs|yc#+h2l0p1rC3Nu-YEiIT1Phx%DL-%EXw!O)>%6>fUEc%8E}ie zva{qqh-*B6ia7|PXe+?dtiX4P2V~*E<{#_QmUR>CVxcd6k3mg*f%VtHFvBEji%)`p zU-Ri#8+R5p!htwd-vbrI!TkOyYSV#Tm}Ylj>FIom1JP-6;^ z=C0_rT^I8isOzMWNBN`7FOz@-Ka9XAvMU73jDvoMaE#&Pre%VLFshCle{kzC`5p8& z`j41ydP}%1vE*PNSA_{@-9G20mftH^rWH>C$oVMZJaGoR2|sE#<@dCMmHR8MVr9d3w61sEJmbDoT56rKk{~k5^Or=Mi{?rbLPj zRygVPxfR}9<17}^-0ji23!^2@WLp_uF-QITKi;Lp$r&59Zi@65|3ewV7V6b1$bQGT z{$qI|(;*Ky#?|LA!`U}?PcMk7S+5+x-G2|4YL!c)NYH*!)G_iX{TU z*$67`9}v5P$zJ{aQMq^-4BDqw`ZXMSi@>Q*@kSK1#AF8Z0LP)^gw)0XFog$I?KySl zk-4euk&%a&4mdo&Du{=pW$>-agfC{p2WFnaNvg6ga_Q%!zDD`JEm zj(yBduyy8`V?4q2D_3dAWkc_SL3I_aBcR)$M{*)rCkW6{wK$G4L@0;v8+!{^xj>?^ z!wSn5c?}M?lGWsARzD5X-cq`5S;Fg}cB^j(jMq1Qn7I~{&y8{Vh#`AY5BGF#r-F2a zZJdwh_6%*ngkz{W=xnD~G8I{L`?t2@s2+Pg*JgmhuIj*F=fMO8_OsLxng|V!_7ga| zPK!0jU*t7p2BWazY)Vga!o(qhu$G7?`0F0IJwT7jo7bBDIl*8fm>igCIM!c>F69(C zqkWVfmyOkZU>tUksThJ|d~U3W(GIx26G-3W#p~cr>U!`eyf3LQOp3TZB%jNJ%uUvQ z@vs$OKKe~^tyC^+X3;X_Gf?{3i=0tds=Owc4M;rIkooluK;?) zyt3^g?QW zXL@Q6C~ZVj!Vgo9t>ZYQ_kX0?RA)8G=~BAK0nF~nU8#4FW`xB1z zOhqVso;Ya-Yd2`M3HxCqg*8ob|lDgZNs5ZCzfjq$!W9FmD zVyj`dA?nJq-?M4m$farUKf!2F9~x&}XPNT58jGc!qKLiD<6|Z+?~+$l7})?*o1>_p z0v=Tph4SlBt$T@aJfeAcQ~Si>K`B)C3pLr<8)S8O_w&XuaXZL}LF+6yzUmHyNv^=5 zrL`+bApvO;1W96xq?;R7rIhnJqQM*hIKB|uh+);1%?4iZHDv}XW0@5C`i@#q+8=#j z2gMdY3uJ^H**t}JG-%AV^8=^pA4i+Bfoe{6|8zv7VV3^p3Mo{(eN`^S_qx`B!Q2hr z2z_bPdbzax>~-=zh;fn!ymoox1%EqqXIr-})20j1dG-i7L}p%E+|la2H(@^Fn?!Am zj5lYEcm?-~pqM&y$R5}3Nz~rOOMdPj#7_8dMCSMJ+-T;>!EWn@ohO?<|)*>sWc~UQDl5Z>ce0tb~YtWoHOL`3Ul}M(Z zT)a)IrAD9Z`1?VhtU#|I1YQ-dvpDVI+aNh}*ec+LBkYkbYD`X6YW4z|WzKSV?o<@^ z>H_Sw2+}eQD25UVrY15btAS03be}s_&gP&_a4uG*6h^+694Br_b&4RbzTN)~>o5C< zVu)2d9`a<37+Vf&hFgS0C;-KjqQ+LCTEVthDUgu~ac0?lD(DDQ{)`jtL$H!lvE98! zCvSArkt6Ir&TfO%L}XLQuaBMKG0a6L-)f`Sg=9 zmf8m-Z_Wo7|MhX*4xzm6?Wn8oJQGo3O^laxi?oRPCZaKSO9Gib|^YRtXz| zf2bqQbQ!G7Wv?MERJVep_^b}Op9M_MwY7TBPJ03zeWn0sF&*Y$9pJnuJ#K6`#z#0$ ze5U*AaozQ{#PQy-#zdngb{`;=X$OmM4&@{@5tMtwRc6BIpH{6UCt@1|!JVtSQMeE* z)2^>Xn-Tk8VpiT=)shprI)Ss&L-5wAWPNt*&$R@t(q%*Kql!wC))GL@bdMMIilu;lr%B0)myLn5wq&t_kd6vd zNw?~%<;q{~h!3^2 zMA)>+BHa9wop0H%KBQ@CTB409{UrcGk)`hGat?N_=yjGjF+H5ig?Ac` zEx_170Ya*+ItQzrv1-(qw?ilgQ5JXEX<_`S3Xg=2F}Oe?X-Ipk6ZR@T9=YW;QLr%m>akg&1)nZZ(j z3GV)Cp@&W2xXPRs?Kg7C7O=QES?|1@RUg?5?TdSpr%IlOk1>V1dNYNsQV(uoU4cmLc76lotqNn!y3GCqQiduN7fw!IY3Ag5jRefCOw+ z4cG}oTZpAM{5Q64Fm6%$pY?oCa_LE-9$&nk+Y$1Rq-u(32U3Ng8`0cNxFY0dQX|K6 zZfI1Gf$VT*a82CQod?-!2m;KBy2ioUH5$W6NhQ)y^*LjoM*_;8hW zou$UIt4~$nh~f51llJbNcR;^gAg4>z9RA8~Uy@M3TG!Bc93@T7zr3G>X4trP3uTCk zBH2 z>JF=pWUuTVzhNtB7JfY&sUl_!2XRsd>`&n7P_3^s&$pl<2ma|)B`814Rox|mGBXCy`7iyN%l{F>Xd{I z>9i!%&Pm;i%2HdH%$ItnrYdh%%67`b%Lo!{yybCObw?m&v{lU_w$X>afDu5%;(3i2RQ5GDDFnC&dZZk#sv4}N1_rq zK6>_DN3a8FpDJ7oFeC{#QP)qq)~aVjq<;Xze(o_}MiK|La>~smrj0oJp=Q=T`4c;U zOOZVrO!a|xM$^P1@zO1^lmzv=o#shY)|n<_MQ@{4QNz|cH>@LyXqtsw~D)DD*|QJ1C4*YPFqa-?T_DeFv-F z_|@Hx!e*s?;PucmjA&|y{)X=z*i}J^`3ETiEnb$QTfcu2_jqfYw(6_2b)d+w=O}W? zC)*nshidpZd>!gh9x$Vi_5CML>Dc{D%))6e-}PZxl+l#vNSqYzNRhj9sl-ND1aeRh zHLP{l*Q39ZsaNyBBoF%U%$_un?MQ%bcp$4)1|_Sr?SbSOzvRSg5x1^$+E-5)Cv^D5 zku2+ki^tuYYUi=Ex;8 z0}+0tIK2PZ{KJUq1gQ)-4_qwmW(uWAsw>~P3>Y4p6t!#WoZe{M{f&G=*Nvu4l~}bx zZyDDoq$6TTyEQPzBuEyIGYQ8ql+7ms6c~572Y+dYIY1 zrfwNv75y>W3V5D1@rTnm7#_X&%w-{F6pNlW3D?w9>@jFH4kD@Y7R{e8y-b+I^0K>l zY2-yEQH~P3u%{h0p8rt?M$idsSggO<1HA5kvFk}u=jj`5%AfZ{6bWqDwv=&DHPb2? zSVPZq<+QSS-tG(J$GNyFl`En}A-g5-q`(FNF&U52V=*3fVsI`+mDLW~A}HmwKJxHL z3jn%eJC1UfxI(D1^l;{!8{~~jK7F=7kI^WUp(BXo{Bdyluxp)m#^pmuC#rDAuN3OR z3ix6$V^T{&D|z+Sh63X$>BclQ7APJGw7GG(?`f`0p%eZ*9SyB{>C>_6;BR!{@M+qc{EQggcfqnv`|3)$SLX)unj!>No^Ct5$zx+S4dw zIorRDKKPo&dJ3NYW zFvF3bUo6p}U=<6MH-!pWbk6PQCy`D&C0uPwT9sm`S;bSUSZ2I~_4mK3S4T4wDr=>4 z(Dj+`D|qU~vtC_Pe}hIFw^7isaUA#adTA~1h+%7kVp;QHyzmLnTvKHd>1t_fMI<9+?I zd_F~ssEGMPZ$7~F0XM@&FeO~1bPwK&iBd+5@8KDA~+t6JHL@c(0vR;2*^n|`L1VdaWvp{$R{HxBB z69-RTEcEi<*vRsCEgW? z#yQb<;vDDg3s+CO_IQZdnhqmhe3|$aOR}$u6;UuI+oJw#l{g3f93cAF4F4YJEE!-* zh&qXq2ogW}N?NNd09L<|?fc<+uQX1J5#lefz=wlio{#8NcmuRzuz0)8jv zR%kDgOOf6VPH9!Q;k6Q7Tn>uu1y|7A>0nsnNz}XV^|c_gaTF^K>zAyl0rOHqA9m<- z=NNl+{d@}2!I=Tm&|>v~5nW2UJ$H@#N3n`=C#IL`qvz|QggsB#hd(^loL-!;%~sJg zvY3@=&J0Y34x`O2wV&=vE_-WzdNG1&;m|ccCPS{3iq&EdjoF5G7kVfxwvpI!0!E9?59a(mFO%ut;gN&Nl9*ia3p8k8V<5M6FOT^t&zxzcR$ID<@_LfmO-e{u!nF5=2^dMsIo8+ z3=^y35_wS47a34jt&Y2%?PV)bQ#<_NX4Q$F0hDEuhedAUv_-HQ_6pPjK6PU;{TROm z&&z>x*7UD^V=q*6P~Bc9%4&|E)_pC%$myC+ZqetSJBZXs7Xc3|&pa5&j1Lj7z(;Hj z?s))&&%K8gB{f;~^Cw-~Nuj}?v{xX?1NEMVPGs-m5F7$Q;C0WB<_i_67p+h4GkW|? z%*1|LnCcW7w45(|l7Xyi)-9Nn+piprQ@$Cu= zhz2|4Nx(_{0-RJ;?_>ba>n&;$E<1jW0M`+wXp%kRNgBo7E#ZljA&g;C0`_j*Q;wpI z6h}8M9s7u9k2OKCq8M?YNj=3fw1k^W_E=vwZ5;b*Q+eTemjanZ=YRr;4I(7n(#Tf7 zWP!ii{dg(FYXLSMPfDrYF;2F~vFKPNX%?5FcbwH{C$E3hUxVVMDy(IwEuc(b1hP<> zH4+i3_3}7@)=qxPq6U!VLU3MCPst=U5rcM5Y5S7XW%#W$P&Hjbj%Oal0u)f*vIcx$ zs|Ofwn~=BHZ0H|)5~{>K<&KZ?QO>O%XM6;uv&WiuQ>cO${29yP$bf4{w^oI);)rg9 z-cYOW?PE1Tx(77t-v#T(lVXN3<^EX5q)VHFRd*IA32-9c^PE2*$C1E{5&=ZeR-)^! z{p&l6V6VfG{bA(?r74(UK22g@#I_K_jPaIq#0lpnYDOP5`>ooH*y6PkpKGSvd2d5` z`X0Wg0UYmSP-qDfP>1y+`mYBTcQkTyooMFR^fu73zmP+BZ%%wh9P)BrFC+~_QZtG?0myY>1J>53q z+3TS46lDtl_KA=FF4<^A5mCb_4XWqu!xkl$7{^1KiWOH8-{6|a!RBns2f#=kVk*Nx zX;8fuPA`x?r$>(YbMGOCswK>6@fAW$*O@LHM*Rjt70xkcOSfT z_aT3ua2gd@YGQZqjTgBb9^z)aT-J}=63^&@d}c;HI|uTaS&+{JdEe4;lp=LIr`z%6 zH4&Ej8R{~_0Zr%_93GUzHA-o;)7ZIDbr<9G|5yMY>aWKM=}-LPhoZ&bX705#LhG68 zJD>4BRmAA5^N~_6?BB&%-^;oX|4u`@5Ek%Z>KNU0S9+drqqZc1`8)fLyqJ!mxxkmr zjF)>UTQ}+FDw(Oqrj_?L>BNjI^48A!+AXBK^Sa0PFtQan7kgsVH53ud2qGw6gM0oL z9gd>Y?AXw`H7Sihg#W^%GLz8}Sym}yu(9Ltlet`z6m1KQPgjg>UV9Dv>axGGzis^Z zqBLo_>5kg$503aCzcj)wN+8A`EswZ*QoJNCv*oQeo7R6bDYxQNaf*NXUu=6XB*#O3 zvC<9H3#%84=%Nq>>1Ujcq%siPObUQNv*;kDs^lq`lJ{0;0$G2t5sTXK70_9{v-jVJ zW&%tkinHc+hb;!$#c(UD5K^?@UhA(#dgDvDf#ynEZpyH@ahagW-3IB_D?l@2~k}-vzZ$7NkWk$0O{XQ z!&3>Fvzy_g`n7UnpZF^*D=mEl(7-Pi+gacx@M_e866VGsfbZyvQ`+$nFoY*4;okrE-EGc_tXQ_yZxxRcCyl7>1>4B78exbqgK%gMfAxyb{_T@i{x9nS)?ew) zU5Z325}Bft>=atqH<^R8Ql=I%YlMR#l`0D*Y`SWQv;YJ7f_!4<^g}|pm2L5hC>AXS zz7z1{-F;=YNPdPG=1urOpnenM7g>bxOPSU@v^)JuA)W*M7?z!5_ZuFm0Z>e9ggLOG zbQEA5;rF}vF8{Pb1IDN@r(Iivd-(VJfxH+qZ*~7V1KE*ylyrhH-|DxP;_KdntpPHB z5rnC?p||2(neIP%^SM~G=qI0+WOxDV7D-*pYA_|Bn8lY?|G^ieWvkLmNkxO{BvRQm&ahUp0T#%3S{o{yIX|g z;=;{WH5fq)Q$)JxJD*Ij0;j?ewo+wv>}8a+&R$;Z*c`)U6^U4edanCT*y$wW4n{^I z=9YJvLYq;3%cx6A z<0*;7C!V(zDR(=->RXr$M;fk#Cp%Z&gepk*q>IU7L0~faDY?4M9JYhrUd&A`sh=&J0@FTQK&NYvQGfgS*@_9vYRmf^=+D zyh;4IttkE)?WcE}iKp>161~iPe0Q5&*XP4$+rInhE&;imn(k@`p(t3>KsM>QOPbve zzMWTG%F&6Xmc8+)g_lguLv(BBQR&R6K~!?jO-@Q;bFuQs3e8DT?n3|A^xpPv_;STf zFDH?#)exHZi+D~F2r*nQarpXb93&*#A0CXGw-N3;97^T0{+Snz6WKvazZ0hYVhG@* zXm&n}7lv==lw_04s1^hbotOBLD`gBsqw6p;%n=*wwP(oPU#2i?&aJ3NSvN$<9rc}bhb3Bbkq>-&hZcweS<=_1dd)z85b7nwO=R;w5&Xt&WzNN8qy zsY#w%-tt116`;_09q!)(ClMyCA;oQ|@qX_Q9u{h;P)CVBzVw%W{<06pH_W z0^jL8u#;zuiOhxmDHvDjid zF@$x4icA(M7$D{xdMrM*_5xqC?rogPn9zV_WZI4Cc0YNDa^XULSybw^7vJJ+QtA^* z_PZEc`!b5|H{V<(4Zc_=Z(!XAw!?aTBixL35${^z%YQUNPr=Sm&k?d#+T|?1+0!22 zv`B9RLFWcazjChM`E_=28N8=q@lBC-n6?Rq;@;>|C`=<)6tiL#N_OiNN}Z^87O?qi zJf#Da6oP~LNxX1vqZQnjEmY&d>;K8A9ZAF&6gN+tfq-gxm&^YU5$ zzw1X!>z9v~epr4Gu@s??YJ;r%h2{qk%C%ym+m{tGemFjg zJF;eIG|^{&QbfFn>x4{(LSC%JX@jS{Ej^!8#J!N6SrJv335b;Mejvk=lrjgOxm@er z{@-~=;X(Jd+ddQ$nRnO-mnLC}DGv#!8C9XGz6K)su~(7d3jxh-_f_iaFHEGH zzERs_jnP3Ul`8`@ECx>xNZe#F%zwl^IGy9e3X)!;{+#_?q0BrF!J9xC`Xttl#Me#T z1I0*d*rX&$Ja6R82S=pdRvm!6cT>vz@xET6D&BX_8o1-tFb_wa{j=xvXn|6^C?-~$ zSKekpmp9lo66{>_Ldz5HZz)eFyy^6Sb*6HD6iG}D-^sP3MaFce<04DDJBV6%CGp-K z|ISKW{e#5&s`we<0srABW22Z?oy|l}6sRhV4@j+*E1m~Xmi75ncBrrK`q=}$Q2}s> zXPH|xM<3lK42}7><0P11W&=TTpuhikiFhW7*N|erEUcVwcmMvwgwfnoT$1zM z?c=lu{JBQ8d+lY!pj|_1AvuAN<7hidxscP90EdTICZ4{ZhZdj*rSqX^&YgB_Y-#xH ziafzqR@%6ugXK>p9;IF2XAs;bq6O2^K@^`L$ewDxkY^NXi`<{TI(-N1T*alHRj0+3y75zY4^H0K)xy++^XrI%jKu>?kD%N zP-bvBD00tUlFX=)@sk40K%tBYqrFr+wgw5r(||i(fuM~lM^m*NtG#68>S$rIYfc>_ zpCg1jvtAZ~8Hn)R(>s}EZGqm8DpLEtCrSOi^O2Ax*w41L_UEf+z#sw@4XZZpNN3)y zE5KS0G+fUDeT>w4UWm(3{dabcueiwS0lvY4DxTsl*h`1P?gh{j4{_|g0Yu4hAWE@Y z;TF5c?l(RS@%i9wDqYPH;PnV`29zOkCU|H*eP z-}|gbIlqC(Ch2->M1mtK5aKRg)VH~47q`d1R3ozI{87TMn<1Z2RvORpy%MMOD79W7 z!%AYX$`p*Mf)%*{v5wb_-D|tFM!1vVu$6dE^{rF;rQG_gh4E#O7~PzPPMQ_Z;xTHJ|-p8NOyUOep7@@7W3==x6Ce+z4yjTo*f~7wlcdb z#%?Rje3x+ov8%HZ72ZETTrt_LZ*cX4x)(D3-ui z(zVJ#;FLLGqfnhJ>;9SC`(udtV!^?AKYTc%*C8**-L#|5+^p+YY}NRT?dX8ce|FFL z0$h#mD(cHu?@9Sxr1|-`De3AVT0ffHMI*xkW{4rf?uaS#vbUALB|xO5MPucDb}Fsr zY=`s!NX^Ht*-HalZD%rlvWTmc{p^5FfySZVnQAup=n*jdA9)&Kg~JVCvr$3*qkfmw zPgZIM*AeDJk*|gnoo4@V=HL^D?TkA9!$k(liJY{YZfn@Q-fLll>t z9as9oW!T#DFUt>vD<9mug=JxQg!pmcu%+1#z0XHQkuoS`d|Z4phN7G|jHw%5RN9zr zTvyK;UUZ&s_~7k3*fKHuF{<-dy~{fh@QUqyet6gE9c9(|I1aid85xc7!h;TRh>{51 zK8O4?-UEb-tY6GqXX1NM%*JgVsyqVtS~mzes%wpnvWeI0s&e#fooy09odus|HsQ|w zJenE#)s(!#vY39T+3-~lieGw8l^jdBAp#qfuB8UhmT+I>5x*%;NqKps3>ObD!6J&n zFt|h0q;^;GK4p=Iup-7C2;A1422vi~&v^b!jS3i4sRp6#a8D^$yDajfR6P@Vs# z$+f^8rkKwo@o9{$F5fQgGxR~?Kz&uCO%B}RmpeD6lCbRZ3QcN=i$i4fLt~5q=u5+Q zard1U)rqmlsMCNpP(9Ba8p*VID%eK6={|_L{@h>&L2P;oZW2 zsV;(BvKrv#R7;I7JSqNAR>ij|xs-^zpVg29N_kDV`m)5K=+nVk0K>UcZ9lZY)Je=X zFAePLJ~IR@!QtfdZL{;x7$iTZ1@tL?MA3?|R%}5TAQjPLOLcJ)mJ+>NeD;@yLGA4a zQ~4{YrNfm`i9VN2J6^9{Y+s>2_2);0aeJxe!h&JJcjME*TJ{7%AUbT89L~51Z8e^* zJzRE*R|~48g5a4^dg@5$_ZF@%;xa1wnkTqm36NwP2^+ArzRknbtCf$(Le2{ahf+G zsX7v=@11hl#Sq2mI8KJq%#r-h)nR6YhBHHEBgDM5ygc?Sm*;}u)s~OR=d|sHAFQY& zHJb!lOrAVDX$lPrTH@EB+!H)J1}(JMTk<;MH@h`+HNwZ&*KiqVrmDQ8ABJi>9Yk?6 z|Eg`{LNu6FBDkRP*~WT5G#xHx*yG)_H*y`SdP9`Lo8V`D{$l-QxUlfbmwrLt>Mif3 z5Yfr;^E3FXpE;+SaZ3srV#vnK&*uVUBC>qtKF7k&QlF3~V68ilx!F7Wfj&K!FN+AV z$R>qw`rq@k8SQHVhT!YF&R&PN{rF>i6bD>lt9HppV~XEL>gIKvDYgyp~gcD_{w}^}oKBPkFN1z^tW#Q0jIAfBrfXGl-NOj-wtU zHQ%-|-0gR@Dw(5CuB?Dr5*Qe6D1PTkdTR(eWfE(b+TOMMjyisP^XoBrUz~JbKFrlf z(4g5Kz;~^wA>>^1oWK+CjoJr=X||M%s6$TA-c+R^JolN(Rq!>i?-lS@H4}fFFvt<^ zO@>PM-_9(55*8toONJ-F-)G%8uc=y{Z`6Uufm(L5nwQ6o8NBG)+FlZ&jq6rZnTp86 z^(B}GHy~W8BP*b!&GJV+cN1k1o)?S&bdYH?nmb8Q-mmwPQV&JDkPw0o&%IVdC~}GU zJ7-S>)AeFT9e>FE<~a+tHSdTU{5^=NV@V=F(Zlh5Vhc4_la|D>pAr-iQ(8$PU@`Is zBFV)?Dj?Dr!XGvkaFi*t*IQ9f<7>O!ESPl))c#E0Vd{G&yre>7LTRG5B41T^j37T& z1@JE=;h%grRe#Uh;=Di3jsRvSU`9B7?s?8fZavinyr?S4UZVJoNf@kY;5#0=t@4i z0KY1l-8Q?giU{|!*E>HTx;ToMdQ$e{*>RM%NMu-|WLSbF!t-p3S=A*ezhg@`Xt9Lx z<^|dXS|sf<{3AzGFHrqkboZL4u7D3q0K>w}BVTi;;Dl#GS97o733nP;f2tWbRkI?d z%E(gWu7nfpg`r$?PrLt;#qq5t{kEm<`LieEE@R#ADMX{>{Z*>dF4S&^B@+gmZQir^ zs0WId<~NwO{375thL|SClg|Z2qDGvk)=0z7bb{WSbVfqLyo+&%EQbN`^C##o4gJZe zBMiQLgPKaUl?gKb$nrShal*D_k%Hg3-#5WLIpq%SxVWdBGPf4|{wK1mrYNJFCaUo) zwM(LG=q{k^)XZ&eGckXmTy1rMN8>Jn^giG|!9POuB6?--u*U{d&s=yeG{P=&|H#hn zgU2XmYpN#dbr-W=Oj3}l0&^c@Z7S}hNk{V-BRHUqV9+G@wd93YC;t^aDZYE^6NgDw z@zo|rs-|RFcGCkZZa5eY{6=sS3u06fCDpxfbboNlochsH=HpM>_3yJ&Id+$PiykQi zV6}a(BJ*YZ3{dX(t`!rQk&_}CFQ%6KeetIurJ^?JzeLzKSHcKlpMw}Q(r}BUW@XHM zg1SU3c)ehgt##M zST|pJQOr-mPuS?mIE2@D%ZQR&>}CegFA8C& zcYDQq^*4QuD1B}gni)0X!H0qmS6*dL+G2{9GLFt;PB2rP0=PT(fD5QVbLw&OmSJ&ytt#x* zJc|D~JSBAK(we+;O5A^+L$CD$L)$pKWKWv~s=p8lRKKTzF$ctPMr~*3T(aWe(b{3C zSO;l6ctkqkxMW}ix*@wI@U)&h@_Ij84H(lTM2SoP45pu14;p`Lpi;FJ!T3NL1AQMJ?1Y_#&61w@Z zK_c)xWi#^V=Bb6_aTHh@bFBhXp$-T(s&kg;cUsRmsy6u<>e9RWVBK|mV1!*C@w>;( zqE6;^zlhn$iK=l?^YS#@xU;hz2uzMFIT_gV4fp%6wW&soqAE+Pa#-Lx$I39FyJ9)JDV;!Ut`LXl{T?w#vNZJXY){j3o30V z;3Wc6t}ipf^BhJ_uZ`j&P1%Q3F)nxwM*XuRz3911w;fn%n&eqQY5`~pA1JRPmu6=h zd$V?gB20lfjx|OWg#SQ!Gu4>1Ad#?O?}|mG=h+0_%y3_}8sg@b9=U}ekkHSwn96*S z?bn$##mmBw+BJx4#(CQTsf2=O-clvHy+3o~M_<{B{g3>>|@I`>&hBaFtiL=krKHsH}v3 z$Rf-EqyT3eVI|2p`A~W+GI(`T0%*9Yafd;|5HgB&iJeN!2v=s%IvQC(2*XyGc9i8| zezJ7hF3<9ud^uildvgm(&H7vbtpK5xIhIpvXS0rXAcP_L7o_Z+o*f8F7yE0y%LspaF=gCFSUVGWfI=Q zRjS|4=le*{`H*K(1|_wlu0uLV9sTZ`(R9qDUtLfRSTLaDiJ{)b-9lPd)TLw+ax68? z8!NxO^33^k9*V3!R2mVls94hIrU!l3gB@c3rao)h(Z;V8Z=IpWuz7ke+MJ}XY%zVU zpz7f_NRwk^#mM*-SRl*J#?eK4+fTyRFAgcNqDIZN+3!P}v(_6+{)hsOu9kLAkd$aH ztg?gQZ8j{27;Stb*c}u_laqoY0cAd@L+sSHN%l^OK)P z&Op+H-eRIQOs@mh9pM+9dw3}}Qx&(FZn;4_76Ca%Q6HUW6XJ74w_7{m{S-5 z{6)n%PO>FA`bx#NRyqW{5OWu2i}3XOeG_25nf#vx6#{JV$)oTT@hNGtH`Uh1kktR~ z;mN~)lL+&YLJl>KDwssQ1ohiro6WJdNbBIeOMHEkb3fV7Ts&Di@oY>8tA?Z|C8U22 z`5{BY%{Y9DMNFNgT7EE-OJpClk6bjP;qhVnMpP-7e-x7p#u4r3n2dJ7n;=KrsoCUx z=(e|#-vj9cz{zt5mnH6rI#|~2DF~Qt9JvVpuaF_&?3NGa>I|M~1ir})iUnR0WjRfv z^HGnnFR{M5eho+KZ`PP!3ZP8$ zTh4^&pSt5Gzy!l`EVGEA{MCDDK{T$#a#E2^h+)Jxybs5j+oE%w4t2ZHaCLNCnJUZFG*khXC=9_$o)66Y1r3Vm~vD+xlfqoN%Vd<4XfyiDj&I$FXCMD|<l=pVB|HXe<8y>A=JCTB&&^@I%WsgU#VZy`qDW$wq4vm2t65(syp+YuCwh`66l+LN9in3d@nNhhr z&zo=DtGjd@-XlJh4u2(5+S$WxFBncFRE3+j5c8F%swEdIm<1i$)uruUy@kH()@Ky7 ztD5nrjtO8(a)?6gf)iIRj4L2=7>05bMq@J;W3w4DOvR@rs|}KKbdq2_a)N(O(dKve zTzRf8AWAcN{Cw?gPgznE$?SwA?~%Zb=}?<_a$qve%i+Lw_^0XT-)Lf_%LO-uj>2X$ z;_hHHqcd(hPbkaj|w5iazS8uy7f)*WgjqW62iYdceXn_wasrwV+lCSBxMR+((BWXsPyX7(G(|x<@$H?s}&6mJ%G0*@C0{GZ&2%Abm2YedTHPsrFyie&#h?@MC&s21S0=qJH{g zcmld(Mjf#q{I21op^*G~rbL`{b(?WoH7L}H1(aQQ;efhgynz)Ed|))_$=e_aF}04< zy0=~gX8_D)><(-e8(Gga3R__c#HBr^GC2Y)n@O~@YZAhlP1LLXzUy4!_nsM>n@emE z+#D8lH+Yi#Cz>zH$I-U+&&uSbTZB~Xb$OzY8bmhyw;+qI``0g)*b;~;mT_RvdyozP z6seu3_GM?D+(D6K_dOziGaV2;^wG0|Ja*oL^{gSL_B>7AIS@n%RCb!{7Sq%IjB7=N z_T*=Iz4?Bpm8;%tFYq0!O?mMK=gISi(|oYigqmhq?~DFGRZXt-^m$FSq5bfD*2fB_ z#>n=PU2T>&PXyNWz@*%zA8rD%TS@Fbun$SPjz(k9n8xp$5e&?>`UM?OoVo=S=lOQj z9V>uJ@M~h%V0N-#(XUm!$+@@*BFFMsy23>Pg>wQ9he7)Mp4}BC9cUYaF#cNMs2BQp z3+r>Wr6J98Ocy9|UkKjl{c%16Sg|77y;tezBBXSpAVJY=aHr<5_U)Lq@0+g(4@Pb~ z42Jr%qGEM=!JXEVFlyenCQh@K#Ow(~61;njPz5^!zs(F;dQ3IWu ziICjq5Kor=8h^2BPZVW%TMlmm6L5&O{N^UPc=AxIL)A^!{E;%q}Wk{97>m&Ua ztK$-%uqOQZSytDRz0iTpZpR%*Ddyfj#j<%NaYOUz&gJXOqC3$^R>RnpNu!R(**tcq z*0A7iZ?&2U?WRbPPHD*^IFfGoe zCp8JFsm+s7yy|+Z#_N(eZGaFic>G2E_dD?A<)>VeJ`ye5n{Mx`7MN=t@z*qh&nJ2n zGhO6@|6yvFd5LYyb^W6bzfk*h9yP)uBS71}jjJalhXrzu*;V~=gohYqPp=80s-Nqw z{*|+#Eh$uP9mVX)BU;b5tH)c7u-jA=AUw@rT`s&?HB!NcmX3@>JToo13>dqljXK8Y zNkJY7MzvOxvt?5h- zkjuGq6d)Swlew=^+RR#&Z}7%sJGuVNNJpcc#@m>3C&f@s0jwcL%e_Jtb4&g9s#>h1J&F9&c5Eq@Q}*5SE+mcnx-iBKu$y=G+c@ISkv2X} zeC>h(e3mafg3~cWU$M`&U^Bb)Q3er9r{%eg4G@;bB!dOE6uwmJ2=)MeI1v zqO+|rgPfe1^F?pubmYZj2lny;|Sqb7e8|R;nt{}z#@w&drcV|u>F$8&kp8_Dh_7;!ne&qgjLYngy3ucNz%}4JgYQ;= z_A!Rv!Re(Wg^v6^D+ms(_8^iba==5vj0Bl17}A(WV&iT`BwowON&o~U4_XCokm?bL zVv!llHR9CmA02ofpGzGl6B;BjX+lf0Rgmuw@f*=5D)n1wc%O=j7^?`>?dNWXiLx3L%(EgMhT&eR$bgxI@2h6g@ z9Uv)(TpO5v6$kHMITOA%cQLfVgfT1AN>^9@Huf4ZO`iSa-U*RF z%w+EM*{?XD3ZPtHziX$uRx=kltn9U3FRTvW+tQ+CX!nh>Rxyeu?muje9|iogJ*%S& zDk*(m7NARD5G)@B{F{;1k_NckvCUzC7KV63B2|nuxhYX;ITPw1qCV$4IV?;V-jfKl z`svuFQz<>Sk6F|IQe|m0HcT7=<#au)yjhNA3a-bjuUbX<>FWGz&{}r+^NQB&1%suP&pbOjva;T*t=Z;hytFalRvj3{8Df-1qHU2 z?8lJ{9|tQuZ$LH}q>Vc`1zKvS?RUmwrTu0x(!D<$*f*7eePLn2Kym?)1J!CjgU7Zc zcwu)><=Upqq6{ajp-N%tbA6(IfgYL;hY&ijm-Zn)cHt^Fv@rA6@ElBia_CxnqcOM6 z1}oTv?WOl&gxV+_Snj>Tt97{g#$WlM5Kw{A)JqDrF^Z{q8@9){dH#J>u4%^_IALC7 zBV**;(V&xFOGWm75|-hwno;V_C$!?pxw&|Tw*m0&4 zrizdjwEmqz1Ta$d5_+Il4NAd|wBzJazOA|M;c8i*9cF59^#&0tfJX5#RtS~wPPh~E zM$|l>3ohd469{?`&#*!EPRGdg{xi?H7G|z0px6Cqvb4*R^BQ+>XrG~9lK5Ity|a3s zl?tAa`#NLN{rgXYY1d|amiW}If#PaM1m{PM1BG zvW7gv3!hn1kOrdTIVcGadV-iFNNSugsu*^f3|1BG( zoqp|cpp1GiHlyZbX|JoKH6;67HnX_rC;y6J^W^a0hzmD31>4ebX3+QKKS%0?zBDFO0pzlyMsSQH znC$=qkJ&6ed%Tg>>eW&bWmf#RFZw+tli(jw?Kv*zr~yntZJPHqjf{qO1m?x?wTRx; zA2mFV8NTB?aL{N}>U9J23Fr#`%q9pB%|#ygkZH#y!t1UQ$wZbSPcNDm*%Du#1>&c* zP+p%wZ_r<_C{0AE(AKxta&5QOqb-egxV37%hsDVITnTo=e`hiovLG|~z3oYqKYOIC zpXvLS&T_fvhw>QL`1wk^OG3ufd^|_iDle71b@CJXYu9nY!7w~^X2|J7{xs8 z^8#M=zwHIW38DVXy}Ck9U3LnLCxhw!B);sOlJuMtt?5=XiLJgs?H*8&zwGekYpgxh z8a6e|v9Ms7V2H9tkn!~f;msi05d4))gbFyC9D2yBim?@%5N4%XzGY1aTW&r&e+FMG zF-|D^o&m;r(!xYIV@k{4&>q7>Y>K+_Np}fu2_U}y!Fvs&Y22|>NJ7W$&O`|!qc$H; zoY#`BYoI4XVF#8mQb;&L{z?e9J+7K-TM-ZCg*}7jCdNZvah#{%>xtgO#c-9Dw6LJV zx@TgoPq&>$C_VqCRh@%ZJH|IRjvaJg#&%sIpZ%;M{4;XMoxfA>j|aP?wfTZWmShRNh8nT2>%o+k)s6Lw66lB`m3C)Qj)Q52F8 zt6F@K(o2sh(`r*9bc&I&nQq|QRS!e~_I{C}IsMw7nk?pY1BfeRr~49)B!F^1)M|6- z{V9)tmW6SNKx6(T7j0ZL7GziM^p6tlB?8SyrbCn~?Po&ym({@gDEP}vV4>HA4?M6C z5rh^HKgV|ypX0N2R>3s%uj&YJJOE5ek%9Va}3r!%h^H~ z-^4d>iC1Epu)Fl$9{wu&)=;ESFp52CObA}IBSE4Mw4OvT3NyoWE-O8|u#f1K*O8h*Pa_6et#40^6zZ(YG_HR#O1nAU%xvNHqxHY8?b!yw(NybIG-x@lq4ExgB zZK#xj^Gl_R;R0R?whf9)<8wPD>dm9=K&<8m;orQco0>eK--3p)5j`~?h$RXjwFNhQ zvU}oBz!!zyhJv!9q@Rur?UhKS?M!I?>uNnSuJ1_W>LY9 z1j5r9bXf|I?7aE6tdxJtlJq-N$?JDzYcyeC#o@CWE4B?k;$0*{$G&udjR&HfQ)_fq z&(M0wo6X$ny$IS#;0IG!?6@kQ2x%aaTK)Y!zKI#{c^kF$gSkJH{|&>IH8xJ;Jt_K zP+l+K!;0GJDw{W8jK}IB+doZ01Mb&7x>S9rUa3MvTa_6m`s;l z`J&5I$hyN{->stx>Pkf6gOea$+MP)hJlxFcWDsQB{!_(9G*os8OoeIz1pz!r5`l-C zlRppsOeGVVx!GSf5XN(7@vU7-y{_qWJJ&i8=b#h;wf$ z91T8!dsH@Xl|c65uM{8GjDFcRi+b2KM=k+nvY9BL?ZlJ=2UL9tG>De8seKuB&~Gaa zYQJ)zs!nj6t1vueCC3|pH!P@fWDeqC-HVKO`7xgfXnZzwH|;_jCmNORui-)Plcvi)YeT$IJN#NF z5yjmH0$Jlb5J*loAr+uWCpZ8S{Xa2CH4-*Z0oj9&%?KgD!C3;_*b@Ra-kO$8?jRbI z22W8pY9^txCLQ1Y>6h>fy-q|KF?prx?e1aVA<`J{`|eCXbO`bZ_3#}x{FQPL3g9MC zZ6}1I@i%u`60TSA3`DV_ChL?KKr6NjxC)>kpaBMSxmv@X!Zut`qw~FY)g*p3AqS$F zv50|YxbDv=6%ihq;l*V$!X&6C~5VB^viwrm0X2e=>q$#en5Z|E;pWe|K+ zSuDtSSONAMq35Ghq-Og4D_yDpWhnq@!rx5OODIbCh)(IAbtiWMo5kat?j4*>buztr z4d^H`)$m-mn;9eJm1V(q#*etNyPEr#TsJpTc<+J-gC=-2mM_Izk-r$48NSG2F8tLy zT1Oz%KyiyaSB~GxY$Us~`)_=h14jCOGBawD+15&*dZXsy`AAEVa0W#SA`}UO^n2{zcGQawT-kgS-X!B{+=BUt zP}Ol|1X%OsBg(M)SDTT?gTss{JVT?qWot01>af@bvAfC5ID~qoqAC zg8rO7`oO^?l8wO|8VA-$aqd2l@tPWVH^Z8JBT-CeibvL`nCa?ccNvB;et1figO9Hp zsJ4+MF7jP#7QCNPUC!}Qle}||CIWwT;52-FhYvJQb>5UJ0eWk(NL8b^AXN8KICNE# z^r5jda{TwDd0z(;sy5+)SJIR^W2CII#$`7lZ{gq*rDX$vY2@oa36a!1(QE^US08|AteoGF#I(lH!l5&&vW12S%aM^=++&Nc37xrmwo2bFi+JPUgg=oMs2_~aY#7+ z4(^%iff)_L541OL07X6Iu{fp99(iFRx$zAH&5FihBTC))Yhmy;U{D{V$czG`8MiZn z9An1#ofN(N#;3$=zJ#0zMjPoC|FeU%fAM$NK z8lRkFpOqBZ!pE0a(O9m^S)cEjYii{B&&gGnAN18I0endQBNjf!d{sJea#31(jAKKK z>eZ98)w)3)0Y3Oc0c-&ii|P%Nvm7Bw{d5=jYo-46!agtnN`C*r`J%xz4`Z`nq|fpQ z%t;4xp~Xu~o*^@jFnFpOYl>w~=mKre))mU_B!WHm2w|MRAmdFMig@_66wIrd`-@94 z!&6u;%n>qV+<~XN0N?}+{vB1`DkhI4Ez32mhB@0(R?#vTK>K)BKmMKA9a2G@;tMGT z0rr)@5+2zBjO(?-;P|7KmrWLzKvt=W(fjv>z;jez;uoNryjm-nY!V?VZIgLTIr-J;^f*~M~nwx#nbYMDgBW)dEFs>v2QvHuVWW@9@&sL2_YzZS$cFF9Xcg&<#cJbz5ACCcHp!W-UFuv{(=4$Jy@$& za;)hafquE8X8k>zFsSS6+wxt7rcK+Ly6$7NBmZyj8ioHB0|47uNZ6pe)riWeM75V> z3Q<6pW9-lvl0~l^49*+`10c8lcSBMj88sS}LVnMXlNfo2tH$6yv+}L>bnIFq2ZH6$P&@Ndm%p52+0fS&HJ@4no9l827XVc=YTlkqLw1GLtA&~#4hyfvwRb~EU(#VGE= zP{0{!$zU@5vX3~c2o*l`TmGVIN_qrr13*3RlIXvm*K&|wfUbp1CuF^K9I@-}!thNs z$9GVX2U?B%YBKpU$g#^1{z}aYP{@FP_F;6S5E$<=q~0brW4yyWR6WkUrBX&vkn~rc z8z%cjf*UuK0OB5a0oMPm<#_U-^E^}_GyJZF;P*e4%O2tLF<~gfE)hva@Z@5=C}L(- zzW+ev>i;&H$1R9=VwPdm6ka8V&`q}*bkpdcM6*kzN|HY1Lx}FpQV;>IlAte(f7TK* zZ^)52Ua{SW=^oL&*gV5kF}$lEFL+-F&Z;`#M_=t=$p1dfejMd#e6&j6kNLgF!}lYA zZYH1n0-a3qy&)XQAITJ%yyD?ywV4ajcko9qeLaZ0D8yc*b2eA<=M{c)7HcVpf9!yp zmsn}<=Rdpp73*vFBCZ^W{(sp75RDP_Fx3iw0q}^Q_YPS8D?_!)vd1oyuXqSn@+&hr zJ&p`onEJ-w>9^hY(cQ~uRSN=voJSd*wcFp=c1g*G-4E#`ZMm?q33dn(#*f4Fm=%PU zNQs0D1{&H%zOva!#(THK$(w7yU{sRyndDKVBNo$_o0V&_>tSW St~21<5R|c%QTaKKoBs!xl{Gd1 literal 0 HcmV?d00001 diff --git a/makefile b/makefile new file mode 100644 index 0000000..3a3e3a6 --- /dev/null +++ b/makefile @@ -0,0 +1,169 @@ + +# Compiler and flags +CC := g++ +CXXFLAGS := -std=c++14 -Wall -Iinclude -O3 -march=native -fopenmp +LDFLAGS := -fopenmp +# Compiles .h files when there's been a change +DEPFLAGS := -MMD -MP + +CXX ?= g++ + + + + +# Directories +SRC_DIR := src +INC_DIR := include +OBJ_DIR := obj +BIN_DIR := bin +TEST_BIN := $(BIN_DIR)/tests + + + + + +# +# === Executable Name === +TARGET := $(BIN_DIR)/abc_lab + +# === Find all .cpp files recursively in src/ === +SRCS := $(shell find $(SRC_DIR) -name '*.cpp') + +# === Convert src/foo/bar.cpp → obj/foo/bar.o === +OBJS := $(patsubst $(SRC_DIR)/%.cpp,$(OBJ_DIR)/%.o,$(SRCS)) + + +# === Test sources === +TEST_SRCS := $(shell find test -name 'test_*.cpp') +TEST_OBJS := $(patsubst test/%.cpp, $(OBJ_DIR)/test/%.o, $(TEST_SRCS)) + +# Compiles .h files when there's been a change +DEPS := $(OBJS:.o=.d) $(TEST_OBJS:.o=.d) $(TEST_MAIN:.o=.d) +-include $(DEPS) + +# The single file that defines TEST_MAIN / main() +TEST_MAIN := $(OBJ_DIR)/test/test_all.o + + +# === OpenMP runtime configuration (override-able) === +OMP_PROC_BIND ?= close # close|spread|master +OMP_PLACES ?= cores # cores|threads|sockets +OMP_MAX_LEVELS ?= 1 # 1 = no nested teams; set 2+ to allow nesting +OMP_THREADS ?= 16 # e.g. "16" or "8,4" for nested (outer,inner) +OMP_DYNAMIC ?= TRUE # TRUE/FALSE: let runtime adjust threads +OMP_SCHEDULE ?= STATIC # STATIC recommended for matvec/matmul +OMP_DISPLAY_ENV ?= FALSE # TRUE to print runtime config at startup + +# Export OMP defaults so child makes or tools see them (not strictly required) +export OMP_PROC_BIND +export OMP_PLACES +export OMP_MAX_LEVELS +export OMP_THREADS +export OMP_DYNAMIC +export OMP_SCHEDULE +export OMP_DISPLAY_ENV + +# What belongs to "run" vs "test" +RUN_DEPS := $(OBJS:.o=.d) +TEST_DEPS := $(TEST_OBJS:.o=.d) $(TEST_MAIN:.o=.d) + +RUN_ARTIFACTS := $(TARGET) $(OBJS) $(RUN_DEPS) +TEST_ARTIFACTS := $(TEST_BIN) $(TEST_OBJS) $(TEST_MAIN) $(TEST_DEPS) + + +# === Default Target === +all: $(TARGET) + +# === Linking final executable === +$(TARGET): $(OBJS) + @mkdir -p $(dir $@) + $(CXX) $(CXXFLAGS) -o $@ $^ $(LDFLAGS) + +# === Compiling source files to object files === +$(OBJ_DIR)/%.o: $(SRC_DIR)/%.cpp + @mkdir -p $(dir $@) + $(CXX) $(CXXFLAGS) $(DEPFLAGS) -c $< -o $@ + +# === Run with OpenMP env set only for the run === +.PHONY: run +run: clean-test $(TARGET) + @echo ">>> OMP_PROC_BIND=$(OMP_PROC_BIND)" + @echo ">>> OMP_PLACES=$(OMP_PLACES)" + @echo ">>> OMP_MAX_ACTIVE_LEVELS=$(OMP_MAX_LEVELS)" + @echo ">>> OMP_NUM_THREADS=$(OMP_THREADS)" + @echo ">>> OMP_DYNAMIC=$(OMP_DYNAMIC)" + @echo ">>> OMP_SCHEDULE=$(OMP_SCHEDULE)" + @echo ">>> OMP_DISPLAY_ENV=$(OMP_DISPLAY_ENV)" + @OMP_PROC_BIND=$(OMP_PROC_BIND) \ + OMP_PLACES=$(OMP_PLACES) \ + OMP_MAX_ACTIVE_LEVELS=$(OMP_MAX_LEVELS) \ + OMP_NUM_THREADS="$(OMP_THREADS)" \ + OMP_DYNAMIC=$(OMP_DYNAMIC) \ + OMP_SCHEDULE=$(OMP_SCHEDULE) \ + OMP_DISPLAY_ENV=$(OMP_DISPLAY_ENV) \ + ./$(TARGET) + +# Handy presets +.PHONY: run-single-core +run-single-core: ## Single-level one core (good default) + $(MAKE) run OMP_MAX_LEVELS=1 OMP_THREADS=1 OMP_PROC_BIND=close OMP_PLACES=cores + +# Handy presets +.PHONY: run-multi-core +run-multi-core: ## Single-level parallel (good default) + $(MAKE) run OMP_MAX_LEVELS=1 OMP_THREADS=16 OMP_PROC_BIND=close OMP_PLACES=cores + +.PHONY: run-nested-multi-core +run-nested-multi-core: ## Two-level nested (outer,inner), adjust to your cores + $(MAKE) run OMP_MAX_LEVELS=2 OMP_THREADS="2,8" OMP_PROC_BIND=close OMP_PLACES=cores + + + +# Optional: print debug info +.PHONY: info +info: + @echo "Source files: $(SRCS)" + @echo "Object files: $(OBJS)" + @echo "CXXFLAGS: $(CXXFLAGS)" + @echo "LDFLAGS: $(LDFLAGS)" + + +.PHONY: test +test: clean-run $(TEST_BIN) + @echo ">>> OMP_PROC_BIND=$(OMP_PROC_BIND)" + @echo ">>> OMP_PLACES=$(OMP_PLACES)" + @echo ">>> OMP_MAX_ACTIVE_LEVELS=$(OMP_MAX_LEVELS)" + @echo ">>> OMP_NUM_THREADS=$(OMP_THREADS)" + @echo ">>> OMP_DYNAMIC=$(OMP_DYNAMIC)" + @echo ">>> OMP_SCHEDULE=$(OMP_SCHEDULE)" + @echo ">>> OMP_DISPLAY_ENV=$(OMP_DISPLAY_ENV)" + @OMP_PROC_BIND=$(OMP_PROC_BIND) \ + OMP_PLACES=$(OMP_PLACES) \ + OMP_MAX_ACTIVE_LEVELS=$(OMP_MAX_LEVELS) \ + OMP_NUM_THREADS="$(OMP_THREADS)" \ + OMP_DYNAMIC=$(OMP_DYNAMIC) \ + OMP_SCHEDULE=$(OMP_SCHEDULE) \ + OMP_DISPLAY_ENV=$(OMP_DISPLAY_ENV) \ + $(TEST_BIN) + +$(TEST_BIN): $(TEST_OBJS) $(TEST_MAIN) + @mkdir -p $(BIN_DIR) + $(CXX) $(CXXFLAGS) -o $@ $^ $(LDFLAGS) + +$(OBJ_DIR)/test/%.o: test/%.cpp + @mkdir -p $(dir $@) + $(CXX) $(CXXFLAGS) $(DEPFLAGS) -c $< -o $@ + +# Clean up +.PHONY: clean +clean: + rm -rf $(OBJ_DIR) $(BIN_DIR) + +.PHONY: clean-run clean-test +clean-run: + @echo "Cleaning run artifacts..." + @rm -f $(RUN_ARTIFACTS) + +clean-test: + @echo "Cleaning test artifacts..." + @rm -f $(TEST_ARTIFACTS) \ No newline at end of file diff --git a/test/.gitkeep b/test/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/test/test_all.cpp b/test/test_all.cpp new file mode 100644 index 0000000..ed3c41b --- /dev/null +++ b/test/test_all.cpp @@ -0,0 +1,2 @@ +#define TEST_MAIN +#include "test_common.h" \ No newline at end of file diff --git a/test/test_common.h b/test/test_common.h new file mode 100644 index 0000000..8d92710 --- /dev/null +++ b/test/test_common.h @@ -0,0 +1,52 @@ +#ifndef _test_common_n_ +#define _test_common_n_ + +#pragma once +#include +#include +#include +#include + +struct TestFailure : public std::runtime_error { + using std::runtime_error::runtime_error; +}; + + +#define CHECK(cond, msg) do { if (!(cond)) throw TestFailure(msg); } while (0) +#define CHECK_EQ(a,b,msg) do { if (!((a)==(b))) { throw TestFailure(std::string(msg) + " (" #a " != " #b ")"); } } while (0) + +#define TEST_CASE(name) \ + static void name(); \ + struct name##_registrar { name##_registrar(){ TestRegistry::add(#name, &name);} } name##_registrar_instance; \ + static void name() + +struct TestRegistry { + using Fn = void(*)(); + static std::vector>& list() { + static std::vector> v; return v; + } + static void add(const std::string& name, Fn fn) { list().push_back({name, fn}); } +}; + +// Default test runner main() +#ifdef TEST_MAIN +int main() { + int fails = 0; + for (auto& t : TestRegistry::list()) { + try { + t.second(); + //std::cout << "[PASS] " << t.first << "\n"; + } catch (const TestFailure& e) { + std::cerr << "[FAIL] " << t.first << " -> " << e.what() << "\n"; + ++fails; + } catch (const std::exception& e) { + std::cerr << "[ERROR] " << t.first << " -> " << e.what() << "\n"; + ++fails; + } + } + std::cout << (fails ? "Some tests failed ❌\n" : "All tests passed ✅\n"); + return fails ? 1 : 0; +} +#endif + +#endif // _test_common_n_ \ No newline at end of file diff --git a/test/test_eye.cpp b/test/test_eye.cpp new file mode 100644 index 0000000..db959ee --- /dev/null +++ b/test/test_eye.cpp @@ -0,0 +1,155 @@ +#include "test_common.h" +#include "./utils/matrix.h" +#include "./numerics/initializers/eye.h" + +#include + + + +// Tiny helper +template +static bool is_identity(const utils::Matrix& M) { + if (M.rows() != M.cols()) return false; + for (std::uint64_t i = 0; i < M.rows(); ++i) + for (std::uint64_t j = 0; j < M.cols(); ++j) + if ((i == j && M(i,j) != T{1}) || + (i != j && M(i,j) != T{0})) return false; + return true; +} + + +// ============ Basic correctness ============ +TEST_CASE(Generate_EYE_double) { + utils::Matrix I = numerics::eye(5); + CHECK_EQ(I.rows(), 5, "rows should be 5"); + CHECK_EQ(I.cols(), 5, "cols should be 5"); + CHECK(is_identity(I), "eye(5) is not identity"); +} + +TEST_CASE(Generate_EYE_int) { + utils::Matrix I = numerics::eye(3); + CHECK_EQ(I.rows(), 3, "rows should be 3"); + CHECK_EQ(I.cols(), 3, "cols should be 3"); + CHECK(is_identity(I), "eye(3) is not identity"); +} + +TEST_CASE(Inplace_EYE_resize_creates_identity) { + utils::Md A; // empty + numerics::inplace_eye(A, 7); // resize to 7x7 and set identity + CHECK_EQ(A.rows(), 7, "rows should be 7"); + CHECK_EQ(A.cols(), 7, "cols should be 7"); + CHECK(is_identity(A), "inplace_eye resize did not create identity"); +} + +TEST_CASE(Inplace_EYE_inplace_on_square) { + utils::Md A(4,4, 42.0); // junk values + numerics::inplace_eye(A); // N==0 → must be square, zero + diag + CHECK(is_identity(A), "inplace_eye on square did not produce identity"); +} + +TEST_CASE(Inplace_EYE_throws_on_non_square) { + utils::Md A(2,3, 5.0); + bool threw = false; + try { + numerics::inplace_eye(A); // N==0 and non-square → throws + } catch (const std::runtime_error&) { + threw = true; + } + CHECK(threw, "inplace_eye should throw on non-square when N==0"); +} + +// ============ OpenMP variants (compiled only when -fopenmp is used) ============ + +#ifdef _OPENMP +TEST_CASE(EYE_OMP_matches_serial) { + utils::Md I1 = numerics::eye(64); + utils::Md I2 = numerics::eye_omp(64); + + for (uint64_t i = 0; i < I1.rows(); ++i){ + for (uint64_t j = 0; j < I1.cols(); ++j){ + CHECK(I1(i,j) == I2(i,j), "eye_omp != eye"); + } + + } + utils::Md A(64,64, 3.14); + numerics::inplace_eye_omp(A); // N==0 → must be square + CHECK(is_identity(A), "inplace_eye_omp did not produce identity"); +} + + +TEST_CASE(EYE_OMP_speed) { + + uint64_t prev = omp_get_max_threads(); + if (prev <= 1) return; + + omp_set_num_threads(16); + uint64_t N = 16384; + + utils::Matrix I1(N,N,1), I2(N,N,1); + + auto t0 = std::chrono::high_resolution_clock::now(); + numerics::inplace_eye(I1); + double t1 = std::chrono::duration(std::chrono::high_resolution_clock::now() - t0).count(); + + t0 = std::chrono::high_resolution_clock::now(); + numerics::inplace_eye_omp(I2); + double t2 = std::chrono::duration(std::chrono::high_resolution_clock::now() - t0).count(); + + omp_set_num_threads(prev); + + CHECK(t2 <= t1, "collapse_omp: multi-thread slower than single-thread"); +} + + +TEST_CASE(EYE_OMP_nested_ok) { + // Ensure nested regions are allowed for this test (won't error if not) + + uint64_t prev_levels = omp_get_max_active_levels(); + uint64_t prev = omp_get_max_threads(); + + omp_set_max_active_levels(2); + // Outer team size (small); inner will be large when nesting is allowed + const int outer_threads = 1; + // Inner team size to request during nested-enabled run + const int inner_threads = 12; + uint64_t N = 4096*8; + utils::Matrix I1(N, N, 7); + utils::Matrix I2(N, N, 7); + + + // ---------- baseline: inner runs with a small team (no outer region) ---------- + omp_set_max_active_levels(1); // disable nesting for baseline + omp_set_num_threads(outer_threads); + + for (uint64_t i = 0; i < 2; ++i){ + numerics::inplace_eye_omp(I1); + } + + + // ---------- nested: outer×inner (only one outer thread launches inner) ---------- + omp_set_max_active_levels(2); // allow one nested level + + #pragma omp parallel num_threads(outer_threads) + { + #pragma omp single // avoid racing on I1 + { + omp_set_num_threads(inner_threads); + for (uint64_t i = 0; i < 2; ++i){ + numerics::inplace_eye_omp(I2); + } + } + } + omp_set_max_active_levels(prev_levels); + omp_set_num_threads(prev); + CHECK(is_identity(I1), "EYE_OMP_nested did not produce identity"); + CHECK(is_identity(I2), "EYE_OMP_nested did not produce identity"); + +} + + +TEST_CASE(EYE_OMP_auto_is_identity) { + auto I = numerics::eye_omp_auto(32); + CHECK(is_identity(I), "eye_omp_auto did not produce identity"); +} + +#endif diff --git a/test/test_interpolation1d.cpp b/test/test_interpolation1d.cpp new file mode 100644 index 0000000..756e644 --- /dev/null +++ b/test/test_interpolation1d.cpp @@ -0,0 +1,155 @@ +#include "test_common.h" + +#include "./utils/matrix.h" +#include "./utils/vector.h" + + +#include "./numerics/interpolation1d.h" + + +// ------------ helpers ------------ +template +static void make_uniform_xy(utils::Vector& x, utils::Vector& y, + std::uint64_t N, T x0, T dx, + T a, T b) { + x.resize(N, T(0)); + y.resize(N, T(0)); + for (std::uint64_t i=0; i +static void make_uniform_xy_fun(utils::Vector& x, utils::Vector& y, + std::uint64_t N, T x0, T dx, + T (*f)(T)) { + x.resize(N, T(0)); + y.resize(N, T(0)); + for (std::uint64_t i=0; i +static inline bool almost_eq(T a, T b, double tol=1e-12) { + return std::fabs(double(a)-double(b)) <= tol; +} + +// ------------ tests ------------ + +// 1) All interpolants reproduce the data points exactly (or to tiny FP error) +TEST_CASE(Interp_Reproduces_Data_Nodes) { + const std::uint64_t N = 25; + utils::Vd x, y; + // linear data: y = 0.1 x + 0.9 on x = 1..25 + make_uniform_xy(x, y, N, 1.0, 1.0, 0.1, 0.9); + + numerics::interp_linear lin(x,y); + numerics::interp_polynomial pol(x,y, 3); + numerics::interp_cubic_spline spl(x,y); + numerics::interp_rational rat(x,y, 2); + numerics::interp_barycentric bar(x,y, 2); + + for (std::uint64_t i=0; i(x, y, N, 1.0, 1.0, 0.1, 0.9); + + numerics::interp_linear lin(x,y); + numerics::interp_polynomial pol(x,y, 3); + numerics::interp_cubic_spline spl(x,y); + numerics::interp_rational rat(x,y, 3); + numerics::interp_barycentric bar(x,y, 3); + + std::vector qs = { 1.5, 5.5, 5.51, 50.01, 99.9 }; + for (double q : qs) { + const double ytrue = 0.1*q + 0.9; + CHECK(almost_eq(lin.interp(q), ytrue, 1e-9), "linear off-grid mismatch"); + CHECK(almost_eq(pol.interp(q), ytrue, 1e-9), "polynomial off-grid mismatch"); + CHECK(almost_eq(spl.interp(q), ytrue, 1e-9), "spline off-grid mismatch"); + CHECK(almost_eq(rat.interp(q), ytrue, 1e-9), "rational off-grid mismatch"); + CHECK(almost_eq(bar.interp(q), ytrue, 1e-9), "barycentric off-grid mismatch"); + } + + // endpoints should match exactly (no extrapolation) + CHECK(almost_eq(lin.interp(x[0]), y[0]), "linear endpoint"); + CHECK(almost_eq(lin.interp(x[N-1]), y[N-1]), "linear endpoint"); + CHECK(almost_eq(spl.interp(x[0]), y[0]), "spline endpoint"); + CHECK(almost_eq(spl.interp(x[N-1]), y[N-1]), "spline endpoint"); +} + +// 3) Quadratic dataset: degree-2 polynomial interpolation should be exact +static double f_quad(double t) { return t*t - 3.0*t + 2.0; } // (t-1)(t-2) + +TEST_CASE(Interp_Polynomial_Deg2_Exact_On_Quadratic) { + const std::uint64_t N = 21; + utils::Vd x, y; + make_uniform_xy_fun(x, y, N, -2.0, 0.5, &f_quad); + + numerics::interp_polynomial pol(x,y, 3); + + std::vector qs = { -1.75, -0.1, 0.3, 1.4, 3.9, 7.25 }; + for (double q : qs) { + // only test inside the data domain to avoid extrap behavior + if (q >= x[0] && q <= x[N-1]) { + const double ytrue = f_quad(q); + //std::cout << pol.interp(q) << ", " << ytrue << ", "<< q <(x, y, N, 0.0, 0.5, &f_cos); + + numerics::interp_linear lin(x,y); + numerics::interp_polynomial pol(x,y, 3); // small local degree + numerics::interp_cubic_spline spl(x,y); + numerics::interp_rational rat(x,y, 3); + numerics::interp_barycentric bar(x,y, 3); + + // sample a handful of interior points and require all methods to be mutually close + std::vector qs = { 1.25, 7.75, 12.1, 18.6, 22.75 }; + for (double q : qs) { + // skip if q is outside just in case + if (q < x[0] || q > x[N-1]) continue; + + double yl = lin.interp(q); + double yp = pol.interp(q); + double ys = spl.interp(q); + double yr = rat.interp(q); + double yb = bar.interp(q); + + //std::cout << "lin: " << yl << std::endl; + //std::cout << "pol: " << yp << std::endl; + //std::cout << "spl: " << ys << std::endl; + //std::cout << "rat: " << yr << std::endl; + //std::cout << "bar: " << yb << std::endl; + + // spline is usually the smoothest; use it as the anchor + CHECK(almost_eq(yl, ys, 5e-4), "linear vs spline"); + CHECK(almost_eq(yp, ys, 5e-4), "polynomial vs spline"); + CHECK(almost_eq(yr, ys, 5e-4), "rational vs spline"); + CHECK(almost_eq(yb, ys, 5e-4), "barycentric vs spline"); + } +} \ No newline at end of file diff --git a/test/test_inverse.cpp b/test/test_inverse.cpp new file mode 100644 index 0000000..f4de9ab --- /dev/null +++ b/test/test_inverse.cpp @@ -0,0 +1,141 @@ +#include "test_common.h" + +#include "./utils/matrix.h" +#include "./utils/vector.h" +#include "./numerics/inverse.h" +#include "./numerics/matmul.h" + + + +// ---------- helpers ---------- +template +static utils::Matrix identity(std::uint64_t n) { + utils::Matrix I(n,n,T(0)); + for (std::uint64_t i=0;i +static bool mats_equal_tol(const utils::Matrix& X, + const utils::Matrix& Y, + double tol = 1e-12) { + if (X.rows()!=Y.rows() || X.cols()!=Y.cols()) return false; + for (std::uint64_t i=0;i tol) return false; + return true; +} + +// A small well-conditioned SPD 3x3 +static utils::Matrix make_A3() { + utils::Matrix A(3,3,0.0); + // [ 4 3 0 + // 3 4 -1 + // 0 -1 4 ] + A(0,0)=4; A(0,1)=3; A(0,2)=0; + A(1,0)=3; A(1,1)=4; A(1,2)=-1; + A(2,0)=0; A(2,1)=-1; A(2,2)=4; + return A; +} + +// A random-ish SPD 5x5 (constructed deterministically) +static utils::Matrix make_A5_spd() { + utils::Matrix R(5,5,0.0); + // Fill R with a simple pattern + double v=1.0; + for (std::uint64_t i=0;i<5;++i) + for (std::uint64_t j=0;j<5;++j, v+=0.37) + R(i,j) = std::fmod(v, 3.0) - 1.0; // values in [-1,2) + // A = R^T R + 5 I → SPD and well-conditioned + utils::Matrix Rt(5,5,0.0); + for (std::uint64_t i=0;i<5;++i) + for (std::uint64_t j=0;j<5;++j) + Rt(i,j) = R(j,i); + auto RtR = numerics::matmul(Rt, R); + for (std::uint64_t i=0;i<5;++i) RtR(i,i) += 5.0; + return RtR; +} + +// ---------- tests ---------- + +TEST_CASE(Inverse_GJ_3x3) { + auto A = make_A3(); + auto A_copy = A; + + auto Inv = numerics::inverse(A, "Gauss-Jordan"); // non-inplace + auto I = identity(3); + + auto AInv = numerics::matmul(A, Inv); + auto InvA = numerics::matmul(Inv, A); + + CHECK(mats_equal_tol(AInv, I, 1e-11), "A*Inv != I (Gauss-Jordan)"); + CHECK(mats_equal_tol(InvA, I, 1e-11), "Inv*A != I (Gauss-Jordan)"); + + // A should be unchanged by numerics::inverse (it copies internally) + CHECK(mats_equal_tol(A, A_copy, 1e-15), "inverse() modified input A"); +} + +TEST_CASE(Inverse_LU_3x3) { + auto A = make_A3(); + + auto Inv = numerics::inverse(A, "LU"); + auto I = identity(3); + + auto AInv = numerics::matmul(A, Inv); + auto InvA = numerics::matmul(Inv, A); + + CHECK(mats_equal_tol(AInv, I, 1e-11), "A*Inv != I (LU)"); + CHECK(mats_equal_tol(InvA, I, 1e-11), "Inv*A != I (LU)"); +} + +TEST_CASE(Inplace_Inverse_Both_Methods_Agree_5x5) { + auto A = make_A5_spd(); + + auto GJ = A; numerics::inplace_inverse(GJ, "Gauss-Jordan"); + auto LU = A; numerics::inplace_inverse(LU, "LU"); + + // Both should be valid inverses + auto I = identity(5); + CHECK(mats_equal_tol(numerics::matmul(A, GJ), I, 1e-10), "A*GJ != I"); + CHECK(mats_equal_tol(numerics::matmul(GJ, A), I, 1e-10), "GJ*A != I"); + CHECK(mats_equal_tol(numerics::matmul(A, LU), I, 1e-10), "A*LU != I"); + CHECK(mats_equal_tol(numerics::matmul(LU, A), I, 1e-10), "LU*A != I"); + + // And they should be very close to each other + CHECK(mats_equal_tol(GJ, LU, 1e-10), "Gauss-Jordan inverse != LU inverse"); +} + +TEST_CASE(Inverse_NonSquare_Throws) { + utils::Matrix A(2,3,1.0); + bool threw=false; + try { auto B = numerics::inverse(A, "Gauss-Jordan"); (void)B; } catch(const std::runtime_error&) { threw=true; } + CHECK(threw, "inverse should throw on non-square (Gauss-Jordan)"); + + threw=false; + try { numerics::inplace_inverse(A, "LU"); } catch(const std::runtime_error&) { threw=true; } + CHECK(threw, "inplace_inverse should throw on non-square (LU)"); +} + +TEST_CASE(Inverse_Singular_Throws) { + utils::Matrix A(3,3,0.0); + // Two identical rows → singular + A(0,0)=1; A(0,1)=2; A(0,2)=3; + A(1,0)=1; A(1,1)=2; A(1,2)=3; + A(2,0)=0; A(2,1)=1; A(2,2)=4; + + bool threw=false; + try { auto B = numerics::inverse(A, "Gauss-Jordan"); (void)B; } catch(const std::runtime_error&) { threw=true; } + CHECK(threw, "inverse(GJ) should throw on singular"); + + threw=false; + try { auto B = numerics::inverse(A, "LU"); (void)B; } catch(const std::runtime_error&) { threw=true; } + CHECK(threw, "inverse(LU) should throw on singular"); +} + +TEST_CASE(Inverse_Invalid_Method_Throws) { + auto A = make_A3(); + bool threw=false; + try { auto B = numerics::inverse(A, "NotAThing"); (void)B; } catch(const std::runtime_error&) { threw=true; } + CHECK(threw, "inverse should throw on unknown method"); +} \ No newline at end of file diff --git a/test/test_lu.cpp b/test/test_lu.cpp new file mode 100644 index 0000000..1255d3d --- /dev/null +++ b/test/test_lu.cpp @@ -0,0 +1,169 @@ +#include "test_common.h" + +#include "./utils/matrix.h" +#include "./utils/vector.h" +#include "./numerics/matmul.h" +#include "./numerics/matvec.h" + +#include "./decomp/lu.h" + +//#include + +// ---------- helpers ---------- +template +static bool mats_equal_tol(const utils::Matrix& X, + const utils::Matrix& Y, + double tol = 1e-12) { + if (X.rows()!=Y.rows() || X.cols()!=Y.cols()) return false; + for (std::uint64_t i=0;i tol) return false; + return true; +} + +template +static utils::Matrix identity(std::uint64_t n) { + utils::Matrix I(n,n,T(0)); + for (std::uint64_t i=0;i +static void split_LU(const utils::Matrix& lu, + utils::Matrix& L, + utils::Matrix& U) { + const std::uint64_t n = lu.rows(); + L.resize(n,n,T(0)); + U.resize(n,n,T(0)); + for (std::uint64_t i=0;ij) L(i,j) = lu(i,j); + else if (i==j){ L(i,i) = T(1); U(i,i) = lu(i,i); } + else U(i,j) = lu(i,j); + } + } +} + +template +static utils::Matrix permutation_from_indx(const std::vector& indx) { + const std::uint64_t n = indx.size(); + auto P = identity(n); + // Apply the same sequence of row swaps that was applied during factorization + for (std::uint64_t k=0;k make_A_spd() { + utils::Matrix A(3,3,0.0); + // [ 4 3 0 + // 3 4 -1 + // 0 -1 4 ] + A(0,0)=4; A(0,1)=3; A(0,2)=0; + A(1,0)=3; A(1,1)=4; A(1,2)=-1; + A(2,0)=0; A(2,1)=-1; A(2,2)=4; + return A; +} + +TEST_CASE(LU_PA_equals_LU) { + auto A = make_A_spd(); + decomp::LUdcmpd lu(A); + + utils::Matrix L,U; + split_LU(lu.lu, L, U); + auto P = permutation_from_indx(lu.indx); + + auto PA = numerics::matmul(P, A); + auto LU = numerics::matmul(L, U); + + CHECK(mats_equal_tol(PA, LU, 1e-12), "PA should equal LU"); +} + +TEST_CASE(LU_Solve_Vector) { + auto A = make_A_spd(); + decomp::LUdcmpd lu(A); + + utils::Vd b(3,0.0); + b[0]=1.0; b[1]=2.0; b[2]=3.0; + + auto x = lu.solve(b); + auto Ax = numerics::matvec(A, x); + + CHECK(b.nearly_equal_vec(Ax, 1e-12), "A*x should equal b"); +} + +TEST_CASE(LU_Solve_Matrix_MultiRHS) { + auto A = make_A_spd(); + decomp::LUdcmpd lu(A); + + utils::Matrix B(3,2,0.0); + // two RHS columns + B(0,0)=1; B(1,0)=2; B(2,0)=3; + B(0,1)=4; B(1,1)=5; B(2,1)=6; + + auto X = lu.solve(B); // 3x2 + + // Check A*X == B + auto AX = numerics::matmul(A, X); + CHECK(mats_equal_tol(AX, B, 1e-12), "A*X should equal B"); + + // And that column-wise solve agrees + utils::Vd b0(3,0.0), b1(3,0.0); + for (int i=0;i<3;++i){ b0[i]=B(i,0); b1[i]=B(i,1); } + auto x0 = lu.solve(b0); + auto x1 = lu.solve(b1); + + CHECK(std::fabs(double(X(0,0)-x0[0]))<1e-12 && + std::fabs(double(X(1,0)-x0[1]))<1e-12 && + std::fabs(double(X(2,0)-x0[2]))<1e-12, "column 0 mismatch"); + + CHECK(std::fabs(double(X(0,1)-x1[0]))<1e-12 && + std::fabs(double(X(1,1)-x1[1]))<1e-12 && + std::fabs(double(X(2,1)-x1[2]))<1e-12, "column 1 mismatch"); +} + +TEST_CASE(LU_Determinant) { + auto A = make_A_spd(); + decomp::LUdcmpd lu(A); + // For this A, det = 24 + double d = lu.det(); + CHECK(std::fabs(d - 24.0) < 1e-12, "determinant incorrect"); +} + +TEST_CASE(LU_Inverse_via_SolveI) { + auto A = make_A_spd(); + decomp::LUdcmpd lu(A); + + // Build identity and solve A * X = I + auto I = identity(3); + auto Inv = lu.solve(I); + + // Check A*Inv == I (and Inv*A == I for good measure) + auto AInv = numerics::matmul(A, Inv); + auto InvA = numerics::matmul(Inv, A); + + CHECK(mats_equal_tol(AInv, I, 1e-11), "A*Inv should be I"); + CHECK(mats_equal_tol(InvA, I, 1e-11), "Inv*A should be I"); +} + +TEST_CASE(LU_NonSquare_Throws) { + utils::Matrix A(2,3,1.0); + bool threw=false; + try { decomp::LUdcmpd lu(A); } catch (const std::runtime_error&) { threw = true; } + CHECK(threw, "LU should throw on non-square"); +} + +TEST_CASE(LU_Singular_Throws) { + utils::Matrix A(3,3,0.0); + // Make two identical rows + A(0,0)=1; A(0,1)=2; A(0,2)=3; + A(1,0)=1; A(1,1)=2; A(1,2)=3; + A(2,0)=0; A(2,1)=1; A(2,2)=4; + + bool threw=false; + try { decomp::LUdcmpd lu(A); } catch (const std::runtime_error&) { threw = true; } + CHECK(threw, "LU should throw on singular matrix"); +} \ No newline at end of file diff --git a/test/test_matequal.cpp b/test/test_matequal.cpp new file mode 100644 index 0000000..c0b564d --- /dev/null +++ b/test/test_matequal.cpp @@ -0,0 +1,108 @@ + +#include "test_common.h" +#include "./numerics/matequal.h" + +using utils::Vf; using utils::Vd; using utils::Vi; +using utils::Mf; using utils::Md; using utils::Mi; + + +// ---------- helpers ---------- +template +static void fill_seq(utils::Matrix& M, T start = T{0}, T step = T{1}) { + std::uint64_t k = 0; + for (std::uint64_t i = 0; i < M.rows(); ++i) + for (std::uint64_t j = 0; j < M.cols(); ++j, ++k) + M(i,j) = start + step * static_cast(k); +} + + + + + +// ---------- tests ---------- + +TEST_CASE(matequal_shape_mismatch) { + utils::Mi A(3,3,0), B(3,4,0); + CHECK(!numerics::matequal(A,B), "shape mismatch should be false (serial)"); + +#ifdef _OPENMP + CHECK(!numerics::matequal_omp(A,B), "shape mismatch should be false (omp)"); +#endif + CHECK(!numerics::matequal_auto(A,B), "shape mismatch should be false (auto)"); +} + +TEST_CASE(matequal_int_true_false) { + utils::Mi A(4,5,0), B(4,5,0); + fill_seq(A, int64_t(0), int64_t(1)); + fill_seq(B, int64_t(0), int64_t(1)); + CHECK(numerics::matequal(A,B), "ints equal (serial)"); +#ifdef _OPENMP + CHECK(numerics::matequal_omp(A,B), "ints equal (omp)"); +#endif + // flip one element + B(2,3) += 1; + CHECK(!numerics::matequal(A,B), "ints differ (serial)"); +#ifdef _OPENMP + CHECK(!numerics::matequal_omp(A,B), "ints differ (omp)"); // will FAIL if your omp branch uses '!=' +#endif +} + +TEST_CASE(matequal_double_tolerance) { + utils::Md A(3,3,0.0), B(3,3,0.0); + fill_seq(A, double(1.0), double(0.125)); + fill_seq(B, double(1.0), double(0.125)); + // tiny perturbation within default tol + B(1,1) += 1e-12; + CHECK(numerics::matequal(A,B), "double within tol (serial)"); +#ifdef _OPENMP + CHECK(numerics::matequal_omp(A,B), "double within tol (omp)"); +#endif + // larger perturbation exceeds tol + B(0,2) += 1e-6; + CHECK(!numerics::matequal(A,B, 1e-9), "double exceeds tol (serial)"); +#ifdef _OPENMP + CHECK(!numerics::matequal_omp(A,B, 1e-9), "double exceeds tol (omp)"); +#endif +} + +TEST_CASE(matequal_auto_agrees) { + // Choose size so auto likely takes the OMP path when available, + // but this test only checks correctness, not which path was taken. + utils::Md A(256,256,0.0), B(256,256,0.0); + fill_seq(A, double(0.0), double(0.01)); + fill_seq(B, double(0.0), double(0.01)); + CHECK(numerics::matequal_auto(A,B), "auto equal"); + + B(5,7) += 1e-3; + CHECK(!numerics::matequal_auto(A,B, 1e-9), "auto detects mismatch"); +} + +#ifdef _OPENMP +TEST_CASE(mateequal_omp_nested_callsite) { + // Verify correctness when called inside an outer parallel region. + utils::Mi A(128,128,0), B(128,128,0); + fill_seq(A, int64_t(0), int64_t(1)); + fill_seq(B, int64_t(0), int64_t(1)); + + // allow one nested level; inner region inside mateequal_omp may spawn a team + int prev_levels = omp_get_max_active_levels(); + omp_set_max_active_levels(2); + + bool ok_equal = false, ok_diff = false; + + #pragma omp parallel num_threads(2) shared(ok_equal, ok_diff) + { + #pragma omp single + { + ok_equal = numerics::matequal_omp(A,B); + B(10,10) += 1; // introduce a mismatch + ok_diff = !numerics::matequal_omp(A,B); + } + } + + omp_set_max_active_levels(prev_levels); + + CHECK(ok_equal, "nested equal should be true"); + CHECK(ok_diff, "nested mismatch should be false"); +} +#endif diff --git a/test/test_matmul.cpp b/test/test_matmul.cpp new file mode 100644 index 0000000..82be5aa --- /dev/null +++ b/test/test_matmul.cpp @@ -0,0 +1,127 @@ +#include "test_common.h" +#include "./utils/utils.h" +#include "./numerics/matmul.h" + +#include + +// ---------- helpers ---------- +template +static bool mats_equal(const utils::Matrix& X, const utils::Matrix& Y, double tol = 0.0) { + if (X.rows()!=Y.rows() || X.cols()!=Y.cols()) return false; + if (std::is_floating_point::value) { + for (std::uint64_t i=0;i tol) return false; + } else { + for (std::uint64_t i=0;i +static void fill_seq(utils::Matrix& M, T start = T(0), T step = T(1)) { + std::uint64_t k = 0; + for (std::uint64_t i=0;i(k); +} +// ---------- tests ---------- + +// Small known example: (3x2) · (2x3) +TEST_CASE(Matmul_Small_Known) { + utils::Mi A(3,2,0), B(2,3,0); + // A = [1 2; 3 4; 5 6] + A(0,0)=1; A(0,1)=2; + A(1,0)=3; A(1,1)=4; + A(2,0)=5; A(2,1)=6; + // B = [7 8 9; 10 11 12] + B(0,0)=7; B(0,1)=8; B(0,2)=9; + B(1,0)=10; B(1,1)=11; B(1,2)=12; + + auto C = numerics::matmul(A,B); + CHECK(C.rows()==3 && C.cols()==3, "shape 3x3 wrong"); + + // Expected C: + // [27 30 33] + // [61 68 75] + // [95 106 117] + CHECK(C(0,0)==27 && C(0,1)==30 && C(0,2)==33, "row 0 wrong"); + CHECK(C(1,0)==61 && C(1,1)==68 && C(1,2)==75, "row 1 wrong"); + CHECK(C(2,0)==95 && C(2,1)==106 && C(2,2)==117, "row 2 wrong"); +} + +TEST_CASE(Matmul_DimMismatch_Throws) { + utils::Md A(2,3,1.0), B(4,2,2.0); // A.cols()!=B.rows() + bool threw=false; + try { (void)numerics::matmul(A,B); } catch(const std::runtime_error&) { threw=true; } + CHECK(threw, "matmul should throw on dim mismatch"); +} + +// Compare all variants vs serial on a moderate size +TEST_CASE(Matmul_Variants_Equal_Int) { + const std::uint64_t m=32, n=24, p=16; + utils::Mi A(m,n,0), B(n,p,0); + + // deterministic fill (no randomness) + fill_seq(A, int64_t(1), int64_t(1)); + fill_seq(B, int64_t(2), int64_t(3)); + + auto C_ref = numerics::matmul(A,B); + + auto C_rows = numerics::matmul_rows_omp(A,B); + auto C_collapse = numerics::matmul_collapse_omp(A,B); + auto C_auto = numerics::matmul_auto(A,B); + + CHECK(mats_equal(C_rows, C_ref), "rows_omp != serial"); + CHECK(mats_equal(C_collapse, C_ref), "collapse_omp != serial"); + CHECK(mats_equal(C_auto, C_ref), "auto != serial"); +} + +TEST_CASE(Matmul_Variants_Equal_Double) { + const std::uint64_t m=33, n=17, p=19; + utils::Md A(m,n,0.0), B(n,p,0.0); + + fill_seq(A, 0.1, 0.01); + fill_seq(B, 1.0, 0.02); + + auto C_ref = numerics::matmul(A,B); + auto C_rows = numerics::matmul_rows_omp(A,B); + auto C_collapse = numerics::matmul_collapse_omp(A,B); + auto C_auto = numerics::matmul_auto(A,B); + + CHECK(mats_equal(C_rows, C_ref, 1e-9), "rows_omp != serial (double)"); + CHECK(mats_equal(C_collapse, C_ref, 1e-9), "collapse_omp != serial (double)"); + CHECK(mats_equal(C_auto, C_ref, 1e-9), "auto != serial (double)"); +} + +// Nested callsite sanity: call OMP variant from within an outer region +#ifdef _OPENMP +TEST_CASE(Matmul_OMP_Nested_Callsite) { + const std::uint64_t m=48, n=24, p=32; + utils::Mi A(m,n,0), B(n,p,0); + fill_seq(A, int64_t(1), int64_t(2)); + fill_seq(B, int64_t(3), int64_t(1)); + + auto C_ref = numerics::matmul(A,B); + + int prev_levels = omp_get_max_active_levels(); + omp_set_max_active_levels(2); + + utils::Mi C_nested; + #pragma omp parallel num_threads(2) + { + #pragma omp single + { + // either variant is fine; collapse(2) has more parallelism + C_nested = numerics::matmul_collapse_omp(A,B); + } + } + + omp_set_max_active_levels(prev_levels); + + CHECK(mats_equal(C_nested, C_ref), "nested collapse_omp result mismatch"); +} +#endif \ No newline at end of file diff --git a/test/test_matrix.cpp b/test/test_matrix.cpp new file mode 100644 index 0000000..1a50dd4 --- /dev/null +++ b/test/test_matrix.cpp @@ -0,0 +1,164 @@ + +#include "test_common.h" +#include "./utils/matrix.h" + +using utils::Vf; using utils::Vd; using utils::Vi; +using utils::Mf; using utils::Md; using utils::Mi; + + +// tiny helper +template +static bool mat_is_filled(const utils::Matrix& M, T v) { + for (std::uint64_t i = 0; i < M.rows(); ++i) + for (std::uint64_t j = 0; j < M.cols(); ++j) + if (M(i,j) != v) return false; + return true; +} + +// ------------------- basic construction ------------------- +TEST_CASE(Matrix_Default_Construct) { + Md M; + CHECK_EQ(M.rows(), 0, "default rows should be 0"); + CHECK_EQ(M.cols(), 0, "default cols should be 0"); +} + +TEST_CASE(Matrix_Filled_Construct) { + Md M(3, 4, 2.5); + CHECK_EQ(M.rows(), 3, "rows"); + CHECK_EQ(M.cols(), 4, "cols"); + CHECK(mat_is_filled(M, 2.5), "all elements should be 2.5"); +} + +// ------------------- element access / write ------------------- +TEST_CASE(Matrix_Set_Get) { + Mi M(2, 3, 0); + M(0,0) = 42; + M(1,2) = -7; + CHECK_EQ(M(0,0), 42, "set/get (0,0)"); + CHECK_EQ(M(1,2), -7, "set/get (1,2)"); +} + +// ------------------- resize semantics ------------------- +TEST_CASE(Matrix_Resize_Grow) { + Mf M(2, 2, 1.0f); + M.resize(3, 4, 9.0f); // grow; newly appended elements get the fill value + CHECK_EQ(M.rows(), 3, "rows after resize"); + CHECK_EQ(M.cols(), 4, "cols after resize"); + CHECK(M(2,3) == 9.0f, "last element should be the fill value after grow"); +} + +TEST_CASE(Matrix_Resize_Shrink) { + Mi M(4, 4, 5); + M(0,0) = 11; + M.resize(2, 2, 999); // shrink; size reduces + CHECK_EQ(M.rows(), 2, "rows after shrink"); + CHECK_EQ(M.cols(), 2, "cols after shrink"); + // element mapping after shrink is implementation dependent; just check bounds usable + M(1,1) = 3; + CHECK_EQ(M(1,1), 3, "write after shrink works"); +} + +// ------------------- row helpers ------------------- +TEST_CASE(Matrix_Get_Row) { + Mi M(3,4,0); + // set row 1 to [10,20,30,40] + for (std::uint64_t j=0;j<4;++j) M(1,j) = (j+1)*10; + auto r = M.get_row(1); + CHECK_EQ(r.size(), 4, "row size"); + CHECK(r[0]==10 && r[1]==20 && r[2]==30 && r[3]==40, "row contents"); +} + +TEST_CASE(Matrix_Set_Row) { + Mi M(2,3,0); + utils::Vector v(3, 0); + v[0]=7; v[1]=8; v[2]=9; + M.set_row(0, v); + CHECK(M(0,0)==7 && M(0,1)==8 && M(0,2)==9, "set_row contents"); +} + +TEST_CASE(Matrix_Row_OutOfRange_Throws) { + Mi M(2,2,0); + bool threw=false; + try { (void)M.get_row(2); } catch(const std::out_of_range&) { threw=true; } + CHECK(threw, "get_row out-of-range should throw"); + + threw=false; + try { + utils::Vector v(3,1); // wrong size + M.set_row(1, v); + } catch(const std::runtime_error&) { threw=true; } + CHECK(threw, "set_row size mismatch should throw"); +} + +// ------------------- col helpers ------------------- +TEST_CASE(Matrix_Get_Col) { + Mi M(3,2,0); + M(0,1)=5; M(1,1)=6; M(2,1)=7; + auto c = M.get_col(1); + CHECK_EQ(c.size(), 3, "col size"); + CHECK(c[0]==5 && c[1]==6 && c[2]==7, "col contents"); +} + +TEST_CASE(Matrix_Set_Col) { + Mi M(3,2,0); + utils::Vector v(3, 0); + v[0]=1; v[1]=4; v[2]=9; + M.set_col(0, v); + CHECK(M(0,0)==1 && M(1,0)==4 && M(2,0)==9, "set_col contents"); +} + +TEST_CASE(Matrix_Col_OutOfRange_Throws) { + Mi M(2,2,0); + bool threw=false; + try { (void)M.get_col(2); } catch(const std::out_of_range&) { threw=true; } + CHECK(threw, "get_col out-of-range should throw"); + + threw=false; + try { + utils::Vector v(1,1); // wrong size + M.set_col(1, v); + } catch(const std::runtime_error&) { threw=true; } + CHECK(threw, "set_col size mismatch should throw"); +} + +// ------------------- swap rows/cols ------------------- +TEST_CASE(Matrix_Swap_Rows) { + Mi M(2,3,0); + // row0: 1 2 3, row1: 4 5 6 + for (std::uint64_t j=0;j<3;++j){ M(0,j)=j+1; M(1,j)=j+4; } + M.swap_rows(0,1); + CHECK(M(0,0)==4 && M(0,1)==5 && M(0,2)==6, "row0 after swap"); + CHECK(M(1,0)==1 && M(1,1)==2 && M(1,2)==3, "row1 after swap"); +} + +TEST_CASE(Matrix_Swap_Cols) { + Mi M(3,3,0); + // col0: 9 8 7, col2: 1 2 3 + M(0,0)=9; M(1,0)=8; M(2,0)=7; + M(0,2)=1; M(1,2)=2; M(2,2)=3; + M.swap_cols(0,2); + CHECK(M(0,0)==1 && M(1,0)==2 && M(2,0)==3, "col0 after swap"); + CHECK(M(0,2)==9 && M(1,2)==8 && M(2,2)==7, "col2 after swap"); +} + +TEST_CASE(Matrix_Swap_OutOfRange_Throws) { + Mi M(2,2,0); + bool threw=false; + try { M.swap_rows(0,2); } catch(const std::out_of_range&) { threw=true; } + CHECK(threw, "swap_rows out-of-range should throw"); + threw=false; + try { M.swap_cols(0,3); } catch(const std::out_of_range&) { threw=true; } + CHECK(threw, "swap_cols out-of-range should throw"); +} + +// ------------------- stream output (basic sanity) ------------------- +TEST_CASE(Matrix_Stream_ToString) { + Mf M(2,2,0.0f); + M(0,0)=1.0f; M(0,1)=2.0f; M(1,0)=3.0f; M(1,1)=4.0f; + std::ostringstream os; + os << M; + auto s = os.str(); + CHECK(s.find("[[") != std::string::npos, "starts with [["); + CHECK(s.find("1.000") != std::string::npos, "contains formatted 1.000"); + CHECK(s.find("4.000") != std::string::npos, "contains formatted 4.000"); +} \ No newline at end of file diff --git a/test/test_matvec.cpp b/test/test_matvec.cpp new file mode 100644 index 0000000..1b838e0 --- /dev/null +++ b/test/test_matvec.cpp @@ -0,0 +1,236 @@ + +#include "test_common.h" + +#include "./numerics/matvec.h" // numerics::matvec / inplace_transpose +#include + +using utils::Vi; using utils::Vf; using utils::Vd; +using utils::Mi; using utils::Mf; using utils::Md; + + + +// ------------------------------------------------------------ +// matvec: y = A * x +// ------------------------------------------------------------ +TEST_CASE(Matvec_Serial_Simple) { + // A = [[1,2,3], + // [4,5,6]] + Md A(2,3,0.0); + A(0,0)=1; A(0,1)=2; A(0,2)=3; + A(1,0)=4; A(1,1)=5; A(1,2)=6; + Vd x(3,0.0); x[0]=7; x[1]=8; x[2]=9; + + auto y = numerics::matvec(A,x); // [ 1*7+2*8+3*9 , 4*7+5*8+6*9 ] = [50, 122] + CHECK(y.size()==2, "matvec size wrong"); + CHECK(y[0]==50.0 && y[1]==122.0, "matvec values wrong"); +} + +TEST_CASE(Matvec_OMP_Equals_Serial) { + Md A(3,3,0.0); + // A = I * 2 + for (uint64_t i=0;i<3;++i) A(i,i)=2.0; + Vd x(3,0.0); x[0]=1; x[1]=2; x[2]=3; + + auto ys = numerics::matvec(A,x); + auto yp = numerics::matvec_omp(A,x); + + CHECK((ys.nearly_equal_vec(yp)), "matvec_omp != matvec"); +} + +TEST_CASE(Matvec_Auto_Equals_Serial) { + Md A(2,2,0.0); A(0,0)=2; A(0,1)=1; A(1,0)=0.5; A(1,1)=3; + Vd x(2,0.0); x[0]=4; x[1]=5; + + auto ys = numerics::matvec(A,x); + auto ya = numerics::matvec_auto(A,x); + + CHECK((ys.nearly_equal_vec(ya)), "matvec_auto != serial"); +} + +TEST_CASE(Matvec_DimensionMismatch_Throws) { + Md A(2,3,0.0); + Vd x(4,0.0); + bool threw=false; + try { auto _ = numerics::matvec(A,x); (void)_; } + catch (const std::runtime_error&) { threw=true; } + CHECK(threw, "matvec must throw on dimension mismatch"); +} + +TEST_CASE(Matvec_Zero_Edges) { + Md A(0,3,0.0); // 0x3 + Vd x(3,1.0); + auto y = numerics::matvec(A,x); + CHECK(y.size()==0, "0xN * x should return size 0 vector"); + + Md B(2,0,0.0); // 2x0 + Vd z(0,0.0); + auto y2 = numerics::matvec(B,z); + CHECK(y2.size()==2 && y2[0]==0.0 && y2[1]==0.0, "N×0 * 0 should return zeros of size N"); +} + +TEST_CASE(Matvec_Float_Tolerance) { + Mf A(2,2,0.0f); A(0,0)=1.0f; A(0,1)=2.0f; A(1,0)=3.0f; A(1,1)=4.0f; + Vf x(2,0.0f); x[0]=0.1f; x[1]=0.2f; + + auto y1 = numerics::matvec(A,x); + auto y2 = numerics::matvec_omp(A,x); + + CHECK((y1.nearly_equal_vec(y2,1e-6f)), "matvec float omp mismatch"); +} +// +// ---------- Auto inside an outer parallel region (no accidental nested teams) ---------- +// We just check correctness; performance is environment-dependent. +// +TEST_CASE(Matvec_Auto_Inside_Outer_Parallel_Correctness) { + const uint64_t m=64, n=64; + Md A(m,n,1.0); Vd x(n,2.0); + //fill_deterministic(A); fill_deterministic(x); + Vd ref = numerics::matvec(A,x); + + // Call auto inside an outer team + #ifdef _OPENMP + #pragma omp parallel for schedule(static) + #endif + for (int rep=0; rep<32; ++rep) { + auto y = numerics::matvec_auto(A,x); + // Each thread checks its own result equals reference + if (!(y.nearly_equal_vec(ref))) { + throw TestFailure("matvec_auto wrong under outer parallel region"); + } + } +} +TEST_CASE(Matvec_Speed_Sanity) { + const uint64_t m=4096, n=4096; // ~16M MACs; adjust if needed + Md A(m,n,1.0); Vd x(n,2.0); + //fill_deterministic(A); fill_deterministic(x); + + auto t0 = std::chrono::high_resolution_clock::now(); + auto yS = numerics::matvec(A,x); + double tp = std::chrono::duration(std::chrono::high_resolution_clock::now() - t0).count(); + + #ifdef _OPENMP + int threads = omp_get_max_threads(); + #else + int threads = 1; + #endif + + t0 = std::chrono::high_resolution_clock::now(); + auto yP = numerics::matvec_omp(A,x); + double ts = std::chrono::duration(std::chrono::high_resolution_clock::now() - t0).count(); + + CHECK((yS.nearly_equal_vec(yP)), "matvec_omp != matvec_serial (large)"); + // Only enforce basic sanity if we *can* use >1 threads: + if (threads > 1) { + // Be generous: just require not significantly slower. + CHECK(tp >= ts, "matvec_omp unexpectedly much slower than serial"); + } +} + +// ------------------------------------------------------------ +// vecmat: y = x * A +// ------------------------------------------------------------ +TEST_CASE(Vecmat_Serial_Simple) { + // A = [[1,2], + // [3,4], + // [5,6]] (3x2) + Md A(3,2,0.0); + A(0,0)=1; A(0,1)=2; + A(1,0)=3; A(1,1)=4; + A(2,0)=5; A(2,1)=6; + + Vd x(3,0.0); x[0]=7; x[1]=8; x[2]=9; + + auto y = numerics::vecmat(x,A); // 1*7+3*8+5*9= 76 ; 2*7+4*8+6*9=100 + CHECK(y.size()==2, "vecmat size wrong"); + CHECK(y[0]==76.0 && y[1]==100.0, "vecmat values wrong"); +} + +TEST_CASE(Vecmat_OMP_Equals_Serial) { + Md A(2,2,0.0); A(0,0)=2; A(0,1)=1; A(1,0)=5; A(1,1)=-1; + Vd x(2,0.0); x[0]=0.5; x[1]=1.5; + + auto ys = numerics::vecmat(x,A); + auto yp = numerics::vecmat_omp(x,A); + + CHECK((ys.nearly_equal_vec(yp)), "vecmat_omp != vecmat"); +} + +TEST_CASE(Vecmat_Auto_Equals_Serial) { + Md A(2,3,0.0); + A(0,0)=1; A(0,1)=2; A(0,2)=3; + A(1,0)=4; A(1,1)=5; A(1,2)=6; + Vd x(2,0.0); x[0]=1; x[1]=2; + + auto ys = numerics::vecmat(x,A); + auto ya = numerics::vecmat_auto(x,A); + + CHECK((ys.nearly_equal_vec(ya)), "vecmat_auto != serial"); +} + +TEST_CASE(Vecmat_DimensionMismatch_Throws) { + Md A(2,2,0.0); + Vd x(3,0.0); + bool threw=false; + try { auto _ = numerics::vecmat(x,A); (void)_; } + catch (const std::runtime_error&) { threw=true; } + CHECK(threw, "vecmat must throw on dimension mismatch"); +} + +TEST_CASE(Vecmat_Zero_Edges) { + Md A(0,3,0.0); + Vd x(0,0.0); + auto y = numerics::vecmat(x,A); // 0×N times N×M → 0×M + CHECK(y.size()==3 && y[0]==0.0 && y[1]==0.0 && y[2]==0.0, "0-length x times A wrong"); + + Md B(3,0,0.0); + Vd z(3,1.0); + auto y2 = numerics::vecmat(z,B); // 1x3 * 3x0 → 1x0 + CHECK(y2.size()==0, "vecmat with N×0 result size wrong"); +} + +// +// ---------- Auto inside an outer parallel region (no accidental nested teams) ---------- +// We just check correctness; performance is environment-dependent. +// +TEST_CASE(Vecmat_Auto_Inside_Outer_Parallel_Correctness) { + const uint64_t m=64, n=64; + Md A(m,n,1.0); Vd x(m,2.0); + //fill_deterministic(A); fill_deterministic(x); + Vd ref = numerics::vecmat(x,A); + + #ifdef _OPENMP + #pragma omp parallel for schedule(static) + #endif + for (int rep=0; rep<32; ++rep) { + auto y = numerics::vecmat_auto(x,A); + if (!(y.nearly_equal_vec(ref))) { + throw TestFailure("vecmat_auto wrong under outer parallel region"); + } + } +} + + +TEST_CASE(Vecmat_Speed_Sanity) { + const uint64_t m=4096, n=4096; + Md A(m,n,1.0); Vd x(m,2.0); + //fill_deterministic(A); fill_deterministic(x); + + auto t0 = std::chrono::high_resolution_clock::now(); + auto yS = numerics::vecmat(x,A); + double ts = std::chrono::duration(std::chrono::high_resolution_clock::now() - t0).count(); + + #ifdef _OPENMP + int threads = omp_get_max_threads(); + #else + int threads = 1; + #endif + + t0 = std::chrono::high_resolution_clock::now(); + auto yP = numerics::vecmat_omp(x,A); + double tp = std::chrono::duration(std::chrono::high_resolution_clock::now() - t0).count(); + + CHECK((yS.nearly_equal_vec(yP)), "vecmat_omp != vecmat_serial (large)"); + if (threads > 1) { + CHECK(tp <= ts, "vecmat_omp unexpectedly much slower than serial"); + } +} diff --git a/test/test_transpose.cpp b/test/test_transpose.cpp new file mode 100644 index 0000000..98f900c --- /dev/null +++ b/test/test_transpose.cpp @@ -0,0 +1,151 @@ + +#include "test_common.h" +//#include "./utils/matrix.h" // matrix.h, vector.h +#include "./numerics/transpose.h" // numerics::transpose / inplace_transpose + +using utils::Mi; using utils::Mf; using utils::Md; + +/// ---- helpers ---- +template +static void fill_seq(utils::Matrix& M, T start = T(0), T step = T(1)) { + std::uint64_t k = 0; + for (std::uint64_t i=0; i(k); +} + + +template +static bool mats_equal(const utils::Matrix& X, const utils::Matrix& Y) { + if (X.rows()!=Y.rows() || X.cols()!=Y.cols()) return false; + for (std::uint64_t i=0; i +static bool vec_equal_exact(const utils::Vector& a, const utils::Vector& b) { + if (a.size() != b.size()) return false; + for (std::uint64_t i=0;i [2,2,2] + CHECK(v[0]==2.0 && v[1]==2.0, "inplace_sqrt"); +} + +TEST_CASE(Vector_Dot_Sum_Norm) { + utils::Vd a(3, 0.0), b(3, 0.0); + a[0]=1.0; a[1]=2.0; a[2]=3.0; // a = [1,2,3] + b[0]=4.0; b[1]=5.0; b[2]=6.0; // b = [4,5,6] + + double dot = a.dot(b); // 1*4 + 2*5 + 3*6 = 32 + CHECK(std::fabs(dot - 32.0) < 1e-12, "dot"); + + double s = a.sum(); // 6 + CHECK(std::fabs(s - 6.0) < 1e-12, "sum"); + + double n = a.norm(); // sqrt(14) + CHECK(std::fabs(n - std::sqrt(14.0)) < 1e-12, "norm"); +} + +TEST_CASE(Vector_Normalize_and_Throws) { + utils::Vd v(3, 0.0); + v[0]=3.0; v[1]=4.0; v[2]=0.0; // norm = 5 + auto u = v.normalize(); // returns new vector + CHECK(std::fabs(u.norm() - 1.0) < 1e-12, "normalize() unit length"); + + v.inplace_normalize(); + CHECK(std::fabs(v.norm() - 1.0) < 1e-12, "inplace_normalize unit length"); + + utils::Vd z(3, 0.0); + bool threw=false; + try { z.inplace_normalize(); } catch(const std::runtime_error&) { threw=true; } + CHECK(threw, "normalize should throw on zero vector"); +} + +// Size mismatch throws (elementwise ops) +TEST_CASE(Vector_Size_Mismatch_Throws) { + utils::Vi a(3,1), b(4,2); + + bool threw=false; + try { (void)a.dot(b); } catch(const std::runtime_error&) { threw=true; } + CHECK(threw, "dot size mismatch should throw"); + + threw=false; + try { a.inplace_add(b); } catch(const std::runtime_error&) { threw=true; } + CHECK(threw, "add size mismatch should throw"); + + threw=false; + try { a.inplace_subtract(b); } catch(const std::runtime_error&) { threw=true; } + CHECK(threw, "subtract size mismatch should throw"); + + threw=false; + try { a.inplace_multiply(b); } catch(const std::runtime_error&) { threw=true; } + CHECK(threw, "multiply size mismatch should throw"); + + threw=false; + try { a.inplace_divide(b); } catch(const std::runtime_error&) { threw=true; } + CHECK(threw, "divide size mismatch should throw"); + + threw=false; + try { a.inplace_power(b); } catch(const std::runtime_error&) { threw=true; } + CHECK(threw, "power size mismatch should throw"); +} \ No newline at end of file