From 30e747f1ba94f08a7e5a8d74eab0114d357f8df3 Mon Sep 17 00:00:00 2001 From: cassiePython Date: Tue, 6 Aug 2019 11:16:53 +0800 Subject: [PATCH] fist commit --- Figure_1.png | Bin 0 -> 213407 bytes README.md | 111 +++++++++++- data/__init__.py | 0 data/dataset_factory.py | 39 ++++ data/datasets.py | 287 +++++++++++++++++++++++++++++ evaluate.py | 87 +++++++++ loss/__init__.py | 0 loss/losses.py | 15 ++ models/__init__.py | 0 models/model_factory.py | 119 ++++++++++++ models/models.py | 353 ++++++++++++++++++++++++++++++++++++ networks/__init__.py | 0 networks/network_factory.py | 36 ++++ networks/networks.py | 92 ++++++++++ options/__init__.py | 0 options/base_options.py | 95 ++++++++++ options/test_options.py | 10 + options/train_options.py | 13 ++ train_step1.py | 57 ++++++ train_step2.py | 53 ++++++ train_step3.py | 36 ++++ train_step4.py | 57 ++++++ utils/__init__.py | 0 utils/selectivesearch.py | 319 ++++++++++++++++++++++++++++++++ utils/util.py | 134 ++++++++++++++ 25 files changed, 1911 insertions(+), 2 deletions(-) create mode 100644 Figure_1.png create mode 100644 data/__init__.py create mode 100644 data/dataset_factory.py create mode 100644 data/datasets.py create mode 100644 evaluate.py create mode 100644 loss/__init__.py create mode 100644 loss/losses.py create mode 100644 models/__init__.py create mode 100644 models/model_factory.py create mode 100644 models/models.py create mode 100644 networks/__init__.py create mode 100644 networks/network_factory.py create mode 100644 networks/networks.py create mode 100644 options/__init__.py create mode 100644 options/base_options.py create mode 100644 options/test_options.py create mode 100644 options/train_options.py create mode 100644 train_step1.py create mode 100644 train_step2.py create mode 100644 train_step3.py create mode 100644 train_step4.py create mode 100644 utils/__init__.py create mode 100644 utils/selectivesearch.py create mode 100644 utils/util.py diff --git a/Figure_1.png b/Figure_1.png new file mode 100644 index 0000000000000000000000000000000000000000..4021f3866fa877c5270a29e320c1b5c730a2fea8 GIT binary patch literal 213407 zcmeFYWm6nc*DeeM5+npCSa2I$gF|q)!9CdE?j8sb++71fh9O9BcY;H3XK;6iVc>Az z=XvV=0q@tds=B&*SMTnsy_f9kT5CnBsmNlYlb|CYAYjVNNdXZMkiH=xAg-gneI4PQ zT-koTA-hS)Yofl2KdME<>oc0OoSqv30+#82E<~_csm<%4fV;G=yM`0U-OJR~62ZaL z-PzvB-QLEG($mt_&Bn=*lADc#jhlti+TGn*ke&Vidx6c#)rvhAqx=^F0wsdHl(?pM z&T;!h73+xJ-JMS!#Mti4Ex^G{>FF&Mb}c25DXkQ3Ng5F%jZ6#|RT?!F7B!U&$3+kV z?l2?wE>6^@oO);|K3#-V6!lIjm$z~P=AYPrGZCw^S)&_aVqvY-cHgRi)AoDv%AU%z zNkPApHTbWVmKK-+bT7TBm7C*#*g8{Ob=MvM0*4{>Ki^a38K5ySnzG&w^fHGx`sQI-S1tPvs_XCMay}F7J0x zvtg4V+tC^5FILdKWZ+|I5DAXY-pMDTSGgZrKlQ)g`0;c+@yr5|eCJz6gzSv4j^^Wb zmmPX)0DUA3x?~8tteX8D{2%cO?R2cLZvrttK`Rep~` z=sQdlDrB3zEC~7-f23&_gV@+a$hJEWUp|KP05cp~pu%XAj ztIVqhfAfcfp-cUvM|c!!!#kpCTuyHVCIn4Bq>S1m>!L5De|nv8zXV7ic+dsH@@?(0 zrj3N+ke#7<@Ia?rlb5xZ4)SCfp5o*N$keXhupT&}ddB^26?;i6xOXSxudtd&0`wGLI?($v}TqK%yHuQU zS&ifdn?06IT1?e~NA+ivt;7;91`?5l+E{^+U&Y;5GzfJ(UJ4p(X3E(*Cn9?C)_^PpLssUM!W)(bO_fZ{;hR*Y6su_G^o^s22Nv6Ljs-mYHgXuW^XL2+oh zVKR%=Ey{9`eLv2IdDpFrBKZE5VGE+Spw*PK%;G@l>dnyN0}s-Oaq)u8Eme{Jin2_x20JHtuunc zRTS9f@`6Z?uA|qNP`@fUzAlruU@qx_#_5u(R(lH;jOZ|wE6)V47=IW|n6#KyPDcM{ zN{CJOD2Jl;=R^Dn@yR2rnXZw(*U;~Ol?~m#3wpVGs5gP}25#{Met-4Qo$Er-hYvyL z?}E-F?=m|UXM}W!P@B2{iMKNHPwt%{g&H^)L2yRqb|p8O#8JYgvlVT&Rf1MC z+M}R6f@Ditcu+k~ac@&u1^QMcY=3WVvO{AsI=ERwK?8-ey0VTqW1SqCc>ztX9g8dc zow_(DE+|sUmX<^F^VIvHgyW*)1Qc~SJh`{o6z9k`p8V`H4aS*UmqfAG($VsuyD_$F zeOmg#`Lp%US%i0M7#U~$v%SH!%erxEM3X2tgt$J9($CoCeV>H%fIPh%%pzXior3hu zo7XemxnJj<-_!a#v31p#Yt@HSug;OGr{St|ouC_?rylmF9@Vxp5#pAcMv>b-3pzEz zT{*tRifM`>*_vBnA0Z|a(t|6jprmYSkgdw@G^C)vi-< z3j#=y2ND4?KWbvL2Hi|QWVOFLL^zudcVCX%&sS>&SKE~o9LJ6q8i*xoS_uYZ^;$#| z&qU2}xNO3G8{tuA+Ttiip@-q`N~K$f+c7ixB@o@QxUB(U&50#Ig<}(z8POlK;=A8( zF*e8Gg$Asjd*7al!$z%b&4t8LJ#ej#q$YIbf685#6D3rhqIqFmHTht>F^ulcDJ{*M zD7b*DcMlyATmNE@GX|W1alBOxoa+F-wzHy*fvOpd2N@ zDy(nGw98yO-U1t`nCL)cm}zWB-=886+igS}6W=)6hwK;wR_Jin^?4N(w;v zc22U~do4o6DITo>t*f7uA1(A0R@*wtdZ}w3Sv>JpmWphf!qKXdAAX}L6X&{Kk>*m~ z!Ao{AP&d&aR9`%c=RW^wdXtZ-$HZ$yiBY7a{FfR-KrFN~C)kF5!$O3HJjUUq!f|R< z&lAzmY`wx_G{ETr`nM`nf^iCd^;zr-H#oMMII3AaT7wj)d@eGW$Bc;fUk^2Llu2t> zWn9)e$!ZZ(_U24$bA0TIQbPUPNj-wf4#$FfG7Gi$e5LyRtQ++bL*4{w`sZBrii{aH z_v+LvxXZ)HSp>OD^|%;xDr6qAyrc6wz{!%I%|a?h2F7S+I!7@+-C$v3a$WmZ>ns*- z@T)e{be61JZDf{TGt~NA>!)*>?qL>%u5FE6VN%-R0RHhu%;q__0pbi_`>~S8Z1d@5 zmT9%VpnS;ale?EKpj`S_i~12R#80TI35ppZdNh%g68;LdUNM$XU!rCOI+Ppzp94}8 z2BPzT$nH*Y-y7Vjqfy;H=S3xsfre1_7$Y1?C{Ao+CaqKbjey6M0Ls6ElJ&8d(!OQl2^Vj{x;^#Wc_)DaFC#G6F~oIXM@VuFvg5~F5+MlD?L$DL_`*@Yez#{oGHF7c_F@;Zo( zJCK&7-yNOsJC!e$w{8n(%Sv+-4Pm9|`^%%9s~^w72*ZIUu!iH79Wd}Ty($PwDEa_P zY&wlxSBJNG#L!$EAp^6~n(#WGYwsS`D4eU}PUCASF!+{R*zCk?=1qFGS%v7lF*he; ztUp}2bC=7|Hqs=yxYg{*R4Xuk8N&9mW&5f!6w)FGI>FJqPLYXVq8|Z8 zVn@pb{f;Fyc&CUltB+QfsgaG=FxT?dv;NcpUNV0-=4n;CHfrX;1xwqD7*V*@jF}2x z@k0K`QUNh3Q^u^j9IY)mrJwn4^lOt8t}0rkr>A)5wP+k4&{>HSyBHy%YB^bQ0*hT{ zxz7T_6*Yc#RJ6;YobSK$8WB5{yLQ}&jC}kT-!82~f5%X`ULUmKhQ3aM-Lm{4{##6- zy{Q%CbRgxZ;W}NF;ah#fm-K^&4g<6`1~t=FA!7SIwwjLZTXb7wZrz;3{ln#*O&mBg zK8E&a`BG>u%%hCAXhh!Ij2jm|^FMsEaHR zlx51sNB-xA_9FcLVhK2ooQR88jWWt{LFs2U*7O)p*#ZJ9;xvbXs6T(nqYjMq>_!lS zR@5|k<4#n{gy=MTp2(RtHx^4}8-mDs<9rZDPCDB1@ICI{+Io9iPf=UD)GJRQ1)pBhUupi>v5ObYtkr5UCzil zb-rjh*uj)!H?LT1+W&S`%wrv%ocZ-w5pLIJtKBWH9#*ORjvHPu4p0=~D0wimp)saT z%-c+xYCMaEcf{p8q6jku!|7Z#k>qhOtKae;KX%S3h`+-5g5R?WxDFi(nZGYqHE4bv z+HF@w{G40<7s7&^5)ze6$JNvq-I#l(fa>AZj&|i9v>hpf{t-chMjIPINrz7xtj9jH z-DbM04kGv2?%lQ0mv#ZrveTBYq;i+#WyYMpJ9Y?)S;_F*TDB#hk-_((I0`gqfuW`l z>V88Hb1+OLK?J(-{+1C;8X@a`i-SFNuWl#JAT3WYfm`B3AoXeD%iAGSmGpx*EPT|d z@13C1*#cAVCqq6{&kR{WRBniR-&%jDQMMCH%F4HHt<+LK0O--uyJV@=pP!*X8oI(! zPi0C5v9_4@5AYEgZ4@Kh?{&0}$Eu>JhRTw_52?qLG<{8CY-f*6QJ`Y^2`K;nKr>@rQ_W)Z+X zmC~qyj7pR!Tj^WSw3!EPNbom>q?#3UG-*+fIb}RYeKN!>d>9LDIqJ=$uYPAeLv(a; z`B6b}qYNvV+u*6HhN56`U0Zd`f; z+1I#Y{5Q%m@7zjHRUbx{wMO}^YlghbW06`-I@A)N6KH2svHwSC4$}--_NA$`n+|rO z03eIpef;JXf6X$+mfk9FKU?0#3c6L1;y1Y|9ZVDU4H$Ym$pO95plMA-O>y?JNOy0l zAb5zPn+n{ILtw0VJAG`j)Xu)77lzxoTa*3oCa1UW@JmvtciVY%Z+0g2aAJ>GYS70;4BoJQU(V>KZv<(C2ljK* zU7_*~BoP*ZlFEfEx%eUi2NpS}7+HiovM4chq;leQl)#~b5QU=QL^9fyRu-I!>ZZ5fO(jtvmczvRB$xZy6Hos1oNyF(gsCzL zwk58oy1nWqVMKFh>_9hg+k{WO*^W0K0sc^f1*pdtq@Q`f zo%M$l?561JDHQzhzt_hsR^HcdJz5WX^B=AG;H()N7jzUIA85=+P}SQZs&df0<8+ry zC?uAp{!;Iv$sO--z%(?FIdz9h@cYE7@$qn)q4g%OIZxKLrNOGP3jXKz=o$;+YpS*~K>Q!N!gAXZE+?*~(QV=Q<|r)*Kd{t%1=7 z2$L!EhpQ}BWddXyfK(K#nw4uVAWcpy0lm47Xct1OQB9eLhK96|A|vl&!o%LL*62Uo zxypC*&nv&!lcJh+^JCUaK522?mG!QgJdZ0b+N_bg)=QylxFlbrEeha^cwJ!&rI|JQ zw3A^<3!t@FCf{~zdX0LRp@1-QhGuQEpcIf~8DY_p!pGSRE5|L^aP3XtW;B)5uj zF)y*>AmefecGh;zAvGrO(DDf7q?`0D7+1Qdf2xWujS(#BjKY z=R+we>x4nlp=Avp?XM7z2b3(0mm$iZ+;g&ef|T9R!+KM5xKDlPoXg_@6(&WAVkTwU zM_}&_QL1l3wUA~F{}SKgCTZGAP2ALT3Pas(++kXB^m4nIP~P|%)_&~thz1XAe0K80 zA>{{+co5{XWp!qNOEn?F)O1@Yg?_oLVk>f%!K!gQ?V!je?YjeQ9w0~b+ind^uB@I; zRecUrSG0Q7kN-mU$wY$|w@SaO{hF&3Ov9W>Ku@;xO*sPOpVxl1ER-vReElr_;zwVM zN3Fq4WtURg%AEM-{Qbj+DS_k~=N9h4@Env}uB1<51cM=p-NOAIxZ>p!VZdWEibL9mzZ%B0m%ARx&N@$X z`)ew1^CLfqp4#!o+qF0v+>Io&>Jxp|8fkf#MLOpyIKKLxft6PtX0a(?S`o_YdmNY@@GaW~3oei{4D z;@-n>ffQfk)Q%)K^Tb+jMiBLVHYD?h-U7xhjv?^q%})y_e6>VA^+S zC5Nno%#!11B3hS5;uB5@@AqIFnIpMLHHD?2mJWIbF;o7RJ+!B~k@8>a(dlPM&}#bq zD<+Rl!7MmMT0J?36?LDcp479mrGTckcrkTu8vJV%em(SSOw+&XrR$(RW5;B4tmbpG z^2P}_awkAfh!4@PRz2vjW8tQY$^e>E=N|t4&`ecSELNNDe>|j$b2N)cDZ1zH$Zt-^ zcFWIYiW{ zUJkN5QW0?XoE%zHwl^THC}Td%#!<4zAVi~HD5N1U>~UhM_f&LcDIMIJ51}Z^{-+OM zwFykME;lN{Wq;WHMZi80Vz5{i7-q)mp=@I@97D}J8l#_WMnJa>A*5vmv#B?Faw^4a zCaTc3O7+-$gb2yI-aGgf!T0}mZ;C(p1{rV{S9a52Q*o3p(TLyLatD#7RH8q|A!J<) zhS5sYOL?M<;8$6wOEH~dP-FZhlM-i(Fy6G%Pq=<7@5cRZ-c#A1?i-QZ6d2zuGuets zMu6cwhBdM%Qxo}GbbNte)`sqzZ&V%kB~zjbB?BE4&6S}5VGUzjN|3?*k`bCtK3ncr=i6ZvjCWNsD!6)|t^Z86y!sUe`<4B5i*qNX zTD2EaMB(O$i=04+FQG$UMQ}hKfh3MRmSanb80s+9*kaU&*|d5FKYLANziw1jXd_OK zSHMa>@>yX(J}94}G=)5JgP}X``XuaI-SPy<@*lrH9<}FzVoT{mglu1fviS^%7{KQU%i!Q)Ln+jDs4rs770t5YviRk^w8bA1vjJ?snbrNLG_PWwYE`R+biNL@_zdnPzRe&En$7V zxlk~kS9O|H$5_J3GRnc-pzR8_rUc?jX?4ra@Sm(ek>U5AR~L!Mn<5OR3}GX4;k>?$ zdzZE4oj1bY)>e@h^6-}a4&@M$J`Jja9He1Qr_j@ zMkc9Z`1&B@xr+QcR4>)#iZ;+Nz?1KF!bpwa3e%pYP7;?@$V&ZNIV(o#{{kT`386Fp z)6=6(aSKelAsO?H)bF&uS5hdnE=h3K<1a>$Cs4(rj2p27=Hd7t_!(m8Wl>Syj$4!V1L*2lvMl57u_W@wpvVccrYS#^Kbz#! zJjb9(nWCnKOF`Xw>T^#0sd?*Fa0#X=PC;0o+h`ugIoE%xQLMrn0S0G4c^Iu|sMGR* zo5FUYR3-W}gC<**^1NzlNW9(r+WXbJKX+$;+69}0cGY>^J5}CHe}3Cs`LO&(@b<%5 z%N6E~Opg1oa?f9d>?j(0VN`^CF1IBiw9_fx5^s3WfIk!pT~ z%&9>&4N~mcH)e4!*urepRqXT#cYR8DI=h-f0p4Y)hZUL`XMbf}-N!DD5+rt#$x7s= z<-#<1?UUwgiKaC>XP6AHzs5Tj;iYQp$IorfIgIgEG*klCkPv>W8Ax54jp*b4zL!CW z#ie&=LZO>%p!?2}fv-s@We3(Z`_etD2B6Kv$rb;YWL)^6R?f@VKC+2!YA!`86(3?U zj!*9|s7|MmOuhCUuyijcGaRypn4EBin?p9H(BkzZ94t7kM}y>}U@^9D(X=yHOi=ro z)1JVpXIY&i@|s1YT|H@TToj~rVQZ19Cd*qXn@Aa6CTmxvCFuy>XxX_w67@rfzJpM= zZz@Siv{qfZYus?6|9HLWmI6r7mKR2GUYEJ;^iL;@SHo5zNU}- z>G%7gy?N^HE(;;_-5Ws?GFR6?F~$_EASDbqxe@;8`ssH`1QHmK?c8n^^wf@NUl^ zQHM^e64r3*$yYYKtZ=j_cL!cV{dsqYY^-z1a9mp_6&0@rTk^OHHOK({VzZ^A8?Z}x zd-Q#5wnu4!?9MMhKVl`e7{3kqA$u>=QqLQH-qmZlu~Ad4`HM&iu%)tHt>HY+ArGQX zYLv<3tRhdhFxLM-+%E+tNFaejaN5*(XTJ26B_)7%2^jq6fcJl9W%LzS<-QbGU(?RA zuyi;Bs$8mKo5qhkd`2-yf?KvB-de8mw2DgF)N0hcxQv7fB_xHf7;%ax`3fZwLtxB; zpysnir5!gPz2Pe>RP7pn^vN|)TKP^XP}PX5f3vMPR@|vq$2fTR95$_kmj8u;W>p;C zIRlr+gu2)L#Ua6X|za#eAUtd@jVKoo8N<_~$yJ|$ey;XWM zZyDsa?9=+##Gvp>mZpU)SY7Khw|NdMl=2*K+%XJ9V*1kD!fttYMiibsPZpU2B4h7G ztdK+-0z8^+r8wk~h2-uAqTV_!&rn+UN+b9+Y}su_ldmFG!d@O**NZocfjTB-t4%51 zk)BB>r}*V5TwBGJyHLeQx%J|-k|ac?jfr{xk$w0aQzojZ0#9^}`|d`m3_%g9-3lsB zBniQ1>+ej5%TcA287D*pvJf@>M-n^pf(8hsG&3mG7Nc0EIElmH@8zatDI;+|RXv%v zt-_5$eN4j@K6BH@&wFZiQmm*IB@wzR0HiOPZ51SuBb=Dro(d6wIp7soRafCF8cu&{ zF~Ag^Q5;I)hl+7q2+}baq$Us zXAiQ)G@9(QtqVY%K4R8X=Ng5>)Rke^YS&25YbHORcugk!7BuALGitDX=s>?llemmG zx2M#VkK%aK&zX5N83WtCp9t)Hob)_p#xZ~+3H>pr3CVq0rT*5aw4gd}KL4Q@Q16Gk z&{)eFuMc&k`)0R&>L{!8W1qd=pyaDl@t+u}Sa;TT_F~xN0|8=N3dhS5uxT`YG@bIB z8*?o|K%UwShmrn$gur}2Q7i{Iyj@L;rp(16Fph_zf-Jk?3WJK1IvhnWRji8AOj+1H zN6yLYl=*?1J4%`~odk3Y1htsx6*IUxO3h<>^s@k)GNdn0^gsPk;FVE0ht9lEX<^cqy8Tks@2Ke#hLO>bg>&cXO_X1mb7n*W< zO-1+u==I^Q48#M4ZPg&^dR5y%Pn`2Dk)9UEK%e<7x2x`xUbkFYM1TX`5fB}TQGO^Z zKcTZ735<*P-Ug<^jOZ`8nAC*50X=G1-t$l>nZ1$po#8k_cJjb#?yxv%tIThw!5Hl# z|F3V1NLLB^cJpqf9(RtQNWbbkecXbR8}+nu*3oCpq`XZ_r&foVGS;u_hu_sI>Yb`U zMv17MkBigE88?gWu=23x{TAUB2Q%gt?%LnlhN zM{)l)enmJ{J!*RY{dp`my9Dpfm}TJt{0F<+B<(&FHYp`; z?if~YPKMhQLa0X2s));~dO8faBV$lgEX1QU^;Lv8%18A9nh+sgK8gWNz(|yr#KGt_b-rRJnI z`?6GIPhC#CpfpFS>N^3W(5;k?h=)qp|B_B(feo$$eTs5H-$++2xB0=Xkv`uEiE+1^kBc)6unGA+g1(_6C97IwJykLAQ0syImvyslYuW6N`M@ z3;ZO%Of_cjX?QCywk-N=d0)3oKGyBjYaIK;&;2O6u&FJ^JTU-U1#&*BZnRX*?fkgC zJDY{(%FFxS3h^cJT^W|wGtoy#GvPQ`K(a$F7#nx#n~2OLj1bTr@#=MHl+;0XfUg+3 zf52p>E~C7d$|#9-M|;Y8hFY_^B>QDIdbozaL;?z_3EB5)Teyw>dN+cI_@Xtrw0_P> zgnG{qUQd1(>zQd~*qtmXv8`}KSYI0ZwG^`yt>f6!B|Buzr3y;vC^OSmjRYVg?xMt3# zv~;Q6Fe5r4k}i5mJbgB8Fk)8NX31E+`&O-u64f%}+q>5y%=J$j)}pKIN6?Kd>{VL+ zTlaQ{)iL&pETzTE z6Xsfq!}+g9=-otO-9z@q#!ITTX!shu4m~kz0gTK0<0HE!JFB$3;<>#{y$>&n!Cmf( zY-59oSxZU?YNOq8Xc;g%xrT>M-+3M!vlrFi+ipfIJkSg&G!t*x!T*%owH-5pwjFu| zxWuq6fz@X6ya=Y2u-G97C?N?vp|gfDLa0`$Bbx#(x||jH1)kowYncHOpG&n1SR~3+ za+yaA0dAIhOde%TT88h78(hEFldf_K$t?ID)yrwnj+JM!;bM^ zPs*Q^P6I%!L>(s2_x@YHnnQ$T`KVa%VBIVvpMPqn`aYk=ym86jO}nxq@bmPwXP}OP zi2&Jm4jO%jWpdHiEc&uLt)h`$^=$~h3=>7@wksc2^WqA~-yz&)iy8*0ak-%;3tJJ+2XoC}JdRa=is-Q6 zJ;%|01IWj{dRceJ3N^ydI&Z^b5_PkHng*J(s>usT7*cZ9MW|&3WQk^eI+E#x%X-KF z)=tv(4$68p!*0-*vcO0%2sPPh8V&;BbH{*XYO?%%P^oo21MFat6QIYB?UK@ids2dE zNtjobm@J$aLCv-}3k7A=ydmsTxcZU!9JDq3dboNM<>;VC?hLC0p>+|>Qw{;yadBFO z2f6`iFi9{$Qt!(|@(*HujJ#hCc@mK^hwOJ>utJB_sbi%ohW+)x(u~FD=aWiCT-sJ_ zRm_&g85A@>-<7X_OzQiiS}L=^OZ{seb(wc6M|liSnm5d>dF@Q3SP{E3B1bhbdWvjT zZor%lh$0PiK}5UZlE=8m8DK3q(E|afyIY+oSsx87#OYpn(ns8~;$XBZFL3f|N=)yR zt%DcJ`6P|V_^Z$RPr-{-s6jBsrvb|efPLd&FR#zyOTZQ1F)T)Iak+zaAfPk$Nu=?F zb@sg34Lh;CZw|iqS|{P8f#3uvW36(9^^GV}j{ce&{beLAry9BL1~8V`Xjab12Pfp# zojf7OpFs1MA7Qoa=kCYbd96ykqv1wl1a|Cp(PYk2U%$&6!CA}HF=-(2sI}5#E5$fn zKy)ltx*zl4tl(=+fi*cR8|gr>q|8WsJhaJ07nr!79G{eiPtJMHP?GYR~ddPa!dXYYH1W}g7}C%-mFYATG?6PhA zJ0+F&IA^8p78A#e^~f)Hm|E(@ou;|{@LMMY$wd7UWnr4O9Mu1mhEpsdR{^=9JXYX)? z22En><3XeH2POkH_A8FXgE(yClfCeen{8dbncBws6MsXKgjsvv z$D$e97Vxvw%LJHIjY=8UXw6r5r2`?`;<#Zua+ujVv&dk;_WZz!$qy|bfxyvs;2Wy195#A zwzU|-S!InYGbcwBU79nb>1e*4jfGJnsrkmPms=?a8Q+OtJEqN}J|*T7w^|W`Locng zH}~Y;@OS+OB~ayQT*iGklyy5+H(f55)4P>)=k_QmvA*$td&nw(#r8n!O6016w-*$lniOW8$fUF*ZgTdE6$_JS{YMrD zl@tw4M+&1&Z?DiX$eY$gMLDMl)qE@(kC+&&ks8i=Cw?7TLRJj*rNf4ym)RzWtxmzuSUc>)OKWs~38Dw`dfb)$BHYVNo!qXSU$4 z`C~`6jmU=0S7BJP2^)hH^uV4QrypKBI2O+r2leFjLhQ?AWB1NG>T!VwP&+}tt-0AEv&YeXv@omfFNMon8lNP zqn`=@mR@J>B(drma-jcEWB{H!$=dmS#8^0w1A*mF)W0}5wCv13Btvp!Z)!}g`d<^G z8iZ=U6vWHgUW(bNiAF9XG82KDujKyo!}s{CVGpEGEE5ym-QfrSiA(RurB0*-xuoV1 zQ}jy30wU`yHD#i4L&7LP5|@CgbD7;s6Pg0Qs1rtaM69E8H#nTbrn1<<*UpWq>@8IU9; z+umOTEXph@Xd|SC^Kd3;Cuo^*j<=9J|H^;4<5co)k2d)Ci`*G`)zi%?L)$N~yE46E zez9HaB^r5LTk@nH72yX7Xd%Q_;FX4;rAoiBv2^h2&rXWt|iVW?rvrj z)vRfVbmTY8=(cd`5P63_A$nV!-xA1V2crB%je&k^eNC8LWG+ z=6B6WDkLpY*9WNU#utJR1KDXto-1=}{Ogb14WjnDB>#3(tU5CPWW$+ln-yq8S^I}N zOa$YeJzt! zT;hx$EgdipE6ADc;Ik?8U=%8s^tG)E+4!8P%+{y=bN^1%Tgs<_Y4-E`?)L{m;E^2(Ko|gp$~U89Vv8&)DQEq9?NjMhCI-f7By1X>ROM0XuYkW3Yw{_b zGO#55{6QfxEmWRHNKOmFz%t8gIrLp3@q8f4VkRzaw1$PXB2F4rE*inpE9#>HA9L$; zc}pdvidJP>YAP~^VSJBULzG(?&!o){Yb>+1m77*NIZ>4(ms0ib$J)X&SD+-G5>VbY zLQ@KTh)F-UD9Qx49uQl|*`P~}&?C~FQ=O(QYu9RI%T0h$-U-S0$vaq?rh8iE;nXN7 zl=6Tt0N({22K-`)=9n1H4pJG7?{N*r3j8|iwsHCQ{=E0K4QI=>>>KTHSrP+{m1(nP zNpf-$^)y|IFQ*|{G74LQO60Tvuyp}I)2!vMH`Yw9$E!s%+=}AE-|f4a3sG>4k7*gX zeCSi|7s>M^f4gzy*C}QW%>HS84bKuCoc9wfzP3*ZD09O$f^D<0zIpNdza;vee^cD< zOaSKi)@MIFmmsi1(DK{`@4NLYQJegR6WL3z)|0@SI|GZLd6PV92^?3t$XNwIU(>t(~w|GfL% ziZVmT(@y>-{0_QT-uYy?);dxo8m{_n!5 zgzsf=z58h|=OaVpyQLV_Ls^pEl!s>$VeG^h_xFN98M5sQ!`kd~%VG{THc6pnVh2)b zN=bc1c%|-U3JfX_eJNZ3tCAcVf|xnRgSR=fiL^+LNkoU)>_u`YT;AQ~8-Oid(PpT7MgD!yaEh5U(H$!sF~V! z31>&Od}Qt-NKSd59{=5bnnd?-nGx~m&+JQnADgKB8=Hhgi*Oy=mwou_p%t#oC z#CnFlqaXKwm<{R?==|ZmdGikI{tn}1I_RbI9P8y=#EWWcI$`Qm-9{m{~|~BRnR3IcuuO&;xB5s4hbY@ zVSUwkDLEk9g{EZk)Z=>KY;zT>Mc0NR5oE%?h{&1Z@8o{}N2RN-gjXnF`_Z7t_D``4 z%BKlaYA2)3dYqOerS6`rQk*WkUp@5?BEI+;+*lrUnv8Vn?+>#hEz45)GA-FgYtQc! zxx^T+%y%#Kn+I(W}Q~2z0tHxGe5AjQ;-uV^N(iLQW5}7RYxa|8) zAiVsHZ*(Xih@$lLN(4(2(32J3`%2XBW6|L;-z#>Q&q#hel>A6;`Zp7gI`ZluE{DNY)WxfV!6udhISs{TthbJV`H7a9H;)+uPWBT|NOz)!0Gw`U!7S-8(o>0d@ zW`N;`I!6BWMPU~|lA+P{izP`d`19q84J1_98h_JrG^!T@%81k zfPcLK0FW)qOQ)hb}A!fcudvOT>}DUYeB zH%%vDS?B-qDQm*S?n+y+0KZqJS5Xsa;L(TdCaynWp1*5HSxl^+9#ZtrqU5dMuZ#ht znBx67SG*$!Gvz{ruNCR8iX$}K%U+c6>(1nxKbGbJCGTc7KYRKADPeZUv2aDSrr|$$ zZ6$b+T>S z_W63A_kFMLhy4%iy{@&_y0PvkbO7G~dKe^wru1?+(~M``+qiG~{_AgnE2r5e?=r^< zZC<%ixy^CB9#J0m@W=O7!E1$=m37G-WQJlHEzLRw5hS*FOI})N zNWDeaJD-@A_)bs+884OnVvVfxLIRhyYYK1EBCo*1q-&z?HeaTqcuSkxFweb4W#sPA z{k>}Yv8v~KoW$Bl^RX%Pcb(3*?TcsSxoM64tO8wY57nXcZ%U7==gE!)k~AH#P7`-N zg0C00z(F}Qi((9XTyG(D#bFN)odE%r-LkIX`v>?-+U^^DFhSPGSv%irpYGj{pd`ch zA=fpQ#2VmnsCgf+2f)g#LuO9#ipAL)qY!J!7Qd#1?ks1dc^H88c)tH3bsSj1f9jl4 z#hWjGxTeQX7((nbd0y{g0l~XnalblFND}++fL23x>aa#H?VIhW+=OEn<(I#$BDneS zD){IhYw9qC`kBLy+1Ihl(){-6|18(mUq6SYJT>HXwZma!>C_JNCT?5x9(@Z$7@WMijS`wE zG1%e*Sk5NZ+d7x)MQpWxqUS~FvMFNsZCG?s@{cgzV`Qs2e(^7MCv!vuq-+lOMJt!b z!1~=jc7G*d#&Y`l#jmRtstvRW`D*tSp(o>@){-YL=$LY=Gy>@7-&Mhi&nMnJ?^C_$ z<2a-z;;!@Lxcl%zn@Yf>;x=b(ZDwz%xf=j8w?iqoQRQrH*ufaNC`Zfhv3M=>$mgS1 z?_oPC|JIppzo!qO~7p2)jz881#1sROUY)AKWgR~{NciIJ|KyYHyNTeON$ z3!%J&Oft{?XQQ$Cs-|ZR`-|HAk9&JFC%Tp+c+$Td-|Zr#ruAMdNSol8ITr%VCpU-J ztC&Zkk>7)2dSl)ZncnCwcQ#)hKV+@AZgRSMHL8~92%q_s2az!IQ9{r}*^)7;)5vhi zLrf!s(`!!rM@gTYycaxsg+Ua;$wd&Eoge8%4AvNKGEC4>10hLq{$qaiM=o^Zk5vK8 zq83Qf2Pe9K@43pD$92UT{1pyKmiUyyBR&ts8579OQ;<9gTGM~IB}g+SBE(l*uCB&# z1M-+@m7s9ZwJ>OKD+!0yeoF{qx#~7Zz8ateU7W#fjjZ^!OgO{oI zoX0xj(>UoY%+=R4kQO%I}F>i*LZ;@564G!yvFdX6je zk?;1IuNd1sWK9b-@)6{*W*#GQzN;q~jp(xV>0ZVK#d#rbK*5Jaua@)b*mF5MN45vd zG!-UFX%%|d^lJq}D%hCWa02-eR>BFbD&4PPDm+8Irq!FwquT2ioEB2tN*n92c9(fC z&3N^kz{K6X$RFK)2tHa*8GeWBeD9iWnwz?}E2r57=HiVb6SNn?vV`-Pnx-c$Vn?wo zipt*}#G7vgB+!l(!{XP|D6}uSRVT=0D>&+<2z~TwFVvk&jgxrQe8}8><$`!{dKmv0 zafVH~2{d<%wsE1mWOFAU9+ zr~84e#9GjfY-PeZy{QpkCpz(ZE1wCo(D%)XTI>ceERi-jx&kW5r zDF5G533Nn^BpSFNl)sfGjsCfX7TJY)#2fv7xzRTBNMg$PXI6}Y2G(-L6y6=~C^}$$ zcj5WmM%s?+VFu$psV@goR2pZWvuKcWFFhKwl>Fr!+TQyPN#J=~ec89+%G;OA zd{WPWWh2inidAJ|^2=G}WV??w?<&h&AG6JpEs+Afje?#R#ez$wml6*oc2hr0agOd_ z$378K05EwIPQ*4Ni+n)D~WGV8bL@T;9StioSB@{$FNuz$U8@z7h2 zE?CueH>9g?a*02vFMXMBq96G{>+P2Y#@RMpM}ee>cxUm(<5x>4r^3p~8D+0ksAT9@ z)%B!pAeeyHj)h~0X^l4lSnVdakwt=OBwl=}}j89)k@M`4>8*B-Fisiub!1Dw~f1yYS&o!pR zq)G~2kYU6v<=2BBhEHN#5n-LsYL6x3v7^AbcmM|PM(B0@^s#=jlsnYGhq|Yh>&?-& zxTYK>OL!MCy)P|u`$r$n->2Zs`m&)u@5SLggWC3Kq%J3WFhiKVhxo{e!WYg&oR7H+ zj?39}LsoP`3nPz0@;h7h3ztvfhUih|i<`o4)1Xi50Dib4Dt*pPIkhCSm)MbcM<0RS z%=-Kos!WUpT7}tAWu8d0+kc`*oC!#8wQ%{d_TgOZ(mfvauC!^Wd z<(`ZE4ngj_16!Z;o^5ehy$(19BZN&_?>W)MA@`}w);lH z>>QJSnLK!hzkgov>iHgvehdJK_wQpmhwb0oz({8cJ}37asU(s(r++0(soORFMwPhj zIb)rf5aq9@e=S;|-9(=!<1a1SE4USbz|!Saf@cy+Cm<<4as(>PzFU@?VOyGQ%gr41 z16LfA*k7bl8&u8${j+EKW?9r!B&zCZe)GETw7^f))h02UxF`!7w5r*aT-fv6xZ%Pi7tpd{U#q?L|6ck z6n>bMNcdX?oZeuEhpA+F=A8ZlK`h#i6{U7)t;Z2DqR%E~)qvrQ0N{c6SL)_ks$pCP zU1FR$dsG@_=Kn^39C3{?HL<>mT zWbK6gW6AmP1iS>FT;ziFtTLj*nTS*aylVdPr#W=g;2%0B$S>@swr0yijPRXLZj+r7 zsr;qCXgKc@mQwaqNA}lQWO(UdTo!^OG)#E_@LF;)oi4?`77Ymm;)_C-w8)3Rg;iB7 z>jorcX+LX@C_FtOcl1#Se!yqC>I}`U(aO(G=O$}|H40BzX(aDdl8TvG!Y@f^l141x z^xZH#tK7nT=RuAvXDdkF*p<@_3Z*TBK(D(;l2>5@TV3GF*+@Xs%HkrHU=~eui7Kp7Ra}C9w%DNu1sGi;2X#tRS>Eq z50J7LL*P6V{~3VuZ&c~vt+BP-QJgZ`qm>A-OEGYm2*ng>Jo+#aj)S=E3y%y_RK;Q6 z)hda^QMBP0`X=oo4Pmc%j)HsbEGHFOj5mNz>#j#iL+ewCt3@YV8Twb5-lh#bP%>@u z^+a*45kC~*&svA;>cnwbGgUYP-`xQrZ*YVH0;&3Tw zXs3bSyvcmwtTIrdERpoM*a0fQOS1-***(J(8Dl@~T#z&0Ud<7?CB|15q#ny~%X#Q& z0|2Riv^-+w*<`zEN~UCYaRf$<93Yz8>|pMKjQ>Z_kR;EMKL@c~%!omA(-|v^KN`3? z2U;l!m%5dThxMd#JuA_@1_eTQHxei8r1DuWG`%N&yEVp9s&8pYbum&o&xq0`$5@4h ziC))A+Gi44R464GILq$M0We4sZmiwbw+|t<^&QB^)Cp^_DI~ifUv$m<+tnwT{*d5~ z^0!yzCCu?(|DU8_FAIWQenZL<&ZzCa;17)A|NJ1{@&;I*+Kz?qxUn35+_U6(lzZ@% znJ(`h)IuR~1+0K%oib>i<|R9VVn=HYPi?H-7r$yyb&$L9O5spWi+KjTHv4{WTCl6>XPBhKkU*h`@OB zey;o(jn?T{`n%G@2Oh_+uAXuCnojK3++^3=+k?x4*&0%le{9RQT{FK8pE?QbEpx2! zHs@3f0u9iQYgAy-SwLoF__i7@l;_?%T_y5~3ova|X!C_L-aToAb(6+A zqPduXS)pnqc)$XKw60Mn>~^wtaTZ_yXri>((BOk~_o6ykvGIoPZr(*it@CCMsOsf& zpr6BKjyDIt$N?0>b1BJZVLp;%g!!Vsliwxg!AW91{z@W!L28G#t_Zb+J`Z%vW{4*s zANWBYSh5rE&mFB4)fY*Qv^S4~=$1{FMjEall|Tyx$l&qOI0fuDna2*Zid&hC4CFdx z^616`8K~l$Q_s??_Vof-UPMjt)LeE_j$Y8V9CBtGc6?oz@_abOj zFAKC_pGDuz{f7)l}dn|4H_(oDdgDtz~?h#IM0R zG-c^rE&sCGKIa6WHvWuQ6;eBg8ulMs+8XfIBK3%4?Ly)8y8rVC|0L6 zPLu%*293h*RprmR+{JT%=n-pPyAIK--|6A`z#j6-QUmquf61rmlJQpQ4WW(VCC*(tOR>O4pp6;iE zvYIfMZ$BEIUu)K_5gjTGlWiRr02L_7O&e=0GLNwUaq zkBavV3>`#5^|#T-N_{N~%LsgMo;CoVeDvDzs5hvLs7Pu%6S-vz0YeY$n%ru6*!p);6iGQdBtZWr_zIADK3>cx3;4N78qPQa8`CBaJPYh5;!@V&(A(Lv`j3oJ@<( z5`TGb-HD^wSO||f0F-pHTIH!MuGvML7ml}HSVM+1*WO-rQ+Ug$4T@)6F65$qr?V+M z%%D!hf4Tx+qX}L&>+d^F_#(M2xGAs#i<@+krPWfbC+sp6J8Q13$>CP0 zUM~kW#4yf>zMApBtER^qKc;AU6L(veVmmZ=}%h@Ho=&un^ za8}QYOIrMC3fL@+^&BJA7m9D{qDabR^!{0{$kEWOD;3G1;Np_c_C1VwE{sdi<;#!% z9ZI5TCJOcJdSm$+RbQ?Sfqu8t3eP2HSF$hN$M22?jx)#;FnyIO>hCasBQLdC06Tv} zhN*R(>5EG%f7_Ftr4a9WPKwZF(F74FFU6g3)?ar0L1-7H4NsgRw5(635$Bq)1Rh@CkGqL^PAiN`W%G+XCP3rwvZ} z$XxzdW8-V@7vGtO#+sAAl7Q}^t3TO0j7!4!k2LQ1*vMjqs_ytm1V7ZExnlZaXs0ou z`W{iJJeb!M$x&hE6qN~ICpeZItV>v+zG6-X7KKX;G?HoMpJ3yGxhx%lHo{2b;amqc zHF3kgsvWbL{l5$btSc^uj}Oyir?T5RKXYQhbFIyj@H$h`8<~{?Jx@Q<4hV~AzEsueKt-I%A3fdOL&KsPMxGKI6_mwwER7_7irgo|ZtqF!gQ<8sf|`%XzG~(Pk?~Fzo2!)2GkWfkCKXr zwOCoRv%RPln=lb%j-i5E#Gg7{W_L~=R{t0wh*fsx76eM>)Vb6mVSj#PYl3Egp;>RB zuuAvJ)R`Okk|1Vof?7MnwDgbfbFLE9a>Ri!D!y>g@1}O8uuNYQe(cf+ zWbXb4r1-Vth`1%&?KAf{`Us?TAm-u^ws>>*Nw!&)wb_&%fKbMB8ov8?C>h+X@9UD5 z?GvZ2en?wIoh>ip9Ux%kH*QZr5%Z{tv-j7R4LO-nDLv-nbWCyfwrV4s zkk8X_n7YGrTv0J^LlJv^Wmld%t=g9)N#Af2RlED%c(}2vQ&l1z?ff{Rjn^_dCX5?S zAOWRx@kRuphB@-MT)A@=PNuTs9)tMb#Qdtk#_l7YH}pukc))`Tk^QrpGhHHCpeyX>?iL=H2G#K&GzI^J;v#ecIXf z(Ms5w&%xP|6Bq6%P8?Z(V^{A_-p*3CH@z81zY`Yb+l5btsqlD{v^p3^Q1t6P4%L)P!ZbsFTh|#@>Jqq>}N+Gs+dfwhk6VHVB=g0kxSw1ZJ)>RYylhMaKl56A=Fl zH{gx^(iEo#hiE+Q5ot|#^0oew`l-ZLIr1Tv6I&L_i4yIUj&Uxz(>0aOvM>z2_|o`q zMH(NMnX0Lo9e=thF~3gZPME6=tr%L&PIl{1|G_unc2*&}!f1zv!Ada2~2jaoTE-HD3Xa7OW$X8GIzj*K(8q%W$D!uGn_yh$`pvA?bo14|QW zq^Hj8{(q0*hB2E3Q*j=htIaS9ZhoaFMvwX886$Pis9dKkgPA}3BAdO=kLbRg(=*Vi zsYkC~a6Fwnng!UZ-MDyp_SSDp$-*`ccqQIM+l zJtXx_z9pnQt$8tB*?{HFluG)C*s$fVw?6nMUNA4Vxy@LW3dQzmTV0k)w)+>FOmSeW zD(_0olNRfn>M)E;UN7KiN9>yO-E%SWM}2lBKehg_2<5cS{?=wCya3v9nH7ey1eS12 zsKbj{H}}WtS8qMPD;~j@d_j2i?MXGOu#Ywl9&&crMh|_46I*1E>O*!)&buOLe-K_z zL_66(`j>d#OEg=nC{5b=L-;kpOS)zf<}$1M0J|Znd%kk^>nRLAo@(a-Yq6l=bXf&N zrKT^7YO0(;HKF;=cIi@yDl^<<$HFC6#1|ZyzKF@6QfCNkIrIf6`A|=ETS2>`dD)jZ zHaW;p29EaYKk=5VFU26OE|417{fp{0tDu*%KDE2FE!$}hU;HTJS~)Q38$IAvqHgK5 zBzOu;2O2KrovUvJvW1E;i&I$^ik_`6fw@XjrWSxHtM%d?(P?@UKBXrt1I|VfX;BSJ z`D#L4sk`){^kFiS&-M1F_Voc_$$9!B>(`51%qld`HEwgF3-r%bsONtG541g*o&xJ< zCCiE>R?&`(gQCe>Z)`u_r;oVB8h(II7tubXJK|fP9kh2@lc<>*>W(nKy>f(6E*MZJuq3O+-Nz+*o zCFCSVGUkh0-uA3JieLGBcm4?W$%C&(J5E0kyv4xYGC=rby7uv8)fAj%g&CofoU&_! zSIP?q(#feux-#rg(lYCQEAm11!!f(|&$&bGU30CZ;SWnV^Dl$>$Bg153|1R)VOVaZ zrKUBnKl6AqzDOukYI!1|bn{U%&dNi&prCW0_uhBnZ6uGVOk0nGQuC#bn``FV@fD?X z7+UhYmZF(d5_PH5mw+?-oQ2;h$^ihf)Rg2<0luoS$X5YQeG!SOxrI?^4BQa5<7w|+ zhsou2rZYQx_iZk3Ms?S)wd3Vw%oRl@Z1gO}r&OG6Ws3iB8tUfbDzU^^I6Vq1 zOl3miX^SuyQ4?%at<6Q+ujFJ};V2#9;aqYT%pCNv+VtH*4NdA-6)S$Xt}0mVdp6r5 z3yNj4O70p`xWq{^JGRMbT26X2@7VZY9SU_DtygQf@tf<)%c1|ZuBgM$Pdf58GN7qq z*`=Nawk4YRp$o0h!~fLLb~Pf^=N>3_`_HoN+iNroV60c}dYY8&xg@P|g91>6UL2Uh zoHm(!iGkSqt;tn+yPMbW%vkRHX()b+MY@3@v6EsUE>13f6ubg`%)J3GKW;Z!5oS`L zNoVa-cAvDn&Q1>|!LP_2#QvLa?cJUqIzXMS9q;WFZ#chGzc+{up3dxBZ9lO3mn)AR z{g*LtviY4Wvq;?~0Ow~Mvj z@+nIrYRJ%fxpE06`Bz!@Blipe!7>L+0f88$nu~9EE1(s6$kD`fjGw>nNRClDexd2; zaoVNuW^8KR_G}7y7T4t`7}%qa!^1|oU|uc!$a~2v5hG)uKFBddpNmA-h7e9ghDCvL zv^J2>X`}+S*(*@Uq=8Zwq-wm?{0+f1igZsU8rM(S5arBRBJhf&HseS3W}wrIECwZG z{HrO_3HBCdDcj>q?k>terFf$q!$HFG6@Y>1RDdE(Q=4&YT&9{BAvKSJiFh305r9W5 z1v3n7cbLm@MIJDWhC`k)qtyGmzp&4ttk*)WboyRoT!KAZnY^reK0l^5xT|`S?xo6j z{r=8Fbg}ZNO=i(W5h^d?VtMM|7Ycuj2$+i>DikSdGKWdy*#L2un`3OmJCpB!OC(D| z=5a(a$IqLMAI3jM3M9A5AC2p+gJ=8&6BM~A%g|foL1+is4gmxHF>*TpND1l#qzv#7 zH)R8NmWuXcyhociS{S+yk$rC8o~t__C&yPaW0{v#wNo!c3Hcx6Z}%a_shgPz4w?jQ^Ir=iYk$tzRy?A`hss%wb9S7hv#p2 zT^|N-$;KSf-&>{M9?F?uwjhtIl_0pRX)fnxj=SV_Ik{2(9U@^d{955`&;ODiWufMI zu329sc!^sDTjy3n4igGUY@8_V7scPwlwV|??YNk&`-XE44dDBb(~{S5E0)NNDiRIW zYukd1YAwE~9Cdo*I7}D1f7qQyyNRu<><+-uZ9D{p{`PaL!@e8mJbqUKt6mM8*5yxk107P0gA~59N-h`xFng6LUS!iP%E;+ zz9(wP!-ZBZ)Zz-k`j5x=Wuqc}KRn(T}`BdiV9N#vpw%Ak^pP0ic}_A3PhJCTgV`|Z;n8iDs6awzUk{V1r=k+=}V`(gL& ziSadK=jn0wRB>!e3Ghzczqfw~$(uZIN-1`kTg#1?uw!&V1VL>4`Ne-S zry7$T2M{O=)95~xR00jMG0%3x9}FN8boph{n;2UcN2Tb!rn$i6IFs)_9Bs0B9Y1bf zK$}|=%Y=+CPHOA8=H+Y?>eg!IY%g6@Zv47>14#OhTBFZDVNzF|q3kTqPJU^5(A||p zWA;b%Tf}`Z5S??vkC*WJXGC%ItXm|q_#5Z~gdPDQY9dZ}3!~GGpf#Eu6)Wc4wg7g8 zS(q8DS)@G%4%-sTh(bE6uDk;z4t-;fMLoy`+tPLaeTIA;mXXjnIM7pNm!=Dw< zVl)cLsl)n&$xFoSFmRND(OpoN`#WSfnbQB)oc7NlGF7J1wBxViw0s{$$mR%Zowkp9 z8_d!7B;QdnJD<1s58W@ZvWXv+hLQPYw6y;ijoUljAY{z++95FyzS77!8vSR(B?IQ0 z8pb0`TN)WY@eU-0dLI>y_ItLTy*khH>DzVTHm5PGV$U>K455-N&x*MVGuAFg8H?JJ!!)pN&P;yV+YD!v_cB;Y>trcZ9Rz_vG@qi*+%KS#V7HkCE^r z9cD3OFDF{Xp+JQEfj5kNY3+%V@LDmgX(%aIKGD&xX|Xlfc=qu`C}rNl=bOZt{(!4L z(mwD2W%$+%(OG^M7~)by6%H7z)+sm=_nj5DUNox#6Y@tzzTb|ugW+u7LQX5=_-70M zjqpssZhr`ZH3ihcs%k%!Cqow72u0D=Sldt;$rBntM9zuuMvy0v%W4G-1++t{!?e#5ISS&A=3XKt<%RAJjdz+ z)L?vs?gJcMh;LD~J*OlGlzJNsEOVB=4%cF|tw>nI)5ft@;q}zH=StLs@FHgd!$L44 zaI+#aFR2Bt{1=yoqsz2ik7dbY-0>tW$*D-)!V9IzB7m#;{H37#? z*Z{@ET9)xL!gTAJHJ2#uUY|wQZ(+5++B#c;IU+-co5E_#w`Gsk9iv`p1PK2Ji7`q$ z$=I+rdik|iEBp!?C^pi+;*N-JX4}lJw(a}PM>N1FV8?GqE6_qC%xW)7qHlgq5L|J( zeD7p)VH@X&%B8NSP_4N_F;+A&wBQbB?I>BN%m?ZD_ne zD)}yqd&KwVaO+@EuLZ}jWP;)Qc%j>*4jF_jfm^ydVv!UbT_3U9(d7}wwb?RxQkrGk zN$Do6wr}GTTBr>%XjQ0PJ=K;+jIM>$j5O&k=o0?S@N z3vOy?)zBLoeMIAS?`oV#Q_a4lEnDjak3JsfdR=hu5y(IiWXu*n-Tkk{U>AS;&O=I; z=uK{uXC3Ah;YvH8;7`#Ht!j{*Q=(Z%DbJ(ht=}0BKUw3OD}U?8x2N*)Dlu)tz=j6= z2$srk>+c*oRBF4PAHI((Lv7mAUh+(Y%eOxx+LeSG>?0Z+3siloB2#h3k_t5a_6dqq zA-X!e8Hi(_6><4P=tc=rBwL@OHexM6#IpQM6JJFch>c zs}Ej~eh1N9ujxE^n!F7Wv@@)I+(MTMGWmJ)8M(CcpNS3u)VqPt1j^1=JyB)f#UNP5 zLSbg$&7e{9>qN=fowEiPPTl{I3(?E;Hx|~b=06pji(@lazfL07Z`f5phO#Vi@NTlK zL^CX6EGsw*(Q93|&H=`TAxXQVQYRM0e-=M`QjQUYjvhxJ&hO8!y)cIh{64*}ycWK8 zr3FDs7#!_XDod@qVUdD?zWFA&cF9TzdC( z&~m2XfQXmUt$UKT0iP;c`!*gQ=bd;tU)LkDGVTGN^e21GUh6?t{=5d;YLce+$2ebM zeWoew@~-JR6m4|&T0~SFZF$_qubl(NuFYt}Lq711dCd%_z4zP3+j}(+Saq$dP1>CB zuuZsM)wR3gKz`{NwZ!uLmOfaoR<_l+eSM3Oo!4S4udY?)UuP4&j@M3$-8$9+I;8te1&niG2x%mC! z8b4gQq@rcqf&X___5lc74UXAtcyZwaYhG@t9mmP_B-LSd(6(IdJftUO+@8Ttu(Z|f zvR$l+TGQFx6BbZA9938gC5BRe?NM*GITa%8Ql_PV$7JCUH+;i zA1Yu^_|_j7Iatq_ShI7c1ax_0nCr~#X|wtje)nZE>{&Ocp= zuaIEe?%T(A!!9rrIE{MmpYY-lo-64rpA=}e-Q44TK;7g0yB8qUHEn{Yt~l9>KQeI! zF~`s0J?Jg^{Bmn_B;}f4SLI@*fJ*rj9_^axN=CjSv>5q|AOGz>Q95TWyRzSo9L{XQ zwH*P7j{HFGP&+{qogA6b?$WRm7`E;7;FB6e8Xg!F_VZ`Kb2f)U)L6H={)jLn6kfRU zm4q3W`x3h)LjAQr;i$0(O_0Ar+z+GP4oSF5QZjNl`_`o_ORp$7*28rMftLj0eg14P zo%;uyU^Z{_Wb2B~Z}5kY>tj=e8g|CLIp1RD_r~4v7{AEu_dN>x4(DuNjed>mT7^H> zzw*%ss=W`Z#Z)!#Tkp-Wn72Q}QmIZaGA7***h(-3KI)n3*T1cGzE?>kOQDGIrupY^ zMDzeil@UGASCyh@c{2{+5}I1oYpkbA&IGucS`%t6eDK{X|)HEMK#S!ig`toh#!8+4QH0 zCyK4{UU*4EqW$97R=bZONYTuIC;C9{*I9MFDdUMnQ&i=Yaf3Sw)4;)rem?F`rWKPe z!smV(-{=2T1v}1PXcuzYd-~}R1l56xqGFQoTc|dU7hYXI#b6`XmC3EykNLfO4R)jF zPwAiVf;%|-l?nOd!|P*<*z4#KH2NC9`6&K$2_DJLP*%1ItA1LsPX|}^hmV6`^uSa6 zoJ_ito7u(Mug^3jV!B`Ntc|e^CM|xdd|%YaP2+!`K^vUXH|@@Tbh}*tJT56v^CH(} z_2}|8QO=Zocztm1qa?M)gJ5P(z3UwmALfzy$4tN0BEpReSSb^%Hk3ou#A-V!W*!EJ zn;mCPM(v>=bHb)EfQaRcYVc{PZlKrG8d;{+D^b&;iqIJR2*k_OnW-4F>9%MJ>bLu2 zmF4rKf<`#4YC?bzkKPX)6!(2IR)|FIeoN@Md7)eLI(He=-8b^-)%2T)@q0_isAg{knX)t$XPkaF3_= z@{75(5HARymxQ|kEfPa+`n?NxmNB_7sjM9)N4y5fJ)rI9SN@!8%2N!;C^D3WU$i)8 zfBXLKQ@W41jF8@ z`p!0l&ivz?Mzg!N*K+gXX7K9xHrsJe>Hx$->4!FE z*H8uVG*bOMX`k_pq}v^c3|`M346onF9N!f5dHnY1_PF#cl=SQ5LC+ZA@>St8)N@3lGa0W|Ih@XeC9S|6;UW_(T#qfa3O3Nm5n5DuCc9SM(ltY+D%d!7x zME1$}2mXMs>E0rUpP_g+QMx=P<0Wjuoiyn#b=H4Yq3II#pp~af9FVe25w#KBuE2A# z<8X%sKRbVzTrMrpeY|Wwow5i=@%w^qnXane+w>=IFTJ@=BeW9*zUzYSgI*(zB;;&H zJ_2^aQ))5Rjc!Jk5L0ZL)$eqzVRV}Ra@jQ^3l+h~6RP*)r?S^BS5b%K1o!GifUQ@# zDsSA_&X%kSe9CcG+j3cduj|&8u3iy2gXU12eqY2U4$&4=oD=ZRQOl=f1i^L%8Kp>q zTMd@!Wm3lJHD-BSIN&0Izs=GeH>-zRpWpAzoprGd6#5HvRFPi-$pNK0jn=^=5u*WUny5@w?|mR(`o0blKs9SBLc# z+1B(CRz)uF7u`?##LU4l;pgJ8Stl3Fo`z#y2+6f))RBMTX{4PsrbJ{9_!!|gFE>Fc zb4;CVY(Aey8dsn%lR~!t?Z3uWkgSY% zmF@NOW!!~mMc9GuV1Ym`?zM4uM`Z&E&BB+MU9lG}j6ewj?Iikg6fWd*1 zC!6jLImx=r)W~T)Gh(^|vp+Y`R(wSFUW+X_Ca(8}LYsE~4Bh>(2!_e>`e5@|M7WGL zX~gKbfY>@AV@d2YYbi)%u!KG>M(e)<)C(`f9hsgb%7v*-M^gf|Yh^hPw~=u{F^~(* zbIcHf(zZQ}$SqN+(JCx5ZgDsZghi`G*tRweGHv`+WwL!kKv2f(DD2?A^~@`@&^k7x z>?N1%YIFH}8A-x~mM^0_n1R`fSlX4F_iJt$|iDBW~NG=)nd8PO>ja+Ta|Cp3P z$5P1yI3Sv-{l^&TP9i_BnpQ`1x#N$8HF|xn@yEk2XmP{(6NisM`x6r#sF$zyAKdz{ z*%!(^#7_vDto9MawfX4%ck12u+9g)r=Uf+Q{g7qa5lkP+)myM#Tdyr2Q=zM? z+HUC>KpFSA>(PDn%bs^&npzWh7H=TTnH z&ykf&_gJY+C2wM4;(fMsy$Qb82fO(A^nWaO={7U(pEDz~ywuZau!)ezJFg+kck+*Z zCnwD2TQIt2TsPEJUGC&ms|txLwEloPma$m;xNj?Sm&Q5CVVC;y8PvV%6+hBv4syKf z_8bXUPIE|+aIJ+=qkvAeu1IOvb%J6@BR8~T=(0hEY7Ce7#yM^R(@WM{u$>!0&yi{> ziKQy~mGD?B_!VfaU?_O;Jg@&O8hReODEI<;Y7@MtdcHa(-Z?Py2tKnXCe>^K8%VGB z%)T2F33!b?v@Q2&JTdWXiL|$U8ZEiGW(;@`mLSyXzm3>FBRUV3K%9l7YiSCyS*7Di zASW65_i_@Y?p8Uv=&G-bx~6A4fhQMF37)h&v-~`>fv+3udritH?rVuIN=n{-v#*+S zxK%L9y8il=s4tZaY}{pYPZ_Bg}Q*P!cO^f0)P&(r*%#9!g^)Oqp5gz zT>a?lsq$2D8A$ky2@*>FOXsyuS8ynFnusT01r2v20!Hz*NsaX2-uLlR@A7o=?T9LQ z*J`ttb5_s3UosU+{+`SCE`eOyW+YiXyYs95*xR}NlcwFreCXncv`%|n5`^+Dao5Xj zWcTaq9E(O0c^ZRu1zst4_f?-Dd8^n+$XCt02b)Z-)Y;7JQ9qzWEJwUo;!9o)Z=wNd zNoqjB$m23H;40yb+bS-hrQIhX=5xS!`{;g$m!v!tHyTrs}Bm zm%Obg)t)L~W+fv-M10rIt&Ls)$Wt>F{~(aLRg5J5xh5n<&R&!6@YRAu?7?n%PbX_w;HA0Z}pf{OR+JFn;+H%Yvv((Ctmi6B*_4~&u8(Y}Er`gIr zdnca$V4CQ$Z_R7n|Bt3~Y_BU^yLN0fb{e~}+1R#iHnx){jcwarvF%1HW@8&Gc=PQ2 z?oaavTyxH2jB$_qyxQYfZV&k!`%;|mR1S^ee$rh+ry1#+rV=lm5QzP-U!vYI{{*0Zu zwaKg@bJiu@S*6w};Iryp#rCsdD5qkfi8rjsByoEZC-* zbP?7j3>YP1g{n2!)t$}KF*3}7IR8AXtK7i@(;j=8kHGs}zB{HaWixznm+Y<{9$v5b zwn5qNg7&kfVB50CkH;?A+ao;TyOS*oXiog)zaSUvow(u)$JmU0xk;~RQ0M&&?$hwz z;Z2}fX!b+nBogJw#Ic>!6OX`nhRa{t2(vO~GX~zHYbIy0{zN1Lhr?!_d+I*=e3AMM zhJ8q0jwPQT9X~lgjsorgt5=R$u=yO*iBDr2)fx9AansV@=k3C~%G_{&7qTIm%KuCk zy}A?ty1%Z%W3fOLm=GPD3hw^{@I>*^NY;c>N_2Rg9mePG3q#Dd6VY9i{trj zT6fbR^x`adTP8TPKS)k|u@zo*jJz4AAWpN!5CA1cFGc^e5HZ9Z3e2)}+5)CF#PzAe zWFV7B-NrxVkPQ)dRm5kSLXzg0y=@pnURL_(7qE=ieuUf4J+kz^b&(O<@kVl+f0az3@a#+TL7u`M=SI1 z_L(&>T0veUFyBy@$-w0#C?+~`+X{wnoVB|PKaXrsL*Z$3H4nB%xN4Q(VoqgQDbjfE z@eCCnwLa~_E1U^174m%Q3N=BMe0l2y5enUM1>~TPpUEu*fi#~gKq$A-Vgo6M^nhdd z&QwGr8~=dd8EL*@dTF|488~8=aDif^>WcXB!VP`Q%&O2ZXHt&v@{so2qq99~V5=eE zah)#-Sk(x|`+Z9YDBAPww3X+dT^rI}3w-^taQ{3T|E39l$v>`)e}SuGBL*n8I583Y z#F6wl+N>%oZ996a*!|Ll7ocE$q?$sdiQiIW)-alO=(+L$3iz+0*J|TWw9}?B- zZEE%n36(_fpKi~A?(<3Bhjq_MR*$v8(e7Y`@70q()8`J!8zflIS!d6mytnbZeKJ45cFIHJwCqyGFvu-xnC3#~^^d|J$BW)hmso!}|L9Oj zWV3Ak?jhSj`spuFKVw*Oa7q+{QEXehz>OUns{)44_H@Z~DJv%$R)IU9{!R(%iPWXA057+QW?e^{lFc+f@5Hqi=xrm^chaGuQ6lEJKhbX`=GnJp-ZhF|990KT^CsD93 zf**_AZ?8eKA8Wmbz0a|Zhf6{qtXF!y!)&=KE~JKd5rg1U?c)TcgJaW6;U>xp0E$7} z3Iy@!3)1~dIk!U3MOPFwt#V?@hbSzn^-)Kg#XdKq%DeCJi^^{3EY7F-wz^rf|19tj zJD}0g!Y3VAc*-MHvTY)5pdF57xDi^sqc`;t^KC7ef!&(+5Z|M`k9 zwS}j!KD8&HH$pnQV^Sf&)YuEDnG zV}b{St~XiEJ|8-MSooio`JbMHgl@@&2I4-SppqwdOvsrE@$6)a{0Yj z>+UwU-#2{^+46Q5@;=z}KJLq2rYr>q4L>FWUg)>dTz0pcj8m3;j#_V0>OHQOXBupe zJ_Pyx2r=qEnWwjZ_#J_r`WS!z9Qk|}eVZnExq^Hq>?S~pmt835xX`u-rQ3zml_a<4^VjxAwM}8c@}8}NU#?ZZ-V^d)c`i?WwNZ@y-%W4H z-_qY!HXqg=f#;)B&DDcm8aT`|QR3DGlRS4Cp%1+eZYRA!P+O0}Cb<*#?9-J_0`74+Ee{az*a@hpgw*{FZGebKuwPJp7M5ZgaL@axAx9JpA{l{ewwf z3rO~u-b;F+`nKOY1JZy7J~6$YPoIL@cLLjkmO>zH!S@rzJNn*R`mY9%FCv%_s7YuN z;C}|V&FX#0@*U*z9rW2s<8b0F%hQbrd@zeY2Q%~kDuf~AY5ldY6+X!d-K=JQ%smvu#At5L7`{Vtu=}mdO!1OE zI*HU!xN@pRk$(Z0nON{K+Uv9BNQsJIs>D=r}fNK{cPyLO5 zsb)z_c()UnTZHLP^P#dr=Sc0XVnJZu-%7(mUjt=AONLdB4}MeN#pzoG0E!E+^3^bx z%4dQ>=jJCCY_@c0-~Wn2uFn1)aNt|g2n1Y!zOEpv)`x0}OOU<@k5m|@KW}n<1a5y! z2TVo?zH<1UEBZ2OZa;$su3P#{J?R-bJ`e13wYMYW$w8J$VDZA-H*< z9Q5rv^;OSEqc7Fe00Q@W(zJh3{IW`ZIy>r34(7(JDn=j2v7OShF}CsUs_=f>Oidx? zy)-DlXi}cm%sgc`ppK*o(>~w#$Coao7?+zy>iAkff_P_T@wN4ebG60kiaRzsLTfny zLJga}rUZWKHc}AK;uifnFIay80oE(CekAniwdJ{w{PC9ed3V=%;Xax7-V~5(_;Fx( z=+krL^GyBuFYkKq57W#J>W<>)iO}>Prk*jT&s(NE=)ee3q_%DW|2JGu4~?t)rxUxk z4PHa*#G#YNnTuH-s#~w{a-#B_R*&^M7vuefCxs{TZhxssvSv65^#Yp`Df<*8k-U^K z3R(V@?kS6oIKg(4Pc%*t^3y}69=dcGxHuNfv=U~6Cz?!Tm*ltzSx{d;Sp{iHi@p?M zB(Oypff}rGHMd%Oh=UENf||N-zdNjxr7<&3k3FlNUt2{nsb_;6>~nT7su$kY_gipi8M;B7jb8J73;$S}95)86= zGiHw{NNbJxSo=dR{_y+TbiF&0{POI)zC{FX^akYlx=q&-t`H&o8|s%>#Iipx=rCEL zrJeC?y05b%1n;A~8M>0Q z`hM@dc)fP^?zD`V6-L}(4SR&ZH`qv$gQejiVVeXI)ZlJkplYiIUQzP$rf!knX^{%L z$u&rl?QCB761j#Y7cpF0U^^{913sOPwXgdqe7$#kcf2GY*AZ8~kAq*&x0i*-L7}%n z-`k|TuBI+FJ0}3^$m^50h2I29Zg`GK$=&GFfk?tEB6!ZnyFH*sPJ1Efm@M9tEdNWXH>bjmaImou#!nb2oufCzRqYEFN zOpGIVTy))X_+}bnOoy1>LUqN>6>O!w5&N5d^PkPnAE#NdrWB$7N`(;fT|Rs_+kNTd zG4si~?x!-61Uuekz@j^iCc9n2TYV##cBhNb8e!WS@OGS`z7QiwYGeW>Ql=(E8zD`I z$8Kp)keTv|$9O){Y}A#y+1Y`|Y&|o$`oemPHORuD9y1DqtYII0b$2(TEN*bCtob0G zJjI?QxU9T|yEeVD;i5aeZGC`&6%+Z+@}qQl(Qc88%O`Z{du~~P)1+?i4W;1gP26n@ zNdS@SKV)p4e%1#CLR+;oht}BE$Z^PQ zm@CRv-Rat_OL~-6)OLLYPwR&Cc4Evdt4?GWS)>uNi*$#_;Cf~By*HqlDs{m?_X2B{;4)D=a(@B*BwIFW}Ixmqv(?=a(8-N3N;7M4$;VaVG&cjj8R!GvWi!O8Th z`}H$%OKrog-0G@dd6~0dt0H6#Zp9RKU8G{755OAEkZe6ubA#c>RkQ4dT8^QC_ZreY zyJ5bf?;)Dc^NvD?(^b^I3jyzWjokrpT)A&3FaGsgN__%gb?~imcLp+5;2Y@dBlvg? z!;s%&_i+Q`#Yw2qlOhGj)zszE2kR|H6i|1|(p^H$60nLbYkOFhL~fd&KbOLS&c5?- zY|DM!Ar;dwU+?-v4+ajaUNgtq|4P)+-w9o2jYCvj@0B6cZJ1ym_8^}46@4WDK`z9Fbm z@JP*r=-YbjYn!R9S&G#P`*=y7=byZKZF=bIn90`1XdXvcGDd#isFq}`9cV?gL)uehx`xHyeF+?5(pX(@cZpG0);l_PaZ2}uAHH}Lb zzO~`TU~ahzvq~`$$Ns&e=HR2C_uS%0ld$(@%Q?nD=Fp=ZLMnweCXDC{_di!Tdl(K1 zEss0u<~HtF`WWh^-!%I-GH85{4^VHe|E@P3(#akp+oJw)=RW@PnOz_Fh60B%LGjmd zg3c9x91G8Sb#^Hx0Urq~*v4W3gMEzy2(uDBXYYnhg6XI~>Z%Q1<>y1Cu5Fh(OLAX2|6YH)vRsp(hRso(5X9jy8lT2)}d?>#r z%Ol1#u)ly>IoRSA=Nm7Y=Y zZ}DVzE6_5gzUr(c))(H#t!>lNL_C%<3zjJBq&;Q$i=|6?F_inAlk*E<;9bon`i+5KIs@pp3A}kdtGkQ) zyb;Pxi`gGz`q*Q-wfvaM1K-j8iuAqikH7Uk+V*nR-BtCzR`Gk^TNxa6w;nav&-#3B z3W5$?-3@6CgJ9&B? zXL(9{>}n9-e%1V02^wjkVT|AqvArm`AhS}ilDTu76PNXvzf^PQ`AeU>{t5kOsO5gQPrWurMgn|)##?F9;9p*ERw$;6=DEjA`~&eXb&bl?f)8T2mLt|ke;7E^IZ zbU*d;Ahy}paiaF`nSY!BOIO5dZrD~swJ8SqnG!CV^YRpeFH~@z=i9!lO7Z$anc~aF zks#OS`^#)V?(CO=?7E$x_kH`K4}f~EK+lV1g2TXoci`REam9o0scPQd;bHjI$K@5w z4#8K<@)CRXjPh}6_+Ir^)B6Abd$tX@sJp@W7%+T}Vh!BoM)XAfw;VDzb@*~~l$%CM zKssaut%#fpddi0Ace!c@5uWmxgYhkJM?~R^Cc6mY%K@u5t@$j^z`yq}7&=<|?ZQstcpS3{f0>z0|Rw zm3v!+ilfOoqhDO8Y>(6Da5rTfLapm=hEH;>=Y^1uv7v-Axjc!V6x$%^%y#={!M9gY z$8%kq>;ti%dfZyZ#muc@gyNazah%ls*tuBsW^xAQ1{FF|CDa}?$}>L-F4gXqEK8t$ z!^i;l#dx;6+ca2QDwKUG+MoL5dOBrbZ;5#99GgYx+TFoXN-XU5mdvGcN z-FdT%15?Xd&1>Hc=f$i)BF;KVy-aJ-#IUBn;m6qnsy*WZpAfTbQ5JH8ukWWLBMd!7 z{L8QN``&|g$x(45h{T_sORw!V#Pe?9tR>TdwB}}wGWG>44Pk2f6a2_5F@c@Gm5Rgr zo8Yu4TlSarlvPJ`#tIX@F_`x#^2JwkgXY=2mTlN(=dtY*1BpMTFM7CYYimU~3uGKj zwJTEA2L&Gk=qY52$;uh`fxJoWamL2agp(Mf`>Jm=OR0W_ROnMwt1Wuj`AlEFg} z@T&MpyZv#oE%>?F;uUaE_lET`v;D&N)`$8A*0~wm`vLrXwS#((`}ixg*B=6VXZf+U z4f6TFfbJ@r@lAjGL4WoE%NOv-Pk`HoIOSR*sn9>6d3yvz8mjTkG3p_ zjJ!si1llYJ9LS}zttk@{x=NYB8~Z1U)k0E@YG+Cwc_G7@j}Hj|I-KLMGF_nB%AKV0$2%Q-V@g*m`ph(U;29#y}HXw=1o zA^xWMk**ds%9F_>BF!enlIoLBO}kndt^Em%qjK))t-C7VSkIaWALGOhXP;UfZfRw3 z2WG_7XaeN?^R*7>P;r6RNW?uZvfj#VYZk72-`iF0#*$HG%QJbYC06L@+nQW1W4ZDd zo@U??Q+4R?rExf^`H+`wZgjG^f7i#G1$Qb7P{DhQpcaHJFDUn3%_lHK$}fP`Qu~sL zRHS_Ah;X&x#U!OJ5hs0**K-G z#Fbw9Bh8d5PU*gD?=tV;haVf8=Gj}fKxmW0*V)Yx+U2+)$?S3(N!DQMP|_s&c-U)m zV|Ta7TX$qu1nM(0$?noUX>M$9Tt?!OGy$c#5geFGO+A6*w{|jQP5$RG$SwandE(x? z^fX6eCl{9x`7mA$H8zbb|Cujr*I=mtw;GnRxfJC7?i@Op?+0>VYqVHgCE}j7;G-MP z#rJ(tlBn}Lz?QcyyzKaZnX3d!%JAJZ>ixV;i<%mIjIPjTBmX7n#bSv>?EW~2TerDw zK{cC?8Qr;9260_v2@J7+E$k{kQTJ9dw9eVIF(Co6h=hhUA!|Z{5_abr?L^vC?P%ZL zsI&N*KYD(~9)YxfNarq$osg?YDdglE*=jh9Z*r?q^k;KCvE4XO^O*U%1k_6eRL31+s0x6u*7P!RBWu3H&ZeX58$IOlCBSE@2oPDhY5C-=xw%t&&}*}5q*+a0Z2 zN*t%{F~Xg7HLDXlI413U_`h?NAbR%>y=Q)^zoi*Eav&VcX@B zZPpYTxVyc;u%mi0ac;{6Y7rQ`?biM`sE>i6fMh=wL-YCW+dd=M4&wW z4h8*biW_`SU2)EZ$1Gp1@LoeKr^NElOdJCSc*s<(g_DEbjWcDbl-68tfpG|fK<90t zA|EEsWm#*3c=;dSJRiy(AA8g6C0;rgOaUXff>(mNpPNsgo)8{L`970&Uz@IJsoEk^ z8}g*Dgnn$SVYI%4R}-KpdRVO);X)FWDs%JmfI(Ln=@u9OwS6LSOSUHs$dyMr8K+pD zwY3I26G9)ZR1ma7BJTv1tqd*CX7?C}K@Pe|7jDaM72#M@?LIw~agBrny_=fO%S9$*Ka|``YgD+prbK$O8`oTUB%v+73PPml^}a zp_L^UJDLAzyR<^MIzfCmJqq|XegIeL8cKC_Q>pb|HY4NLklKBUDrm-Tuai2Ewz_k| z13?{>E%xQXVpJs@!)ff9v(;=r>KklP2EkXM5Ir8A#SOarQsU%D_G>=hziB#RwvsQr7QNn2+|vX((@*hu&Iub6J9Aq(%Yw0r6F{UpcdsM4^9wB$o;!A&KyMC zva^bJVL#?vrw}?V3o9T)CT+FcQET^4cmki)>Q89GF)9WVa$P*bPwk-L`{=d7XS#C9 zlC*}U3wg453>dpf$?I`EB8iN)7B1<`6$}Q@lEWY3T4i;Et*()(xDP14^}EAIRPGI* zktQ7fy!CtBS#pOIwV!2EOa6a4uAjZ*yeH`ZgekUS%v6LWW1)7K(ot1T`&`i`=jC!_ zNb_`F_YIReqcjpr8pu@QsT`NTafcDere&ypPK5ssvAf~yp$RU=oHNKFEdl$DskZL1 zRP>iV-S)z}FC7nI2TSa6&d6l;{-P5h>I4mKp6teU1Ru=TV1re;P`Ke?{ z$I27-iKB=Ld9bGYA$9JUR@NP}l{qU$4S1Ft?jI*gbQJ@AKG|_FHRUul&`5c|0ekhM zUU2h@$Jlrn7lM>MFV6m<=M_C%r$&ecCVyRWysqjU`6Kq4>GP#`Z)ud|kZOBJ)f}+i zKtOK}$Oce=XAWg2!&FR!%UO7l=Y)+I7zdZi9u@4E0Pi^< zS&)FrSg9=TN}3DM4{>mEPFLXA9cqn#zc>OQnr6L#X*8JgldHg-d}4bVSZ94LWj_$k zmLgJ^<<1s?NIEgKE4rhB3Zg2fXnwirkI|bwvZ&mT(zm0$=Z~d{EEF~UC2M>H@~4zO zR=!ndqHQ~lO7S4xN~{g@d2%$O8*3VJZ?ljQN%703_9*3-fQTR%-y>E-$RIST0aumN z<|#H(p&3put^XKDD6FuS+V4`m7<;w)sBtE0_W3*@obr`*J$=$6fovN2r>uTR(d=4? z>>B4h-%VZqkh!T$%v_r`ZMSRk)Eyq1bMog&FM2+3`_6ST?XlnHzyBiLwBslhWx-Da z#F>3#55jQnho>_zCYZrHY09%k$+JA~SUi64K*{YEh@!JAKAi6-sG|$-+GiMXq8&$~ z;$@`eJk@FV7^ac7?LTuV9}W4Ldj!Z#P06#{O(bR!kc5G!zo~LsV%x1_Y-%>vVX{ny zJwdyotzIF5o`G3PU0(@`c)auszE}ocp)4M=B{*Utml3!Y0wpfI?P@}d^obGOcil|w z75}#!yg{TCbF0i6Ass1I%@q1BRre}RS(+N#3yWX)zv+-&o-qx7X@lIXKl2`9psuTX zstJUdtM!NCR!_`@H1IY(t8N>uuyt=*t=McGTw~`V&(MuW4+2v{D}#^=08Kll;vGjh z(~?U+jc$SgF4T!3>eb-qm_Z}lQMQYskKzF$H&WjF{;; zYJC(Joh0Scj)PknR#hyNN-M28w<&rACs1pH@&M8?P$0s;LC`D1o;$xiA$_NWl~vSW zm7(QjDTK9}|5CZL|BMl>boln^0xe==N3y1_)fx4c1w2uD*J2* zVLYg;=omw1@~3)0&bknPJyD$ziFQ|Ei}mL`%lZmJ`$0AibD?l##A#C*z>bqZEtCQ> z6K29}IyVFiy^_()@K7oDY%j#h!9%A0VRT9-aO*;z*Gi>0Y+H3R$q9lw|G-}S~J=e}?`VRwLwHv2((_by_RJb!)$krPE z>;)>$s%cF?JG(Bd^p^0`?K`Jqi{%A=kcf#NdBtAhw@5mo7B+)RHAdwtjp)<0#t6tM z8^{cz<7s!nJx1jrKBDEm?AjSq{lF?b-ex+M1%&cRl~_4(OV!I&=!O;Fm_hQo_XXyE z*xzJW>Z1-qrIPC~zSVNBmqWNPbJ}^u8ya!7n3c$z%V5-EBq=ar(v5<3>aR11aJ_$pYIuf!AR$A)Y_wtV&1H4*JyN9T0 zi@^m+MH)Apj>0Z+ah?t0!$fT^%_rQ^gh5ZE+sGTG6(SVnlb@``rDatk@tnzfO-EWn zmeLF8CXS!pp3PbXGKlTgO`TFs+;V2fjy?6{kx>-gRk*~cg77&h?JUL=03KIwBeOXtVJ%TQ#oza6Hi2ay<*GKO)?kjUbcp=M$e$3Nj48Z_w%x4iwT$;vKV0)T z3Iwj#MZ1N{)8ua4p6gdTJt48#8S{OrNH^FL3tB5}$>8NPC>kzz*2~e9iDbdsQ2g^v z%#eU!7Q^)G%^7v-iV)I?&K#$~+XX@F#)D?6!YCdvM7Zos=37(cf-^@J_s%d=Q8QRt zWU_1HIRY*#&s4GEDH~?QZZ_~@EQm;tjpIMk35W4cQ+Jt}bhqM{75O-3WRa>_zUxk@4d7fZZ#{Q2(p56`gq8=QtlxTGypTB-R0$WHM?2JvfunC z1u8KjE*2_Yt%N0HAik5hz9}evfetXF`i#6}Ve23-vHz{$+TAe|w?e)01mCht7VeZ# z<`Sp1DUxi!!o@$>$C{-2Ki~dGv&9bL6ib@{d}T!UE7DW)iw?jAX_E(eNAvadyj5}S zo0L9yACE6>@Wf`&o!2^lW0o;^d+q4iEXaI9iR&vu+~-s9TW_o7(i`Wf99VJ}?NK1K zlVn*F?lJD%yd5H$-KE!y>l#*(k&7U582RFI@#;5i$Eej|hGdg7*i<2q9o0(8MCwc+ zeH`9Ngf>l4MJW=Vf>)ua@)=kQOCeE+(=bZ4VKq0>JZOa2vj&UnK(@m<4ackB@Mx1h z7WB4N*`NA!_?KD!&HZ6mCj`l#+Ox?Kawj;;U&vOpq1X){Lc~WJFGss2XX@6|&1+EI zNAMCfs6q3B$6whG(}kb4U+J5}xvpags?(fEESO*xfDTat*1yL9N?mL!u76Rpyw6CZ;RkS$w;mp8(i zM>8rpt3?l98i*hK-Vt#uHo!?Gb^)nTWTtM_p4t$VU{a3Lh@!lXtt4NC-=VC)$nJPko~>z4!uv7RXqs-uLaCnKCx(2Yt-L|cru`95p09s*eVvLh%laY9_XNm46#D3Ey(8MM& z{`|YzrV%8@zM=>$9bHc}7mL>jSeeV_UJ+}|f6&ZpJpqs zTWauwA93NUA1A;qBI%^DBPHRq+T3HUujAwA8O*PNRTB$KPMJ?{IOb}Xzl2g@uCz@( zS3ax_ zpq^PpAekCD+0*iQP12i$xvD?&HF43%1E~?RTq+8x04`Ev!!)l@!6rxGUyWxdWeffjpk8}qpl|EzgqbF z4EXa?5yJ~*zOPc5sKAt?8}_6XJhBO9mXk~6XiLSsT3F0Q(a3vcE`*=X0<=tWs|yG7 za96NyQxcD0tF|%i=u;h+aVgrn0)F{|hQM&OVO;L)W*nQ5Q#By>9y;XCk1!daosg(9U?buOarh3m5(<*ZossyxSzKIwSkG zGVyOElN80TA-_w;)go=#mgv{T`0a#M-!oVb-KO{xKg(ErLRphaMV5q{_?=MmIhnb+ zQIZ%b3H*+?e<}!<^ZyxN*&#Y*a-qUWm+L!H)@qOT(Sm4@Yqy~#P)8mq;lS7{T$$he z;lmU@Yc|Yx_G0@Ex6k3&2LUYNm%N`^1~FcTVsSFu&qH{38Y+!DXhj5fEiy`Di+y|qJNq8i4c zcA7#&Ny>C#C}b(He5;{$;+yjvc4G7gGfTm;NUY0P8#TL_zP>_pG1~07az{_xoEt}K zg9#?njQ~T7NheVxoC~(O&@vd07~HyF>myHQ+Z58CGlrq?2EN&&-8>~}=*zRM=}c@$ zRR3Za6e&rDlq|5JqLId`ei00xblD`|yWL>y4FRYs!l9l!C}<}g1H@4X-Dn=r`kzcKM?rl> z-mM)BhIO036L-efPr zIhSHYQuxV9HJx~ijhmwHEmMH?Q|@6)OZ^Z))Sf$R;u6dp;{w`!A&2Y@M8ux;Uee^w zr4f3Z^+t~=D|CCfQ(4Ih%+Gh^n&uuny^<_BSIRM6Y*><~k?xyWZYu2?>4^pNDm}$I zEtOUUpgo4U*Vaz;ZlyDh?4=9FOOz0}^Z!rn1Du4B=a`HQJ{87P&A# z&pa5nOBC$uia1~Nx`VZT|7gvV1h%~kgji=X<$GjhP^xh?ZO3$(+L)&dsgODNO*L4^?v;NbFJfBl zTretub8d}tm#?%raRr;Be*@SIs1mKJ!jLE^51`f*ef zi%9hTZ@N$QdFjwvi%@HRBFtP7-@TKY85olv(};n`;1HgxF%#3pe}B(ut?9YBPwBk! zrN+$2{jjTv19GLg`PW@~1=HE6)c1{xd5HT& z@o?>o;=!NL9_nK9xCZ-@MrXhL)5e3b1=3((CF|0}!aEzgxe~I*aL#GTNsErVJzor) zlQlei3-&G5zQOh0Mu1b^*_kcz#|K}5C~y0{Em$)J%os$xQEQO%labu9n)B9Uq%N;v5gm;5RbE z5Mg*_e0};cm&Xx;ChR1}e)|gdMwAElYmM%B0v|75xtVkO2*Qi9>PL?pIea?}#p>fx zTck{p(s)OaLT34BLP_{wdCGLDt4A(I{_KGc>XJ|p6gH>S;ciiyQX>5-n>j<^9Y>un za>Q%2Wkf<_rWvDmhsIj1{BMQPTJ0hr=rGb96&sQIX$x?9ngSdJWGB6dFo9g>y+<6k z%gkLyF}8{K^y38ldM%myFyJNc7xPD*NDMf;ED z@W~G7yGenH%OdD?h3eRNp*G$jE85w1PKLPD!cVgEp@G!MyRE8ILU;?DA z{lRMOvAvsSLbF3VV-hGb(HVk78m6tz*=AZo2agpsC(Y8*0y5-{-i|1p zPGUimST--?fsDXz^>B-#gtbA`LW8HM2d0s_9-Q2U5tz)~mUM>g zEN+{;Ql+!fWZFy={B>wW-lu~B8)<{>&`r3*`U2Ok&TJ=RGJtj_=fZ$x1tk5h}5z$5d(*>h~(lc64A+KyTlM;k{no(e(GF{GV5FOf-Lf8`lJ4ki3HO*l%ac>uw z0zV$Pi*t3i_9r0weVV+7`|U@OV38G}Y~pdm5~^oqF@+L&Q;+7qIYKOf?78y<6lAdA zmQ#-sMQ`oC4jU#=suS{A76nEsS$jzw?V3%QCBhV?LcJ9J$% zx}9f#h8{C(s|mI^-4AO6_j;Dsh%M-xucXxWze(vNPm(vwou`aaiG=!Z!G#9{NSAN5 zk}EaS#nZYcjgPJgrkf-TeOF#B486ZT>VRI{7NqNdZ^rUkq@#Q_x`EY?w^n|dhLtd5 z17OE=W>R6!gzW*Jf{-$eQkU0%@$ikpOCWyR0L_S+-~{xbgB?%x&O9tgrVjB-w9IW< zeq!Zl=R^S#Ra<>E7b=NLA!{DRLzmWW!lSo=iS^u_7HTQ+GZkdmtU*P0I1_*oe!ARf zXF|LTC!+I&@gPCmre;YdhQzK)>FQvW;3d6XM%XRdzWHE0_+9duM>ZL*v61XJbp}$4X6yL z2#}ZBeDg;7l*nMK-PB$w;c!`%LskEtBrQ)K!BZr!yc;3Ksgs=kF1Wmk(a;p_x3&c2 zml?4Z+V|W!eGRuJ#5=AnNa5|TV8ujWeJ{i{fnLfv(< z2y9+%q9ts=`e&R{6u_w*aBF%*lLKi8s4c z-!&=x+;t$EJ{;#y;`r#fYW@3YuWzI5Z#CY|1D`92Kg$3g0aKE}hVvT<9~qc`@Hp`TwO=xIC44 zL2wBV3&ferU}ZhsjC zifRT&KnRTk_@7d15nN>mc3S-C^iaHWEeVHOhqj&o)WA)LQGb30s>Q~Y&T__%ffquw z!yXwklPHOcow-E35c~9M)^9t8Sr$yq?ju$+oQ~J{RI^L_{RT8zRcyMY=*E{ZznHe; z8f_(TJDQbTTbMH|6p|N3$(oi^$P%XY-i7<6u&WEa%p2E!g^`~?j_<&ajlNc67zHqN z7@`x#X8jG)hBZksT8+9#yB^SaxNA>OeG+D!6Q-36fQ`=@oNT-oJR9NLVw)hB7QwgO z1PNPhSskoGNQD_FIn%dMA7bK1Rxcz#y0jpf{piKXm?=1D#`>iWgl5nvKg3uwq+ z==iCa13broTNy*cT4ZlZA*Fzz?=||^J_QQV4I{E z?j%ahcT*}wpq~DAzOFbiT+!vqy6Vm!OBm^W8Pz5dfmq2B8H#LMmAiK>i*_V+~pY(8DYC7cT0of^tPO+DJLB*c=Ulzm>CB zDF?JQ5Opg!7chHj612LaULgUa9_&eHXA&7RYNq@OdoKe#u<_GLuIoLo|Hh5_pm8kc zJosN2CbCD&@r}V+gaaPpU(_v6u4`et*3XNPwi2iIrpZbl^lXKR2RUkMs(F9HHi*-$ z{j3kEyQ~cg&1TlDfVPLu;Cp{nIN6H+_5(FMuGOBDV-BB_t6=zSYX8?qB~B%ux?OFc zGVb555>HCh3{6A7l#`nw_L#AMW_WY7GRzi=c8(B%0xf0fUJGY2(^=n&BZ6zxkE}o> z|90AsMFWMc;pHp`?<}u1@-PYYP06fBUyG~Qe0#b$pTK;p;D>Xrbma|}pX}nOvbpkl zno)H+|8Jm%YfEkxD`qy+(E!um=>kL3Wb<9Und%}-USh6>HbE$Z!ZqMjGPKeAQeUzf z61b&4yU=ytO8oXAszaish?hUEAZkNsnQ2r1qjG@xpJ!<2&xzkdeL25O_z68}d!rRH z2)cKlKCTg0aC(RGA=|@xTHU^DTQGr)yy&!Ie)1m?W^`W^=-DFYG4HH8;2iZJKNdz_ zaLQ$kI-3F3r|m4Pe$bod9HJRc@Kgq|=NmiZqFY0} zkv{-mEdJT&mvQLSxI|?|y`pphoG^t*P}!UKVqR5j1eX~tt(8$AMyNOejF1JYbN=9! zhV9LtYTn126AC||{l$rt+i`=_{;gB9MckJ&JgkeW7P`?`ik!Eayar|no8-ccT_(ls z(zH!1x<8`=86C4!rO%pR={Nv4%4V3hVj;k)o0nc#ox=bIk0>N$F1-`!=g^bD(*yYz zn=aN*^;@wv7}fy#m|daf)7W&NZxY!H9O7#KJg?8{K<8RIOI-a)!4LF5$TE~R5M?9z z+Oxuv6+hb4H;Up7ulSb5;D%+Z+z9;sA5Uk&7T4B9=|+RQ6Ck)-a3^?hcXxMpC%6Q6 zcXxM5aM$3$p&Qab;|z1ZXXZDYz0a;%wd!3*&g&dH78fv1{g0CEOL$F{Y5vp@XUO&M zUXQ;aUwcb?y+PuaSA-VXbZ0Y_BTQ2F#+Q`J`(RFrgc-IA^1b!72M0Ox5^C%*Unv_z zh05u|4QhL1ed;Hp*bT4W5(TgjMD1T@ajMz%9d(EFljj-{Rijoh(vlb&@<6k#0}HIFpB{N`c%hm;=51UC^?{vfW4SJ|y?+ zRx2Df+VfYD>BTRNtH20;kvBXF6g@k2%2RUM^rU;=0Y5C6j!(bor?X=fkOj|;#R``Z zb`EBNjaFN>m(>^VGdo*%y3N!VI!dDiS#I?jJ@>$!o}M`yGPeW~_i%qRwyfIDOw7iN|Tm_w4IzoxrvHN3X! ziT`l4+cs3U9ZzQQxlVruc^}5}P~e`z?#;dPC#2ohx$UB+bEx!E6KxN>DFfDOdr9O= zEY97-+_a&oCD<}rJqf25Li&E6!zIi2P69u9%kQHBU|6%#!l4W|0JAP=zc61mEZGko zpLtvSI7nwv5VmukWoQ$?-VVvazL=ytyRX*boim-h9SbUEy=Lo{HC)3otPQ^UBiA=A zr-j9=mS0gWJ|9{4P!Vfm-E;e{RoN4W2E9c3Ggic!G&GS-CTV5 za?sWn1#8mkv5Zw^u1-&!)9b{q;HpN^JTrUKm%kWuV`ZPvG55azl8_RXF*mLBg3vei zu5<_waQe^^;OL+LvWTAFTKcq;voF8PzD;F%W&_wrb1e&*VW0HcKxLrrGXpG0U+{C{cqpb%x5voJ*OYP)$lp7CN_NK8c&b5zUiN3j32!Y>obgri)%~r ztz4*F=~y;Z2+$u#ZdOB;D?~=&j=< zR_pcjr=cN$Id3|JIsDl4vNd+$hN$qm@jy5eNo9i)2XR^Rjp-!QCW@6W;i{jSl)nq`_}%XCLL5rC{G)X4A3@s{^1QLOo->jT%S7u)n1Qgw(_THN4u zPivRkrgaOy0YZeA^`Zpb9+N)kc|(`8d42-Gx0c=VYRj#Lr;*&V6TTRH#Opk;hkM$^rU^Z$cxw zrO0zft;}q4=-7sgAKcumOc1EE*DhyJUZP5sokSD_T|X54`?Se6m8R&-ZOgZxpS1gz zp_zDy6mg?GMMK|$O((*PUR->|kV_~k?obu)0tIvZ8l{3$vMX9rQz4oZu|ZgedVy8- zBbyv|=0Skf5j@%1dWgl8DM}nLSsso~y_!xk@x&_5 z%T3mX2+a8%fS|>Qs|0}x$yKV(nHZo;8Nw>`0yL$>%$`-8&@{7%A8k^!#uPlsNzF7X zXGBW<&U+?Q&!MC=C-{0cyq#e+>og}AbWdtkw&mtdPz7*U^6b8(+0@hb2-?u2Nl1`B zUidz$yvn7^cW)-L19Qlu`udLo?vI}40^}0h2c+NI5vbcbJ|lE9z^0mrCaVem7$-Wz zgmeTG1A50QVklCpWiqafTNWT3S0qyBa^Z_pP~qWFjkFJ8idCV08?BB>fv&G>7n=3? za|4(Ny@8d917uKpH=ujjCx_g_hrYi3r=3YgPA_vZRc_`DeHu*;%Pd|64pXr^6YU&& zN)=tZPB|vmuruwYOs$CTQ!9Qw@Fm>!DlIwz^nO#-B?(s+lYUH=WfD!H-}cZD@8uAP z(%*t!wI5^+OZ`euNSSoGzfO?)r&SVD3z1BT3?-n{VFl8) z+hFSl=_x3nlR(n*ld!5u8b|<47^JAoG_3Go7bblvHBc$BI`?6n-Jtp`ldJaBKo_z2 zF%sJO_eHs+E$791QbGBXW_4VXu=e8*lc!=d{d*ke_5ScU$f&e=#>TfpE)4S}CQ>f|St$uh_QI<45EMohgf2Tz4Ni7T_!7})(;KAU~?K4wW}n<21y{doKbIBK-cw4;$@Y-0^+1?sA?O|IE&u4r2RY$E>EAwry z=ls_cRXA&yPWVCMoS4@Lb0l74{ouYKbF^!L7@f!?_t}o20bkL2?o15?o)FYZtexn~ zz% z4Us;)-T%ZZtk(x|V9D8_!6g8H^Y`LjcMlNa9=ic0mW6l)ul1bxd{$KWE!IGH?;21S z^N2T4=K>Sl@j&Im5U)0~OkMIcM_E_3|5(1^e&_gbuJVr@(NRq8l(|+yll-k#Y|UF) zH<4REtcsu=lTG5xSlq~40WR>RXe}%!`Bw8M5rrco9z7Miro&cPA4Y&$BJOWp&tQJi zgEE|Q&te5eB_~qly4)v{iaTb0=V9DdZX z-UVHpv_F!R?Yu!a6>KvRQ?5l#%46-5I%ixjC{_C2<2Ldq*h(1{oG9Gk(LlyNMqU27 z4cyRM(FAW#$~(#-%`?k7tD+F}>I()B8J$dw?`?jpvjJXd!)Pbs3L<@J2nNASpz zJG*?Y@Zy4A(L@$S8aA$q$vMZEDaT$vPZuKtIox%EA#TXDibw4%1Bo2^s5QBE=AFFB zH~lK+p&|hTe0fcER$|J!!-KHvv5II5o#FGc)Z3qNvcNGCh%uR*BZgm{46?I<#vqQ? z;cqfPrev3%;)9wwUf@g6Ytk7cyx>h>*X7aPf>|lI_3PGj6~3itjM*Jw8tXxKWI&RI z%FjGFJj9cl zf-J@(%kI0YR^>;;z4JkQG<)gZ2EKvax3$`rt*oyE8FN1YKGPq(c9vZV>-iz^<*a2` z_mva9I@V})^GFDGSCm#ZuEtDG+w_;nr!jD}6kLxP;~w8a>pPql=2npgTT{BLY-cH@ zHA63+3E4BYruX*Ce43M7V1Y`7PMP{Kx)u@+{B!7%Q1Q%8*12~4 zO4DQ9*sl*2>GCHrz_PemaMn#rvR@ECR6+Q8}`V0ax?fuB$-xWgjmxJ0hP5i%) zHf{7momg%>Zl-L}DGth>Onm28o$b*j%OUN~FdU4T(S*pl3Bd`Lp0;$NJe4t9v+sg0 zADvF&Wr^s#*L_0qGQDP(4Z||gaT8_y*Wk;kOwchpfvCojJ*~Yei&HK`+6JgoZZ=dQ1@aEEYC)w%`D%em|!_dBFK9d}+-( zr)=ts-Sd|#FofxbDoL1lDm3*Gs33V5Crm)PX*AAv?}iR^ys1dXGS=`^#+T%ZEDK!d zm`mKRm%!3I`!v7#OO^#)%D#qwOw8_d!E{EU9xp#XZsW$+XnfnBY^TuEBqjPd&uhx7 zH<@S4BeAq8>Fn5{g?!n9B_{M+Q zd`45UH~{-h*VE3ij2b8drDsj(rtgmP<~|~ezAJ$84p6KYV;zjz(LfKFdwT=A7CJle`-_)ctO z-%kM7MBrK$gO4CDaZCoT=F-)jaJW=!nA%>CuDi)owGgK;NfJAsf6xHg8#Z-G-v};P zjdk6AT|cY!tDgzp*hx&r$G2EA+aF?~qg4bG!_Ihm_ZuMVI8|YdQOa|a5lD{wSfh%I z%)p7A10zbDA}lcT$fty`p{x>Igf8hRJu%%z9!t4Z%%0Hcx`^BUI4sD|cg8)Y52Oj$ zzuM~PJz{=8FnU9tCO$5dgjSc2fFvdo+wqTrSarHc=%}n+;Z|n2e~|v;(2(?#v@Rk~ z#UdIuFN=ecPr3U3ssZRA7r;2bf5X%W1dq)}GUoZmS;*DxLdlN_Qa-~*Y3<9P4IDGm zM%`@e@SJ_QfdTv-tnCUb-Hs)uSfF8@u0lsSZ7@YKvH+m|#KNt?GONXsPxo1 zIvNYv!to((#yA>r*-E^5`gCXGBmeU@rb|VgcgqI^legz|34I)vhSMBYn0b*L>4XJ; z0{1PTynXyA1Alf&?{9s{wsK<3g~~Sv!}`wCB2XN7mZ}RfLIB#7LeUQZ*V#K-gPMMS z20RQB!Ruwp?@I%>RM5S9J6MrT;brt!)6RRq$IO8}|Fz_Zlxpl)Q(JQIKy4G`kNRfI zjy#iOQRVSYJB0XBnuRK7{y7`!g@F4-!-jbw*%H1kltISA>{IEbXe)x&8niQi8Vul1 zgNq|>4vC`4jB9hW8s9?O!f2Jpfxj?^0wce|valq(gx4S9w0Zm)E>WA@DTy1pK{}#W z6Oy8;c}_+I%vxeQ^v;wEg#;x{Q@M59*7U#-8xvE4ZGNNvS0t~K?G8{?o#XJou4U`h zZzqpkHxEE4FRSv#$ez!pl&`)*tE^B%CgZT$d_PXhaE|#hS1KTLC>Tr>O(6u93j{RJ z6!vG-1lxSY8Ml@}DSN|zv&o;lQd%f?oX2Gh8R6H-ltI{+IFB{Eq~8JLvr@c$912 zbzs7YpwSrpVJ;5_9pXcCi}dcy)TA z?DRAS_6w7*F@;)zXJg>wWh^-D82*6EYl<)j>8?(#&DrvxU!%N-=jC9Lcg1fuaH0py zp#XQ4SB%>rwUIsSb#7CvSK^mjYh5Z^Fy~~0$4z+`+cAwpgP*TuX2W>re;}yPBq&_h zbb2@Y?d;C#!sT>k;)} zcxg$k(Zlc%^2~AXZDLY3EqjLrhiSr0Kq6-A{jf5Wj(c?W@0VpkQ~kaJK}j%YrCXV; zMOzF;)z!kGCR;Yb%!s|$ZCn{hC{{qI)`Kc&?$go}|Eclk1F_gZk%x?g%E}fPTFTKx2VUz`hJ~0<*t6dOp&yOW9IjO&!n^wJ{6E; z$DN^}@*KJJm(H#;+c;0xbCYVAAqqK&@hQ4N0K7$BE&@f0Y?JU`QrEP^y(tphR5vY2J zj$SXL02PC!f&0!`ANJ$I~V;z3J9L#~6m1i;?8Q+=z_v8PO zu0>KxvmP6zQRhcwx}U7(_}0vAqShh1X7zsHokqoj$6_2z^0dQzc(j(Fc0xax zk7V&dGmKHADN`@PX?Ai{2d(Hf0QRUXMryo)5`x zZXHcN2(QmTf%AWGc0CdeiXJhVJGrw6*RcifDRUz4SePa{#KlEQFP6B%&zFAkOF}ic z^PzJ48~N;fO`UuAR%hccsm9Wb6+Nt3pkm&?{~nkv4nQ3Xmbq4>KY{Z@CrSHe|ExA-Q( z%kE}Uv}&E$VW^qiFvQu_qN|SVmEm681N?-g@mm(OA+jpn?AmDUz$nk}$oa2hxC4^oc<o^7&;hbz2Ka-c**Jl5)34e z)Dl`S5&uncp4HT@a2tNQs9@tZ(oV0G_rmqHo91u1#{(G4e4r z+tn4GVbVcMhD2s_)W!Hjd@A9zu4=lqb)Qm*s_37MVh>0k`$2=y`iD2p<@=*p^Mm-@ zS=IOOQxhRkvpZwX#0XL$way%)5+g4`{@HCa(50>J<_C{7Y)NCyb#-BX%`@vJGG-T-A+T`~HJn0lj6U&eV59`z5 zZ7vY;)aQhzhk8woy*uMG>)Orm-`FFc58Gtlq{sFLco!JW;t`(h;%tq~w~Z;8xg^^0 zOnN-I`KR$J(q2V#!|4$TOv(JDZIu0PYwjH&klqB7lU$f)-WICB;`5r1vh9($YAr;- z|7)l-D|{g~YvBkmie~2X8C=7W1R$b0#Kw-m8$*X5+u}9+$ZO(fRU0?+m$qHP9L1LK zF~$>D831N1eidSQ*r|3XP5t>yY(9Rn6`#tRr&pICnudM-~T^7~)Kov#yDiiiJ zZP{#^YOW1wJKH2@20FoD$F857hvVVg_7Q3ycm6Inj>&yA&($asZb4i}!LC}t?!QNT zBesC|XaD!@fc2p-@=MWG`8v827N&io;K`TcXZZ?&a+`w?GUppQBA*UH$t^lqFjk-R zGgfS;yuR-}Ra;uKx4v7ldAcl~m9~Ea&MX9y-0!RJ;~!Wq!s_26?8=kZgmt+;JegfP zryI)5K5R5A$S)}|fohd+H3^2n*Q3+KKqR3Q_RU1&(myY|FT*Tji*;@~L3QSILWtp0 z(UHA{HauI9GjF5|HcvEG5A6bzD$InYeA}FTGN{l-AEbKkS*OGZh!Drc54Id6cEd^? zb6MTF@7f>bUFwMWV;qypWwi9%+y`M_tv%kEwIgnkaq9L`mJ2XbqO;srr%3qj{)*sm z%%#ZHoAdv?0M`QL!HJ-48=PnXHeo9pm(Lhd<`>S;=I>jg0gfuhnAc6pD#xyyPoD(r zn%&zU&*INFYn&&tm)e|8h;2aWMkGz}ea67n{?fC5CN=`WL+b|d*gH!fprhJJsr^*2VmO@;?%>sK)JrDhSdqHv31UF3-iAH|2S7@;})Wdg`4^yG$UTa6&e$o?rtQDuEDA_u}RA0+Zc!{jT;w{#5Jz%V*(-*9-Qnq=AbJ%X< z^D2H9dtGr#lMnivt`0XFo)UerH85$?2IP2T!>un+?F-&1&G-WL_$N#indYm*l4I2b z@C5Zk-u!1ODYlV?nLhR$%F^OvC03k62aG>KmQSpoJcYtMNvB@AWg_Ga69zsZFJbcO z4&bC_OLLFUI~l0UDAPYD3-Jh15p#9#+aEjWCr%V4Zs9&$u#Pjewz3{Se3)Bl{3G7@ znuCck%9r|-sYGpio!MelzPOsx9JXw`Ve@|Jr5z-UK(l~x*(#v?;ZLo`<~?2~hPON3 zo<6yWuX~~O-5xFY?wr2?tv4}EK4Q_51}LV~Nw@p*SMO!Us`vFEe3fITnA%`TETf%M;5Xnv zv7C*HY1#DUHdwZG@=J~g0&j0AP`OmK%H>sGi28qcXe1$4C3sonTlGI2Air4z6+0iO zgU%isodRNzc3drmgT60iMSW0hvgiXsS5j1>Wrt5mj($Y0W#;Txxw#U?Vs}d6!(5D) zHDrcI>08e;p=KhV7pXGpR#utl%4cyBB+^XAgi27m5Km*ZmnoGb+MhNlR?I63wVgOz z!kb}YQ*haA=@TIb+Ec*SaJ!qDHIa2!DmI5S*kjoHU7;aK&Fxe6d`2Ib8a!{pn9ggf)WKyGKBFj+ST*+=5OMgDJ~9Wt)CCT4F$j?3Bt4IAqy!@qT4n z<7zwr@6TIxEtB_IT^2!3P5-;X<2O*tE-{hpwZF(o*f|C9q{?9c?RdfXTN zF;Jt%8FH@;s2yh>g%dxUtNPQ3GMq2EGbHwiy!VdABHOZ?@1l9}lsB@h!ZqNyL$X1nC>QthVP4?>TJdm9EzrC;#k6r2sO1|=lB9kvKC=+D~fP^7#1*hW;C{g6P_Ne9Y* zKEh68KZ|aKK*bf;7CryTD%?$lLK!D54j`$@+ZtM(LRv24$(H2F_)c@o&z_d0W7Ue> zuDuDOLhg%)7{a|YgLtZHwi*7QXN(yT8@)snzF{DH>X(`mi_uZI zSK$aPWzegx8YUm*i#(SUfLl(S9xj5w4Iy)lbh%*tNbhA6w!j}nCGS4bE_I&x4Xold zYm~3KQj5lCMfAMmHs;@JO&KbUVK<+58IK2L-u4neoK%VDUedBlNG;dVm*6Bd#5 z;A(z#W%g0&||H5>CP>8DOan}nq)`l^0y(VeT1);2Fj@%KaO&0l=~R{04YYr zbo;X=53?$wPa8fQJWA&Z_I5m-h5WNT*gk{-KT+2+Rt!+Rypp|v{5AR~3c6Iv=aSBz zZ|`Ara~?N(2yKsi0!s7ornS;1AP6Fb)^M2lSJA-u@_5Z++v}{fdS)c$zbv;>)!wM@ zUtLZ<`bwW{llZju)EE)|rNd!Z`GDcCZHyHHlaHvo%u2U%BYmnD0iSnSPlY<`di`GD z`dA6({9k_-EWBcxhdjx5$lWfifS|^+4U-V`1sQ^+p}m+2l@ye_jGyA>$)ACqh!_XO zIH|uQHsfg;X?RmPZ@F`UBp@hDr6V-(-mmI<6*@NUV{YJLo%s1jU+}F2 zP~Hx@tv+b(JPDoLP4{Xtqya9&4*&H%oLqNB$BR#kGiMQ%g%N|4n2+r_mUGX2=N}`^ zJoXmFFzFn=`+a6xoe?gRLFHwR&{4|i_-lo)t^II+3$A1U#*+;=y%_q4`x$nRm$onp{S3)^`Xo zD}rUO;Bi(0bh_(utjd`g2wZe8>cvZ)+C(*Wu>0jf`7@)wG^cp`Z>tU1KXoKO2^CnC zSFsf!Rj65HGf>Y&SJ-qz2QP76$tT-Ei|&7zVNn#@*uS$`aQA%!?q1)|fUdzJJ|FRW zpqHcFqp5*KABeQGuvTlna+XiO`^UXLIQ{F*kqIk^gt0RaG{>o6jawStC&`>vW<+r$ zk9s`D#F!9~&}7I`8?fIj$ga>ta7P*&s1|Qld%?|ZF5BXDcyp6nCUg?O^@o-&M(+d& zOz_EmG-b#XIppm3aegXm=_c=^;Z>c+566=K1vtC3Su)|3XNjf?vx0T|s@=j)t4^(I zE-Dvawr66J68hNZU0lk-#>n(D1ZAD@YC7EHgJM&R;61d7O0wD}>>;-$%VscG9;_T3*=YfCbr1HkbvQ=%Re)vkj;wX~-}#@z6V;AaBYdUZLPQ*e?p!Ul2XC zEY6HO@vR5AuxiIniVZZUFkHDl05dmmemf3Ea-4XBwx;FIl4!l#%yFSgH1pw>Rr49}-` zQ?YP>y0o4gVI}K&K1g8ge?kE%xk#RCe{EW*W&@Zg04nJf365{fS}-t~X?{OGx(e&h zq!nEW;P}w3H6(&E@Ueo!RPK0>*Lh!Slw$Q>^awu6oLD6+>G(;N2@XwDYN%MV{cCHIvq~Gb^_kwySHW6RKH{vFNUvGxkXQa zjyD)|d|cUPr{`o<*ZPB8j+RSzM_Ps7%A={LP1qOY2OuV#x&tUn4+SaFu=H51144%4 zC1;fmPc|sm#xPgR*RdRrDTHp5_{XK1Gsl<-^ZHUv0U0-t-X+%K703H$lL+6!#9#;C zw!-)7b>sNUJt-=MxTPJ7#$dBJ_+a0 zF9D^7)~qA75eCF}vTS0&UqPR80}8qk_2U3#_{1QpCZKt8aT79fCE1e2xTE6pH3d zo`#YP441f_WR*2LUeA}YtU0gSBY7iI8^Oa~UO{ zJ$;y8^BZNTlc&xLVBOd3p_pZpYB0Q;g8(ln8(sGz&~3**e%bb`os8yrOmXy+zJE)$ z5A*mRlIh)aq*cmaY!bHR%+cgd+ zd!F1Bjlu6<49^Wb6SnkA27H>Z55&F6=mgARfJI$J73D-7>Dznj5# zHn^9RSL9WYu|0!5`pA`bGk*Bz!?h;n=eY^T-riw^W}(goT|S#1wUDr~onHwPOocn_9ohdppOAvATSamnDuUiCUPOXG0)f{+r!Rp@nBvt3#X5k)EPixiLONc!Sbu#( z|Hg_L{v84SGyu9;^2RJZ0cHmp7QOuU!j^mFzB#&K8~&(zB`+Z3qSpRa=g&{+!PCka zmt8~@vKH@7VN+*og_{iMKnoVIJS`XRjAs z0V-KIIiU^SaTy;7to6h!QHjB}cExWnvbspUQ{1WMV$#{B_!Cd_2PqqkxTu8Gp)ro1 zV4w)opP6eK5Go)?bkdw7IuJLM^6tBHbB94#J-xo3HY7_r{=pm_EJ|FKS!+pz7$f;L z*B%S-?y7-buTeJI3fXDJblD9>78e8T6dNP8yf)#!-)Bs*a?kThP6*ye3L{Pc#(zpaCr$?S);2K zIgblT%y%#&D#{o-=3|YC(J{8!%T|b-dhii^#Ey3j(?TGB7JlApSCqZLgruTgK{t7t zSG7Y4!7j_!CbcYt`=rI`Q`gVB2TgfIr24JIIzD1M?yCY_yH&0f`PE%H75l1McjfVz}JDesVbbuUt#rC^^M zojIYu$7ggz*@x)?#nR^--0tkcJ7(ZR8YTzoTVF0Fi|R#|yzi;s=WgMElUWV#fALSX zB6xO#2WFcTUl8+d5)f`b{wM)ndkdG)S@cS8RD;C|T0!ZbF#gm)LJ?D$ z4FttnkT?OwB}7+w+V26!OQ9J-Vs;`$zK1n;4d9OVi}#$M7cabiNX19geT9hVTbD}^ z-rLwS$anK^qOoo5uXPim?x$iNYM{qiDDt2^XicJAU-{*_}_sW!mm zY>GyoY;#QJ`CALudJX)T9Du19VHEqcI&?J@XKY=qWCjP+MCBLFg0)I}?ry3n-gOxN ziZ&Bk3v$sjd%nzU510*GeA(N*1r zC-zaTSDH~adiV?dka0tQVLtulpJ~4QZ0(}#$oM$kJ4a|YT~H%`8zTgqRq*zkH7j2! z7r3Kbv!re8S~wP&G7n%-%RMaO_~rd$tc8B?gwBY_jIA}0-HPG@N}o^*9ktMT*)TCa zn3O+c*&lxNWQC~ftaI#t!YJMSovf2WvtKLYsw8c*_L=> zreJ_cc%wD!)8TT)7muZr&w=eQn;FJQHM{W_F^*^@n@)>!+AITq)$=;MoNkb>X}w-v z2VPkp7nXuVU+=vhp3a6}^HjuqvMTFZh6wj)AOyO)CeMT5mnA||*BivSn-B*L{}!2DFRL-tlxp;*y- z_akFTB&)ND~{~i7OE`A~AlF(IwaKnTurcH>;t*teH9q<$@g# zUt|2)eJ08?LBd@0CXEU&snORqA%cGJ+4S}{$*#eD{^%ii@eiFM4)^zXk*I15x%geW zHp1H6qoA6PtUqE4MKZB%&ei~Hc83q1@n7;B7FB<3K(fZ<1QLieE`RhDiz(#BdXAf0 zG3B?;wnCbapk%BrO*1uA<35ojE3^#HOOY9bv5fI2gB-d|xFg_dK7R(uTb77wX^=EW zuBC|m2MZ5nN1zbTz12odg#BfXp2D4IuOm*J{v5}55|agd;`EP6$NyfI(Wy_%cJ1)b zid=AKdet{ib2r}7YtIX6-i5t^+Qw0a4!^GNtxl~6Qm1lw8zSQc$*9X-jFMilNz$X@s8a=tJi0LzE{b&+4t+j%$;}1bSEI6&i553SI zH!*oogf{-kDNH&~RfsmgMQnZ`QM-$gK6P8tZ@?tR@LwdZ)XOuTP#sH&nz}yn2ifoze5qM6-DqpGh9k@M|GYif& zMNx0*V09hy&#v9C`LX2s6B_E`^*nI2S2?v9F6|?n#&Y`rYIb_$p57M`TXeQLVkfeV zM6slMVFd z@Rxo3?JXKFd&ch7yfpE!G5d7o`|GgJr>aI+*VduI4Q;M0bN?9T0ob=rJ>k^YahykA*{Lky#GGFwmV4X|MsE92K|eC|43nudU*-ry9vAZ zds!iS$9=oJDY!Ajf9krfGkDl`ia7h6$5YEg2lX|nGVtya#dt)Wmsyve+1)Y!OgOo+ zawd&wv53e%Ltyp5+tMUF?g}?;SVnLBplwt3ic9r?nqSsBUM$W9#3YeBM1^Z2+ZZ*a znO6hIyHu-He--xi4bwEyA@eruKl;u3yOpj?BGK&PdRmPsMbTA0l-PQuHHFYdwK*q( z0`IEL7epV8yobZ<+p0?(Y+E`7je^7axCwBRj&wA8g$|wAZTGY*@jmiRFq-LtU1Y6G zabLQWL~@;OTPUu7mK_-qqvYnyq+wjpWZHFOix6J_(~lcw4>*JaZ|jbr0F@wuLP9rp zYrFHCvS~hY3dF}tJ6^Ec)xt#DpEeX-G%ekSJ!&i|}fKgaAuLA$rwhoGBA z;xCs;U)|p0cbpoP4!zgtk83wyfBE#n)=xCB4tT+~$vsmlR*+q9vkJU}L|zg^o}`gQ zgkQ-88~h&n|8u3z4pEK3d}_&@>)5MNa?RKWph&&NM=K- zW)VoYU#O02)?+|qLN34u6fb1qJA*?jm(vrC%0@y+w4pY))?xxteAeJlkU~ngLmZuI zxalU?Vuwi-A=Aj6P#D*QJuv&zu;Ho_V>F|qSd~HYye$BHlT0Z^V*{~r%7~=M0 zE+nD#AKMotyMoBW)yiPGqUBKS5@u8%N0~JPqqF{|$s1Z=F3I1|hjzVz-a3JTf@*lc z{<5L4keQSG-{Zf4g&^MkD6=%hs)e@7HKW)5j)$us|LMVq%pAo_HG>YL-WYf}|8{?K z=rrmvgv#g{bZmIvF80ixY?9RO$)Ze7$akpz)*R|;0N;UtRga3bC z0JMT(F%V;oN4mcDOkA14fv|PvhNPO^V zgU?1O?DnU5>*dD;>yR}Y(lH+F6XQztGn?5ug!AWdbGd!~-(N^n-MLkLY%a)q`Y{T9 z9*FSHyzz1+;xGA*&CUeV8gwp&;*o0vVIx-T)?0s=%PwI2uC~UPU?{dL519Ifq>_9V zr*o1M)lfoU3e@lX@}~&)f@^Bp%71nm(Ete>ySnkSIYJGb{i<^aEScxLT4NSPR=p<6 z(%a+4mSn=cMUUlL%X!ZQ&fr{{=@&!QzK_I4y#;Xy*6$k~ouy`(Qb+HG2eu^7Y$^5_ z$$`Pf_p0tQ8AZ*kpUgRvp9@O(U7WBra!;IS{<=>XXs{e1?n9SF^~nn~wG)~QD+WW@ zGFh972=nx&WoUeP1cvRVA+_GFH~aTEuGr|{8k#H`dVND&{ALayn1+rTI3a7P%MxnzAjSaI)|qg26M~n}Pv@K-E8eeZ zUrb(Mo?29oB+~eZx-;BT%}>L(;!5#mdKb1i>V9e@IgBaOtX-=SS1E|xODmRh#9P%| zrn4|+1ibLnZAL+k&6+mseoz@Jsco2Ray_R7G7bN9VB%lkB5zj4sv7vpF=tiErK{Ii zFA76n)v}3Izr|isSV2AG(%MFF;*uLh-VfSXH8s;*f6v#-9_X42G2Ra38aQ^%dn37N znhWkTzCOqcSTfHBxiNjQImhlh@fT9gje^;`=se3 zR8RsqaqdT~tf*WQLGA2LQ7M04-B!>~fKdwb9#3Gpn|0xBED}dC`0L5f>3yOnN3Y&l z-wr8|@lVE!Ve}K%MD&;XuVXu7==Tj2!1Yd+d zbnsOP-R`w!dd96M*oZA?vUNkqd;img(Q)GYkkUioE6ipOw$*bSC;-H~E5xIYeERuI zDKC(AexmY0ff1R0-k^bOmAZ~MyiRo;ji#GsoC=$6`SupZScoZ*{dfVG!=Mxwh?9!Y=Zl>Uvw? zGjSqhN9|IJ9wJ@_CdjC9Kkke`^fioK6Fq5QP;5%Yl^AQcuL`(HBFD+AELo?i`9D0p zRX`kFlr`FT2o~I3g1dWgcL)x_-Q6L$Cb$z^f=lBLjZ1K7+}*vA%QrLseW{1@d}`IM zwU^wni79))b)X&mdhhgGWLuCf9{>avN|3WYxIcS~j$HPb3AiZ7?a)TyTTDAw{z!3w z1<{F%VkpQvFr(2uZs8B-6Ao?hX+>_M8zKAZZq@Z?8I$EG%>qEoNTZ>^cvZS}74^p5 zgUN0FHMEpfSb$p^>$q^x_RfJz_Y}n9>n=9J{q5zdnr25DtEFdmeRAudqvQX)p0Z`M zTvc$OpLVJo$t)PB>?U1b@34&)fk z!i}PJEkosQQkGFW;+!}+*#FcUWoL6M`=`<2Zt$LaAB#cIGr!DP=)JAbS_GjOY&?@a zl&$k_EZ=W3x*^SP$)vAOMpC&V5qI&H)-q9HZ(>U=GPoLFwe%WFIMlj2VQ9v06f(qW z*E@sxXUkn$1?>Wi)P|t($-J#X!jH~bz0NyL3q{I4QKMK6-JMm6>t|uD;q*)!!3`6N z@JP{XH_-N5rN<{gnp$prF+JSchQ^AK_`EE46NuF-?S8Dp=)wK$L6h7R2G zzQF)IHSV_yc+KpTjxCt;6g-vwDwXOK$||#_BU}5BQ8*)U3ss<&1hQ649?}V|JKFsc z1|{Qu{z}IfOO;EZYYo#U|;rLRdF@GrT z%CJd&`cim&@@p5WL2)RPGX9`Qsyb5}mLyo z$Sl9w?AT`Htq-3-R#cpb93-5KHc8gn^bX&P7x`!@+Cq4PEVYleuJ_wC)^88ibxlL4 z<84PdtCno~Meus95hGbns4L|w8w^86l69-qx+x`_i_z9#e*LPHq`S?f+ZTK&G_+z> z-no+r`P+M3;n%aB?|ahmS1e=BelIJweQFE_7XH&dMS4;6@pz?J15y>kMB1VKaXDR5 zh|CZAFz$i7QzW3(U?uhCv{?wHkQ6lLl)Qq6p!P_o1LXIJ2QO-H5F`qALuKk2Tsj^-+eFhbsPqZ^P|KZ`Ass|s8S8d z)_*Bi_+O1RGV0UVh=e!)k^Dn&I=*Tp-jtJKi$IX~V4V}z(rC9RmriAmq3XHt{hB26 zV6)O4`s(%oI(&$|Kmtz!NX{c-?Si`=D-TvTW+o%-f=|1_zJdZ3#Su>!k_`6Nm7EGF z*!`UaZhy>IxT=d+&awGD(2I%KY0E!MdWPNY=!wRXd@0j?neO9q@&Bed4(x>=0}Mwf zsi=8e9@m)yZ2vdqV!P?~Vk|FE!IOKYslSLX_6K>;;xwR-l~!xE)?Kyl(m`;un#896 z(wh;`8e}JA5oK_DDBt#aZVZ6i7`PVrMD)zYx4W^>6$GE<=2LyiyQ9p3_TF)m7I1lS zefC6bUX@(1+FdTlh!$DnW`y?)qKW%)e3H4pw0za?E3F*nkR#tNF<)|KJb`u!^?4os z5xk7W)ZTi7&UyN9y5f0ytVJS-b_N%)wEi8MmoUPC`COqb>#R%R8wi3GEvGwky98_X zBl8@($Q=&p=2*-_oA=}2$efkmyY06aCBICi5Yv$q1Mf@?vyz>YGhyU-Ot(JsBdr%c zonkAzV>LM17Y-U75ioSeme6Ah=}IWNU&l1bPOy2rXz{79k$Ny|H5$)(*+i`!%-oXxHoO%cgU>2tDI(uat;&FJNWK3`+-E@o%v$9&>u65ycfR^Bo zFNyLLE$nKgAmI^)$ea`OWtZ;6JJ$HJ1?;%?G`*NgToBJ65^S$o!FxTuFZrh7fq|!t zH-x5>P51GUu9KYyUDpU?J z#5q_0gvG*&-O?Ij$k9egkA6z2r(*nG!5GSV#CXtum3tn1&Ub=SBWQhHi%+@n{q)uK|=BIkmWUrF6Zn zX*mlY&0AczDf~=v@fZJfsT3Hpy31-gL?Ct20dW>NhuVC7l#%i>^Yo-#8q{eFM9`dd z&=+>I9O2nSKu#;qQqfJf?rtt;D8^e>Gqe3i$%Td6_>ne7zA>=JLS^+wQo3o zxPyp&L;d)t_f2Em2a$J21E>9)Ke>S;^`^QGU4S@-dB9a<%!zWt3n)u4;02u^jp z-wG+2OWGVFCQWLvY+;#~xF@0rkI*&C|=VFd((sH>9DErCI%C$E%xGgS#we zdQj0X!zv>-k@$fXA%{pzLwI>46eMCN(V_lE4?}+=(Cw-qFG7uNUmy#>|_De{J$620`*VOYFU$&--f3@ zb9WlRj9WhptUoNWRmcJc>kdD8BxqH5PV|ztsk7oRqz`N;#_|TKR4#W($Ye?zyXaG{ zzvYCJnj4+3HTGmNd+Fdvgt{AKTuX3$Wf_Q;q4(Ia(h}?)`K*glGbLN%wN{rix#)a{Mg!8|xe-oW$X!V^vW$npFKo7dtW{y$I(b2$e;*+sG+YXFD#R~($ z#rCmo&b9rb9(0u?*Ocj;Q}adfg|t@v@qGvr?yUwUnwz^e_SG{U5*e`Wy6uuX-ps$> zLcO^}Y1x~!3`m&k*4q5jk`G-qA+KIM&@Z9vUn_@ZY6a<*Ie$>YEBYgcuhw|wdyn}7 zuXA1FOElf-e%qc4+qC=*-Vm>QQ@AXf3fsfVqe-70Czk#;_@Fy@EEsLL$CJ1dNm%<< zKZ?e9l6s^xoK=cZ>A{S<=~%XfTmPsi@9K(*U4xaHlOtC%!5rqlEo@gtbNU(BXyi)G^%7=0|+p0Gk)2hF? z^yaLhHSBGkaaD|m6UJZQvv5|JqGddHETt?=({At1?1q+M&4$D>n+8))RPMOMz7)wL z85jOrfbw}6GwPWQ!J4A)Ai9x9>qRS+Z-PZ!0y zZN^zhc_K_%QgCO#2vi`|-ouY0ruw7Bou!ME^u!qra4{s!p2#h=snuGPz!7moOkNLh zQLNDOi;6Zbsj6Ip$x-JJ2@T>O6~}H^p&=-o zaPshHi_wWYSEc*Jm>oF2gN0U#QN6-O@Nw4qbUc;$Xz%_aBFiD zM3j8HX0j9_gD>=|7~(RSGH7zrR(QGjL7O~y9)B`r%%j%+Y% z0l5A5CwA_ojft}p9Aw|k_KQ4py<~ZrBT-3l@a_sn|_gS4!OE_k_5)5 zM1LaITXH%`15DNv5++&@f*y7#3F2f6tMnb?><97NYF;mZ-CW!%nd;Nuge0A8>_g)i ztiGvbjW@x@%#WHHsGAvH0^2Sy6)&Rj*^uGYvRHjhhdFZ^Xn)4t#<4XR)U3WeH}Psy zq#n?aE^e=g&ahV zuolm0_f*+00cczz$n%9RJOoEbL_Ev~}t`sq2Y^_odwqqJ0exezu z!YA+m1M`q2G15_4S=hHy(_Nq$lIOkeckwIuT(CUFJm(Q_u-i&vLvJ5!#x;3$iIbR& z&d0smW^>Djbr2sFkfhdh^WDR(ERmlacDMxuv@>w@+@xKUV8H*{@$R-Nx?j^T?yI35 z+e#dgejwkBMG7wK*M(%G53GGuRv-wpnNA>2f5hoHW;F*af=5d@?wzXl&f4Yy(KP5C zrX)6^4Fu1F$BbA-)%i$DU`S4<hc@dgDVE7RPxxK?Ip zez0NX8Yd7UdrE41a0k>rN78t(z_NzNM@K{n;!Q84gZ`u5{tzifyjZM8l~n(0RnKe{aMqQ*N8$AB%&e8kz(~CX@(Ep7`{z=@lxP zaDS-`OkKY3CMH%QS$4)18>|9fR(~!{gw8C?xS+z;n^h8wq-cB%I1_n=ceyE_UiP}( z;3VSAe*$oE+E|3oAO2$9%lJqaOk%OMB2?e?aDOjs#!%XbhwXRz*ZY0Ojr;1%UBSOB zS6SHq-BHY)n9TX~r^g{Qz@xb?fw9N1BL1wSAHNcYe2`N2X3Ofw0`MD*6TE3l7&TIK zdZ9P`cR2&Er|odRaaCxCLF;UQ-};7#{eFn*wNL_7n^4F5!RuG4r)y>pUy1Z#_|(AC zooe>%3ikU*PfdGM2BG!3(hfJ)?hW9D)(Y4b?C>6NS_*nRxWkD^7q+Pdo~Q3>Zne- zk5iH8T4FL|Bt%vyM@hV5dg|xfHr1Uw<_7VA1S<0|!HD=F#J|G~EsV`vr& zjks}TwQurS%TW>9%5H%bhbe4Qf$?o)ZOaplBMKO$Y2fqElyW5oWp@?aKfMH-6->4Y ztLY_LsEV=d6-Y%oWGTb#Sy(e-=21BEQRKX_CC8&0-?d3y?Gr$jHM1z*-U!|o2FHPK zq+ZW~uLNj$SmP`*nqIq@#RNbCemdpqJQu~S;&qkz%hTZ^h3CkugNufG0QO(FzbSlE zC|>jx5sxnwWi{EUgmPmaN~J7j`N+$C+K7^5-lDi1gA6L+-|NWl9uq;$|=~m!N)7 zP!xV88hioMM(}nQs}*h6tL@TBDr>a%@|qarWp*uyHidjuz#M#|b6Ss6XwYSUR~*1BZmmbgS|0Yf9OdMt-QZU+l$*caNQw_?BXVH{1Jg z#aIh%iIF!vI0A9Y>r4b1jw~@2 zSnyuz>w`a{S@(0tD~EmJnR)r6P<9=RXUB$j)IoN6>qK;{nj?qA>6oG3$n|~1td;Zv zUJ;n#kZz)kibTI_vZ0iPuLLGZDY;%E3e=aPZ(Dr2jD3{JRGJzYtD>6d8D>!VR(Phj z!Q%oHaSZg}2RCQcjzfC^g@R;lXy8geQQlN{JD5f1JbWfbKCNcxJ3Da0Q9ECfZkEnl z(1 zoc>oASmP=%*7+F>RBA}YQPT%+pI6=piA7eIbi12&jC1fYHAn_72*=SQiV*a%{ajt8 z-Oeq@XC+-0y$JNQ8B+&dOV5XxcJNNKDW(7Ep1_;O5Gj0rE5y6w?tJrh z2YqYvZ1wWo$)a}mOHVa(K6w=v6;^compinzd%Xu-;ZS1K5zvFM7-_5N9N~?v$6xd8 z;X?w9`V4q1&-`=9*=zN25ag@N&{%?TpI>pUo76ESIFFv&s_liUi7~%0X9pdS1%6QN!s7};@ttcx?`en{@-e$ zS{FWS|3~=wZNFFb^jbsPjMWg535quwFeQ(EDYvioG%uyBEvzE~JbytkLQseeWg`dA|{vLVKM? zySm&GU-v#Be!Ily3t%sOsH1bHv&r6V=k_i8bkfX@AGX ze|-K(aTkmbaQ6Pf|Msmt(_ZDzerfs{!J;mXgo8d+QkmHBL74P8DT#}vLiv^s%NZc2rd z`gbKQ?GCkp-+W2&u7_nMQQq-+&0c7MdtTv&bm>(S$UP;PMGc}*(25imEZZVjn1kpG z7{)ROQG&`vbfywOW4T_Jds;jKT06(kOjH~eEe7JbJVJF~4R<*(o@%>y&in}3MT{%q z5!ZU7>a!vCRn$N*Ook4PMmAL#71AMBq9NH4oJ;`$mMabwS%GCLc8A#jbE`~(H*4oa z;m%jD!@QmRcjb=#cgmV4v}=OyJb4Hw?!9dM9Wm;OEzv@R!U=WS7@BZ4* z`kkdA=Vp)aA+gEI&0^3ZQ;GfVW0XXtn&mB_DdT?KADaX&js* z=xV2?sL8?R6T3 zcBM8f4dk0rP#3Esu!g9zXPXW}psY+0DUG%(ZDmAIo5vtv;rJ;I?J$F*lT%2p{}ORu zH6*hH(KTN~vV%+wIFs@d?ZGvgy&P#iEOwJT^fM@>F(q86sexr{q6vIwL2L}HvQjX% z-!P@{cVB(Wi7&%y>j|h;jBb8R1P-D%iE+rSKEFg7Q~x;ARaHx;nWIozp}eP2j#qGY zIOxB~7g)&;(g;oCWthiN8grG?Vg0;*vp0T(&iZ9P%qm*dIm#7<>~C!6+|M%X1Q-7_ zx>YF9J+kp>#P@H%I-z4359f1k1LQ0$|DP7%PnMuV0?9El_#Yu%;Oo`;yW`aE%w*>@ z9s}6@y#2;M+0D^5%~NEfiS>+e^KZiYCHs>>AR$eWv+~L5fkR*;FeuprO)*86y`pMx z?Ocd|-PO~obEf=(pa=3XeExTH9&z8dPdB^p4h6<$<481qd2#En6Yw|1)Qi?pI(rjkQp`OBH_iIPGHD~aTYrz`^ zrh%>`#?0LnPncI)pS7;%dX3X@)iNn8ieSFw$Yip{)q-DJE*D#V@jS5@K@>^$nrm^R zv1qwmo<4_Vf7P&%>05EwEl&RJpGsZlwBDsiMgF-0!A{31#9F4@`YQ7X2DaQ^1XRYW zc7k6>PC-clUg^;2jNLSnfG4|XodLgKnZGtvN-r09N^ncvwiDN|1>Za9SH0KEE|PG& zMoAhLc}^>^NH#0sCThzGi10If#mJFWkSayc{&|&TjI`soA}Ynp*haJ$Is`AtH~&=h5X)*8m;#v|0Ta%=O??mHNuiO~ zP0m2v@2CzuSNPmCm**Il55vILa7^#yfiNeOhes0rFy*RnnV_yr6sG86q07Ig{FG=N zZvvfZ>j@icJ0yTNW_;y5VYtmWo^`+`gVEFHleX)pslWiief7L&ti0D#%co+aXX>uY zFqX@U_t)-&hL1BqAi(Ic50^Jb=>uzwwi4d{i9C-&ZfC?vN&PON0L3^iDE4ZLMRP0t zhOd=WOM}a`nEZOC`mu+8(*Z_tPXYLyhJ6clgMA!KF9@5mjeZMc1KK*DTIop%eyz}y}dvgmFRZZ=LU*p;j7R2-wuzALdV^s!HipPOjefGetG2cw8Z4i2Vs#6TG$heaMcMlH^{gd*GzqFQjn+s>+m?|esZ zTVNclj*A}zo6gL#20g;nJt7{IyFlra<;qmZ#C#p`2~)zK(!iMYkPaJj)!Oy>3>Pbsnpf~#N!_;=VEQIR)=A3alHJEpu0$&&;Wto zkv$Je1D{Ku!~+k}u9l|)aDp5IZnDO2#&?Dirbr-B%6=jL9qh2>Jq~=Ge0zJmGTrwk zNoW-ccsmHp{SVfT8M@Ifiz($`xm6#9y}YKR;C#h>?JNy>^@^p8jC(60^ng+Vwc5_U zFkyGt29xQl(!(6+iERw;_kcqVf87go#yD}S$|M`yaOM0kIq<{_efOmAh33msXey#h z$Hv9`#k&BBuuslIuAnI&K2NEwoPo?NG6mFh+m^(nyHu8zH2AGW(pqPh8t>jQ_-p26Ps z_C+QJA!J7*mlqkRl-b#?>8n>y5DLR1;z>zSshWEwIS4C z%rSnvo=3rd7JnlQ9@O?7y4%kc6s#fbXWD%ZV%Fnvh*mIZqoK|Ki)8u4Nh|(eXb2La z^$NdVX~UO8mRGc=KY_F!(3y!MUZ^=2t3Ab|r^?JUXw+III1y;=s_q+elnPK~WtPit zM#o{4_V`$8@=UNQ!p9cPzVU4Z%yzK%^0p0U&{_Nipb5Xv&jcc<@WnYjI4sdG@IyY; zPOYpGe*h_um)6Gmj)HUt#Gj`!efiTxD$w{?*cLNP%t4;;>iQpxE(CZnV0-H` z`sj_gW_f2fdb>^w1P`6}qOTg{w!WsnK8^)GvE0mxyw2`y{D)Y1AKyW3oR~T94Nis# z!LXhzt##XfM&(D}#Y$$i&a2#LnCIHov=_O2LUr9!2X(XxwepkY&J>KRuufD_%~vHf zeH&xYFo!v*uZsjsBhT@=714N=5nOVAaw$Z7c`OZm4$j1&wr4#2;XnN06M09tc-7rE zVE%&6O!BcHJG;2N6;Qrx`XlRobq)9AHF&fS*Ti8yQFY=TrVm{vcXGbg~BSsx;)$4kCfh0WZ+(LnpfvRi~3G3?hUgF(bE7N_k zaP-cgc&I$;k%0zt`Ze{iW+U|+vUl{2)Ys2QgP$Fy$|%xLaKQUY4yc;H2V`>_*V|op zv30~xyA@gg5r-!`VKlxS^ze*k(aUIM!O;z>TQDq1a3p@A(;NI& z*&bE+Gp5Hb;869TY890{m2)F-bx^a1!8TeZqX;9Wh_m_RfCRAqLEb+4i*!8> zvRo^_jfiY*ynzG9N=06et{|Qp{%PhqUhl6DQ`$X_fe`S^CEEL?*Z6;f`_}2*df>bN zg1dhh{^^bruM;nk;Zvt(nYpQ3$Wcu9T^?j~u`)gnLd@>a=$;$|iK~&OxV^W%@;3!s zn7nUGtu2=br3+auZy!_%b{h3M8fBrXXl4ioMP0~AnFl{~-ys{Ve>6JVN!o8wkg^4j zjg5WcVqS#OwpK`!z{%rgTFY3F)%6RvO^)JH*EuqfBlx{Y0#2XQ3Q>oi(`YWipSkar z7!?zyGINjS;*dZB;rL9gR#CZwk!RjJH!RPE^#?_5#}4`hr+>Dp%SF-`M5hrvvsreW z|AMQX{Txlf5J@P@o&>MniZyIjWDc8YmW(X%*yNLJm1M~-_dB#KxR~w8;ndI+fJjDV zfFQ#$`}ibgZKd7$b3|fPJ&1)WB?nC$O z1vVU`D2tNdCvH&5k*Xe@Pf#9K9@$@sq8M1bx)}vBch?MYP}(OoZj6GyK|xH-!9~6* z(%Q?AB*Eg;Ff$g~jv^PBWDW}Jn#G$Ee7FKVnT?27-#h2E`xBLp11fH&{6@b4y_kOj zReS+FrSt9s=U15({4$(`-qGI*?smM}C4cyZyZ-vfMLU_cUoEHZxVu0z#lIi{ziKoZ z{RH^_jE%P)wy`1mh!oyM&nv9hA*yxxKXB?IKA*(xew6%gZjydE34E=2>g;}a$bEfv z&4Uola$d2#?{)7E1)L569zi@Ge9+5i&E?|TiV@5v+FP&4@YL(-)K#3L-%sU$>m`f5@h+*%m32YEC4&$LZyt|xkOw4EGH85@cd)4x`rVK-9 zsi|lDK20buXf4DW*87j5+pmz$ECsGvS0>7gl(`f4@KHF-&?d#-giMNhG1TRx0iTOh z^ptmkd4DZPQUP|=?QpF}E&c}#fc{kVtk?(4o6LIL-dfvF-72XCtny8!qWKBhlP3lfv9ioCWAuAqTDwbjG< zg_3UB+ji3d*I@?aOb)l~^#nx-6`8Q0}NSItEW-34@>BLemY zJPX@XQE%n#qU?)#a1&qhjJTVBOxN@v%MBdIZnw@GM)F%sdWo4Pxc=yFwhT!d}C@eW`D?DeUg-a)x&;gDCTMq^O zfR(sl(ZirOdv6cBx-XlBPXUcjFmy2Y>Mdqt(;T~ug>U(8N&3}~_%zRMv+ZnvSpGCJ zhXsp1ESrMY_vDLfGnV;Arv3Z8`~xaP0)IudSeLak8upVz&xl_d;!qsD~-L&=a$yiUUWISow_wU?9)H? zi$rxT$JEBQs1Ul+?~`Yct1IFUE*#?aa@PIY4E0DExSNpu`i2{Lh5Iy;_aX~;TiAHk z+s%HeBZaV4*VH_j2A(EddA^@-2+i8O-UPl)J^lB%p%l5M)YsR)w0s-S`^e0V>%J0l zOu!1puE3jXf(o4u%kcbeemFnlvzqd!hl%FRaD~Yhfp1bVXUG>Tq_|A0MY!`5d~L37 z`P|6oN|Ge=Su8%ONjXIZN%kZVq~cS#Wxm%T<{H*tb%o;qGFTV+q%`prW7n)`~k$p4GO90Cr0v%cj2PZEFFV zKYZda`hQu-#3pChQG5A*D6X2**j4E_tJx>NFwiNE&;FiIbt157so(+NC27{`G;Vvc zVk&X4e=_|oS~W-To9@^+m-i@2&~m?DGn>I;d?@{s>twQStve0aH2z6(eepf|3B%mu z?vKxF5RZW&-Pf7MUsT%j-u}}-TR1)_E^Tt9AmF||8>&9fzPc`-x7eP{9n2`T$wlG} zW&9EO&=cGD*(`ezDZVZNe%E-X4{26sMVQC!0Mcsgu2UthMm%1MI-iPNu@58J^P6J9 z)gEHXc(Nr;32QM{?@4H>#DWB!^J$5jS*Yn^%F}e)IA@TFLNHp1BRTOjOZa|si%deT zU(^y*(?hwRX}j>N0Ms>Sh*r@ZrIvNoo}f64welW5#U@>lF^^d!u*AM_n^?5@UafMt z(wJKcl? z35`eFvHG`V3eUQ?#KhMH9c{H<;(hf5_Ij;&6nKNo5*B0wLOf=InJ-rg7b=w7<4LN2 zgK_kUnxm6v5H;O!$Qs&Qe=UHsVzsfFny6B3isr`c9(GLsll(m#JvvPcbH@)+ez2cFftv^cL4o&EZ_DooXNb79vDkqMD$z1A%u8$2wmg0^yPbm<=Bq^VN10tWqT4cU zXp4@?0lp70ugCAqVJfj;#*MSQ2h%C~?6CF{S{QeK%AT6Qv-ho|Sxn_K{F;d&V>i3f zJ9P5j&IJno{;!GZ21k0}?{_07#srGoNf8YxWsYfX`7t1S#$$i8@J@R63+m0caxVAM zhDH}k*6hlfRM3OnWK}0*^xpoN`G>6{F1RhQ%HLXBvl*V4_5S9|Ga3zgNx7rE)Id3o zV8V>tJ&At;B;bg`M>CF@T=88;VCO(Dd=KekvR4&(iSR~cj<>At4lWN1BVwjhh(99*W$Hjw};UGwHZPX!=yw1X$g zD!nzRptRMcGsiTwg;)4b(V{Hk=)}#LF^Y;agugNMyUyW{t4=>~leb>^y&rO^BN#LX zY!#?$l3b6yvCLL)xApTBi<2Rk^wr(Co2(F$cM9y5*?G2>eE)5&eH`Mu$7=b}58H^h zOE;@$?(mSp{Ifjh+{D-?BAGd*Y+}oxoFGBIARSEnW95uB_JNEY!@M0gOcgX#_aV%> z_`l8mLKeSIeo2QS=WJteY5l-OjP$TGDRHu!hb2tVq?!OG_LDjB3lmQj^6XM~K-M{# z>H90P;1h^Hkw54Z&9G$%O)n<(K;kf>D6AZ*Rw>W(t^AlaT(i^ zJvXUrYr(Q$oN)2ZoP;y|iYDMEQoI-{pXSdp=PifR{xmtJ=&Fdnv{01e0*{Pa;RoEe&hLbco8~qtpq^G^1Bc8l#R?$*@rJfNlX{kV<|q+sUZ07RktSJz{y&H6QD3o*!?NzcI) z_2+A2Ts{G2`ssZk8*%)ZsI;~H#!so) z9j@A~-9nTmhc2cpM%fSh{BH&9UiI*?_^9AOLqR2|6 z5WHsRXJ|PbIeMC}2}{kz91ph=B@ia0r3!vI5cgC}JGRT=gnrRsc-69xNyWj6gLtI- z!|eDnxoiabUm$-44r?pu8xnarc?TC`#%Q5hi#a9k-V?MMuo(0=%QN%3-kk?!M(C}h z$RLhit_T3`!mRtU7)3K>m153u5}=v9gsf%Y&+pYX5)#1wtJ1?S%^E(&beF?uG!OY0 zRNsRZ`o^u)8k}dt4cS-aI*EU2E}x9pFyJF_Kub``kD+oP0l$vw`cuSq)e^5tmh(%Z z5|hcf?OKulHIKVKOVk?APL9o{1WC=yYSEpHZq>F2KaVG~wDJn?{w(e8-R6Ql)G7jhJa#eN#<=_ZT z+d6H~!}^zgKmk3*q&AXeO$?WMv>Lc*)wf3~+YrxFP0qP8lw78})sPUAcGvBkmywH| z&@v&nl^${G$Dbt*|DT<11p=Yr=jsupzk$d3|iGF0ZYhV{)g9w24?;RXRgdu&?d=(D$Lao>2$%FXYRb+gy@9 zmKY#+Nd}HwsD8tNIaGLZ*#x5Kp}F}&7S|X<_NmASTcLT%XjeXi_=o4)lXni5G)w)w z^_`Ks!2JRB3X#&}0}UpuaJ}r5#864bOvy;c4_4K;EZ9+K z#ppfp3sNWnd1bb6M`P2Dn#y~jyEAZEm{C^gWifKmyL zlP*fG9)>UMrT5~)YOwhq?UZ2Ub!0Ax;vrS6Xjr#>@hWVPf4VKpp9HH1Df356w;+ki z^0%a2s^hEw=i1b4ykcT9bRU;>p|y{KLkGy42bidC7o`N42$wa%fB82&fw>go9h`N7 z`C%Bqma7{+opswZ<6+w>jjXx?l`y{UZ|tyW(BkRDeN-XQW3Iz(N=TV(+`m$F9hLbY zKrLs&)dnZ@f|^$O?1Pv`>tgY6ej6ht-<&f+7I|$?7UOqx`!p*E0E+zWf2LLAlt%KqUVQbWt7{mSedZ*+NJ&9;~ndqhTUaHR{!B_`>7NjD$RaP5-*oQg7 zb0$*>qSnx{3gbkjNX*P6PTrB}Sml_^(Nz=k3{d0BWAZZUA`{K722|?`<^!%W(Qh>? z+B`{s{6-8XQoV#74-#$9f8Up&pzRl>-EIGHkFM3|H+NZ2YV<2+s=0zniY3>VXoC@A z7&r4f*G^8D51P@lF1O8EKQHp96nFK=*1baxmYCi`B#|(Oa|z>=NDjchpf5g7^Epi? znTv0kZ46L(M}UVOG(MQ|tG2eYlLaWNL~BptM|=oLOjU>#wYg=k>nd5vu;JVsS5N>j zu4%oCB`(Ez)itwsNRLYCbJk3iXTK!5hj>vgXz4!@LE5F4=BX$WvS}4)2VD8h)JXN;RB2yYGK*7)PY|$mAyL?NF zk>tbb!+}j%p6D9H{J>fy6OExu)(0Rl0qLgV*#1U<5bUQ-c3A9tI}H7S4&NVWV~*3r zu+bT|4u>^aZ;WOF^)WO-4WoXjoZ|A=Rv@kR=JH=Euq)vOFkb&44X@xOGcyhI5+wBN zrC~`^JGbe4^OfO10f25+iFlAo8tOv%6t$tg@hKs!cldn;2xB(!tAnMrP&n}%Y;#YK z%32&D%Ax3Klq<{hqzCnpwcH#UtUX(XTu7x}ixtJcgH6n2>+(3cq{^E3?L<6>>M@XA z18cO6zd1aQR!hg8G{dA|hmxPw0#UYw+pJF~a1gv@_(64k9ybIIO6b&J`HIRi3;oz* zAe0-PF@29*5Z?`oTSY|ESK)?O|A`J+;Q!MC%>Of)oW-G&$X0F&9zsnlwzqVkiGLIY z0}=k(d#wRh=AI=TnV3x971gDPk9Bu$8pFVMN11>BA{kyMM zxkAjI&wB+0VVWjw!O_riJu1f%2?TIa?2Pb771i|O;w{{ znfRVs9IA&)Ud$z@k0X-C)t0%ty24m2Ay;(@lsea6UlYwU=-w>Asn=K!d?G5mE+8Py z76y>$fWjQ@hd$*E!D*vTtniSm=#Mut`exYI6BxjKs;@ zf2uhsE`UnQosZhZd~VJqZDbPB#;`n5EojD)jDUxmRzr8wua4Ex$=vHZ=Z&A%Ur zTg9*+Ha<{Z$w(qan551+L;p+86oj+dM@6BF9>eV#Qjm&1q7cxd*g7MvPx1jbPeFxU z;Wji!cW9SNWB~dEMH6`?f^cPirmw83uE0Xd zrs{40Ya|Ez%zO{Tf5G}od!RFvT{I$B>5!(lCE*XcyQWR!_asD4n1(A*dqR3O2Cg~{ zF$NuG4o`Tj`4lvF+|98)n^e0p-yqV5jS}SF$Xz1L|3J0ckrDza&^|(ic%kX?37Lcs zz?RQ=aGs)Wy*}douXa6ARo==g!~lu$$F^I8wDLVd_%N~Y#_bxyC0OeTLi?Ls3-?E! zS)iVVi0EF%xrODu6{fVL?uCMMrgoqKeQJoJo00Uc{35_mKtV&$k#VoQa$IfXSU)e9 zM~bY@T?Ya4d5$-qA#24}1ZszX{kirI|pan;c7<$|#XgqwQknig2gS-d-4e z_BFubJ!u0uFCXn&@elDTXI`@M7I=&|)`c?^GtcRkMWtqZXD!cnEJ_(0V72!zq`r02 z0q%T(PYCsq;{BtbKk4|<5!S;dV)g3o>WW#qUmx!(&DB>y?arEZbS3rsK`Kcq^n9`% zB)VeyWsZZ6t6}&&{T@!4$LSUe{|@CeC(DvofYgBy*=iN+WIq=E`98MIx20dadV0gv zv+C^T7lDc*|JCIscLj%c>!0VovAf|IU8nZm&RnRT*F!dzkkg)xaCzyWbgg^r`M6ufvSmK~kehI`UCx$jMQdTaS2c1k>bXI2O~JaoIE zICV30GJC+^Y*}RCy$sy#jak^o#L!ye*)u+jC&Od#0F;<%9e0NXLPmVak_8~6)`?Pa z%b-M&VmL=5FPm&S?t(*rs<{&83?SYs+2_7f{f9$dCn^foMBRzT^kFCAxXMOC)rb9L zAUvxHBO{@HIbao~*4MX=*Mp9lnVDI8jEhvzJK^b%K2dz7t(3*LPU$*3MnwdgSFZ4< z(&uUzu>uX-p)TtO!O_I{M%T)Cj9Op&&6?IMbB2*{)VlwVr*B}$G-|i5$u=izvYwjk zCfl~3Y}>Xy*|zPPY}+=z&ikJ8{f2wrdtYl^3oMFZL7+o$idQL8UQl;S&!tEIf=1kH3d6tcp9_(d8Z>pVm;I>Q<2 zg)Vj2xz)Oc)g8t4SH5UVxriXki03$=HJBK4Pn{ziBg;U3zoGmeH2W{0DO3rFDd@Ul z%!)QT3f%h6ldDE99_GxvVBX3~ zUnm5%H66HT=H%ZedsElpQ6sw;@%zt1H}*oV`3^7d^_ZBW|Ajf@rA^}G213~BiB(@~ z!wUCF4@224T@UV}`UKPDCe%>~F&pCrZA zAQtrA7Fi{_*x1HZ6cQ?fGTUt*u0iIU!FY7=(=L2z`}(AXY;l^!D&ECd z;-l0lq-DED`#3(Q+6molnQ}+wle`SCpK6gd`iv4%Estd!_cG=lS`Wjk8sTi-AjCma zXgp@*I`fUhlKjx)ygkmEIK_YAt}|#+aGrW;a#1Hv@FS!4}HYj0D4JwJHZNQ6;IOHu7M z#~XFr$ChkCI(=j4!T&v6o44PdqSaI$oPcBI^W+L97D$WZQLH;Rov` zv&y^IL)Tj@$!y@&&DAbM=*SKd&5C2q+PHew3Ub^(UO49|?UO$XUMD;h#d&dKFi+au zMq4btmmYKQ?MtR0sbLdgtbJ9$!H)cFmti0m)^D%@=SYi<6km)Mr#IU8A2p() zNanQH>>7qSmt5=TIPIH24vE9&u^TJV4f>~{yNju_yqM2rTV0@}^2-H3Kawa?bw%@$ zt6Cx`M?0@F*@O(G@q$$jQ{4TCUE9C~Ign%h#d@Q4y>`*ta$hCTw|T;1JxhZ8FUp2s z=J=gVlkXGo?9%HO$zM;Ns<5uBk4$MNxQ&_y!#`1X$GfNTo?;cWE$&Zc4I5^LKc{qn zzx)`h`@u~y&mG@8A_gp^+%BeH=#AGqwL}VBSXv36_B{WW{nB^~B-*Fwv1V-nwST>! zR&RkjK`Y*;)K?pnvw-Q;zPhj3s6or0X~!PePZOh)_?t{lp&cj{{w1~D#yAbrs(zz& zWA0DI{8*LJ=rq6{J5WQeH4ySLv+4?Qhu(i}*`fBmW)J$!v>2%EMHz5dpsu|FKm^NrZ3aA8vWgF9ZFUlL}5D1S+A3POijc)Cc2PS@lU>I4V)ZZ zD{B|y>f#a8^;l&L_C@WcRIz&fR1z-XeQJv-q%Ka=_#X`mQ9%u%1z`nd=+> zH9gAthYj)&1h*}TY%cM82r2E2CK61y_Z`Oig_z$H>9Jo!9wpu+Hdr2~)lYmGJt0vS zrWB*K;PNem@0BOKnc)@CU|v$mA9hl(r!$i%K%Y{i@jslnc_vD28Pv#(_*-g!I}>&w zWcF5}ve*Vb@)wbRX_DAqv>;ORUeDUAMM(*64Xbl75A*l+G`n!DvZRlL_-3^fKk!obaBuOf zb`-!o=&-qgMq8x?vH7n1&+%tmhNYuo#FqeUWkFeu#+tD| z*vgi@MhCl$cbA$mX?7CoEpDIi^KLJ<CG?rJituGH)36o5 z0sW0cVX7&ONX3O2Of1935$T0Cf0us(wA>5eWxL68T)E7DC||@|IE61d=igATKmL2& z;J!_?Od($&;JsZzA&Ar{V}K4f!qvQ$wVaqZKjckbEdF`R&?)ZrW{|va^3i_#wTps~ z|E=<$#|9~;$5_aqR4jst8<6ZapEkUw!90GAemi_hxw%&kcD2Dh*!1qxbW01emvav z+a{f&A_?=)Z|8i`Uj9U;H{RcCg654*h{w1z3~$J5A6-}4N)%P}TidTMZ|n0_3Mg%Hn;%TwE#G!!ajWQm6wb*Gk|1$W1@+mDXm>p`62WN;zN%N4OtyC zfO+<+$?~Fc(HYVv%``ik7gd;}08CsruPoBg-i3BML$fop-Eed_b|zCTS+oRp0F(3w zi<>{BXFQqQ;D};@no%s6jgD8pw!6?QR}PCNfk7U~cW~2h)t06|)6U*rKb!7KPqn4q zO$mxRf-;Yk9aLSOWZ7IiEmoJ^p*-HY8cpv>=1&oyE`w)=*28Kz2FX!FgtM{eQ^v=R zr|vqexHQof*|bL!!57P=ljTmS4uitB! zZDes)k`lMX$<6XY%VbrGiKk#G9kt5dmZ2x1V?#B@hCEep@% zKHqLb8p%8y(QI83205vm`Ei{6`ip4bZVFLtUD&K4;{_|jDbFW~ItR{-g*CN%%7V}Z z$VgpHRH(8sj)h=ai9n0ABN&tqY}twCMnpYKvH|_b>SO1*!lYhJu$UtY05p892dkvT zc^xWDwQI2i|KGm{zPeJPI(=%+`PIJ8B`OzzEC0j*q3rc5%}X&$MWSaWaoJ~0+3gCo zHCR*QtHyZ&Sf;hG%0C2+@O0vKc@%i-5}zgxkoIkR_W4UeYyYOuYKqSfI3G<+Pdl}? z0Xg|gp4iBx7OmFBVKhqWD9s|xqFuN2mb#TYxFlwZO3(iN2KOfjb0P{RWy0r&@(C&f zG6QYKo0n>>XCdmhjjeys`y97%SzUl2&?I?@SL;@vdDJGcbSsT*q|h$y)p&T(HQa5o zHhmJ{GX_ZFAFgvXJ$vkDE-g83tG?`Q+kCO{vHF?i@<2Nu%nvCM6a20GL4_|qzC8Al zW?@N$&nErc^~_d2-zZy?d#T4}Wyj=Auc|nL>)J`vSU0FQj#v}ca&v5%(lp~3=C=jb zYmAT&P1jt*r+G>-Qq$DO0{HI1RQN@q<&chbMVy%smx7?CduR@!cc-v;Hw&r<70~M5 zp!nrY{{Wdg?j2`a?z&PHLGR?-G-Ayp{N<~)ZTx-`i3Re^>^)O!y43`-bzwTw8=ew^ zzr9ctBs1rj4O%CTp)^BZ$!YnbqrM9!Xq z0gIpNe(>hNz&nIg)y!@Bs_MG}Hjy!1lU!J3&0B zM$r-yiKLhxAV|xf!KhTyTHCTZFJzVf)4=ifU-KS+cGs5GAY_6P4qGXoA#=}tErJ)u zFQ_tJrbtr?j{t4LP|Ub~oTy8SN7N#YSmBXmjyo~tKjaR@TU7!}s}ebqPO6P*C?Ucz z&HS*asKn9mxBSp3_c*lelB}*R4fET*YmLnFOPRqQmq^vET;Aikq75P?{{)=dAwAB1 zn|JDNl%C|RH9{g?CLLZwOzXmXXC9`HI;jKB@`D#jTf5oX_TCkPSsNTy1Ps5_>Abar zG5uz706>Z;Y{l+3*Y{&9$dH>BW-~ar+0-YC!_GL(fml0_tfyMqaa`0csMOg>l*TIG zC4t=Md>gyiDoU3ICTbF-NL%0tkkugpbqCxC_%kK#@(l9r!76! z)QeQy=|-GH(E8XVhJ_)l<+eFwBoDUsR1+EzIAR~ zOh}nS9?WZyu+7ZI+LQhu#D8dyFr$k)nNK)b6`669xM}+QN?ZzD z^Y;NMC(YbQqVy*?rN3g){7el1+>WYtrffWDc91^`gGeN2oCN+od0fRl%&Dr=CJeB; zi$k#}<-;es+a1;f;7C<82V7P=VWky$r+6iOZ_Co=~bQ)Tv0%qpSD5nZi=P5=Q z)I16#9H2DW_)059Fl@Gr%^c*P?wYm#=EQh$*!X%X6a$gbDF+-xcms#xU85}sh5=SS9uewv4^&#cXI*m|lwk0koc z@%9X)8v_T`t|x9UcUS%Odzu8HuCcd#Hg)V9y}c1Z<{97ZOc2UiaJFl+c$%Ys zYrd>6K*p`*Kap^Pb%t`LTtR&q_MmV+)EgLHE{7+d(!+%2d(*{wj_I~ef8QvXODX&8 zpK(%o-t7EpMq>4;u2gD@qT61;JzIVVY813O58`wE0JWs^HkiT*v!*!y8=l8x->UWe z>T1NRGwMbx7MPTU7Vo5;Ef+Dv1=l`Y=fw2y(ix*HI@CBHE=z;MRQ1s+OQxftANEtu zO24+VxZ-!pWz&_nl!QZ#^#LEl_~2S-BtEp`o?nC3ur`b$cgbqE7&s3~f7n=3xpvFp z79izUyyqV>1uBH?pM{OB_8`X;*rpsWZhDA7%q3N^1@6Oq(bURy-*4ZGN_Q9ovS51@|~*v#$*dc7RXp zJ{=j2OZ(iNbu|2r98;j?z&gwvUBQY-t7G>4c$w?}`^Ky;+@h?viP&9a*{Rxr^aOeO zB=E|xC+qT`dmsSbij$y1dZeaJZmE{H;EgOe#ik+RMUwQefX9fY$rVZe%B0pWc2+y4 zeFq7s$v5FCNEx))ta37m^$J9{vZI_j4Y;`a0sT!~@xxzOo!%cx3OYpD%B(M)ir1;#BkED`ORQOF}SH z64DL_xo8*xOm~SJ4Y3L&_|bBi(ydz6ft1!mHSmLgm*jK07sL>-`rbyF64?Hd2@VIb zALI&$T(ns=jMobrvSD`oR{TcSz}oO5*6=5G86mQ0l!?^33`#R=ZG6wV58v zwzjdF1E?3Mk&a5Sf<{Q_j9;gfN$$r{;%u9=heP;Jg~Hkl9^X2qrod#5W43;ApYYQ# z+`!@kHt)`0sm688fZi0*!?n!CBT@5dSY2q>qu9oJKxd&IT@aDr#VrbaIer7ZaFq7~ zTQb9uibC-d@qLXWRHZdD3QPfu!D5}@U6NzCXKK##LOUNL0cy(qfZ;2DZMgK5j>*B{ zI(?x|n~Yw3aqdHMZ^X|wNbcrc9A`1w(h3N3|W8lOjX z%1trX|4g>e)4xB>!ur}Sk=(N;=NBQ5J3Y@d2%${1eZZ!Qp1}vP`1RoGv?ob&Qn)>D zH7=6xeKqCScv2%CKl*Ls(m7ZaR)1ef^vv0lYf_kE2XhHVP28PBf-xCjr>`v*ms$dl zwOcMp$n3RSW;fE}h=mn!Plh5sQT#)UuqrQA&L@;I%#PedhL360avS%~;FWsS4 z7}}h!eqCPhZ2k?hgfQr2T~l##Lgoteum~j95yvaZ+~}kcJQB$2rA5@qxRzc`Y)s33 zh5X$l*T$_67i80ZeqM1tfu~ZtDE|it$3Bb)KD$p=xmBfh{Z_cT=qD6ZY7*`bA9r*X z5n{0O9jX z#0%INKg#BB*fDxR@ip&285eVlm8J~9_%!uaS3a8_BaAl zHc+rv$(}a7a{NbPq=MgRiNYsSW=TF`FjYa6ge+o!C*~|W4@C_&SfzF6QS^)taOqL4 z+<&5Cbdk=I?+oAe@n$uar{tszVYWf*3;Wfeqw`{*~WFVS99W zw#mfmx|G5yg_nshMbKzi2zHX(U(|^XU)ik-7ShE(!djo6U0_hANo?a1RmJb_@*P0> z6>m~rZ$sVe3*E+B-OghU!dS83lfw1Y5uWc2ru&m$)5 zK6-$MwFfy{9tSzX)i(-^uFX-%I<4P|Y5sD>Npsbq&w?v-5@|gf{}L~`iShWV*~?jE zNuZ$EPUEfJn9lI6w*O61wcj5wmF(F)H9qjir0O?U>Ub{tm2lujjr$buZso>AuRcRo zO2(>(F5~kTpVQlC?al?FW=oq&vc^n4;^i9P!notVXeRdG8r#Dc*tMu5g|^Qup+8Au ztHjTrlpelEI|#X6I6i<@&)cc{+u9UfK9tgC$dd)zCKNopd)Fk`Mt60~Y%D0;aRQLv zSs5d%8R*+5w{ds(euQ7oIoEGn+@M4840yrKV#p?0X-8q??M!=)oQx?!M`xrP8)u%1 z`=7Qk;EYt(1F^zWoA~`@$bG&8DxY)n5+=wY{CPEUY7^rnDJPM1Q|BFBK8*lS=oM}e z5yKwve5wW1&=6Fgr?)LITd%udJIe!Mr>ASiXke*3#OeX`4NgfxI(F;daC?_`xTzP? zrCT7uIKw~nxShVUm+k`=$Y9r1Y}!7uWR?HZ0yu0U6kd!bIZ#dfPEg2i(A#l)d{hfz zXQ`>LRiq;KH^Bs(F!UCLMh;{oql6eGE$yJVK?vwLoav2sE$`NHAu6S2Lc~La5=1sB zf~?5wl?oA#j61W}uCCqC7O;-gciFR;Q%#;7%P`T?K3mXiwz6Z$Y4vuY&8*U^3ju%G ziqT zW#8co1n$+?x;&?I$|}8uvT~T3=N*y=Muso8S_v&}HQKi`^y$v)yP-=^xUL93QRJ zz{@J|xjDzP-k3^~EWDU@hBqhptuDezIu&a9khmb_R`?%^kH&C4bby6{O{o>F9AjT% zPKUU-5 zEmvu$E@x)_D14o^_~SkdtpQ`^HlPr1Z=h4_Dz))L2?P(vz>n0>b{#b%HZ)Rh^)vSxwM9dKg~j_Bd33v?K3i+I&v_) zC$Ym@92GN!!@*?u^CZ=O!)f2CKUe$1e(zn(5$$Do3Kk}qXN;Qm$IhwSe@%sHdj<0ZC=5aIHI`__F z123OitqZ~b5!kOnVa@k=Sk?(6L|egk#mU;UB4ysD@Iw>nLNoZEtyg;8iPlog^zwry z$n%SBaom{*+hSF~3D04PIy4nZzaKF^_SuNS-xNJQV?LKB;8yVFzox|9wqbh86$ZhG zywjc8)%$dkRgAta>4!P5^PVLv_V5q~7t**NtgueO1)JXV@NpcniAtSovW6=au&*$_ z4tkr>VS&nJ{;wWfAoI$5&Aio0GkgYPFOH5BIIB)UKw?QMf|~&!+=%b5K2G>QfcBlJ z-^iixWvo$JLf3WH2nhTOw^S|aEWQh9AmxQ!MYjbrlc^O*7G=H-gxeUNYO9bMcA=RGV{$M4!Q(4D zt-P0wEOhs(EGT9jJ~IGE3lZr4U?Y7GnnSJ1mc|%-%@zQFl*K+*X#) zz}2&EEBsfw%Z?5EEuGDIalv~sqiH^jJcY?y=&1*p^kwqIHH)`zI*v&m{ghtTP#m%E z@^0?0Rw^PmF@y=sv{Iu{wO5b6YrojUla1+_m*VwdAE`t?O3T!_nskndNPTSR9Z=gPm)OuiP+GSpo##-!fEt1J;!lpDT3VKsh|}c$m;Y4 z$UmnP<4#1bw@pKjNBFnIskNm;4H>pz41dR-({GOKnou29495-Q6Jo(zvg#MbCu#i$ zu5?T;SRo#Nmp(W9E7jmSNYnirW{Hy*%ROT2Qmp22Z2)s443jY#apjs=q8RLD;w4ME z7|Cc2uh8n=P-BBeDXh)34UW+^+wc~%Pp4d0RU)B)vnDgrK`#~_Re;h|(;P{9v-bU@ zbL{c~_y?=Q!?iiu-|*&x`a!IOt|(22f&CdWs!0qhP^Kkm0}<=CWrM?)eBqK!lgt1A z3fles`ARxIjtI|&)@OxdKqGIxdyg>?cD~FD6*39=wBm8`;Nvq9TE_&-^|5nl>VZ|H zq4lfdL4e-h1Vk!zAW<+Nh)RK?w^8@VqqeK2+$LE zbXHVi^gF@k4f=^4>1xnYr^wRyUqYq|lnqsovAQ*<#QoDHj|mWS$j%5)^zbgo&7C5< zlbf}G6c-IOQtR;1CBr$|PlLJf&*=cRxSiwCF)cx{Vw8CsV@Mb(z^@ix5jS9A?CD(Q z#ohZLx^*ouwMBa?A5$nz zD)OU^?kUlUzsMIGR5uQhTDow*qNuLO2}zW zGMEJQ?oQs+4V^Dgcrn!%fm%k^3^}0?(@nGu5o8QjHXO!`>Azz?5PdvwNxz#iko2VV z!hv|=@NGXQqAU-L^Kvqt&xq?;9g%HUi6NNjL6DYN8Ut2Nw6zu{yP7LUFb&?!PoC$j z)>C>Gne)T|-s?YlOsemf!YZuioVo{aQtnvDc4D>hAM;V6^eKU&U8A(ibb$T=Nd_uu##t9KxopRveEw4M;J zKamfOBw_^%a1e-Q|GHAAmc^;>OO+{sFQG_g4loYS4kgY#)hjoec91gPcjRW45ry*o zQzE%-L72KrGp0X;U4q)Ia8PAQ;Q_r&AqB-s6<1Qmq%GRaDjUS;ILaBN4dd62{*jG)&k4k>PV_!%%ZUn8pDH%5N-yFJcXm>M_ z_r*d}DI~9}-FY)Si~d=pr#fql@oeJJ#RXDz=DaHl7{sA<-uzK^Wzz#fJwQFf+t1gL#hA9>T@i}mL^6t-Yw#t*L&B7 z52j-R&L8(A;f6i{Lc%4W;ceN$CG_Q_ z86-+hDsINQD?R%cFRj{vKifa*PTl(+X+7-xI^h3Ho8e|dEahr3^lQi-Ss>*NExs7F zNfYrlH+`1+HIDN`_r;R%*3#55fGTR0(EVf&Sk>V48tZBZp~}#y;DeIBj>dc5*GZmz z1$R-=FWzC=q2BbjTq5%=o$BC(%s%=hbHF-HSXEH+-u8)$d?{1Sfwyg&+LDPynM7Px zAH4L-qLQ0?Jz%D`tN==)7Mjyo2|A^p z2B`{K2)disS8^KRUHLGZmgSJio<;YLox;?3ju0axN1VYA4kCB5<4_m=smcWnXUtzM z^?=AYcK6=~y}7MyAFCESeJb*RTNXiHJ8#cj4BvVl4(*IQBn|oZG8MCcP9Xt-ku*V?O$G>!2E!OiGxM zQmd*GFmMfv!l!D*ZNOj-tULBn2`P6fUFK%ajmH&6UeW}9?;pbPI8|R-TF=BGj`7GG z%)Dv=Jw8ib6i9-XF|#Gip5j8!9M@3RA5Bv1mhJMOxkF5+GC4kvM?R(r*xv^VF)`CU z3qcmz`%-bBURj;q-cOEtrA9cahn*=k(dA0l3@V@E=q-<|AY2zTx-Cq#Fp#*Fxk1__ zfnDGP->CTVzh~>`>@v4*mJQ9!)NTcm(n`2T=Q<4uco5O5%7tZH-c(V8LQV5cUGnl4 zf!V7Y$Jt!W2f$_;q{yhr6&;+K z3@($frk}!Lum}fZ&!FooOwA=(ByljD*-2vOOB!mx_UC3^MkhW2f^VPSdqL&FA_R#X zge55&6bO~I^%x}38E)`HpibXMq>OhaGWi$}L`7Ojfx^;MMJ0Hl>7n4%Xob&YW|jBm zB!LBvU=fx4SDB^LO}{AKmi3;5LQ{CacuDI2 z3V!*IzYKqWV7jV1>SgUy1_~3{q-VCx*Wm0YsSXxXiQ^+UHPp6rv^b28nDnNw&A!uIaCrP6@2FhtXu}Z%1h#>1t zrWj}gDrC@s^BSjY3SBi%7(V4oZB;UgB16jDJV{H0E*Ua3o#Rk*_vsNN)*77x*Bz`# z6d+-;nv-@?n%Uo&e8x;35>bHYl;S?!RP+*cF& zsHBOBx0tQFzjL~+&)hTy5|e2suToQuCzl-q>XUZYJKH9aS}8v%%6uGcUrVRpG7$hY zwBz3?TkAZTEj~`eFYSOvm3)yhc1>JML!Y)O=E5FE;j0QeJCT}h3IsYajbCKAC&<_= zOiO9Q<6Pmi=$c|eL}r40JR$Sc#Ha{%Y2X$pB&zm}Z)eU)z@vpPVVupd#34%A zWM-nQO4*1?z-{ z$(|@Hwma|Y#8(`#wKHxY*vn5iWlhx-mCem9$q$=N%Wp4Tj1RO}MWlYYrKla~-<<`& z+)Mwg6q;p!WE62ZD2d>FZ$gWPNzko3(DLTZGhZy+H&MGxb%cgomLZ#?C}rSLwr`_C zPg(WaDA(h~>|+mAOx2g?#|2Qw>!XK**8!J@eWNUQbZfK9-(ZQE zNqzc4h4ekGfesp3Dy0<=J=1eZJFp3YiYCMiq6MzrdsBPuHKLDyp;g}mE9-v})ogP<#)x8AhL zTw$0%>@{Z-`*B%GszxY|3A%ck!g>26!MXa@DVigxT1*#15s7a&Awf>?qjk#j=@V&_ zQ-0{xlIktLHk1gZ%c91HD6#_-8Dhb>;Vj_~C9ot|~75O+3W;4_{`=;rf6&ICW8 zuLlh!j5;cl8EwNMD?6_>B884PAOr?Lol!KDU`poHS76kpe1W~4XwXtmmY~O~nDUL= z7Y;=VyxzW;7928KNyU1YIccNGx&$kcq%yiw*w8YupVW)J`~F`DTie_BSTY$AkhS_% z!t4E&Pbq@TXsbnEDpb$Men48)QVfzKiRKnFEuNjyP>#%xh_-qi6g>#ftG#V(eu=6`@l#8+{1Fe-tC&&|kg%;#% z=aF@rC>Iz`-XSM~&`BB$GRJ=6{qpONzQ5R8C?xi!01}MK6!}Nt!w)fJ(`6`pMX6={!SPhmFXDw*3yJ6>f$NE zo2sg^y_>I5?tE;|@cPkNlETMFzXL8%h=>e3I($lw-9a6bR|aO6C;tj&4{U*2B~U@j zMaBM4et;iwCVMaxg$ZUNb?il-R*w29AbGQeUh0Psr=8fZ@6alBX>c^YY6?1%fb&7C za-|F^W9tNup$0)pXn+Zv#n=ubW3*_nD-rn&JF!5i@tn!zU5Ctl2Dkq3l-bSaB<()) z%h7ssKMoPvO`Xn+HqL{yqug+`lTOIRr!JmvD@AqKoAOeVxwho;0qTcKn@NqXY0bg= z!wpV?sqSx&_hSE`#Vh}0%Voorle8=o>24DY%Y2Q()D%15B&`Bv5j3e_AY{{b0^_Ed zazWoO91mq%7(qT6y6csvL7^<*q!p8Dry^3NajsX_w0s9tgHJaJEY%0d0dw05wq%1p}c5S{tgEW zmE&PrZ7jHWIYI?Z8EsK2cxa7_g7BgO?f&1P`KKnb0|UV981^U7w-U5@NXpe_O14** zsB!w^Y!jcj!Ml0U8w+4SW0gEb{n^dE#G5tGNuvhL=%}pH_28;m6Q6gAmS~82DIu;8 zq*;0&2)XmHlh0*OJ@>OU6bDG{9H73bU@pK!3!<%)3RjtXoK=LUG!PLdU#!lU{&X^EofqF;a_SiS`2ME?};EzaR z^g8n?Z+I(qr*hUlRVssSGzM|!TX!(5P$Ltnr-LS)xx}&aU3&xq!5 zB%0=nG=P)6c}SfyvNu9l^9A!DZ+1_eHL8Z^cxVUae`wfW6H4e?%QI;>@_gl(XP>l| zv=kIIcLT1t>o4|AQ~JiA(eVDm@a6vHGZ@fXrX`^Z0n&gDFRz48Ui|d0Zh8}Hl6~&C zRRi6Yunpzf4acxIY@rU;AZG)0Tmrs`V%6Gc6io#uW-V4@;-VepWYH%cmR$JYfs>w( zgoGhQf=$3{or4wk_w2CuJ!D&?8M~X5t~mL!vJsu(bNP!Xku*{+x$0wwI2mM(IW2(l z>hKzv;EmhS{e;4>FAc=SMuHkbhbbZ;%YsuU$vdIio9VOqV;${RkC9YJiyS!DkI%;g zzuq0it(*P4ru)T}Jx)4J$g6h*7tgGm9d{#5U#Nru`{%$~TON1PDYGBAd1N4V z*ziESDWd=;X~XvVjAk4@<~*}Jg@G-kEgp?H7_}dDc3P;i#1t^1b$ED~mEg#BdEo8i z&g}*4JA&-pap&YDQZ!5W8)nA&*0U_c?y@vCn8j|c2#{42>H{YxyAsQo>ZI;qm)kVk z0|Zf~P3M=j`d58)`SJH1o2&f+frq^(IVa+8`MEweE;;^Z7o0y4yZD9fDV}VRs3kkC z3k@tG7?jr^((Ad}QsSw0I&H8n1FMwmM>nrDL=-w~EH@(6%qvOEar;gov;fEq?dkJP zd|vu0JmvMp;NTBGwHL6QS<-O%sv)jopw0H(g1 z%N~6hGYml(F_k)H1;fhrsYNznRXGM!wb?pepQgyEeft0fF%Cv!Hi2443R|vEpbC{> z7({r!ia0SUy#K=H03zt&>LdpP6C=ak|7tKBKfP05sI@d`DziD7r?bx{asqtkQ~5Te zh}xKZc_2mnXdwqnXaEL@6wb~%B~R)bO)(~)YJYYQt@7PZsut-#Q!wv#uL`)(#J)7& zI$5bks$V(y0fYcN!y>{8`Wu>3Y9*c8xB?vb&u~!(>kOiop4)| z9?lmAOYs|tRX_W+fe)zMotEk)CW!Cpe?4HU)+!FOY~e=~-aAV3*-WOUXYoZPM;p}BqQH48k!M#w$0igh+#uA*)`?9g_ zOx57*Bxni3H=o54;_gtTJ2d`Z2v3-$emu3#>sGjpwqHY|8bnF6ElyR{WBToW`w22X zL#z&FKoeWrC{<($uSeKyT(*`P(*_)Dh`uaTHaFeMJOBX#F%MYS*S6_qiKZ&O6ulPCA|@31}%Ln&}xw|T-{ z1u1OWr4hLC5~?M`eY24Ly_;!bm=jq<=pd-^I( zr$?ls16ckl#F`Y1)YC%0j33f_E2LWfluU?fIQ)>b!t_=-i{7n$R^s(rWObhtg~0iTkY`?cj5k%H`V+9#L&Jx`n(3;c<;-1AMGrF9UV;UIOb-; zX`qiv6e6?AQ5A5;_9x$|_C0oJH0ZiC>G;%B)(R(UWUeUvDQn*>e3tmNI6F3{clf0K z&v#J5%oxGys3*k>gH_*b$*Bno^8bXLQP5<*8aM?U9+iy2p%%o<4)9QdauyTqHAgjI zzK7LOD9SO(sKAXD_zgslAi#xjau0sHglp*(v ztnMpnV`xKtN;&M)G1(`6B+2YNa00UX%pO?5_CdL3mFRYinGp(q`~tOd(y*YMir+}{ z#EAkR6|QIFk}!LIX7t-KA-iCcE@EQt$Q3EGV2A1@k_`{kg;`);ydaUFLG!6c#>OMYPBpk{ZRQ*_YwA2PyYtM zEiG&Z3vct?|LEzem9K*$TXz1$kGRXEm0$ zo{d)2m{(Nc1wb&ngcqah5NgBD(2tn#e_DXTfV1s^cP%x6qNS?w`Q1+aHUB|rkuZ%P z7b!_#kpg8(#sRX6cC?kx3JD#lNTDEwAULDa6Kden2L5o(5(nlc}J6`6WFoGXlbx~2;!18IJ zboMQ2V=1gqM7CXjVsk#Qq6KCkj+|EN2BuVy*01?M6h5*e+{SgyvN`wR;Mk z`N>__WT*EsuWh1t-cWl$uL4F42;>4z=g&l|kBT5jWA-%V;>|lClS06NR>J*@L{1V& z%zM3K$Y2^OBAlN+qTyLpt{c37iZ4UQH zcdowl1to6)G|TDh60QKAh_`LZT2JD!4Mi(c-{A_Gm?o5HT_TTvBv zZ(hRQ4E0LU_`U|&-e13-$(bUh#v>Pc*a_H&R6RXkKZARz7Fgwo$rK{MMw2xg!WbFg zhQNsxfZ*?`-}1AbUWk{0WE*xjwB5PQ=%Lc6UQ0u;d%Nl$St}e z0ia1bR9S?>_w(aI^-&6QxWDI6hy1mP35|_lk^pCJZF~8GhYn!PV_{!C4*q%y zE}QY8lqQV0Sntc(Kx0wwecXIQeZ+LsqEgA)NigX;_Q_~Fz112+)^M|ji`2aumL()H zP=k}NO8-sL_HQs&uF&dT&9*T(_hv4921A4Pk~FA;O6z&|9s&2 zle2cSCWY;l@uX{$(>%q?qep{Psic^(554l>%1VKHtLPZxvK+z1vR1w+LG7SubC`4i!nf~aetxN zTpWN*+<^njryg6-;s`D^Y@Z4N>Ru#{SvkX;>@;F;UBgz1vukP(VTGGA?z@Fab!*do zevFV)ZaYXvy0>g!mp;9pW6zIAKBL?iea6B-dzF1o)?AfQ+C&ZUB5)o?20$6gg0F@N zHC6?-#Qi8cmW?jPhifK-ssvd6_`~in9po%_r>XVK&?oo|-Fj+n=&N0~R(3|0!cVT# z+-r9#VLxod0(R7UVO*IG_viGtVh@7qtvkn$=q=A@q=|!YdeTCz)Mt;b`d{=9bbALt z@0&-TZFcW~8LWXhry7Z zY}g41u!F%u`s1+QKaV@>{=DM_oONg^%-~mNMB6#kxD?mcZ+8j>H>a^mOl?Y38E-vQ zNPc~+o?mZN)Ks8wdr6HaFqkn)Jjhu?`QVVgMXhFD&h{oyQ-h`);jBVdVDAt}1Fs5}JL4JJ4Y>j`*4RDM4BK-MEq!jfK?S zrhJ_&~+4PH~LszTC+o8B-!LyJJ}0%Uk5YghmVY zXZ?-U<)X{gDYq~6m)Mt*@0NeOmRANL#VYH*Gk-Sx_t;LDA$`tBV^z{FsCPfe)6ylB zB{_m=LdAZ1v0gb6jjR^(r{}J{b$Jt*)>#c5AuK(C*j~YI>TKoHxZBJ_f~;}9UOjl$ zYLAx3kpCo{j(LAR<0EBI?Xx>{nf}Vo>3;py@$~>DtZV1O-Lv3|ebuTZV1JMfrc!uf z=SgynDlGu5hM)#lQn`XtP7U|}i24e)D8O!8y1S7E=?3W`1?ev7lFp$U327;5hLlFS z8zhDtx|^Xxy6bYj@0{oUhxd8c-g}jl>W8xvz!_~;qC`mF#~s&)3~=M~g}wX8rR!g8W=D{E40#%b@5 zrQq3Q0Fe2tb>7SHL^M^?UfXM%OUxzG>mx;P=4bZ9gvao}E)6gSZpu`n&tXt9dm}f189*lYh04Hka zaph}S%(^|8d2Q>HYG=twcGfAqo_UiMDhhVpi3|z#iLrVZT7?F=I*Ep0?vKR);N4yr z#-RAi*=r_`6U|m`osC~pLvGBBZsZ!H;@#IZ9w;j z%S`+wlPQym$A_kl*t83{cLWVeRky9oJ;3fWh%llO;OJTlwPn{kS?{~8UKuw`F+vx3 z&{!R13BaWZ5 z_58w{|B)rQZ!1R&kCLdEGA5DN?G{7OfZ`JleG-se4`s?gGK2BO0zF^$s~rBKfPkq{ zG}W7a*?a1=(mxXA;X9*ea!c-H3F@TErq_yaJqH*%D0@A~iCss2OHPgcaL8Z3r5OFz ze=8usst$c=UF6B){NE*+5*8rV<(p{^t6Mq7BOwrQ&JysMV-SGeXZDdI*&C(*Gxbj{ z440rYhM(_JZw;%x-M=2b2(7fjyyR%y%pWo}ul|L^>DFbp8gjCw^>`>0Zm}2qz{$F< ztL4V44*U2q$_9{^Bmqxv(wfYevv=lWxX!&q$Cb3xPeLU~Vaz*-Uk;x-eq*CC-1=^T z8PbGhO-Pb`v)KZOo9j@26U*s_K0L?SKTx9Le=tkN2lt6Wy+4KnJqYZN*)fdk3>Al3 zQ^Y(*U)y0BD9BF?OJ3%e()=wKPAxh&<~1C7IcK+5;=m*BT#K@2N!yhhhFR7c0k||| zC|WjguYr#Id$D!x*jdAhogLez`*Sc{_OX-N%GK`?-8A)A}t{WB%4wky&X}>Su$7lhhIsQOL0f8_ukG-t;!5UWPsosRzM#=P^e9dh|ypi7qq3zdSFA&RYXEt#~qQ!&JJtjh7T zs4iw`(Rb7-Jm&~1&F#OscX!W6Yr)u8)el|I8(0XV_}#g$;ox0oAGb$R@%ATsDWA`V z|60?=*47fY?s+NK0|!(CU*l^&_}uIfR+U> zV#Ts?(K+e^%f8;c-BgpL-hnu&YDQC>|Gh;!cfTsGcfB|Z9tp?=j$cBmmp)MncC?y8 z6Wc%}5y)D!3@KL+qEtCS;4`sTiv3*?1ySD1c)=lx>Oratm-}$Ze+hUk5Z&@|8zw^z zVoEA1J(l%#4xJtE;#u@F@z>N=rT3Ay$IYie0~e{w=VpQwoansGNdo?T%n5B7p~Gm6P21APn##Y8UwzReM8n&Zrd`_wuv>N-;a8HtGVM4 zZL(bITyP!(>)W4E;O=L{kNkka z4()!Zezjjk--4_G^#o2^{!kx*UN5mE0Q*Qy3uNE#u!-`~gX;9Z<%FP0N&~S9NCGTf z34uDWa|9=VHigvG*z3H%tfloN0BI&S*CD->d*JhBoGi?}U{`9Q23!NGa9(8MwW6pq zO$K4_NQ95gXYP0(p1E5t;h-S(D+{t2Iopn`*^cS&1I@<(12^OBT-7=*T`KE;<87k! zp?8Ud2vw|mmYNfPXB*KLn!Vn)N3#y=0}+PSU6beWH^^Pr6?~Pke->xpW4OPG{L=`7 zr$Yp0TlIU4;=_0BzgKI#PEJ(@G7O2oc3V?HdK$2x?eYQJ@i_$er6y5Ha%M)CX*_m) zmcP>+;TisCTpQgyEK@RVB$)oG(vkK9a&v<5+BAP&Q1sD9}9~ zL-d{HZWKY}txIPQo7^RF5)fXts#ECC;Gg)Z4n#s~8cO%OkmD~4#9kIP_T zmiICASBjL`-GN?(0I?m1r!$*gm9qd$x*3h>oH-tH#poMF~l|U$3 zIJF~t39ppVUZw`y{vsWL_I44JQ9yimrTf8=L%hYD%Bgb1Zyq8_6~qeT;CMkwFyU{> zxEa#?EkWZXUC5f;=qE~a#n*On**R(E=;|*Mkt##IQkw+4nqK;4y~~4q#G1kI-nOaI z&Qal%V9pzFgzxdtV+s|0hW*F93;mn{$JFwg#y=-!+^RcnCUO%DPTpT(4GomE5f@sN_g9?tI#MaszSXVHzlTmHcUyT~ zP_DU^M&JV%G!@J>{v^$zb0ZZ4Xau*d_O7p8Z2YMr8e_|>j;Fnq`#kHtsZ$M8q2OuS zhNd*ZT7+Ls&NA$-70Kpv!MCIYeu5&fm8jA~J2xa+`Q^FT#1dDG*B~^6&b+i7Bf-26 zhf+HUK?>vV(ZvxLyx|bQiT}|3!6839jXBF+exG0dG3(l3)>ldVEM@HUAIb|N{;^td zses;`KYryorR2jNs>8o`w{(z~>M3$Ac8=)#_M$g^KYH0vT@=`8`SY}X7mR0(Qz}U9 ze|gP>9f|=EnYf*v7{gtHL$*%j2l5*cIOUBYUm1&$mr_C7bNL=im!P zQA*fN=)L~n!-&qDAftBW6w6O?XKi8nr@D@uwx&pWMrhY3R)PwLN@|Xjs8tp}&CF6J z3nyDtH%m2Z({xCajDckhNE)wWw^%BZH^K`$@a?YRwUsG=9Eeut?YjCI0W(1rA8{)|)p0|VM=&J51&_(H za5ju{PANTjTHo5LYo$ph&rTDj$(n-DKT_~43PNKCRmX{5e~TqA0P2o;*DO2u5*3UIyqx_-w%u)};s{N*{mrV7iL^XIBl zD^DWjTL?#9!Wfq9uZ;9|2OViUEeyjvY)&S6;Ml?r^H#R@rG~=&5=%K>x(sy%@EP>O z(!fKRhEVai*1f={jIKfEH&Im%fJSj!X9GtZ_-ybt?0h*DFSZBS!1b5@qRPNYxNxPg zVRv(RyRh^OyuF&vFSY-)>2E?t?^1Qd9~`5k7Pe`rx9M9u;^GlUZRM0RpiZIuVBhhV zp4oO!Tx`1=+)D@JPi``k9y~Y3%K{ge1LM;&qTEQLhFdW^F0RQw4DT`25i*xz@rh9< zS%av4`C-3xH!DkH%G)1X{^S_#$v;K3S$Kb>w@tj%V7W6h!6xPBb{-HI zm$i^wx$pZ3Du|2O3K(?V_Vz09qG)W0U2yQko|4&y=|z?XK+{k1M;=|c1`6}rG>uoB z_o((NNoTF@=C$n49JNV+k@Z@5DH&&T(>k-R8i+WDKn-Sy+D->12Lc{pw5Xb!`lJ*t zGFFEs$CBDMel!~3fd>5kyoAqn@2b56-bmLPWuJ$Y;sm5ty`}cmbAeskGVcPaWWWbC zFZ`_RNo=yX5~)^2ZYK|iR`9DA@WIk%p#gYcN>qH$@Tr!?#Fl)!T*t)SuF_q--te}KCp zVjhu~wQC!&-~NjXhkO0m81P1^hbDguXn$esXnRS{?S8O6i4V%f77HA)I!5W-Y>Pfd z84^(_Kd5tu(}bTz|!2}g7B8fyvDsN@`*CxlSFt7Y|cqlOUGh} zR#lF(&>?2YjP!oawCLedE6Rc@6C=qxs8WFY*dv|pBXBq_UX#$B3A2)u znd1qRPr&w0s<|uH5eu_lOO2P}83*Oh@s`4!XCBfzS{^aO&%4R_6mW09SZPlU1LVLF1xal zd9|iMv(Lmz*Xb9%A(^xZ^}=h0wIS?>Z$&h*(R_!0^oox9%ll%K!KqGFYrXOm{pN$#aOZyZBi(b zHO(vF+RILPdyG!7%-XqIjby?|86SJJeoY$CxcHnFy@>&H%!50Df7QMs9NO!KHSrK8 z_TC|Xj(kj4>G%`W*u^w7R$m?>3>_V1KEq**M3*Rf=SO^FQWHOAtF2KFwPhM-^n_bZb-Dw~6HlMz*Ox#L*Xu*J~&Q$pi=$p{z!0b zqeEB#Yy0Y@A+>@;b01soV*2&AlUk53(3pb|SWL}v_l7&icuOq4zr9rQ@ipYo+x$8$ z^65KGKvn`iWR+&_qXa^8}T%UtMdjqQMJ)Y$`O zofVg~{|2hSdd*Q_Q1ijt*q6=q@2`G45|*%1KjX!`&pooNh*JPUMRxzI#?%uw-?{;An-}1a- zcHWtge1XlX+j?08y8}1nsSex5CO4XoDe^v}&Z03R_oEt*Ay@O{ z&#?rfor3hu$3GE*t}B0jC3fxr>06FQ$=vc?XjT1;rm4iO_^REx!$2^M3A2AI#Licu zPU+6?XiS8gQa=@$gqjvh(%)^mFU;g%? zokH(-DdJ(yf&T0k#x?V3jfswfK-!qbx}-bzbxIhTy`naCcaM3hnTGzpaTuZJ6B(ogqp;l3^u`T-|LKNQrPY%nox# z_UB5g%Vp!-cQn^bPTWqewQ?FEd)yZ>cYfUS4NHPk$^8{QePi%J)?)7ev;ZqrXr1^m zmLl15b_@&hEP8|`q-nop280G8ME1JiYr0u;C1Um5Jw(Q1mzF|D?lgCxd?-K1GU85wOyVf0P zsC5VzYIR*qDK;P}9LYW89A{0mEISV0V2zJV-rUbWyLk|NK?VDpiU;-{zvR|Wij?Cd1!>O<~pz%1xs@d2o#GOp4j{hT8=VOQpWBw^k1V2u(cMEFpfvW0Wm)f;+^5` zl(pcAg7xfeE1y%SYz)<&@XlQ3MCDY<>K`|>M}He@LE~}GfdIH3@C6^Hc5T$SP*wwi zf}>;q-puY^#7~g2zJ|+qT(1y3Z#ip8v5h_pswVvR;(PWT{R{?8{14t&l`m|ikevrT zm|m$_q7pURAZw%`Run^JgRCHufqvXeE-9zAySaZ~6eS0=0)ho#c4(FCtVWn)cP{t> zPEcOLg;DuJ7Ze}6*!=U8(aKoXW&F9Ix^rk#S*}Y$@XP6y;a(xwu(s5G{F^x?4_DT0 zvtJU3^(b+&oIYcvRC#(6C%P+ErT`l(vOiMu)r)TF0@7 zcZJFjX@dI4rof7gDI=L}0=*>d~_BjDy05iTYWJfp)$!@kE zPBM$d7n&$>-e(Yx1OM-!X9v4KZqqW-L2Hsn+`zJK_+8VwXCO*rpy$_sCA0nlp~n=i z4f`gDi9I$@>Gmr97hf8PPT2lxo;KCPpfc-G+Yq$$Hu`F&dDB{V2GZnp`~9bF`u6U0 zLgc;iqR{v33@6O?s0SG(@l&i^Cpg0X`64M(Bn)ei-B@+-3MouFj}hmf<6>BCp<{me zvtM1TAul|ZAn^qxw~T4xt{E8Az>i}CpdKy1>F2=nFPg;tJhAC(#~uq!G^|AXYQO#X zFEbf?JjvQzNtR$YeckkvTRc=7>VX<`n--+7ARW5(K?o{Lwzm_a^$qP~Q7`a-#fs~xX@si9Xecri(b3%% zPSvB+(KwM5l$=o*F)D%a#U#YN!_BBIzU=8`2G_>DS5o_KJ3aEM91fYanT-gPs-!0U zO^s8`xuN0?+joExs}F)Dz1C@Wk;dz^xi_g&sAx7=};i^vZel*vCf#UAGzBK zIdrhSB%JHMs`aJ(KwqWzG0J3im=`>W@R7H(_qB>3lcaK7q~KeIU@}5lRN96w#4G4# z<-{0^{6->GdTOkHc8}Axpd#A-!n3GKdvP}Tx~r(7#Z!CP6WA2MDkuIHXp9JYGg7cU zU48JLfCF7wh=zJMc9;r)!Q*Qwo}HhzP$1Gi9!<@@)<}Nj-LX(y7_qo&%Q647)=S+1 z!`5GM>1{-sL?1u$Qqs=vKY(j^9YhMsxKmMvBTEcU`aF!LZ)&3!zo{DaYC>b z*t>U>YU?||zk&Z(ap#p8O6-zB>ruD5At?-UN+`VEN;+ZC;^8yQ;LIiJzZ?Bbg8(lo z7=b?j%IrJOvi)aQnj4)2ICzL=#b#uWIPM-8+7cI?4g7LJ~O?_ zVVK5&XZM%$#7P;?c182pNG}I3T!5hNA<}@Ky=rIRRrJaWtJpt|MJHr(5j1$)a%F;x z{gV=^P=DB`x0KQG{?~K*v{0@h_zb18y*ma84W^?~G~19@TIwnF`jT0E&1E;A2g+_1Z;_hG$3k9 zq(;ieZ%zgldgA}f*r$3Sexu|R4-BRv_cDa~oBom2P##z1{Y_{$Z}r!3Xf9Dy%LK?C zKCz(v^LWMo<0yH5C}LcKyzEh664QDG(;`G!Mt#}s!*bU-x{ zrJ^4C2;R2~aZ%!0(KwU!|NZ5xz830BRx0bQ91+$;WI8`27a{&;{hG7?*Vm5Ih;i6o zXFPr6=uWoc%aDdTP|G%`yVH2@WZ6V;z8t*biFNE}&^{>oCxINinD2zy_pbHc>@`~WwM*p z9g4(7h#Cpx@j>1BpZJak^p%bDUEKSK_Swu8wGSeOaFARTBID#vqtzpW zBI6-MwCa_Jvb)LgUlYQ)GC z6@8<04cOp3b!+ch-vf`c|Me7ai2RJ3ul{fX=qmb7n7EsnKAy9Gx9hN-ASBSjuie?{ ztb@3a!a{QiNqaGiC#^(ac{p*NK$`SqTx=5U(A{ggFsyFOx+gxLDr~Z#RirmwmZ@-K zedrbK@}x>FlRc?u8{wwNWA)!}&vm((BD`BoQo&yvNYxb5_=q2oll;Y%zk;Ze;h>bg zT*U}rFDw413DRu<`9rg7Wewlj7@F31NhI##gxc)7F9M$E*HZ++{*!;w!9sfM zmj^^KaOGwb`0N`0U%r(_KP_cX$we1i%N|Z0U1ND?rX}!}k8C~U&bl&*U**Oom#_{SCK`17$fH_z>KmE#~a!cO$w3iQmVx{j7|1s&=g2SBU z#(r)EM^SGk`Zi~9@Sz~JP(sD$?cjw7dnA*CYL=w<}roiKB&3Cn_Td=2DMc#ad4?B80JY&>KZr0fp1k0miI-QxY_+E*A9ot!12Qsj^{A{-ls-Le% z%gcq$W4@{kD5t)9)hk+ii2Sv9@&hoLe7Bu39i^a$QJhwuqs)*;2}C^eONFebP=|Cr_wSRZIm^}U5*g0(GSnS%ku=D?nh2J0Bt~!QhsWP)fKGRb4gJGSC zVBCr+`_f@n4)jw77&D#95B3H;td^*!Ohe{CMov+bS5j_BZJw&a&i!b;>M^?l6Z`as zv#!5Sb98v}ukNWmPvr-ik1R5yqjt20A8O(51^+{uwS^yuI3jB6={MXuKec}978k0o zf{C%sG!Y2OJu+ZD*{vsw>Z)w2^qqQcI9leYL!Quebap&*RUGIO+xE8%fTa1fPuIi= z9h(N0+Fb#ZTKjZq?xQ~~ye9Fe@cgp+;uYUQxpsZ+BrCkiWtVSW*<1x+jHK=2U}u~C z#Rp|cm1o1^q_mwAhfb5iNR#vECPOA-7JoMvV66P4!Ego_&MGKG2~&A-ujlhqb3)|K zWb}ql38GgsCNkylBNq3y@wCacj0j`4inkh4Ut5*URXo?ln>VPUfm2^`+QKU zmbpC!4?$ExWy^dx+26fK&5b+GFrG!u4uqi*#;5#Ttv6Ne85Hqe5GEprm8M<6dR8-2|x1}T3rp`Vvij5(?t zZVi}UF=?EpWHT!(2Q|k-B5?ON2*3ZS6ryZ!`%Yg_mGk2HdJ^5ZMn0dZGH~yyfk!*n zqglQQr=9YPHIhobS=Lja(Ap%)u;>KQkh(~U$>7l}LUjenTY20@9@Ez6-cJefbXjb( z-`g7#X5KQF83<6YNUzJs>1FRFVc zzO_9-&&*QBFe1p4h$@598EV(FntS@|j_CNnYD@X)ADL*PFsJCxiT#ddo$9Q1j0*1) z!+W#jMBcpa$S?CR9@AYS_+XzBE7=*C&4Lq5^J|ywI|D8oODm} z8=D#(M)&3#9Y>$__F!$W$J@SD>OZ-y|MtjQGkD@ZJB8=V{Rq9<4bhFCk?;^r4rYPB z6LN{g=Qf_fl#M%k!OTiiJuF85+tL@nF+{^n`K2X00WZ?Y8eg1JhV4`mLkW>8fy5=d zaRGGq#i}~Ry;wg(=A$0#!V{SWJ2^O1+v$S~$ldvAX9Dt5(~h!oEf9%8D<#Ja)}&FN zUcGUX3oGC1havNNmPv-l_6uU5?-yNOVxalmNm#$Yw-?e(6?aIeC)cEYR03}pnkFn& zR;#1^hc>jTCI!qAPh;|ki)x`{_^H!}%|pKyY6A8c_LxV;{!QGlMaw}hNe$zUpy8Sa zj*W+Tugb-Yl&Qz+WQ}wc{8{`KiRP>1GOokn@|1knY5YtKho`(q)}}3Ghfm5r+=tn$ zRoTZ7z{~Pq8RdIZZE8IhdkA7o520*q4mHyKv!2-bDv{3I92H(;w=M;qzRZws+_BG` zo?)W~rB#jK)iUMR9+*~gWzZY~1}#=?!r86fI9bgUj}Gk6XT^-xq^4D80J+=EM5_b` z>g2p5l%){F=sSl4%xga9Aq|$2nW(Q8_9Ei{bFumlkHil_-MIQ}fh6lDQrqe3MCFPF zfv{j--PPZ<5t(rH)%yJSW4SaD7ZsC$~x{KdWoE+r}P_HN{ zZRC;(`wHOjHjj1hBqeL#ly?+KYw6G*N>Us9?m1==15vz(kg1_N*={M|gy{P@1*njS zPez3#7oCb30F%j?29m+=S;eua)+gk<#e(CQ-_FVq#ol}@gGgEdU1q=DLMn(&Ts%@- zaQzRb+I~NZi0reI5wopI2j_+8Y8DA|N_z-)>x66l@E>7{!WnZ#BE2vRE!U2;Q}*WD zoW<7h(XKq<@GYPs37}`xTpT%^6s#iLPZs;apM^J=4o=b;B1MaGhp<1T?CcHxbfb zCAV~hLU4UHbsEnNVg&5l?G*(wSYu9&^=+u9rF*S1jT@^f*B-h68w4eolg&X;J(~~0 z6_+pYk5StFB2pXpk2&vhx1@}bFe<>hPlzyeo=?+WnO1I8)n_T_iftp}s()`Shxz`K zF({>=$Zmx(f<*oIwnCAvi@tzPq+UUhUq?!{j`wd)uvoQOdkF_gG(u&W~tI)4NOn+v@6KzEJ$fM zIO|E|qam+h0EDsom3iZh=J^PFvyYg9!z9nQ_v=5PaheUMEh6g~2B{o37Zk*f(oug@ z;&w|t(e;}_RXJnEJ0dlh8h$2OUNfIetY2Gp1KIrKuuVcag@l5yH;N%s4Qips$AeFc z@p<#owQuc|Jt1Q{65lybMEBBc&r**F$bqc&(^{ygtaS%9C$g_x7}ixc0E!jpnY{^p7ob`=j^;3o?0zI__&*|tX)8mDqO}zDYLt8`W?RszG}C{l zbvTRJ)No`kMCddIrk`GPoHf$Yga{XNCtM)xvm*;xwspy3`K|68XheX*CcD91#9zEd zjnC3Ks+SCnc{=iw`ly0=g?T9^g{l+)Y1$t*2&HdTb0^@6^Gf@$Ee@a;=m5z8#N{c7b?%Li+Yeq0 ziLI$C6mTU9YSd_j)6Puu%rA&?s{jIC={YyAy0hs}5HS>l$9>)gc? zK$9__;%Kiy#6L@vHO6KMtqO%GDYg2uWa}`ds1!J*sL;1WW=&a=9NdT;4SYJf#?`IQ z@t)D6l;M=UQ$q1^bkMEu-JOzfkvdLsjK&+3-fn*5<7<4H!Y=7u2pMWT5l}wAg|Wht z-%A@dJlbVa6IinGzpcq~xBLqyh>`wDfvs9ThOKX!t!{S0-Yt4;lIw-_Vj^K#R*tmJ z-xA}_wj*K;R+mQGH@^LvXJ|-ullUGtXWFijzc)yqC0QZ@O%0jBYF=&nDM;g4z5Fhy ze?nnFqONDj7iOW{=N~66&g0XWx5 zWmv87hxe{dzX_Oir4uM`e{4;|-(#N*TT#4_grfZLZsjy3ZviYnB!01Xp{~NC{h4nM zGT%p^^O(ORibylf>&g`JAOGP_!psLP|NU{2+(jPska(;z9-3zLAI_%nXXBa~>+IFh z_xT7`NaM{Ban=0MR&xkj;#JhqpEa!s`IE1WM}J=I-->_Kt`^l^@?6a-#|^W+UKbvIGaOkD@pa)6Gub; z(e+}|u{{vG=O3L0l3-(Q)>thDmEVohXU@(o;wPk6ax8<0Y^EXco>lGZf?nGcx&D`^ z6FE1}BX`Nz;^BAVncioi;<9TK@(*s)-cr|i6ZjoLj#)bf_S2;2=)H-qMIU3S=;JhK zS~|2~V$gCN>{d|nktXF_L^=Sy!#y-_ApLrE)PwQmLD~K@9ICQ8Zg9HxQc^joDHRyM zZg8Kj#?BtX^_W1H+1SHo6=nrC0IC zOXa7ihh?93{WookGT%m`T6_cV(m!*3^}5usyfz$YU6+@k#2t~M6B|!qYejg55qm>7 z)?C>vH1`Z#_)zIg172e^Nd$YC&k`5k3Q*LOAwvF|YqyGj3h?^*ausFOd2O)Dt&TMv zyCxYVvIe;8QO5EAkUE_rS$TL7BD?X#>vOc08?Eqru}dRCv+ar%3=+&5A_TM4W9S;# zO!GCOqnd2U2j;?jix2_-N85a2qg3$NeI0kKZwAAiTk*6^GrW>cX1krd-bRg3n!5e? zOYob;5;k{QXQC3?;QvpEAfTPFj^zvhAp|uKzknF;y~JqgIeKb8IrFm9Wn=_Y%?Ggm{fX}4T$+0wx0)_5z4E)LZ^ZmdIh93>y{NHi6RuS%eW@z0aE;?hRnp|B{OEI*WBTSt^%(g;^Ft z@mEZ6d3|F;PjkJ^NhQC0tBLfLU8L_>$}X{fv({mlX1S_JykvvmA#4a0+nTeX3iLR? zc6NjJ6ntJ^dv0z@PMq&njpB)(1PI$~auSRYI(!bxLUAg}T0?O}rI88F?VkTn3t&vX zvUwn7iZcBVKi})>g3pC-0uvvpykmY3&4oXHwzacuS=EPST7Ru7KzmP%);`p_(Z1eP zqE5$AUe=>Etc+cTA9$&7kUV}dL(y0smvow^hAhlqr0-FK`S>=?`i=<88 za+J+Pe;MybOtHW>WdHk9Dy~^o!8H*qaSwpso9LrTWM9tk2Ji#p_TI=WWI4HM@#5rQ zs8N3fi-{?%ea#iiRoRMxRe`v($R@e%If(g(1w^o>X?je^ZeJjN#{8Bd^PGAZv}9PC zNv4L|!PHe2E|8UT>Z!PKXXwB0#xJt_FiO@&lm8LxDKe)?(1Q!@+rUE@Hr)0>G^2>3 zU>V`1dzeNf97KSsg{jcx<0q3oG{H3GB90t==Tc#{L9+4>0;*sNAB|+x@UVHM;U9*) zkuE_kd*jDsPEJnuCpWArCGg-G(bm;`r-Gv)?lt`iP4rKYoclQR&cBLz@e_wH^u!lr z2upRxxpl`Izp*K@H);->PnVCG1{_4J1~>(!xE@2apGRo>^=1Sd66;(|twTNFKR~8V zKI_1S!1m4aTNyQ^d~&0l3B9jdlAZL&*k_scJ)Q9H9qE$+0S)&ZLC!bTYOgs#|Nd6g zFDTteTp*ekhmCdLW^L@IS3g{iPuy=mW4qkrelN z80wKzVKOUfhfWtn!xOK$T3kIF<5?tj{9GU8J>sG_!U@Qz|F}VZt6PJJ6^k7Vwjw-AJL< zPzmmrth1eW2Jyc;!Sdkptst^r)1!%KzjWcnxaHPRDGQ60P4q~paIdZx%Y0;W%ILQ_ zX?G{!pS`wnd&`Tp%3JJyW;b;2?6EAG>yyOWH}mybVRNf7(uVK$i9nfHPCl%{lRVFk zyJz^zSLV0Fpj#7HA^)C=2|RFCurnYix6hGQt}qsV+EVIZ5ix)8`vSvyDPgAND7W?~ zf=7N)%{N6fA^WSXo*(m`pD*_NT}m9HZBsROtT;8fY4HC!qEgUZM(jaWv1PdU2mndBeGx#WE*! zAe{aKxp(De&tJp@jwV)6SURqBUERIU`w`Dh>NvFuK$j+^!{<`*1B3_l-oAC(aTa@G zHVJ&77Z4EWpnMD0z+=vpV6bmaEaM24207peyHIdDEP=#&geGMCbCo-`hxh0T$WW$h zk2#~(x3cTcj3to5ZhID%(lkC`j}dXzPn~VE-s>26A$hnpJ~=l2)9|S9&`xez7;nJT z4uE;pc`DR-F_2)u7P~uJ);DajMe_X{dhCW6Q7NVKi{8+E_2;1Kf5sKelM|zg$|v){yV#r4Z4;kkC%Pj5`T_(?xlK$-FV&;NSnAnR1F$Adxo5y zgM*&I4*X<+Pt8GD8*eWgCH0I)Z|^?;u>K`@y>G8#ZpX3J=5TR@eoN7dI*_s|A|l8G zGNpd`cvBykU$5?agKZ{}hKE9vuvb^5_rO*~6U&dj#sdaTzQ>3Z-0JuHP#Rt=K^MTK zn^sDmvY}6B^5`Y|w4_YUg^$`cbRoFXPij%z8cewHwuk-T9Q4!;-J1z^FPZfN`_+Ow zt>J#e5N{ev$_y1bgP4oj%)jfhW;kRNNgTW#9xVnMqbjq$ZyYkpUyYlu+J`@cY~e0KeLO}8y?c-6Sy{A5$Q8k z)rG8Ru&mYeJ>UXK_fsb0Q4pu1YC7|j7FOLbZ}85LieIW-U+TL*&P6%<-*XrF2EHy~ zmh9Z8iNCtN4vW9wm;N1+Llf{!rT=w>Iv}BiVNicQ347Kg*i3g%(di#U;#>8Ieb^Ug z*eCJ2dU5wN(#<9VGt$0Omj$zvDBWr{u6~?+oTvut@XdG=Q>z)uyVQMI`gK zin9(vN~wAJY2$a=T(UpCVfUir_3;%lz};cbe$1p?nQ}qNbQ?#^g`xNOP}yyiK0=JJ z8}$EX@7-c$%g%bg-?+_L*LB_Z-g~$E;hY#Q6`EA4J~_wL>MzSq5~=4D*+@QpdE z*4}L+j{3#NYqY9&ty;CJ=A2b?%>Vel|AoS73ac69$TX`B<(gEoi^AsPt^0+?vRW$J z+8~_;m80!szh!~cRV}-HA}PFDg6fbWO&|XT_*MX67FC51(B6^`>k>?Y*a+ONBoAgr7BXEW4_oH#y4i&Z>7Vk6Pke&y?QK5%;ScjuKlM{Q{q)lk z&lCbb`IA4%>C>nAyTAK8?%uu2hd%TnQc8U6V;}ohZ;uE#vXDT_1)?XYD|O7!)aI6z z)~cU8b+%~$gqIXjf00vBZgO$U7yTrjWYTuK-`3z*#qT?qp5AYCDnwk0NN5T>gf`OFu)Thc`Cg!!Y2Nlk^m?UauvDFA7ydX#mRcoRG#{i&@59>G40GRyPvSn|b z>%jnsx;Z7WnkbB=EK7`%Tw1L)^TP#J3CFPYkrX|U2(hIoONIl-Vln6NXorKt#I0Lj zV&~3vKJ)4SkDc3BFsj7?Z+bI4_0)OJTv*50fDbdQR@pkEGZ;=--F?2Df-;K_bdn2m z61=2^CWTTSrDhan2T#LrlF%Gs^nl@@A(}mKhGJZh7*of{-Mcj#n`6$NIm3L`;AV4< za3mrjv{)9lftsXC&_mkbqzbGQI!V-?VD+XKUnsSV zaqED^vMSwi&X(W1f2sO*tODG<=1L2=2Ra>RP#>=vcNBxwxWs$E`?9dR=RNK@M~*-L zSONaq?t>z8Qgxyj7N9&Kc>+liMN-#Mh-j5CI%2G%uu#~9a}j3~MG+}o!Wk&7##)6j zP#S5IJFPG}^MJGBUyjSNts7A*pMmb@rOwcK$u$;EqwPGRGdAo*9x)|!7O9ya0*$nC z(=nlgD1lXqq?oywT8P$3D}1U^N?3+5N(Oh+cr;3Yw~r{FP(kL|@AP?`jPJd10sy~D z$4~$CPapgFqaXb!zxR8;$7etLSuS3@$j3kaasKcR|B&~-_q_o8(I5R0mo8o6um0+< zc>nv~&!;~1DZci#ukrHBFLU9-1pt2gw||?T`?;UvqaXb!Yin!&x(!mXCvZ!}Pkh-r z5rtAJuc*Q06}{*;On-5SodIs>oby#qNq`WtSVSub5JSo!P-PIf(oT+=E?%o^7q7O* zR)^N6U&XKN4928fF$s7FAl4T#E~|yFHdd9-K1t5%>|nvrt+6@T=GOBEOp0yZ`p`T0 znIHRE)&^(LZNX?dK^-ZS8Gs2WU6YCyLrYRhNbG15MQ*P`!Yx~Lk$mBmwyxEMh%>Yn zI~YA!sgkwCywAp{Y{4U@(cOL-#8Oay_jvMl}^e@9`MP469D+1#Rwtr@BZDtV>X-d)KgFK^wUq%wk_{_-~0OKT)1$7 zC!TnMPk;K;y#M|0=QE%A3{O1qL=XM|-v9phQ`a?5Km9a6@*_X;s_#|THFaJ0KOY<% zE%#3m*`RtVvxTJCJ->ah05~jtCQ&ph$>I9m^D1G z@el{M7Tmh!`M3Yo|IQPSJ&6uOhUyg7k5Ed})RCeD6hsV3S)$b>I`f&Ber;opST$HDYSmJG#xm;a%qSK6m%8a(K8)RUdMD?;2G#C#FcN4$xF=pN5AX zI?X%2|1|IUks9r85%rgFZh~Q*(2N)iuIA55)S04!m5OspDaWQQD`pMS@>dx|*(?w# zt;1Q5VvZ_2O6{SPVldq2aF!U2E)y49MDJ-E&Fvd4D#H0QZ(ws=;hUDb*EXo?IrI6P zMSV!?7u3z1y`$?S8tSl1h!rt5#MsiP+u$|T(GG@!y@OY9YKo2}Q+JWlPH}d^ba)zT z3yF(UBaCsx0rnDOaAA%qvMntQyh!1;%L} zy!Zg#OKY?7o~90jCKB3+!DBTzte@y+|)~QLE`h`MypHA0sAesT#(-aE;Pvm+D|ZdoiZg z0c?z-4i3xnK9;@*exdDJ?3&6q5Ib+jW&7Rd?ey`a0(de`0N{7^`0|&(%u`Q2MO9Ty zCKLYTPyU3*AAg)Le({SGMZxCg=CS9WJ$sfLH*NrMD5xf3$<_CSdw(siW zvxTO#8{B+l#vn|1=jFHZ1CRe3Y#cFgQ;ZtWw%|ixGBv~s5oZ8CS(F)}P0IEkPA-V5 zC8#D}WO9y!T3*yq5n~-urJM_!`Ai+zKZ!Z@^1_`kC_=~mlTr-IEGr+-n zIblF9a^8C^HSMAyD$ne2pIbMsacA!)dq-EPnj=E2nAf}66gm;o0R!jx>Hp?kyy=N` zw$D^(_fp(>I0rY;!Llb^pJoYzB9&R}H_^XYcOPU1~VtcZ*qv;l1 zsS}s1Y;}Kr_Fe9TWze@fN25{CV~njV41<^bF_}v#s@;S&8e@}i{VW(O3Seau+NG@c z1#ET=Fs5@}29r&l)l%$1Qa$Kqg?k#~vVy75vLNmDHRJ4rm|zE_`(e7dD0SRuc`u*O zx2VM6S#pRIBuiADxB`~jW|`CzefPNrVveIzQT1zq6w|-P#`I)-4~!E4_+32S@P;?= z#V>x5y}dpD_>cdX4}IuE{O#ZV?YDh?Hz9T7Uf$fRJ?Gx>E5Gt9{PHjVa{u$e!2y>p zUCI|G@hH<;qm9B^E$TaKuvSwPQqd^OMkY&Tdf*cK7A`2?5~F}Xqe?;uSZir@$kn$< z@L~lLjAv;8z1#=+cR5k70>7T*F27l})K>mB8i_koXsi{n33zmL$3!W>F+jL_>|z{% z9x)wn^Y(|{#gBgfk5j}crzTr8GYLl-O#yAVzB6Mo7(>Q3I%t%Zma56X$0vxYMjMaP ziR2wxiPTYBsSrg4N^6?XF84ErV-vqtLT;yvs8W)7ih`)+qOVmU`xH}d9SPD3A<(vg z&X};An@VdY`}oR70c!tV-ylnH?(d8rqW5jwuM( zVoIbYMo9yi`9?mMu#hOWP)o%YD;zV`&_>0)*+aL6rX5n&6~TZ9!3ZGJ)7_Kw9k3G-}eZ`gjbBimYnQn2?iRDu6 zRDdkbLV`pfCOIcl<{auM{({|M(7n}`kSs;{t4;vm$v8Gn0N{7=D2k#NfxPpb@8t8J z|2)6@yT8lN{_M}vG!47EyT_`4w{G3y-S2)k0O!t~;~)OvACA4=?(Qya+um0hTpeXu zQkLa?j~fyik4g$_B&ER>FdRCp6aHUW%Eh~I%gMImn#suN6RqwmfK_3o73>2|3*IZ* zM)zDKQ%gJ8w*m~Spv1#V4T(w<(O6puuO?g1^j0E9q1Bj9SkPV60Eu3T2#-c-jMD_~ zIP?KqYsP-%7&tic6+XeptYa3IK`c3U=LdM>`N#Pmf8l?kFpkBnVSBp8VgXHPXk$xV z7ns5^7+Z`EQW-Fy3&b-*E6|BW-4Ip6S_24=FAYTWVV!0;G{h80A-98Ki%kI?gwI#2 zBa~k9mZYT~(5k>HN9WC`qqOU*on5T8C<>Y;p<=;wxW>-T9@V_XxstkVdFjekVvKyX z{T$bCev2l~*gL#JRUeR2q>44Ap5V-gsd*ibz2R}5c;fB6^S>T597k;V9NG;@PN9mI zftvNnnCs6)#`Zz*=efH7fAheFO%C@GlhHb+Fx2f1B#+ew>k=VWXw@*7w4_#}(;7-S zlnUt4UiJwri0wt%x?oUvFnct9pVNAvF{|M){0uNrk#LmtFJsYxRx7ppBq1%0q z7PmN>e38*$8#6gWF@G4G!PK6`{0b@^G1iJwZ!ok|#^wysEf-WVdEtI3Mbk7wS4gtZ z@m{{~v^CYCC#9Ckw!I>CJRbMw~Gg&2v!qq^2$0$f4xk|`ZKPr}UGjd%gyt1V!yjscm3R2DncaO$g+5z+xE9PS*ldHDjnJ2#0n=wQY0IA~N*B&DdwHDPFo1C4eG zR~QD?Fti$Hz#5H1WAe@CMV4|3ZS2Z^n4VhDog+@kx!)&hBt_EMc|fi5pvC?w3`{?t zNfeywKMSQ5Dn@itSY@yl@D))Td=zUKlN4x6%=SP{G}%}_G6)m-xKg4`(z@lL^@6(MzeL)mVr3K?P$QohYxri3EsK&U+^gVrhUpMc=yahBs~ zFa$5HK25F^ghW+0C>$vo>ZYNt#7nGR%xT(++q>6@zGgN*;Dr~zNlJm4eu=v~xA3$q zT2I90Y#2j`nzhk{?|;{Oc;g$M;Gu^ep%`4jxfYc)iV|lgOh*rJaBzd0*A_f*;VoQy zX~t)t{w$|2!^YZzvRosjmZqs0mL=8>39X0NVp1WMN}oj8nJa!u%i<$xMcX#mB%Czw z8)9hivBfyYg^Sz7c$a6Md4{H$VDuWnJ5uK18RKxS@SR)Y2a>t?#?veZJ7qP~ttWyNu`){;fLp8Yv}=lK4qk@E(89 zZ?`Qc<9l@C*NX z1u&qjLFbl=aSr3a76oo#afO(wmO~*}4_sV&ZE3eMk#;NN*sqptZE}SqV(S*~BW>#? zrYnNBil*_{Mqx}#odeoCE1K>yVluhg7?p1soNAlf)~x(pj+IM_7{Ta5I7b0&tH64a zSqfpsYwMUgl5lV^p!8#&e8ZFc+n@ShI669FbGnU+n%&#GoZ8%^ssb*zCnX+Egc?DK z(wJOH(FLHP^_D{Cc9QJ?E2JuW^f^uGz(-*ic@4&CoGNnrN@KfuKgk7J=L_=12R4`= zdT!jfA#EbWgUwforfJyQ+okmjT3<0=+~vltm$-fVdFu9nx;bFp?qZc@o+6r(M8S0M z2y4?V#?vVeTt3IcuYVoerzUKk8Q==QhwU~t7cMj5o9a(HWsj*rvs9q^m~=l{iL zKMiM3!~gM{r!fkwt0ldE=J3s=MlkVBOJk_(*Q9~3GCLjFZ2f2RzI_vA}y!EYb<&&TMBtQP+KMug} z{Lb%St>ptB_&{$2{rkWF`^Q$7fBxrx&M*GrFY-e_^h3vtp#M|GvFe}6k!m{S_$s-H z!Y-4sjn1mO*LZy8 zyyPy*VlvLE#9kWn{K^!^Jo8o+o}3UwJl0Ys~fzaoVvl zU89;eSS$QG4bpBh;M;`CekIGC6S-py_dJ<4001BWNklmFbg}y)QV;BojhOn|lH<30TF3Y6_`k9pmZTCf^9jWsM!a3bSZbxk zoIF9bj3+}vXi-M>=Xem!t=JnW&}fMi%y}J3$txu#?QESZfB^+cqkHhT6nm`xyqrG- z3?8ebsZO}E%AsEI3XI{{{Mh|%SoJcx_xrkXTlFfv?`N|jb~8rW(Mo6ls7OdwID;`} zZsy528Ow130KZGe$3On@@A&({V8F*d_Ob71>U{a~W&Z5X{_M5hG`fU=Wji<p#RWwb_LEIBikWHf% z1FRcitmV{rz~Xiih)BFn)zV^TC=z7_|g}4xcm@oo|5jXQUR?- zC{q$!D~8au$LlDgX`3Sk!!fltoIZPr6nCj(#m>$h4)*ualTAv! zfmRx0VN{IJwkE}jYtMb27hgPNb90;NNDR8&U_|tWL?mVoXHwuZ2p}pnNz!mk_t|wo zAYu#G1B4Fzb@w|tKtb6*9*|0O%pAfH0=m*Y$E*h%E0x1l0GR0F&7hNu_5hR6(=s|C zh`ipis@PS`0aWS?rRBRV|Ib1N6_2%AqZVq1v|$4|M}rP61~HS#HvmKQHEv+o*jgu~ zR;qndW1&L>n!)l{_8vOP+ZP~Y)F*aNw4(b!Q^x+<+!$BwIfrrp0% z8H_PyfVgZK$JlX?yS(5oyZPRED!0J%_u*J|*eu0NRsqqIl%Yt8Hi}8QPMS6al=7H- zgzX6!JQn*S7Pei>$L5x_ z!Wy}-rl=^DrHON5SOUQF+plBi#hPig&42e}KgWZUhZyb-u>+4@M79PSc<-r>T1Kv9 zv8ZuHi8atv(8S1as9B^W02m-dLNX)|^Qy+>{N1+l_|(~=M<3a~ofku-X+2f7V0O5J4>i}XU19g`ZFY9i z8f>9$iE|~VPo1MIhpcVF+H?z)X1aC?Z5@$BcA5X}!=J_&`04*v z@zx)()OCwC3)*IesZLQHi2$e^7z&+;szvJ|&p$ikqS+W1vQZc5WMT)pxV;mm}y8|QGY#M+XrwNq5}9vkCJJpS-g+`RiOUV7mQ!|^Rf z!*xz?KZYqrC_MnThHpL2mAK(RF5W)Fn$%)KS1pQ=0+0xC$)Tm=f+C9<;26kIN?|CM zKry#_>p`78-~x4BXMsc@R!v_C>Q$-Q)3&Wxgd~ZSYg@5cNxJF10aul~DOZ<(rDz0* zG4$M8)mIWbkf{3>DL^pteKr~5MFKGe@tjPaL`%SD&>1ntax~v#a>jA-!Sj4;_gSI| zU_z#z7%+yA6m1NoXh~5Mk|rich!A2RD2qa8ftVE$NQcB%tAA>_FctsMuIeVK8?fZu zb=1gJPTwj3v{8#cXX>nKRDbMZ2S&As%~DFV>ecB19T4pP74BmO>k9A*l_TDiQ|KUF zi;$vlaYMjlfsi@De>bicFg@>DU7ys6+k-T zeN>p%k&>s((P{t##>At*>o2^K4SNcIkeEyd*ntq#ozqxdFt5bFPbw^m5DHQPt27n} zExm~52~p$hkj>3g_%<>b zSez|zg~8Yarjf*wQeg`XDN-*qMNwc?NlbH8p?UV}ukepge~IUwdl|)m{cym!%?TGS zZD0lmn86{nZyAoK%nuccQ+)QbSMW915u85t7>BceX0i^n0c?e@*Z7Nn|5bkIhaLgt z@LI98eTu4*&;2j{;uRi!{W_=o8B$tMjxG@An~X>2c;t0&;Y2Z>oP#(PRi_yeRZ9~q;iMTS_8v(Qvqg-t zN_ek62q!IH+`C1RwN{k6EJXs{b2`d`N@5-yLcnT6PInent?C3>IlZOx`tt(pthJ~p zk9Y6URS;LjC`-$eS4R)a$0J<}RDhx)Mo$P!0NXA0LJ9)-bduce)b#Ce5q!m7IHN6G zxOg5n=rW8ozN<_9Jk_As$_Wpnhd45uw7+Smr8^I)v1Pz;B7-saU0(jK|h7~}_ zvE$TNJNs7tJ@cX!Gy0Tr+EK@k)Y4|xiku@Xi(ua#2l}h8b*~7>6y)|l(m@CT9|Jan zTHz4pigMB@wX^~{87Jce0G^E3WE@wjbzWSoWB|)!Vv|7M_RxBDWxMpq(mE%2m}Tol zGI=%0DqInW0eo1RJO>|%Ap=0ufl}4Cp9SREm48*fz%DC*VzUB9OAAV0oDeziC`-6Dl{2H zw2m0WzNf7cwTZ-V$o$GJKL5F|@!a#TaCp?v(sFuwnkU|Jf$g(vxbY#$dQ=$UL&S%Y z>sLJA_}V`61)P6i%3yQ~Q@n&Wm82Vl1u9+rIA&xFT@v#xA45Y4#2h zd;9RUuO2WOKgjyVCW7+He%_cf^a(1l3&&t z3zHyuh)OCzk|mod15u%qsFyX7q*9;HtQ90B!F5`v{@fGJUy^Mkf^x?|UzaA4PxSow z(x*=K=k{@*z|NR^2|7|XGwvi>SqPCQ#msw)Q4x(Kfdn7X))8EyZ9Uovzs=b4 zSXA7Q&K!0r(r}q?*!ia|!Jefo2RJ82)y5cHVfq%ZIQ=VPp?UxqT!~JK&@NZd8}(_P zdh>gEWbFyI>MaTsvl&b_MCsUuh_XtmcEQv5K+}ps&*&1PG>ds6jV-?O>eFDI6^oe> zENYK7hRI~wPwvLbg);=0&vNHo$^96?#6kO00h|_0Jk^Dmphb5zFL5K^2Y8XxwsDK@T_YFx!is3>oVDnQXwII@9 zjKvii>k{+%5i|;eMb(k{{D5jv^G{#>3vS%F%E8f1+Te(cdDq+C!Q0>Q7;k^)WzgSZ zF$=iihL}0Pk7r?Z)WrSI?8QPr$Z8nkQ(Z{XPGYmE^zB^ z;PROXldY1rcHG(VEGqcqU%bNhsUPM0f8ZTdew)LClICcO_dNAqa(4UcJoC)w*}v7W zm>)8q&jEumLxNqPa5!BsNf#KD>lAKGR6Fd=Uf}x9bKKe4$CxPxvl*MC2PldGTN~#o zOi5@x8i!JvLOC!Bqcue_1Qm((vUM0ji%)^z)iKaOvP)pLqUIEJX9gDXfGB^pm}S@Z z01YEy!+7ueMHIQ}sI^9!VWvVz%U7!MD{5nDUM?qrmE??=bGlQ?@q#1)p^}l7D`FjT z%1Z4d^oE2Nv4#@ih}N2@X4o?E@3MY$oX(-`9aj`5UE8 z-vTD)W0X1*^JOB@y;a3kYZ;Toxl|ez8Vnc{h5LuXph;R3;6`amSLW~5zc8VnjPHqY z0sv3OYclR9F4I@|x+>rDXWd_9kr~33S3Zi%}YMB6y9_Mvhew-?AiBEUALZwUm^xY)sN3)CznMpXi=c-UZ16^-)7; zy|gM@Pc=K@rRTrJ(a{mR`#apady|knL3_5(Z?d(u#RKsYXU?8xI2ke=576~lj8&8) zg*F4CZfWBI<;bC&rwx&q0zvtFai4=~M0}$PEDDQ4NAVC0e!-oaci7q4o=ce zHeXPO7DK`2c%8@J^mZP&a0aW#9PO_$91kJZM88k92z>pS8$9>ioOuhw4bRyJhZNHm z?FJ~(R}dJY)h3HMG>yfTQ`&Tgqr*LlVv9u^XaZcjUh(X+cR79Lh|Novsp}G7m27TZ z7;~l_VZfMMKb9z`K^{FZrxOnojKd=mwr8Xg*KHRe|GNS}6TRO3@$$p6a`7Rm9 zG0E}m{sSf4IF%p;PMzLDsivP(tkq~|F-GPFa;4G(UWsK(R5>znsY8}?AF00U6;QW& z>yAgie^HSmJifzBxIB)losI4W%YVDd@AB3?c0X<9-uw5ym)wa+6 zuksa7#`o?x0e~mtH5)R?b(}hmfvaAP+XKR7`bKvd&}M1HAO@%_!Syj>jLWSend`+e zCiU+p6~PSFtm!Xwa&Z*{<$J;2^8WG1w6YnPYH1f`fkunPrGio|0pNv=2NH z9PEQTWH2%u><30}jfWq4j5DVnpeTk^3yt>Y2&N!Z5#kHny>r0VzIw#Y9ZgGMyd5}m zQ8Sp<7&jm#hgOytN^V>~A_5^9%E5@F0?I~|O&C{_fc=BWGtXRMI=#f(*WOH1mn1); zaE6VIQ(QQEffv7il`77e&*zLL9*`=u)|wO|#(K1pXfk(rj*%U)RxWUQhedmrnZLu% z!7T>$h~Z$uWazPzG0sSzQh-n(wt=K0I%tYm$a%sF3`oM&?5j;(c`0RzKo179`EOJ` zo`_z6pXy`7=)X5zrLePm5x>8P$#y2_&WElOA_SI($ekK^dH(l?<-M3o%1m-D=hi3W z2*S`upb5C^nz%7naz(`})-$4*ZlhfYAzt5^2!#pU1b`7%22n4i1C zPwbOQ&~%B}sY``9;Q*ctP5|J^c#X!Y$5#ggJ7eX(8rbphdTSPyFA_P1OanPcU1?BB zCU}KL*@(svHE3->BS|1eTEShig4cOsTWK+Mm#oqa`u8o0q6dY}iBYw+mZA_6xU(hX zRWqsc>(EpNafvodv+PUT4{_d}XWUM?dt*j9(G(L+s3S2!ON$v;tTWs`+|Q(Qi*FTe z6-gePDQJ_y`$o7-8p@ziR^dv+U`>%c)O7_wh@PE;7GHZ(P|Obk2YZJs_AB;o@6psX zw_bS#?>){M&YU@ebB5t~#Prk@WffjU%tTYimhq{}G`=C=DFy>JM@O zEWAvkt}u!V_V*PjRb09DJOexB(izQYxItkCP>SCq09hHoSS$q4&;h5F_MIzrKM@KIgZcED&fV6gz_41>Xdx@joO64h!{ z475kme)THR#6*#;P<%Al7}45cRk!f7IBhX{rR}|1@ykTSlvT7#ptZ7(DfM8!E598F zg-9~T3g@o}!YnJIc@h(FmNSm;1(C-=XX;!2o$+?xmQP*mTvz!O&R@#kfv%E#GET+` z06ZD5$%uLF9tkLGQ8tp4N9ht}4B9x9Dh2o$Lo!D4E?KU=dpERhg{>1Yv_usplQ((k zY>_Zn$#>PNuTZ22#W7;`aWb~<+tS%jkcfAY!NB8eqRItK}m-~G;ZiCy^5j#!A*7gvig^0a~6)G7DJ47`Q<}jSE(>5@l2cl0HBjC!G zhS_L8oAP#*h9Rb~s08ylQeD*p;TJ_vcK{!0>Wb^vUgpluZ4T%A9L)AmDlys`F&z#W z3=90(#9%T(4+hM&?+w9|NetW&S2}EAmu<#apjE=BK+{CA)=-wFS>OPb8dMW0s#YqL z?FFi4mp1LuRuzj`Vo|}3yK`>u&pE1(xT9XdtLtEoSZltIv0LZSi*MrG_615c=4i*D ztX%M;_B3jry1vF&uIzE;`W-4>q@8(M52x3EhESK-&0P-T=NU~$s4yfPp5mWhxyr2> zynNR%*XJ4Anh+bJpKxmXtvvSd0edgMh}IR)|MTB)^!(4Ve$f#83}YQlJVh}au(37g zVD}31y*c&nK8>9cPaUGI1y^9*DZG!QGNPw53STi=)R<}r;X%f;bq2$$G)+Sr1B8l$ z-REf+6V}(aY1}4O4NzE8DACanTt#6DlrqFtC}oM<6xR+D4Uv{Fz?OAp`i(G(%Z z{MFZ_XyiOXG038hE+1G$NfU{=TG#`Y&Mdx_FPbpxvQwW*Ec^^>M04cBG7%@JMGq2F z*WOg}ya~oV06ZD5(dfw9t1IX}ouI#Uk7Z)_x0!@i zxk}4+RfHt@wvaH|0gBN3Ybj|@>HFIyorjmSb-N5=sj}!IQraQTIN{^jaR#i0;n;#U zc(TtHhVtkwq`F{`F7~fq9yvy8#H1WEQC5_htw&iy2#KTpDw{MTm9dbhTWObdwmH#8 zl(x7W8J4uDm$ep=N5>Xw8)#dxlDWOJ&;I^ChqD8GY8kGVjJMD7y76TOqY_g{xTx4yK-;$N)z7Pyg{rBfQekvfLINo=8LrdL8>;z?c2N;)d0o}E?Cme8TTj(i zG~tLU9&q*U=b2Tz)Zq}F1{CTMY;-*O;M=)y{u1ZTJdCEKnk(ASNJejJ7)+sQ=3KvV zmCtm1+sr{}1S zJa_i*GB_GhmP3ZhFenFDD~S#&MN+h^t#4D81-@MnLSQ=Bpmi;AD9>BW8)p89y`6p5 z*Um5;jw#%bK{=7U;UeWOtHvsa(JrUbBtjIiMvd>!vqDK;EPb0+yaqcSuGR{bT>bt5Xfn_r%xyq_qS;Ko+_O*x#us2lrk7Km+FchqSb(;2PBhFMMPVvfS3>= z3MX*0dYD)n%I0+c`fF;;NRJsPOIm=hB5m8US05511TU?ulr(Jwtu3|??vctoCRcP zDS6$4rvZ&ICBs34P1rtjnxkStYBk9RQMIQWcbGLH(OO8FVlY9eL~9I-az;>vSgt7X z^-E4fPgYr)YEE0V6h(#EFyJC7Kv8InvV<(B2s-xSBvM>~ToI!O8MLjQFVaSofHXsw z+uLUdcdg5N+KfHeTm4t%bc&pds|}zGA*%ee<#{d&S$Q3;qy^mlW?2;kk|xpi=R4X< z{~#sM%an_h+slbSNP&&5bs~X4psMC8oW@A%MH>l>B;p9q(26rbPffXR+UfVbJAO;h zy9xk>szO@Y*~IMUmtx25)BW*XH(l0D&ejfg?0!rUPCdkw9#V<0hcL@X}WNEleu70%_+K14v_8f-qVF+`H=8F z;(elRBKRir4#i}`CsEb)001BWNklVNra{*`jXUcGMzqvVhDH|53~7_Q~QN{7xHJ0 z)l`d?7+abuad@zYH3iNTsEGk92I`57J>(NZWs4Q1M3HK8rH2(;51rGb1tf%gZY2oe z7ywZnAW5P38I-r_xU)+Dq_p@4#`tXz6vEBzIDaXr9+bt@JL~D=F$pc*!6&#<~UTp}!MHG(4 z*!(w=@d`jTZtg5yQ0Ca{t*ZJug)(&f9vG?;YlkR1B-xTQgyb5uX|TyKitDU5kK+$V zG&7C;`eSJCF)Kz|_DGRpOOr&f;_LtgtXa9BG=Wa+3l@sfQVbwy@ClTK7P)TK4ZU4P z6ZAkBlM zHv#&W^(+B`28Y_k8uvu^rxU94m7=al5h~ywbZuS4dd-atgz7jP z_B_;&l#&>Ef(oT%h7fSh<0LR1_Z(8#{W=n{cU0G@Z*MgdZTLada{W{KF z$Bmcd`o;0(>+|Ey=>>?mU;)?A>D6I+?#`ALv*LU-MmwK>S)f}9`{Gi2DaJk-{40$W z6sjCoGlXe=3z=-MmkLs#>26C+ggeK7|3Ck?JWdZ}H#6)yK7M+zoJ7s0Ya~;gRmXMP zh#wrTcT`tR%UUv3EMUGUlxkUd+APyfElhpYDf+k)fa^p<4S+A8?|iPg=sAA2{pA@T ztF@BS8Hg`zo#mKX?Ox#$n4Ys2Z9IH#YpI$kjUlWR#(6%ogiYtUl+A&*w&jJjeP5teWxEOVosyiV*3AAml5>Vy z(3(i|fy3dRCuAyovBNv*`!!Zf=Qj!|`ci=w^cN@w?7K!=sJVcV2k-=6q4M z`ERgDBC&nmHB*nPfzV}S9B@(yeuHy?lt-#&yqDEY>w;sm=^2KOu69tBG@CJ^7A!lm z^N31|<0}XbRRavb%H{!UrQ6a1v8*4kNzl^vYKvETJ_^6cct3@H1`9U&QudcXzcgvJd_WT|W;{oUzKq?fm z@vumN7?+kes??=ej-vi-GSkJad;a(0y#C?2XnCdni|u3JZ()6nZM_@;LoGiX|9*My zd#?Gr{C>H3T>HCR<}5ZnA!i2hayh;9F2861U)J;W0svpu&$474tH=uctUL3p&s$DV zB3=8xrDWaoe5G9ES*=f4p0N+>__mE<%+YJ3U1P`E_{1sbIrC3f?at+BSctA?P7_@h z@KKR)V(5fT8rZovZ0BFX$6qr4F0lW{#OYus@DMIcCV14@_fs(q+n6(T3W$J@HY&^+ zrkohlOqPNhJcUA@i@5`*3{B83Rlo}&M&>fJ8Mb&Yh6rL;y}pw@~Kf}zz?3iCXzBJ_Elnd|w&@6>_9rt6u;5y2Wh4u>bc{rHbOJUsBt z>F;?w{0&(@lWN7WWsp0*dixi=x%----?HlqeXKZ?s);-%yac?fOyiMH-~SVb(?{-~ zK9I|S#F07gfyy+^{POlKlt4+KSqXm2r;i7QZO2m;zWeq_@B@;S;CpiN>>uE?kCbdQ zeFI}1;L>#5G`7*Wv28R-WAntettO3ap4hf+Cyi~K*yfje@B96SeRiLjot?>E@>X(m zM0gLL9v&z^)plfN5=0=h0OG`;tFKupNQ6eOH-$m%Y^YzR6{R^4gw2Va1ufsZW2b^v z>c|Hb8&Q@_569wB-&Hkry7 z9>Nr~?!vplJjbK3YEJf5Fx98DSn$jB2;gf3Y&E5qZ_pUrl3f8OR@uWvbkQ0%`Z9wM zg%Rm1ePV=a4$WDN&cDIv5JZO^_)t3Rx%g%txl=VjdU0}&KvO_H4imMPTv-^1;%+n(TEp5To% za@kqL-WN+eGoC)0b%OPz+}G3LhXC-t2Lf5C*}+@VuXC_6Rv8fH^9HpEg7r3ihM53h z-B&WhW`;h)+}^8jnP&h`<{M)RO75*rMnTq;EZc7zu|34Fnk(~Gx|tt@{X5A2koB&c zKg|M*IXl9cta6DttlKAF@B}xBsT)}qCRE^5gH$k!qBb&ljp)dKvixz5Ubk$R_wtTJ z@L4(mnm20Dy9W0S*__R9($rUo`Qi#T!B+!?E5q)|NI5oLl&%@>A~#Ni_GYL zVL*oKGU*TnvB=64^FL;H?|j_4@$q@@x_wE>LmZ~5KlEfwM7I&EUq466+w~mX?$h-? zdl_-t+&?-fL=eq8hb<27?nWFwNA~v2x<2pRFgTT#$u=aZzrj&)+#O3JXNA%~l-z)KvF0_DmNAcLeP6O4_ zfWt)Ov9SXUIUB}+R~aov3N=z$N$uY$w#HVT0A*H!QnUp{D+33#zZJvcYZI<#^Wl=G zYHGh4mM3M{b&h7c@(x-H3g=mmngm;)USme}v>4=_R2YY!3`aDb|1>5iJ1mQDw~5Wt zONTf z(}fK_psrQXlk|Xs#1|60s8$rs0SE%(0F_p5r1uCo>h~;5>gbuyZWg zb92bkOfmvv@Pm+WMO{RN%_{)8qswF1wq@@)maB;DF(!Li$7lCs!%m35k*8=*CN#_T z3hJ`t&n4-GslGDWE}67um`1H6jXf#$un1&-xr(6y7#S7} zeaYcMW(R>hyr>rA1d*8nNCP5`ad=9wDfygH&-*gOI!C~(6Et(p?P}(t!8m<8c-vKx z0?i0^W%4d_IzjXMl|^6iX18Us!1#}Sy7ikwT30vFnUS!KRK$|3%EbA&^M}&nb)jU7 zJ5p^+Y(%0Lys6H`{4*q75-}K>?#M_0S&md?kz{_*^HSg(VKvs|I z=+6|>VMJ=i96J*1c<5+YP|s#6Qt4JxL~#fm>#ogN(xKtTkYO#RQ))|OcTYyWLs=RP zE>lfMj(Rl_h!ibQ80tHRNV=4GSyV7kWMCzzTn8mt64mJA@E)SxdRU9L3)=1!Fw<(! zL)h~9#!uY!D)I4<{SiKVO;-FeGT^^WV7L1@rf&C{xR#-3@ANKR<;r>H%4<(G?p6+c z$tyKAaXYfJhyF+`=DD^% zn|Kd+O><#&J#U0rbbvCpe8vaNERg^%cDU=bH@To=vVkZNn{V*!4jbAjq2d;4y8GA` zY7D+^l->+7Q4~M>ccr9bwp~LCXH;yyVx`b_Lc8iJuIO({Qu{p0QcOYz;Up1&t8|C8 zrIC)@HDALrG8R__Diwl8V54?Xg4K2{WuX2aRu?YpnGPzbaa)94?U07p4G(8n7`{2S zrWqR>hJTcuKSAzsgHWWT12{_=95#7esuWVJpI^>YH7$V5K&&4+S^h$o=fMRH%Q%b* zKPLu7cH#_e*N5&HgXym)Wk@P-YN7+X;!ndSkv<+j_xyH9e0TfbISJ+C)c@R4OJ@(wme85Q==@xt@h;5;i|%#bnn?OnIE5uEo-eYAxc_ zJB{g!IxFt`=w>gFu(f;%xdl0kGN)Zq$nKy=R=8FvNq0mZL2G8m3`AasaOZOF7SBwa zweJ>;!#mVkXYa@GkWY2GVB6y_X^W2a9$0Fpa1c7Rp@9d6@w3mLjNsd>QCoeEGq`() zblM2Xd_p#Etp~XMjTN_q_MPrFxZZ^@s6C4dY!%HQYJXtkCu%~l{$Aj^Aly#O|OtHN$Vne__=Dmg|HF# zIb9zE?8r-iE~8+@0^+Irdcf*B8z2Ig(-Hu^_RMh&@VzSR?}HkQsv2p(|ETybbf@?TN{o7U*qX{h>;^MsvJ%8WMW!A0@<2I$en19N-a0m%fjIs znIEQ0=`5@pme*%|v;QfrMUA{~N$8QZFVy7^4^u-gvNb4t+;5DzBNa6)ouGZ434-UytxXqZ=W|EX89R^+amW5R>r+F z{|^q^@bjh#8bM7ne>;T+LD&Q3&26D=Q>^C?jIuwgO!&?2ea~EUqJ`Gnq6{iVb&E@{ z(qcrORd!nT%GxQhS~d`!ccAW3Z)k4-+~?B_+v!3b{Su)hKadOqYjIPZYTei#4g;rcQ19%Js<(qr1-@ zZWXJhpjJfKR_x&)?!KV3FAPHU5EA3vWoH^;Ai9JYxIHr5$7WI#U%~~bQM^W}I__r| zCM89!3`!IydhmK7LF*f$F)e3dVrmUE&yg9sX414ZxF1+%T|}jdE8`W^B+>rB-}nj*uSDJSoy{pWk_`{6Ly_DjbN+4h}DC*A*gQSxG_TCOQcl+@&pzfAJUDVU^O zDe6qS^}E_XtK!UT7Y;nS*<4_6J5-XO%XomwA}AQ`U}Thk+^QOOCNw|mqIJidX4rwf zhsti_vL~&R)lWR1-#7d|9{E08`|VEH7p6mrJ-D3bpV=uoNuIx~0eiDwaX9SWw8U93 z(c8>GBj`~3JW`FBcXc>O;kaJ{wsg4U5)p!&}5*GNMai}r=iBJ*QNSyzE zr2CM)KdAUNws@a5-l1D!NX2z&->aNSb|6z4Tjzi2D3hr2yEtxm8rhrYjXh)!earWW z_aQ`{AUa!d(wOGbt$Ww>HEXH5>u{<2tr^yTZpo{uz0yC_A|iP#(f>ss+l9*e>Ghj{ z&)1Xfo$9~O;9Xz9Tu{H5H-bFeRN4DIK0kt=|iNR~ARY-yG0$+#jJ5 zXJLJX$|m|mx~wi;cl2_b{CA#q;NOaox``4(M#7de^YE(0@4@h(>FyM%X2ttEHyq_(15Q8DqapLQ@4Q&eN>GgdE`jTLLU3Z~$_=E5 zsTw4kuOv^Q8V$T2`XWyaH7HTr8dX#4ajA^2kduzajyYPp2c87xK@XBco#@k0sf@#2 zC*SW6KLC;^o5i{lP2uuWb0tv(Tw=tqzl(7=g)oLEWJwvihP^a_E*SkrkJaNo**>=B z(@R>JqR}bb2(lj%q1cJJr(W69sZ!E@_~$y27Yh|wRkK9YxJ93UF+MHw0)KL;3$uVr z^rYQXgEy}>bd-o@4y(uf{-g;V6icYd?uWJ-r)JT>_rTCOlDFcz`; zMU%LzMIIET?8w7=PM7=@5#7U0>yyH<*sOE|Lf-=Vuq4Tp;Ky6`3->E>Sk}4fgf9WQJ4Cp(86SD}l9;dax_T zVDD6?h8`W7r*D3dmJzj|0d(cj9l(a?n4oUAW6JP=N(P<%Q$(Ec6*HTA$FMw|=&djh z`IPJ8rNrkIK@;vgip2xR_WOHoTQ@O}pFP(NppQAX2?A=BCg0(02))iv%q4ZZ)-KP< z8g`?<*3HhDjp61DYDR8x(#ehn-COup`D2HkA*USkQ_Kr#iSqOq*iiC`^qFg@#?qxp zb9_6Tz9vCdnQHX;R$4O_0xKV}m8aa2LaI2!VJfDE2qnQTdSO1puI&^8%dYa&%+XXi zvl4S(H|_G&S-{3x83z*$Z~RwAPTYw7-sWkuFe3-jK$K9$Wor(uW{T5fqq=QJs^}y5 zU-(Bf98x+0?urrQsF@jyR+eNd>tMkC?_7!m{z~a{=zdKKI_vtFTMw8)Z8eGu01yX5 z1B#hLmXox+PVcZGO{vD*NS$S-I!sMGw;2UPaLU6=sry$HqCNIG!O6MCXgrQBOk1y$ z%r~MFNSUE|P_i~R$9o}|lP&lNh5uJ=EDFtp&zVZbQ6{u-x#b`^NIQ-7A${DD@7w^~ zTCv2HfmYEMt{)c2wCtZF^*}!)2H#*O;Kacag^~AjBOlg@C&S%2yBdRUH0#`Fo$liQ z{%)GdWl9mu_GVz_gmt8tDTFHvYV4+Nr&SBmX}J3$!+F#4_Tz2NP4s(ZPAzv%gcE2} zQaS{F3pY5)OQ(~*YbJ#$&3DI3NBxXAf{#z!OtQ-89=u}wo6x+YUNJHLC{xwt82whQ zSdMb0|9UP)Qcl<{1Ui09A<)Sk|7HCP#gr+x4dAuNxEL#|Oa#_9dP+9_{MN`7L4otI zf+NQTKd$pxnz2(f!~yWAmq)9mmXU z&vjaI?h;i!eq9XDm69v9cnh-`-1_HLX4$F$#-HoWf6c6%(AaENe82qw2b+)Kg8h%$s z52Ol9BU_(*X4>)M%Ku8_JC_vKgGGlxU79%jsFA zhjUR~Dltx5p=EsN`HZY}rL{GJA z4FiZDN0>Tr_X8lx3pq_zitJ%rKu)s<9ZPkx*f92$r;r^_po>juojf2}{S5?K4fPJLUeh{=YL=Q*8o($8^9k9~Fcxh5^TDdHP4xUo(Bmr93$5tf&`G0?J#vV{1|`f# zML@VmUNrg~$P4L}KU;9)b~2=!nUg-rO&VAb+Sdxhk><`CcOA3&nsdNYl(E|V z{eyP?TUAvE3>dsF!OV9PIX>@~k&kQExns#vbnQp@rVQ=ii}Wd*W5b+N+NpjA@P6RljNo z)lM0eq3Pj(W*4aEEXyYZ*P89wd}sKTEP2 zYsMPtW~3nhz+X~AgYd~<0i$bb-0G5Nl?;=_B^#05RV{0MJ}=S7b8-AJDzfKXwxA5| z%6qqZxyA7_j0O&3NAggupAC<${UAb`T7Qy|xlp@&Z*w_a_MQ-_IYtg4x{9+ylc5rA ztze+hl*#)C1RQwzcR&w$!R*xXr&K&jARwQ3{$23?(AA2>LqWIFe&PJ>&&iNWR-6e z6enmA;72O|PUr^I7Wy(eyNKKk+VnQ9UeGK%alu&?o?MlS2F;~uH4iWk4%GO`u%5sS-;%QTV)g`bemSg8>pjF{%4h1k3 zV{1)rxgE!&?#kTnRj6C=*39f&taS;>P^-Z)bu>waQxK9&o)+MfH+rJLbIXue?{Gxv zf#5YZA;B!A4=;=FJr5H8m`q6>8iE6s+akYSBOih;RueWxEO?lvB#M|wwU*v>#m;b8 zqr{BHbnxHRVnt9C957xB&uIZbDuB`I0R%#3@wahK#DA+^8a#vDi5YZ5NJfDNZ+w+W zp$qeKO%jkf|AvOjtdREl7T={Q6P(Z>rgi6bKXed;K}%*}zPKT$@DSdb9sgNouvS8Y ztwR6HMY3eD=`egrKNwKa3J++DV6>Z|a~0uj-vn@Psp<`N({|9IQAr(F7e_q^t2c4Imu?Tv~nK9fp}Ge{OeI!n%}Q8UBj zA&Xh;)oYa&rdp+rIrs?`s*3$Kk&}x04rJp{q(h?Q%6fQJW2M|Ty-GEq4Ez)L$BBcq zO4Xhu6{9l>*@hQ-jZJCP9WXgx7FmpL0d)6#n%FrGo7)K$ZE5YI2#jvF>oRn6kyz5J z-B?fG=7&;2R}EA#bCgAJaN0yZc{c1^jE0_OLMTXFbf^geSC^`t+7pro*)G2<-QB|( zi-M}TwJ=dRn78&^y=)UOj_MOeQERuwGi=>vY^Kb`PM(G&o< ziDI~p*T7g3Zbt7y=Oi~&;SH0G&yki}?$eMWZo68}@>>DUb(ZZUC{BGmpd8PD%P<3J zAo7G`;0f$hDn8?n&4h@G?EJc;<9RUU)0N7FG(mq63I(g7nS6K4s1lfPcM*2i)v8z7 z%O>$DwjTp|NsT`1&y^PPg;j0J?P>Mma7(El_gp^$fbhczysa?a2w;qB!U@cAsx(}` zM01g#&&~Q4gdV~~Jq>rwH%5Ck@nvO0xvn-nZQ)f)xh^Zd=i~I0ia`2xsrGuzS#i|E zU^N+Pixe>XVQ<^0$}{}93L%^OW#{GL>j?vfy{(Q_bHtD}-gTBOoiESZ?BhS#w+VX2_*9UzF+vr`2Vc=*)sf42XhkY`fE$Svdx}vmjy#=^VSWecqr%27t{Kj3# zT`}z&^ERzDL88JjZ_G=eqw!I*c~By&PqzU>nj=r;C4VE*@^)pps#9*V$XMD5dO8{O z-~pVGAyC|izQcxbz;VAo{BUsa3~CAA3H4QoPGmCa{atx3+ux~|=WjVGfjj&bG`ONv z<4fhNW!Y?>)WLu=-in~W)pa{E!GqVur68%+QE=AhVT|wJO-zmq!i-7U4t&^+WZU-o z>2%bN-=GE6wxcismS`-Yjv8NXvzM;oOD_VDWHt%}@^GAk=k8sDMBQGK-(-!?!G(n#3xW zOw+{hTg*7b#d*^8P7m3oPwL0w&lG1rs0TiN@9F*r$m;6P*dyO4^$_L3VIc&X^ zc&DLem~@oBm-q1})Z#;x$EtVyKa#{%9zM4rf5<=+fGh;4)A&=+l@1$-E&}ljixxY4&F99H+Z@MIeLr#E!Vx-p^u%j3&G+8!=Hy5I(ME`q=WHK zE~B4LQBn5#5I*?IG}FAS($wWU`rOodb$?a~LN*&`H0fjENRia7of8N1vOC=X<94yX z|MBe&c!qDF?PK$kn!-pXDAgUmRqSz9UcR2us5G2d)|8~@svUBKXWmZm$sWQL6^eQx z#G3bF+K7qaBQ{>EYK_;M_f|hRC0AQv?b6_0Be_VyN^@xC&UbVrr$;4a#84H@#l3$q zD_?+uE4oCDqn&VRX{o5Sy$UP1g0KchkD%1J%oOs?aALynPNPXwYUrr+WR=CBX&YYA zi(#TT?bx`jR%qMvF{}K8P}nuH^&cW+f00=WUMKh9WCKj_iETHcn<%pg4rzL9PNsjix8a5t>l_d4r0(Wn7w%6AIILGfjFe5>PrlcPpRhp0kK;FD?HwKL1V zM}D19cWli#ODlL9ecW)3M+f?x&3z(O8floj6uK>Je|nHnH(`AW!gd)rKwAuJxE{Pm zD`hbTgeO!wjoZ!Ww^e_A%fjHhcfB1A!6Ve^aa_zC=X3S99 zx`Nhr<_S|op`g~48}C)Y(FQ@EB5@Y#!NWz@^YZw0)0Z*@1ja;1wrzY%QrVKng*lQm z<*$4i8UK5CbUBo%C)KpTqy~0NjGg~vSv{D{FKxzGRWLrLu{+!KzaZpi7?8;q$2yA)B+R2P<31@3H#OEJ;zj;KbAs`@KNV=IfEbLvEkk4*kEsKUMgj$c8eB!yGBV`FV;5}EBUtb<K9H1Lw4#7U0QH?T?U%33<-c*8j z{dDtf;`kEhO$L_CrTbTTv8BYWSQ##T8jr**#)#p>VoEL5sg)u=EjJYX5V=K@y*V}k ziTm7pSicL$n5vnOTA2=46ij18C3^`u&>i0+AIlXVqUt_SE!^T~rcx(q=D$M8qd;n^ zLk~kf!qlR$y}7L6;^{|Z*7p20+oNWD?=3QcFUe#`Q?q15qP#|*Tf~}z zHB^)~zE~Gq0A03`O?uBS{4W}2G)4eVJMqu z%<${?&J!%IC*;*uVgb zt*d)^{9V-j5{y>oG4HEyzv;53yd#1&CkMnPj0EwwfLny!?+}VYmXP^eWvo}l($b^1 zoNfZyfR9)Bs7;fB@lQSNApd^94`#hO4>L8!W8WTeg;JvAFO?Ol0W*7mjiLD5XsC7UAA<@Q7o@ij!Nt8B?Q zJ*p$ERcVnrOO<<@vj`-OQG-rX93t7KLvs_ZPW_a+wQK84cbxOh<^9jAy@3vHPS{`P0hc>z^r6a26?yu8?X2rV#Z#fi!q@<#Xs66FvEI zbSa81mH1Hol7c2b6%JK-n}>QzqM{m;Ic6ItcRKQHDG~Zk-8jv&e=p!^mLl8&C4Ze!qFq|yu`Y%I?5a*cdEhRO zG+@sJ=I#IHW{MS6iQ|!Vrm1fw zUI4~{jaeQ>+2vsi`EQYCX+*?O>Toq-6ls3aiOp>x4-K(J2KPz`2kF=XL{dFJSC z78@~r-(hb2LmX%IXDX*%*Wuv{egEQs=dOX12^s&j_P_>-PSIsdPF5a&jPgDkQR*qb z@>^hp1kx?K&r3Sur~h1S-NyOK-HHbJ3aZgG<--#R3z0sMFul10m-L{lhv2FBSP*nqHWFv(2j*|ILCjsIodN|X60xsmN<%P^K%p?;;M38(7gp$5iStVTL#tA~ z?N{~03qJ3KirV%G1q+t2y_n!KGZkR~Q=kqc?w|$*yU@`_-X*K-iRWF4|18T-vlL18 zICg*I204UGw9crS?$&48%`U&ecD>F$XRm1iL8hTFX88iGp8~spA8pYsVcQp9>6p#6 zLunc1+T+UzgraAwh#LC!D=0vaIB6Tut3jhtmmb03N3vK+QWvF&4THYk&ncF;dDVha z+sptAVTu5E{Nn05iRR5fxL)z@UF%oJMTnQA+D6s2Y3wA9I)10(WG025jXt&OJ(%HG z@Q#ef)?zgLg&S;%hT#8$Z(jU$Ye;IV>IDo9DLZw-q^2X8QLAk_vSQE}`GwM{;^r|Y>~SC3 zyc{~#x+=YJGX-@z_g>0-3t*v^<=~m{FcGpEv%2z~39w}6*HkStb>z2#vzlbn3)xtK z{KdM$P+86eAaI@01aE5eR)HQ(s%VWevcjJ}TMzvZijiPM@KJktTBRW+{CkMMLAsuonz zIljsy$K6`2I`L%YhzwXBV?DTl@4o9d+TQY^doMj8H?!3D7m*R={YFeD`2m_>lbyJg zIX@R4d47$>m3$p z*P6~;(1>e$V{Nq|nX_3bc*ds84}OD%?JzCfNcEU(TJT=!z6cY;)sc4a-oY!!uv>lT z4n2motaHF4`oz)m?dLJ5W&Wm;vMz|fn@e5iLuWxNAdz*>&7(^NV|`Z5kTT@}_@Z2W z@TJ78{LifXSXdPN2G%QA22#Ye8Y%CC14}WXqL-)M{%aK}=A>RlW=zo@>9n1~f!I3~ z*QX^-l>(MKA$bLLezidGS2c(mTWK^gQGwpQ7JdS)#hY78Q*LCDg173~t%^0+Tn_zc z78@{Xi#v<~m!`$qY7C^&WEIe!RGa$Fx1avADyW5KGEm`ID>*~5CNws=QoTq-EyA!A z5is?oLQF>VnKrF2TtoPInCEP{V(v(7uTEjX4n|TJyx>`}#yK6trnObe1G|d?8uj2v z80Fd_+-FO;U1tG~baPcq1b%k}C~HlfCHcX&zQRnEcz@qIFG=1xM7bik!ad>UnXG>Sm2m{;hL-FEngK_jd@d3 z*tSEae+f5cM5FK;`%pl(Q+kw1{`OCD_E@pnh`vNBf=TM5bpKz8vwZBzSP(%2)-zb? zqe^GBjkR$rLh`?{P8}Otzvz4{Y{)#KC5d(#ReKtDh$=3rBrG!JrIPe{HeYt^*~H&Q zd8Tt^xk(OFi7d>7@)LW;{?oUiw?()za}&-4X+`L|AF-#Ww7MIPL1#D7n=^)n~pv%{kF|U%eJVfO7zK)pn^t{d=BCZ>!%b*6Aq&(G&7~IpN3Fl1_C!Exhh2z`oZquAY-G!l%{0!FrKibwe5bu z@a^FRp(ufV$L@88UGFy@zo^4#CB6y&5g8B!37;Ykb-G92P(vfQd*zp~R1493v2K6D zBS3)PXp?YNhU{x*$CoT<$bm76It}1el$!1FmSN)!HqNST(HH>#$(UrIYsEV<-l*bVzGfOIhnUCT%_dT#}K_ExzRdNr6Flt<`4) zXJ8R$Hj;ZO;$Q$y{IO1U*G+%u{(LLcDs*9!Y@(c-h z1T&oBZ@w?#M&p04Z@N!jSej36ru~k+u7JM)X<@FY$~p*C6@HJ?P)pLc{;BS|nCJ*? z_i~;L5_t&wN+rLqM&lA%)n>x&c70HV%c}NPrNLT&p((YSV>!>bs<5g*4f8wmR&ajQ z)*?jJmi|;VbIjBp(k_e_7O~<~9H18_u;DevN1hu>z+{cmXb(NOr?14Xa&_mKlX1ZZ zT$N~6<8Nb)*U`e*V(Td0S1y)|$iaZkC8iaNO{V3z{zAq62P|CyPX94sZd&gvOX4#b znyLG|XyWDQr_ZpJzJi=$=RA3N&O`?}Gv`X4>JIJ!46?)zuf;~w!clNrRy$14IXI?t z>w*0d`OV%U7I^bj_{+9cD+5+VY?`jx+}$a+NUfw&HgtCY+ofxHTi9q}t$(Uf4WyZaD3Xh?>7F!cUA~a z7O!>&WYpv`oYYFRgqA3^%k*D_08V{sYs7e9z#9t_lT5BTTsL>#HTuF?7If1=HGsT02cZfN3*zHr^U+Q*P>M z1uAZX5@`OW+vdPX*q#DrZ@Ya#uu&K3<@8$jaWVMZjwf)30D&EwYT3)px??d1t^J@U z{XN!i#pSKeSMa~I>R0b7{<8^@yv+^i{@gh}%<$Q4tVv?{QWF76cI|sGY^(br9gxaF z7_XP`oU)~O`Z>JWekWOH{Or?hg!~vfQBme)w{?+qVc}SUx>XD`4w4O2drQAC5pGoFiu02m7Mpc91|h4eR>k83FwibIeHF0tB}DADB!SC>GY6 zgPk2)*E7G5m?;xJ$HPXaSs3!E>*h#uUB57UnGwoxSE@t7&(AEw_>-h&E*o|>UUdgC z+L0A#5PXjElIG96Cx-&loWto<;byCjbmdmQ2kW~j$-`mnQFyTY=jrSde(n^> z?@V>3QuMJ2*xfK3-omTR(P7Q5g>AYDXm=a@*v-Qc8Q#b!4*rs36mVv@d7}jU(y&KD zAuO)_!Qg3yn@(lO^Ny6DAUfP|cp)Wn7s;D|Vhp<^&#(iKV^@MGuceg94nWsIUGU)J z0(0MyE>gNQq+6SM>iyO@UcrcJ$C>B)w;ye-8!n8uUuB|4F zld3hn7e<{whP22L!u9T@+Ns3`JV%0NhlijNkPe?mjsL04a0A`|O%nRp0qN{%V@=mk zYEVxH0~lbyQsYQc8P%SxazgcQ$BPxWi~Ar+-7TBI zIc{_faDzsF=Xv#k_B`g0@uuDPSLIt#rZs%sUpko1K6~fPLzqP&F`k!A#jHsqbYdv? zs=Rydabnijr=MVUD(xF@MBq4ww^H3Zk3P!~UB5oF8hxlv%$k8cJHPad$-H(mTMOlJ zgo-T+-j%?*5Om>sQm*-Zsy z!hnIm$aq$Y@6;703FH`iwIAWDv~H)!n)i`i*h5T~atf@}@cHcW7DoYx!tr+#hUBg8f?EU{*045SK zk}LtGO47r_g(mz<#!LPiSqdyq$>f$uc+;pR9m!dJ=hZnf>B>}-2b*Gkydd7>mvmz9 zo7b-k#F|8OY0Xh-)43>@Qs9N0{9Vd~y4?=7kwyO&U>N$#7Bw`!+$vWX_}ImhtTRxE1q`&j{s$ z6=>?P`N#bGBMbbjd#jzGpUEXI6lPIk-`rw3kc%JsL_!Nto6j87+mhy#gameW7M9+g z1bMFI1@xZxKHvTJ7(dUj-wx%mF3v)L`^q;h#m!zrIO`_Z{mYArX@);3A_AP{H{$%s zmxud%iEa9AjO)(!Rel@OEo{4sJN}Zr3-z&TBblUkmZF~7^{uj%End=>!(SfK*1*){ z9LsR?ewhop_R_mfX7reCZfJ8CaFXiqe2RRXqxJm^@%tOnzEtr%fvoo#s;sLy*0)io zv=~0%lcJOtzU5blQI`l=3Z#EzI3&;|NV@DaGIC$z1#geH9!$^SH_%eh*ATJqsw^7< zrP0{pCy_Jv6+4ye1T$yd+V~fhnZP2;v)a|mlM?|2d7oS8!&^D3e(iSg>+oW{`p%tX z67;xY{PiLpHf^#J9UPH1&549isVUR=t>H=&5ZVz7rU!HNRmG9rqVu3Oc>ctHuuosmrw?{U!$=JO*YZczq`mcN^!gldHJb*CcAwxSCB36sNj zAMmyWsPmSd;uP4&!*j z$6gvLXHupHnsOE6qo`Wc(}^YAOf5Wq4}d8N4j(-KJqjw zlp3R1wpEo8y)L?V+$;IO`Ny4;x7TyB3H7`a1@=yD_nw3IpuF#=n8#epelweo^z@}7 zeJV9Kw%mA{3%`@rg~nVMJ0tLBtdya`#Gn$MI<~tp(2(!OMVfk^Eq{BAWQ>_6yk$DK zdvX&^ZntuM8DNga_FI7j!hlkuVBgzj$k!tF(^6bv?FG96TEx zvJ%%%bjs8BnfYHCf1b>sN_}B{IE+IiBJ4b8HZ7w8ksX^{j4-O;aurzw>0lS^%Abd$ zZTlQ`|PFiqq??24F0|*Y7MP!Aeiv zNp`P%sS{Jf>W0`Wg2llPD_hP^j^lAzG#I;wMW4ZsvimmF3qq(%em&?>MeW#}r_@@vA{>Luzk9!(0|0awgTLbfem^3H`WJ4{ z4m@=gSU3~>npas@U%nr;QNLI`eSd!T+I)o9!V`SvwR^gb5!`zlMShAnmv?XX>0Nr4 z#sJYFu{-K=RhtR;y^|45RX^{%gMcaDrtSxjbvt(&)Z|=tytQzsQF{0|4T6lPrZc}V zWyiLjdBZ0Ey%?_!dOCdjg?_l=zbs}red9{~%mPevayU!;gx*pP5&E+r`~mTO^Lv zEsP#lhs`oQ;Jsfk8l#Es@Y5*Awrvex2Y;YWwf|m^Ew^*7GQ=h@4&vB)HAgM^mLJ#7 z>wc!>UJMO8rQsqE1^?qk3W5&7ZlR|miF;L!LBYy&&2^}&_Ht+$j7GYZsu(@YDb>?U zTY%~x+b>wundEpf_n-Oj9Hiym7{kJIX4szbvPReKB$fu3{ z%QQlmHb|A9&u1~tJ0BleU$;0ineZA*xBjTVbN-m3z7{J(u_RqY*UI`ysK3hj4>fmMg*J+;u6Z1Yq#WM1gm? zzqtYRs^9LA{U)|PiUs#1l$bOn*}?);ZFcEjsVoa@Q{g zwHMaS_bCMxiXbOeAMPfGo2&BTJpm#OO?L*lxbq?9#c}=nbm4zs_Y~_twnE3kO6+Iv zWK;e2k00xeyMwUzB?9)gFuvnu(r@1(?6hM!yB4@0bb3C^!lzI_!y(q*dQ!NjBLHR-M2U#{|2$OQ+*V62sEh(&ptY3H{QUhi9|(77br^Y3SLb%G{Ai!&=Yy zMhPel)t3HPGZXZD*;3x2b9A@Q;BYMn3ym!f6I_n7ZbsV6FPZxyYIc+KEkST8uD6h7 zsbJkC50i0lGF@|qLZ|meONd%VKlHxAjPDkAaC7fxxUqZ;maH6qzRgvNzMZUV`qA2N zG!0J+P`CzQ@8v1BrKjjH-LU&YVI5JV_Bw%TuH~27DIE>o7}M^~>Y#8LPUT#VPHN5= zEVnB4X9uOXtNiOwgJT_&2~s*uL{3`HR?xX7FRf@eALY)3YnuX! zg_mSY3^Ebp52v=-V!ogNOG?yi7VW*l-d)FT(`GKPe^mN_DA0@+>h3f7IB9UKcmEGW z`1AsLj2D}}m^69G4tflF!FrHax{EK5C|QO@o712)elEfWJ60+$JActbcM3t3&G=Hp z8Gaw#PM6ZZ{VZ?vUX?YoZM5V5x%Z}T_T_N)e%|CY{%$hUfBOyGzoN}_F`Xq%=h8#` zke1ERsH$!u$E4uOdZe#2V`2IytJKmKQy%f%!DPtym=bZgx|i@kkx}8VBh=e@_<}kX zP6L*vG?#vE#dN;@7%xx1q8{-tQQ67Cv4LkoF| zRL9j|d>u!ckbOzkp86j|4h5=zJ%y&i(?1(a5)+8i&igqZtIjGdE0@pPe6%y3LocRL ziT;%r(a}Zmwoh9DXt23sYwhpy@@;vli0OgUs+N4al_+nKCa3;B@g9K{!kXgyPJpnO z4;c7N+d*?a)AP5j9E~cg3re5nUp8@UZO`e->#Cf1TpiPB?#ck9;~V_YU%Xc@AQu9c zzRR-DQU~G_OW$-bzGxjzhFL`hGC2ZO9H>9(Gp7Z1- zn>_!8h&NE`^)^NyjW+j)&^3VSfHcEoaYX0znOO9dKB&*?wcz6Jb)CHEk#tWTwu>(v z6gt`_)C+5JTFdi%X#EM?j!KX9JLn)79w6C-c~fcp#k4&oB&OeHB2#01^dq}N$9!|F zr4LGa6+I7oedvYF-e3Jw03PRG;y=&A8dE;BxGb5yf1`DYN z$O2QseS(&`IK)B%{x3z8ByV!uh4ssS;YTnDu!NVtz8oW|NR?K-}fYCy&L+E}Qk7h35&%xW?Mx$^!`3cTYks~LLQ!g%*elcJ!w zlBe?_+NYUl_sek3-{_3U5KR#}VYyfu6{CvO3LLU4QXY$yX6MZFu@AI|K=J8+^l-%(>Q{MwfO0G%U24;RsuRB>YMjdKe<}FK`zz)YFd74&J+7U@MVV}Ba66nU2PC829H273LV6GJvk*P236#7W1ME~i{g&QjzS9DBkU zn`4QEaNQl{Z6YZdnSUX|qJ_NtCkVxSZTb!Aw`=#un=;jGIhiW_nS9J!E^XaA-CJg* z^PTf|A>U;&XAW5J)ufGFasE#5E}aREyfLSn#ZnK5?Sn?W^;0g}D*oM7y!iv)xJmm+ zHO03a9`-Kdcd1kAnCfXeA!I{&@>R3leaY7JcGT*%RgE|RRxBuu{2Nera`2z<iE^zXw8LG=Hv0_q51mwksT8_gU?s?bBown*!kPf9;e$*{D5^Iu|PTb zUQ46r9I<~{mS_`Tdk+~6vnICrC-hG9^Ot!h=_o&@rc>rGAg9vgaB7){bwVbqd;p9Il}z$+FE$vA41JBI6jy3aTMtvrcjMlN{M3h5$|uBjzk3^CjD z8yUS>pcqOskfcH-&^3s% zmvPDcv!sb9%h3_CkjCS-0=HS#f8@!62u%}^KN$4HgT^oa)0{#qgq<|}{rOHzwtQ{2 zpGIUhNPD+Yr7;FqH=~MK1@s4AzI2eZ;tD9uBokk}tCsq*T)$=gO!^yeaQ?z&&&|4- zn3!N8qP8+@R+abGe?i@DDr5Q8>4|8dWTQd`YfTkUS+*uH4TM*?f3L$L5&9YTQ>c@B z=jj)+bKrEJFztQoFn5A?6OH=Tu35ZpwJ@>vREj))J!*-a!6Gz{G^XUYTg`=b_3hWB zBJGZcls`A#h9XnU{&3r}{78&$VLzgi6)2Y#D_M6bl}gSxundl4`Xdh|RM43VjXseP zY|(8ZabjlyR^40!jGzJS&$&KEq^Q$bn7K{V$%Ti@q6ApBAouN~5@Pj$?8o24C6>l4 zhXMUo5FNwy5Zl@@=j)0)yThtt-dPvo2qr9?EmgHWo6XNR!n{cY zw8lzf>Y{v*`b%aIw0A(3o%6@|a&w<$eI8@o`Al~pv`;1QL7;_B`4ier;djIy@7Dtt z;k>ZzBR=U7>IJj1>@|~PsC&WSKLCSMnuJUovM4*=F(Y@05@+8vm@YZlbb1Mo0g7A zsKouiSJ%jc(|J|ir+9;C1r9+U8)Dju68bI4yjK0Jx(wNGGS+PXX47{$8Gb9SZyIvZ z)Lg@A94fcYT$WA!^@%oN?RXEO^^Tg1v_i37J1oPDQratNx+gI$IShZ;=|W>o%z6ZZ z^%=KYb%hVCJ&Zd_UIJ(CStxdg8P%~Sz6TwTLiW|O5X(K;P80drwNOKsj-^Hj0=Gv8 zw!^3yxbm12OCg8IRLf@5u`X>uw|OVSh{{-Y*~(~iON`b}cSTH9?R_@LL9kl|b@}R( ziTvyQuAtrDDhw?`$Jw(_O=3^wG}uG2afU;~nwe>9Y{cJ$#?u^$g~H02g?j>KfqcNE zDuUy)uDW$E@RH*r_G4h-9p2r2y22MKW)BNJybKFd5teE@3nQiufYeFpg2p2vF`OPX*ggh5Yu_#2oP-0!^=T=d=C%ZNUqISnujXtUg$!VIqH5 zjwvyf6_X|jZLgoC1GC{g|9tc!S%nszn2`qn*qh+q(0mrO9jP@a zz$O|%$g0GC)9HD0%cV-`@!a^Dc=wL9dpm~)(H8{|g=(R2&!?p*MZ$T{>h;zh3nxm?-n>ujH8<5XU6D@ZIo`Ga=j~@VdnN|^!@@SYeW+(xQJOz9%8-1xeh@YRf+V8O<< zuxZ|5^gZj9Ec-fxwu`p86tmx{&KFU&I5&ukDwZ}mg-n;-De=mtX_A_zskjphGGz6m z`7)_Q&cf(ngb7eqe}F=;$@#}yWP%dob(F7VF{1GZk#ij+7&3Knmn#uo1HP$4q^-n6 zxjc+5qgn~q!?`)-@TJ`xcTXOXfZecoolp7BmGtK0X`I-EzRYD|0bXq1oZyAFtUd_P z%Nz~OA9xrMf|=fVGY^Q@oG8hMJ*tFO`BR$C_uNR(`lPrNjE3&J;;=6au5BjzMrLcT z_>Z!prJ`;ZWSk=Y9qXAV_;7sb8V$8Kx=u}Lu0M|LG>lm>vToc=EZNmtdK3aNC(r}W zO`^tm*dHi~8ViM&g$P8Bu$6N^L)~NbWJN?o$nN_07FVO9wjJVlXvG4#@JHSP+;f%6 z8x>u63sAIjYMji?t;LKkvr`nXu2|nd4jJXxQ{-;BGb6KMQRf^PDeXx9XVdkbv%}5D zchXv@*yOw69Pl&GMl>%#Du!WB$$6kqs@ZsLc1<$#K-z+NJ~rLTEh}2JtmygIOYK<@ z{szC+uK0~(I8|GnTcD^7d~G)bXDeH}+}rBDMfy`|16}X3RL7D}o;M-e|6aRS(5HOl zd`NWA<}V>IXasSJq*S+^s-z{@5H6f2QU7aFn?TMTT*uLE0g>A2Qp7!{|DRdK42I>GNrMB8<#nMWfl% zVt!$7icBsRX$<|a@B;-s#zD?9)ni{0C@)C>NqcJ7-HgVjUM3dLmHt#CWbW7 z>bnbpAXpc%E^N%7j%rrFYqs~*=gDwSpCVuo7bECcDM*q$vMYPGV!0R>v=X4?Rdnj1NuvBoLgr~ zE0yoHK#t?Os$TYW{WmWV9rSFO*>lUELvc(8(D905s^r|PteZ{ZR9y>`KK!WQ?L6a# z-nx+gZu3$12x5cEjH6{K5(61WuyV;le~|#a5=ARKhr%`0DM&6w#(#MiMc9VHJ9H(} zay$&XNeyFTEeVI7|7+B6crz+=*C9?TvlH>#5maR6&|G}fZOBULz0qOlxp8F3nkoLl$f6Fw@sQZ8oakf4 z9p~Nm7kUt%7)_bBAJOKtn&*IwVH77z<6{WRfo@T+=65{n%EJ-~WF=Mol(S&J#2ph$ zHSz1My&7b&^3jGwWITvd?#=?ssD(v0OM}2pfOrt#zm*WOM)zg+*-6|f^Xb!D{L0J) z;zZ1D(&=b933vyzXs;ZDWkpZ6k||BfM3%^?)$TmwZcyX z2$85hSuB(ZttaA5MT3acVR)ip(u)a&22a&r)ipmvSB0gIj7?*TyGTx2SKy_hDCqH9 z;MY{=d=&|lcR1{*r1ofkbDLe1;{8%kOzo?c)dT8;qEh2cMK-pfm71$ZItmq|d){n; z0{kTGX~7c$y_WNSw!Yuf{TS&RX&(+k6SvVI`iVtc5vDC3-~Mq^(4xH`$Hd@z2TGc|a!%It-v8G_nD_Q1GgK)RKpXygrN7EI0`6qLNwCn6?^9Gmo9gh z&*FwKy&CFbU6B&9tk9K_lJFv|BfGkgY-_eapvPxlK^Lz(gx>ts^hFy}JydmcIZ_1% zVV1#dMIg`ra{-*@;{y!yNCzDTCVC)9R9y};U(@D&wz@C63_W$|?-I{d=7a=!E79e> zV}MA$1`K`C;%SPg+^oZ0k7^5`90UY-MIXGft^iEPwTA zT8}oB-(TPNY8aZm8?4*rh>VMfm*qpju*ASz{LeV?|Kb{tV{#YM93Oo@gLv|%zymzo zZqYjulxy%r!qFZcqQ509)v?BO0uz^ZchM^*Ne_$mMMnOmMegfA%~&QfkL2MorZub3 z12lcsr#E0;;DB!n^xCrLakQYS!R)8U=K>#7a*OG(O?KEjNJ6OjVI$y&qaeOMRI-+0 z`s7K#<`;%yw}@pC4G;JtAv}hXA%&LwXtDl0t8-lGH-O@ou?3I_H+LWQ(v4mknxI;j z`Zb_`<2J#6z`>>&v7D7dF_)MJ8)b}!Wxw%$R{&;vSjVP8`VY=&IFSk8@j>R{(%cn= z$0Pcku;PGhOZ)Knw!AT8$6?r>SM%OGBhMkIC8cQKq5PN%Y~!J(g$$2(@k6*zccA9S zf4^)?R*i<=HL+BXrJmYacC{u9Z=JA!hFpx)$eu(J28`s(n3+Uy*(zgG8dF-nD#!2E z0BF)vbuzjofgV&TfC?Rpu|8MP_k^~&97Hu|iGQWxt>cT~XsF&t5!Sl44JxozIXz6s zSd%6)*Q$wI%#y4j$rg?z#USRrm9)d1HyU+U4HINo1)1F?o4qX`8a7os#dyl{q7@l#p>Z+wOS zMc8}FT@G7_69m`7(X{I+j0C?ydYQK71BT( zKFXUm$g;k&jC5`ELkDZtokO{7>F^UnHz7yf3nMZluuiO@~|DGBBw^3d1w zYp%EM4XGEkK1Y>9=0?82i?*pG9r{dq0+ZB7ZIr}W(M*lqp8NbJ2rg;hE`2eL=TAi* zyVZdrz@O&g|BKYtUB?ig+oNrg;~TSp%2c1B*Dms3^w7vk{GO2=fcO0eiIRnpLk2gT z5>iUNfo4_tX8d8@3`MNr67_}Sv!I)4m5kkYA3jK#VmsYn3@D_2CGOJrC=qh5H}|M^ zeGBY%{(OY@1MTd-Roqcxt-UA+xs)}{kQ7t23x8*D&@My#WEPAhuf*J;n)&&cBDqqG zy=Bg$&QJCd(p5-2cQ;Q&SbE|mnZY`FJfb73-n_N97W_*`b2&s^O)S8-Z`Heh zX?MQ}GF(o2zUE2AVjzyAv5x8a6lpOMED|e}jGxg5-WrCSWPw>u8Bt?lNhJ+#f zeR3R_KkSh3;dcvFMNGp~T0mZjP@W^?ZogY{v^m zee*P$GcHCSY*(`*Ox2#<6Eib=HpgQm)SY0h*d2@+jNJM?2e9v;kIn>KC~p_HGt!ljg2(*qx5^=cU(9UK0}!Gbw549b$JtF1ZXGsaB#=aC?4{ zio>i{->iKe%@9RHhqLmYhjBN{gJT!)|g3dBcNHUVH4ke)e&)-U8%mbWvvI;5ec|Dp_%PxTH2_}E4B6bOhCJ}Y{D3q)%HI8MuNp83b42VO$ z`+$@UQeogvQiGd0;f%q4%{R(~cIJ^QxTGZR5QlRRY!^5c6l4(I-=s3Djhi-}9o5KE z;a(C6D^7NKWPAEnI7NxHIb*s&?Zjj$d$QT-%U}|S+2{R_BW@Rc}8bq_iQ#tI8Ni^#CC# zySsr@7ri{yf9`~*ort|tb7h*GcL%t`vEUccko4HLPO8WmUe+s?KLhxnCsbVBj78G{ z1F|6TGS>y6^Q(a$2pd9IsTGZ#5`NWz1Chj^y&U!x?h2xeD{T7BJ@T9HBxa>&(o1`a z?nv#jTnOXugv8n(Q3R}%VK@~{_@NeZIA`x|l9|zp^`cE`LvxDe57S0Ea@le9iK}sV z9j=W;h+3IWdfpe=H$#hMG|eej!*^gy*3G}WiV!$sXi?1Mkjk0T2gsyk^lT{xdsH)9 zC>SW6RDRJtv^KG3b>;xpn#m)p5eS5Ag)%-sjzwzFr8(sjZySUEbg7q}t~Z5Aug5Qb zUXe>6NMN2(^9XZtGRwqtxVqvgQ)Bwcb>*iOY#39(`TyP?}<7Vi-4&LqsI{z;1*Ds;K+_-~tQ=iT1quy{pVMjaBF|FKu_6n;$C2rdvqO5OI7U-> z9L>!SZT)7moBH22nVt^C$I+g3F1=eR+wq@x5F@Cv0Ai&6!ZiM9qv!3~w_;U%qw2n< z4aW|n;v!hC1ZY)+sYV~E)*Uny3(mUG^cCmng(TS;Y1A3gN*5ety5_qUScx}V-P%N* z@0>?nD@&*!U`ra;u(|k{MbE9oZNIASZ}*$nxl9$zGa8u(_pVNXweyd{*Odv^2^?&(pkvFe z$nq)k504knKb*py=p?x!v8eB)JkWAly>0jMBTgs|H|YC%{;>r7hQLuQ7U>TF^|5Yr`gTMnPk{#8)1z%=n0<9^pi)+WdGQy zbnrbCHGS<0ue5-@L69-fA~ggg(f~;)A03IN$+8W#OcJx#v&LGrnOIBEp&d^+$p!N# zESYKeg`FA0hWG}GH(M|K6UcYY(Yq`~K!;eMY-{q44Ns^?38GQ2)#%+JlpH%N8u{Dr z@|Cs!G*|znt53DuWUC9lCtlqGZMHgz;+bfHl}V%jDs{Q;qUr1(wpHx~8Zb#Z@kcW@ zIXCP%fn5Jul3MeHMuv!NW)YKGMEU26w+M66G$akMno!utEM~bd^bCIDsqF_t@UyML3vE3*1UxqIn4p-8HxDlkMwRCBOjiS9I*0P{uCAaJ?S z+w3nZFDCE$MGmot$giE?=;eTHDBC+6dS_RfXg`&;Rq3yMNX9vt(Vlcbe{KH-@%@4!pTMpbtff#6-}jmmF-X9|>3$#-vFCN(_4@~yH*3#d&?QI^>fE#U;(zt7 zzP37LHP`9=*V%Igbof{)9I7UY+kRvxjZv34rW|`mB^*=x09vHUTwpX?-i0L-$=C2j7$Qvo@ zry{DT!O;cV$iokSk^n_TaZ*X#KWX&poDQQrSajnAv+em2&3r|x1@7-t${Zf&+)L#M z=P^e=SS-ADbGsE=<_AO3kN=XNt%HN(=m;tvKqqCtFz{|@%iy+!SD0g_erZHbqr8l0 zY8T8#NFx~`1sIZ>@p~ATn)!$scXj*9kPC6L3d@&n65dMszD997oTo=gR0ximPXD#6 zNkv|?d>imiqSNAkRXS?m-6`lzKzE zGB>4ZW>J^HZ&|thx%i_CUjI#^OfUSA!+CQrdZ)n~KtnYyritOCI);;=31~Y}YI%OT zqrQuX6Ysjd%k)c3tnTQ;_vXlt7SYL#1&pR6r{J`_Ibr`nvx37KjkXBPr2>aXE~!hy zc%z#KqnWh~K53xdIohW><)yB#0%(&(IFsg3*>2Xv4NI25=??=Ig+ncvsE~8fkZlLj zJpdgU5ip2Fm`X?*!~3UYrgMn#rE}2i@5eW`dR9xj7g%3A zLvvS{rrIzeM{84yrA{bzzVi{*a&FjDc$NhQdD_UpUtc#Pg6g0zm${Dz04L#q$HW?s zTY8nWuiJUjP45urzka=lPdX`MZ{_`ZpxDE}L2<~;6QKR^(T`v%^Y@o_*!*?2@w>TC zH;oHa!$Z`MyRgBvPV#85J-iCHyQAtz`^Jucs56-f4lgHceYx4hwUz5o= z$dk>o7cUg-X#F;y9ZEJ^Qx$mu_!Lx*#V+2CN(!Iouv};-iT5m{gfJx9HghB!3QZ&9 z_!oYX?#!*1;lzmZf|WdOYQg>$5`01N>(bxyS{h_*=g%kWg*lc8r2gDUEGA5PyQe8& zKdyc1A(H-l>|&583#ax^cg^*FXxk|{^UE(5EVO~3L>nP$>CBnWcj_9%6<-v*FJZ7; zM8SCAHd{)3)3O<5tYvjpdGcCEig9a~Nf{pG;kDjVOD zF)x}!_{#3k~Is z!}k{Wtg|$a+W>#eVduDZx>|@%8$+H?Z8r!aM&VZ8U-#oTfN2m6g_Ia!Qel5} z?9<1h?EvQ;+4n1Jsti0(*CPEMcI-~71YUJHlm`Z5Z3C^S2BF1gKJfRH?~aBG%KfGq zRw6tYsyzhWld`A5DxJ%1js-_*bf4x1dt z?Av;Fx&{a|5(`VGhtug)&8|r`{Pt`XNEA#mR7>rAm)*YLK(#hIr<%W62KVJf-w?{> zawvdQ52EmC8<`CVbV$UorML*#=$LASOoM)1vGd&7X?DGc24_FQJ&$0Q`JqR}T>vrtREnOWIgP0?Z2JD12_K zrA+x?ZX?lD8UPAZb8R`GG-r%AkJBpZ{7bLHJQDd_=GYEl%P|9HMgM1Jo9^0k>!S}o z(`owi_D8%&e$Y424kV|ZBU;b{#~A5BojE3!8==^ImpVgr1d7AGGe_Bg`P;| znuyuXpZyjXupQOPE2_^M&i4;)@?T4R{KctR>Jy^>Uu2pb~*{I zrnYRRQht@)-I4^+1R~=9VmZmjAMDVjze8dR+KwAp(e*=JaxRK9G&_}+al4w1ns##r z80YuOd?jq~0l9u@jrfw|lCqwok@)VSU91kW%+a>>^a+qOQ-+#>6Olv^_#5?`MBp z8~w6cK8GQPu(SoS(4Zkdhih5l>5FkG$yQT!j7w9&bc=_$Scb z$$%|6IAkW1>>t~n_NNgf_LhzMX2JR_j4lXiwf7D*!xcSC4$(&O3|c-Ek0 zb-Od)<#qizpAS`M1$4lqGGxBJesZ;R)D?0)gn)`3?3vaD9$$wG1x$e&> zLWpsmlsbV^nuy>u1j^3HDdJ<{0b)~0iMfdoZbP-`Ur+lV=4H7i-ET6EkgqZ9bhN6BCdi*Ck+W*UYPxn;Q_l8Xu7hR6DU0D# zP{R3GVevP&B;SZrUj5>R6rBbQ99LS0;t(mwtiP!Dl-C(9hPPv^=Ztmf3Gr9O055eVvM5qdY%wx29(Qi@JB+O+s?3v z0sXB$mwPqeXGgbLv7hZ^FlkL;=DW~@=truIYz8d<17X}=@&eo7$gJl+YJ90JZKuoY2JnVo4VG!GykM*W^u6cmmunI9*9D9|khNkpFv>f37t1XW>)ex535?T*j9 zG>tm9c)}%peK2{olMD~Kse4(z+-h}riVM1AyMKbtcJ%gw^IxGsGrg~OuP^J6=Ux2X zzez7gN$qbhptE9Nlb6Y$@g4~I3+%PPrPJ>W0wnzCaeeiqRtL;`Fp*RXrSar-K58na0icrJ4-=!1@R{Jx7!-+Ql`j zUCbCPthL>K;SgrZ9V9W{cVvdTV-)f5LLrVOL?#!d69j6~iE#;5&QwtnxQEBBmFcaQqZs@d-=+DrhS!S) zbqfav|7#R0hZjDr&HLQSQ>mM)4mw%Zo z$+}(t-mCwZ=1bP*t`UXTK)QF+Fglr_^o4o3FWS}z!zZ)&eEdCMF%(`Imzm7skHMm0 zkA3SE_HSmY(?MCR4A8WG=P~OlA3RC|YYg}CH1*6ED?57cB~qAw!YyB_|Jx6iaOc@7 zXE#_`)B;uo@*~E=sxPTsk%u*JR|YkZKA2QcJUAcjS>!%Id!le zl}*`!s#_MHuQ}68_Hn#X6E9pkGIi!^s)QB#zrH%jNm)yI{517;-6WC)#f+FAF{yNP zQrdZ4L(OQdc(_;;r1xD15qZS|LOm3q?nwB-Ya6PBau{7nvWhd#sdXvsw7 z(>aK>ErKVh!hy`J>c_{t?3I9@D_x-?h!%8GO>p|#%zENY2x3Dm=8Wx!b#ggE6nHFp z7qZ`&`$$r1PDoGOlao{%IdLsm*-Ir|kavQMh!h;Un+)Ar4Bhnc@(jfeAC8CiPP}xL z&(BtE;b!X3;jKFx^BjxzeZw|lOAi0g^=CYYq>LGL{raA7*0uU_HrXGbSu>Vh#3jO^ z#H5j}t3X{U5wp;kRXBMzyfHBCib_5;ar19qU|sF@O!RHiT97dRaX}wRB1@ffabJl+ zy9hS*e za8HfoDtW>?LcKd;V(^VsWyI_ zK`5=36U~}K60ss$&F|Y$P<{qccFy($N#qEGQ7+F_?zPTCxuJtG4?2!OCujrh}n zxuvn%kth&g=myAXH?F0AVg8sKbysLYU0Z12$xCHqIp=02)DC*0O#pkv0$KTP8?>#G zx7EkK`m)RiQ>K%ErIzL*;N>%p4}d3&>0H(|E&-hw^-KJ@c=1Q?L3CgEtAd z(Rw2oVCUZt-2>n5$-t=Ci_6P&FO1Ls>Sz9bdC)^S?0!^Cw2!=xUJNGp7Pjkp9vDGS z)1arR#~Um~@+5Mx4}VqZ%KlKWfApNA4FOYX#c5&u{<6F8Pu64!=-t zf`LP6vG(HucHKIU@u^k|8t?^-oaEFK_H+u83(9Ozc z>pHT8uUV<|a)$D0>AW8DZK_>0zK>$Pa8J z0L>~RkA0_*_qsFa_`xif#Hu#O$ z%o*V00b8d^jEFp@f+V^+ZHIESNPf-Uns^NHjo(6(IUOx^^|BkQSG_&!n?xB1M~M}sI-@R!c^;2>*MNsO4NQ#y9$`E3)dQ3d{|1dy84iB zzl+BY><>-*@@G%HR+na45=C%6heJ8GW%<%`vn=^{Rhw?P#5h+=?$Nw8^l|_nl`~;D zm>XSB+(Ivd-O0FBI=W?EqN%->NlV}R#R!3237ZyQ9ti$AdH)#q6uhj>)^!*wy%En= zjg|VmVY3`SoIf^EI2El3-2X<_Ds4o+spsv9_9ZF~1(z0_Am<*8yQ+rjc8;NLM%?5M zoXy&qfs=wQHs4=8uC|}0+&V&hT6c#- z|De_oqfFIMrG8aM3O=_3ANCPJ>v)S-YRyoeF{ZzUAvLC&4KP@Ac|7z!%2=_vVT@1< znXTv_0-w=(cJBb8IpHSvrLO~80aL^N`4)hU+d`kVd>YdU$7=;p+mYZ>GhZ#hViEJz zhoMU4%Pd(F+cJu^DG|%UCc*>AS7UsIHF@A$GKXF^AvbBMhsx2<{vuDOK4ppPnC5)3 zrL7P2GXXO`_EpjGIaUt9e~Wd*O555c=(mxvUivaWLcOG%AmE>NX%3IARS~oa3DkUv z23MRpr5J+G-`Y&BV}vFK1c)4Ho`{~GXWdL#niB?#=&jUU9SA$w_I$Y1SIcgnw?ws9 zc`K<*we63-Bh1b?SxN60t;?c(ZhR#+waP6qz(Q<~>8!=Objec>MQN-Jtox)rlkBm$ zd+T~ml&_WES<6aZ0X%9@_d+KFcMbu7-n~u&3qSEShPs)AKJ^X;KHF?<&h~zK;F6^o z1-soU?LQGD^sYNhLf1OaT6_-gZa@CLg=~uLb!?`NJl-WNG=a2UM`igth#?RcB)Hx; z2Y0bYy&lM8Pm)T|!y-x2C<(Tf!?Cop&9w(ugq>w zxLUDa;KHs=8w6Tzi``p-nF?KY0blKnfHsFMC%e}z9ya&q9E*aH5=3qYcgFkF(3+IF zBh9ySsr0!Wcfa^(ob&Ha8+;*CO=x@I7@KU~kSD_@k<_O5sptXj<7iOYOjw^2;9*nv z<&2)WOc9Ex5e&B+zkHm4>_gQ0xe+0_jozKyQHx_Hq@*xHNT|Fh1+8lKd6Qr2898ZY z3+JHDJfS^92b$SQ_jn0HfY(AFxDqF8ZxgiF?s&CH?hSP|GIw&Ad&Dewm$rDsedi|qe!Ffb4X}T8 ze7s^c?)STBLkd3Wq@vQiY;=;Jao6Sv?@m8dqUbXw-LywQE*fd9riK-*Oc0I!VXH3t z!`A#{X29*}8XAa6kE_qc{!RT-1FInzuZjkDJtG?)`Pmm)x@Dp}*fRWXp z=hY-g%gVjZ>#@n@-3t)3HyZRb`nJZ#_r`#YNAy2yS-l@|dXk0{y-G>CfV^z?3i)ln zz5D55lyCask)H&^>QW^@5nzBH!)hF4eg2zGURPc=PfjwE?$G2X1MR7NV+8wVp3l*C zAe<-r9C@Bp;&%xy4+Jx8;Yn>>N1kNwu!u0cIN>dA1l2NB+MlQ-?I#2FM{K_Rt9I(Y|lca#(s{i&E{3-d+o1q%#!iVul za>!UT*ng;IAyXh)9gRXIPom{!UIy7lmQ%)pRUyDR+ao)7#{R6=DY0B^f!4t|=HcG4 zV@OK=c>*ME{TrxdNj?zaS*;mHt@v?=M{c%Ji2(QmtLPa$fP8Cq!__pz z#eVo=efZMkB@jgCDhy7yM%pv63g zx7^U6=tgS?i8Ui=N~%Z@cJtAaq{jD>-Nyr&xcTu5_KNujN)_! zDl91^oZ4S`@SdqHN9^fHW68xI==pg?1o&iD_*U0y#6mjR*c$3Gow?zqEn6&AL_w9* z-ykuUBTXjfldl0wkDFhFYO%!`b+_@fgfuI`(OPB zYk}=%=JQ$bc)j<19sKF-Sa4?M^KIs?_48pHdIz^>7x!uLx4_V`;HRg+%UnFf^{JwN z*1)am?hq8!O3SZddL@c}xB2tCB@WUU6 z420aIU5P$^v*MAzR*j7?EVjwbG7tzDzc~Av*S65{`IlzU-)gh*pa2`;S zJ=+;G@PjseZXh4qJzodI{XZvk1-O{>e&oOB8c1ℑX*B>s)VWgs_#SMf96azcvXa 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%0Aw=11~i1gfx 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 literal 0 HcmV?d00001 diff --git a/README.md b/README.md index 1a45a35..b2b5ac9 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,109 @@ -# RCNN -This is a Implementation of R-CNN +# Implementation of R-CNN + +This is a Implementation of R-CNN. (R-CNN: Regions with Convolutional Neural Network Features) + +## Prerequisites +- Python 3.5 +- Pytorch 0.4.1 +- sklearn 0.18.1 +- cv2 3.4.0 + +You can run the code in Windows/Linux with CPU/GPU. + +## Dataset + +For simplicity, rather than use PASCAL VOC 2012 dataset, I choose a samll dataset 17flowers. It can be downloaded from my Google Drive: + +https://drive.google.com/open?id=1qAkLZ-Wa8mca2xz-RZI3XW1Syjk2JfOB + +## Structure + +The project is structured as follows: + +``` +├── checkpoints/ +├── data/ +| ├── dataset_factory.py +| ├── dataset_factory.py +├── generate/ +├── loss/ +| ├── losses.py +├── models/ +| ├── model_factory.py +| ├── models.py +├── networks/ +| ├── network_factory.py +| ├── networks.py +├── options/ +| ├── base_options.py +| ├── test_options.py +| ├── train_options.py +├── sample_dataset/ +| ├── 2flowers +| ├── 17flowers +│ ├── fine_tune_list.txt +| ├── train_list.txt +├── utils/ +| ├── selectivesearch.py +| ├── util.py +├── evaluate.py +├── train_step1.py +├── train_step2.py +├── train_step3.py +├── train_step4.py +``` + +## Getting started + +### Supervised Train + +In this step, we use pre-trained AlexNet of Pytorch and train it using 17flowers dataset. + +``` +$ python train_step1.py +``` + +You can directly run it with default parameters. + +### Finetune + +In this step, we finetune the model on the 2flowers dataset. + +``` +$ python train_step2.py --batch_size 128 --load_alex_epoch 100 --options_dir finetune +``` + +Here we use the pre-trained AlexNet with 100 training epoch in the first step. "Options_dir" decides where to save parameters. + +### Train SVM + +In this step, we use features extracted from the last step to train SVMs. As stated in the paper, class-specific SVMs are trained in this step. Here there are two SVMs. + +``` +$ python train_step3.py --load_finetune_epoch 100 --options_dir svm +``` + +Here we adopt the finetuned AlexNet with 100 epoch in last step as feature extracter. + +### Box Regression + +In this step, we train a regression network to refine bounding boxes. + +``` +$ python train_step4.py --decay_rate 0.5 --options_dir regression --batch_size 512 +``` + +### Evaluate + +``` +$ python evaluate.py --load_finetune_epoch 100 --load_reg_epoch 40 --img_path ./sample_dataset/2flowers/jpg/1/image_1281.jpg +``` + +![](https://github.com/bigbrother33/Deep-Learning/blob/master/photo/1.PNG) + +## References + +- Selective-search: https://github.com/AlpacaDB/selectivesearch +- R-CNN with Tensorflow: https://github.com/bigbrother33/Deep-Learning + +Many codes related to image proposals are copied directly from "R-CNN with Tensorflow", and this project has shown more details about R-CNN in chinese. diff --git a/data/__init__.py b/data/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/data/dataset_factory.py b/data/dataset_factory.py new file mode 100644 index 0000000..62c07ee --- /dev/null +++ b/data/dataset_factory.py @@ -0,0 +1,39 @@ +import os + +class DatasetFactory: + def __init__(self): + pass + + @staticmethod + def get_by_name(dataset_name, opt): + if dataset_name == 'AlexnetDataset': + from data.datasets import AlexnetDataset + dataset = AlexnetDataset(opt) + elif dataset_name == 'FinetuneDataset': + from data.datasets import FinetuneDataset + dataset = FinetuneDataset(opt) + elif dataset_name == 'SVMDataset': + from data.datasets import SVMDataset + dataset = SVMDataset(opt) + elif dataset_name == 'RegDataset': + from data.datasets import RegDataset + dataset = RegDataset(opt) + else: + raise ValueError("Dataset [%s] not recognized." % dataset_name) + + print('Dataset {} was created'.format(dataset.name)) + return dataset + +class DatasetBase: + def __init__(self, opt): + self._name = 'BaseDataset' + self._root = opt.data_dir + self._opt = opt + + @property + def name(self): + return self._name + + @property + def path(self): + return self._root diff --git a/data/datasets.py b/data/datasets.py new file mode 100644 index 0000000..70b7c5b --- /dev/null +++ b/data/datasets.py @@ -0,0 +1,287 @@ +from data.dataset_factory import DatasetBase +from utils.util import resize_image +from utils.util import clip_pic +from utils.util import IOU +from utils.util import if_intersection +from utils.util import image_proposal +from models.model_factory import ModelsFactory +from sklearn.externals import joblib +import numpy as np +import codecs +import cv2 +import os +import torch + +class AlexnetDataset(DatasetBase): + + def __init__(self, opt): + super(AlexnetDataset, self).__init__(opt) + self._name = 'AlexnetDataset' + + self.datas = [] + + self._img_size = self._opt.image_size + self._batch_size = self._opt.batch_size + + self.epoch = 0 + self.cursor = 0 + + # read dataset + self._load_dataset() + + def _load_dataset(self): + file_path = os.path.join(self._root, self._opt.train_list) + with codecs.open(file_path, 'r', 'utf-8') as fr: + lines = fr.readlines() + for ind, line in enumerate(lines): + context = line.strip().split() + image_path = os.path.join(self._root, context[0]) + label = int(context[1]) + + img = cv2.imread(image_path) + img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) + img = resize_image(img, self._img_size, self._img_size) + img = np.asarray(img, dtype='float32') + + self.datas.append([img, label]) + + def get_batch(self): + images = np.zeros((self._batch_size, self._img_size, self._img_size, 3)) + labels = np.zeros((self._batch_size, 1)) + count = 0 + while( count < self._batch_size): + images[count] = self.datas[self.cursor][0] + labels[count] = self.datas[self.cursor][1] + count += 1 + self.cursor += 1 + if self.cursor >= len(self.datas) : + self.cursor = 0 + self.epoch += 1 + np.random.shuffle(self.datas) + return images, labels + + def __len__(self): + return len(self.datas) + + +class FinetuneDataset(DatasetBase): + + def __init__(self, opt): + super(FinetuneDataset, self).__init__(opt) + self._name = 'FinetuneDataset' + + self.datas = [] + self.save_path = os.path.join(self._opt.generate_save_path, 'fineturn_data.npy') + self.pos_datas = [] + self.neg_datas = [] + + self._batch_size = self._opt.batch_size + self._pos_counts = int(self._batch_size / 4) + self._neg_counts = int(self._batch_size / 4 * 3) + + self._pos_cursor = 0 + self._neg_cursor = 0 + + self._img_size = self._opt.image_size + self._threshold = self._opt.finetune_threshold + + self.epoch = 0 + self.cursor = 0 + + # read dataset + if os.path.exists(self.save_path): + self._load_from_numpy() + else: + self._load_dataset() + + def _load_dataset(self): + file_path = os.path.join(self._root, self._opt.finetune_list) + with codecs.open(file_path, 'r', 'utf-8') as fr: + lines = fr.readlines() + for ind, line in enumerate(lines): + context = line.strip().split() + image_path = os.path.join(self._root, context[0]) + index = int(context[1]) + ref_rect = context[2].split(',') + ground_truth = [int(i) for i in ref_rect] + + images, vertices, _ = image_proposal(image_path, self._img_size) + for img_float, proposal_vertice in zip(images, vertices): + iou_val = IOU(ground_truth, proposal_vertice) + if iou_val < self._threshold: + label = 0 + self.neg_datas.append([img_float, label]) + else: + label = index + self.pos_datas.append([img_float, label]) + self.datas.append([img_float, label]) + joblib.dump(self.datas, self.save_path) + + + def _load_from_numpy(self): + self.datas = joblib.load(self.save_path) + for item in self.datas: + if item[1] == 0: + self.neg_datas.append([item[0], item[1]]) + else: + self.pos_datas.append([item[0], item[1]]) + + def get_batch(self): + images = np.zeros((self._batch_size, self._img_size, self._img_size, 3)) + labels = np.zeros((self._batch_size, 1)) + + count = 0 + while (count < self._pos_counts): + images[count] = self.pos_datas[self._pos_cursor][0] + labels[count] = self.pos_datas[self._pos_cursor][1] + count += 1 + self._pos_cursor += 1 + if self._pos_cursor >= len(self.pos_datas): + self._pos_cursor = 0 + np.random.shuffle(self.pos_datas) + while (count < self._pos_counts + self._neg_counts): + images[count] = self.neg_datas[self._neg_cursor][0] + labels[count] = self.neg_datas[self._neg_cursor][1] + count += 1 + self._neg_cursor += 1 + if self._neg_cursor >= len(self.neg_datas): + self._neg_cursor = 0 + np.random.shuffle(self.neg_datas) + """ + state = np.random.get_state() + np.random.shuffle(images) + np.random.set_state(state) + np.random.shuffle(labels) + """ + return images, labels + + + def __len__(self): + return len(self.datas) + +class SVMDataset(DatasetBase): + + def __init__(self, opt): + super(SVMDataset, self).__init__(opt) + self._name = 'SVMDataset' + + self.datas = [] + self.classA_features = [] + self.classA_labels = [] + self.classB_features = [] + self.classB_labels = [] + self.save_path = os.path.join(self._opt.generate_save_path, 'svm_data.npy') + + self._img_size = self._opt.image_size + + self.cursor = 0 + + self.model = ModelsFactory.get_by_name('FineModel', self._opt, is_train=False) + + # read dataset + if os.path.exists(self.save_path): + self._load_from_numpy() + else: + self._load_dataset() + + def _load_dataset(self): + file_path = os.path.join(self._root, self._opt.finetune_list) + with codecs.open(file_path, 'r', 'utf-8') as fr: + lines = fr.readlines() + for ind, line in enumerate(lines): + + context = line.strip().split() + image_path = os.path.join(self._root, context[0]) + index = int(context[1]) + ref_rect = context[2].split(',') + ground_truth = [int(i) for i in ref_rect] + + images, vertices, _ = image_proposal(image_path, self._img_size) + for img_float, proposal_vertice in zip(images, vertices): + iou_val = IOU(ground_truth, proposal_vertice) + if iou_val < self._opt.svm_threshold: + label = 0 + else: + label = index + + px = float(proposal_vertice[0]) + float(proposal_vertice[4] / 2.0) + py = float(proposal_vertice[1]) + float(proposal_vertice[5] / 2.0) + ph = float(proposal_vertice[5]) + pw = float(proposal_vertice[4]) + + gx = float(ref_rect[0]) + gy = float(ref_rect[1]) + gw = float(ref_rect[2]) + gh = float(ref_rect[3]) + + box_label = np.zeros(5) + box_label[1:5] = [(gx - px) / pw, (gy - py) / ph, np.log(gw / pw), np.log(gh / ph)] + if iou_val < self._opt.reg_threshold: + box_label[0] = 0 + else: + box_label[0] = 1 + + input_data=torch.Tensor([img_float]).permute(0,3,1,2) + + feature, final = self.model._forward_test(input_data) + feature = feature.data.cpu().numpy() + + self.datas.append([index, feature, label, box_label]) + joblib.dump(self.datas, self.save_path) + + def _load_from_numpy(self): + self.datas = joblib.load(self.save_path) + for item in self.datas: + if item[0] == 1: + self.classA_features.append(item[1][0]) + self.classA_labels.append(item[2]) + elif item[0] == 2: + self.classB_features.append(item[1][0]) + self.classB_labels.append(item[2]) + + def get_datas(self): + return self.classA_features, self.classA_labels, self.classB_features, self.classB_labels + + def __len__(self): + return len(self.datas) + + +class RegDataset(DatasetBase): + + def __init__(self, opt): + super(RegDataset, self).__init__(opt) + self._name = 'RegDataset' + + self.datas = [] + self._batch_size = self._opt.batch_size + self.cursor = 0 + + self._load_dataset() + + def _load_dataset(self): + file_path = os.path.join(self._opt.generate_save_path, 'svm_data.npy') + self.datas = joblib.load(file_path) + + def get_batch(self): + images = np.zeros((self._batch_size, 4096)) + labels = np.zeros((self._batch_size, 5)) + + count = 0 + while( count < self._batch_size): + images[count] = self.datas[self.cursor][1] + labels[count] = self.datas[self.cursor][3] + count += 1 + self.cursor += 1 + if self.cursor >= len(self.datas): + self.cursor = 0 + np.random.shuffle(self.datas) + return images, labels + + def __len__(self): + return len(self.datas) + + + + + + diff --git a/evaluate.py b/evaluate.py new file mode 100644 index 0000000..a9c95c9 --- /dev/null +++ b/evaluate.py @@ -0,0 +1,87 @@ +from __future__ import division +from models.model_factory import ModelsFactory +from options.test_options import TestOptions +from utils.util import image_proposal +from utils.util import show_rect +import torch +import numpy as np + +class Test: + def __init__(self): + self._opt = TestOptions().parse() + self._img_path = self._opt.img_path + self._img_size = self._opt.image_size + + self.fine_model = ModelsFactory.get_by_name('FineModel', self._opt, is_train=False) + self.svm_model_A = ModelsFactory.get_by_name('SvmModel', self._opt, is_train=False) + self.svm_model_A.load('A') + self.svm_model_B = ModelsFactory.get_by_name('SvmModel', self._opt, is_train=False) + self.svm_model_B.load('B') + self.svms = [self.svm_model_A, self.svm_model_B] + self.reg_model = ModelsFactory.get_by_name('RegModel', self._opt, is_train=False) + + self.test() + + def test(self): + imgs, _, rects = image_proposal(self._img_path, self._img_size) + + show_rect(self._img_path, rects, ' ') + + input_data=torch.Tensor(imgs).permute(0,3,1,2) + features, _ = self.fine_model._forward_test(input_data) + features = features.data.cpu().numpy() + + results = [] + results_old = [] + results_label = [] + count = 0 + + flower = {1:'pancy', 2:'Tulip'} + + for f in features: + for svm in self.svms: + pred = svm.predict([f.tolist()]) + # not background + if pred[0] != 0: + results_old.append(rects[count]) + input_data=torch.Tensor(f) + box = self.reg_model._forward_test(input_data) + box = box.data.cpu().numpy() + if box[0] > 0.3: + px, py, pw, ph = rects[count][0], rects[count][1], rects[count][2], rects[count][3] + old_center_x, old_center_y = px + pw / 2.0, py + ph / 2.0 + x_ping, y_ping, w_suo, h_suo = box[1], box[2], box[3], box[4], + new__center_x = x_ping * pw + old_center_x + new__center_y = y_ping * ph + old_center_y + new_w = pw * np.exp(w_suo) + new_h = ph * np.exp(h_suo) + new_verts = [new__center_x, new__center_y, new_w, new_h] + results.append(new_verts) + results_label.append(pred[0]) + count += 1 + + average_center_x, average_center_y, average_w,average_h = 0, 0, 0, 0 + #use average values to represent the final result + for vert in results: + average_center_x += vert[0] + average_center_y += vert[1] + average_w += vert[2] + average_h += vert[3] + average_center_x = average_center_x / len(results) + average_center_y = average_center_y / len(results) + average_w = average_w / len(results) + average_h = average_h / len(results) + average_result = [[average_center_x, average_center_y, average_w, average_h]] + result_label = max(results_label, key=results_label.count) + show_rect(self._img_path, results_old, ' ') + show_rect(self._img_path, average_result, flower[result_label]) + + +if __name__ == "__main__": + Test() + + + + + + diff --git a/loss/__init__.py b/loss/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/loss/losses.py b/loss/losses.py new file mode 100644 index 0000000..ddbcd89 --- /dev/null +++ b/loss/losses.py @@ -0,0 +1,15 @@ +import torch.nn as nn +import torch + +class Regloss(nn.Module): + def __init__(self): + super(Regloss, self).__init__() + + def forward(self, y_true, y_pred): + no_object_loss = torch.pow((1 - y_true[:, 0]) * y_pred[:, 0],2).mean() + object_loss = torch.pow((y_true[:, 0]) * (y_pred[:, 0] - 1),2).mean() + + reg_loss = (y_true[:, 0] * (torch.pow(y_true[:, 1:5] - y_pred[:, 1:5],2).sum(1))).mean() + + loss = no_object_loss + object_loss + reg_loss + return loss diff --git a/models/__init__.py b/models/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/models/model_factory.py b/models/model_factory.py new file mode 100644 index 0000000..ca5e4fd --- /dev/null +++ b/models/model_factory.py @@ -0,0 +1,119 @@ +import os +import torch +from torch.optim import lr_scheduler + +class ModelsFactory: + def __init__(self): + pass + + @staticmethod + def get_by_name(model_name, *args, **kwargs): + model = None + + if model_name == 'AlexModel': + from .models import AlexModel + model = AlexModel(*args, **kwargs) + elif model_name == 'FineModel': + from .models import FineModel + model = FineModel(*args, **kwargs) + elif model_name == 'SvmModel': + from .models import SvmModel + model = SvmModel(*args, **kwargs) + elif model_name == 'RegModel': + from .models import RegModel + model = RegModel(*args, **kwargs) + else: + raise ValueError("Model %s not recognized." % model_name) + + print("Model %s was created" % model.name) + return model + + +class BaseModel(object): + + def __init__(self, opt, is_train): + self._name = 'BaseModel' + + self._opt = opt + self._gpu_ids = opt.gpu_ids + self._is_train = is_train + + self._Tensor = torch.cuda.FloatTensor if torch.cuda.is_available() else torch.Tensor + self._LongTensor = torch.cuda.LongTensor if torch.cuda.is_available() else torch.LongTensor + self._FloatTensor = torch.cuda.FloatTensor if torch.cuda.is_available() else torch.FloatTensor + self._root_dir = opt.checkpoints_dir + + + @property + def name(self): + return self._name + + @property + def is_train(self): + return self._is_train + + def set_input(self, input): + assert False, "set_input not implemented" + + def set_train(self): + assert False, "set_train not implemented" + + def set_eval(self): + assert False, "set_eval not implemented" + + def forward(self, keep_data_for_visuals=False): + assert False, "forward not implemented" + + # used in test time, no backprop + def test(self): + assert False, "test not implemented" + + def get_image_paths(self): + return {} + + def optimize_parameters(self): + assert False, "optimize_parameters not implemented" + + def get_current_visuals(self): + return {} + + def get_current_errors(self): + return {} + + def get_current_scalars(self): + return {} + + def save(self, label): + assert False, "save not implemented" + + def load(self): + assert False, "load not implemented" + + def _save_network(self, network, network_label, epoch_label, save_dir): + save_filename = 'net_epoch_%s_id_%s.pth' % (epoch_label, network_label) + save_path = os.path.join(self._root_dir, save_dir, save_filename) + if len(self._gpu_ids) > 1: + torch.save(network.module.state_dict(), save_path) + else: + torch.save(network.state_dict(), save_path) + print ('saved net: %s' % save_path) + + def _load_network(self, network, network_label, epoch_label, load_dir): + load_filename = 'net_epoch_%s_id_%s.pth' % (epoch_label, network_label) + load_path = os.path.join(self._root_dir, load_dir, load_filename) + assert os.path.exists( + load_path), 'Weights file not found. Have you trained a model!? We are not providing one' % load_path + + state_dict = torch.load(load_path) + if len(self._gpu_ids) > 1: + network.module.load_state_dict(torch.load(load_path)) + else: + network.load_state_dict(torch.load(load_path)) + print ('loaded net: %s' % load_path) + + def print_network(self, network): + num_params = 0 + for param in network.parameters(): + num_params += param.numel() + print(network) + print('Total number of parameters: %d' % num_params) diff --git a/models/models.py b/models/models.py new file mode 100644 index 0000000..2e81296 --- /dev/null +++ b/models/models.py @@ -0,0 +1,353 @@ +from .model_factory import BaseModel +from networks.network_factory import NetworksFactory +from torch.autograd import Variable +from sklearn import svm +from collections import OrderedDict +import torch +import os +from sklearn.externals import joblib +from loss.losses import Regloss + +try: + from torch.hub import load_state_dict_from_url +except ImportError: + from torch.utils.model_zoo import load_url as load_state_dict_from_url + +model_urls = { + 'alexnet': 'https://download.pytorch.org/models/alexnet-owt-4df8aa71.pth', +} + +class AlexModel(BaseModel): + def __init__(self, opt, is_train): + super(AlexModel, self).__init__(opt, is_train) + self._name = 'AlexModel' + + # create networks + self._init_create_networks() + + # init train variables + if self._is_train: + self._init_train_vars() + + # use pre-trained AlexNet + if self._is_train and not self._opt.load_alex_epoch > 0: + self._init_weights() + + # load networks and optimizers + if not self._is_train or self._opt.load_alex_epoch > 0: + self.load() + + if not self._is_train: + self.set_eval() + + # init loss + self._init_losses() + + def _init_create_networks(self): + network_type = 'AlexNet' + self.network = self._create_branch(network_type) + if len(self._gpu_ids) > 1: + self.network = torch.nn.DataParallel(self.network, device_ids=self._gpu_ids) + if torch.cuda.is_available(): + self.network.cuda() + + def _init_train_vars(self): + self._current_lr = self._opt.learning_rate + self._decay_rate = self._opt.decay_rate + # initialize optimizers + self._optimizer = torch.optim.SGD(self.network.parameters(), + lr=self._current_lr, + momentum=self._decay_rate) + + def _init_weights(self): + state_dict=load_state_dict_from_url(model_urls['alexnet'], progress=True) + current_state = self.network.state_dict() + keys = list(state_dict.keys()) + for key in keys: + if key.startswith('features'): + current_state[key] = state_dict[key] + current_state['fn8.weight'] = state_dict['classifier.1.weight'] + current_state['fn8.bias'] = state_dict['classifier.1.bias'] + current_state['fn9.weight'] = state_dict['classifier.4.weight'] + current_state['fn9.bias'] = state_dict['classifier.4.bias'] + + def load(self): + load_epoch = self._opt.load_alex_epoch + self._load_network(self.network, 'AlexNet', load_epoch, self._opt.alex_dir) + + def save(self, label): + # save networks + self._save_network(self.network, 'AlexNet', label, self._opt.alex_dir) + + def _create_branch(self, branch_name): + return NetworksFactory.get_by_name(branch_name, self._opt.alex_classes) + + def _init_losses(self): + # define loss function + self._cross_entropy = torch.nn.CrossEntropyLoss() + if torch.cuda.is_available(): + self._cross_entropy = self._cross_entropy.cuda() + + def set_input(self, inputs, labels): + self.batch_inputs = self._Tensor(inputs).permute(0,3,1,2) + self.labels = Variable(self._LongTensor(labels).squeeze_()) + + def optimize_parameters(self): + if self._is_train: + + loss = self._forward() + self._optimizer.zero_grad() + loss.backward() + self._optimizer.step() + + def _forward(self): + feature, final = self.network(self.batch_inputs) + self._loss = self._cross_entropy(final, self.labels) + return self._loss + + def _forward_test(self, input): + feature, final = self.network(input) + return feature, final + + def get_current_errors(self): + loss_dict = OrderedDict([('loss_entropy', self._loss.data[0]), + ]) + return loss_dict + + def set_train(self): + self.network.train() + self._is_train = True + + def set_eval(self): + self.network.eval() + self._is_train = False + + +class FineModel(BaseModel): + def __init__(self, opt, is_train): + super(FineModel, self).__init__(opt, is_train) + self._name = 'FineModel' + + # create networks + self._init_create_networks() + + # init train variables + if self._is_train: + self._init_train_vars() + + # use pre-trained AlexNet + if self._is_train and not self._opt.load_finetune_epoch > 0: + self._init_weights() + + # load networks and optimizers + if not self._is_train or self._opt.load_finetune_epoch > 0: + self.load() + + if not self._is_train: + self.set_eval() + + # init loss + self._init_losses() + + def _init_create_networks(self): + network_type = 'AlexNet' + self.network = self._create_branch(network_type) + if len(self._gpu_ids) > 1: + self.network = torch.nn.DataParallel(self.network, device_ids=self._gpu_ids) + if torch.cuda.is_available(): + self.network.cuda() + + def _init_train_vars(self): + self._current_lr = self._opt.learning_rate + self._decay_rate = self._opt.decay_rate + # initialize optimizers + self._optimizer = torch.optim.SGD(self.network.parameters(), + lr=self._current_lr, + momentum=self._decay_rate) + + def _init_weights(self): + + load_epoch = self._opt.load_alex_epoch + load_dir = self._opt.alex_dir + network_label = "AlexNet" + load_filename = 'net_epoch_%s_id_%s.pth' % (load_epoch, network_label) + + load_path = os.path.join(self._opt.checkpoints_dir, load_dir, load_filename) + assert os.path.exists( + load_path), 'Weights file not found. Have you trained a model!? We are not providing one' % load_path + state_dict = torch.load(load_path) + current_state = self.network.state_dict() + keys = list(state_dict.keys()) + for key in keys: + if not key.startswith('fn10'): + current_state[key] = state_dict[key] + + def save(self, label): + # save networks + self._save_network(self.network, 'AlexNet', label, self._opt.finetune_dir) + + def load(self): + load_epoch = self._opt.load_finetune_epoch + self._load_network(self.network, 'AlexNet', load_epoch, self._opt.finetune_dir) + + def _create_branch(self, branch_name): + return NetworksFactory.get_by_name(branch_name, self._opt.finetune_classes) + + def _init_losses(self): + # define loss function + self._cross_entropy = torch.nn.CrossEntropyLoss() + if torch.cuda.is_available(): + self._cross_entropy = self._cross_entropy.cuda() + + def set_input(self, inputs, labels): + self.batch_inputs = self._Tensor(inputs).permute(0,3,1,2) + self.labels = Variable(self._LongTensor(labels).squeeze_()) + + def optimize_parameters(self): + if self._is_train: + + loss = self._forward() + self._optimizer.zero_grad() + loss.backward() + self._optimizer.step() + + def _forward(self): + feature, final = self.network(self.batch_inputs) + self._loss = self._cross_entropy(final, self.labels) + return self._loss + + def _forward_test(self, input): + feature, final = self.network(input) + return feature, final + + def get_current_errors(self): + loss_dict = OrderedDict([('loss_entropy', self._loss.data[0]), + ]) + return loss_dict + + def set_train(self): + self.network.train() + self._is_train = True + + def set_eval(self): + self.network.eval() + self._is_train = False + + +class SvmModel: + def __init__(self, opt, is_train): + self._opt = opt + self._name = 'SvmModel' + self._save_dir = os.path.join(opt.checkpoints_dir, opt.svm_dir) + self._is_train = is_train + + + def train(self, features, labels): + self.clf = svm.LinearSVC() + self.clf.fit(features, labels) + + def save(self, name): + save_path = os.path.join(self._save_dir, "%s_svm.pkl" % name) + joblib.dump(self.clf, save_path) + + def load(self, name): + load_path = os.path.join(self._save_dir, "%s_svm.pkl" % name) + self.clf = joblib.load(load_path) + + def predict(self, features): + pred = self.clf.predict(features) + return pred + + @property + def name(self): + return self._name + +class RegModel(BaseModel): + def __init__(self, opt, is_train): + super(RegModel, self).__init__(opt, is_train) + self._name = 'RegModel' + + # create networks + self._init_create_networks() + + # init train variables + if self._is_train and not self._opt.load_reg_epoch > 0: + self._init_train_vars() + + # load networks and optimizers + if not self._is_train or self._opt.load_reg_epoch > 0: + self.load() + + if not self._is_train: + self.set_eval() + + # init loss + self._init_losses() + + def _init_create_networks(self): + self.network = self._create_branch("RegNet") + if len(self._gpu_ids) > 1: + self.network = torch.nn.DataParallel(self.network, device_ids=self._gpu_ids) + if torch.cuda.is_available(): + self.network.cuda() + + def _init_train_vars(self): + self._current_lr = self._opt.learning_rate + self._decay_rate = self._opt.decay_rate + # initialize optimizers + self._optimizer = torch.optim.SGD(self.network.parameters(), + lr=self._current_lr, + momentum=self._decay_rate) + + def load(self): + load_epoch = self._opt.load_reg_epoch + self._load_network(self.network, 'RegNet', load_epoch, self._opt.reg_dir) + + + def save(self, label): + # save networks + self._save_network(self.network, 'RegNet', label, self._opt.reg_dir) + + def _create_branch(self, branch_name): + return NetworksFactory.get_by_name(branch_name, self._opt.reg_classes) + + def _init_losses(self): + # define loss function + self._reg_loss = Regloss() + if torch.cuda.is_available(): + self._reg_loss = self._reg_loss.cuda() + + def set_input(self, inputs, labels): + self.batch_inputs = self._Tensor(inputs) + self.labels = Variable(self._FloatTensor(labels)) + + def optimize_parameters(self): + if self._is_train: + + loss = self._forward() + self._optimizer.zero_grad() + loss.backward() + self._optimizer.step() + + def _forward(self): + final = self.network(self.batch_inputs) + self._loss = self._reg_loss(self.labels, final) + return self._loss + + def _forward_test(self, input): + final = self.network(input) + return final + + def get_current_errors(self): + loss_dict = OrderedDict([('loss_reg', self._loss.data[0]), + ]) + return loss_dict + + def set_train(self): + self.network.train() + self._is_train = True + + def set_eval(self): + self.network.eval() + self._is_train = False + diff --git a/networks/__init__.py b/networks/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/networks/network_factory.py b/networks/network_factory.py new file mode 100644 index 0000000..0593e66 --- /dev/null +++ b/networks/network_factory.py @@ -0,0 +1,36 @@ +import torch.nn as nn +import functools + +class NetworksFactory: + def __init__(self): + pass + + @staticmethod + def get_by_name(network_name, *args, **kwargs): + + if network_name == 'AlexNet': + from .networks import AlexNet + network = AlexNet(*args, **kwargs) + elif network_name == 'SVM': + from .networks import SVM + network = SVM(*args, **kwargs) + elif network_name == 'RegNet': + from .networks import RegNet + network = RegNet(*args, **kwargs) + else: + raise ValueError("Network %s not recognized." % network_name) + + print ("Network %s was created" % network_name) + + return network + + +class NetworkBase(nn.Module): + def __init__(self): + super(NetworkBase, self).__init__() + self._name = 'BaseNetwork' + + @property + def name(self): + return self._name + diff --git a/networks/networks.py b/networks/networks.py new file mode 100644 index 0000000..8840c0d --- /dev/null +++ b/networks/networks.py @@ -0,0 +1,92 @@ +import torch.nn as nn +from .network_factory import NetworkBase +from sklearn import svm +import torch + +class AlexNet(NetworkBase): + + def __init__(self, output_num): + super(AlexNet, self).__init__() + self._name = 'AlexNet' + self._output_num = output_num + + self.features = nn.Sequential( + nn.Conv2d(3, 64, kernel_size=11, stride=4, padding=2), + nn.ReLU(inplace=True), + nn.MaxPool2d(kernel_size=3, stride=2), + nn.Conv2d(64, 192, kernel_size=5, padding=2), + nn.ReLU(inplace=True), + nn.MaxPool2d(kernel_size=3, stride=2), + nn.Conv2d(192, 384, kernel_size=3, padding=1), + nn.ReLU(inplace=True), + nn.Conv2d(384, 256, kernel_size=3, padding=1), + nn.ReLU(inplace=True), + nn.Conv2d(256, 256, kernel_size=3, padding=1), + nn.ReLU(inplace=True), + nn.MaxPool2d(kernel_size=3, stride=2), + ) + self.avgpool = nn.AdaptiveAvgPool2d((6, 6)) + + self.drop8 = nn.Dropout() + self.fn8 = nn.Linear(256 * 6 * 6, 4096) + self.active8 = nn.ReLU(inplace=True) + + self.drop9 = nn.Dropout() + self.fn9 = nn.Linear(4096, 4096) + self.active9 = nn.ReLU(inplace=True) + + self.fn10 = nn.Linear(4096, self._output_num) + + def forward(self, x): + x = self.features(x) + x = self.avgpool(x) + x = torch.flatten(x, 1) + + x = self.drop8(x) + x = self.fn8(x) + x = self.active8(x) + + x = self.drop9(x) + x = self.fn9(x) + + feature = self.active9(x) + final = self.fn10(feature) + + return feature, final + +class SVM: + def __init__(self, opt): + self._name = 'SVM' + self._opt = opt + + def train(self, features, labels): + clf = svm.LinearSVC() + clf.fit(features, labels) + return clf + +class RegNet(NetworkBase): + + def __init__(self, output_num): + super(RegNet, self).__init__() + self._name = 'RegNet' + self._output_num = output_num + + layers = [] + fc1 = nn.Linear(4096, 4096) + fc1.weight.data.normal_(0.0, 0.01) + layers.append(fc1) + layers.append(nn.Dropout(0.5)) + layers.append(nn.Tanh()) + fc2 = nn.Linear(4096, self._output_num) + fc2.weight.data.normal_(0.0, 0.01) + layers.append(fc2) + layers.append(nn.Tanh()) + + self.logits = nn.Sequential(*layers) + + def forward(self, x): + return self.logits(x) + + + + diff --git a/options/__init__.py b/options/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/options/base_options.py b/options/base_options.py new file mode 100644 index 0000000..20b0430 --- /dev/null +++ b/options/base_options.py @@ -0,0 +1,95 @@ +import argparse +import os +from utils import util +import torch + +class BaseOptions(): + def __init__(self): + self._parser = argparse.ArgumentParser() + self._initialized = False + + def initialize(self): + + self._parser.add_argument('--data_dir', type=str, default='sample_dataset', help='path to dataset') + self._parser.add_argument('--checkpoints_dir', type=str, default='./checkpoints', help='models are saved here') + self._parser.add_argument('--generate_save_path', type=str, default='./generate', help='dir to save generated data') + + self._parser.add_argument('--load_alex_epoch', type=int, default=-1, help='which epoch to load? set to -1 to use latest cached model') + self._parser.add_argument('--load_finetune_epoch', type=int, default=-1, help='which epoch to load? set to -1 to use latest cached model') + self._parser.add_argument('--load_reg_epoch', type=int, default=-1, help='which epoch to load? set to -1 to use latest cached model') + + self._parser.add_argument('--alex_dir', type=str, default='alexnet', help='dir for training alexnet') + self._parser.add_argument('--finetune_dir', type=str, default='finetune', help='dir for finetuning alexnet') + self._parser.add_argument('--svm_dir', type=str, default='svm', help='dir for training svm') + self._parser.add_argument('--reg_dir', type=str, default='regression', help='dir for box regression') + self._parser.add_argument('--options_dir', type=str, default='alexnet', help='dir for saving options') + + self._parser.add_argument('--alex_classes', type=int, default=17, help='# classes when training alexnet') + self._parser.add_argument('--finetune_classes', type=int, default=3, help='# classes when finetuning alexnet') + self._parser.add_argument('--reg_classes', type=int, default=5, help='# classes when training regnet') + + self._parser.add_argument('--finetune_threshold', type=float, default=0.3, help='threshold to select image region') + self._parser.add_argument('--svm_threshold', type=float, default=0.3, help='threshold to select image region') + self._parser.add_argument('--reg_threshold', type=float, default=0.6, help='threshold to select image region') + + self._parser.add_argument('--train_list', type=str, default='train_list.txt', help='training data') + self._parser.add_argument('--finetune_list', type=str, default='fine_tune_list.txt', help='training data') + + self._parser.add_argument('--image_size', type=int, default=224, help='input image size') + + + self._parser.add_argument('--gpu_ids', type=str, default='0', help='gpu ids: e.g. 0 0,1,2, 0,2. use -1 for CPU') + + + self._initialized = True + + def parse(self): + if not self._initialized: + self.initialize() + self._opt = self._parser.parse_args() + + # set is train or set + self._opt.is_train = self.is_train + + # get and set gpus + self._get_set_gpus() + + args = vars(self._opt) + + # print in terminal args + self._print(args) + + # save args to file + self._save(args) + + return self._opt + + def _get_set_gpus(self): + # get gpu ids + str_ids = self._opt.gpu_ids.split(',') + self._opt.gpu_ids = [] + for str_id in str_ids: + id = int(str_id) + if id >= 0: + self._opt.gpu_ids.append(id) + + # set gpu ids + if torch.cuda.is_available() and len(self._opt.gpu_ids) > 0: + torch.cuda.set_device(self._opt.gpu_ids[0]) + + def _print(self, args): + print('------------ Options -------------') + for k, v in sorted(args.items()): + print('%s: %s' % (str(k), str(v))) + print('-------------- End ----------------') + + def _save(self, args): + expr_dir = os.path.join(self._opt.checkpoints_dir, self._opt.options_dir) + print(expr_dir) + util.mkdirs(expr_dir) + file_name = os.path.join(expr_dir, 'opt_%s.txt' % ('train' if self.is_train else 'test')) + with open(file_name, 'wt') as opt_file: + opt_file.write('------------ Options -------------\n') + for k, v in sorted(args.items()): + opt_file.write('%s: %s\n' % (str(k), str(v))) + opt_file.write('-------------- End ----------------\n') diff --git a/options/test_options.py b/options/test_options.py new file mode 100644 index 0000000..c226cd3 --- /dev/null +++ b/options/test_options.py @@ -0,0 +1,10 @@ +from .base_options import BaseOptions + + +class TestOptions(BaseOptions): + def initialize(self): + BaseOptions.initialize(self) + + self._parser.add_argument('--img_path', type=str, default='./sample_dataset/2flowers/jpg/1/image_1281.jpg', help='file containing results') + + self.is_train = False diff --git a/options/train_options.py b/options/train_options.py new file mode 100644 index 0000000..0381d75 --- /dev/null +++ b/options/train_options.py @@ -0,0 +1,13 @@ +from .base_options import BaseOptions + + +class TrainOptions(BaseOptions): + def initialize(self): + BaseOptions.initialize(self) + + self._parser.add_argument('--total_epoch', type=int, default=100, help='total epoch for training') + self._parser.add_argument('--learning_rate', type=float, default=0.0001, help='initial learning rate') + self._parser.add_argument('--decay_rate', type=float, default=0.99, help='decay rate') + self._parser.add_argument('--batch_size', type=int, default=64, help='input batch size') + + self.is_train = True diff --git a/train_step1.py b/train_step1.py new file mode 100644 index 0000000..6fc5143 --- /dev/null +++ b/train_step1.py @@ -0,0 +1,57 @@ +from __future__ import division +from data.dataset_factory import DatasetFactory +from models.model_factory import ModelsFactory +from options.train_options import TrainOptions + +class Train: + def __init__(self): + self._opt = TrainOptions().parse() + + self._dataset_train = DatasetFactory.get_by_name("AlexnetDataset", self._opt) + self._dataset_train_size = len(self._dataset_train) + print('#train images = %d' % self._dataset_train_size) + + self._model = ModelsFactory.get_by_name("AlexModel", self._opt, is_train=True) + + self._train() + + def _train(self): + self._steps_per_epoch = int (self._dataset_train_size / self._opt.batch_size) + + for i_epoch in range(self._opt.load_alex_epoch + 1, self._opt.total_epoch + 1): + # train epoch + self._train_epoch(i_epoch) + + # save model + if i_epoch % 20 == 0: + print('saving the model at the end of epoch %d' % i_epoch) + self._model.save(i_epoch) + + def _train_epoch(self, i_epoch): + + for step in range(1, self._steps_per_epoch+1): + input, labels = self._dataset_train.get_batch() + + # train model + self._model.set_input(input, labels) + self._model.optimize_parameters() + + # display terminal + self._display_terminal_train(i_epoch, step) + + def _display_terminal_train(self, i_epoch, i_train_batch): + errors = self._model.get_current_errors() + message = '(epoch: %d, it: %d/%d) ' % (i_epoch, i_train_batch, self._steps_per_epoch) + for k, v in errors.items(): + message += '%s:%.3f ' % (k, v) + + print(message) + +if __name__ == "__main__": + Train() + + + + + + diff --git a/train_step2.py b/train_step2.py new file mode 100644 index 0000000..14c25ba --- /dev/null +++ b/train_step2.py @@ -0,0 +1,53 @@ +from __future__ import division +from data.dataset_factory import DatasetFactory +from models.model_factory import ModelsFactory +from options.train_options import TrainOptions + + +class Train: + def __init__(self): + self._opt = TrainOptions().parse() + + self._dataset_train = DatasetFactory.get_by_name("FinetuneDataset", self._opt) + self._dataset_train_size = len(self._dataset_train) + print('#train images = %d' % self._dataset_train_size) + + self._model = ModelsFactory.get_by_name("FineModel", self._opt, is_train=True) + self._train() + + def _train(self): + self._steps_per_epoch = int (self._dataset_train_size / self._opt.batch_size) + + for i_epoch in range(self._opt.load_finetune_epoch + 1, self._opt.total_epoch + 1): + # train epoch + self._train_epoch(i_epoch) + + # save model + if i_epoch % 20 == 0: + print('saving the model at the end of epoch %d' % i_epoch) + self._model.save(i_epoch) + + def _train_epoch(self, i_epoch): + + for step in range(1, self._steps_per_epoch+1): + input, labels = self._dataset_train.get_batch() + + # train model + self._model.set_input(input, labels) + self._model.optimize_parameters() + + # display terminal + self._display_terminal_train(i_epoch, step) + + def _display_terminal_train(self, i_epoch, i_train_batch): + errors = self._model.get_current_errors() + message = '(epoch: %d, it: %d/%d) ' % (i_epoch, i_train_batch, self._steps_per_epoch) + for k, v in errors.items(): + message += '%s:%.3f ' % (k, v) + + print(message) + +if __name__ == "__main__": + Train() + + diff --git a/train_step3.py b/train_step3.py new file mode 100644 index 0000000..e7afa01 --- /dev/null +++ b/train_step3.py @@ -0,0 +1,36 @@ +from __future__ import division +from data.dataset_factory import DatasetFactory +from models.model_factory import ModelsFactory +from options.train_options import TrainOptions +import numpy as np + +class Train: + def __init__(self): + self._opt = TrainOptions().parse() + + self._dataset_train = DatasetFactory.get_by_name("SVMDataset", self._opt) + self._dataset_train_size = len(self._dataset_train) + print('#train images = %d' % self._dataset_train_size) + + self.classA_features, self.classA_labels, self.classB_features, self.classB_labels = self._dataset_train.get_datas() + + self._modelA = ModelsFactory.get_by_name("SvmModel", self._opt, is_train=True) + self._modelB = ModelsFactory.get_by_name("SvmModel", self._opt, is_train=True) + + self._train(self._modelA, self.classA_features, self.classA_labels, "A") + self._train(self._modelB, self.classB_features, self.classB_labels, "B") + + def _train(self, model, features, labels, name): + model.train(features, labels) + model.save(name) + pred = model.predict(features) + + print (labels) + print (pred) + + + +if __name__ == "__main__": + Train() + + diff --git a/train_step4.py b/train_step4.py new file mode 100644 index 0000000..d1e6044 --- /dev/null +++ b/train_step4.py @@ -0,0 +1,57 @@ +from __future__ import division +from data.dataset_factory import DatasetFactory +from models.model_factory import ModelsFactory +from options.train_options import TrainOptions + +class Train: + def __init__(self): + self._opt = TrainOptions().parse() + + self._dataset_train = DatasetFactory.get_by_name("RegDataset", self._opt) + self._dataset_train_size = len(self._dataset_train) + print('#train images = %d' % self._dataset_train_size) + + self._model = ModelsFactory.get_by_name("RegModel", self._opt, is_train=True) + + self._train() + + def _train(self): + self._steps_per_epoch = int (self._dataset_train_size / self._opt.batch_size) + + for i_epoch in range(self._opt.load_reg_epoch + 1, self._opt.total_epoch + 1): + # train epoch + self._train_epoch(i_epoch) + + # save model + if i_epoch % 20 == 0: + print('saving the model at the end of epoch %d' % i_epoch) + self._model.save(i_epoch) + + def _train_epoch(self, i_epoch): + + for step in range(1, self._steps_per_epoch+1): + input, labels = self._dataset_train.get_batch() + + # train model + self._model.set_input(input, labels) + self._model.optimize_parameters() + + # display terminal + self._display_terminal_train(i_epoch, step) + + def _display_terminal_train(self, i_epoch, i_train_batch): + errors = self._model.get_current_errors() + message = '(epoch: %d, it: %d/%d) ' % (i_epoch, i_train_batch, self._steps_per_epoch) + for k, v in errors.items(): + message += '%s:%.3f ' % (k, v) + + print(message) + +if __name__ == "__main__": + Train() + + + + + + diff --git a/utils/__init__.py b/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/utils/selectivesearch.py b/utils/selectivesearch.py new file mode 100644 index 0000000..fd393fd --- /dev/null +++ b/utils/selectivesearch.py @@ -0,0 +1,319 @@ +# -*- coding: utf-8 -*- +import skimage.io +import skimage.feature +import skimage.color +import skimage.transform +import skimage.util +import skimage.segmentation +import numpy + + +# "Selective Search for Object Recognition" by J.R.R. Uijlings et al. +# +# - Modified version with LBP extractor for texture vectorization + + +def _generate_segments(im_orig, scale, sigma, min_size): + """ + segment smallest regions by the algorithm of Felzenswalb and + Huttenlocher + """ + + # open the Image + im_mask = skimage.segmentation.felzenszwalb( + skimage.util.img_as_float(im_orig), scale=scale, sigma=sigma, + min_size=min_size) + + # merge mask channel to the image as a 4th channel + im_orig = numpy.append( + im_orig, numpy.zeros(im_orig.shape[:2])[:, :, numpy.newaxis], axis=2) + im_orig[:, :, 3] = im_mask + + return im_orig + + +def _sim_colour(r1, r2): + """ + calculate the sum of histogram intersection of colour + """ + return sum([min(a, b) for a, b in zip(r1["hist_c"], r2["hist_c"])]) + + +def _sim_texture(r1, r2): + """ + calculate the sum of histogram intersection of texture + """ + return sum([min(a, b) for a, b in zip(r1["hist_t"], r2["hist_t"])]) + + +def _sim_size(r1, r2, imsize): + """ + calculate the size similarity over the image + """ + return 1.0 - (r1["size"] + r2["size"]) / imsize + + +def _sim_fill(r1, r2, imsize): + """ + calculate the fill similarity over the image + """ + bbsize = ( + (max(r1["max_x"], r2["max_x"]) - min(r1["min_x"], r2["min_x"])) + * (max(r1["max_y"], r2["max_y"]) - min(r1["min_y"], r2["min_y"])) + ) + return 1.0 - (bbsize - r1["size"] - r2["size"]) / imsize + + +def _calc_sim(r1, r2, imsize): + return (_sim_colour(r1, r2) + _sim_texture(r1, r2) + + _sim_size(r1, r2, imsize) + _sim_fill(r1, r2, imsize)) + + +def _calc_colour_hist(img): + """ + calculate colour histogram for each region + + the size of output histogram will be BINS * COLOUR_CHANNELS(3) + + number of bins is 25 as same as [uijlings_ijcv2013_draft.pdf] + + extract HSV + """ + + BINS = 25 + hist = numpy.array([]) + + for colour_channel in (0, 1, 2): + + # extracting one colour channel + c = img[:, colour_channel] + + # calculate histogram for each colour and join to the result + hist = numpy.concatenate( + [hist] + [numpy.histogram(c, BINS, (0.0, 255.0))[0]]) + + # L1 normalize + hist = hist / len(img) + + return hist + + +def _calc_texture_gradient(img): + """ + calculate texture gradient for entire image + + The original SelectiveSearch algorithm proposed Gaussian derivative + for 8 orientations, but we use LBP instead. + + output will be [height(*)][width(*)] + """ + ret = numpy.zeros((img.shape[0], img.shape[1], img.shape[2])) + + for colour_channel in (0, 1, 2): + ret[:, :, colour_channel] = skimage.feature.local_binary_pattern( + img[:, :, colour_channel], 8, 1.0) + + return ret + + +def _calc_texture_hist(img): + """ + calculate texture histogram for each region + + calculate the histogram of gradient for each colours + the size of output histogram will be + BINS * ORIENTATIONS * COLOUR_CHANNELS(3) + """ + BINS = 10 + + hist = numpy.array([]) + + for colour_channel in (0, 1, 2): + + # mask by the colour channel + fd = img[:, colour_channel] + + # calculate histogram for each orientation and concatenate them all + # and join to the result + hist = numpy.concatenate( + [hist] + [numpy.histogram(fd, BINS, (0.0, 1.0))[0]]) + + # L1 Normalize + hist = hist / len(img) + + return hist + + +def _extract_regions(img): + + R = {} + + # get hsv image + hsv = skimage.color.rgb2hsv(img[:, :, :3]) + + # pass 1: count pixel positions + for y, i in enumerate(img): + + for x, (r, g, b, l) in enumerate(i): + + # initialize a new region + if l not in R: + R[l] = { + "min_x": 0xffff, "min_y": 0xffff, + "max_x": 0, "max_y": 0, "labels": [l]} + + # bounding box + if R[l]["min_x"] > x: + R[l]["min_x"] = x + if R[l]["min_y"] > y: + R[l]["min_y"] = y + if R[l]["max_x"] < x: + R[l]["max_x"] = x + if R[l]["max_y"] < y: + R[l]["max_y"] = y + + # pass 2: calculate texture gradient + tex_grad = _calc_texture_gradient(img) + + # pass 3: calculate colour histogram of each region + for k, v in R.items(): + + # colour histogram + masked_pixels = hsv[:, :, :][img[:, :, 3] == k] + R[k]["size"] = len(masked_pixels / 4) + R[k]["hist_c"] = _calc_colour_hist(masked_pixels) + + # texture histogram + R[k]["hist_t"] = _calc_texture_hist(tex_grad[:, :][img[:, :, 3] == k]) + + return R + + +def _extract_neighbours(regions): + + def intersect(a, b): + if (a["min_x"] < b["min_x"] < a["max_x"] + and a["min_y"] < b["min_y"] < a["max_y"]) or ( + a["min_x"] < b["max_x"] < a["max_x"] + and a["min_y"] < b["max_y"] < a["max_y"]) or ( + a["min_x"] < b["min_x"] < a["max_x"] + and a["min_y"] < b["max_y"] < a["max_y"]) or ( + a["min_x"] < b["max_x"] < a["max_x"] + and a["min_y"] < b["min_y"] < a["max_y"]): + return True + return False + + R = regions.items() + r = [elm for elm in R] + R = r + neighbours = [] + for cur, a in enumerate(R[:-1]): + for b in R[cur + 1:]: + if intersect(a[1], b[1]): + neighbours.append((a, b)) + + return neighbours + + +def _merge_regions(r1, r2): + new_size = r1["size"] + r2["size"] + rt = { + "min_x": min(r1["min_x"], r2["min_x"]), + "min_y": min(r1["min_y"], r2["min_y"]), + "max_x": max(r1["max_x"], r2["max_x"]), + "max_y": max(r1["max_y"], r2["max_y"]), + "size": new_size, + "hist_c": ( + r1["hist_c"] * r1["size"] + r2["hist_c"] * r2["size"]) / new_size, + "hist_t": ( + r1["hist_t"] * r1["size"] + r2["hist_t"] * r2["size"]) / new_size, + "labels": r1["labels"] + r2["labels"] + } + return rt + + +def selective_search( + im_orig, scale=1.0, sigma=0.8, min_size=50): + '''Selective Search + + Parameters + ---------- + im_orig : ndarray + Input image + scale : int + Free parameter. Higher means larger clusters in felzenszwalb segmentation. + sigma : float + Width of Gaussian kernel for felzenszwalb segmentation. + min_size : int + Minimum component size for felzenszwalb segmentation. + Returns + ------- + img : ndarray + image with region label + region label is stored in the 4th value of each pixel [r,g,b,(region)] + regions : array of dict + [ + { + 'rect': (left, top, right, bottom), + 'labels': [...] + }, + ... + ] + ''' + assert im_orig.shape[2] == 3, "3ch image is expected" + + # load image and get smallest regions + # region label is stored in the 4th value of each pixel [r,g,b,(region)] + img = _generate_segments(im_orig, scale, sigma, min_size) + + if img is None: + return None, {} + + imsize = img.shape[0] * img.shape[1] + R = _extract_regions(img) + + # extract neighbouring information + neighbours = _extract_neighbours(R) + + # calculate initial similarities + S = {} + for (ai, ar), (bi, br) in neighbours: + S[(ai, bi)] = _calc_sim(ar, br, imsize) + + # hierarchal search + while S != {}: + + # get highest similarity + # i, j = sorted(S.items(), cmp=lambda a, b: cmp(a[1], b[1]))[-1][0] + i, j = sorted(list(S.items()), key = lambda a: a[1])[-1][0] + + # merge corresponding regions + t = max(R.keys()) + 1.0 + R[t] = _merge_regions(R[i], R[j]) + + # mark similarities for regions to be removed + key_to_delete = [] + for k, v in S.items(): + if (i in k) or (j in k): + key_to_delete.append(k) + + # remove old similarities of related regions + for k in key_to_delete: + del S[k] + + # calculate similarity set with the new region + for k in filter(lambda a: a != (i, j), key_to_delete): + n = k[1] if k[0] in (i, j) else k[0] + S[(t, n)] = _calc_sim(R[t], R[n], imsize) + + regions = [] + for k, r in R.items(): + regions.append({ + 'rect': ( + r['min_x'], r['min_y'], + r['max_x'] - r['min_x'], r['max_y'] - r['min_y']), + 'size': r['size'], + 'labels': r['labels'] + }) + + return img, regions diff --git a/utils/util.py b/utils/util.py new file mode 100644 index 0000000..22903e9 --- /dev/null +++ b/utils/util.py @@ -0,0 +1,134 @@ +from __future__ import print_function +import os +import cv2 +import numpy as np +from . import selectivesearch +import matplotlib.pyplot as plt + +def mkdirs(paths): + if isinstance(paths, list) and not isinstance(paths, str): + for path in paths: + mkdir(path) + else: + mkdir(paths) + +def mkdir(path): + if not os.path.exists(path): + os.makedirs(path) + +def resize_image(in_image, new_width, new_height, out_image=None, resize_mode=cv2.INTER_CUBIC): + ''' + + :param in_image: input image + :param new_width: width of the new image + :param new_height: height of the new image + :param out_image: new path of the new image + :param resize_mode: resize mode in CV2 + :return: the new image + ''' + img = cv2.resize(in_image, (new_width, new_height), resize_mode) + if out_image: + cv2.imwrite(out_image, img) + return img + +def clip_pic(img, rect): + ''' + + :param img: input image + :param rect: four params of the rect + :return: the clipped image and the rect + ''' + x, y, w, h = rect[0], rect[1], rect[2], rect[3] + x_1 = x + w + y_1 = y + h + return img[y:y_1, x:x_1, :], [x, y, x_1, y_1, w, h] + +def IOU(ver1, vertice2): + ''' + calculate the IOU of two verts + :param ver1: the first vert + :param vertice2: the second vert + :return: IOU value + ''' + vertice1 = [ver1[0], ver1[1], ver1[0]+ver1[2], ver1[1]+ver1[3]] + area_inter = if_intersection(vertice1[0], vertice1[2], vertice1[1], vertice1[3], vertice2[0], vertice2[2], vertice2[1], vertice2[3]) + if area_inter: + area_1 = ver1[2] * ver1[3] + area_2 = vertice2[4] * vertice2[5] + iou = float(area_inter) / (area_1 + area_2 - area_inter) + return iou + return False + +def if_intersection(xmin_a, xmax_a, ymin_a, ymax_a, xmin_b, xmax_b, ymin_b, ymax_b): + if_intersect = False + if xmin_a < xmax_b <= xmax_a and (ymin_a < ymax_b <= ymax_a or ymin_a <= ymin_b < ymax_a): + if_intersect = True + elif xmin_a <= xmin_b < xmax_a and (ymin_a < ymax_b <= ymax_a or ymin_a <= ymin_b < ymax_a): + if_intersect = True + elif xmin_b < xmax_a <= xmax_b and (ymin_b < ymax_a <= ymax_b or ymin_b <= ymin_a < ymax_b): + if_intersect = True + elif xmin_b <= xmin_a < xmax_b and (ymin_b < ymax_a <= ymax_b or ymin_b <= ymin_a < ymax_b): + if_intersect = True + else: + return if_intersect + if if_intersect: + x_sorted_list = sorted([xmin_a, xmax_a, xmin_b, xmax_b]) + y_sorted_list = sorted([ymin_a, ymax_a, ymin_b, ymax_b]) + x_intersect_w = x_sorted_list[2] - x_sorted_list[1] + y_intersect_h = y_sorted_list[2] - y_sorted_list[1] + area_inter = x_intersect_w * y_intersect_h + return area_inter + +def image_proposal(img_path, img_size): + ''' + use selectivesearch to obtain image proposals; + add some rules to refine these image proposals + ''' + img = cv2.imread(img_path) + img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) + img_lbl, regions = selectivesearch.selective_search(img, scale=500, sigma=0.9, min_size=10) + candidates = set() + images = [] + vertices = [] + rects = [] + for r in regions: + if r['rect'] in candidates: + continue + if r['size'] < 200: + continue + if (r['rect'][2] * r['rect'][3]) < 500: + continue + proposal_img, proposal_vertice = clip_pic(img, r['rect']) + if len(proposal_img) == 0: + continue + x, y, w, h = r['rect'] + if w == 0 or h == 0: + continue + [a, b, c] = np.shape(proposal_img) + if a == 0 or b == 0 or c == 0: + continue + resized_proposal_img = resize_image(proposal_img, img_size, img_size) + candidates.add(r['rect']) + img_float = np.asarray(resized_proposal_img, dtype="float32") + images.append(img_float) + vertices.append(proposal_vertice) + rects.append(r['rect']) + return images, vertices, rects + +def show_rect(img_path, regions, message): + ''' + :param img_path: input image + :param regions: rects + :param message: annotation + :return: + ''' + img = cv2.imread(img_path) + img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) + for x, y, w, h in regions: + x, y, w, h =int(x),int(y),int(w),int(h) + rect = cv2.rectangle( + img,(x, y), (x+w, y+h), (0,255,0),2) + font = cv2.FONT_HERSHEY_SIMPLEX + cv2.putText(img, message, (x+20, y+40),font, 1,(255,0,0),2) + plt.imshow(img) + plt.show()