From bbb5efff9c28b327867008f61bababf14e67fd08 Mon Sep 17 00:00:00 2001 From: bradleypick Date: Sat, 12 May 2018 20:09:59 -0700 Subject: [PATCH 01/17] working adaptive_lipo implementation --- src/sequential.py | 42 +++++++++++++++++++++++++++--------------- 1 file changed, 27 insertions(+), 15 deletions(-) diff --git a/src/sequential.py b/src/sequential.py index 33e646f..ee85a92 100644 --- a/src/sequential.py +++ b/src/sequential.py @@ -3,6 +3,7 @@ """ import numpy as np +from scipy.spatial.distance import pdist, squareform def lipo(func, bounds, k, n): """ @@ -84,7 +85,7 @@ def prs(func, bounds, n): } return output -def adaptive_lipo(func, bounds, n, k_seq, p): +def adaptive_lipo(func, bounds, n, k_seq=np.logspace(-10,10,10000), p=0.5): """ Parameters ---------- @@ -111,28 +112,39 @@ def adaptive_lipo(func, bounds, n, k_seq, p): x.append(x_prop) y.append(func(x[0])) + k = 0 lower_bound = lambda x_prop, y, x, k: np.max(y-k*np.linalg.norm(x_prop-x)) - for t in np.arange(t): - b = np.random.binomial(n=1, p=p) - if b == 1: - u = np.random.uniform(size=len(bounds)) - x_prop = u * (bound_maxs - bound_mins) + bound_mins - else: - # randomly sample from the set of potential minimizers - # element x contained within bounds such that there exists - # a lipschitz continuous function g that equals our y = f(x_t) - # values for all t and the element x minimizes the function g - # how (if at all) can this be linked to the lower bound? + for t in np.arange(n): + + # draw a uniformly distributed random variable + u = np.random.uniform(size=len(bounds)) + x_prop = u * (bound_maxs - bound_mins) + bound_mins + + # check if we are exploring or exploiting + if not np.random.binomial(n=1, p=p): + # exploiting - must ensure we're drawing from potential minimizers + while lower_bound(x_prop, y, x, k) > np.min(y): + u = np.random.uniform(size=len(bounds)) + x_prop = u * (bound_maxs - bound_mins) + bound_mins + # once settled on proposal add it to the seen points x.append(x_prop) y.append(func(x_prop)) best.append(np.min(y)) - # update estimate of the lipschitz constant - # should be the minimum value in k_seq - # that is compatible with our observed x, y + # update estimate of lipschitx constant + # compute pairwise differences between y values + y_outer = np.outer(np.ones(len(y)), y) + y_diff = np.abs(y_outer - y_outer.T) + # compute distance matrix between x values + x_dist = squareform(pdist(np.array(x))) + np.fill_diagonal(x_dist, np.Inf) + # estimate lipschitz constant + k_est = np.max(y_diff / x_dist) + k = k_seq[np.argmax(k_seq > k_est)] + output = { 'loss': np.array(best).reshape(n), From 060544b4413bd8308e0bdadfff240b3c04a0e701 Mon Sep 17 00:00:00 2001 From: bradleypick Date: Sat, 12 May 2018 20:24:21 -0700 Subject: [PATCH 02/17] change comparison to run adaptive lipo rather than basic lipo --- src/comparison.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/comparison.py b/src/comparison.py index a135d9f..83a1cea 100644 --- a/src/comparison.py +++ b/src/comparison.py @@ -7,7 +7,7 @@ # # Usage: python comparison.py filename='imagename.png' [--num_sim, --num_iter] -from sequential import lipo, prs +from sequential import lipo, prs, adaptive_lipo from plotting import loss_v_iter import numpy as np @@ -20,9 +20,9 @@ parser.add_argument('--num_iter', type=int, default=100) args = parser.parse_args() -#-------------------------------------------------------# -# THE BOUNDS, FUNCTION, AND MINIMUM SHOULD BE ARGUMENTS # -#-------------------------------------------------------# +#---------------------------------------------# +# THE BOUNDS AND FUNCTION SHOULD BE ARGUMENTS # +#---------------------------------------------# if args.function == "holder_table": @@ -30,7 +30,7 @@ def f(x): inside_exp = np.abs(1-np.sqrt(x[0]*x[0]+x[1]*x[1])/np.pi) return -np.abs(np.sin(x[0])*np.cos(x[1])*np.exp(inside_exp)) - k = 40 + #k = 40 bnds = [(-10,10),(-10,10)] # an even simpler 1-d example @@ -49,7 +49,7 @@ def main(): for sim in np.arange(args.num_sim): - lipo_output = lipo(func=f, bounds=bnds, k=k, n=args.num_iter) + lipo_output = adaptive_lipo(func=f, bounds=bnds, n=args.num_iter) prs_output = prs(func=f, bounds=bnds, n=args.num_iter) results_lipo[sim,:] = lipo_output['loss'] @@ -57,7 +57,7 @@ def main(): loss_v_iter( loss=[results_lipo, results_prs], - names=['LIPO','PRS'], + names=['Adaptive LIPO','PRS'], color=['blue', 'orange'], figsize=(20,10), filename=args.filename From 82afe7e3f456f42720dd4e922fa1223d30095158 Mon Sep 17 00:00:00 2001 From: bradleypick Date: Sat, 12 May 2018 20:34:44 -0700 Subject: [PATCH 03/17] replace lipo plot with adalipo plot --- docs/img/adalipo_prs.png | Bin 0 -> 69009 bytes docs/img/holder_table_100x250.png | Bin 63801 -> 0 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/img/adalipo_prs.png delete mode 100644 docs/img/holder_table_100x250.png diff --git a/docs/img/adalipo_prs.png b/docs/img/adalipo_prs.png new file mode 100644 index 0000000000000000000000000000000000000000..0c1a7204ce7012d217c107a6be1d2612a7a7e4ed GIT binary patch literal 69009 zcmeFZcT`hZ*9VL`$|wrYj13DgGXxQkB2_x-D2A$3=^{;R_HXZVpWW8eJa**l z5e^QHWAIzQ8*p%N_Hl3=SorY}_$1ugp#c2zgV!~<(U0IK@JIW6ZuI z-j9?dCI34>!o$-^@)UK$goEQ34*2g^jr`JArjYSN4o&K76i3J8$nK+m{hakS>wZ9a z%NpvLqi|0n`u7(bymcx*mvnJjy2Uz5CMD7?#@2ccE;nE2RTkw;U6M&UEi03ReZy~b z>!6+VNsXB@Xlu}@ywYWyd8tU0)8c-(b6IFmqU1XsHz?yP6xHcvcny?+_31Nyl= ze<;45{VNB@=-D6p_Obu?Wxw~{r?-C7;AHv$|!NqABPqjBauiYB_%DZLvFWk z+_+ItPyqe9`NIPHUarm$ALJXj>g|t6W-ITB#h+bAIsPqL0YCo}aVWYb|foRyZSA!1k15QS^R@T%wt$%GzQSh)v{rJiD_~E?>Fx)pd z7=QKYA%_tw#L4uEp0~xtx+t8>fB?)de} z=iR=TT~>CvxVYHa!$Z5OyIH5J7*IXv4m-L2!DQ`((Zzq&ArhT z#TyM=X+YF_;`(WC5o;H^Gn5s=uKlWj_p^g%hRj4OhEobbN1E{43Xz zx(i?!r$FGNd~LJ5(!e<}Dis%Ey(C><%uN&sB7fQ{F=MnJG_~?Eri?aG@M+gx^)Y~G zJCiTldA6N#nxzuZB%fGQYk#5B)_%6zV@~M7!9n|WK14UC+S-$yB~$ED9O)n#wigyJ zUYBv~{>YD9d1+SRI0r_H`zSUQNouf0LKq{LY%nSfBn`@>fr|H%) z%Ea2qfaPMvwdMmdA*CO!wp@S*Ir11S<-sKe{H- zxYqJ>@PUgwdnyzvE#uUit^)3mq81e3i}xpVCtrRuDCA!G{P}Y*=j_`T?myvqet}Qz^_riw=9$bo3W(tsUPJ4Zq zBvu9NnZ7#1`+{z2e0X^HQ9dPELI%Rxr0DLarV_Bxi~Tv!bn9!>&`LfoD7;gaK*-Me z86bM4Fgj5Bv`ygSQui$}QPB+>)|Sl~6~9Lk*qsfg#L3R*9DKVvnAHuWDkwnfi;#Zw zxmhPgTByPa*DDyS(r>3*cDEZYoDrYqflY_T z90FmA_8oUlQS@?*QQaOr5!q_JEDY9pQp{ww(1zgxeHcienC@*?XRZ^e(A|cHhEk+# zuRX+2=O+Un6?@=0mM223U)n$TNkwh2J4{GAGe)ZwwxXvO^(x35&@DY zo7Byzxk-v@Td^&#dAQ`RPNKM&&&krlLTz~;&Q0vjoTNW(F>f=26etY$9JP&rd_zyv z85z&dPdI%`8#a5Dy{3aGbFMaYbIRC+6FO*DkF6;?v%=~rxWIWC)i!R$*%y!uDbpb# z7j%;Q>>iRAK2cjGgI~g^gL!HRVDBxxdgSUp|G~AfU4vDH#L8q$vsCTcqB<7y(9G~@ zLUx>4$YF7E8&q6M5PlQx2#Z`|zFes%k!NM1S$Mn$uzXjyrA%$G4D$*)}*1=CmEGTH{} ztX6okGliQChC`3tt-f?d_QA5hyI!(7m{H@LxW^)Q3s=~+3;LPqDKbvEZ{EB?PJxJ# z(An9U9<)6+Wq0!ANky<1$f=6z>S{XU`AM;U;90M8E5hI#qjs@d=B#}Epn`V75T$Xs zqybN+0RR1wQ~lffNw7B6`YDg5t>N>YAAcQlubD!@YNmscO3KPI&i&cI4f|ljc?2?n z6H^Y^nGu*KS4>CA;8bLkNsV4mWCMm-f{dgMS#;M_R%T-`%wwdo08Cw7oxW?BXYPSL z{nqjJ_O_qzPEp+WDA<6*>!F_Vs9l-<)~4WzQ>Dx{;6g-l|j|R)d9p#nEqFZh%xNgjLKn^$)cx0&v z{(uLWNMaq(q>zpp%vLc`4j7YO+1-_`l_B7R+62i##tn(T zOQN9&8MwVNwp?rn{(nX_z?(t}~omVVJ_J9pZxnGw2>5Zn-%4pfSAQICP%%6~G@vtK{nEWP?xrrvpO;1jy z+w6Qj?Z0d>y|m-CaJ^R}LTzw-JQWwbU2#Uy)856^)oblNCjkMx-c2iI4}7Ces;tOU zP9DAM*RSg-EoQ5*b~b}7*?H$g;apb|VSB;@x85#*es)}VJ0QcWSJBzoxg!ICPk||J zkJ?pu&UIQMSF5Hd3kwS$5tz*keu~vpPt!bg1|Hys##C1w*cqbieCAXiRjr0rST$lj zu|QIQd?Z?39T*VLMh%uB9w)3%yv%yV6Lb++Vv4-Gd8v71>wRngxrFFo6PsiZ`oKJ} zmf&xH@+VDXw~w#y{7MC`x3CnGDjB>UDOB*E&Zpeo3)cg$apXG1@D~N^{{R{ zMBsrcD=TOJKCW*`*!eZ$JPIsc5keEQ9dTYQhlOWVN&fm0AbdgC2dIY4Lo8$4+9?&F z%h|OLJh&0eb`^x*lB|3?JVNLb{7yxs?!D=XitB$L_v*gfKKq_ipgR`0hCpBvy~+Sx z5amb#BMlosRn-Ra^l=|w3d#hK7tRN+y5U`w{IcG*l!mMd_ea} zQ_Gjy5_K>yLT^upFghI!0%1rPG5J_ijkz9608nA{b4a@Yb1j0pRT?tox&u}=@wv*w z{&Vva>Y{!~Y6z1M(rX*RmlzwgVs}P8IM5pGEEEn;0Y*g0zO?DxxLbzDksLt?{^PXf~`kF zLp%a!&QUu}G5wO$yXZ7@wH-t#14F~OH!(^s8JhyExx*S!GJ zmPDLux7T$OP^QVkn3(~E@ z2e?W!tdv^@uD9kF6?H2T(&L~>s}Ad+)l?zH*aW^$tt&|qr>Rc+q;Ry))y2j0>oZ}; zwx~1yAc&)Z?QfZTt+$?rjE_36fK728$Q6QvG$a9_uYjhIyYH&yls86XeU=8J>zUCj zz`sxdL`)PbZInjf{hc1xehD8O9(LUMwq6HCV4yc{+cKdFCKpSZG!MSJVd?$p280h! ziJL>ninv}Hyj55SPzvOs><8c8S#I3UddjWUf3l@?@qoZL4ah;O&{rzXS!sHCd7V9X z4$@|RpIxQxn*i}k8lcW7epMwoIk_AOrv@+TT$0mxrL$S>BU=D-@(hwHtj7CD?x!`T!f0 zt`AM*0Pr2yG$J&X?HX4i{`K6sa}74j6Bqc|!=Y3yD7(5^9;7KvZKeQcs$wzAD7XG9 zxMzn@l0C?Yrb+=kT-P08=ORI0Ho7GB%kFwJ72gdNT=LoXuIcRM`@hfkq>Z=+zW?JO z9Q9IAvt+ZL4>5Tez_+Poe0LSxlt8PmA2HKLYL|P$4HPft7fAZZu_xem&>Lv_ZX99( zfV1jzi28v?eNq)G0jVgHPC{!61XYeqf)CRn)QqwI++e0Oj?(PaC8ANXszysL>>G`0 z{RpJ2lYZqgA0HnTfLsuifMY)Quy!{KqKwT-Hm+UE45lqwkEj9XqMN3VEs-2&3Ec5OvTrE z5$0*jr6g+vlrjOgXb4C}$|$gvjzFN+ILO4fBx-*#Ha3Qo55JLEGb@9p>WE-^xAR`t zFFVkE*|RtK2}pqk5`}olz%N{N)cLec5DMp4JwlK`Pi^Lap9}f03}U|*sfjYL&YV&A zY&~h34Z=1lh=kni@d)09JL<+f?EB5-+_tP(JvmC0RZz$SS!m>GNhkv4ca14|R|>I6 zVpb&9Vt@Aid(O+d{-OG;m`TycbVV;|;0Qs|6kmVdZ$O@`d`TfxVgBfM67;XVWPpPM z^_?Q^Y>QUFC+{YY`S~3{zd-;a%mS0wM9l&ev|5(?`t@%g!jE1ULCkbsowcd%HF!sJ4uoCzQbOa-Mi*nvoum4^MeTv2 z{3anYOxCh6v`ZQ(e$#Y(5)6RH-hdIEWT{`_8vru;#6lhgkQF3<9CFyd=bi0`>U#+s zLHeQG@60tVHa^yMFbq+-5n5KeWQqpXjPE%QpOSZz>wIrU8tja;{VfWR><0r2i!>YN zMv@uu73kp~`viVi&@gi`Q1}!h}Ou{dHMMwl1*fT zhX8K}E^6Coxx2f^s58G2<=A;c=N|{THqxedE)dWm!AHWb=_$^|6XhUV4Lfa}3~eoh z&^=em+ULb=s9Jy!C^HBY5A6X;l(kY>B|I`MEgg%)3kpzUuf-?@M0Y%2Dls(<>R8%k zX{xWa-tR9f8Z>S!c`YGwLY}%o!Lk^tY9xRFp*-7n%ps{eQ&k!6IiKRReYXO5dcu5~ zNAD9({!zO?;C&%rmI{#{0B(3d@RZ<%rdzf}pMxTuJxI%@W|j8Q(m41oYTIe{;NIHm zD&CuXl_PNw+K|yx-j}o=o-=ch%vH(n8i#X`pxtmK7`}9f2r72X1tjRlAunSErfc5q!RP zK|HMLbv=9btS6*kZ{Ngd0nhTVelb^NXYGUH*S`d-zacmlxV|$Z$MWAUFVXPkMuS^) z!P3T!&Pm{qs8E^=a;%3>m)m0n&}k3rML>L6h*;vNj`AT@u*t0E z;och%9@QW>=LN<(f`|n16BrhQ`!*HU zBe*AryKKhtSM4MTaX@Us6D6!tuf2K!@JIic(gP@wVv2JBw_F8s@fh&+G?B(Xc5V3@WQ zw;RNxMe$z#Ejl_H7)rI-ckPk`An_=_$`$bWBFIfT6U4Nwes;SJo+c_Px{}C|_RmeZ z0j-sgkdR+=B99|Ja$k-FN7f0KLyf6?g^t47juc*xJ+GwQb#pTNUmlW!V?qTol0JxjB=IgcuABfK&@H~KaAjky2p;hNbQqRa0iEu_Kdw)>K=X+_yqZ@v{kMkru(DzM4-qHM%;uW~TT^fad z#z)RQztCAbhyi8<0=03~cJ`JAE7uZwpxDL~io2^e324{{n%P4#dN|kJG^J4*AM`t|pA0W}y6AK7Z;_#d}>- z$9KODRTI|W>@<&+>5H^j2;2mrCuwzpy{*+E)sHwkEmq&c!m{oB`-lI*l^1^nLc)s{ z#Erj%qgwj0NwvJ}m1zO>mU<9dg6{fWiI~#?A$sXNxuv|$W2rnb=Rn21FIkn9u zE6B?Gl$r~;$t`IM8vjdNZ@!C5KLN6iS>I8?jwPAC2oJKuzv5Jo;hrcMTEN{D05T`@ zi8Y8IucEaLY_N0MdmF<7ssc1ol8!{(hikLfm*ov+sl1X169F;K*w+8qo;qh4fzMA4 z!B;=R;60%u@^oKuZBEDcEmxhL&0Jsq4_mb0+oz;~T6u>=W#``C+)w@=b{IAy{O=7h z!?Bl~CM9tRL)=~aiHu2RVNUVs+|CFJb?Ccz{@{8grlBcLyB^BXsjWpiIW(-3;foHy(bGHWh^YX zWzTqO;MTW%a+mM2J;{QM64>y<330fA*#qryn^m-vi4o%97uWDF%gZ_=Wo*~pmj?n- zk;$F3>RvwSN6q~w5}RJg9-V$&19@NV#ADrAiP^zxhfbB2$^-??>}`QOSeomDRkwwJ zia`9SCJzgwCqrD&tHXF^v#+QnT=K4|6YX3yJMz36`(dF^6JqMp{pVB8DEqpBQk*nk z_R>LwHG6mO{Y|S7kR*e;7&%}FP?(SB=G=Wktw&q-1)!q%537^hOm7se~*~|K@ zTNb8FehE=)5Qf!L-5Oj0*xsK>C2UTSf)%i|q0$XN=m8iIJ;A>NSn3{7+pAYMH8LU_ zcfg!iSC&?YksM9Hqd?w#L}f3;8UGA%D7}2<@Mobuer~edt&or+@f0JaC|ReB>Rspx_Hp1DI%CxAS$x5%tw15nhtuU^?^j8uUVWK~ra z9k2qMrwXy>i_{KGog%VlF$Zdj=U#!d5y1L$Rn_(NN}vWh@(tkPBtW=0^k>8UK~7Th zo}La!6@ZNZ=2HZybmL`gAZ*0aOBbTye5@%$rNMFoxw;c?%@>Q^eK={IiP=qx`Q{V> zQTAirF~HWj{Rv2GNidUhTLA#B2UxMl1NsCT=A6w&bxo5vL`}-q#qfX(97@%KLB3py z=n+b?M1eE}fwcx)l5ViI;?l?FO2jaTLi6YM$`78e5Aeyi0Kp7TKKgL%T$S(NfBmGY zhW+++my{X+#T+O>+}heoGwynO=S}&8Pp`LnO-)Vn>gxk4GVc&Uz%!7$cca|Ry1&*Y zziZDwqJQkO6+9}SrUD4gpn;JlfL9@oYXEQvfCI7sPXN_G{;;sTI~zbcY5;3Q zJG4GOIR?J)`gG&;9F$-IL#GuHJwIW}f76XTCyn&gEUg>vH6{#ti196~ig$Dh!RNBF z3oze7v0DY?DnP#4@W~Yr8hC3vC?Bt}yi6|d(u+jFaH=*7ay7c{U+|w2RXiV-dq3Q$ z#t8|=i2B@ME7-&(2yXfE4WG~s*VPT^46p(Xo`W4TYRU-L~I{=W6gwU8Wk6C)b^8{yCvDwzs$ll^h!`XN5 zOl;YX$@hn`-AA({sIoic-`BV-=o=sh2kh&3MOe0PQc2B3r~ICkxyeJo%6H0tOL3uz z@LaBNKiNTY%WiM(@hAvf37Td+#Wx&K6&XJAJxE1EpEnS9v`{{XEQH4w;vVr5TK+45 zEyEJZ*gKrGk0lCSKHuy75a_HnK|f*cY{E4)af;uQfOvu33GkO+Ily^pU^uby+gJ0r zss>+1W!PRo8~YDfMIl(l8%;!$4gEa%eouk;r0JzwN~YT$wrnBC{|P4Kid;3;DUb2$ za}5^?>&zZaDf)(GO0r{RXfTAQ#xw2e_miuX`wZXSa%rgV;}V;vco|#V0`V^J>WDu3 zUh=m>0e0K+1(AHJz^gCG<0&Bv@&A%8xgCet9}SV!IzoU_UtIRXBpBS5svWew1K}zA zvF4*L@Fh-GLab^4^g|nixoM4I*O7WfNBTI&TiDm#YcMri+7EzQA?_-A zq|$^l;92#fe}j%kShch4C%Azv{J6}wAlYO|``_CZ&|S5cgWR~TvOB!_6i~m9XZaSE z$6A`O%6;uIsp#YQ%?I4PrYro&H~02%T8|SKBD4|zL=EeFOG#PMyL`x2jD zbHxrB0{jeiYjA{eUO?F;_~tR!&V4i7tNatcO*GZiz{HYZ2~SZ4v}2`gP%_F5rg%%* z#mKeq-+&csb7byDhRQ_?# zRyKfevjad3mS3cEGggmD35oOPLS{a-E}9Yw+a9TY&JkoaJe0u91za>+zdiT-^X_Fu zRWbr*0nITv%2Q;U_qQz>2V z!jzju3zhq90_vPXnE{*u+963s0ec?$m#IazTz&OHdLatJUM4rWIFO5?Hn8i4Jz4SD zi?0k!*>JCq0O85<`U64112Ky$D=Yjqd|4w${i~$EbTIqUH)2d zRZMKNC9*X3G-s?fYUTD=d}V^!U)KNj#-Y*xgx}36mmahG)&)nkGY$NLUOV1R^f{`F zI$`bq?nKU>Lh}F=?>g#1)`p`Z_=!|(d+X{O6zqVtf7Z0?UN#g0sOsT0eWds56m#uE z82?P9DG{VW-wEt$3!t}hI|CpuYiF9@a$R1YiJUM!xKOHw@-Dh~!+BRCEOe7{Y(+x} zsgjC7F->R07wjf%|wJk9dckPVpM7uGGaRl$2aEDGj#8#*whu${940o7Q=tL5!147M5`fnpv*x_ zE9Z$5dqy+Rl!Y!-d(TD5h{Cxi!>r+#6V4DWz>nZ2tz#cVIJ|Gv_3t`}a9n@gxmkgE zzV)P&T`>t=|NRMfUqp^Jj|7Mk(wl$4;9pW$MLyXdBB*QJ?(hKW4nqbm2&2TaTGHe>iwqCt7y8=6|5TNaxEY5wtz2IsB=BP~+%tGDgXhYN@KsD~s`okhqKT4IUrj)@_Fn*uMG(cB9_zC@KcXHQ$RU|bo z5faoz&-*lMB(yuIWFr zZ}TM^OuC)xAWfTT)LZ`xT)OT{zU-;(;VZ`O&?ee-#m8%H>9OrXYUjiP2jdDMJ^QZC zu*XIFuIT2r?Mi+4UuU_czeQ4-wsE=F5C<%{PB7IHpcdn54;^j@ngGw6exjOJ( zl?od56}nsbv$?;c&*=b*nNi^X|L{-SNaP}Rf4!0L3hR#$85_70B=CS8qi+iWW!|@< z-o|((9HV#-p!*#d++tuqo7EVL4K=dD!E_H? z0rH_gRabncF^xSCXOkogkcZcR|;dKDBjNVO(xctb6Kl_D=W`pSxwa$ZRXxfYASuy zT*WtqJGo$CGN@!Sh@OEz)+@w_P-FZCTD{$+> zfEY?Er!9ZU>0d?|x+kws!2G0s&aK3s&;aZQpUeQ6V@ zMXos5Kx*b&AKASLhXRd~O5d`4f(h{X@;S1?CJyFo_+2VmN4$A2jM#((0h%9O+LNZh zv&7G%zVk?;iQEsh8A8o8bWjop^%sZaIGGn=T!jZ|O_EbjGGP@EC>wsO5mMG)GVkq{ zfoQ4O*>yKa$)>-~9?Ti~?3-12m9AJyvxfq4fgI zUr^K5ExpWTi3HOH;P}275Rim$bVB($B>0>M7Rbq%KA5*AH6xIParZlJ(2U;`e zM&>!{V|2*&{U7#U|F$0~xhC(H^3u*`y_@T_aJN?7R)R<(zn;ZR+!mK&%cbNRkxfUB zp076u0#cH|cnHLK9TB180UBBeo*(b+d%-XlR$MH1lwC)U5{r2harR<@*5c}_Y7uE? zMxAK~b;c69HevoB&f#AiUW>rr!EaSmOeX6%~5?#AHNKd~UyZB3~kfx3sGZcaRHxW=(3RW4$u z7t}B}0e?cN^J0KvT+h-_VT7RQQ^1RDF+QnrkwJJFII$2>c@Ll4IQNHgh2I^AW;0Y} zjj(niEb_E~U#x-1;=;#$I8%}<+Z9Xkf~DC)g?CGzA!FR>1xUKgZ?UW^P-T}03a;I0 z3Z>H|UvJAfEptAvkzOP$i7+*%~%ZTL1pLU(3I|-rh6$5j1+6D zQ9D3q1#QoT9ZlTNcj%R+L|$Q`>upyHb8`dGX$ZO9sJmFXuK#~`F=LXu^=w~m(T zsSi=2Ih;Z!5R{A)f2~YYDVuz5zIUaC?~pCvIRFp%HOo3yW#bl>Qn%K^ zRpGtZ4>cnnU}8WQz=e)|${m!61_WuJtMwA7Ja@$KDQAWh+hBv=v67GWFXjnHM<=XI zs)FX?3E#f0b_7-pZV5(SP&Mr7@epScYaD_O7O;CZG;K5r~`F^{!1=*Q3#iiL;dhqID$9wPEt(D0;=z z=BCaFJY{U>t|!R@cA8o?jg?Si zJ(@9w=F99mI^GgC6oFPB)_;O2MEG{L+ZZ#x5LuZ8OWet<8$gGxZ7Z$zG& z1C@9^3kwTKQFpd%SU#WwDM>%@>v7JaAjWbbuG_li;nZdY^vP}$+ej192Wm)9?d|Q| z`69ry?Y%M+1@*F3?P$K@;lcs`9a}5l?C?*(R| zc3#jiG<$|1*qq{IVsO!@+^2m|h2gCpdEtCU`nEa>c8n)jw3R$4@eAAKNAz$5uMQoT z*aW?U0k>Uk8aH=Zt+xtH=aj+uh5zKj5+?`CCxlr;}xAt=G;6SD>GAUcyef`&eJ@%kd^G^X=h5S8-SM_s@ zL}$5dc<c zgyBw3ELSlZoIXm&Z8X!H^!5gu8Q|cK1M$+qZ}l~&Oh~ZMM72-|HR-@5x6GGKO@?u> zFg~8a3+MN4dIKaf(y}MSs8uX{8VrOodlH^GLR<>Efy#b2gE9Y|jbA=XfuL`lOTpx& z+r_|@lu%ek1Cv$cyM1vlgSsgVmen;lnI5<^GlUyq-nkxtq%#M`sXN@>nzbW0_KH3Y=yp+NTZA|B~_CKg{}KeRDh?a(ot5Ru8A z#taGoiyw7T;{#XhhHwg#-gi3ZTCTeKCOKu-^e0~<5wpGAqmQGWt#(8Sb&y-1rtMu8 z11|e(r?V91?w+8sK3FvA%gPTby69+1T3Kpe1^k28F>$z|>y}(HI{}g+f^~)8var|? zV^yWYs0}2`c&)k5V1fm>tGEivuoT--ay)$n@XIv;=4}u2)cOj?59uo3KEH3TMQp2? zW_g%q#XgwIvDeq!VnZ`t1!&a^Z{MI~=G9-q%+{Z(9U(K6`}n@7d2aa%6($PTh-+7u z6e0HbAPDqdUnwFSAx}J1uGN^X0%*BJ7*(=b6(vXfC#8wVOcHIM%kOLzkrOX*zqPxs zStaaC;{ZbSkmM(yCues4ZFGS@4JNYEh#mgaR$M}ytuO8EkQ>R&NI;x8l#YO)@#>#D zv8*jaGk?lpzzw$FS;_)9h@&mlFlH(_w=Gj;%gByDNEWm`9Vj&&*VDJf#fhvuib9Hu z{|j1p;-}4br*Y4%;s6l5oWj<8<%|MA*F{&p1>~%D15&g70JI3*)V_oi_Y7xuRq}T| zZywDBB0c1!MmbN$93gLP9<2XfU=(}?wvjj8r@tP?Sk+J$gd2=f@1Z~1&$6}W3wI5I$whyZ*O&W zx&XhRpl0>qclLmzP=cV-8{#7rb`6~H=*ZQTth+Mx{RqiRknl=DY%74GXb&tyDC8k} z;)&WTTc@*JNSE{|LF0hx_`G4CY_i*8vp;|?Z!v5|ev<@EylGx;h;p*#BzI%qWMXIb z3w?EtXiA^lPc#wyDiWpMbb)?)K3)GHYq8x)7YKcX9s|skG_eN zEWu1~_k+ddtVY2);%^?LJ@}+lETlUS({ot+6rYrbhkoKE_$kQ}Lw4G5?-pbepTbU? zObZ0OP3FspHysC?nG{$fWDkyohKs&l!>8Krr@NooEyATwJN4nN-O~t6SG9`N?|X&3d$24 z>FB3SFylBvUQK^|_%;3hy4>yeyz*979UF5UU5Q-0n` zl*-0OuWomjWR9hbS6*)AqX<>t3iLI?Zy=Gs@=kqRI}ie^P163ZQ{rt25y~ zzh8$}AA;PijXE*H@KJqzIm+A|H9WkuJlDOujL>nAZw)rLo=yOOzgTsRmvRi5lxr!H zTRW$Y%EQ=1*dGm>zb0aMRtfcxM{0L=p`Ub~aNj;~+WIaWHCZwL?Z7;}bD+P>1HQHY zWqHx}UVsR?T7r?NoL*a(39-|mB8gzN+GQ|0zi)n5cv7jrA-jB*J8cS*#f{nYmC?ta zt3X?3yw>Au<#XHFGs-@<+PjRGoN>8L+6F2A>#|Y1IRAP! zm}Z4wW7V6EI|}Co!r=XDYb0117u)}34Fj(vSH3puBXX+KfA%FvRTk{ti>YVI>gqmj zXQT}6-0sqZm;1lY6A8I=lLF;nrdy17KPQ^7{l)N{ zns7Gj%h9F)c%5TSOMf0qxl)GeNsEi%7bVx_s<2G^4Ig%7hr5foVe{G!v!~Yv^jhN> z@N2Vwa1~hKJgC;w2LsOL*&}g}L7U95z@X^a>qT|9JLAJ+vKx#@7kB5;{0p>YD_iQu zdZ<7WoxwVc|70Z&nsGb|;TOX1)`=zcSZ5-tB(-fPIs@|94>|+~nqpVV%3tCppAg7N+`aYoP7v^>zi+|8`q)1hgAE$VMsKpo>ouqEbM z(?j|o(@%IK0TC&&+N-PJd``#L*6&Q<42T6;de-!Dts`MtnWHMoY4Tf5xkVZRBWyco z13unhppQx^mj%tFO2^YfNc13wZw^)KZQ?|ED`a>VrFvhPh?gGhWw# z?g21nsajJ#7Xuvga{5#R$e6JH*a4$a<2Uw$<`AjeFw{_wieZyVb^|hGhV`+T?5L)JKol)AqtZkJcm*Qy7DAh)JuxY z=ER03RkL!KStHs&{0=6Wm5$6j@Kcy z9V7Pd5qnu4V4HvXEbbv9eCDkN_99$5$JXoY5u|JU^E)|{30;noxQ6khoOkXHEH)FE zWfQ%{&7rX|uiYhbDh^4~&0KJeqyD`O@yLMcs+21!^;f$YVW5xnrSx{EJ4bS+vkf~4 zAS2$Sv*nUKVf}w84$}ZA+8_$X}h?L3Ga zQR=PpMN^DiZ{W2@ABQvzsE~?1iZK+^EYp~JDY$fnv#vq@peVbYvbh!@)V3UuhRpV^ zV$(axLR&E#jWtchG|c@Qzh*QDpZ9K>WG0eLQl;x2Yag+|*v#ymcd!HH65b@BGK(wj z0(aWY(Se@es0dtN|5t=cVE=or)I5hx44~=5+cCHQea*ce#;{zBZMy#ACM{f58z@hY z!Ug3KFrgVsz%h9nP4mc+JlKt@QHLOT+q1m-Lda_!i$v!u3$)CQZj}Ka&m;M;Sf*L@ zz-4|PAEB-!;jTm>F;i}pf37^Wd*x!k{q~BM?`p~m`Y`_pA@vv%R~YQKQyN#YDyP%# zH-yi;WQMwA9k}2h;<_vNd$K^GqJBActi!=WLU@tIOL1z@zvaK=49At6K-Xfz7kRZ) zxpH)z7jD(_1PuphYxj?v2l2UlhqS!MfbSCQo=Y<2BC{G<@kXLS#TT0Ffw}|lh0>r^S8!^T76=Yl@NLkc zcORgqL06ff>x;|)B%xJZ3l+F*!$s}TrZPxtEhCV=JgMzx#@?ay=pE?!~+> zpD@+=AJ!H(71=VEdM?uU>Sndu7z#RK03FPf0ZnXIgPbVDDbR`U0(G^4Bguga*9Ekk zoCs3F4%rt^iBZ=g0^(r6O$pC=PA?Cy*45TC*CmBAmR;i6T6AyaPS*A4z*ScpZGC-Q zR;&m3!IiRTrGzdUrY8pU1kM+G1i50qwMxzd{z+F~UmrU?0jNq};-r6b1~Om3Iqv% zwMjHV3rzvX4bMrt4i~ARqwz`8;OH8Tphl^)eB64{A9@eNaw%2~P3?B_gpM+U<1+K1 z)2^3RgDdLTp~6BjGmMH^ z^(D}*|M|P+W}SlQJLsSmI84R46)^i!lbgnbI6UagDRjaDG{5=%t*EwL7MpYT(mXgB zLqzn*jabIEl^&gsUeB9P_za?C#;A{=oOcF$Gu$*aZ>}%t^*;zT0i0 zx_El`u#mH}zZo{-yY&0SBxaY(;n{|C3Nr6K=sUm`ZW z)G1z!60-(h_u&#N`VJ0BA?oHEDLt4XG4P}ugZx>bLVSruQI??GT5kVXaY{9sI=t#c z!LE_@FX+095Njn%A7HS)`}R;VhjO27G6NiB3_?AL^#Dg;ZO|~Ynuk^>d+_QRsEajG z+#(Tli^{<_p!Y{WuW^BjG>xn79_R3VQCC2&{Bmw?XJ@E&X9^+NYb+*K_pK`El3Pkj z<5KEu=JdzIahN1=tI`4=quu3%-su7?;mtWuMb;V*>jmhXB*Yu)ogq_pkHv!*iYQEZ z8l(?HO_*8{zD;6x-dPnqB9@eRe(nbb$1NV-{JDnI{Bm}XY{SukHm z<-+l^zK+B{1%_k=cOTXKz>!nw=o@fG{@6MB^PW@83<6y@OLrndbTLLWG1cW*WK3gDwA2v zM9J3he**N!qJ)rY27Cr|ncVQ&eJ1a3)n)smemibazmdWdC|Bxt1H3W=4a5_@D1MsT z+*EB_bqpV5c{b9@nf66FZb(4CbIRvdcdfy{^2O?nkMoS;)zwa-K;Weu5;M?Oo%-4z z#m3e=vfm5$5VJCvq8j9cp>AbXR>HvRXD+h{Hq(#RUSGRToT6gfMk^|5n;%9lC|ISh z5J{5=-n0MU(8yRn{76xuGIgUSaaIAl(PdWW*uk|~GCPAc?~Dk3C0NL;7$mu6`J8m4{0Dn4!vuT+7V+WhS#bXW<5B`ZD=lY~zRc9CNOtX|+ zi$q7q0l}(cUA6sbi2(ZWDBWi~0!vf1C05k=t?PRZqeLW+c3IUeb;r&PB(VY$&tuD3 zV;YJ8oM1(MU=XVd(Y%F#=vB=VY?G6!ckV3DX?J0~q zL&)x9xb-H}c>L$$L$qw^s#Q^3k`qulXKXlSI7x-s*lqQ z#DEr7>yM?3agNAysRPLQsybIXeRB{qU??JcL7%0WYJw3X=+UpuR~Bh?s>*e7+x6a# zU;E(0F8Cb+Y_L?PZc42rYetm?-iQ*3z4fs1@#n1^yrO^Yrc*y7R}(eB)D+bnkjb~T zIHgl}`B))S+kjYd)rD=4FCo_K&?W1&xJ#@@TmB2!Z;>4`xT9aS<6_{af+eOrtkdKg zBy{WgUxY`qk|&v7T5Pm=&k`i9Q9ofR4Nd-YVsRk-o)d7s*g=tkgVBMQ8dg+|rKJ~pdX zQQmrou~DS;blhO2pGY&DBugr~cPb<-NS)Gg(|5cC&y`f$pgzLSJVLOKvmHGScAIze znLdn=Zly=ad`5kG4ln=h4T!NwGtYHwwt-tmQKA50r5bx{=D9X1%_ePfXI!?V7UrbO zNb7bB@V@f(x>fx5wv_|8o5kUY+4)s8rGDz8ssBFa4b-=E?}42Bg%PWfxC)%aY_H}# zC`8wLeRAdAyx@gT&)mek44;^O*%57lDz?bP8tF(kiKGm^lM_J*IrDdZyX|E))!}24 z5r-T;kER3`z0k&wQle~S%T%3H#wZfo7&hPZ0U|UHWt9Ko52^~AQ_832X{9H4up0UX ziZtCiJ9>?xxbnVG=dYXO`n)Nb|iJmN-Y zd!yJnN+#g3OQ-|qnP=9eHgvvo$b5c>ASGlI$ZvYnS-;Qs23*L<2n*ayyADz_P>BIW zg0C^ixIBz{r2?BMe7n0*#us5p5>4QRMpHguWM*f!8@}cp?L#cf?|}y!c-?Jtei=$&=NIszkXKEVa8*JM>RS2YL`QE##5Q{=96liHfJHQKa@}hqfHC zjYoFM7&>EB03$YvKDOFp`-9l`=9Q%k`}8FVA*50PY1fFZgB(w)&1%aAKtXVbxPL&V zl0sCan#RFeg;{F4VOH0XUc680|3`b$TSWSLUX7Spl}eqvS-H=59>nei@D5S*MRW;h z$U^C+p-6by$}k&;`GXx%UIrIQJ?V!L+>1@N+2&wt@Sg88%o^VskS@*){Jm}8hO(!9 z4G`Wnt~Q8T=N*|$ZzKf)H%-<0(1&lleM^tw0Y}vxH_1u<75|l6ut&OP}2P3nV{nPi(%0Ezz+-4KG%6;Mb9xcGC%+f7=aMP9}_rQ;w}Ru|b3j)C9ww z9vtA=s|Y2V0MrbFhm9uVZeHRcjI zK1~LsvS&T8m&{oD@H*s!ki)yfo23Bp9d(=(jF7gyCZz9{nIWLAh-H;#)$XMnyXvo3StUdY)Kr9TuuLS*ZqPj@k=7<^^p|9b zZ+_CYzU7GjhpevvtFn3CJ_>@gfq=AnXz6YN6^^8IBO)N(oq~Xhf*g=8Aao{AB5H=E&>>}XsObt=U*wLmOH)A6Zf+2QvupDz^WVXkx#R;m+l7_p-W zhr5hx$&~BPb1zqN#( z18R=qFKzMBAppMO5FIr%;AKy}=xMPN6eJcUvg@-%ahb5;KPiD1OwT`y9>YS>NteXg z;{^Zhsf^q&y&g+8>OPt~1}d&gbB9=d60tlVS-3}qevAlh+_fu07cSJvqyl*b>AQJ? z(uzA)*oWTLdB+{U_V?&NjPsm6*P`ba(OZ|{c!ni3a$=j9;w`Wh=8ZnteZwT7U9~!a zPT4XwO=#FoRg#H3RpUCECU$q8dpl68=pZrkZKwwXn}W6|cN$_sw>{3s3P(q{R;l{c zTdRziwQ4`UuUun8WsJW#?CnPCZg*vP&R5AT=!XB$sf|<>Q(0H#fJ0e7z!qRrt=52y zoc6eC-eA%M@yQk2`8y}nQlBa#wjJp~R_Nz}7xO`1oX?X^Ip&7I5ET*}6rARlsl>^@ z3QOpippK5u;u0S@eCD%~Gi=M*QNV0i`a7}EsGNTd-fZ1ggO+eNI`T*s4xGxFzVdmH zg5{D;K6S<%%_Xk5Dh%*K-Mv94LJa(%2Co|TB>EBt?nw9#QW|$}0SoL{bOgYt^RkUR zjErr54W!IuzJD}(C3rd8XdMYh*!`%5dzAJG5^zKi?j0ZdU zomv+S>2n$hYbJ0&hO5d!*^^b4OZ)|=-I6qr3m{p}a?mo-CrrrENCLvNrMkAJB+5 zHKBnQPZqt>(t0@rhYw^5XR&ue&=Y~Zm4NhfrD`j4ok*Osv_=981pJx0Dhm%AjC`~v z&N02ZXw*H^MxBDE4A^09i=vcQ1HR+d+kV98mj1j9wt|fjGsad?S6XGEAVNn)oW=c2f#UysH2Zr?4 z^c)C3k(s|Ui}qaWwul$rx z#YUsh+|7Qp@Y!biUeyiu|(Fb6Np$$*Q}w zA?5S$H6U?hX6gATNOoPD_TGP8?xesa(_z(Or$LXHD;iUq=cp^|??&tzi|bW0lQ(QW*-=p8 z27V%IH@|gEOpeYnrAhvrMyOp<|L-RN5MHK4`!z5!7Rss4S1y3t3620!m|Rfjrwh{7 zPI6g^0Wh?fp~mwq88|u5EC!hbeGVhsr88m{e?T~&$;l7t*$}mWDleY+U*3IgOp0D= zK5zC;%@yJuRos1!4}N7&WV@WFe?Ey&N#>r;(J9Rxzxt$I_#irDtY|5F z%wv7Qtx)>l<(}zG=qZ~6!&uC>Aa9mMPY$j9RQKjTcyU3`j|dotr9y0_Ai{p#D`lZ5 z=&8}b%Hg8O$ia^cV)Af?+Q@G@22qjIA?^$qfsf5J9E3{b5E+iYwoV7o&j8N*_v3O! zI>bN@%d?|hp&&uIxZMPBl+}b6wLh|J7S-zAje^dg@d97N|C6GB6~w&a@a1uQ%Fq|^ zC(j-ybDN87wR0bg&5K3xS1-y#9I6h0|8id5#$841?4WBN)F)=Rh>-PvRu~W0kjvwn z-y7GN=a5de?+a*2%~G}&X6b19DQK}Yf!bJE0`m;~`k(XQPU0Rf#hYuVw)2qg)P0}1 zx$qWu;$+PQA`7vcs1g0pig#wZCq*QR<`?zZ5AunI0znYL*>d!?ho#{m!|`c}36UOa z2>q>C_cXza;i0l!7BxwoHi_XkJ1kVRwwe(~gG&jxWKYBC9gTZm=7J>i0}yS%o3m=I z8rJ#Z+H(*T|E~r6{s~gwFDCL(@uUd|RtkdYJ3u@zr^g4N7KO$~1WG%F>YS?p31~aW z#DsWD1_e3aDll~Xj2~SW2gHOb>u`3dnO`C`M+7lFReVkF&LUREqvc|C)>Z2mIf?0x zr#c~H;v3dLr?bHPNC@ljFO2EDJ;#wcWE@2jf?lZ3-oIc z8DXA_E?KdHkck8G*$$)lLDiSN1xt`+9`H!9a84H38;;*jQAjA%Ak{%+x++tFc2oes znQ(O-O1*>lJ|_-yCYD?}(!_Q$(Bv+Fb;=?d|662u$f68VWLv4XA8c^;AA!~L>f$21 zq=@x#U;)Wm{&Qy}6cLXvzO#rnXSQU}28!di>6~r~CMvfEL@mQrZVm+3z7B1_Sri5i z7TwRE{nxyBJU%b?snU1K?ph%dHz+|pfc)PJv9oa{+*? zX5NCq+W;a>h<=r*d=2oRb^?k(i}#nmeFm0uxgA(epSK=#P1}k4UzdnNkIeuG#DAqu zX5idH1wqGDn0;ti;dO7Gap;VALa7Y)DJx(~fr6?hdlM7uu~5x2l)gv8rmNZTjAJ(* zxMqO<&xw!=6C@=j@W{y|>Lt{d&G3V`~-U_bV(?sUZdvs2WXJ(I1KUc zAEkoJajD7jKu(4#Gen)ZH4o?t%TEuNm#MBltOm?osB*#Ka&E1?`_(`2Uo4u^gB*0p zRDK6-^?qRjAWRsHqn>v_7=}Lp(YAVS_|vq5oaHZoJrLe9R_?&(fQH{((zb{Us$I2K=8|c#Kq(Oi+um)s8g%(6-8v z)iV#3Rg_)MaAHwY#ayZn!DYskkkCTj<7#O?J|(-?4S(kQi@QaHW^ku`E*v6>wXoOI z?WuB@D1{@C5qOr#Eb}`n!{OAT?k}mNS}AlW7Pf?BF{oq+4w(ruu6>fYBk}XmP<**x z#Rp<(evYCx1Dt^_JmJsa!{{&E7@abfc`Crf*&b(VBx}x&O%w0t>0(?L7^__I!3vkZ zJMqf$*Wl%}$CO%KU(lR+`4$>PMaOvH5xLPw9f9xi5Wb z)0n(@Uu$b_I?MeTAd>jD2AE^&4>LgJEeYtbTLF!9{Y}&Oub{S_k%`I7{`j#pRevW= zYNu%*qh<;IxN9l^ls{8ICM1Z9D@5EmdIL=lXg$M@H zUY1Gw0r?ps0Nm>cA@K7BghRMEB*ly<)3QT#!{^3W-f1ac$>8UtF^sqj(!*U6QKY*$= z^Yp-P_BRX+rGYMr(B0@xxz^h3scMl~Fs}QhI+eZ(EjDGs)^IPk{xGN2 zkq>~`Du@chx3%>VU~a?!l!jj+Qpu;>$Do8DxvDB2EKfIpY-zWeVJe^HrU3n}>2%}k zjv8m+|3MtM@ql;@qEv%{>X`sl<|crlH4N6CI<>a7?X3ibi_J~?_loQgR~2yibV^Jt zy&JjC^g265+ETE6A73u^QqS?B)I|gm_KL(fH`HcAU-`lVQ5VZ>el?2>Hng%v`0KvN zjd!WLfc>kTWNp(m9&Gj%$1z|p-2f{psB+sX;qAHr6*fFpSN{f>sE4MP&j3RRpcba# z02HWHOQd>^R{^z#$YJ{EqpVdbPbHH}hlMU%c`p*_TkB)L$T(5qIAs}rYk99p<9ru^ zv~M2xe7O5==d(F$KOK4q_U|D*Wm5UP0W1(F;4;lmDH=IG*aD>W&j8__aGy~DS<1tA z)4&O_-rUhiI@@1nVPScF|F*DKbrA!l2=k@7Po>x#wn>tQ+b_hto=l1b#Jlyo?9bj| zP*S;W|D7*Fj|HvZ?F(dwk(Ylme=P?_qx|SEeY5_W53Gy~)@8VGA5Z zd0=L$^a}A1?Q=6A(#XimBNA2*1_WoY^z{8-kzIhfI9t2eJS{KuVaoQ}Pmdt?yCf;5 zU5TtU;7{T^3jQ@)MCH>3@9w<$Ak>cw>$Nl+r$?6M7sZCi=EHov-?U2Mg8ZcwlvTPT zE#(#?al}{}rR+<*rGFrGgCjRh;Btu|?e zUpb`}+}c2Cz-K! z_1mI*W=i@?_y!EzyspgalXDn8-P)P^_UK&BBTkSNmreVTQ=^=rnlc;hezz=8yntA=?{il$=qVDL;gB`1uDuES`_GH`ne`g}pwX{HEnf?b+!V z(1;xJ(LVK+oSU^yEPJbf^{^+;pf;gKEJp4(;5=E+f9G*KY!Ymg=bJmAM~Hl`XVh*H z8{N+FQWOGQQWy=6%wt`~S?7BV;=A&%lM8I3@_($lWqc*w82J*)g=#apuOWu-V*pD! zy+gc8;mm_bkTbLM>z!_7AYYd6kIO9Q()%k#psl5cyQ^)W5M_eiA(T=O>F0M5P?@v= zw$S37L>ag%FoMqMyvBgt5C-^SqQVsp)2|D*u(;j|^IbAu80KE#p&EUO zv(Z~iF5opyA#${ILD$EtNQDouIrY;>$``Vy9Em*4x5GI;QS#%g#SxB#dr7K{Hk?~y z#E4+2twtxfEO@wrvmnmX8W7X;_4o50jA0Oo)Ipc{lD7lqKP#MO07=q3sFO)?udG%9 z<(m5D=H}5NZof-L07|S`_zcHlF!!grFkl;B>`B1}&hIke7WgYCA~F)9nkhXAT4;RA z8O?(;Z5J&rzQU6rHJHn>y50QhAyPz`yFOmfkilG-f&#nOb|tvmRD@?hN#F=?Md#3E zy5|EXO=ken+!arOC|5^1x-cTzgz*CuvM7kRRMb;Nr;@+)XXR+!`GlBgpd(ih5TqXf z-rLb%4zshf5Ur}b*dCYw)H9^im|qD0!?^9H?<)vQy|kJE-g3vrRKo!v+%L~jS5~fv3_2*=(*O+%+CgfH4peRh zb#1T%YuB419m;nWpP*+<2QHa0(yKSCTlwuRXD`A4k>~q{qT=asj#E2<$s-v4-Ixc) zdlSk6Gne;|J`#5d__eOp&gTC%P~LBp;8@4b_m=qnk#4p!N2k)j`-i4U2VrbZvFaa# zA|wo!F9@lSh6t*Ph1h<_rtfsQ(Kt2oc=9k3uZ zYU|v4U+lxPL3fR(uBFV0Oz?@xfDkhT{+;CxRWHFM1~#uLTCc-o|-e zDwrlCaKbV9=}py>oY=syrYO-*^Kpsuc7O0q-3o!NdegNDK56`YMva9@yUmL3O@6zeZjd=l|*$WHlWY`>uqBpMm zS*i2wTvIdd*k7uEn}x>OdP0Wq>&3E}kjpa_0SS!KjTK=d^CBc7H5YyDOpVpEFnBCS z?k|OT16RGfY+8&=jJF+y?8~++^>AtXBRVJGUPr-KA4|Z_Hfdsxbi8k*e&i&#P7a|} zuB&uPx=4F?*mWxbSMWWYH>XHIqRX0B-g<9*1WZqL@LRgJ%0s7}#3Rb{nJPP2Cd(ps z%N#mic%M8`Q>**I{tjPQAxKG$KQK_0Q=(&eV{JQsMn+k|7BIV@KU2&P^iaVa(D;`@ zJr>;80HO2qWlf|u6N$ep+lw|ff9xdc=0+)f0%7G&*=t5>KQ(um5^#cj@T(PYf%iR& zS?avrNS^tz01LM@nPc3Ob=2K7R_grO!oXuh0P=iF@IA(`Byol3NLMI<{<3Zi>ZghU z(Q8aq4XLg~!?eYrnp3B;xmcbyjUB@^q?h3Bm3vfmtrb$km6m*8N9J+FTyL!iAS13n z3ce1`53z#cN})2evpQ1xfP?m=6+7&I39rRg^XM-fs-Xug&J3QFJ{vz!%t7iQ(?;FS;+JU_MFu zs>X}IXV3@hEi_StRT}Ez8+XZr=tzs<0pTC#BG320S$!dT=Re zh~8OEkIrGx$KTP-Sm3Kry2Mc(=$8^x0kx>jtst?6zTg!2HN&)aPHaz7-wQ}rny`H*3MK3>E8PI;p0>FQUpF1%qo8NwvdB>vR%bM&(Qu(}u+J`UjYp@W`@0~`$0l;0sK>o(v8&to z11U-pQjfeMa$KI%kid+S}@IB<}}9U1py+~QA^4INs>7xTP$DIkVs z_#MH!?6@r*_ZzIApLA*@53(qYi2uq*_SIxs81-4cd8|&bxh9TawEUz~%JZ|LVD^y;rELDk5+!JqFfnr%R|o@f2! zkbvKQt~=bDkV#W z9k}4!Ksza3-W}KVOpRJWOLsw;mBh;~$*}!!9}0NZu{v{B{5Q^GLXpC8SAIkIa~k_k0?> z_MUZ~oX)plzn2T7WR^4X#+^;Me9b~Ic_kDRRj&X?2&VnH6=gLj+(zp+O4k(9?^_AZ z+HYJJP57*tXPZd3_Cy>%HQ6@$qwuC3**)XJHnEdUw1zU^Or~)1$q?*Ay90Tn7+&E} zAN})_FGCGF4unvC7X=*mmtn^f6Tgp}wFXa~XCJeIKtN&vKclBTPy3P2`!PyqE<`Ji z6n5@(#GN@V6Gxyn=aXr*a~rpN4|jT&L>^|Ae74G|LHzm1C!~D&EP?3y*~9mlL6^io zZM5`kGkUVFJVz2&^iE@nR`y>B4NCYUj`B{d3V23?kmEkZeLrG6lKYwkw^w+kMk7Xo z-TLQyTo+E1dP9?U!4a))XhEtEvc=ux+^2$p(#u~Qf_G?n zC*}6ruOW}T;#7qs^FB4*S0AHr=0LPE^%rwy4n#cGt6u)+>XR`8DaukeAx+rur{g>y z0zsKvrnliD8}5-dLe#$B3w3B$hij3T@Bc@oqn0|}U7}b%7XlTC>L8SZN_Hr>(~<(^ z<0J{g{WF)Oe?*5|9WJ{(?jZynPTYZnx=l>d?Z)j3+iZhznZ zU1A<-8Cm{5?fH*4?OGf;vz7@vJqxzyY#U^h37P&V;(qR69L1>ab^Y^~mv=$(lft_w zFx5y5I|DJ%Y+hsIpN2Ztr?~xX^#peiZpr1}D$Ye_pOkbvR(BN@u z5Z~;zZTOY>)xfXb8k5(iJ7wct{tp@D@r>MekBdLQU0Q;U?SvGE_MWvuvl3I4^>l}_ z59rv@pC=jC!36dvi5DH~f`bEr0Qhf2eyt&eaU}0Iy$8$VjrebXpxcslw8FtLM39)P z6p3DDt2Ejb80aL(#E|%Yu3uy7QkR6ycz3W2`@v1or)`Yya&d&;!Dl~w#L(c(-_!o~ zmU{5%-$xW8aT%8mTC66;_1j7kSJ6^Mbps;=cOqvR%w1;6UdI0WgZr7Ef22L9&iJOyH9>-)nh#^;3*)}$>o9N)sBYtXGsypVDx%Wb<8~zyd>fGJ#*2pIqY07fsKNWKqqE{ zXpZn^@81ThHqVo5sF#*Mx=UeTxO>6skf{>iaUAYl$*(x2h23UZ!xMb_=c9=72B4u# z>?=P_31G63L-(*<^G=_@{Pw_B%#u{N^Jj3%*7-n@TJesy_3-MRQY^swQd_kq^7$_? zxgPEPXCMsFKxPASSh}M|?oG^9vyPU1Id*xk5JUkyjdSZu`2=Wm1Zhd`y*>Qx&}_t8 zS}G<#0=y?DS^s&CBV?M~4A;kFunw2{FDwrRQPNBEd=5sa#Ul@%9*9l_{xf&%^H+k1 z#7e)_9au0a_|+iP?y2P5-0IP-ellyazXFytf!@r&yBH^k{S)g@y4QF*U_FM`WL zTA=xm?gux^i~(hIM5RavJ&}i3>P{PaeMifDB+Yz!t3xjVFDeT?pH`_B%=Q>8v=@l_hD&I z@LC2N@q;X!%+qVmln5m1_&Td!z3ZI${~1&3z>S4qk^o9L>4V_(%(m<&Z`f*C|DAEM zIC>0Rp0XGxJA)s4^jgIY)x78y9q&Esz#p3A^7<=6Z?uqEFt8=fn0R>V3TF+|T10m; zth24iA`hl_3gQ)CP7%%bVgoAwPs*Xfwq43jTO9Cz$W7zV+{YW8}48K86gkZ`}ELvJdmv-E!vQ zJyOFdqF0u>GNpb}L)~SHz(+$M`^f2TDD_=$Z7$MnD;bZOgRC@)r0gQlXO|M*?kFsj za;~I}a<(wO5UKBJlY=B7P-m2SFo}erh(j?jP~bDRmFR0JD|#mjO9kGOxX?F%m8~_w zyCP6-v7idueZxvmvM+ldOwj3~^&S*YH)BB0O2N?Z^J~J5T@Q}{3i_xIp||^IY;Q}v zc{3eVk2VpjHzBRh50kTvioXCuN`b$IwbA7 zb=b;(i~JI8tQ;3=+aOzhg~nbIffNc_8X@D2dm5o8Rpl{chEibD-tHM#%gKQJ?^YJH zu9+`(aM}KgDb1Neqe5RU^Tk*_{lw-ZT3Xj-#@QE`A%Ao$AnPEjym@`Sn`Ob z$7C_+f@oUH3erAMp+M+he z8&dw{P=nc|_ayJS6d?;jxtaIhh;V%f+M`s~hkTG$*-`c6Jm*V?ovI8+kE_dRP6*5V zp4;L3KGXBN)b(JfcBN~ZH5Qw@>-K(M!!3pn@QfMY9V=F1e_sW^fu--as2#3%%jH}_2X91B0lb;nA%Oes>%bUUd;SsHdjZ? zuiz|W2nTLh=3jS0FV9r?+<`fO99$-w1p7yCrZxRs2DhILWYew)BuKuI93OJL{Z3k( zKriU)95b$|{G4xL5EH(6LkI(K(!&0a!#Uh}3q23?95l6VQi_^ih3$>ahc=2b{dAy= z-^Zo2y}3yHX#GTp}L z>)X2vpv4)u(4{#Zkm>*2r&~hm;h5|D$0P-*8Vwcv73m=+TBIbeQ8A9sO>P|ibP0+} z<(5UYX)1Z~Ek0+;_NLT74b6u(f9OBXnO+`0zdE$`sE~TBiiiNv9UHV1%7mqY5i#T8=a;CNY|zm z>CC2YYLr+@#B10Conx*H~pUFT8cn!?VsA<70r5 z0*pck3E4cV7Jx%RO^=2FM~T2j9flitax7)3=Yc&4oqq!~S(SCm77!qu@0sh8j&frxSqoT&3bcD5{5kjJI$N)To;gJXK6LyulHrCl_0aFDKI5OdZb~>P4B{paq z>>otq9Sz!3^9$wz92hkHOag7nEVI03C?+OBUu9;HAV&%{OO*=5A6`7#S)WJ(U9)UL zXQTQ6*H;@4;BRDay-F%E`6;7>`#1AY*{jJ_aSpCiTD&ZV>)9SR-{9gbQ7{IpU$D%& zFuDYeEkk;68&F|6w+hq~JMIof=-s!(2-H^VRq5~2d!VZ&Dfk{_SV~K9CWi(9`p;Rb zVNlVA$#i#j--}|?D{N(E5;l!bobI)0u*kb~*V_Vyjql99$9Emmb|?YGSEVp@=);*g zD!LKs0b|7cX8rTRBu(w`E;485S;hNjC!oJw&sxFXZJ&^2nk>8e98~qeaTDT3RMbwTDQ3>>jyVaz2)ZG3+ zFdzX;wh7=_ThMfD3sj&6t7WO%fuJhiQN`h*JLue3>QxPLVMLJzt=RKPM0?|SinTn* zU z4uX#3kN$%?4s~FJffnCSL4V7}lu)rp5??#d7Uh$~yn^y-0kmohVCCOGl1?K)mj_PJ z#h2c|1vo8RDKsa~OA8+zEJYhVS$|=sUZv9RfEUOqwsLPo;&$;Y*}IBNTmSP=0@xC) zAW%FGwQ~3eHvH+H2X*%x^FCUI`c=m}_97~Iq_1E?U0*?S3#h)=q*>4VVAc|Jq#NDo z6kcC>YR+_a|F-Q~ITP&k^wVhBeC+*9{JI+pe`bc_o56LQ%>lVsNg%s3OU;Odnc4Zk z3(&k-LoL4?!2W|8x3B&dfni`1Vom~F-_lv`@#Cui^{dl0G} z&^J^Nq>hw7bK+iPKgEoV?waRs@ zC!nz*)LaN*S+p zrugm6iuiKbz>OgBx=5c9++k^gZQl3hzA}d2UjvavkOK53ogpIBtUS`Hx_bWm?g{uQ zO2imLuT@znVSF(fWC(p$n}J~wkZ->(0Cp7gsP&5ajTqq$q54vXqg7tr_i3w;_4bmB<Cq{Tg%}7K0~d{zv`#K7V?kMAoIt+FzIx#0mL25tk}2fCZn7ci;*I zPQ|Sc_BY&zu4S;+UUopM0wgPC3dng^2F#~^);}Q(s>;|Sh>Bso|6HfRQ{Wi{Xpvlc z@WA$PG3Lmpiic~A<9671;l-cO_|byPAb{@7W(+0PGh#CzuJX{I^xXVxWtu#g6X+;3 z_V?n6QfOxLg(HMHy+yXy5=@M&nAllQN`V(&Y(=oGiUAkH=l>f;$oRo@Ss46od2TXH zL7cV8sy5_zw>V+iyw_D+T<$JjzWc5xP5u`&)sY$eYNOtkZdH-h69He3B(J>Od@YpA z^SHMl5%V<>*Jv4O^S=pSOZU<11YEmLp6+?JpHX<9EzjgG*lN%1o<^Dr53pAfw6;yv zVHh@EcwAvg)=^+YQt}gf;eKzE7Z<^HMZb~=4-_0j&l#oA2u(kS!&*0%UCuSqnB}O~ zYqIA4?HCm$#EAnq{{=BM7Hn&@EJZkP8} z_ZvaKuL_4u*W}whHo4@!m*4P@4ZjXtGkCG&mAVL(#EVbHB3NGCXoku3@%}zu-CI|( z$=uy6_+U`sXKeEg;AQ&WOf3neg9VNcd=vzEo31NLJ~s650Z|A&-LUdu-5b_d&X)?I zoOT@t674~H`sIi3{Mfy(T9=8n$dgV;RXK9AcZS&ZB9wF}oa-so`xv&K1E2DIzC}Sm z4N&Uoc|l7{?R3Qfw@xNznpM_QEe3hGP3sp;NtBXoQ=&hkf{#qB!SP4&H@x1r2vh@= z@T%!aFZ@-r;puVyk92N|l0D{Aq3WX-mdgt+(l$2B3 zKlfUz8Jk(Uj2p}>hC>{TEO^4Ng(@2eWw%OezoHOkb9ZmnyZG!p2=V5A6**F08L#sQRyxEL8 zm@QrVm6S()uhu_=R{P2&+TrMDvn*X0-9CL~Ry&6kaQ+F(jpY8fCS zG$J1cg%?nwGh;Yi7dO(xr8UbqesNeaT~3BO5V|X!>3=u;V-pYw(8Ulb^jhMEg}~C} z1DLLh-gma!tG@D^v*$hmqv5=2>0@n{Pz6w_9lggIGrbSL{XU+25o$oB!(F;TGaD8i3_!5$a= zE)z>>aM$V!JU6tJ+BR*#jw^RUcXee3hap3=5OHd93XIc@UsnyA%_yv=z|a5p-k99v z&S&%|5|0|2gG{}Xq=w!lMKPQ+ehd70d3U}Q0grJI%yPgj%0!;sB$%#trFXuw68;Rfc$Ovc{tfhB#)?eaWj zP1Vcyq`WY;P8~^M*j{TatOFEF6#IGWoijb8%x=>yv@YZeVT{Ck019us-492e?`-IS zl@J7jNYH$o9cJjE@mMQ{zQp)w=e}O-VU+rXm7>ISSqG3HMD6tv$&mEsy@DzEmf**- zr?ME;SV+TvqOwj{)MU&+{yg>@xNnSb)bj|@=~SakE%E;P#2Gk(pqmePS5Dt~;;nF2 zY5$OCq7(>`K?f>Qo0vt;e&c;9Z2xGYp`*|rSp#dlecF`|eJBG%=3jWm9?;m&ZGpX7 zjMOQUMWPafp6zq#>+(c2(*%LOc`H0R#HQ-W&AQM-;fN*1KMvEd+drT4gZ503O3+Fz zzOQLgfP7psE$MFlaAAPQUGz}Er)WPth{@srYM}G3V;<==&it5X#w$?DZXjcEHS(G+A;n~!*Rl3D&g(R zllwC&_XrdG_2UIGs=sps>#B^c0up=7HLN zSaj5)gx=tk58RtDyyPx~wqrRF|BbPr_lm=L7RAzcD1%@(AE4B?ZwA#5^rwbAJ>KUD zyL?w4f4%CuGkG%n%SF*^pi|5eI#Ai?4#F%?pR5D_Q`9L6W1%gAi+{MmeVPv((b@jruch)fTZ%UrT5|goaq>l)z9cB6eX^30x15) z$lL`|XUg8D8!+N>^fdx{ni00owC8e_moR2hs!laF4&A5lzFH`#C9IH%PeaD}X zBbM@U>j`OrRfv@Ee^PtWTXpLGGRlCWz46KylAjw7f zY}PU!&lf12JWRj&HzYt61nF=@@k}XC_u1jGX6K>j1(5J3BjM+(wiA?JHiu6hdPW+r zCOf^ap{eObABPmh;mh-72=yZfmcspOj+SH~bA-xH;9%;&396R6f;!mRzHHQ7Z>q@h zWGW7$o`8huWp0C3IN8@WicW@pCrry+KZa0xO>y=y%RgcT2Lb@i;7k@hjGkv>;#&ts zN%OBu*?tk7U7syzzAdslbcwQPUFU7=b-HUEZ{_Jys?J7CFDz7tAMO^v*h+C+yx7#F zq5VR>MtNJ_BVdMrhU8sV zGB-L^x#u5mjB2IoJBuD(TGbj@7A4H_qp4KR9fH`TAb83p!CzNE= zR!{Hh3?vwxZrPn4(j-kSOm%VCb+d}>^#!~YcT*Dffeh2{=I$3+WJ4aTMh`hWZ2+rcI~b3KSSBO~@=bz%}bn0G@2pxYd3j2P{< zD|-wR<3CZ`x$@|#)3%<=^-ytYX9zR^ZwHy$CP5z-JNkj1ECW3OH+p$!+RD^8n&D#j zzCPk>>TE{?9+pE_?Eh|ko`_fL&`prG&huh~PHV8{s5 zi@n&o7wR4~Pt+SwAG{|eCBP93|MMUwQnWg_G5p-S&qyN`H7&2}KHXKe_(COPT$S=4 zv_Sbgdh*90ayUr@EBp1*;Ju~gulB53sV@D1#+mLf8n+m{_Ut>$mV`ylJg?ZF2Y7*( zeWNa!Kc^PT6H0Xe zFea^UmceC=W{$MbEbA#$Bh;PC&O{WT&hF?0b;N|Jkn zM_G?3*>>hOJweTf!s5Iu?;gs~t89}Mzw(}NN3u}w`;58GdmnEE83uvcARwxd*Ma8G zvtRgeF}~$DI7ih`3AP~n6wzuR@v`q!<6?Kt2Gyr^vCB4RFBU3^defd?2q!uaWj~!a zyc@I0)AH=Q*11X4M#|O2n{jMWY6@o^pnduvc(ES~w3hm^JL3KU{XVxzGE6q6t}`;; zO)mHt#&6*2ryqc~_;{Ca&)ey??CEd3UEwJU!{+mmnd>7i5%0YG%?SlXTs{l_f#Fcc zB$(LT@5oclP9JSE`x-hoUQzHi~itra<)0|RWf{&%o$TlmE?hx-3vPmVu=&&H50as z*O6w%T1@7#W+ujqd2$`PZ@TYxQ1PqYH@-f0`4aK7aKi~K6T#*6P>hrmOaCvox|*F5 z+K#F^k52D4vl+Q|c}+l5SVCWCP*wsn_>6a7rcEp~d)b`Cy4{d|k2BxUis0D2eEYfr zy?9l2MikSZjdO^Ev>k3GWq2#z&184KV35d2fA-0>1~FgJT0Dv9ZltL|`aYY`yn^LO zz+VNdA%(;RKm0&lVETa2qxFS0(=*pu+8t z8`A46uyJq5rk3aRvzG-bdneoeB%%oF-|Pbnqt^+qy_^&8er5quD0@3oJf+?i&IUw8 zt-FpZ6^Bfbh4k1Of!oj=+H>x8zI;*OtcnMwSmk|1B@GMpBguOo(f<|pa()bFQT2L` zG8mq)zw5;{uk`C0C#U!5<#C)DZPK-yZSk9*mvKUGxYgT-2VEDn;tx7_H1uwoe(f!x zbQdTx!)OTn+9MsnsO5H9^tS4dj12r-&~wmaDdwTT+~ZUGYhSY98UyOSlV4wteFz6TLd zd~@g$E!Erl3G#}MPxor)0rBEzPyu&5i7h?}+It)ojw*3q`y6X~CFs83uM+E}S(%YQ z^_BGW4v2!MHI&fVkEfNK5FlUqG zoKwZWlgM;iQ@A=qZs8ze$V-dyZRB6Ae$*OE7_oSrF!gayWSYpdn<6|JUg;@N|C$R1iqRpc=tN$5?}tB@L(uq{zJAJZLw0 z&e%@PN4?SG@knNVM%3+$kWY_6+wPU+Lj$( zb*x`+dw1bV-kYt%iS?;cB5(hgEn$c4o(&M`;a9Y2{fV|hV61g4-Kj!M%*>xqD3roH zJRC8QXJC-#pzk(&Lp@iw1+=DCW&zRh+O9wX3Re*3U*buO&2#zO~UnWV16?SjbgB#j!e4ob{pkDW`U+bq6R9E_Jnba^md= zbx7-jIXZi@e76yqakRerQC}m10n3#k6FR5j?gE#)h)eBjv{*8nPxV z8h6kJi(I~oEqJll`V#hvK}AQ^NAqP1d<3#4(=yp2>VrbsYuC_4Kv_=6imiM?@zD^pP;h0A5;0ZfmSB2lnGut;l zAD+hFz4+gy(kZiu;sy1&zkmNOSq9)mwtLJLgZKds%&0l!r@5ZK{y0h85vW`H1-jmE zj%DRmyeYOA9H;^`17$OKk?_@MnG1{7^BDO$Yrj^7X20Lz(sf=UgL&I|MdMs2w{(I| z3-Eo>i`g0tzI#euyb~lU?sRD)Mct=l?WOze|QSIycJu|P=_`H@>seA zA*Ye)azR1CU%!6!wYk$FgxUIMo=Sc>lR;RrZ9381TN^BK>$JldpIaUN>1H-sGL#O(rPgZ6$SOsRbL;F>NQ@#rc~k{ zk6=32Q%iC`h;5r3zr&EP0KyyCOCv3gu$UKCfx4RPLDgXqs6B;UjBrgX@g8H!_ zfVBn(vsFB=oP+AIUp-721NDDU`5CAU4G=%w34uDqho=3pg$%U+$a#b0@yI0KIND?bx@^j0?TFv zVzL<_Trur@78Ne*oq#iAeU;n>oV7ZX4vnv_z9r-Qq_7+g=Vfo3@d$5;lT<3dJSTd& zGND*+{?dixoi%v4LEe+i)@wCK)jXjhOIyH)MJsE@tpj|>!^4WWB?m|t3T;eIFOLS{m;w^J5UB8FAGH@FDWOzs@q0(jVf#+T$ zDXeT7H(I3pmipg-z(uqpMZi9AZFip#HbrEUx3!o?DHs#3AQvuEXO{N0^}|l}z4PH9 zuA%QQ=9JamFo{>)g``ZE*|UCRNWfesK0NCZHJp+ZI1|3wYeo}@4#a^e>~ugrm$DJ# z%7p~Qi^&dajY3KKy7-|Y7t6~xj<;@6Q+jB6j3$mopx$#JH+4Uq?x0tC=&l9f% z#j}yY$u6Hx>i}Qc_aVAaDQy0qO3N z?(V+pfWE(b$N2t%Z;Y)&(Wu#O_9aC3*K<)g z^IR)|Vkt|l_Q+w@*XTJ##7%z6LNuOR{M@E&Un)MIl^%XB*=VmkkeLuC42VMbTC&%; zw{-)@Ks%6c@~~R_!s%rCc?-ma)c~Xdr+>Nq4M($5zEoR-@tgeTfmkQIXqj#D24n?b zP^8lPK*A#lyTo4cCpYDuw^_U$fvLTja}b#W71};>cF!kTwvS;053b4)!UbvCzVNVK z{h(_U%=M1OAxtvU|2O4|(8NFAw_1V)8#{*kUkK+dV+xvBpSV?QW5f7D&iFyT89C5i8Fnk zbZq})(=|_CtlgpEsrx07DFi-l zqt!>v5pRM>=MlMd;}qQ~@*A<3rs70E4|}&vF4t*&>{#n$*78wnDf?^lIbV)l42??? z|EO#%aa{ECKdP)oI?lCR^S4@3y3TBorW;y!YnCO3Bloi&)nOrjj`VjHeUr++XR856 zG1^i7_NKo87t3|bPBM)CiG)+5cOHv}#47`QH&Qp60kxA8bh}lWA19qpSwrf&L7O#zL%0Pehn9Kn`3lFXDuT6jBjL-YpfF^k^gn5 zYjf(H*)Y>xvN7voth`IFwnDQB_A=qab09jx;q%H{(FDFAUYvX-DmpQys{Yxm`4y1b zNX@>}yo94{AZNcYMGYoNwE$OOZ_&a#>x~`=e-TTBv|!={=0lR?C;l$tw#^ws+eCvgi9(7(+vKf<@A7>NuY`$P!Sl%umHn`>ss)8zWu7N_u*bnCRBZRReYFPX1; zUSo4$x2SW**W0t~kZ1XgjZ-V`rZ;egd-K3MqkT(_S#nAb1iuw78F+Tj0tT48h?*wX z8NH^ApAoAbF8uzQg~qJ?)cC3o^b@Z}(zGY2bdpnm5It2EqHphP5jK#NAeUFGdpab;o_C>6WVRNsGnJZmNB*FtT|UZe%HR?NmSAJlgn}Fr8R5Qla2XCrgzR|KjpS>wInlsax*pA%X(vp|xVSe- zE%~d);Co>aap3695Z(Y*sJmsY7`lI>o~MEH;e6>1k|BgvPY?UYTbxa{j2R9-25$22 zc%0Jk-1=;h3dbnh%zEvP!NiiVN2`6X2n7m|YuQSsF{HTi>@j>?==&{nxIj-=e_+M# zRGPVUL&_d0V>7JBjk^h#eJ zhuyW_@^+#l-e1R_-Os1O+^HdapX>s8)^S#M(;PJCnc!l${bS?VkIS7lbvFvdmj`>R z!7{v2?^{J0Mi)r0tY)~#mErU3tLU(4MQj&sw)x3K1FRPr?@+10D#zT@|VuftnQF)q`~#S~PXRaL?9TZ`zyv_4c3WMO+Oo3ppC+^VH-k z$|z=8|8g>BZ!&VU0c0ZDk@#}E)Z4C45_WH9_ci-OP>eXDWV~Qg*+%`Qy#}4c5aq4m z>q8Qg&wr0tN}6#(wIr2f*v1%FHt=LwcN-ABYM%f4SQEzW!kutBme$sNZ1d>LX-wa= zqhRmSV^7qdvFNfRY)YOrZ;IS9pnbp2l3~yjI+D=@ zGyb^E-moQ}9zS(R2uFvzCIY4&wzk7O;NTcW8wbbC%dY`V?&9UaEt4(8}Fj!S%RIl1f3(a$mqqPdZ@_2vl;}>g{ zV+m^3g>a9;$PcezLg>0U2aH!>%MEUux_ zK@4gu;|O;Cc`LZ}bkG0Fm#41Wc(u$ze%yEIr#M1AyPwK{%ihf~$DxS#&N<;6yTz1Fy1L#&lG_SrLNw-=*RqCv^;tIQ8+5BuL zCGBisA${uP=}7(d&(+p^nqZpFOW7AqrNx0f+xFZmYr<+JJMSh}A>x6vI+T$8XZuR* zt%HeH5BnQVZ!~*073%19IPC}qjON&naQw)zMMhvf0eJrv}>!>D1*4tfkV^JiicD#m~A3D3?4 zptqyTwK-pOz@1*{(%1=_%7MdjaIa3vwxwx=mp8CsmMYB@8Fb#N^oCS2IbR`wE2#DB z(cGr-(XK#(V4QHUNV!**EKPK`%eFeq$v6Hgl?LlU#n_XS))K4h&(X)rP)w5@xU2i!=e4kyUu=|+EVtI==_~frfWYU%S$xp=e zA4I!eI{ghpJVx%Swu8(WC1`*cRyZ&&;(_xQvXnRFW;cv5Zv+z>d32c!88mH<*zf@-2eaj$)RO~eQdca9NQpaz~u#19T)j`MHniM5|G^-bH98mE7*uC zR727HnThvg1xP zq6ySPajcgoA`X99d3Ft!!4;^sY>bptFg7VxPd9@<2mV(#1v}|h5%7gNq6(a-*CtiBDAA1906Mt(`73ClY3~oOt`~LKVq2~JW>7nd_+4pNvKh^fY&oA~d zWC{7Bsu##91}wDL(H9nj17S*7XX5Q9ZvvK@jceS@;O%ILf03lb+rGs9Wt(jM{C=nk z&!O6FL*0Sn*P^^ON|B}&AAn=Jfqlw+?U{rr=d=4R(rCKi?ag^J`qiO-pNgoretBSo z5#6;g>WPU^!ai!_Z%Rekhkru&o`a+PNZeG?1qa$&Q~J94R)3+fX7OOP6a+$A-;cB6 zaiQeM1-|mFN|lPPpmaU*Hg2b?`S1%br+37!PP~T#yhik{9?t$nWqO+F!zaLt6vNQ;dIs6!ds8Ra zV#PcgqeS!OGE?keWf*Un+YeB};t;IS+4;XF<)L#*z(Q6%$8K_N9S6&u@7XDS&$ebY5a;m)<5Ji{4$ z#v2$HJiAr%c&i@ui;GwY!u8Jk)=3JL>PvE#@UXpw&=ND{pIrr;spG)RrM# z=NC1mV(;KOs33xZO%EI0d=EO`@$T56%}ab%Vi%qG#06`{o=&4vQh~hNJK>x7{Gm~= zpXP_)!TdE^ck?y#*l?3!;=gwIzGMUv$YaY&pB?xtzm`9du&jK6@o{hviHHludl3CG zS{JevgyYJtl099ep>Lhi#pT^6083)iXD`%N{Y`u;5I=iLRdZApFqL}0WJ)@(W$Ixh zC*zb=gRPzl@?!zc~juhM6*ZKLca_E@@p7(kOlK9Bs&~O`%7r%6miuxqMCLxfmL(NfJO` zDYofZ-`EseyRW|(T=#z7=ZApl^C!i0{a_rV* zh1$e>hjqP1=LEMAP=G$TdSakR8=&K2y+LN7--fJ1d+cDeUWi%<;v?81M@ta)AX0+r zZ13EwpTmkDo-wck7sJ#6S2W5qme#4@@Ds?+3@gfOB3MptPIPx6pm)fMv!m@bbm>erz;L2qent6SzMYH7_Gff>Wn$M%fMB@LE6wx(#Sf1u}GW3L% z-|cL?>Y#Rb=M0bQ7PHp=BLG7Tek6aIP?eEoB49rHk`Z@7xuk&t_ijf*rZAc5T#<&My(h=J(jc?a+E6lwTrx)OKv1lydbVhYy7&9XM=ZyQ zG`2RA(kL^X4#dEC{=C33sHM8u~LAHzd@0Y_FA2wHzN%e&|7zsN<&Ddz1JKm6TLQ}^mg zf!I&t6c5(T9doumpj+H&h}rnjwyn|6a;IUXR_{TKZxV568p8~ljhKl3?0&z|!d}04 znux{GvnPXZa5$~zV;2y%dXS8|7$_97f6!&!!$NViX3v)GVZ7hG@Sifq1501KoLuHJ zZRQHvd-8J3I^7+Q1xoAQdsdiPt_bkmrK-6+w{X6(51~XPdt#P)n$q#|WzyB&Gmxlp zcV=js<$}R~Kjuv5+*kj8OAU|Xspr)qk{xcf@y^1@UUNk(iOrq*&xRn>-P9y1u#v%kxhC3Z|g#CB&eI=q=t~x0vwky0a zF4t7pNoQXbtnq7L&!Ot?6z7G)2F6>sKVLc3`K?M@E4-la+j8pLX0e>*vaZ1O*HF2)?)Uo!jw6RbQwb~gBi9q| zv+n&|buEVZ%G(Pg;Gv~kr2gcrsp_Z$& z_WoQs{qOfOpLhO*<1VpHwM}tQ$8O%jh1a-2ut2NYQq8_sgtQ-1fM0#U+g1eGK|CMk zz{QkX#nd?DgxFIlF@M<5dSO0O+oUK57-gw}e{Px5TNKiMHZ|A0RnJA_#t7l&BwG|+ zztbwFxQqAa+LDTn^H3n=C+;X4XWUJbr@`T*uRpA9DrIYO9uFoJk$Gdvb@#ijTNV~~ zFaNP)E_UJcfIRDsed~3X&>>~{(9Uq!(4#09=)A+@yi-G`#rN*D>D&Z=HJ!BcqFh9t z!DrE3B(USS5-jr^#oNb=0K$uhcyfhvZR|ez?`Q*cHSqJl2RIXTc4ath=4gk3K(T;g zCg4{T3%c7Px6iTNL}RN5q;6+AM_Z*F7sZf{`CFEQd61J*-}md@C%bkM+&NkcgrL+;z>>wGJ)EW^YUa08Ml+&*Mj=HP>_g zck6o}p7cmFJ_3M^A2zHWyhsGY!wdk3fls%FBHk!=k)7E=f9vhpdWu;nKx%u*b==ut z3tYje555J(Z>$%y_0J7l5Qr~HM7S{?k;O^BJ!u5q$$gj@#U_|27*}oNWPB6tc(p3D zmv;MdbM!6BrX7($UF_Qd%5*nWld+trhI_Z-C=Tk~CS}}QXQ;B!F^pD7iC!{tP4$PXW`DNsv#Y#+cqv;d zb<9T}-{KXW+wg-wz9sgiKQW6*k$&!yOjc~*!Mmsq=375J_X@{=n|KiutWdL}@YJ?o zorCjr!c2ypvB?~>$oZF!bOx8t+7>IT3=KLE?TO8B}SmD{RP2_{>h% zrKtSl*7EvuTzAe07+mZ3yAjU&U*xPDSnkw-qZSm@2SC|M(TVS7HJwl%)`gK*e0T(T z0T+%}w~cumhaUWsP53!huiGQA*(rmU+th0Kdxxs8<2W`E*W8*XMD*XnVC=&UrCrf( zGT6~iuD*z84&CdZEqVVcNfI+!I;DnI=TNLjmu;ecNBeH;RHDAWS@XY5su}Xg&b}UJJUd>m2?KtwQCU>w5Swb1^9+{YK4TXjd9-WsLP(^bmXNMx0;m|g{N+}EH|rHc2UgINl2qGQPfzs@HoE9S7&CSeR?)&lVI_WH zb~|stYKY(r6lo^)cXB;>wlYNTB$#45=Yvc7Q68mYP4q_zm)2ptV#iQ=TvfOOrHhRA(5frvG@=II1O6ti3lVh46^D_9JzHM(IUS zpC`csUPDw|Pr=>p?(-BE3;w00pYws@Yw9n&Z|YZU<$aQjzu(Q%J%TK+w^<1jWg(I- zaC%g;yDDBPT4`?Zms;|4igdCtIoG3?InR2NmI?|b9di%oDT75ZsBr3kMJIU5bgeyj zYB!3O^-Qw>|E=CiDhwb#a`W+k(yP zc?sVx^ID&eKdgRx0A80h4D*dgK&pUlnn$`*G1|P`iBTE}A{STXoh+I?0v2)*aA^Ol z4_1G%WV#)^!)|42-f;U=4rQ41uaq;5fLI}x0^WcZ$yiqOWN={+v6w1e1Ic`jwq`*< z1#-+fknW?R<%;&ykgyV7_QGO=yO!`)~XBd4`12cMY+$(JEW zx(%NoU$`IdUZZEXJm*l2XfI&LV!1+l|NQ)}aPtv&r+wOmE!Fc`N8@gC-{m2%;@gy# z%Uy5@pNQ`P%WwK9!WXzLvb+d-HwJfwa)t8wi1p}-7;ygYe|ZDWG|RjyL8k8;eId>) zZ#1z#a7<}{vr^?~e(5ETu};WlF7S-PBOc1Tu1V+-7VF8Wv?hA?6`L>reQ8KFy^sf0 zsanw4q^Pvl+L(wiw$6`d7rv_`kJ9`0`gBCK0KMXNcsP1w&S}3D8ge$7mQ0!J!^2tU zN5A_me-4OzMUM`qI;07M|JLDMv=T}qBr`Ss7)vC+#m5U%YtQOYRj0A(aRb^d$x>DE z&@E9zA(=N|O^?_yMd>6IrFp0o5V6$4!#3+hn$wt|*W4v_ZvB>4+Z6#^PoMtzW#ujjzaf@h*clOA_@qTmb-%E(sEjWUXh*+I!$yAIA ziYWU^=pxV`fJ)R+pnKqwLMP|og9YTH*a1|Zg13}UraCtjF0~a%(<9 zkk1V1hoIY8%cKjpJ=66`QhSg|(2#6kv-`aYCiYKqg&pk8DlGiOPz;F%^!|!UN+M`* zp8)4Oq66Ssr+nhW)FAc=ue7J8%6`Yn^Dz0*c%mbYsAzww{z;le==S|wke6tPF(ZRePv+pE{Mkf}ZSz!T8 zP4qIFqvCflnUGLxB+-g`#;)N|y(i<$ zl5>HtReB7%RNv8-6xW~V0hVb)KwpwvWIk2J1Q_-&Uf)0&_+5`opp41eNmgt98DHFX zYAVa12(KN)1i?(^zPDDaf`lMs;P8|8Qw~m*)*1>EMtvuHw%FLzErh0i^#FdpWjxYs zTC>(l3hn35kNsY^SjH#y$al7S<=418$?8bm2kOM9cKtj;`89D~z`sn+EUQfGYoB%C zDz2Xj>^KZ$^>7U`PD9>jq&23kTPc6u?#+N-(r3|TdFkYK=afulgAjEi-Rt(I@Lf%G zbTkH(gj<$xyP{_l8w<<&WWv~s-0RQB$0h?`;c35EH#_!>l^gfT=`vEZDmzkbupyW+5eX9H&^7{32!4a=+1m;*7P za$<`=#^`8i-53LKfck>L6JDuPeC z?5c#OV#4Y-E~>OJpl%4>tzxG4+)Bv(@CMLoleFi=IMT)E+(`D*N9|kiyYA#&pJqr= zt}yKdGT$a>k%DFj=EagWN|!=0Z~XC`=i@5BtB~3Z8UW-Dx2g{2JRvRTzTVwrnu&p; z)vyF;iQyF`o6ECVSYCDcak$w zk%KX-amxVJH3=c*j7C|D@9!`wUZt&Z2BmwZggBD9e^=?i$ zEZW_~PSZ_*+rD+O()@h(w4u87Fu$N6@B8=fE{z{%YFX-`ipMk;p#G(gj0_*t9zh;( zY6qu$4=LXp;odWCpx0F5h!jReL{D^h&gkm1HmJHDX-6fM-#8k}m&fJrGV+D*O8Mq$ zt@ND}@fXK8ip6)O@T`?4DC`i}CTIQztxAAjgnI?;$&f0L3@A)&KwkpPrYCbe;hJ-Q4m#DdI5`(Vm!3@cvwd1r|FzO*d)TJ@ zyd!3JAAlAoJLsM%*>CqXdGtoJsE%F-3SWX$bPEzG**Io=}yq zk5w~ySlSWhxiuTfZBvypIrP`!}K&9ro53hybK zR(>(`S9Wd8)N!58dEGjWIBt#aOZ6Os-Ux#Qsw`lVZnN9g2eT1jK&QV+JsDY96fn0s zW+c$JNkb2b+;M@AX)C6ttqAwb{X~|82~YMm| zS~IBL3-J>B_`T`z7+EQb?bM6OQBd=0ArJhy)B%gi&lg0Rwr`)=!vwv*f*r`Q)D@x- z^IFfkta6<31I+yjV5Y$___?wT zXV#?g9W;Y;NF}KXqwM?5`EzeIVKMhRf$FK0&9IX_;LR zc=E@o(HCR_jcG`J(u>P}t$1a8mln=*fnw($x`9mwdp26#P&v^D$YwtC*wKJ)VBb0b z0nCkm?ZJWVhq`Uf$qLiM>|z6GKr#I5_1iUD3?$F+vl7(Lsy1-gd82UaW@<-xQS`=k zCLO!LFQjV<86%4^Ey*VGefWjeTy=H+p)_9*$T>Xnu95hPq4?C02+Jc9w?^7`AyjMNX#@dUhEv?m#EXqQyE6d5a!sV*W^uAeS z_WHjv4@GZ+9t@KjySo4!p0wD<)en?M7nCatK=?Obv}Xj8bb_2YNQ>OGb;dE!)6x9_ z0=NQtQ0N1=E?%{!{@c96Ana~$vB2S^Wy1~2c3#3baVZ|oVnrTRcEh0dpvHs;IZ#W7D<3e zX6YoOxM_W<$L4QJNIi&-NnK4Bv|IE1Wh$aK(a0>(7Sm01$*oVb-B+RRwil}N^V?hN zDbj}rjYprLBcS3Cx{snI&3g5U(odKBHv_3wgnDXiROKYAgVt%&!1j01AqFiMORR|DHb!?yY}LyhockBC$h_@)$q z+P#V&@~ljBP}V|Ho@iN=;xaOv^DUE;s^UButR!~68S8TPn(1KdAnLuS2^`2VPRLx>3!0jtNiLWf{-Ghqj|V9h9lB;5FBQ_+f_ZF2L>R z^#tgp%3hJ`&kBS~$+~_7CIe59$n{iO9wP<$CBR?k4Q$z5g`TgJF^zCGvI!b^l<5n2 zwcIUz?R^~q91?nl6)+P{JK;(P&_7WycxNdLAXO2h+M4LRYxUH|Z6$ILdWIp|LeiM^eibR**zRranIwSLS zi=#7@P}0VLeBK9zQ3oB6nr8{w>3YbbU@ZxI!Y-{E{#IfpCz4ehufohABTMNh@jTb_ zPD1*oIIEHsubJVZW1fXITcHX zTD)j%1FQVIj1Uw^U`F!)2A1;owmFO*i)N@cwgwQ#$h)>l)ULLf)T4-9Q+8}uGcLA> zrf|BM$-a0cx%s4(>0yXwR!3}K#*Y%8=Z$r!v?)ZOYA&JD>av-tW85z2VbC*jl-vby zz-jsrm%ic-grfO$N?r{0E4-%8j*3scxrX+FkmprKjp*sd^KD$apC-&21S%7ANqtdn z)9U$9i}U$U1#f1A9WkQOR`5jmM2C&lzvfLGdSd{&7yIpk3Gr`HYU*B?~=5IOQ)MQ>JC81IC+04q<#wlH72 zUX-EwbmZ+aN6yu*JXM>o#KEw0{*<(sa|h&U{0>Z(nda;EYcHFl4v24p%ixlQv{7ER z3qKx79OH2uVK1X_$toot6+qogrG50Nb4QFnO45Gz!IQvX8VsVu%IGq(IQbni?xQX= zNy~-ZJ5D4HWRQT$!l5KFKxgTC)(C5mJ?WS;7F!nz0*!U=_>r8TFQu@#a&))6+Dgp@ zr?agm&74PkiyDqwZ*&&}Fm8^wkVZdj{carnWVAlW3K)C36W=yxkoFgJ8L{t%D%dRB z`;c|^7R^0Mml4%gRGAv@gqTcm5b-Su2T1#UpCMd_ujcWa{z?R68(!R?d3{aYI9>p` zDTSrgc4nqeHfo;4hfBtZ#J;Y$Iv=}zOy?!_y1kPD(s<0FHVu2BE&XkbI_&7~xMJQi zbpM;}n@uHZD{47;~7-%w+ z-fY+T2~#8C*>MiU(q&U;yPx%~nqbaKr=gHyKGQ&C@RaKenX|KZRIQ35dc9Q7gcb~g zM$eF`lU&^?RQ%h#(~NKmi{p*2J>4057V=c%+#Q0hC>&%$6+%@Pdyg~@CZR36*8jY4 zW|dBSAatfp?{zyu`g>|Pm9oK^jlT2%vn|>gVYknjh%9j|c7(Hv-Rt^Rphw3zT=zIv z>&J~N;Gb0ZVX^gI3{`VIuvRu`PX8s{~f7x(?)#_l~hNP1P~S*%}L6 zja&@AmYk8jz}0GzLGY7)zWRmGTZp>(Xg_4Y9Kuh;yZo}z>SY4U$Y}}`IBp;LSKCIT zJe}dS$khzoUiw5oSA??6H>%H|0!ww6R5sb>8Q<9Vd0t9AmEAw>hOx6Vj{L@LSrr_u zCl=NY!(g7nlKINm8Lx~B+dm&Sb1;I-UZP4e!9y-aRGHR@pQcLpKtMK-Bv&!|mcHO- zE-oveddOS^CCcPHl%9c!(rMq_+u%;5a=t~O&%A6Oj`QQ}36wdM41U+1{^{dV!U@II zzHg+$jhxYZv_fs}O~KV+2qdSlsx;1}df5LLre(%^{4Aubt9*E<0nwoN2cZfh!;rLI z#ztVi=AGUTW#6gcYYO2IP%F*Z_{Pebbv1PA*oSJoQx|yn=g@jBW3RQGg6NG-!0}~P zp7!gOU%VyX&rD!yQBz)LE!=DvirNTzF5-?HK<9%~IqZuaEqd1_Vc`{Gh7Y#AoTjuB zPRm#Pjs!gTN6NFr`4q+U1uUfR5*y!n!u!Tn?0m8yBv1WKRr^OED3)tD(-0y2_q(?6 zGG=*e!7O6++rC#&W0QH0_yTTeP+8fZQO!=gL{AngrcLp=FXcfhTVl*i^oGluED!pv zj_^kgvTskHBB~N~evNy0ezu6#*vR!jnu1#6%>`4`v%bjJ>R0VBA|GV)Xp7w}-c)>& zZIsH;;xhsCuSTNuoqT~3R85P!qCq0*g^bM?**b6%M*SraHgge5!|o}Z966n}5ky`m zAFWpUtlan)OYLy$0)O^8SeL|O3*Ewy%Nyj(eng@KB2m2?=$DP99xro+f5{GB+0w$W z!Qq%)p=GK=VoLH`MWp;&l8HE>aECOl6(J;hS^r)}|AfF-mzn9iW9d@~geQ|wkH+J} zUso&o#J6|*kZ03Rbm^UoSX@^-&LO8RT-NY4VxkvT zOk*Z8^|>-bpm)e)oRNevA;&4N{1x5wg^T^eXXQ_2a<{W>}QSz>bK2W zc4`T@y4xCRb)4xXtRfUogyoO<)U$($hvPV2SUHEmp$n?dCCa4+c=695tigSG+4KEj zy5gu94GCXLsGR$k0pFDY!K&J;y$e+DgKA9sB4;ZRLlsT%rXcZHoBh+6Z>zuvxu-}s zEZ-$TX)XFfu$usGTO4i2kuxz087tla;KtSu|C9LFqRp@Zd{%}pz4EtI0>iYbV1|=- zd&a*EygE+V8#ril=vAgw8J1x6+7K!*>?n0hwns&8*9n6HLdQjtEoNzoGPc-*X|`e_Ft(NwPdAg~8}j?5EWlr`052`E0G*qgcBI z`iDG4g>5HDHCS}9GF){C%)R3_#xD#)(-<7uI!(FP^9Nc3uP9#KT)cysblg@p)}9-$ zh{bqBGLk?dKneQin&xG@A6-bppb!dtG&ymV4rgxjiO3F6ez{DOP0Y3=b~w*xWF?6}F_ zAXorSwPCWGG{tCp`5<{|Dy+ch2NIiV#$dLKDxpWS?a4YMSZFBgKYy6XZQv3QpRI z)EK&D7f8md-=FyV%SWcY*WWRE^M*33%2JL_Y1R_S$9v(b=Mg&R z-TE+ny7_1gFzu#X+pOUHaj=MwWsNZm)!oeHMd2{${z-ngKFaiZwYOieF7`Nd5*>jS z&!!EaXITbJ$L7EpnV47!bSy8&xezooL{;~znrxvR74(LJKOR`~Y3EnqPM zRj@APr86fCk1BG3E%rzD6}gmBRhMH6lep6C?zD@*5cfB6Vx9jbr+Fi_V2LFTRM%AE_&MVFC;O|QuEi&$+GacpCzdFQ}vS>AORy?}uu z#DVRNzN#bo#_Ua)x}`p0rkEiPN*w!DtbXv0GigoGyx{fd{T8Sz3iWs91N9=<|^vhz*cLwxWH~T*83r z6T*dv)f(*o6u4yF3}xP|aE21m8&I-yd-?y%spqo#JwB>&mscBR%|NR#f2>v8^z#N* zy#V(?q}_;Q-Hhk^9qna@2#+EPp%68VPsDtGuBoXZd#hgZ3Iv8f=~t;(+-~N#jPEoz zgkxB3->a{zfLm;;33I%Rqq8lnL|52{gJCr0Npr<|f1*5{G#b@-O}4jIaBm0Fx8Gb3 zwxX=&O8gy?Cl%v^_Eru$(@ug8Zm;@w8sWv`ZkewrKrS8)fGOsM-vk#5_^TEARnA0E zQOCcQg!pCehS5+fh@E|=TpywJmrWs)2rbWCxY>GjBLB@fMohlKSX;4*OCQsNMJk+W zLb{y{(rUvO-Qm?gNwX{rm}Ul%ibMD3tkI4iK4b?;k)$WuYG@e7iS1v$yk zrIzrkCAne^OwaaF-otu=x|?hR68LZn&HYwLyZ3?E&E8B|z{*J37>Nw9rnD8sXA7-v z`O7@S`K!w1e@LB#&1fYy-@F(NCQnSJLsST2eD^TwKnORg4DR9c&f=T5z~Cwq*OeDO z$Fd5j*pV3g2#vhf)6r1Nf)WhlZhJCQpzXn2WM5)l{U~p_9Tb;Dp$1r zPPhqdr~bUxdPN)>?&%%M+t=dhR zH6E{%EIH)?)1V%;fdEeS*9f`DAcd0or+5CUgN3Wv7f(B&`X6mi`A;-#;Z0Ueh-wF- z4TSXk&faJ3x^;K}!!SuAUh#GP9RZ8(`P63qoqu7O$MMK8HKDL{rBd7^tszx7oTug@ zj%+sX$41MJYWO%)v6Y3H0qsLE5;3DC#X)r`Gj-;SE7TyrE{VQg8Vm$j*w%B+C+Ly0 z4f@AZuPvsKUb@!R9(FQ{yiBgb_oJtYr307GAhF-;;H5vg1YqamFKZWkdRbGfDK3s?zA6M+PEbK)Z(@NJ_%G zKzBCCW7xfWLnW_RUVk;Xe%+hcT!zgS&-f8c?|yO3CY_XD$JTU;JhybDg!~V-h=pi6 z|7@-C3VIO=Xh$9I56g13`5Q>hFL!5vAH8wj7|pkm`BQy4O;BMwF3Ms@NJ$53(K6cN zhPSdFEg|Di9f&q(+jmb(k8K^>o7R0~o*-PCbQD-G)jAgBBti)a=n4|)3~JMh-EDpR zr+?q=KEl|m z@pt1t%a*j{qTbZ$@X0f_~Q@X3~Z0 zyorTX9z-6trgt(=c!#@m6#xl$`&6HQaByk}EM0Yo#i`aI>aH?a*3oZFUMAH9)ZJ;W zPRROFpM{Rc+~R<@u{e5$4b!eI=szg(i79yja?|gDm5{}{aK#`gS>!A%Zi5h-<_eQe z;pKxWwUaZ`b}6C56(>O_YbG|;DJa;AeVQd_G@O7dAOA%7h3}vO9sS2>XP@qh2fRif zGUReOj@ByzhQi(bYrEZVyMC%}5>ZMjL(grD(Bb$F$p!M*z3;%l^{Z(Y*#PoA$G!C8Gr+LKWb$s@{8HIGcmsYX20HQCM#xXAyx&YA}@Ds|Kpm~Pt&gLI1j}o3?{T&uW(|dMsAc)e zgYRj_!_)T&VE!FYv<3>x{2j#Oet>raxc?{k`<|)c-$&u@(9+5xe+S1~UTgdBR~ih^ zXg=>9cUxylE+%RjaKsecR8;@nSb+h@at8rWQ^o85Z+N|hRs65nqU0g&s;(OCeQ{hB z|FIW^wGxBd(bJO{yj2?|Rw&!(HtQy=)tn*T{X4WQoHpnu@&;ZQRJ&Tb2%F!fzrhp^ zt3fwImKYcVuvV`+SNjO>y$SHUthNQ}JMvGQjL&M{(ywOM91NhL53>1-+e40jPp>G3 z-hrU-2i{ZQt88=?ApAHqg;GHX`&sf@9t96e%AM?d9r zfd54{SJR(MLwyfsXm;X6#^)q+qnjXUjJt|0Y45W95mRoISNhn!=uG0yg7qAJ|5q;6 zoksho35puU?7Cfkv8f-CMk_NF)Bkr%mb+}DPi$>@z)EG9*8ei7P-jal@9luv?v#bPqAw0mj|iBuqviFG6M5@sie2OVLasO|mJ zXcULO9|f%Ryv@ws@~aNuI57?zn^}_8?)>qrLKk{^b61%!HnAzNplSgU+h3{Wbh@ z*fB4d+Dr37jzXJ~vB<28A7Hh?TW{Pwp@rbGT+IB7ou!M^1cDW^c|{fhlVNZEcj(aC z1c$$w6rNf>&xMqxa#XE=>|5B|%)GQdf>Dzm4k}ZY|L%kV#tQCK2fdTb|8pn#StS-a zy4!F08y|CG2#RU~wg@GT z!68WEKUbs~cb^7d$TygKnV)(!`0^i zZv~3_!qp#Ue(cn4(lIhlZ>~b20008>#MIOj36Iqq+6pD?SmA$5uuTKCYZ@`2+fun< z7Y;K(od9yNpW>t*zX0=C*C+hvY7l3(nOX;_a4qnU#kMeLxf`In1eR7-Yyk(T@4t?c#Rz`wA)D-2ki8 zlgxFvZRJ&`;R)J7mFc&mqP<>5bMMF0V)m_|A+am}#Lae#p?JnM%H0auJd_lH1CA~hWZlorOup1D? zr7nj+_+bFER73mO&P-i7Kq>K>uPiU42aBu$j6x+pPUt|XemgHIU>}tB^z^L!?_B`{ zQz+*tT-Hjo1ZXU==*Gdx!4W4PfU76w$B*%g} z04_qvY4Obw|J0ekccmwJ)7{<7%q)y=?tgPS0*I(kG=L=Q4`xXsdrpH-;R|{4x3;!I z=`cBFSKR?hQ6%#%fbkGBL-v{tplovxXPe4G8cMNGFn>~v4d%vOq$mnW6w;0iE1SrecC||gA#*z-2}#RPh9(xWFk^U*i^uCpkR#k`WIsi()I zZ$w>mrHM*6R;?orb~-vbkVSdzj26ybw2tMmN^LV|CK(&I_t+^MfeRMz=mXA^7?CQj z*th<-BkC)P?9u55uIcp*!BgPvVa1Lk^|^P<5Ba}5MeoSqtL6W>l7%_^Pbaqgb}C@S zF@N>nu{+oJTW|2W zR0sUT!viVR44HH97AoPCe(T!Li1o?TJ_MXlnR5$5Lqmytr>1nyeIGO}%Wm^mA7q%! zhQXoh{>zu!p(t7~J2NoL?9tznAkx@Kv%tRF5ygNjmy=&A-u~08Q~epNl-WsXUxm+0 z<>chPRK>4cXY8~Yy=wJl&w928sHNnbu~LcmuU`MCRFy-c!9?_E*av9)WwqbjxL)Qg zJRsRJBuAhl*8XK~-s|LTniOs>-|$X#ylKCU%{F4* zC+I%0nRv_TYU}GP%eYu2>OPhhT@kM>cypy-S%jj!C0|H*crkY45xn)hiG19rlI%== z%``0v5XlAz`(T>dSs!lm>bA+uaEOsZ%}GA{5?Pgz5_#8tD-)b>4F#pRKE7=n8XIhG zTgU5JU425psqLEODM!aKfes@p;gjFsV|d4Tq?`J7(K-k~%BW3`>N0c2jeV8AZsn0Q zc=Pek{T$^Nh5N%X18?kkq5g0$mh)q{ZSDrjTSTJJ6370ApGFyV(hBXrbB9qa0t{oI zV!C9HjCI3HC3+;aV8h;VX7ly_#tgBv1gI15k-?6hRz0eb1ZTP9_d-I}E!?{*8`f$Z zt5ilm?svKSx;xCu3z7UR90!Z~x_+7)K(GMZsetE+Q^gZxgZ_)^Ck6Ga)|ev$qL*i`(R=h6M??Fx7jOo=#p4 zL^TJIx|Kt3?Ax52)y;d^-rgAins9=iN!ZCsh%91 zi|szFKJ*;Ak>=fsKCy188CFL{$ion~_7&>hJW{4@Z?4sZ8Bpi~E|SOGL(gkiJ}H*Y zi@-<&f`bdh<0Ia|!!J-J-MnbcVNFfN$uBX9s-p18GySj>?uOOXRYAW|3|>1*A&1qQ zSzj9-343Z)41`cvSa=q2%jIsO$~Fy$Pry-#p(4u4;iTUbFGR<{z`*)0;z`cxg`gHw z;&tP-Jh5@c{F>{+4o6j~H|V2~t>h4wmi7Z|81UD(Ky>miK ze!jj^tqlwOb8MiN=?t57mrpSOki*lkE($?@=eL(4{FJY!Pp4n{w2w-aO-M*Ub8rRC zN`K#<9|bzzj0kEtFj{hycTZOMDZnLAU3g7Ngkm5`7ukrxC86@SetpS~zDE{^4_(kB z0z$FFY0=Zm2O|zv&ZJHma$>BOd?*0;?_pv8VrltRz}e8ya5z)AKPe)D@ABo#0VdJ* zWr`&6pc9g~P{JRur1OAM;Myf&!ohwW96Kp>I{hwD9p=_jxK_OFH5r9YN8-gKvg39TzNXjnepHkel{zHg zjNL*;;SH&0d&uv~xr|+c)@}gfu(g#R!#B1(CYSd3>-usJ;T`D%?&Gh2e}4|*%0cGc z$PnA2-6zE_L^|-GdV(Wgq`L3|CoQ1_YE61=bpiJDkGQW{$&uhP&MYdve)1$vgDPSY z;)Q!D)vvGEejZX#cI;C({+yUjqdOd`>^a`rQ2FQnTb;?b@g||r8NFuV+xe;gF$9A} zw<=(=rks6}|A}yHd;5Y77oMYBvnY!=Wvxn{&@90!DZvM;gBK#q*n5Ah7BWaRUBqIs zYKBQ;xwBEgSPg*x0YgJx#P;Rl~@w0wLG41 zsZDHXki#l=1av`KNc0(DW2h&O9eV>a*)PEVbK?no^k_?&+SDbzX9jOkQ7Etn-zV~q zlOa8^{l}0#+~yXSkmxA)n6a0W*tV@3O}C#jJA7lV478LgC~G8@7Wix&FKlreKNICP zc8VD3D)5P7JLqbw24U~r_44xS%)}$y2lz%Q;}sY2B9^m|)e~J#3Yj#EqjE0aYV=Q~ zn*Ktgb)kq65fPb_f-M5}K-aO_)v-PeEiJ9UveP<@<8b5cXFsmA&S*ZkYT=OwGMhtz z5*p3`YQp1jwQcs$Vl=>a{LZcQgc?EiTz<>59b_3xR&+;s3iq$XBIH|VWXD0EE;cr~ zW1=!#DD=#bc4vv8>+`I5v4o(kFOR&{wY9~>#BOan^9r?^;2^A6Ls8xhLdRK7kvZ0A zOTH*;R$zyb2O=poUui9!80tuz7C9R5Gf{58)R^w$z^LUI!~^+{@+5k;m%jmIcLEN701N<;V4D}g2tdtlvs0}-&^_kyu3W-BvE@`!{xPd_?Xzib8$2Y2|S8_ah^5lA| zg2>Kpw9cU7`*w|23)AHCrkV$w*h6$k3D4|DB}XLSn=+|H;eB+VHLsx_0>qJ|bhT^W z_u|Ei%)xidvO0W~Q6X5yebTfnnjGsd{#ui0r7|`|7p%&#HKDY4%(~@{=L`_hV{Y$! z1>8{~D6tnfokj;a?T*Auot+*J3<;ql@}q}*W7foH@9}X>|7x$AjM|r0b-n|xJ<7yS z6q9}&2?JW?!IzkDn&*hc!u~2 z{|nm%{Qgf;0f8X z!=Mcm`MlO3K5#3bf--pZn>fJwA$#q|#=X70_-P;tw(YcOs-LH_gcFM9wL{=CYJTB@ zywl)WRKG1vx(WJz0;&%bs9OLH2uom#ih@jKwfXlsHM~nqaDjF?2MdM#ga^|2xo)gS zC>7|4*N!ej3qQh=e5%1+#4#++5VGg`WYfQ%uf^r5OswbiikF2E{%V+A)5QCj)IM+; zu1ve2jf@Fx^3G~q?Jgk0rWj_dMxX+~6Nf?0RR@})e$wgI$Gxpr8B!=8_gx+RvR9HP z25t%wFeu1o4;Sz7joyAyXINlZ(1R@-VtiE`wWttai~IB>6~gVhMn*=A@mFfZxS`_L z`&g8Ie!FL!QUvu|b1D$sHMg!c1vI5~<4#1|GZ@lCh28x8d0C5+_1$HW;e5*Q%SCuR zG&R;=R8rFUvP#RW{oM_Rvc#7!@0-j{*6~q4tVa1=m7ps|#uqGgT909dWSdU{3buzf z3VwA>O*33EV1GHZ+Z0z2UGAn#%D22Yzid~N9q07qH;k56&}uUGI*YmIP8=}vCobad zAK4FpvlY-!$Hl8im7Pw5ZJj+JJ&at3@`>tpY+Rh2W%X7>*rGc>Nz85Psn*#t5K>n} zk34uzw}-!PNFMt<@>P+BSmcL$oA*1BeMldG=DmRH;9hcF#Q%_h28KD&8L0gLRdq@( z^q(*rQ7%jkUqRTW-?(u@d;^$Y4 z^$O!|&M%TYjnb`iZSgun%jQZ>%f+O$rYu~kI(m%8M&{-6Bpx7%-%@qsj{M-+hCIAX z4an7!jvvl*V2l4lx2dtW5VH?t0nzbMI982*t&so?S-{pL+V<0Af{r|TCPPN(+rbDeitMaF9S&)%3D0~iT?WYA!mYJ zRd+T21|=rLFoK=~HVFv{QM^EQ)+xm|g>FyD&NTo%PnYW?Q-FlQ;HD;Rb+_@7#Uvv8ai3yAM*yaDEzYqYb$P7s0 z?Ko85DND5!yY5?->$Bt+dr>V{G&rqsDFm2UZL2xW}dHO?iqPJ|ZabF4q-(n-wUi3h_m_uh$u;oY+%yHOuq z24_X>eH@~v>v`pF_4SG6Q`9c84+k^+nMuSJrU(>;gw!XX(KPrjI+`3q=M%22g!WVJ2VNJ+;8acjX4Tg`TK9m{n|d z_)k|N5?Yjo<@bF`8&9ZhQ9yw>UPy=z1Y0XrHQZHu$bP|~W%a!%9xK$*)g@Ss^0YZ{ z8bev~mxuPF3e^Gkbt`TuBD!4*^PmGGo$3gencGZK(cg1A?PpMYtB>V2X2umzPj1|0 z(eRYg?k3EyPPRmb_jH7kbivQ2gXZ98LJmhK+(BeVHRrT*8t6hR6cQZBV*hXNX& zP;No`;uX}-n#y|eF+&z=Y%HF3FhX?e!BHPIKl_`u{wx^nKf z1{?H;>Wf$I^!b^bbMXUgNUTIv^pG9Z3D(Chrq&(B7#RX#oAV}XQt+CAUUq&R;TY}v z6c{9-KU{H0P!#0nSR?P$c9NZ0V@<1Fc&E-~F%Y}o3D-`JX%%s;+2^T{lxihgj&=m-h za7LxI_j3Ew8z&GtBiTy+>N3v5=3r$AVGDA?eYifWC#o21-h1Tge2`Mc9d2a^UVp(6 zYCNlD`y8^g%=$a5{z9yldO;wQg!?4M_cH;2c(X9R8hS4{v&xgObs#Q=K5%QxplT&k zeC`(i!R@>vu+RZhn10SPsAdBqhmXr!s8#aiEnv zRLK+<7mpyk1XlHGp@TB>M{t~PI9IA1>#>KHfIqu^rAHegX*Yv6C#ov6V#c zj^4C16I>!rAzV3gy{G6KE=0VoPc?%Lj8>8v32|V@$brXt1-ngjKKtc}9-aLet=$;C zFu1AOU0eF3!E&9$1zA3a>f>nD4EE($9!AMXOsU9NvCNQRG<{dzdQV|h9EC+ma9!kLLI^sMIeE`DwypE&~#Wv@`*@^I_kG>h^}1f;`C8X~K0SRRO>}|s0t5mfg33Hpgh22+ArPDe z0z7c#gSKHB_~)GU1E?|q_;DdH_z3=g-cm-x8Ui8FL;hl=h$kC^i-I;%>NZLiuWan~ z-Wo#8^=vH7ENsk-U((wdzO^>Cctg*1m+LMk8~tk=8%rS$j(-F0TD&#lxVFEg3W3l= zpbzgWJ4COHx|@yexUO&Z_gAeBe1ghMouek`yh@RH$t_fyEX6lo(tPleetxNzYN$EQ z!{z5H=Fj;`AG6RTP<1u7qy)_)r2L_0fX?TL^uT;eV(6UtU5W z|Eolh|Fs^-{~xdcOZ+y310gkaa1dDT%aoIrmiGOgvMX=~KN4givPs*!yRS};_EXdI z`mXIV#@F3@Gg@l9xVDzHOK~=+nqh0mG<&w5R3T%Rf^(5z!Sc)U!h($A30>`Cce0uz z<=LqC$ig?Hk!x#ff7~En&So(f-UatBqR>wQCa_CJTwR0oF36ut{}VpeUq?gbV?{|x z$?MeAU_m8WeSQ6<<>hoyyvG_C)C`hMRc`q}M71>+WufXE%$%B+$E~HM#q9fiD4{y| z78->)Q@_;11+C{2Gc)B0#2zOpG9Mow59S*y!3@UA9aUlpe$b++@PO*Se*Ky!wj+`^ zeQ5fzU}k0}6eb_VXV@MsSZM8YOId9djr+Rwzar+%&COL}4VEbPhXuuH{iD&IpgK{1 zc(6x6%8QAj^1B!nNF=-ND@< z5_IuyF@3*|yK5z)Vx5t>3I3U*QXoKNOJ=R|a4kctj1MttuhW;M6@?skdOUurHM=-D z!0>k}8ylO%^mNwG*VtRM>_c3TCOflli;F4{DkT*aHz#M{}sHj#Q3k=et#x;Gs_$N#Rsw|BPRZMA>P&%)&vt6CPdHSxjj>M*?D{kXqmtA#bj zotRVty}U<4VsbK*_`#om#urh%rhS)Bg>??P!nPI?0_J>Kvwp1>jmPG-3$b!k9ld>1 zG8;-rOgxuWwkGua7LGF}u$Z{xxRTrScCBRIzr=3ZkDqq4ircg=Bjb4i3s}8v{iuE2 zpzZ@vgrM~+u?8M@O=x;)*QcL}^)Ibq+GSwhl8&v9BIt@}FnD?>H+v>grk%!hc^;Nw6i-qsQE&ook5v?1-nG^^xx{|jsRSof3t3kv9fuBj5e z!5-hwcT4Y(zp%W2vXp(o0_74Bi3VWCrc)^rcQ`V?>wI#soUNdvqf>djY7wAawm0?J zx?OO7X02>pETdzj)YkM>Tlm-5*x1K$V#fa#~XW4yn8AP*41w_FB%O6!u;Z9Yj3aS%z(NVe&w7^O5k*WxY*9l&S0_CboeqA z|C`5ZYW>CQi%UyF-{*r28hpusyEY&hEzGFV`$M(ezi`^Q=8nZfSL;Qp-6$*c%s#9IHv?{^gcJZaqCLnM~W z&CS`^+RnDHX14)Da93F@dN*`4UecR~mv^=t-rkxJASUEw4!l@^*um?u<2Cz$!&v*O z!%_WM1=zaFyfD6t7&I~}ire*I`<~8<{%d+i6UVJlDj0iunkdm3eNBPsS*0vUoK$c> z=yo~ij%z2c+G{u(j5{7&I0n{baD1?XgtI*B`SusCJH0?Y6cz4Zt8)=XvCZQEE$17^ zb=o9JM1x!Jma&PS?suebE=&Bj!V^;NOcvWoJ!-T#dekm{dW6KB5_r3CcYlA__|fn2 z$1s-_eY)23OwobEZ_3!ATZdJrhb7xxa`2FB7e+N5S6iS+l_JO6-TOoRm8!pWrUyEO zIE-UMsEZPZg3hS7B)qP{8_N*4SI@LnjYBf?&4-p!i<;l4J=(_3?gxPExT6^+_%{;Q zJLziK?Nbe(;lMf0ePW9Jr5_*~D#ua51AW^CWts(0l`*uAQ}75VU@6e*JV*H4(I2|w zXMAP@fk3C3PEXcPV}WMfhH3*I^z^O{QcS_*?l$vR?f)JD_`H8KFCJ%KK277eQG;*Y zr(vYBtR`UB!yi^fDV!#H9>wY$;5e+*0ubBVGr;f2DULPpK>==dkB!CR)46bx>$q3} zVX+Fa(#K0SjJm*om+a3)HB}%6^aEDyS4)?(T5bEa_-mBT+-^04Dhs3JameY&L1E&Z zu`W%yBt=@+?LQ(%8+96$F8d2RqzWSUpk0934EvovV!=r4fOd6u238%GRki*!Y<&y7 zo>4Q5@r>omRVT|D;jpoVMaRU1 z?gt+q_}2gz2A!iRa(IuD0wXlmVd_(UL4jd!n#z7xSY&T-W{D%*@f^Q~ky%$$j z+JwjV+s%gZnUUW71TKDR-Np?7v1H1Z^=$*0+6>9*1_@lVYDcqVr%w~tCIy0VmCc!z zndOw_lyT1Qf5=CLc0Unb&55m8{1Nqb*t}@g6QA~1_EAeV^+pMRMQ#$Yy@|^m*wljm zp1$Mnz`BzfpP9+t8p__9Su_TMm6F@Ya0H-rsmswcT?bIF?mvINCdau66^*+&ivj#q zbAFL>9uuG`H~;1zj}||Li+3QgoWy;vu4Li+=Ph#gO>)P@q%bZ4fp8?eY8JA^ogU4n zi?Z~*|9^KiL3N!HThkmNI;UOpK?gsU+RyxWbqbBJ-OOy5PJ6BQ#qO>y#Z{{xiC)J< zwm1U+FWEb=)29hehmk)stC&|SpwdPK$*8bSmn#RGCPfg(t63D$-r+0U-jT-i*(3lJ zE>tt<;R-zsx@Ma#hlpm^c)P~fON)D^vr>4)mC;MOkRK-9`mC{I3MuKQpms?ZTX*Q4Tmb`Sg&PKeQP z$jAS$>LgIgG*L*kLDz79u=%mP@w&W_P&yjeAt461Le+2nXYomRYj_gpgh`DqcZnLw zg+@C=3#3s}kFPyv<57`cK$w_mNKZp^I6|=^Z)Yw?ITY0BYJu9PC0mZSaP>DrA_fI^ zg-U11pN74$%U%`DyF0V%sLeih#1^Wad>s?kCc+{32D(3wBV~)a^MefpoYejYb6fpm z!$n2ya*;->pO(;18Dk4Q9hOZhIvLyijxGf$g?bS8Bq|NlwwKQt!3w%zdE!c|R;cme z=b}A{dr}lBm+XEFl;jS1p)PYm2^J*eDJjM(RuBA%dTGv`UG{)V0=4X_wseLi4&+w0 zp!^4fQ{!y#oe&%+yMbDi)I5HE0CldXM7K1H$$d(^oh@{f3U~OED)<){qJK4`7D>6r z+UXg|Q|f(K-4XQ7(@R`9e8hVFD5H4#D8uPzO1%SWn6f7sk`}gtSH;R9I2h}(L*D_P(PMOYTt|w4K!X{W&E62QvB=`AC&vY+@Jm?MAVM^AAW% zOrEDEr60XK{2J#qhGv}pxYp2eRI6suFxnV(WiNMn4)IZT@;^Q@BH9g=Jl0*WcfW?B zSNbuSWN6{SHjQ*8_VGsnDimjQyQ~2`4v#fnTa#`ZMDsi-66j>UB4d$dw#AsW7@BKA z{_G>3Lwzs4v5%mH5WWqV{3C>=1j9$vbG~oTGN?`jxoUwqL;U)Zyxoq9J(`j)s4A*QBywox9ax{^Y?v^gsw1ih0ZD^O;J+TN@H-@)M|7939>lsAQL!ilWZqx!w$sce#Rj6xbaYP8%Af*pi+z^6leN;HRaJKL zP&*k=kSxH5q?CRoTM$mq@pi@lUyC~*ihKH?oSR@2ucmhq0W4chUwT%Y>gNWk_KwQca~tGB~aLp(lHhibY@xr zW^Z2LTl;N0oF+nmTCo>wg#o%;&H(K;IKS{;;G_KBgE(-7tdr?}4lSij?DJR`#0P`c zG!q5XbWgd@Ff$QJ6*LdK!dAOWgcX2P0TXJoDc7-uBz_ve zp=PlpE=WCCOEw#+@+>E7^Ff9VBA?&Lc)-)s)2nj*XX{~L zqHoNHD!iTH1_C%}V@FK85 zr48CHY%AItp*9uI0_335)!iKw!EHplRbt^XO(l4;H;s%`4UzfF`nvc6T-biC4J1ZQ zE>;xJTThw1OJCk0YViLn2VQkgVwD_FJUBvTD>u~Q+-GjlHA9(Vg7@L`^Mgilzm3EX z2QxJCZl4}?oVrvaM(l>o_ou~ArV~WBa;Y-E}w#I$114?o#$NSH$ouQZJ#~5+*=xH~7vno311|l7lwpmDtSedMcF@PLh`m1e}f#B zOP!PE;h@m*sw37_y`vK33}>^AInK{6>zq0*E&03Pe55;GkcPrQEUp3-t?zIzzHOqhH-OLm9?a2`1ZfE8 zTm&+LR}kAbfXyU@X}823HOI~1i|^gncAO0n+3u9wA7~N_MOL3c9B))M*d zt#}f`+lUcian>~f@$^_W|2_kh2`PJ!Ej+~n;j}%nAcU-fF@g9!+!;hyP-G|ya=*l? zDsgC6PfxHkts{f|n4{6b!9myPXpCug1z*v~Te*h$Y_g<;OPxUm&k&_H9fL5&dF{76 zjc9-M0Hn?ypsq)|m9ZV9Am+&Pg9&PHZ%^xfw0S=E%e_cx?1N!poC*+Un6u+7E(lOc zqLlS1Gl&ld%x!R;Hg{DqnFueys4|*N46KDmf-vQB8IF_wsK3E$=MW#Xo_8TH`^8+p z+Z(2{uC6nxf!b?|0Ep=xJ~KG%w3-d85YOD=MDqYZc}`g6H$f=uJAz3i79A_dl7fh_ zOPog-s%Yl=4HGLoHAdDMbh#F(h!&*Xah?7nE)ZEd6+z8t5rp*kP77u8^W65w9Y?KI zSM{^j2WyYL6P1Nb;`llLGfoiLM!_TmNnZ-|wBpT^SZ!;Q$|{o;cf2B!-))wucN?evZdw+E{2~6YMV5nP!vTi+U>UEG|lAGLwOU0>p`DsXIb&VNtLY z%T;7LQ&xNc9k|{0M+RcvaK5BFvV+CBzZ(7Y*LPGnQEw3Kx?D1^Iw!GQOIR#JSq7>{M#qV(oN?1%F@_Aw#hbiR-+}J)|wpMeAkQ zu1yeFfQUgS8RT~eu zI5~HWXuF8=k7gvh(r0n1P$Bjz%@kXr|1vfa37ANw4X$a&N6!16j+7_S>qAr_5- zbuev8UL=!-G|F%e@;dx0#7ePUmoGw%Q)*GEIEWPi=ew_Q&;qUa5d-TfVvrPuRfe&O zqy01)6PVh3bI=*vDK)>}@4Hxpo74VmU!1buPaF_E6=rj|ix2RkIN%?Sj4rr4*pjmD z4wef7>yL}#ZkL5!)znEj(w)BkA1)0?2ZbFI>>#pMzM z?U*xvu>Vo8Mot!Is`K9|h-6hw-x_MG(!k%FjQzT>&1>pQNZ7Yt@~nrEyIltM*mOYI zyLq<=M9E@%vB`NeBVFI<#5ysLeUU>x_KE3s6HVC4kjjh^)vJJtl0)ikuVxwJZ-E*eu9+XJs%D%H}Hht1nTB2{^kGK7sEY{@R7kj<~&vrR` ze^e;=*a{9wdoMy*Md5Npi3>r2S2~`}@&MS_W z&%11UX$hkZ$3s65q_fw{uq%{@mK*bNnR^xFwC+Xs9q^}dp^ZNTlv@}C;cbaoS;3jE z=KK476{?!#w#@S4x0>%Y_%Nuch`MAy#+3XxbE<7&6R0T1h2&BJy*;9!IbQTD01 z+(rq8MH=}q4=`@;!?w?gEM&%+r&3*~r)l@lks29&JkCm?gS~{idH3dEu6{O^A9t59 z4+m7SXm*q3G1^cWf%%mEj*EL7*B3WAS$eeB)DZ4$L45Zy>}nLo>hwbZ0&6~F`22(| z&ibUzs1a{lhcGspA$9mj-8)$*ANb0Q@sZfEF-(@tS%A#4HF_%UHlJX*E>FB83|ms% zK4lx+eariZs=r$IZAS$>Z^|E@x70k{DOaqrijUd!;zk(g6;WJZO@Yd@bq%d2qutME?5k+md3`n2F9<|>e=Z_~zzLyk1&IDcJ6W3nMMc>y&-Y3q-7KMH= z(urhX{vjcOOvw&@uP&~NmM^156+8h;H393IkCns2YaC~#tmx1;G?ge*6Q%+jzTh~SNPqSCo1^qvFW)46nXYrK84n3IKi zum`mFbm^qNMq57-yt`iH=d7i~b?D9j6{6C~+Axs*0i1l^D>FIirb#UnWTe=FJqSEf zH43mNcAC?UWmq(GNqUQe@=2VNfcaL`suC6sjLnt}uTTMn?n@x~X@U8Xw-oNXg9etC z02n*uQor5uvlZ^ruFBo2lgIn7OrQxg%5<=c4!^UEqS3&lHckC*nx$ z;Gj1X{vObaBd}h+h1kS)GPc{N-o8#GF89G+ZJD^$HC zw&)ZS29hCSU50pZc%2pY!Iy^X)Ni1YqY}RS?&_1x{#pO0py)aso*nC=J?`!6STqxm zN7%qEkqz?ZcevmETv}eTJhRoxuApp}b3W&vW_RhKi50j8*oberl-j(#*xVi?r9H^$ zTy;2XXUhon%}i$%9eUP}sXa_@WYJlgqLN1sW{@Hac$AhJG_UEG>A2XQxFHUG{1sqV zhx?S@W~2#EWsahx_XDtfg8osVmHTFaiSrZ%F_$m ztCD#DV3_foVKh{%A{w?duQ3azA{YGl)dLCE*C{CvmxFp2SV;905b zjguK^Xp#sC`R0tM0>;-*e(|jh9z5`7Lc7P;AeFdzJm;X*<<@Z&FK%N2UR-)2oEiN6j^XfbpV<)4?pT(hrtI&$ zR`Kmh_5I1)U;jc}U9lKX;0eDtFXI;z2XYL-MsTbnf?& z6wKiF=LR=~-0C`8)k5m1`3OEth9GQJ|oQlFVAKT+)l9({flN0-&OUd&g*+dMj zVNCoZfuO}XE{#Hn#~|vQ;I!!&g)ulf00{7iQwYGFSibq6)V33Or>~)b5P9MX>T!ESzuR$t_BNS1OCEiasph(-yVy* zU022;h$+u}MLtwIeEYdA zSt+-JZr3;0Y@63q7NpiATS!pQQ~eA$TTnaD~7shS318vcp|nxb5-iz+;XeV z$=3bxJpCsB5u0xL2wqcF(B-iPEwfkCjeca2;jT2=5;`%7$|c`WQwo5}UP^ojtJ*8j zYfI2+4dVdGxcdgad!U8uvS!KY$srtc$&En9y5FmF+ zXP#@vWO1wNf0Va>RJgfv4G8Zx>RS9fCP1TeIqq496bjC{fZ{mu@*wERj#zhy?$7a8 zMSvp_u25LE`|+|MI3Iv)(7bTjY#!h)8C_=GhdCrdgTC_8xGp`flxf^PEYYg^sf}Yv{<#(M$Zl0*pDv^aYh6<^g$30XR z&E3JDwSCHc9?$;mU9jHSpB|!X3yQHX>;?^y^$(G~2``ruc-*}6_#v&%ev8_WR+ZC^ ziL9(_N>p7-uC|OkYs{jFZ*nBUoF+h{n1SFOvCe054!nu2R*re3-W=_1 zA|-k>fiFG*>I=ywC4%V@uYN~1fVPTVg|_o*L56l!6&3ewrTD6zN#bqW{V%AUfWH&j zHm@%zlDx2LAd3bC0Gg~p_tWFyXgbH4ulf1;8(=+7(BmH!qZ4xx`1J6d9~FP$koO5_ zvfAxY?|}A`tel)M0zakI?%IN!_JxT+d)MLw3A%~PYiMRMKwV+Dr9C*39|-k+1>P7v zSo<#Z`D4RNLK>m`-yKZykq@n`?jgqA#pww4bFq(88ayf{!4bRcG}u+jp&#x z6CgYzZjH1~MSc9*X2gc!2!o*~ZfP)nfaoqofcS|3Q?wOp7S#*w!w52>t z2p6=z4bDF7XYm5%W0VWcv0d)d%A-5k@Tq@!Pi!|g;13v=njG7r;IqjiJa2ioEqS)i@s&eS$twS?{J|X{JE}cKN5u=NnXbBos6lUf#zgqr!s~RKX+HprAy8Es2+H8VEe^M-M@juX9IUf$y-_;z*29jW~aY7 z*1KfnIwb*lnLSE*U+C{p+c4Zx2HR(BcnQ)zkc=03hxgVj_~>Faindf`ie`ADFqFYc zJFvB2rFz@b&;wh_D!H&J(WuT1zmVQLg|ZK}pE&E?r<2@)iq;IH7{ zB6PGX1p`w5PS!(u4eXOh-;R3nu;T;fh&$}meR#sMXO zj&kZk2&u|1dxU9U7UQUtUFJ%-`-O6E~lX8-9 zDVzTF^Tz7${9B}twSvsvn-fL+HIkm}v*Ep~AiTV0(#n@o_!sr9x(;J;t2ergwgNLYl!F;lXnG#1^v2GwW`246Ax#iY(Bi-S!`p*?IxB-KqWv265<&ZI)VgIz)Dd)O#`1luB;}KK?5JEkhu6 zQO@r{!ky=_`51^H^t*Evf=@7;g(a>5FOf)_GMpZSE0iM^!QAP^3&fA1rQ$1UnTkFf zXR%ruUCAv-?WLDdvEJrHf=_N^bUrcbCvuVj$M=UVA%TzW%K5IVc7{`a-A|f~`@e^! zTpxJo=qMu;!~6$fFmK&yyeIv}3o{i%YAaHH`0pT({4RL5(@a;w1s5_Z$!l$hgZ_<4 zM~?A%zt^s^o;hSY3lBTw27&gz7mx>uF` zZohWPhTjR&?qexu?P@i>oh1 zV)V&tB%B76 ztLNhpjEwhhg>2%<@D-lW4-yQI@miSn^*TD6VpLx7i8_F!Yc~4?_Vm0za<0tZa=n&#+p<%S zCz+MmkN2xK;trtzuk>OtyC1u)nS3wTcc+)jBrVJF`Pc9iRvi8hGKz7)9(Cu5xBJIE z9&(M9aNuGslj37va-I$ll>K2Q`%Ly`#=EJsKDv52?mYYU;YeHCv9afv-3KE*NHDJC zhiVV3OCPY(`_=3ZoGthQ@acDlRy%+4s%>Iy7}j(CZ0P-s-Fs_9%XnZMmFA?-n| zKd)<-aZ4}$8+jc$l2JIoN~fR@jw^I78X`veW zK(jTr+Ku9U^!h8KXzvmErt2-6o-?KW~0*3w}R$JqEUAQEQ1T32z0e}?}<*BCwI$~-2@ zb1S=RBKR?p=Q;NX-r2mgQz_CSrF zfl5zPa;_pl!+s9Km>nFXG^IqH@D7Lpw-0DZ%XQ*aJ90=FcW3x)S?#kWluErS@Ox+w-D2z6)wW&ARh8 zCKdzDT3*T;D&0JvXF*ewVamj9;num9k>J=@e-{1v%t!6utHqy zGGC;O9dseq+tgL(C!syzOe{2F{qfVx=9r~j!084l(|ekBp-6;@7`YajFFgupio41$ z04()P}c|d5Yy*Yj}SvCpNjg|H1~Xf{HbHNEuU= z=;I%J78R(i2+?b*%eB9RCq>BN`oSv1{oTxul^2>zgmIrS{$Pm-sfox`sWtSzwRPy- zQiP9;eC1b8LJHLb>IQ`TyIzFR;uJ>UP;8`ul~$zjbH|$rrz%%>B@LFnDLn}iDcBb& zOu{2Ib0(q{h}i26BfS+-5ha6pZbu)fD2DeThpPkLpte0&u{#&)s!_c8QZeD~Ir_>Y zyxVH0(P`iLe>&g7*i)h#$Y)@0b?5J`ag+xhnO7{wtCUy5 z|Duftj8fZ7Bxuftu_lx(XU|8l@*8GK#Yv>uP*W5DmUblt%FOI)Gs|k^&d#)PbhzUe zX0@ymVc-gOA^2=k?cS*C0-OvX??Au&_;~E`7bY!hhI}(mDYdzi4}U4ZJ=+{Tf$qq_ zB@c4#U#&DyzbayaiICG9>ZcB3Z&)yFP=1QslyswC>(vE8cj5zLz261{r+JWi^55rb zk4Drr{uC#@|4_tYZ1zRy6Nc<#WX>`Bs~uZZT)5L-;K=!@NZ>#t6NPr^odAASh5w2* z%H~3sFl5c1JttFXACL1?jF9+P2y&=4q98I5+Z2_~^r%03>PrGSm(_#0(>Ft`y_k(F zt|8UkpSnCjLZ|fVl}{pL4%>vaEq{XR3psxtO^S@Ei#~f68gKWMR7J(2V@xaUZ#Xk@ z#@s<8x|Fncq1V(4*#d+=PBZ3zsk-J-(Ms#{BWb^^=x17{Vuc!%ueR_*+uvLRw;HJ$ z3k~$N2rNE)yC%y(%q;}3BssvFd0&NC7-Q==0+st14+35OL#LY z{o{F2uM02AullBQabTvu;DKa(=df^RLdj{XW&jgg+WVc06TQO;=Wk%f^hhK5MZ7xV zS!rV|@slwYamZ9BtC&y~y+6CC5jYf!AjHT6>gtW0@2RV(vdVoqxoRql-iNRot`mk& zEBVbFLk70!q+$0lgHt&`q`fr(&ZFNXc*m!6@fzD}gmV*}`_Y?aj>^3$k=tqtxHZFN zojMw#43U?l$Sn5|kdGWE3cg;Me`cPZ2A*X~i1s#&T$iNSI+H}gxePB55fNo-BVWIu z;5E4##H6scQ3hVI(Mw;~LLRY}%`_WSiRUNuyIY@Pt-Epg9DCGY_R+V6w<$UQ5~x*2 z4CE+sAfua9@jJ}SdV3p_Wo`<$gGRt1^S1DNUi1V)M{lI0q|(>Z)&*w*+nf!AJF(tT zJl?|+vAlAtC3eDZb=~jo=L?#SG{Jqf6Q5%KhQ>XgLA2vrJ!(Jx8@wE~w_+q-)>HuA zN?0EN2S)_JNfl5My{1{@bY!PPx_^01m`MEV_D1(7Tw~(Q1JRmBqwl{HYOiv5Po=e` zbN_W$PM7WD*RIpoU*?ZWE@`&+ZCZu5uZr(#}sL_<4i+1cxx4IkDX*RUyB@_`@MabA9V^8bFGgk$ z*`MbVfc{abU4L+BsN(bIL$ju=MZ{tP1~s+X8`Rrc*j}_^B2XZ4~Mmc~T2{e}x4upm3pM(y&64!?v^NS!dKT0yw{R80QCP$-wCj)R4 z@k}VG+1B`_!P0p~9j{t~nZJPJ_(dJCW(M#IqaJwG6cQX9Y&q_V*i4{1{>ZLb_*6%y zqe*P{Ugd5<_N;K>&xxEmF5Kyh*(;JlG*;pE7hjeax?V7TNzF4sx3OYQC378f7JxtA zf&Rt`>MCkI*VZh}Hd~Y1 z^gcL@58l^!pY28XO!)NoC;4Ukg;fF1g2tu)d>((##KH7Ps^@DDet}vcMz%fV4)4nt zX76iUr?&ki2RT}7A3F>f+aA#1T$6*;$Cbao!Pp@cErZJevM@@nbqo$lWgrR#V9L7w z!c(~PO7T9EwAZ8=2_`Ah@pP$i&;gAr&L*&GJ9x5XkyaWx4$bm+a@D@&l7< zB?YONA2|0RLGBOIPLzOq@lihZoM5M8il=7I_KJjZI=t+GV*D=BpSdt|$iJPbk;4Kf zD?iq)K-r#{bY-hYQOJwD{5$ELoAR5AC&G`k||S!|AUF)TO6)i|8W91_+3V zRw@fG{)ff&Tt-G+35a!p#$$isg^H%)^{cFN-i-=5Hw1m-lg`r~K+IhDmXw#gu0X?G zmkC~J2}d}>y@=;Ooofrn>Q1gJw~t;L3;B-}btvd84tL+Gl+^y7&ttIIZQYG14VY$80(Ti zjG7qXlk$KZ7afps2;?vE$rL?|kzIoA+T~(Y?;O(O+xPZbZZ${5(YYN=ysoq9^>BhU zorHwiFnjsxFr7@?)LzwwyGNk|X`#NzxmP4G{A@b!u1LFaXs@;5@DGBg@x zKTSFB7uRerwtfA!Uo=R?(&5V3*V;Tvy7g9t|022*JJ2s*33GPv{^N~KY5Q+Daz!p4 zId6H)G^PHKl4I%hd{w5W)Lc?8aJ{0pQ~#!;%*oHdjDV`H?hf6(+&Yc0c~nEHNShTM z<1ED>S#Xn1l$&U~Wq6o$lX0)dgA22)%7a$E|J6DWJ>q8 z#G*Ev`2js7H|Z2tQ}q!wCVXT_T|OH>n{@t3^foo5YEPt@B;OdVfNm zHGRd%dWj1ui~%2iCu|S#lgoYC0RoQ$&asWZy>J7o+=(?KhTN7O6Gd0_>Jz5Fh zozxevdZ_7R#feYK^k157BZ128V0Vj${3xf6b*H6u7x^gkq$9Y$rY6EDzA5gIe@ty8@eMK;*G??F)_x>I>ETQpLtz!UqF%Xk^~&Of zmr-#((!E|KbS}{+A5f#l@B4$BQgQNKVs( z%2b_m4b*FXveW%K+8Qa+gTr3qKpmAaX;#e919ZVlIM$X2gNC+INSSi2i{G6I{F}4kV;1elv>tlfI0BZhkf$<15Ky&%xY6fPhW&M+VcDdEqrIRyn|%z z*ZzL&+R>fZjg|MRCf_*6&9$f5>1O=w$K@N^Sf;eMcU%0P{nL*j5T-HgJeW;_zKXGC z5JHzWQd;u5@=qdy0(o)zIkI{t@ zgLQT*FG%~TS)?Nz6mNBBO|im`7hK%-!-5=+cT&1-yBAvH=S0sn%Y*2};#u<7o81^W zuZ&=dzrl1sqYmQK&$kxEf(j_;?3wi#?=F12HSvjQqAeiN7}`)WJEnhKv@l%31)KIn zO@iW4OwPrZRsvgL@9#(7NaEls-)27Oqodz>@t-xNoF+_BirF1#(vDnup~B0_#tu^A z*sHd|Pp-SIWmNs6;j#~G%k*EZDJIe$iY$}ni|Hj~f~s-FF(ujvgK?4DN_wa+rIbeOoBrLu z%lJNIU3^N)&1O(uB$vK_#>Z;jB+lT#fU%TKz}~STee&=Cme#*#9<7mG3wS3h6~g5wVS$wO0z{3o_a0XU$$I8 zs)ZM^D9?C>bd(CM|L$LqXLM1UNAJyv3^{*YTKXg@Q`pTv*d=^sneC@e)yB}H`e zjycvo(#*?hcRu8Gk~}}&ixya-b`z)yT&S+b8s1wZVxDXFmL%~mFvU56+Z$~)&}mou z@iz?QGcUb&=A6P|P;h%krupP1;f>0v`J9O>ayI8*W7>vx?x0cku8T@`Zw-@1@2~)| zC`57+O zl}8iDdrmT2E@rO(%EgN2Rx?$owko2uQOr@yKI;}J+L4jhf%l*1;y0Yuv@8Xz!(x7Y z=4jljqnjXczw>IsgLQAgD!{sa@TuZ8+o92l2!Uv?G3(n>7sW5Ky2+O_VtuJSos&E6 zT{uwbA<=5BKd)3OYGILyw!&22VFD=2Q^_J@-X~Zv5&D9{B%40Vy06e* zm&sxYSlknEm8|AdQ0$p@=o}-i8X9hNMpKY$yWTr>Z8GNJmyX%c+C8RVmmYg0^yOap z_Vssu3equu9S0dFQpJ2gGu7qzG|6F8N&tS#xNDKZUd)AIeD9UW((AJG($O_T^#Y(# z-R3XghruTngR|BBsLvOT4%POHS>r?cPX!vM8veX8k&}d<^|kTXHE%unTiLu20(Si= z=(cFnGat4a5roAnTm*F~qy>c_oHtK3c{g)geg8jvaUwRd#fm*~k?vTSk?{s%?4tXL zb&v5F`#{0PnAxf?e7?#O$O^)SDx;sDbF96g`PKeF6m^Mapd`eAm4gT*dLhP5RNWSl zW3E~6IcB)CdyBwJpnQkG%<0CGfMQ&jOzn!MH0SbAb6XUhjlg=#(48zy!D{fVU9Gsj z8N!jgH_C3M?Mjw)d_OwqgH+6d`KKIT%e}>OMDCu3RqrITe1%{=^Z%7AWM%kGQMxMr zy!<>eKIMvUdMSTLBQKhFtH?Z|>n;vnHHll`{(hvXK2JuvKVN5A;-lEO{mGE18@<%# z6seH^Xk%+>P&M!#ME{Lq%h!JASrMTFqDzm*71Fxkga+D5C^P9{HS z5bG@WA4n_v?tcp^s)R1_t#$l+7U^YR&(CA;t)C*J>^1J`@Y7n)XVOlZmwb-7%R2Ru zLjS_B^R%4D`pZFCfZ}?K2o;9U`JaJAjro13v2}`hh^qVD_L)Bf-1+eX540urKE7-} zLU6$I%6@cpUAbS3(~gh*(n1u}SzOOyVU$Sm8%P})3KmUuunzBQ&Ar|){mBG(`CF+{{>9d*V)^{}^S!>J$_7v(qP4x6 zsz3!?&JluY@3&g^d_*!Sn>OKR@;Yt>ragqh>DQmIbBJ-eY1efxMvhs*5l?b#&T^Z} zSg9i87)QxK#&XeyEc*NRn^`4ul+SMpYCdOS11@}*rqKUhf?iuVP4*wo9np@r$5qFX zuFI0zPUrnav%+yXXalQso#XDS3w?nNTr-i|8Xd#rRf!J_J+t1~fNy2s0$-SsqA!EH zTJ5R||24uOO-B^Phx=kbFAwQ_9X7ss;M1P{p}XL)mGmrQSUF-es>v6+ZhseoPqfEc z(!N z^&*ovk_HBNJoYcbqD6S4__JnHf6rUJo?XA**2+0AS%3S4=QBUrU>Tste$vJ1^hw=| zb~>T+io3X2(T*e7Zkr)-@R{0cv94!-UJTUU^I^xEnDp_=80RMo-F!Sfn7EWIIq(3a zYd>}N>mlCPbxB>Z%DVo3HiUD1(_?Oq zdX(W~&E@gr*$ukOAD*i1US&kk;@PiWgp0|U&9VodyCw9HkYnaLSGkgiD?(5fUkiW`)#HM7DH67S8KF{aDup@=aO%+_6`&4tso(-a-YO;^W z3P{Pu=(<}N_`<13@Q&(Qq!u_p`NDqG*5z<`d@due-Ip__r|KNm7x4*|IX0p9g4PoQ z`qs`>JI!9|aUvg?M;4!H~-FDeRSY12{wh z2zWkRs%~M57eTX#JUcgdAY}e~SQDKr?_jSHf=;}o($xkpL zDEQ8w9IlU>yMfZ*GaVhe`!`eFg^#M$APzH^Wf;CU=ad*)Kwd7BKO&WYUC_{MsxIRH z>+gFmg38;4E;6+jHHKkYjo^GFvJC(MUtdPRKWamIx}$SSW+jw*dR_2{eRqh}V0FmD z`=Z|4b1_i;*0E}(HIVwec)d=sR|sMi^syr+aMp}0QSNTZ`^h>VxEI}#2lDhOzQ z|FA_>4Dy>vE++>a#L;``2b?c~cVJo1JyeQcAMvC$bHJ|UIY(Rj_YlqVJPEZLXp*7` z_ztva%i8nNj&l(pgU+wZZTbP8yhrOqkQE+rdT1d}#7K6H)MAh@Dy%x*YM%t-(O^!z zMdPUx_0v{Q1ZS^;7hNyeUWKk(j^y45bR>4-0+0ICzcx#4J^J~^?F8qq>1%@ndbo?7 zk|fC2m!CBSZWH@ZUr|)T(JZVEQo#Fa@Os4ROW9eT)BI?lFVJzl4UMENXM0C}Ig-nw zoX%9N^V+v>-#pI_{6br*)Cv8C@513#CuH)Tm5yqjCk_k<;0td3txj5WpmCmA+6Axl zLf2w)9C3BNaW}!cqR*wAgy-LRD6^2M@TBTEpB_$jxPS1OZw%k6IU09Y^Q@dSmN9QS z^?wX=`nn}_C)2xzR2Xv@@-1kh;V#zT(|r+om&gZdKM@FN+Ve85^p8Yh+n0}{y1fYG ze6H|hdlG$)|9{x}3aF^I_iY*#1(6gfWdNl^LK=~hP#UBpL}}>`Nd*NQK$=lN=`QJ# zF6r*>?)vr_)cgCd^{q9y?p5ZT9q)egd7s_QA;CcSN%QHO;TMlz(I~4p2yC>xm{R~* z8-}dqzmXMknt(x!c)l&F?q~tgDRi<*U`H;!!R9WYtX9|X2~|dys$=j>b?%X<2(KeY z&2p7dytl`y5cd{~6 zSZ8;-FOwl*V#JFKQlREL?IaJ3B7Gx`rwzC#TWL zI;SLntMtP#p7pd>CNbfv0-z?VImYZ7)&1kQ!}gwn^}7$z4#fbPx4jbpcdu{wbjRVW z(qfDc7f=}iyYyKKc<`=X;K(PncPgb4QUNqLh;jvv7ZXoG6TsAu7>jABZ{2@D5R}%O z&W{#K4#r(dKv@Lj)BGWtqP%$Bmg1QpIrL3ntbd6kg7a;S+{lbs6A2vqne7`#u)Ssmaj^Y3>*5@if{C2vmRy7SVEk+syO+k(FMI#mlfNDzP z;!cul>0<4}joW1(K{X9H6rA=!wbIhO z(pk@#dD>2ik`eKAaegBnR12r+EOU3N&M_W&DAr8Y-Bp$SeMV_jam(P5%mdEpB3zwU^ES0RO06#l8+`80e5#%{T@$d!1iJz3nRi zyJ%t%Y^}@Z>f04&X4kolGL%R`et8+0Aj{Gj(t~&6ma~Tv@T8`{`0p8z|0pSyuzax1 z&v1BouCFNrcw>^;wYm^cn+yh6c$6Z`i4KS?&Jz_K<%J-X+q0~n)7LbO}wd&$L zuC#x1st(lX+|!3*EGtV^^7kwAL8F3dJ`kS%Y~6`<2NbAp0nl4jB8$433F)1@R?{}8 zyPe6K$9ITMH!f=Zg=6bt`YK7jjEksrrIC+6f%h^3OdUY$23;-&(gm=;da(}5hDIxY zGB%hkK>yBhB93I!CpsT3#E$jHx~!Lg0fpQZBjqrZQnjYA>s4?)D4TfI9?ex2^r{LR zkK4R&sR41@+p-D33`hf&6GQ3b&?W(y7OEZlDOu2OCOA~-ET6+fh7>Jx0w?te78WSqnqw3H(;^mo2}zZ$?Wah?GsnEo2@ z7J#uN3IjDwcKAt_RtbD>Wgy>r?x|ubA)qKln*>aFNqKp2CHY6b-grWh5V0S`zXtda zqqE)COd;0NK^6N>gfIg107Zb3F{0vNJjQCKVe1{9t0xXX_#nn<2JlS@5di1s-%y-oNq6?hw9M?y^8*zzuR4AUP3%qx4cO;G#m!tW+6D|KJ5;V0mSIfS%|6!6s=-Mq_Q1_8+B-^`-!{Cdr zsi_~X640^f)nX8{Xk8HzpafcI{Vrv&O|OEa72ubA3o6RnnU-#*16+WBvjwzKNYRCs z89{oMl;56-KF;mz5OvGOMGxUatvH(!q95PBowxO8KzOsH zqW??#-u=iI(CadLQnGz{LY+WJ`~b(Ibcqi9`~WfvXx&ctvOUZXb^s$}Je%2>aN9s{ z?^{66YDkmNo2+H47vQq-X=_EdZs1(d;ovHE6?VTsb>*B507u=BnBQ)5ly+13gXoQ? zW3FJHkZit;#^yc%gng(fT3fVW#tO&hmQekej031ID8G$J|Z;cjTXZpr(WJl2u5na1*!iwX7I)(t{ojvGbU&1V(=-k1%+ zrI!m?N?<$g8(v$Wdj@`T2Mcv-oNDfa90>$a&3T2{_6Yq&(fs-NU(@!$8su}5bXI%_ zUhXc2n74l)Eq?1dz8-U((aC6M$cL6I$3jTJnb;?_eC(e&6t4sM!(LNNRIS4jSu3}J z(PkgL^Ysem3KC|?GkpE;o5$L}5S3_61}Mm7+`Y(mSm;vde|^z7anNR%7m{=B7BS`% zViLmV3cmw>nwl4yFuuqvVkr!$GSSwINV8i?G)MHCWC|6SXr~kw*`;68*B%NNS60Tr zzuI&!B*&10^I#(wKkO;mJD9_lgO%7N*{q}aQemY|_D3bYFzKg`q8D< zR3ryB1tux=)QmGEEN2;jltOmARZOri05i0_9+GkW(S65Oov6czJqA z9gX7VA!`(YW6c_fxVI4%_p*EFIX7|M(i?!d?o~8YWP3$e&UfpJ+(*94+-X}Q z7B~&Cu9K6BzNhXex1)(Hw&1M`5)LWPYn+;?B2Z>Yl&Q%ZjdsvQqsHC6-xAKz)A0`d z0_|N)r4+oNefp?GQb+m^96*tCL3f8%`jgJR_*dEERH$qgTEFz(Y#(~Be?Nft5cvGIC zoXO~4t);+wy*^Ci{ICGLk3!O}+FsJp$*C z>#Fz3Jl0}%Ia+u)zW>lu#E*Sy&dsb*l8sRbvyRLztiLam=0Xa#HVh7X!glF`>R^8WC- zc+<4LqVYi&WFVI0JOfFxq1jJ#w{1i9LWXI!LLv;q{hz+REBmxpsJ9yMro3Ge4#o&exf{GDzTyp+wo@>S&u60WNmVg_%4K= zugFaF<*_^V8=jQ;7v?LUD*TbkD~$&iXfC-HJ^wkZ#hJ!N-V%>q<0A2DY}4Q*+iKKb z6BoLX&ZxP)$0=gcY2Ss$NV+O|IIwPzm$vUM_diYZb#!00;yHe zMr*<1|0=M=^Tw|0P2FsWjVI5YXiK3nFQfKE<$-rJNR`{r#Nim-3>qVFj>W2A4djc1 zNt)i#jf)o>C~>;ib&nQ%=6CO1Pi$9IYv~z_RB>le@h`{Kt`ZgbLb3BY*D|K;{j)~| zs#R2WPk@$u1Gey_CZ;OztZJoDW8{y>k%gfHlNZWqMmoFT&!pKG9V|QsvgURSW;~?0 z=OijLbh!n2RH7(b!Bp>(PwJBL_0}X6B*TuAbVOYxUhNV^_XZVlb`f|*FQRJ(iN@^-i$)t^eit%BQhB|%b5H~U8^tdR6hk)19l z)&Ak_Fv?1EJLqtCtJ*-O0FEmNYXuc0QXV^$nI9G@be@SetW+1<%UXi0@$+9f^H(2z zy&GzQ2#|fS^vxlJ34z6#eOG-OO&jM&ci~Hh^6lydJE!Vu?vSfHFT2SXx6Bvcs@vAk zn&y=TwuSY}48wyEN!D$W-ucPqgVg7IfgU64}F1{+H<+6l)gb-C{#C7EYzk^eEMEZM~=h!As{m`>?)QS z+tZ82u05xXw)<0urJ_gv^|HjsWSKFU7w!B zo!ksuuqf*^%F8%h6!c{7H`U?y_Znn)L92GlupeLZh%RpDoof?N1*->TSm&qURmayl z#i49P(hDm{n%FDtHeqzEyk4n2`X9+K@q|h35}XM!e9W=gJjSk|_)+F8jV)VN*zKtH z6`QQ#vCv29NcDB!W;*ILw`GidygE}=D^%qdS!Du@f_R5b7o?qx)42)>UeZbr8*QmK zQLVS!46d8Fz`bz3_nuF2=cbIvija?XRr6?}B)o+fU)lXypzeFVC@`eSK+dkQN~DMt zHKCTmQpInxQP1YJT4#f#0tV5_cH)iRHlJS_(ZkFK^{4&`H~v=g6qzBDTF5(~gHz#B zmyqY_f`Gs&?H%wI)DjY$3)H2;F2BEJ%2Z;3NM(5MG$C=V;6e3!{LNqKCy%dqAPDH= zJ!SdihcqQob$h?gA8$YMx9SbyxlLB@Z|tL*T!v4)N3G6JMJ$9GS4CupG%Ao4Eee2? zQlM?q-M8}x9HR~%vGh74BswFT^5lcU2ixCSJtXD!(4DpmYiubf-=^>spra10C*MTa zm|EO%0Lt<5K}mGA(1h!c`_^u6tClwnx4_2sDJ2B(=|ekm-a1=ESAN6lRri?AepSAs zz!P-l+$4rqW7R0J<3twP=7;J$l>fX0%orXWwaq2X&`s2xaqe!6G(76p+o~p ztD)iWLHsUGS^w3r- zU3#TgG!6)^CZE1n{qUWzG2%&_1aK~%9f;d*6nqp#_qWK^i78|*Z1k%+{%2&~A*D?* zaUQsCNzPxSL=Zy14U$8O5T|i68%+B1qm<+htd&c#`Scl_Avl?O%yi-D%of9oVm~!qUmVH$ zt1(+!lX?q@Qm=QKgChuBxtW28|2cUot>C~&<1bF&QMwW8vpY_*TAlM%-nKNo)A{<9 z^J^5ZIf8q*{}jX?WU&Z8(**kf@b|%SJU#A0U({K`4dq}}H9K@_b@m6-FnCf!f~y=H zxhDf!kP(62r96QA>Ngw~Pn*tm(12O>^Wq8JGu(tAWmcdS&~IuAu_M1reQD5DiZ|+h zb$aZZXQ?V(W|dQgAm#qxu_#K_k&55lvI@ypDwOoGk(1td3Gylj;343tHOJ3hwl_lf zLoPJ8Qr798dP=t+vSsA{dq@_f;vVRKz|eB&H`raOeE+HyEr<`?F!6~`1tda}?)5x6 zsORVujev=QZNfEYxc?xv|;A;4E5GO@9;@aV?trE_UJqG11?7siEW|tjc z!!M9ueR9124ye@A(~yCQ<;D$4e!rY3@`KVX+}+M`pWV_obyD!?a%G~A?nyXmW0iOW z^w@p<+;4L(SG~v&DG^ZsLwYWpeAO$2US}*qP1lst;ahfR5pCN9ex6E>{)=8Km~^|y ze|p3;qwk^m)%Iy%D|UJ{#z%k7%HS4 zhQrQ^=eJ3mq~XzVXUA1|)jvt1JL9Z}a8DL=kWp36@?V+NMV=uE6NEbz8k>Q{M_QSC zxJr_>`*%Q4*JFkYDgs=_G5mKbN_V~Hi&voVMq(Ao zcdO_QhA3J;>$}38M1YJinc{ZfcD7siKJa6l(51J24=MB}xX3tMx^EZ%m2wS)x-Ep%i9PW?N4=()~j~s$roF-Vh-uG+c zI|cy(kH0Xz)5uSdSCX{nMe%%D|LeUsGByOiTJQk5{QAx1*L6=`toQFM#0T=qY7gBl zZa2*_p<`FX_x~$uOE}0CnZ*@m!l~Zrlq65eDp*fQ@3Yy7i8`DdEDYYR_hzKLOzK73DRI--d5Cy!?# z$)cME_|1kpddsoeO-3>28jE_3-pzhiFKE9g6k5~Sj?*s#2{Gm;B1*c?Af=#~w`S+^ zP%Ai1T~gK0d~xj6Z(G3k9pIsm&&^jxdl?s5vuNHg<+lmp}G)5ogW z52nw2zbiBjxi{}KJ=;U2E}CRT%9V)|$86{|8R~4qz`fy&Oje5nNUfyah0bv5ho)BV zDQtffS!23|udG?4IG%%z2GlW^P%^TzZbec7$DNT1%PgcSDx5=3Yj(3PAElhl{FzaQ z+40EF?386W2F)kWj~;{xl7P}G&@|R}ifkuF?Kfi5A&*|s9MadRS05dxFkvgucIy3amRvNp{wQx&KlwrPf0Mo+3eBkNjp8$yt;bR)zRI{O#rR zl6*>swU|Z(;&w-Ai(xOmsd*juI+H7!B0~I*#2-QJO+dcz!%~^j?Sc3s(v8m4=>_4= zxPzaLR@La8xC_U^2w4a~YtO(D*IYD?o)`X$Scn)ocIbR5;vf|oU78HZ&vm}TMHcQC43m=)6mP#Y>K|c--04%@sphPF;r*)Z;bW z58HE5w4798hw^D~Rb+2~wXZ6p^8?}++f<`-BjasUV4T>I6 zc@EI1pBqgexXsDp`0S=ZAsxC_=@hgc&ZMPhO+!~m5xYzP?xV2qaC6s>WL#-kGcqQ0 zLBel1#Oz&yTUtDop82-4q!9Ey)_Y(pbjuSYB%Y8%>)I~LfSD*!)AX6mN`DXe-s3!w zqe_~GxU{e*!9_kJtDv**{D9}ER4rQvs$zgTVJxVk>iRj^MB{s^%JKcvR`on`-iH;r8==OTL9p!}C%xNb|yz)zt&V5t~80Yz)M7;PqV(Gs%BR1dmV5;FnUf*5x;}f0r3R{(rc)BAI z@5(w}zbRm^x>vTd^lRbbL(q|Bs9ZKGTtO0yr<=Pe3jDA`8gR?#9V;dYrq0JMYSdxQ>pF`fvwm z3(3XBH>=%@{U}HchGVrO?YAN(!3D!y?<;WF?f#B|7uu)^y1@gg2!V- zenJqCktE`K!WV&SW5vqAs5EpZ3S~ofpNk&%_jeOpaQRvg1%JOr)lmLxPW@k3peqrr zdgOS_m4d;|lmvnGi@m8zadYrq*R=|VroIW6j~C@7{1ndn^u)pFA?=2wCuX#asu7!= z9zPzPx!_};yU&@__QxU}3<=g9e}THmxHvm?b>iSR0}ljhT%S% zy$M+JB0=B-00Hb1;IcF0fh=u9go{ffTRo)F zpzHH$*-l#wKu0#pDY#f{V)bNap>tvo`U@XDsbES$6w-%pZW7ST8-ly!GBk^WKw&Zl z+?vp`(@xv>A;`S-c2Ofa%6cXLG+Rt=iZx<1&| zfcJH$5uIty_(jWCRnjLDt0X8O0f#=lkC7JBm#p_SW!dU2MIBr`VRF0Z3*wL^C;Lk` z`tlda-b4QSixhRH+1Pwe6mb33O+S3>W7eU#D(qYV;F(V5^FWU6<#SC?k-nE#oR#yJ zQ`bl#3S>N$pL!bf`wZZ;ch)}vgzx3=rqUwaIh_7)=)g>r3>=J(T=8IDJQG9FrwYDH zsVsq1)X1@pa@AIa$-tBRY|oEM7ODh^4f>*M-_)HJ%j|(2>MB!YfsThCk&GEC}A4ak&mSUaaenJ*ErYnvCuY zX)IQBP=6$P9(x$p|H1b^Kb6bi($89qb7s)8*Jz@b;eR`ZsFVwSV5M)>WHjx1e7=QZ z8y%KjGrw}jr1?p7cilJ3D!ywGW|BoC#UEH5Jz0)=mQzyytbnvGz)U-_f@61IZJ#QpcfI);W^5y=(t-siONUPM(tYu(m)W8 z_opC}mN3Sl@tD?MN}FDN$X$>|(Yn~V{^5J4VpNO4!d)7vSz0Nz??-RC9X&sBz0BXU zRf%>Y(4GCZfTzD5hPGZ#z*3rGk>|U%KbM~tU(gyOx%u7Zw|D17^23W8d3rxASpM?Y znB+n`3`2SPbn?*q2MRcxQ!pHmWo=zKs08^|Zr#p4okSH;+A62rmDAnix2IdbOOz;l zaL|l0gyIZy{M;&C@S9I(7asK!xcp%KpdOIcxAAzYn(t@iU%B{>%r(KdSaqrRKIw_& zXK0{<)>*xua~nf^sHr)m*Z9Py{3Jo+(so(8xN`3mZsf7sR@wY zv;T{DS8SbxHmMJ^*ZT|ZdxF?}{dfU?&pvK@7X%)CmSQSS725w!)hTlA_wGgcT$~7B z@d{a>-)Qf3aOrEcQ`BQ$;WWQ;Meiugxy0}9Twg(F0KVKFa(6RvCm-e1q|J&+OI>(C zmqn{rKW$m=u8xl3+FuW%D?mH zOk?7smA318SJZTGOz=IZS?2P!>#n+|{giYTq%uI^#jacF@-^_@ZR9fExCgR=>%xYI zJ&3PgQO?gcNEgQJSvK6XO2;blVOK`hF-6SkXV?BA9898+ufwwI*8qBdclCCjqc}fH z$&3rgwB?Ms)$O04-pttipV>h9Y&hBIxJ%uyfppTGR@eRv*2%${Tjgi_`+L_%K-73) z_LKq^_GeWKpCFeCHeBQz)9L0@$?sOXJqHRgxI6QfE>)|3{J+&IrA10D9{(j=ctHro zpAR@PuQ49Y9pUATSZEM4dnE>S7%a8G&CU98wjHROe%zO5${P9lXX;7BHIOs~D95O- zIL@a&EL%m}S-{q^U$~u-c0bK6k=hei4CPJSVN#INzqgCGkiv$EqT<$ebw_IewlP9JZh z>!}CQLG!&F*a&i1CJ&GIe08-Qh50vrhSAEPNd);A1p6LQnZNShKe=`5IjOF+PR<9Ov8XP z5f7P$-bL6B$LVUahEa!4w%d*VtQ&`Q!ojnrx^eBRL!zH1?i5YnA%~BgSehX6OD87R}(d5WcHeW&GJ;By6YV-Ui_N`oC zG6IjHQx4BHFfHvy;BBeI1zg7J6t)W*Wjz_N!>u(rO=U!)(y;I!;b??uQ z>&7pmi@5G{r*S(5(byWYzph+glX*-p)kqU36zovHYB;WB&2SX1_ zhaZzz2;WZY&qgZ}AoUWL@yW)y5SZRgaq+vILO6|xkeAx8gf_B{u%gzJMI!ywo>}w% zZL97kMye;d@yW^^$8B9>pu>e(>wm6hZ7Akug|tm}<@7X%WZq-n;s+Msj-B$~SJ6NL zB#a9Oo062ng1o@|4u{LQyp}VNb@eFEZ+N1`GgtG%R~0z?iat0gNd8-YMdZx#b0^$4 zPxFn33trU4Vrm~9TU}KRU#Q8cg0Hzg+@fxe&!l>HZQ}_LDw8+OUt>W5PC4AtW{h%V z{C`|rp!xFi26XOLl`IND4=Ui%CwF@omMsUTpUx$D{E zB&-ydq`Zg-iZd;O%{LSf15gq(`ZjWBhn6%-!$w$LJ?+;X)5&^fdrw^XBQr z4#F2+P6;Oj0bprwLRhklMu9t<-iYXkR&is|K}zQev?}c%kfP7Dw_fU#jF9aqw47B)l`aWg@m-dhiS`>nE^Bcxpa>K{Mj) z0M9L4o!EDn6|5i-7>_DXcF=!QHZoM)9)}T#2;?ied;%=>9nvl_KMn5wuH__-1<;Qz z2IAQhp*IX*`r#PiGB3|=d9~2O3{2mIt4rulH|IEN{YphH4dd-FC305pv~A}8bWItR zM;YnjkgJ#m!Ym+zfi^?mHS8xSzOeWrMxAdG2%oSksh)?Vi6z&tbEfjyl0pCXDzy@0 z=&9qF)+O=hePw%tgQ6O3;!OLJz-r@PTtaD-5HaSDPEBaAwU#ukw%<&Wj^Mc z=0Hf^+#2u7JQcg+1O{j}oOB~No$TK^s>xj7biBCbr*)2D>FP=?+Q(qud~(M@z#8RZ zqtQwt*w47<<=JtHFhr}?Yx_OzeD#Rc`Ajj4(5?J@Kj+sm~BbdP@h!pt?8fa+$4mZO8`CVk4x% z$TI&+wU^c(cWAdR^zbiR&K*t?r-86acS1i_S|A0c&L{mRgsk~5kZ-c@O05feA58tk1( z87|M>7Ej5R6Nk?h>x75!RuswHv6v?ZiMxB))|_PCrrwv|EN{u}cdm3fci2%)3^x zX#-`gC;=2O?fL*XEcG_hQ&na}UCEJ?+-O+sc zQw8?c>8OF}gio4&w2J}%gFj8}1$*cBeDpXNPYEGEVsjNxmCc{s}r2 zDWv^<4fiWQJ5Ja%%U60HZVxOe?B0@fGoFdY$kDvI%8epVw&}FBHriuB8-g3kR(xl- zDy3!zay+_Ktr$Uls`n!>(!KXoR39^7&dq_;Yp*eki+^pO?yPXD&Fv*DZhIm@yEqQe z>7y9tYpAlc#bwJ|vHp<9x#D?O?D2H^>)#ByghpCuIE^<~-PCLmNcOt49`zzPFtKUa zxez_5m<-)i6V10I45Rkp-3s1tnD_SR&rPJ}Sxwv!<{8f!5i&u0I-%{a*M9 z=x>nJvLuTt6u%M50D_*BsaQ!TT|W$~pL^b2G!H7;-20S;(?gJt8xJb+NyMp17*Azv zI(3WQoW1;!B@mo5Hu=U&+QiEFzz?9BD$aoiOC5USYYqGIN$H%>>{@F%`_io&n zU!M8Rg?@13_U(5<{N~#TW$x$c9iD5aXJ2`GxFFBAep7$vJorft%P<}kmM$?~Vk)%$ z2O!WeZV*EVq2S^_K|xv=Nd0z4B-P$hjJnkn$oC=X%WSmi^S053XPLiVe4e<+%6h<>3^G*XZtIpPyZqa;WFX&gl&i8k?!=WlmtB*5ad&IU zgLIgs0pMgpDhQ>x4;LUqRNw?E&55DMUbv^Zd`paUpX5r>Oa~rxM(lp1P>U;wE;I5km}h~rkHl^&8cY&H+2K#s z;)!{&c5RMN1Nzw=EUHTu9#6PC32<1Dn)c5PjQPG;yI!U(di?uA+Y7gAdZagXH*dBb zYK&?B>9~PM-`{|Oc@vCjE8dxuh(|{uAKGwP7mBN7a^C7y3qB+7Kp=#C5@Kd_U&KlB z+0jBp__+L`Hlp@prB7Lp%aAKP^3|eL`)|r zXaLrVi!z?}4t|#J452Uk(mYkt4^Q!PjI>cLD+dDoDaR{y7l_qxVPhA=qa;eKF!kLh z6t0&55HP%G$X(pCmVNH}3wq-I8u~xEfTSOd%%ebwk>#p0B^A^?wO>1{S6xfp+g!uX-Z^X) zJKU_h2cQ%3f_D5Yw=i-xs9uiU^AhjOdEH#srt83#i+6Fw>8iepap~-{=DDMCEVGP= zqh~u_5-T|};++dyGb5F$297%ge{6Yp&tPF+KHHfF z^#P6nV!Crc&ckS?*eu2WuA$H(PT2*F=i{F^F^R4P@;4O;>`q0M4o4ViK+Dmj?uC~@ z@OX!xQ+<;ES>Q7&{&%P9m>?fbOC0>U-B3fw6892o_^MB`$2fuq@vE)%Br~TrS@4>n!*N)!incdANf3}=V2f7jiRH5t>S=yc}WAyx}8MIO` zLr`vR9e-0^J7D{@JrznXUG7TS{PmvK-%@gc8_;h+w_IHr#P8t8bKkjhILA6OdKmY{ z+GkAOhnv5ybplqjeFLj7s&%@h;zLEK?~_<{zPb)y)=*rWyD@0+E{s1>QxX{xDWpi? zu=G7dwl+PxK60z3qYHD1moO+&M13^I>yW{ju;R&d+#S9CPHBMu6AaYRA5iVQ<*`80 z^$Oa;-g1>o+-pDNTAl|&E=dwymJA8+O2+64HbVIRFdJ<}D&OI&`Rp??Bs#v+MsHxJ zc~>BUHrxfUmv5+T4z<0pfgFAlca8^<9M^OxuC~%ylmLBIa2u)syalxdcH7100RaJT zMvB&q1~5c7!y7@e++?*(zy6v$|JuVB#TIfSMdn8}cQHYeJTXa3+%A@#wiyt$Z*BW2cYegICqTV6G<&Vjz+>9%o?a}#$w^^jPG@r1y~ zIMSBekn=_abT}1TpQ~S6!xk$O)l{1pjaw?L2&`an1~qVry8l~0bpNz+4zle^s;Wg> zR;OEy13%9TdgKj29TBiNegUkb0pRAAD9|!h3_1_s(I4Uk^=2Pvpk&=Squ3u24t|HO zS9P|-yWrv8lsa$`3A*y%^U{Lxy{Rqd&e6YC?jQ*vRlvFC*>Y`SY!)n1{=cK4#Rp8R zkA8xigi(KPRGye<4HTJc@;R)Rs|ZdwEl|X}?Q8syjj9EGyy$?fXtajCk-ToLctSpc zMZ1VGAC`Jla=d&!yXt3HpJ{*;ak$7$5mLom6N>Z!VyhWBEBRylEb?$=^~XlRG1BEu zsBPtBe3S&*q|gd6F!`S1#*9Z*mH@DP;TkwKWH*4KB>Rm?qE(H{zgq2nvet+=-=(i* z%dlVbxk>YCV4n5PKPPCrRJHR|8P=-Br}Y?DCkZu|v~&H}!gYM0Gh{`e7@V z!}Cbp<_rz?cqh8$u#mMaw?)UBNdqB{JCDB}BmBV#;L6$D4zHcf*Y&d@?>My!m>8~* zI~G6RNm99mQ0>#TtpaVk?RNKcZ;ASL+WYiZ2zJgh(P{&0RPX8Ygx_fyQ3n`LT7G;9b?s(FQ zg#zf>X$|1EAA$~noi?(8-Q_;hm=nC)96q4E?{iDb({0d=zU{uy5qGrP^Nc6;dyg@w zrzy-lT2|AxBSMxqvq9N;?WQ*Ti9a_{td+zU(1K>O)4usjI8h#Bw<>n^lpUtlX(Y0O z{o$F$m90^aiQAoqOC!q^#45N!yh%ur^js5^6b!H#S?k&bogLf&R;T<4R0+Gm$~&(J zyB*sO7n&9ifgMN1Ca(tl%Ya#y%o}^b4;%2M(#N!O7&e8NoXjsQsEsJWd-Jrdt^B$Y zX9Nz&L7Mia9r=6u=If;~ll9*BrNe3(gI%|XpT9r>&gs3fL*B)$_C;$*eJHvGE_hf8 zIm;E6s+;10QJ8>0Hw_&yC%*(8{!HpQp0adxyGuQ&i(_Rx_4V}vN3)?!8hJiv2NMV{ zFSLdriq>|Xi8gREc4=-M}!2-B5YC6`YV+!o*kF>M^sLK&* zkYv#=eX^$jx{Mq)&9MUM#RC8QKYZ= zpu<~Kd<79qNySm~F6#&F8QDf}ihe48iO$Rl*BD}L{awpM)Gpg)X4C8|{v1C{g)l^J z|5fCi8R$ae*ageR4ttk#Rx5KPs1xHS{w3SFo^2Y$xp$qX7k-o0Lj zrO_BfQ390Qiv)3LI0``W$O}_Yx-di0uHm-qcgWwvEA2;T_f`wu>?2Bj~8x2xC!QrnSMc9aJ zRY^TzxS~pq^??^fltaAn@N{%5z~f;P|1Xj}_C6lVF({%Mwu&i+rKHF{&%6C}WJ9Ym zIRj|HeH~;3_#z6V#oBT;;?H!$%BY0nyX(-WOZbyRpJKJe^P_mSBwITf4D}bHJ7)|R z-oQq^esX*1tIuF8RabF)Alp&>al}mZ@1nwIbQ2TQ!UfFANoCbvI>n}{wMUY{Y9+;e zk*yg!IC$CMRHtP2U~Yel`kG@2+HuW^D!o2%l} zNq&RM>B=xg1x^g)0_^IM54t?6D9g}0%-N3XI0)lPs(5U|2^xb`(YCtH7ur+DdImz0 z){s7b?==b!t)|Nh9}Qj8@q##-|*D& zaCE`me1g%`FFz0XgbP|S32engLfUb&;Z{7T&(EX$j&{qkjii<^hV#hdg+4U>9`U?+ z#ojy-><2tLGlflBK@Z;D9oGpBN>GRHYELDuCUH&3#^Zy~=#ChrvSiRi%nv|7KzT3{ zV!Rz1dWQB~Xusl{O&(u+l2w&y2+xfaJ>>M-rVVq-r9@9?RqEPZ*;JH z^Qhb{v>>5X^MsAjXRC#+k8&J&af)1-CNd!@hKK2zmx_trwk54RD}Pkza!dvx$RcH`tAGl2TeDY4lp#P4RJ4My7KgVI4i}1Yt`O>`&Z1C z&EC)2_cZ2dU`4dGQ#^|+Y57*wig=N9e1q+?FrAFJETGsvNO8+E+vna{>$86lDYqYG&AS}@yXzT1af0L1HP3vN zfq@{*%&&W&KVl>8#lWDOsT6!)9y!%;G zI~PYiah;Jp9Qgbeuw+$pm7P3EImSmS&;z%2PHCFArmkSadvxb&t5c+XZkL(t!O&PTbjQPkXSk~s zvE$nPY_94@@(X2Y{ap4FWbmYlP{=Wc6{c`@Tv;lee~l6rT=C_Jo|mB=TzbZ0I!X<9 zKB%#CzHk67h!-vETt3X8CE=Grlz_vSHK^rA(Ok$DTsX0vF=7zm@Mf%`eNmx8U263V zI`c1U zey}Ou^xhNG3%VF-Np+4hQrzXTkAmwGP9Ja$B}SW9^1H7y#Y^eU={wFFCb(S$tN#wS z9i*F}_*3s1hWcZ`8|_6=7UFRvslun>HoC970$9TAmqc$ik5NBpGaAaVrrpRgZERq! z&(H$5JW6=#m0+Hi?3u7nI-(e<86ECjc*EgiPTV8KLWNX4+^)XcG(5Mo4>c14H>Te2 z)0S&H3DmUE-=)N+mioR(svE*TE-H zH!oigZ4hiTp6fX}nqYZ(e(I@^IC)GZ$(tZ20=qSze}=d0`Y@H?NABr)&tjxwC|rK* z!xLmbT>uv&N>L2-?re>+5bmxUIj8vQ=U2Aguw#eszIHP~`AmBtCUCGK3Jd=sqi?kS zliQNXG|m3?KuU-Go2fu%XnaTcPBLBrEf};h-wMt;<}#gbNVkw6?d~u=xqY?%kBYEq zMqQcBCYrZmI)f&bya>jsewL9vy;!(Wi7NIBk<(Broniq56;)_i_$hBD7Sn~-+^_DS3$a*9- zXOtWT_5M&rpjSK_|JHgRxt(c-*VZemusMl$XKd84Vr{K=cKXZxU~`v;c8!zI-p8NH z&uV5efbsE<&XM4yoqccY6$brkdXzUju=Y8%+4LUQt0_&kG@P?95@_6?n$!noxNb89 zB&NTaNEiM*yz#ZuDBn!|m|MhcT)kg;ts_IB#FZG>(qB3ygr%Kc>RlG4bdYQnnEoGI zs<}f34`T&d)EN6o>RmF}-NM_~TDQl7V8(X<7POL7g7Wk9vdqLw89UThXIS_jB$|x! znBprU)kt<1N;kwG&B!kH&`(e-NZ-6^F97!qPeyqzR61p`7iCvAC|OlJb9SboRLGy- zknV8iNi#eqI`yUaWq-zq%s(su-pj#G`$iQg7nG#^<3D?PIk3;JJk-)I$3wyRlkV&Tp+1!@WIr?^2!SxdSBT-uLA^>WGt$EJ%(L`2G-Kxc< z*&YjkEr|s@d7O2;Y5==+_u>$H)Wf5aUop-u6}@@)oXJNc(iz_{^vD8vK*F%?CO)~h zXZmx_egE2Q_S#x{m=XwJ0Xkgo0a4WY%>$vw@B-Gw9=jU@I-#iG)?2;yXaSxi=csSR zk45PR*#eu&HFvY9B*|TijOA2G% zgSw@6=wzXcwr|OWW%m$6G*bWNmVpTO1O;+3u+(s*CzYhS0$K^c&DTH8YmJpv>A~Vz zd!YoKGV5i8*>8O(S9BKcTGI7uCb=1RPK!l!5qB1Nj!J~HJ@y9?w$F~V&b?{c9)i0o zBzY!o{OiuAKCZ=yeBu>N*Gq1D=KYF!5;2NnIU#1-Tw%-T`bo$92foMgef8}D0UpTO z0ike1)}~>FCiV4i8!fw01hz+|fR`Jx5Tr~$av{?;?uvy|94qDA^y%&3Gby~1&%T=S zhGJ=WqRyPFdaUZ{>%zV;TRF>Lx=?K%?H$6Lr4NFY9N*>K6!b z(zeI){)`I^xl*vNa-#5b;fpJPILTe$^lam3U5Y{Ut*MAgLO}8VG53~XQFh2bb3P=lxbTE8Lg5&^0cXtk*L%e&y-~ac# z&+&eEKRh3vIk-Kzb*}5$``T--wf5TQKF|6jMB^7FagqcP+60mK{h7kY$*aet)>zX^ zbso@jdcb6{xU)Ex-p4>VHW@qKL}0g3pJ$<#K+_e(M)mY?z*I}cnLk!Vtl8x;K}*o5 z0!Hx52l+cct*zW_OmUeU_$eYgYfo~v$0>};m)xf}bCO*@u+-em_8R9*cFPSnKdP8ocvF(C_B~%slqYWFb0i54>S(KCX9J#OWsWxoIQTBDNVg zv&H?LqV5&g6LG*e##ccG0Ul~jafZr(xF>#>1jJd6jnya1(pn{DhF&yXpAlCAG}WDr zFwI%?W&a_DS2&093QXyYf7tw4@VbxEu9GuzvvN&(Fppte*W9#H)sxa7>p~wIoSJ*| z-^ZM%X%;W|ufWS#+x{F!z6$l<>P`elc=2qG-9E(_fhMI#cNtt8Jg&OZ<8@mY^A91^ zMSKP~LBw>F3mqN$OV~{hVDE@NMjh^~k1oH9gC83M)4Wzu+EM;~O@SAyPo97MK8^lQ z4sq`PKKyK795Up4&wEpHj_){ye{Y1)6Z3$V_r5E3b*S;aW`2nndtV8h8(`h7xLVeliv=$l^Q`mY9o{^q_|J=9Jg(Tol}m~U ze<<(Q-k$iXl=^%3N1E&0ECYw;SU_(k;aNUrSmRSVMQ?lDe!)%(vo1~FdU(WT)T7K} zK}jmXaWC5c+m|$GBU`cJ$Es(K*ZRW>x^!`?SnzX*cNSMw_$VoBv>Fv>vkcRCr%3uY z8{#g6veuEHP2EnS+pKb|B>CxxKMX-X8L6;&XK%hy5A`pciT7q+tNBPl@Yhc&ck*wY z>1IF4J>{rizLCb8Vc$mAGGEM(B8Gi1V*jYQif*1gs!Q?VgQnHH^a59^+|6Sk(_Z*b z4+bnDlq`5M>SG-?{C{R;Q0at$Jvn zT2|mxlX1fj0<)R0BO4vlMhotDDJf7;%kzG<@ZsEb=#QSOWQdR@aPMb;Sf1UDsXY=#HpV35v+KvSk|5VCol}S_NvdM9X zYY~~GTzMgLx6eYB!c~-~J3~x6Pm-DJf3uf?I813Q*T1u1I3kqf_-l~7yiLl(n__Z# z_P4@oOSy`MvVzWa&ZE&Pp`UWSZrU6`!iv)Z=PE+=nxHz^oO}1IM54fE2|>qdh^1ej zSFmTQaI=o8jRjaP3#gUzS#rc~yu{qvLb29{*scb#|5LcQhgc)RnW+GVUH^UJ2|rZS zX39_Wk((xPA~uDBPcC`CZ6kSA$$}m|cRIy%=YCFXKuzP1fQBjFey=3`d~yE=QE2k$ zcj4iLwndu@Mg|AdIBUS&IKB5QGBT}BR-IOoO4Eu4zZPzAn{NbU@8h)QP|et^W6V}c z@Er0QZn7Yf)z7d=h@#H{FD69hPvg001vlqn@c~(fLDX7KQD$~}WuOTA$;HK%Bf)df zd5`RQSlK05_0QZtxkzy>z(+m`ZyK|iyNNCHm)EHMQ5BN@AsnogM9xh&`@`uH4$i#F zOpd7zqsc*g(jOvo{0k=HZQL+2}a6w7nL_;Hi7IgilBKc9(uOqbpsxh`~z7!5A*dO3`;IU+{zE0C0btYpD!0F z{v|`|KIigXIzl31{@=rPJpkuVTZftm0vVTSi!U|e>N1q{@u(P=6}Uf6G?vECnU>PL1zfB$F##0EY0F|fBwod z(a1HUC3{Bvdz(V*Pk&>|My89YAU4&Qi>YYZnmA@p zxA}N)80I|;xw6+v8#fk!gf2oc7G?e?mrV8U$yR@ zYY}|oCG{1Q0uQ%6poO1-b-~j9R)`9nA0{ob1+rgYNQ;6WKKu}>*dm6Ikl8wl7m~bV z*Atn;q8xQkE8b{R7YRE5^rxGn1=J+)w%6&6gecLtjnk7m-D$*k-I(5Z*oP@?b0;VN za)-Xj5z|3;U-ElJt@G@ekzrN&`4QM5)AL!c?Ptbx;rY8qU+VACd^F=nvR86_Y}lIX z!L(BQx%%=2MK=h+U9R`*MNV+T-;1n$-F&;)f9HuS{-|Eib-(9=H)coO(o|oEBoF)X zEF|fAbna66#9v0WT<)uSS}lmauC*=wrSVI0mlM0IkJA8A0h6$2-u6nfWb_S!sWMGRXn!kl@<+f#mz?BW8~bFU>gPW_W&RI%?s}WP{4BbEFV60H z6@Ymch>1TlS|xGfj>FIOplUjPF7zvTcV|BGk2KwJ!F#SXlCXQ}@QPX6&Hy|;_> ze7WwqYpFy4^RO^LWlHCPphWcRQAo>x-NIoi3HHK-{oh{Do6TQ!7faZ%KHBS&!xePG-Y{JuWWcg??bxAST6xk$K=Gv$vDU7CfrMH zY1MlQ`(u4-mnVoz>)1=eDlo z1$sT}36*;>g4_SxWDY}cYUCgf&2<5+B2y%6MBAE!_m?ZnbAa;3b;EtT{r+lgqvlb| zYHnO})uPEMUkY7^VVI)q$&3&OnDg^0=E3u4bt?$0@_6rKdDWJPpf%gn7qtGfA3XR^ z3xu1CVDQVY5^*(O#nO3=Bh#VpBd05n);KD=rF6hd{it26f*rf(Atb?yyivRRnb)(9 zc}4$7sqA*U_aL&yAO7cy#N5Blg=Dc9z-wU6E+CNS=7_;<1#msXTa|sd*yBeO?7|#Q z-$a8FcK#4#jkIgO92&Lt(w{xY+x0FGrmU@(IOZL%n)dL*mR}0EHH(#p%KH+`SsyT^ zf1`N*j4BHrzTf?GLF;k2=BvvBmdo_{Nr+479?0_p7GY2vUAMO1g*b;RqF9dBn2UxD zGdOP;#tkGi0`zMD8;}N^wN4Tq$ZL%`kuSfV^ZPmxMbM)ntl!r=`?tQa;ct8x!Kw)0 z+g6N{Ob{NdAYq+_TVR=fRykvjG>_Pnz-TONo_^NSi#junR#UWQ?D>$KQYN ze>O}Ag(aTZ1_XvXf>0EGjq&Zo(+6zkQT;tnd83D;_0%I0$AJIG2))HSIv68OyyHq7 zsz=|nQq0P0?(hj5+-*$|iy=;+CWBfX2R&X-8JXm!MpN9S2XsnbMR}i3mK$$l3S9aV zWnwWrbM(ok&?)}K!N4P{blLU4fBE;0+yxzP?=k6heY#(QQEsEb2I1e^5;cFAKWe@fNWGYIe)^(o42OVO_1;^P-*W+~hsAod z!ZoJip(*_h)%ajDLi@VUWjsVL8%tn$rQgwQtE>n29Vfyo_&M8g`TSxEN4UVn*Mb9A z>G0}H>o|u|v8p7rN?0YC!xB4=Uy)ShLL7&_9#%mdB zIc`Ph8Xk`9J)GWn>{;d!9h7p@$yM}avdg8!wuXWA_IW%reX!dhpr#XP`^KG)c39nR zKjRYN?nlfhL0=X|W`39EJnF%4CC8#rYMKnmZlsGX$DZIic-J-{(p8Q2@wnQ_{NRaX z&Xg2%(kDABD2f!kJQ%R@Tpj8q=9x?_d}7u;ylu88$mezND8WxD^`TnJ$myKRIECBQ9SxFjy4&FMXQPzWz3EGfq{?4Ky!7riCnkT{#&ydesu@CEc z-NRE-Oh--C7*qaLjS~>7mD1k~IzJ7+$_ZYx3W>#1A0}{ij0m7eSDSIbcyFjynD|GG zHQkRQ3-L50ma=)1HL8e3=oy#9bS1+Pmd{LYY|8ShSojNrFrH5rw?ai-m+M}?zUfdC z)%~U3vHA+wNx3B|axF<5SD`K8O2ls8$Qsp@?by+b;0h>kwQrh2s=j8uF#?qUKikX1 z^Kh<~Kl!^(?86<;CC+x25ItRIZL|De+O`NvXp5WDeiA}N>Jm!Zv-veo9mdnD=1B+^ z`ftCah$nt}a6mt9aVgPQrPq=SZ1AO8jHC41W(}o7AACh*DQ--y*}iL^N~kDX3=rLa z8zvPn;Y;(g=BCqw?4*g*eRbUih`QGe?-#hb=}5)m(Cb;DCpP=bUyr7O^dM)UR+|_M zY)@@WSuxDeO|=;K9vC8T^w0XY&y&%?*L8*8pID364y!fJmuHJ7+ih^NqO8x5s@yOSG{pI13`q z$WnZz7TV+~BZ)z>Y_Z`n0)*0&#E6z;H(gp1Cf=A+e{^_Nb zT9IdKH&x59>gSh^j^1|z6y5_)Kf5sKIW`fS-dPV{ncE|}ri_j?)WHtWD&!&W=siLMq-qk+ zGtGD--6i9RO455-ikpf%D6rJ+%xvS2I&ynF%Pg~vHpLFLAgiK{9WMgrfDyq-et#0n zb;dYcP)hD=J=+dtGLO{Obh{$v&ip0I^IC!kVUVZzIHx(g(C7urev>;wTrGic;n2&W zjL!OoN_QI4ht}1GD4Cvk$c9P!*8U-`!^cVr(p>fXbYKnUC%Ek`P#v?t7aDUtqwwZ4 zX$7?Nc>wZ5lp73o`*B1LoqK@hq1vFh|>(cD^*4X|DwIn{gEes(h6Lo`< zCFi?kBN?eH(@S(hM~Y+ElGIN#{Q@83RmQ&#Lig{*f8|*V|L7-G_*#s%Bb~3vlGyqR zs32VnFljOwT>6Gx`++%tHHt(aXQ-b|5MRLASb8z2NEdq>@iqeuZ1W)Dr3V<$c8Urw z9C7widYWJp(5fcL$jpqro6vu-5e#nyvdGJckrD1nwzzKiTq*yvP+hCqcwOt{lIInn z{A72hs&bWVGs-HgPqlsfM(7>8O)0Xf#*-aCxJh?}pb;#-ZN%--m@DC28%eq%i)KXu zNq|OQE(_q=O%p3ehjeU8eSkPrg1G0Q9gZ{urz{?D0LLvs zR#SGXqgpf4U)(QPaj9DuKrk@$1;b93;$O)f+5jx ztx1O}t1tXQJ6Nu`jv*{T$U!Wf-qee^HC=z(pf4-rrlknaBQ$8bd2$`TYUki1i#SUCbNsLW00)Jp?W^5 z=7qD?`+LefhYSmLR&aWY;IJQ0>f?CHrzg<4#{c{IvR z)ckd-H!dK@;KCI0U%GO{j&_lNx&XXc2x1ceMtVNsWQG!tW>|-_fY=Z@P-VC1D+^@> z#6EFPMqq1|!`a6TLRHFeQ2<=M?soye>@MS``^AeF1FPnNs(Vg#3Qq64NZS9eX6Rkg zr`5+?KD8GHmzYqAdgJ#9W5P`{LpfmXVwo1?lfMXAu4!TKi(-}Ue?D=5CVt;lwjQoc zXVhoBhO({s>wUk>2T8ab7E1<^otu z9-wvKxw01ocy*kF+khC*oyT@>e}ebzsPOR*7Qhh!JPulTid#;Y+lF5WkO}re{I%47 zF9l~2oL*kh;0GIttn=jptBgVP8^U7Jp8nkW)YE-B-;*EL<{KYi&UWm3u7gxTVPT|{ zFJ1&{(<#9I@S*GaAL7!3xmf7ZG0sC?_v=WJi)699a^*_QNIcE~7E^Z;JYG`jaJkxA z5j18EcxES@r$3q9X9B=F63qgm%RoQfuo=N@#7kuYw6tr0qLLB> z0`VLLh*X)h?l}0#0lnrl002&r=qU{OkF#c7fO zMI5EiQOHfgXY?AY=j{#Ctsw^nzA*@X(@LqyQ6_js{>j8-M_nA41xmz884N&K@mf zOPBuoO4BM6eBwRv{v-ul2FxQIk`ZWjSlPi`ip9fwFK1X>w;Cfg_E9h$ZUIlxj?L@W zl0TTwq znB+IU(o1-iI|Jnli_Ky{0(8~a;CKtT0zTuGun03H?3WjJ{e^cYQWlRN#8UCheZpA) zuBC;qHD5ebeKD|M2k?Yf)maDQ4xs<3;Ya3vI}wWQ7F)FMt7N)0LQ1lBzhLunklF1# z=I-bLIK8h7rUa93)ik-PJ{x4Y)ljf!p;7qIjmK(7iG=T@5GJT_ zAPtbo0bB%Liv*0?@41Y+Y4qzyp@tN(ZKJ9=lYc({@Yo38f$N2ZmJz?W@8x=Sj$j{1gf$UITdi%7qd%Y$6 z1%ZTfDZA8tyW^d_aWAmN+ti(Vx0Zd2xZ|YX{=-Q8&gHtt0;BGVfKCjKH_$ScnwKX`?}va4N2knvdFYOv4QBn+I==BeiNojWG4(#4>X~^4z?I(doo7Gk(l=&ocWNFH z%f-JW_tb9iEN73EB703bDgZD~Oe7mSaS?Y2JX!R7Qv#xrNg48FhV?~Z?4_|oM&ihm z@aS0a$hFj6H^U&Z($mk?M$IklcQ>0)8TDSlERSO-3+XC}lf-jTh{XrSjN<4PwMXD6 zFmpg*YkYoO#uCAh)542a<$+?Pk{Nxu__(>bWWnB_Yp~j&Qu6xt=8)z3kYxxq?Z=j5 z+etyr@?*PBY{A^za8BS$UJv(M9$Pwg`;#JGVmQx|p7L)aD82X!!Q;(6qs+eRS{rvH zhs2-G_{^5Vf(Y}iBEF~C&Ijqc+Q))AhmLz-+ae}!k@SJ6(`~)12-U7sU$9xr>tLh_ zU)}~uk;$Bj_o2sf)=}Jwda*gEU9d;u5O1ri2cfu923FxC&hCeJKIx^sL5&<-27C@w zxhAe|UDPUzcYIcb`zR(eh2~to^c#cx%eq%RYq+Mxnb!3!fhZ3?ILey~7f9luxf=M1 z)AIn=f&c7iBYI+_-X#ZDL~_E#zLIYs4SM0@u*(aY*!aOL?cZ$xD8yO$vhnZp{WXJ* z4ZHi5Xhu3KhMTw6CN7$de!x52^&unzqLa@GgzEtM^WvDqr&H&Tq-N?>t3&#aPUA76 z$Q3!!{a0bP^}KKEed*4gHjZ;!dF>lV7=IMxf^!4q=Wqz%oXX7@_=Mu68~0=HIvu40 zEF+vtCasIZb?y-!`D4ts^;}!Jb+f=NaV!s5Glt!)kjk?W&Ufy9k|FttEZyscevEFl zj#x|^?{6a)jH`&7ZUnQekshfq*~eW;hOQJJ?usRV6uNl(=y9DA{MKxc$ON>SM60xf z5S({@xOXBn1Ip;A$eD6ET&uF*|J$p0A@j93{h1Lqj<~q|V_`33Oo5BwZT0HRSzFY5 zINnLMU22ioVZOe061Y+;acyv&m-dG3pDyGQn)}Kb26Q{ndXB6>$fU2oVS4pRmbHjQ zfwiBa4qoRFg9i&L3DNJ^SbT1hY{k1%>2oE z8EH)9nz7~fLd>i${U0?ArqY8=_*Rpnbiw{8*U_$!-Mp=23o+b3G&t_rZYlLUzY*$1 z;I+n9@Xx9D;UV?@#x%bl+^Gm5{BXwOr0O*~S6DXgsJn7!(-3`nbqiq@;&Zbtku4 zxma!0t5|YtZ~pjQ%}duqX|#$80T2kLRk3VFygihx)T9*&&q%txX!PlTn*#r>dHJRM z3xOti#})8k=#!TBmB80%RFAVFkPI;%_Q^f!E< zcBkj}HgmZ6nu|H>&C3w&>e!r+O$Iu-?sO;4c-el;hu*}GSLZlr|HAbo{4`AC{|;wj z>r@?)8B}4|M54jn&1Xle2X1i=vNiUGDwI;{*DhSO@*vEZ#=9WE2EcL-jl<1ng~I0q zzdVTV$KTUCWXJ(}6NsJ=+-{2T|6YAau9PnF&O3fJra*V)X(C~c8P6yELn~w8T2_vW z#a{N1&%b}|j9{Dgdhs;k+ij14bHHu-wC%;S6+%w_=PY|P`pZQK`RVrUFT~-=C0Qna zs!v`p$>g6tqPMk^{v?zLBS`8L4fT5^yl$AKO=~<@KuThgljJ#R(L$_f`gY#@ZjU1u z@lG7dIPECr7V^TvE7(zw?eg?vyBAnmP>U^>v^?4h8v5w%niZzJ${_c3zk2QCy{6vJ z4ALd~=aCC!RD%MwJkM7a8yS>IJMX`H#y}j-!9>dVB8}T)EtAgQ5nA{Q<$YMe!oi^F z$-n*h)(^kE(-+{i6b0at4)xTc#}IS->qp*IxWAKbMhrX4RZvb{ZenVF)xq;|ZZ;?1 zH0#cRJQ;iRkk*4-#(ophTJY_ig+)@TFU!SeQJ}Ps z#B*N$^x^}@#)~jB${)&?y2D>E8WbK52q4#ECE;Cr4s>K_1{f?zJstKAk%uVq$ z_)we~dbF9*=;}6xXW>t7c(8eCtpaF%@>loDgfLT+cqh56(;?c70H2l_N8dekvdV>L zG92H2wMp`(Q{R6k0~vlkgv|UdS03oZG5XZNg3kK78o(ecUY&7q{A>{6uU1MyAJ#J$ zXspxEGR1aCv8d3Wqbv;d-Cgae;7h1%s;lQzB_8RM)vdobN-1i3 zX7Q=WPZpy8GP22NAach3{Yc@_vL9m9 z^0t-V$Clt7MbjDi#>#S_~cFW`e`-m6L zS1_eJvvK;|cv;bYnNcszW92H?XQ;iZUL8B*r#~tsrDk9g^5&I@Ob$r>^Cb!`JauXl z5~tdHl;>KTdEt7#Mh_JQi+7grcTVLG-dDJ=!rS_^Ft_{L!t>r4GdMoDP)0zggZY%` z0p}s|o?3qHzDv3=#wk}(@RdB}=C&RW!i)n+C<;^wtW0tMp!;PdH+=+ZerEH{?l+=A zSaE4Ze+T2Du5iG6>%^HF1nZ)XsE--b)_a$q@BLR)Lg-Hb;Mj-UrfH|rq?p1g;M zY|-wfNtbd&n^n~Lc0g{F^L^~jn`ZCsB&F*3-&Np6oMnVPEzJL4?h$NU-n*3K30oL9 zyoom}{h7%^A}l_O{IUsm`>df7qw*bQt@t?~5nGevxp%(tFsrGwlT1;KHN*ig84+L;0L*@=2>q}rE?mM3tBnzBmY{992XREm5JNd4dkCcnA{XcBq z_okTfS(Ktgrn6|C++mu!&`fE(QHr-i^(s-r7)8Ab_J7Zl#z*hg9f)>yB%8l%dLYm8 z?xD|8_Za}hb)h#P+jn(cu`v*Ddv%ycztda{4@=fG+iamZ%DhKA|Cw&c?(Mk2APrs^ ze77ijlOyz@i2&FY6@MkNYjnL>KO-SakwUxC~y-nH+&s20br25&B$2IpWg7-$DvOg(;S~8X`cK(e$g&wK`>7zU@#BY6tTq6 zQ;V*S6mwOlZFtD$G(NVI8TK8-ZmqyiiI2reJkjr66K`4TfUX6Bcr$dv*y3L7ryi3p zm_sGa$Xl#zoQlsExlVuLCJ$tYy_ikLzUIVk{i;k*OBeFpb-Y=_-~o$)1cR>M@cy~a zwtTjVt3kPsuDgEiDd#TS^$Re&p(|(JulM3UKHi{J(;PICpy#aKUnOCy+85Av6Q4%t zQYDht)=tNzE-Z7Q!dB^woeiY#vfRG9(pDDGwE&hQt4mH2$QAEW!PSxS5u^P!b7 zk@MpyrI>njKb>Fq1|R+sUy`_zZ~d#{yH^h9Y`z2RRnH~d#zmSROHw1-I;Ifd*C@~M zYq)-xb6+nJ`BbWN0*68A^h~wp$&O$J&T?H{m4BYH$$am4&Z((=k;Lf%sW9)umL~59 zb%GO3m&gO|JHNbT|N6pX`I2I*fsV!K{&K_z%O)W$HXqwqz-C$w=;d^)$Go)MJWlg7(7pCKdJ%v~w8c7*cSM>4R z&#itFTjpCJx{ErMRfgD8FD(^1EY>oawcWNo%dHd=EoI=<2Bjxw+Z21RmboLbD`7Cn?WHrtrE@#AbWKWjs8*np+y` z+L462hn5YAeIW&y=B4muhwc=K_Gw2b`e=xe&(mF5Jxj*x6#Ih--o5>Uo~2pB_~~qy z$4cdC>`&>@Zx~}sp+yfL{?xMZ4=Vx-gJCzhG3VIp;X}mcX2aK&9fua#B^8Ig z+|Zr!i(&lyCh}|b=4Kp_=C7Ya_0%AH&)6PfBJqutjMYYKlJoP6ZExeP^ze7!m;LDS zPbJ26Ofjj5pDMqR%FZ8rVTeto5-{=GfR zeingZ1?~~ev2Xb_n?ug^Z0w`!!`JavR=|q_uLy5J#Xlgl^JnPsu65J1QTVr+?BSYz z<3oznq9z@bHa+Yqf>7J)5nRSG5NWC)5VNTUA@Vw$3Ug*xu+T@98N=IDksj<2$(MH> zpUcY0721rJi8^E9tPsbDWXXeuhCU(66r%xFUPpBZ9ju5!Nvt=j>~KoGI#R4WySb(% zg=)mqo=AB|x09`-I6&%?YC?6$!H>PKa$N4ojSfi2goKG`wtlKdmY*D-9V$6nI& zh9FDB9K02N&}p;om||nM%2W<^4VL3FWFpjPB_ad&DmvJ%_$2F$^Y3z@Eth?nA=JdQ z;ZEFg(?dfQB^Wek0TXSDknzg?Wq7EvbmZ)QadGLqh(3BNfXL);ep+(T@SzE;t*rH^ zEjW~k@f5?yx%nBsH7#1=q1!-PtZ~>o9_in|26%X=s0OepOx)JJwxg*-X%>o#?x&{^ z1c#P5&z`uaW`eu@3u@{B!Ay*0CbT*0BGz>7!#6j#S?{@{&T3K=!*pn7=kWB}^^=x&hfxlflgvol2k;Q|>c$78OWwpNalvp2vo{Ds+v1d&yvhpmf zbkR-N-w9)C{zZ}4WdjUpwePpHEcMcI!Rep!RI7tyHuqH}svekm5Iwe9=Lp-^VQsgB z+CvqhduIPUVcZ<4eb&4*W2$e_>Q#2WAsxlI?G5HGv)De-_FWhAp&D1uovbe1m^b3+>~XqK5j_MYV^ z$}<67)r(G<$7c*JN(`pT=c)T#6}S0lT1UQ|(M{SCXXJUt{K@>8OPO5*dzG9RSA8w0 zM)y|W3@z2LP2gc_)_zTZ>PRI=dTw)>RCnP-(5Vda$4#n=HJHkqk)Frdxw+`6!C)qc zBd{rh6~th0a*>(y;hIWl?b5vJ>%zxU0s)1#<3{85-P)%OtyO6U<`9IKyG>JCaV*p* zi&`hI!4t^}u~5K_+_g0AD(SCnVo+q{_!jgVBAuJ4;Slp|*CUc|eH^)sF zZGu1O=V3Ht2+i)^oBBh;TBXyWg|=Bl`)n9#-`FGhcj5YT)n1wiqnd@Cz#XO?OUtd+ zL~h$}$O!8@*vOrO{Tm>5*;^MJHTP6*o83~VW|Q(MBOTilV|&QeK2iz_dZ)c6JIms7 zb};1!{HYd^K7*!B-Gh!DBTnpk;kqzUgzjhNQ>gk{djefvJZ=OM!qoZ21S6QUh5CkD zM0iUo@8Vu<3319S0eyTalv8o@Wt}Hdxi}g*(;`}J_jVUsuBzkVb#wzc7R5y6 zJd!rtCc^6?d9t6as-mhBGb(QPuCFg_u2^H4cR2@EP*TEQPU~dmFDKhI5Y^M)Yy79~ zlpC^{vv)UQYDXu!KRXlsK{{r0Y42{#kEto}1=Bx_djf&9$0xT8^xF#qwyTM&LW*v-Lfw6~<8?hy28cV&;j@zD> zwaMx%?$xcUGuM;3L3gI^I=w=ngL6Hd3=mfQV7dxz-VSA&4jz5=lcAd?mb!mh2{s$Bn3e_GI9v%{F0{9$f}szOLXb1iTy$eq`b*SGU_LY(J&uhy zYTr5dW1F$@d1vsMEfp5Ka}XuCxmS_iK+9Pm)G$^hP9I-@F^23yR)-9tPd+vdA0SCP z%6_yb;NgjQlMUBIs`FbDo+@qz^*wlq8W9Lp8P@z(>kIOr^Wn#vP#AenUK5eeT=IVH zZJ>{3PBvrMXTe%kO39grTHAK`4cve(8?`ZbP`+iwx$yj?zsSJ7b>5-rPbKZN- z5&Qw0-X11)4MDLX)DWsaixb6;Lg~z88`HK8Q{3^JvNeBJ$`hU^mSHb=bwH1X}<{x6t6_buz{)WGwbZ^s_E(+Ry5HwGf@sr_>yI@ z|NOfG0)go|{ZZk$+49v4wlkJ}5wkln1zB&Rx0lCUz}@&P&hA#T+d>N-js%GbgJjIf zpkAMe-kS*jN^*44AF1?TiG#TB2Id=&qIk__CKuK8!Y(RRu#GoBYi--8bsVuUodw*) z#mg%$C8YI^*BO5VnO#p#t~k#6=|*F?=dl)*MI|mO21B+se$|Ycl+;%|h}u{+p>0DN z2a+l55TA~QepP9DsYUcC4 z=DC6K1d+0=C4OC}kO+4b-dY@yFkW8wLd)>DZ94VYUsX7k*b#f@Bvr9!Aqy5e_5L%O zR=3EU@D{ASz6-V z_6`i-fU=bzT6uhgdic;oM3U_6$t6_a2?N*u*MA61u4~(!>PgP(;I-wn%Z4$r2smKx6mTXj-Zp&wrxiua^L8DlS26#%?|my01hMTtfq`ZBoH|STtJ3W-SLao zz{rs=0-ZcW4mtBvDyd8MaqWLQ55fap-p2>*ax4n6!0@8^hT8>yr9;$ntlTRGx7Ztu zmPkyEq!y!G3WMfi!8rqt!bqi-mg1Xkp7tmcn2uZIv9b4R@!0^bOju2Vn-Nm+u>d<` z6!EH>jmKn1ri-OIKy*b#&o1c(tshV~BJK^lS`nCfuV?LSLMHvOQ}1 z)tXZ&CT4w0k2c|3%IsplVqd3+bVg?<=Lv4K-b&ArJK=fL%1BA^8p(7^45JW$i;&8c z|Jc#cO}fFRjhdM5&9@t;<}&1>zh~=ev z+HupOsJI@UNl)BS$?@?eU4q`Ml-BxRnvWs~=nggQVU#y?{TqSBug(-pt6)cUNiu;l z%t6m9L(`0JMr}g{6$KR)^^Jzb5zhSM+J?QarsL=EL;|Lo0crxX0>RS(C=Uf7%+m74 zsZ(mPFI&e{i5L&)QjNyM)YzUd<`rlCJP3OIQ@`4%=aTW6HeTW=fUWR>k>q zrhSfUvdFP=lRYt5QB1Lbi(Jn@-@K~fe5SI#Mxv?dNNh}TAk}a5!gkg|G{{iPWyxX| zXr5xP1cFbz*yXp&fKgq_eGd~qi;7GuC@3gQBgE@S$$k@^r5zp?i5%%nD#j&VuMAOLmg?2nLrD=Gk^qx8!&!N8L&o<8k@Ss$wKS7K{nS+S*bRq?WT6HZrnQFx z9YWrLolig0#z|Z{vkG=?ByYM-cvu)~%1vuiVC8+90zIz80_s&Iyp|EUvgond^nuyH zeA;Hv>TR;OhWs4{#Pbx-agz}5Eukl&nZB~A(%JukKgtNeyg&bZ0q*Gh!-TVfvyV3u zh!5wVkQaos|9(XPFM0m!)9e3pxy%nRwa!0~f2$y{hwS%%=}lv;$12>O?DVJ>Hqyb8 zrGx1P0l30(F(op!q@<+&H*13H{m*pnW@XT|gr%jWH_p9kG}&VClcT$^mHfrQLQ|mf z62_6206rotKxF9ar)jP1Yy=M2ma6 z-{RB`3sn+-l9G~AdbEi`&N81rvqtfI#{l>YhI-Ss^;e(l0M3>1Hqe(yrUMMLI+ojO zBS5Rd)xHIUc&6KWt_C)hJAI{3W>&@?fM*^$F0Hnp^l8+`iFBpV+M^lC3)D*(r6~_+WFk zE%+kIEvFXI^9R3$sdf$C@XlGP*lI_yrNwn&q5zgtKtlhwodLPT(K>*uh~wnCbiUGv zy4po>Xm#BmUf-Gc^HC>T%yoT26iE2cx+@@@mistI%bYEtWB>XyY@Q@Z1E5$T_=H4O zT?05Oug~;euHa>a0;aY{Qc|2k&^tmlZ>sj|xlO>8Y@D152mnBirxN#Ybs02{RJRPG z5#ox}bLT2R2t`10$(%(59Mm0VBsIiGp_dnAI}6y6b60#DYw+crVZ zO=>?~#t92K0y4#v-@kt!4ET!FM}m<8KpPyhSqot53(+bxndM77kgwXwww(oJaY~30 z2NY-N!jFI$q)#qbr@bepivl!bxLJU+B}L)I4{xz7g=j9M2p9oCVK8#!#k|@kHdhJ(>w)yU$PyL5`G2o6QGmO zk<~}Db8~K8Jw}OqrixqrfU2z&zyKZkv`mdhe%mhshCcC~bfwwx)8law{%X)3!0mSL z=FOX+U=(YgGMsypT|K$1Oc)Tq$ru|OgD^7iOv}>S`j0lD6-giUTb;Z4L1j7kYcsh zv5KBvLa^8NPptwY2y6SD0XiH^@u1_gco=vAlvjL4+?TUCgMkrM!(;PzJ-0hK z8^9ae#m&nnU@oXCD}MvFI`?}z2nAe#_SeC%#OOJ6VxnQNm>|H{wE~T-Egxf6O%kQ}6d!(LdeM-x>yDy{B6er=jNEsm7DFJ_k+G;$41) z7fXmUHFDblA7RKE5QWO7s|K2G4s8PcGrlx7O@tJpA$pbW#(R8wbg17P~*ddEfU7VS_b zT)+s}698 zUR2~QjNff@1~;;9AcTy$SOI58#q;*5*KT3rtRX#C6EU-xme>yP-LX`BCNm+D>FthhO3W>ospYcY3p{8oj)dn$Bx~QauTNEgy}oGEsfuN$~HUWb{cIbU^zd<;JuyLwg=h~=eZrW97(V`Y6->)qg7 zJkAFKWNISNM0{Y`mt`()l8rBznq0_=mj{$THc{!hxwacD4m-)YPBYqMW0=n zHfU$HF;!0mP{0AxKyGqz7@506JYWQPQ=P;&zXcls?K+_I?C7{re|tX4FsK=HLgmdH zE8xG9zkg={0(CZHdsTbJr^kCr2!+FFb8xfls0+_VTyJTh_tdUvmZ75T9y zG~pu66UVt3jp{?S>%gAvahYZ80=Tugm$*gGFTj;6SiV*T0||>hE+LD5%!lXQ=2&}~ zm0yA$qzx|vsl&zgM)*|I6x+T@(+&FZ5tc}U!E-TbiwOs(EOHCe2v%x_v@I1Sj<@IL z8Kr|-Ll`6-X1+^SIRXp@Xo>Lepc@Be22aN%iR6-;&a+Npiyj+TAfAhvtB2SLEjR;jOZPV7NJR=BHk1X+_I%l`{4A z_TpA{TtKf;ba%k;AouhzH!Ly|y1VVY+JW;fV1I)dlHk6S9tWb1R+*DI&H;e!V z>fEmz3Hrj5TXksB{&@Q9YYmP0E;;VinP@`Y!3?#`O~4Rp46N?}*kdFho=pYDlb)T8 z8%h;@{X`UZwJ6AyWPp!2nbkjG26L;qxL+?8fk2Sn;kgIg$y1xEgSoGCV!~Tb9C6&3M=M0I=tEnnwLhT?`FphiHSs01ut)4`86Jb+Wi zMZ9Q8D2wyvO#2W(QSp(d|4Wrj;L|nk^nHhtvwXx?`AVB^(bG!zJbCs_Y%%RcRAijar ztYXAtt1Ue}y%_{l2cXV6d_rQ@50pF|_a{GBbDs93iH8FR12zI5Me4bm<51|Pg9XNJ zr`YjCa0o>lv<$j60FE;W;4H@rJ3OBH>(>MN;{|C)5L5S4o+W9)EZd;f*wMS-@V(o1 zr*xs!U;)l2;IdEnQ6t=_Bk5V2VYa|i7)aSO4+4e8295#*V>kJ_^-mA`< z`_59hlIN0YDR8l>Dk=q>T!af#f+c;p9Po5M_%sS6vBo<~y|_q-%Mj<~^bb|Qc*QpA zfTZNV>s62c!|Tx`Ici}ivz)5KrS^mdbs>Y=PjN6zDM)@nR(HN4u2IBGpWWd;;hp=>0B8WP1Ahk&pY*loI8md5tp@=)rx;sLvMJ z16M38ErphMfH18LIzbHCVKuY|rs-^>#L0%>lm3!dz}SJyXivaZr-m8MuF+h>JsTW{ z+5`&9A|SqlA7JHj2;7pi@vfshFfd$fh;!Dg^B{P(0@~_OQd(htT$H`c8W$4Iu3@uX1`-(b9GKalAf%AlINuig z|Fn0tF-=}!)MQJ{mTiPA!#UhoMhzM)WTKL?(nhqBiq>^(^P}tVBWw!At_3G*0XJiC zKb%q=Y72A>hnr}f6R9$2mxxM*wxOLC6j0HAC{8FZ1NtG|d8*lOe=f`T1r33F-}~I> zIp^H>x#w_3-9e<5lN?F2Y%QKogQ(_)ij672m3cU2=a_fQ+Z~@dORT%Gc&Pozu*DyYfMniocz1WBj;4&1SW`CiyxU$*?K{YV)%8`h-c*tSb!vYR4Dmd*A)qG--j0~` z;Xd|8Jhxtzk+Jc^1x()N%^l_Z(4AI%jtjKc5fK zz`HKAdh~g>=@5z#C_0huf+Ev43z}G};ZmDKpcBTrG&(MIB1Ui__Na7fq@3USCzpl< z%iPi1d!pQc(O(+<7P%WE*ueM@842j)=_m_NlzFJE6Roa4z)M3z$_fUrW?a9QpA%eH zI(ae9ZBEb;%1;fh!xQZBA1WGu9^ZW5NS#K|5bOYvFTKS*&oLo=&BtnfQtEeEdWo!1 zibtNz8b|J8nSX<4FL6(Hp3%?zf$kg4>C(R%IZRhdArjW{lPBjPjzo3uZ&nx$EeL^> zLU$K89Ac0QMC#Dw6}}bs&>x1JGiQ37>I-$lvLN902jC|x&i!MRO0=VSe(g-kpJ>@N z{_tp4a@zuMbOrncn#LaW@5(kxPX!*VHfdmYTq0CwuS#DyLs}$uTWhqa`Ll(*aa^5) z2;W4)iQ7pdm)r_`jA+IE-L)v1Zu*h_8ls7hX3u*4~Ud|B&MDWfv-zu%x5}jc-Q-fxyGI zi2=4T>}Xh-?`um=Ow3no#rTU8=+tA{wAeGKgevcnxV&>0xcHxL4_wCc6f#I~{@c^} zN6uQ)5=q~Hi?tT(mrTVKxz2&%v(s#LyFDgn#*2HQsLAa4S<9CzA&R&tuW>xpj=?oz zv19m_$zN!8V#{`Oz-cX-Z2MSSGPpQUPxav7V9XVyBCT%1+g&esm4v2&7b5AgxDwhe zW!#Pdrgj4MK%rb>*J}03usCq1JWd3xWc2NqFG#H`11yz|spRL-aP=8%sn`Cpela8U zqFe04Dz>C5I)0gKRJF)GdG~-VBEz{7bGB4O0bmG;nG(7Xj`nOiP;iFfjr{%`+c*Wx ze~9YhTnrQA%0~7^XPg^Fp?{+X8)f(P9vrn`s8GG@cA%AOzI>pSh`<)41HjW7D!Sp3 zsPI9GY{G@ZW#OPI;LvR~_}iSH?#hLjbOG`sLq#Hi?~kx5Lyi2}iH`_hGNYZzhL&?d z;z}SV)y0F~>;PDfZ2EhZtE|&`BVWzJot~1hz-a_j$eYQ(`rull_AK-PqKsy=!ySbZ zN_5w6KWuEeWaU60RZTHE8wkG=UhW=J@I1VU3oJ7>at(25WIQD{Z;p$o)}AQdkwpFZ zckmR3n|tWs`|XJGygSCq4~GDqK5yR_O~m!-mgy@CKL!o5i8J5)t|C6ujfoM;(+uMs zC?fRoQbtP=T!p*+`Gm#_FTJ+9>GhP-&?Es%%9j;{f=)E*cS>qdTnJ$xn54>{4duDe zJZ3JEttrI>ZM~;=B;hcx%4=-jrn|@BrSQv>LfoQ2dWBu2E E15Bz+^#A|> From c7465b3bfdf82d0196451dbbc1853a1c2f33f522 Mon Sep 17 00:00:00 2001 From: bradleypick Date: Sat, 12 May 2018 20:35:24 -0700 Subject: [PATCH 04/17] #4 - make font size bigger --- src/plotting.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/plotting.py b/src/plotting.py index d056cff..86589d1 100644 --- a/src/plotting.py +++ b/src/plotting.py @@ -5,6 +5,20 @@ import numpy as np import matplotlib.pyplot as plt +# font control from here: https://stackoverflow.com/a/39566040/2566031 + +SMALL_SIZE = 12 +MEDIUM_SIZE = 16 +BIGGER_SIZE = 20 + +plt.rc('font', size=SMALL_SIZE) +plt.rc('axes', titlesize=SMALL_SIZE) +plt.rc('axes', labelsize=MEDIUM_SIZE) +plt.rc('xtick', labelsize=SMALL_SIZE) +plt.rc('ytick', labelsize=SMALL_SIZE) +plt.rc('legend', fontsize=SMALL_SIZE) +plt.rc('figure', titlesize=BIGGER_SIZE) + def loss_v_iter(loss, color, names, filename=None, q=(5,95), figsize=(10,5)): """ Utility function for plotting loss versus iterations in experiments. From 501b31ec8d2161f4d7464cea4999b133eb378347 Mon Sep 17 00:00:00 2001 From: bradleypick Date: Sun, 13 May 2018 18:53:20 -0700 Subject: [PATCH 05/17] switch algorithms to maximizing for consistency with paper --- src/sequential.py | 32 +++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/src/sequential.py b/src/sequential.py index ee85a92..2abd3c0 100644 --- a/src/sequential.py +++ b/src/sequential.py @@ -1,5 +1,5 @@ """ -Sequential algorithms for minimizing expensive functions +Sequential algorithms for maximizing expensive functions """ import numpy as np @@ -9,13 +9,13 @@ def lipo(func, bounds, k, n): """ Parameters ---------- - - func: the (expensive) function to be minimized + - func: the (expensive) function to be maximized - bounds: list of tuples containing boundaries defining the domain of f - k: the lipschitz constant of f - n: number of iterations to perform Returns ------ - - x within bounds that returned smallest value f(x) + - x within bounds that returned largest value f(x) """ # initialization @@ -32,16 +32,17 @@ def lipo(func, bounds, k, n): x.append(x_prop) y.append(func(x[0])) - lower_bound = lambda x_prop, y, x, k: np.max(y-k*np.linalg.norm(x_prop-x)) + #lower_bound = lambda x_prop, y, x, k: np.max(y-k*np.linalg.norm(x_prop-x)) + upper_bound = lambda x_prop, y, x, k: np.min(y+k*np.linalg.norm(x_prop-x)) # iteration for t in np.arange(n): u = np.random.uniform(size=len(bounds)) x_prop = u * (bound_maxs - bound_mins) + bound_mins - if lower_bound(x_prop, y, x, k) <= np.min(y): + if upper_bound(x_prop, y, x, k) >= np.max(y): x.append(x_prop) y.append(func(x_prop)) - best.append(np.min(y)) + best.append(np.max(y)) output = { 'loss': np.array(best).reshape(n), @@ -50,18 +51,18 @@ def lipo(func, bounds, k, n): } return output -def prs(func, bounds, n): +def pure_random_search(func, bounds, n): """ Pure Random Search Parameters ---------- - - func: the (expensive) function to be minimized + - func: the (expensive) function to be maximized - bounds: list of tuples containing boundaries defining the domain of f - n: number of iterations to perform Returns ------ - - x within bounds that returned smallest value f(x) + - x within bounds that returned largest value f(x) """ y = [] @@ -76,7 +77,7 @@ def prs(func, bounds, n): x_prop = u * (bound_maxs - bound_mins) + bound_mins x.append(x_prop) y.append(func(x_prop)) - best.append(np.min(y)) + best.append(np.max(y)) output = { 'loss': np.array(best).reshape(n), @@ -89,14 +90,14 @@ def adaptive_lipo(func, bounds, n, k_seq=np.logspace(-10,10,10000), p=0.5): """ Parameters ---------- - - func: the (expensive) function to be minimized + - func: the (expensive) function to be maximized - bounds: list of tuples containing boundaries defining the domain of f - k_seq: nondecreasing sequence of lipschitz constants - n: number of iterations to perform - p: parameter of the binomial dist. controlling exploration/exploitation Returns ------ - - x within bounds that returned smallest value f(x) + - x within bounds that returned largest value f(x) """ # initialization @@ -114,7 +115,8 @@ def adaptive_lipo(func, bounds, n, k_seq=np.logspace(-10,10,10000), p=0.5): y.append(func(x[0])) k = 0 - lower_bound = lambda x_prop, y, x, k: np.max(y-k*np.linalg.norm(x_prop-x)) + #lower_bound = lambda x_prop, y, x, k: np.max(y-k*np.linalg.norm(x_prop-x)) + upper_bound = lambda x_prop, y, x, k: np.min(y+k*np.linalg.norm(x_prop-x)) for t in np.arange(n): @@ -125,14 +127,14 @@ def adaptive_lipo(func, bounds, n, k_seq=np.logspace(-10,10,10000), p=0.5): # check if we are exploring or exploiting if not np.random.binomial(n=1, p=p): # exploiting - must ensure we're drawing from potential minimizers - while lower_bound(x_prop, y, x, k) > np.min(y): + while upper_bound(x_prop, y, x, k) < np.max(y): u = np.random.uniform(size=len(bounds)) x_prop = u * (bound_maxs - bound_mins) + bound_mins # once settled on proposal add it to the seen points x.append(x_prop) y.append(func(x_prop)) - best.append(np.min(y)) + best.append(np.max(y)) # update estimate of lipschitx constant # compute pairwise differences between y values From 6f892ccd339eea039ff7a95c05a098c07935ad85 Mon Sep 17 00:00:00 2001 From: bradleypick Date: Sun, 13 May 2018 18:54:12 -0700 Subject: [PATCH 06/17] small changes to reflect sequential update --- src/comparison.py | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/src/comparison.py b/src/comparison.py index 83a1cea..86e7241 100644 --- a/src/comparison.py +++ b/src/comparison.py @@ -7,7 +7,7 @@ # # Usage: python comparison.py filename='imagename.png' [--num_sim, --num_iter] -from sequential import lipo, prs, adaptive_lipo +from sequential import lipo, pure_random_search, adaptive_lipo from plotting import loss_v_iter import numpy as np @@ -28,16 +28,11 @@ def f(x): inside_exp = np.abs(1-np.sqrt(x[0]*x[0]+x[1]*x[1])/np.pi) - return -np.abs(np.sin(x[0])*np.cos(x[1])*np.exp(inside_exp)) + return np.abs(np.sin(x[0])*np.cos(x[1])*np.exp(inside_exp)) #k = 40 bnds = [(-10,10),(-10,10)] -# an even simpler 1-d example -#def g(x): -# return (np.cos(x) + 2*np.cos(np.pi*x) - np.sin(np.pi/2*x)) -#bnds = [(0,4*np.pi)] - #----------------------------------------------------# # THE SEQUENTIAL STRATEGIES SHOULD ALSO BE ARGUMENTS # #----------------------------------------------------# @@ -50,7 +45,7 @@ def main(): for sim in np.arange(args.num_sim): lipo_output = adaptive_lipo(func=f, bounds=bnds, n=args.num_iter) - prs_output = prs(func=f, bounds=bnds, n=args.num_iter) + prs_output = pure_random_search(func=f, bounds=bnds, n=args.num_iter) results_lipo[sim,:] = lipo_output['loss'] results_prs[sim,:] = prs_output['loss'] From 737697e5a695007a460637ac22007831f93128e5 Mon Sep 17 00:00:00 2001 From: bradleypick Date: Sun, 13 May 2018 18:54:37 -0700 Subject: [PATCH 07/17] add objective functions used in paper --- src/objective_functions.py | 49 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 src/objective_functions.py diff --git a/src/objective_functions.py b/src/objective_functions.py new file mode 100644 index 0000000..36872c4 --- /dev/null +++ b/src/objective_functions.py @@ -0,0 +1,49 @@ +""" +Objective functions and domains for comparing the sequential algorithms +""" + +import numpy as np + +def holder_table(x): + """x is a numpy array containing two numbers""" + if x.shape != (2,): + raise ValueError('Input array should be shape of (2,)') + inside_exp = np.abs(1-np.sqrt(x[0]*x[0]+x[1]*x[1])/np.pi) + return np.abs(np.sin(x[0])*np.cos(x[1])*np.exp(inside_exp)) + +holder_bounds = [(-10,10),(-10,10)] + +def rosenbrock(x): + """x is a numpy array containing three numbers""" + if x.shape != (3,): + raise ValueError('Input array should be shape of (3,)') + first = 100*(x[1] - x[0]**2)**2 + (x[0] - 1)**2 + second = 100*(x[2] - x[1]**2)**2 + (x[1] - 1)**2 + return -np.sum(first + second) + +rosenbrock_bounds = [(-2.048,2.048), (-2.048,2.048), (-2.048,2.048)] + +def sphere(x): + """x is a numpy array containing four numbers""" + if x.shape != (4,): + raise ValueError('Input array should be shape of (4,)') + return -np.sqrt(np.sum((x - np.pi/16)**2)) + +sphere_bounds = [(0,1), (0,1), (0,1), (0,1)] + +def linear_slope(x): + """x is a numpy array containing four numbers""" + if x.shape != (4,): + raise ValueError('Input array should be shape of (4,)') + coef = np.array([10**((i - 1)/4) for i in np.arange(4)]) + return np.sum(coef*x) + +linear_slope_bounds = [(-5,5), (-5,5), (-5,5), (-5,5)] + +def deb_one(x): + """x is a numpy array containing five numbers""" + if x.shape != (5,): + raise ValueError('Input array should be shape of (5,)') + return (1/5)*np.sum(np.sin(5*np.pi*x)**6) + +deb_one_bounds = [(-5,5), (-5,5), (-5,5), (-5,5), (-5,5)] \ No newline at end of file From 0b390aa0be680af56e2f98943f3569a8e633009b Mon Sep 17 00:00:00 2001 From: bradleypick Date: Mon, 14 May 2018 19:40:46 -0700 Subject: [PATCH 08/17] add links to papers describing other algorithms --- README.md | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 38b3cd6..d35bd58 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,29 @@ # lipo-python -Implementing [Global optimization of Lipschitz functions](https://arxiv.org/abs/1703.02628). +Implementing Global optimization of Lipschitz functions + +## Resources + +[Global optimization of Lipschitz functions](https://arxiv.org/abs/1703.02628). + +[BayesOpt](https://arxiv.org/abs/1405.7430) + +R. Martinez-Cantin. BayesOpt: {A} Bayesian Optimization Library for Nonlinear Optimization, Experimental Design and Bandits. CoRR. 1405.7430. (2014) + +[CMA-ES - Covariance Matrix Adaptation Evolution Strategy](https://www.researchgate.net/publication/227050324_The_CMA_Evolution_Strategy_A_Comparing_Review) + +* N. Hansen. The CMA Evolution Strategy: A Comparing Review. In J.A. Lozano, P. Larrañaga, I. Inza and E. Bengoetxea (Eds.). Towards a new evolutionary computation. Advances in estimation of distribution algorithms. Springer, pp. 75-102 (2006). + +**IS ABOVE POINTING AT THE CORRECT PAPER?** + +[CRS - Controlled Random Search with Local Mutation](https://link.springer.com/article/10.1007/s10957-006-9101-0) + +* P. Kaelo and M. M. Ali, "Some variants of the controlled random search algorithm for global optimization," J. Optim. Theory Appl. 130 (2), 253-264 (2006). + +[DIRECT](https://link.springer.com/article/10.1007/BF00941892) + +* D. R. Jones, C. D. Perttunen, and B. E. Stuckmann, "Lipschitzian optimization without the lipschitz constant," J. Optimization Theory and Applications, vol. 79, p. 157 (1993). + +[MLSL - Multi-Level Single-Linkage](https://link.springer.com/article/10.1007/BF02592071) + +* A. H. G. Rinnooy Kan and G. T. Timmer, "Stochastic global optimization methods," Mathematical Programming, vol. 39, p. 27-78 (1987). (Actually 2 papers — part I: clustering methods, p. 27, then part II: multilevel methods, p. 57.) + From d8ec81fe8524f07493035c061c588bff124adf95 Mon Sep 17 00:00:00 2001 From: bradleypick Date: Sun, 20 May 2018 16:18:14 -0700 Subject: [PATCH 09/17] change imports and create dictionaries of optimizers/objectives --- src/__init__.py | 3 ++- src/objective_functions.py | 10 +++++++++- src/sequential.py | 11 ++++++++++- 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/src/__init__.py b/src/__init__.py index 47308d9..ac90ca2 100644 --- a/src/__init__.py +++ b/src/__init__.py @@ -1,2 +1,3 @@ from . import sequential -from . import plotting \ No newline at end of file +from . import plotting +from . import objective_functions \ No newline at end of file diff --git a/src/objective_functions.py b/src/objective_functions.py index 36872c4..21c0fde 100644 --- a/src/objective_functions.py +++ b/src/objective_functions.py @@ -46,4 +46,12 @@ def deb_one(x): raise ValueError('Input array should be shape of (5,)') return (1/5)*np.sum(np.sin(5*np.pi*x)**6) -deb_one_bounds = [(-5,5), (-5,5), (-5,5), (-5,5), (-5,5)] \ No newline at end of file +deb_one_bounds = [(-5,5), (-5,5), (-5,5), (-5,5), (-5,5)] + +synthetic_functions = { + 'Holder Table' : {'func': holder_table, 'bnds': holder_bounds}, + 'Rosenbrock': {'func': rosenbrock, 'bnds': rosenbrock_bounds}, + 'Sphere': {'func': sphere, 'bnds': sphere_bounds}, + 'Linear Slope': {'func': linear_slope, 'bnds': linear_slope_bounds}, + 'Deb N.1': {'func': deb_one, 'bnds': deb_one_bounds} +} \ No newline at end of file diff --git a/src/sequential.py b/src/sequential.py index 2abd3c0..db2428f 100644 --- a/src/sequential.py +++ b/src/sequential.py @@ -86,7 +86,11 @@ def pure_random_search(func, bounds, n): } return output -def adaptive_lipo(func, bounds, n, k_seq=np.logspace(-10,10,10000), p=0.5): +def adaptive_lipo(func, + bounds, + n, + k_seq=np.array([(1 + (0.01/0.5))**i for i in range(-10000, 10000)]), + p=0.1): """ Parameters ---------- @@ -154,3 +158,8 @@ def adaptive_lipo(func, bounds, n, k_seq=np.logspace(-10,10,10000), p=0.5): 'y': np.array(y) } return output + +optimizers = { + 'Adaptive LIPO': adaptive_lipo, + 'Pure Random Search': pure_random_search +} \ No newline at end of file From d52a8ff475d14c56245682e9e67ff3d3579c4ec7 Mon Sep 17 00:00:00 2001 From: bradleypick Date: Sun, 20 May 2018 16:18:49 -0700 Subject: [PATCH 10/17] start on script to replicate results from paper --- src/synthetic-comparison.py | 53 +++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 src/synthetic-comparison.py diff --git a/src/synthetic-comparison.py b/src/synthetic-comparison.py new file mode 100644 index 0000000..5df3276 --- /dev/null +++ b/src/synthetic-comparison.py @@ -0,0 +1,53 @@ +#!usr/bin/env python + +# Script to replicate the results of the numerical +# +# Very limited at this point, but its a start +# +# Usage: python comparison.py filename='imagename.png' [--num_sim, --num_iter] + +from sequential import optimizers +from objective_functions import synthetic_functions + +import numpy as np +import argparse +import pickle +from collections import defaultdict + +parser = argparse.ArgumentParser() +parser.add_argument('--filename', type=str) +parser.add_argument('--num_sim', type=int, default=20) +parser.add_argument('--num_iter', type=int, default=100) +args = parser.parse_args() + +def main(): + + results = recursive_dd() + + # loop over our sequential algortihms + for optimizer_name, optimizer in optimizers.items(): + # loop over the objective functions + for synthetic_name, synthetic_obj in synthetic_functions.items(): + # perform specified number of simulations + for sim in np.arange(args.num_sim): + + out = optimizer(func=synthetic_obj['func'], bounds=synthetic_obj['bnds'], n=args.num_iter) + + results[optimizer_name][synthetic_name][sim] = out + + # serialize + # note that if you want to load this serialized object you + # need to have recursive_dd defined on the other end + with open(args.filename + '.pickle', 'wb') as place: + pickle.dump(results, place, protocol=pickle.HIGHEST_PROTOCOL) + + +def recursive_dd(): + return defaultdict(recursive_dd) + +if __name__ == "__main__": + main() + + + + From 64da7578b0f4bbc3e72bb535c97da7155293f1f7 Mon Sep 17 00:00:00 2001 From: bradleypick Date: Mon, 21 May 2018 13:41:50 -0700 Subject: [PATCH 11/17] working on script to generate the bottom half of figure 5 --- src/fig-5-generator.py | 62 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 src/fig-5-generator.py diff --git a/src/fig-5-generator.py b/src/fig-5-generator.py new file mode 100644 index 0000000..846d83a --- /dev/null +++ b/src/fig-5-generator.py @@ -0,0 +1,62 @@ +#!/usr/bin/env python + +from sequential import optimizers +from objective_functions import synthetic_functions + +import numpy as np +import argparse +import pickle +from collections import defaultdict + +parser = argparse.ArgumentParser() +parser.add_argument('--filename', type=str) +parser.add_argument('--target', type=float) +args = parser.parse_args() + +def main(): + + with open(args.filename + '.pickle', 'rb') as stuff: + results = pickle.load(stuff) + + table = recursive_dd() + + # loop over our sequential algortihms + for optimizer_name, optimizer in optimizers.items(): + # loop over the objective functions + for synthetic_name, synthetic_obj in synthetic_functions.items(): + + N = len(results[optimizer_name][synthetic_name]) + M = len(results[optimizer_name][synthetic_name][0]['y']) + cur_array = np.zeros((N, M)) + for sim in np.arange(N): + cur_array[sim,:] = results[optimizer_name][synthetic_name][0]['y'] + + # compute the target value we are looking for + # more thought needed here - the maximum is computed using the results + # according to the paper and the avg is computed by Monte Carlo + cur_max = synthetic_obj['maximum'] + cur_avg = synthetic_obj['avg'] + target = cur_max - (cur_max - cur_avg) * args.target + + # find the number of iterations it took to reach target + # note: shouldchange the hard coded 1000 to passed argument + loc_pass_target = np.argmax(cur_array >= target, axis=1) + loc_pass_target[loc_pass_target == 0] = 1000 + + # add the computed results to the dictionary that we will + # serialize and/or reformat to csv for writing + cur_results = {'mean': np.mean(loc_pass_target), 'std': np.std(loc_pass_target)} + table[optimizer_name][synthetic_name] = cur_results + + # serialize + # note that if you want to load this serialized object you + # need to have recursive_dd defined on the other end + #with open(args.filename + '.pickle', 'wb') as place: + # pickle.dump(results, place, protocol=pickle.HIGHEST_PROTOCOL) + + +def recursive_dd(): + return defaultdict(recursive_dd) + +if __name__ == "__main__": + main() \ No newline at end of file From 4cbd391337235016cc720a301667c3afa2a593f1 Mon Sep 17 00:00:00 2001 From: bradleypick Date: Thu, 24 May 2018 08:02:59 -0700 Subject: [PATCH 12/17] script to generate figure 5 working but doesn't match paper --- src/fig-5-generator.py | 77 +++++++++++++++++++++++++------------- src/objective_functions.py | 2 +- 2 files changed, 52 insertions(+), 27 deletions(-) diff --git a/src/fig-5-generator.py b/src/fig-5-generator.py index 846d83a..5ee6705 100644 --- a/src/fig-5-generator.py +++ b/src/fig-5-generator.py @@ -9,50 +9,75 @@ from collections import defaultdict parser = argparse.ArgumentParser() -parser.add_argument('--filename', type=str) +parser.add_argument('--inputfile', type=str) +parser.add_argument('--outputfile', type=str) parser.add_argument('--target', type=float) args = parser.parse_args() def main(): - with open(args.filename + '.pickle', 'rb') as stuff: + with open(args.inputfile , 'rb') as stuff: results = pickle.load(stuff) table = recursive_dd() - # loop over our sequential algortihms - for optimizer_name, optimizer in optimizers.items(): - # loop over the objective functions - for synthetic_name, synthetic_obj in synthetic_functions.items(): + # getting the maximum observed values for each test function + # as outlined on page 17-18 of the paper + for synthetic_name, synthetic_obj in synthetic_functions.items(): + all_max = [] + for optimizer_name, optimizer in optimizers.items(): + N = len(results[optimizer_name][synthetic_name]) + for sim in np.arange(N): + all_max.append(np.max(results[optimizer_name][synthetic_name][sim]['y'])) + synthetic_obj['maximum'] = np.max(all_max) + + # monte carlo estimate of the average value in the domain + # as outlined on pagge 17-18 of the paper + num_samples = 10**6 + + for synthetic_name, synthetic_obj in synthetic_functions.items(): + + bound_mins = np.array([bnd[0] for bnd in synthetic_obj['bnds']]) + bound_maxs = np.array([bnd[1] for bnd in synthetic_obj['bnds']]) + + u = np.random.uniform(size=(num_samples, len(synthetic_obj['bnds']))) + x_samples = u * (bound_maxs - bound_mins) + bound_mins + + y_samples = np.apply_along_axis(synthetic_obj['func'], axis=1, arr=x_samples) + synthetic_obj['avg'] = np.mean(y_samples) + + + for synthetic_name, synthetic_obj in synthetic_functions.items(): + for optimizer_name, optimizer in optimizers.items(): N = len(results[optimizer_name][synthetic_name]) M = len(results[optimizer_name][synthetic_name][0]['y']) cur_array = np.zeros((N, M)) for sim in np.arange(N): - cur_array[sim,:] = results[optimizer_name][synthetic_name][0]['y'] - - # compute the target value we are looking for - # more thought needed here - the maximum is computed using the results - # according to the paper and the avg is computed by Monte Carlo - cur_max = synthetic_obj['maximum'] - cur_avg = synthetic_obj['avg'] - target = cur_max - (cur_max - cur_avg) * args.target - - # find the number of iterations it took to reach target - # note: shouldchange the hard coded 1000 to passed argument - loc_pass_target = np.argmax(cur_array >= target, axis=1) - loc_pass_target[loc_pass_target == 0] = 1000 - - # add the computed results to the dictionary that we will - # serialize and/or reformat to csv for writing - cur_results = {'mean': np.mean(loc_pass_target), 'std': np.std(loc_pass_target)} - table[optimizer_name][synthetic_name] = cur_results + cur_array[sim,:] = results[optimizer_name][synthetic_name][sim]['y'] + + # compute the target value we are looking for + # more thought needed here - the maximum is computed using the results + # according to the paper and the avg is computed by Monte Carlo + cur_max = synthetic_obj['maximum'] + cur_avg = synthetic_obj['avg'] + target = cur_max - (cur_max - cur_avg) * (1 - args.target) + + # find the number of iterations it took to reach target + # note: shouldchange the hard coded 1000 to passed argument + loc_pass_target = np.argmax(cur_array >= target, axis=1) + loc_pass_target[loc_pass_target == 0] = 1000 + + # add the computed results to the dictionary that we will + # serialize and/or reformat to csv for writing + cur_results = {'mean': np.mean(loc_pass_target), 'std': np.std(loc_pass_target)} + table[optimizer_name][synthetic_name] = cur_results # serialize # note that if you want to load this serialized object you # need to have recursive_dd defined on the other end - #with open(args.filename + '.pickle', 'wb') as place: - # pickle.dump(results, place, protocol=pickle.HIGHEST_PROTOCOL) + with open(args.outputfile + '.pickle', 'wb') as place: + pickle.dump(table, place, protocol=pickle.HIGHEST_PROTOCOL) def recursive_dd(): diff --git a/src/objective_functions.py b/src/objective_functions.py index 21c0fde..1cae4ac 100644 --- a/src/objective_functions.py +++ b/src/objective_functions.py @@ -54,4 +54,4 @@ def deb_one(x): 'Sphere': {'func': sphere, 'bnds': sphere_bounds}, 'Linear Slope': {'func': linear_slope, 'bnds': linear_slope_bounds}, 'Deb N.1': {'func': deb_one, 'bnds': deb_one_bounds} -} \ No newline at end of file +} From eb8f7532ac61c7509f2fbda2bc98488f6ba6b163 Mon Sep 17 00:00:00 2001 From: Bradley Pick Date: Thu, 24 May 2018 10:51:28 -0700 Subject: [PATCH 13/17] change format and add citation to LIPO paper --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index d35bd58..482e854 100644 --- a/README.md +++ b/README.md @@ -5,9 +5,11 @@ Implementing Global optimization of Lipschitz functions [Global optimization of Lipschitz functions](https://arxiv.org/abs/1703.02628). +* C. Malherbe and N. Vayatis. "Global optimization of Lipschitz functions". ICML. 2314 - 2323. (2017) + [BayesOpt](https://arxiv.org/abs/1405.7430) -R. Martinez-Cantin. BayesOpt: {A} Bayesian Optimization Library for Nonlinear Optimization, Experimental Design and Bandits. CoRR. 1405.7430. (2014) +* R. Martinez-Cantin. BayesOpt: {A} Bayesian Optimization Library for Nonlinear Optimization, Experimental Design and Bandits. CoRR. 1405.7430. (2014) [CMA-ES - Covariance Matrix Adaptation Evolution Strategy](https://www.researchgate.net/publication/227050324_The_CMA_Evolution_Strategy_A_Comparing_Review) From 0de5b5cf5bfe2a38ffd522e8c07a6c4bef7fd8ca Mon Sep 17 00:00:00 2001 From: Bradley Pick Date: Thu, 24 May 2018 19:52:53 -0700 Subject: [PATCH 14/17] try to get a docker container working - work in progress --- Dockerfile | 10 ++++++++++ requirements.txt | 2 ++ 2 files changed, 12 insertions(+) create mode 100644 Dockerfile create mode 100644 requirements.txt diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..506a444 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,10 @@ +FROM ubuntu:latest + +WORKDIR ./home + +COPY . ./ +RUN apt-get update && \ + apt-get -y install python-pip && \ + apt-get install python3 + +RUN pip install -r requirements.txt diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..fff3b84 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,2 @@ +numpy==1.14.2 +scipy==0.19.1 \ No newline at end of file From f28bdb6a2b8c08e01f53de85c0868e3eb67db4e3 Mon Sep 17 00:00:00 2001 From: Bradley Pick Date: Thu, 24 May 2018 19:53:20 -0700 Subject: [PATCH 15/17] bash script containing commands to generate results --- run.sh | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 run.sh diff --git a/run.sh b/run.sh new file mode 100644 index 0000000..0cae8f2 --- /dev/null +++ b/run.sh @@ -0,0 +1,7 @@ +python src/synthetic-comparison.py --filename=data/simulation_results --num_sim=20 --num_iter=100 + +python src/fig-5-generator.py --inputfile=data/simulation_results.pickle --outputfile=aggregate_results90 --target=0.9 + +python src/fig-5-generator.py --inputfile=data/simulation_results.pickle --outputfile=aggregate_results95 --target=0.95 + +python src/fig-5-generator.py --inputfile=data/simulation_results.pickle --outputfile=aggregate_results99 --target=0.99 \ No newline at end of file From a2c52621b45425465610bf8ad0c072977e9fcc14 Mon Sep 17 00:00:00 2001 From: bradleypick Date: Thu, 24 May 2018 20:23:20 -0700 Subject: [PATCH 16/17] add writing of csv results for easy viewing --- src/fig-5-generator.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/fig-5-generator.py b/src/fig-5-generator.py index 5ee6705..2b8e09a 100644 --- a/src/fig-5-generator.py +++ b/src/fig-5-generator.py @@ -6,6 +6,7 @@ import numpy as np import argparse import pickle +import pandas as pd from collections import defaultdict parser = argparse.ArgumentParser() @@ -79,6 +80,16 @@ def main(): with open(args.outputfile + '.pickle', 'wb') as place: pickle.dump(table, place, protocol=pickle.HIGHEST_PROTOCOL) + csv_table = recursive_dd() + for optimizer_name, contents in table.items(): + for func_name, results in contents.items(): + csv_table[optimizer_name][func_name] = str(results['mean']) + ' +/- {0:.01f}'.format(results['std']) + + df = pd.DataFrame.from_dict(csv_table).T + df = df[['Holder Table', 'Rosenbrock', 'Linear Slope', 'Sphere', 'Deb N.1']] + + df.to_csv(args.outputfile + '.csv') + def recursive_dd(): return defaultdict(recursive_dd) From eb1dd760c7e0f15f0f2e8beb95e2afa21eb1e036 Mon Sep 17 00:00:00 2001 From: bradleypick Date: Thu, 24 May 2018 20:24:17 -0700 Subject: [PATCH 17/17] add csv of final results to show Mike --- data/first_comparison90.csv | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 data/first_comparison90.csv diff --git a/data/first_comparison90.csv b/data/first_comparison90.csv new file mode 100644 index 0000000..955f35a --- /dev/null +++ b/data/first_comparison90.csv @@ -0,0 +1,3 @@ +,Holder Table,Rosenbrock,Linear Slope,Sphere,Deb N.1 +Adaptive LIPO,200.16 +/- 173.5,118.72 +/- 310.0,773.44 +/- 318.0,688.73 +/- 347.3,961.7 +/- 159.1 +Pure Random Search,171.04 +/- 160.6,158.46 +/- 353.6,747.1 +/- 347.1,717.49 +/- 344.8,939.76 +/- 198.3