From acbe80511890e97bfd0d7e2fb48358bb2c3e2c75 Mon Sep 17 00:00:00 2001 From: ron-matt163 Date: Tue, 3 Dec 2024 16:04:19 -0500 Subject: [PATCH] Rohan's brick breaker init --- .targetgames | 3 +- .../hw5_rohan_brick_breaker/assets/ball.png | Bin 0 -> 44212 bytes .../hw5_rohan_brick_breaker.cpp | 350 ++++++++++++++++++ .../hw5_rohan_space_invaders.cpp | 2 +- 4 files changed, 353 insertions(+), 2 deletions(-) create mode 100644 src/games/hw5_rohan_brick_breaker/assets/ball.png create mode 100644 src/games/hw5_rohan_brick_breaker/hw5_rohan_brick_breaker.cpp diff --git a/.targetgames b/.targetgames index 019d241..7d796c4 100644 --- a/.targetgames +++ b/.targetgames @@ -1,4 +1,5 @@ hw4_joshua hw4_rohan hw4_mitesh -hw5_rohan_space_invaders \ No newline at end of file +hw5_rohan_space_invaders +hw5_rohan_brick_breaker \ No newline at end of file diff --git a/src/games/hw5_rohan_brick_breaker/assets/ball.png b/src/games/hw5_rohan_brick_breaker/assets/ball.png new file mode 100644 index 0000000000000000000000000000000000000000..229e3d6164d3c2e2efe64052189156083b906ebb GIT binary patch literal 44212 zcmX_H18`(runsoX#5@h*vxylRr`erUDD+mTw`xoKe5DGK~ zcUBS?0;`@PI01RyD9EUYf{b5ZUmy(e(TEG!7WzP=I>5q*Ase*5-qZ*LF$f92)n1p)#Bv=9#u@9pgk9v&WqNl8hOk&*B2 z?nXvNo}Qk*fB$}be0+9x=I7_>0(9lqj1(X{|CnqO^G^n(!tgQdCnwXgQ_3IbN`2SK}UHu;hG4da%t*r&ISz1~O z8iI%bmG=0*0;1_Zhw}3B^z`(GhKBa`_Q=RcP-39@qobq$Wrss`B*obZ~G0 z8EI*0LA^~#NchhIq{qg_KpMpL?(QxKEH5wb?CgNR)YKHHGebi|AR<7FhlhuQR@vFv zfsTZ_y1JK_S5#Egz`y{g?I33u7#PsOkdTmwiHXstK4=G-9$b{^kVkuV)y8FckJ?P`}qCj?cx65ZmDnmW^%f}fAe6tzkhXb=(4|evU|8^dS-T@ zyLWk@cXYXDba>*muV-}Zy!Wza{GfY#{$*#ce_*zE330Q3VrXHp|D*c>*fZWUwXi)l ze=@TMe3-`_9lSZ{g&G>!yz1#&o$J}}?!GwVxtr*vv+n_RqxEzj_CC+|jCFVSCEo1y zUJv@;PmGw|j}4Ko_d@8hMozcZ4Js7QJWl*s>REkQlI0BqujK8wb` zM0&C_#@~wtH;x2XM#2d?A;h2O4c_DhMyu4iBcuM{`L44w$2dkuUekTMBY)X|MDhAGUeo!e$J&)+ z>v37Q#N>yU_b*RIbhJNopJC+cw<~byHkMUdxZ!5;^l5yl+iGZumB!xp;S;7RDZuel za=5%hPhH48w=Wv<))~~&fnoS$uYx(--r_HmP_shSc zDhk61Q~I%Y#jpcw=s5}NzcKs-EKW}!3#q3fIU}NLQ1sr8TMsG!!0UF^bn!(smIRJT zx0ymI?a#sFaMG)s3Df|5F`Y%;%+AA>_&xr4Fy;`+KD=9ZXELYZ{Z=9_@?Q^wx1J*F z+k-5$N~I{=!n^K&ILb8Emk&t)d=0~iDu3#<4B5muSo={m%sFgy4^{!4#m_E>jVH{y zB>Rrs+w>Opqid#vO;&x#_g>1MKn0h*QByKyF_u2_50U?bHj0>1kNLjxE2WX|TRb;J zo70c(H5(Up(W|SMrB71M^3X=v_Q6mTGPl0e(4><&zH=BTYA;uBJSnI zr2W<WXWUH+zzxz8@3o*>7U%@>O2HmZHJTI2+rR>(FER zKUpCP7&#-q_4?4B4X8KJf9?&M*|aj3|Bg#j6>R4*+>Ia*P@?fgtyMAPs; zkDOd~lEuE>K%p!<-DKjD$cXSjFRDS-OO;1hwvuCLllgw%D1ln;^lH{-+4_OM zldl{_on1gcT_`K12)H-y&#XOAs=KW~QE=ufD$&MKY^iIc&RwN#Js{CRGV6Ax0bU|7 zp|)_E*Kl4%$R%TMid(9#Nf%(nuW_)iTOLTpDruZ!KdRJi7Kl;Z%G99nTgKXRPwIVz zSs=*BEHzKv9bx>0uP}-)bn64ICpW48GEwZ!+FVzRuVJrXG}ln8k*FWvbFFFMrW#ta zK~hPmYkG|4=eIfhi%KD0vmIo8w>T$e*^#+i*+jtP_oXltY$?mFg*CN<)QFa_2XnK8 z=PR^Qp->6U_Y=_p&A5}sTOD!%wEz#}c z?e_PT5I=VB)|(t!kKoa+A7urz1`ZpW3%zdxXe`m$laL~`5}UO(*ar&mSlsMLk7!X2 z+2yaA5?!p?==dFs#97=7yh!a{AKK|N!40T2vPBIW^Co0IU_Vu@MDM-tB!CFV8#(Vq zzTUqc13vA4DKg*aJ-z=6rkm4Io7!^Rk21~_H1K+n_*Ov*H8Cb*{F#1XN}w*>%E+jL z!WjjrW|ShFH68D5QL*@N$U@xSXZ8F?LdSrH;XrNMiXc@q{a=M%7^GTq&@ZSf;|~6l zPv3e%drl3?Qb&!*QcHgOJp`-~RWrhQ^LFQ+jALeM7e({mbq9C0&Jllg4KTO#wwW|I z>TKv!qM|f_r@#I}0>NO0IK7*1naDnN?k4j9?3IB)Ml^Nf7!D#FStHIg#w0-lTX&0V z1{WxM>)BimapKCPCy|K5X!`-lR?=u_FBJoaVxE4KY++oelpPl4AT(vlUy(JL`KBQq z9-0FPw$w571jej%LqIs_>5o2_+_XVTI&oey*Q734h3MX>kl~vXuSu|cWEui?Rk8uN`v)OLMmMUq~BJ zM`h>gUx+4!D0-F$5iU+NCkd^!_%^}$P=AkAltoZ#`2lgA_RBTr>cr^fx*Ii|;(IY` z=l$VhmSbsFy>TkH>`~1ecn4S(*8}&f5iic+ZDKa)@m%H0`jgw@5?=A{nVRfHw+SO= zC@VsBowhl}nPRJnAAv;3W=>F#0l_$ECNGgEf>EtY?GqS!@BdZ=DH4}N8TnGad)RLF z_w@SQGdM7Ytuu%1mix!JGe*?a+Z4j3WJjzuFkJ9i_0;F**+1QaYzjv2}zkg>q}= znV8F;WLOQO>7wr^5SNZVrmUVS-hzsXcOpu84U0^^y_dPPv8J>nv#e1fC(0E96hO0M zy8X_YOxEzofJc;5{L~05H9+TP!epR$wB2(3F_i1T)N`eNi(NsCGNASP&QsIXSRq1)-at*JfHlH8xC}2o#68%hw)yv8HhT_J}aBe zsfpqMTPri=Mo`nsez_gdh7%F!_V)$@c3m>Y2kEl^^<~(db*wATIv--4^=iO+OBqN zDcL)VA?DO|thX)bQj*=|n7G-2HF@u-gvg6F1I|+<88{4d3+)YgzsuJ(Un7T;i7owl zn7pS^c8P+Az+qz|+Roys~~s zc`Jo{hIeb{yqa0`>bWcSoZYh4G~@_JWung`f-E1J9b2> z@QvLJJE$g$ro%+U9XNmBx}m6d1ty3z58*|gT>Tp&?vN@SCJLphm3JLa*D)TtEFmcguykH@8>wCfNATq?GEkMH<*a{ zgPUDetPY{W(P3lZsDI8HSbAC6>cNdYVaJ?*T81v7bimX@L`@gG4-J7*aiV_Dh{@qG zq7{_T+ZZA4nC<)zwO)STECTG={E<`4urJ}^E3!qe?4f^!`OFbj)%y9FIdP3}qyG!;L)SQ(W4mqhGg$qqCYc=MI-~8>2tw#I%zPpGp=&Fn#^>3OD!7y&*_Fn=jp* z(TYe@7k%CY7>Z`Fn%mF_T)1$$l&iDIuF*i+$#iU+*%;w*yIT1*4>u0ixcOrN*T0Ro z%aEkdH$Sf_6S@CE{)cxSJ3ZD~>*1-KA&f<>ZA+3GT698=yC!HCbIe`qiXEBpG_+>? zK0A4pl_b6Msj?*9ol3v{IwD#g4X(7A)d*n(U5}WfW90HXY1Tm1K`o6z)bO+Nw-QH% zu!XVa_S1dl^%cB~;z8Fbv*Xdy^z$Bn{*l29HH}HVU}_zq18XD%VF2BgYL6K6VCvGQ zxL(e0vELA(cB(P^9!<`0Ii(B1en&ng7R5$Nmso5PF;lm`Gwx<_)l9@c8!){{MQtzJ zmkUtUxcijE@BI5;&3b!ojtZFp1+x0;FAOXp&_Q59IuqRan8N}M8HzxuD}yEpON{#JnX=8?A^^YEHZx-=0c#$ zwOnV~ghhDt>Bf#ZjIPg{GGCFHLv%$?Y#%P(^!sJ-7Pogl=(i=_Io5J|Pg z-XP{~sIgd-YdtfC+u4YVn`KK@T@ITHj-cmY9jlMpQA{_SI3#`Wi!LULhhKGShgvAw zv;>-akif2NgJDZ-Qo`+LRIQ+|3s-eP%LHabC~|y06xP_{Pc^mAf3}2{>=9Fi@U2Sk zXY#0$Vk5iJK$Bh(+}%-=T7ICCF+-+fwiv$yTXh{*<#W6UJ=RE1UtP@a%fUaw2Y&<( zZar4^4&ii=9^d2GxZpx80F_c&BL zIWxr7n6UxRkN;@41?z%@=PnwhYy?%MJQI5{IUPe>{57i(IXe=Sp19D$%IW80)u7Wh zdFuHygw?Q_R9^d)zta)Ys}xOf8`g-nO%Fl6u@mYj9=yUA%omTq32oXuPmdmJe;S*e zzbrYrGg-D6a|Q!Foe@hZ`3ctc9Vyw&0OYt018}-lRU2^J2=qD3IlReg7L!QDj?>}& zx@SwoS&q)Hx1n2)Fb-jjHh_-SJ?1C|`|7+`Vp#%BVmokI{!h&XCA^k0QKCuc)K-lS`k|(1dR|l_#uHtYGqDtr?~9gshSCx810v z5l8+k4cZ9>G*;J*aPe^(!eR4j*I?J3qdFBV|6h0n``Z!E*dG}q0{yG`DdMXuB~jnB zJcIwVL+Ew%cffJ(lWp8vJ66IIzgyAsnAIG2>SCF4&;>}LSnam&ID30Czjr0cD_G4h zPB^26Bc1Zf`(@+^D*n^?b!L;;u)Vb( zM9-a|lr@XxHBu4}6L+4u?PA&(xv{|#K7z~Mu-U1AlL}GZaXs9y|Aynb?8Pg1dkBTj zd>GV<^L}NV$x@9at^L8$I1JUKGp7=YcYJ1|W9m5MimJI*!NRmIFr^n0uAWvAG-B9v zvs%qM@zv3TqFpA42RB-r?kmf2dJUofmsh-L_wK<)hnnhs1b9yq#@opn=221lTSrlk z;Jfn(wJ`=sk5XQ?5Aq3O*s?(MLV$N>NvhW8>9FoasVt(V{jDl`)gGW*wXRp<@P~TH zjLS4vVCPILm70kBZxXrn`S8-qQKV!WlmU8k@Gj0Yyjy zlZu`NiueZ|e=T_*DrvDkH1{*`UwebAwwN8BJOvh7nh-C*x`_SGIwLmY>@@Mf`*8dS z{%^9EE?h}JF6!@RM23-zp6A#zKJ(xXko0$V5lg0|nm7dezi7AsKCqG#(`UPQOcvLc&3(5_^3?L^Q;(%3f4a-hdWwRoJpJfta%bP_T{hd2X7olvTAW&LI zX94BvhFLR&TT9-7SsV4cyjl-Y?Ti>|kkZGZxgkV5tNgV4%k4=w$t{jf^tGw4M&P!k zV$aTT>JHj){c3K>U*@mvwLpD4tCwDkU(#GrCL?yt)~j~iS2KK7=xkQ#t~Z(87+SKY z&ayCfot1PhJ%7^j>K*#omck+LSE77v7=QN^)HzLu7huZ99Q%fN|A^e$EH z?VypS^{(L)wAbL$VeHtLp?hTc+HV2fzE^36&g<(br=?xK%BQ1bWzj~zZ2^rnyOI z7q=}+>UkC3g^XopWBi`A3uRD!)Z)mw~8rG{5)U zLmJV?R>SrzBf%(JLvC`1@z2VmmyVb+kt!q4_V;>CyFmWCbREr#D3rpzRn`G|Lo)Pt z0omq-KqUran*QF4d2Y2AzE0|#f*9mt4ko+o{^acr6k-1@5*{O3bm43yKiQ|2a<$az zF28K&+~h|<2<@sd{R)LvK@h#flG!nV0__;h&$`w8r86L|6(hgpZ@(WU2E)209CC(w zr%+!X^0CmwCw=Hjzm4v`iAuGF7DN1_V`z$Tv=^_(Ts~g^jZfb8mT?UYNHiIQq>=ePEp`d--b`$XiMSMb8;Fzlw!L5tIo}*ddW0(Gafy znOo?TJxYzZbcJ*(u$H1^aq&tY5UKq;qcB^fK4mFYXJQW$n~~GIK6!`;Yovr6i^8&W z#*@pFn+r=iHbAR@X(-w^bCgV)w? zB3xty^EK@bWW!g|#S=KvE0=uw}og9x(~WHWov#y zK9bJmS4CsOt;F3BHH)d`zNqgNj|4C|xEPJntzR;k^v8NUi>5)y=ank*gR#GCYHuMf zTr#w$;LmcO6gX}KXR! zwZ;>*c5eQ5hxWJ;kk-;(_mG-|l*e{K+A_gEpuytH0$6CxCrBcDP8sT8dceMns z2K_6crhbvTBKlaH+SB8cL6>Zzz&VnV39IF|ob1BoGnZD$E6lm0WfH6igSHACdV8b_ zr-#cny!=E;Q%`R0CtM$P=-@|59ToR0li+a<{WGaT4WNT<&@*Qj)Y(W0pnQC8B~-C? z6}XTqTXX(X$BQm`;H#Yl9)Ctw{8V#dwzR6+0)v-Se%8bN=)q5o^e!2 z=VZ5kt;V%|r);@-329Tn-7Z9ANYRW0N>MvDiV?SbtL`Ej`Qlc1b#!Z&%ebak#&4$W zvC?kG_(r}<`4*na5NU^UpW?3^rY6uZ2&yj=)i ziD>3UJ48Z%n?I1}pv7j*u-!t<6I!>8$zEl(2YA**r(bwe8^ok#7g(yQc!iE2@_u6G z-O!?|YqwPTC^YfcAlYEX&_wd>n*cnv5KN=)u!;f5i?aJ(+Zq1NtrFO9s`GJW(o!5+sA3=pCp<|?QGLp-?=3Jpp8ZpU{@Y&vZV55I>XY*b7{Ng zH5<0-+HJrvWGtU`j+9KXQPPs+)pe}t?PyG|nN(la5m_TCZw zyLqI$cGe1bb=IMV?c**T`TmGeCH93v7);@4?R~5 zpe&WsHG5)EYFZr@feqX|^o6yU_wbXS^~#HqWCUPG`}956c~dcxu->Kddy(x!Q2Zn{(*`9xuq>df9Y8f(or52M?X zAoJlGs%r*M99Ncnamqj-?Gn{XMnLn)Q#zdC#x7Gc5RAF%#L32mnz^MZrw9iQE~5(l zF5B#60!HLuN|A1E#;2m(a%TwabH-B{KA{llkUURJub(t*p%Y=Ku!Lp_v-23SvRmjF zjSp-UDYBd_=u}uq$K~=#gg}Y{-KGZb2+(lQE|q%OT}=3JEMQ(@mc5OlI|Uggp{+O;6H?DteQ|hejJ9kBi|$H_qv{2mg<3}sF)N9MLWWw+X~4&T>i4yPq1_k zvm#XQo4#Zl*by(`uqXX>fa)$JzH2YZFMmr}ht;f%u%tQ|g}!l?R8e?#GHT{a9qB4E z^*v5(oKmhOy*5u~OtKB44x_@GngP#>ue@W-s^!-efU%r(y$HkBUD}qMU@G%s!1?z} z%K|xMY=ss~VybD6maWJ89?wH2#XwgFCeF=gw*tP!E1N)VX^>N>KN}t!4z{l1sDwWw znNI1Q-J^0=MuBkO07J-*)ht<;c|q;Jj9=yg;z$Akm0=J84r)(+WdzF9?g(Kc+c`CP zb+O6|G(64m@^l&J`mSH#Kne3MK0S{ou0fFlzK0<$NLTFaT{mh+9Oe#V$vo)K^dk${ zY3e`~s&yJIS22H6Cejf-1027)*k0abEy+(o9~20bltxJRhsMs8q8~=Arv}t2l9NHz z&itpkWg*;~z`il}Z?_FjO-u_TAikwIB}0hkfy&b)t4fZ5Kf}J;4&o&MQ*T zzJ7G1DUV;W3VUuud-o89`sN-xw}@6Zoj0MYB&FKA-|(qS{sc)i;6@No4^HD0M!nS` z>LO+u8Mj~YlyqEoXm!D@VNmFtR}l4Ie{Ackmq}&#Vp%@F|JBUAp3~i< zzPKvmB39pChPZirB8|p3!cz3>`D3%l?~$ZXMU$Od=V&RwlEz%BK`XXZmJkg0+SIqiYWKrq3moHl|TK-_NLeqo;eMx=*r`v~S zSavpj$;23gs`KNg4-Dm;w(90r&Ma&6P&(-?lIZX|U1?X1VazAmVMCCF+cr6`GoFLC z9<8oGYgVw+i55ETUg*ON;^W8|%j#efH@>s@|2+#Ji+x&p8fK@+3jO0JF+B8GMBOYI zCAB%tl5(oSTE>V}=nKp%q-T)6MbSo}rg1vLc`O2r`{kZz%dW*5kCKq)>rn`KLWDLq zS_BO{muOeij}UXtHVX}?Bo=|oNV8ya<@D|<)uo}ukiUxJ#( z?EDY64NFbf%5off8Rhxf=d|S!`8La6(E4MZz9E_&Rt_!Sga1;agFweCDEuc&0!~2w zJJs)m=9bM5AU~45;(3<=Up+ywxgjXP?iJ`uae8VoB-I!2>kZ$8tzKL>00d56Ta1Qbv}^m@h_RlEbN1V z7KsuSD&`pt-~x3Y9IEBDDy)77ytHfPIgn;)6je%?^V&c@C}U_6BplFYd9!}4r! z522~RWGh{wjsLmi=DQQUEmEa@RXVG&uxX>v`m!pV24$pa-(zxBr!7lMv<#Y<1tR+m zw|A|p9}4-%ZEhzVmNKWe{CwW+rgfUGQt0$N(+(O|I38VEIm_O{I3hb_owsjPW71QxXXe~ZR-$@Adu=5&-g>9$Tzmc9wM229obgMAgmGNh{N{* zt9Fj6T+zy4^)jM@v%E2xftXnnj#w8RbSp+R5T#b=zAqrhr#&^KfAR<%yR9`%x|c=4 z#(~*w!nr8Pvm2ejPUYs?aN1^!Y~zuFBQgFIC{&`TvRhH)jeg|oG#ki9GRLzEV*0K( z%3;p!y-lHvWBwNssawdn`y?=*h|dS@XTHzPX$$zL%a_$DvI=W_%L%&j>lwJ(4~2Lx zTp5}C>Yt(SYxVIKk&J~!S9SW5EQ53H&RgX`KD(7qS~4hR1h)B(O$uG?%r*@F9Il^; z?UawlPYyUgTo3Q6e*;7CR@3;mT%S!JdFA>qP@rQr`fPc7Pbiy&Y+IT}6Evsfv~168 z_eyba`YI~m133ug8L$io=3^=hp3A}turP$X3l1N4v-&!^-P+HfQ)uo0p^KjC&&=6K zs=(%RPP@gnMP*prM_zo+-K$>l>hSd!o>U%O_Z=fS60b z+ov_Yo%~gO#dJ0jF>51_0wzQ;8lI7K@&iOB(e-?wRJX(ZtIc{*CPK44g>p#d^qU9& zLC@Igh?{#x*ut-ADA`6BPuLH>YB`QB`a|C#Y^z+zt#otHdhnwyYc5-F_o#h44^kef zfQaBTA=&lXTJ5vaEy9l64CMF3lWFhO4&0#JOHG;koA2!d&W4)Jn!t4lYDXMgrX5%3-vvit} zT^5a#D!{X>A0<;l#@1c&WEGPf+0mnE8Y^9sutEgaaM9nC2gwt|Qd264@-R%ob8ZGr zw80SM%s5b*_V+Lmc^=1D^D{8V@>|0JI3A%fmD;DL1CZ@VsEdI11?s#1>@4Cyook2Zo4eR z)Tx>3Qdz-6ud;{WH&$*?RUYTC{`y^Jo>50`?rWxqsi*+u8oZT2^8*g>%es$-uB9o- z_Hz(m`bF7P%3g@ffr)-ScnFTZCpDb4b_yMriAqTRwIBi8GBSv;1KA^Xlv37;&9K%Xm*~ujd@NKAn zX2{S#i?cb*CyVXRplkk9s93sK`744QTKh~82swqnkgn6{bBkS`^R*kc5DyNy6P8^2 zL$i1MHT+}QxDTlzd0LN+m2LYfdLblx44vxXz~$CTEI|X>KB>kHDXg-YQF`t6&!aY6 z-;KFlgD$@qnyZ1=1{70|YfnNmt*9x6=pg(dkkBy5sC`dE(ZMfeu@tt}J5Ul>XNP9% zVDr9BEril93tmX~m$)ViKcZ@CXQ(>t&{zYJQ>Amnvs_VR zew8FbQ|xb}lA$d&u11hXU+Z_cDrSwY`4IcyEABGxd)mZB_%o!84+d)3638o5npni7Mi1vp(~c&&yY3Rq)zjn z%nDns5iiC+X-6fLad8TGcm=bJErl!|7yZ^~xHYvK<+#e22Y`pY*Tw;Yn5N@>v`Ti++DE_v?>! zf4r2Y$>8jtAgR+mUE_5Dx%Z3a_d5ohgbUyO~M?{)AilohHaX^wXpCwWy$N=$1GYr1nJNBfSKNplo0W3^7 zzCMO`Z(!)Y@psg<2XqsIu!v~5Y52-@wY2L?!q&dq$~fBAu;1$?55T9)5@sitt=H=0 zvU>GcXo9f(+$a3vK?Ys9PRiFWmz~08f%su*XiO|SD@{P9M?-)mXAk6vhuI&mljTt| z%nWE6D{aF$T^&NJVyQlq3l;^^OLiV9NDWR}tGe|b2&Yt^leV8B>;&SpY2WyrO4(6( zk|J7CbN{G0sK$lsb5o8l{~RzWFE3MRi|3zXduHEiz5e|Na`p`u}+5I<#&XwITjF(xVkuxrs-v zTx)fH$@nScj%$VX$ZHLR)_LEjU;QXc^6IT60VdK~$Mah%gq^2j13++Zl>k%A)1A$^D@Ggtg!lj_SuK2p`eZ)fM<< z(bhco13?B=SB4!SUIrskV}t+;j!~X_wON~s=C4%M2&%madmTiYQD=|SS5QKefYA!8 zo*;C=Rn5PLK8W792D6dxlKit7`=|+1V}nHbw*iX~UPE=gErZg`00FCsDxf}`?nl^w zXM3M7)|#58{Mkq{7Sh>299i>FPK<1eA;fr0Dl)rj7JMaVs}r~Y-gQeMYVMte!WAup z*~BG@KHZ}MT%0yc51Ocx`jTIl&TJRkYKO8KJo)r1so=2*-hYoLu1!g{N61N z)JBSIks~ET*2_?wTP_uVnv1^uXA5EX98n~W{j-&}ydS*9dQZh=cI0Lh z#(4G!*JN>LncF-QSQt0ZllxOcPK7-)Me%NpMTaRc^j#zZ+lW0h3||-zb(F4!PUw*9 zzyXg^WC#2CmBb5vRCfLInWVy0g~gb@MYpgKrRBT{OG!Y#tfre1>09p9JDM*`?pGmA z`wTY3p&qk=@9=0G%qP1K@&bVxr{bRzM>mIRKw`0H_~j(+x|>6i^ycNtS;WuzmfCLp zMDR1rL-RQq;pTu~QUq4Tt$(a=vJ71KJ*E9r9BnS~tPNg!87+VCzp2h9&Q&sO8RgVY zNFi2HC$R&wts!R^)TEf}xOnhy2A(4lStD6$&NhG8*Uv_P;I3#WbvPtnQjcg3 zY30lnBa^TYr8CA_?w~p4lR`iC4nDQMY1mvMkEz91B_oV=OO9CQS;|-7&5PZrHgDvZ z8n_Oj2g4z;J>r%xp)+9P6<&yw?~k?wHRII*SnO&O;ZI!W!BFsC24eRS51t~}0d+3u zX^ph<4|Xk&<7H))3TXJ_0`LsbW}hlAaggMgWALoZa``oaxy&Cuhv@X^D`AzPYr=|4K`Z8*WsL!{&-1J5%8yJTta^OTlp%E{rZ0DEOTKZGl425 zjD(PoleZP{J9zUvY8sW(wT9(=;BLUNu@qfx&+Rr(GOOkfhP-jQ)v>hQhVVG&&pMe5 zAn!@Fj<2HGFRoSh;FfiT@6|S6t_fwl6tTEI`+KcNy7Scx6#(tQd5shA0(<)mF!i{$ zp%Jv8v2Nu*k*jZLn-2Fbr>wzyXg?yIrl*;a8K&tP3LrjI>=NHqqIO`OETf(bSkh3= zA^84oQp#T$z&hW!QN-o}H|Amr|Kc%O-l{(M;spee-<|TO8pRC~bgQk;*M&I#+%Ns}I{|;ylLRKYz} z9Pe838PnmAPFsi`Bd`0d#;mq|V;CJMS-R`JH;%NGGEMDSQwPg}nuV6jXsT?<-atuV zGw^wc4)??PD0;;~bFP)`vzt-1NAjNDhnkPV0Rbz^zk)n$KB+OjRpt%5*w>9d1=2gK z;5xulq|xAYb37>_4T=!M2mZkpAzm3DY_al#Hrwg?1JMcIjYiB19Jm+ia}#_ohoPjk z1<$TX%y=%K=+t7GJ=)b^#;ce`fh60-)0uKKJ?pNH>r#BBREB*8eT%0#v{D8E?aHT2 z)zE!S10}#L<0Yq_jgJlto%F!`tSqiht<4$O1D_!`TkzUioN9Zqwzp)^Fsc*%hh|ur zS|UCQ(u?_GOc9?M=3G0E)HKta&Hz;OEo!3HyZa;!p`)#VC6 z*KzBX?Kv=f`_LWg0Ut2j7vajG#6}2Ynf_4j?PcN<2UU2#0rCdcG<~QCn-MHSViyzp zAIWCIfIkg8`}dre>s)~T^=H7`p&1Z1XKHxd_~xOOlKk?D1{EJC3VOStB4A|yl0p0`!>QVZm|!uK5yLdaTZ#$cak-7dkn99Ko|wL>9;o}l7<{~|?0O`l(UR{UhibkDSo<``h;sVm*}Q-yt50vfm4}- zzjsepF=d$+TB|v4&p$Jd2~tRRuVZP{?I#N5${PVzmVDLz$UHHA_KYs!AH;p*xW}Xo zEJh(!b3O7yCTP)}xyg3K0cHAU+(+MMB?0qkv=gD-qRk|cr$V{V=cDhA2A zfDzk&DPxfrFXR6CL3-7<*XfNrT9dLQj64;aZ-24I zgY73MYfvwl^0u}8X^37|6U=c+>uG@2n`Rn;irfi2LGDeKZ?p>Tj;rmmyIV@?!MWuX zNgYiQF^;ZG?ZMxi{sy3%!KfgjZ7gS)iX(7@1qje|YTaBU1qwFs_PP8`DRt$c6Rqn4 zF;S{N_I#~MoDEJJI^Q%{i|xe%BoatC^zRvRlVik;!2)tJJJzS{o&{6RUOs z@IOrEwT$>uv+YLOUKA-UpBlZ5AywF^>aJ8ymYoK;I#T6{HQcVXMV+{zO^~wm^BsQ| zG3SI2mpfnmT}9W2y#6LcnDVf(_`|4GKlAwsj^*Ev^r} zgXNf3#B};yI`%Y=$osDu%2G&W^Pqsyv+8Y&*!Zw|nq{!8aSUWx5AH3unhtDfKoKrmweUg z$O^&&H|!`lDN<=h{yd0Mz53Q{Cmf|L{UwE5nS!ynO)50fjS<^1kZ|h!bKmoeH7WgtSEc30yoQIL zgv~!Bf*GCx_JD^kQcg{&L*risCn0j3hf~iF(sGH=Zim@fAFO-srq%)bXf-<{sz4J* z0X6~dwTs`GfjR)fxqwGD*2TrB!m#T8mQ>7tLpvp6v+fJ;sK14_ow{TS!pYdb}VcaqBn48xS|o#B^AkGd@mGIKN|sr zG@L1t1JsYA4>QF6jlKME%Nl3WOOU`X*Vd@9mMXn!r~=OBS3QS$5FyJm*YY~o};Zb zn9+tgAR8*wGTn}+etkYMu5At-t||?1XRDSuX@4-E!e8NR1VnL}ZDX)|rvXul+$6%4 zMEar`1>Kuk7la#yqM8|inU*AC9z>5u)y`=%L>aM3(f%bTFYqYFit+T&1kb#q+Gpzs zqgrH*8KJbHtlnYcYG%oERKCc8A{8IT`_T6kyH12df7XJ#0AeKr28j?X02N2m>1{UPb}LEYdbgS!bPc`w zo~VKYeoYMR5+pFiCxhy=N$*QmPmL=&7X$dtCq4^{U}kSg_|KO}BzHd-)M-kD6L`MB z4m!u$ryxp)efK>fHV4Fx+{}?H6g8S{Y+8MFT2yGu(6%Q`Bs2O)XdjAttQe8JUVfnO zEEi5{lN`P-iBjcUbw$5UIE}>ec#J-1vjbwy>AoTr6l&2###Gu&m>3FlZQ$ zaWd6t9njj6CmRP!Kubw)_zI$>jfu*U*tIpSI{~;D*aaqL3iwvZB#Sdi3|-LCM|rYg z2)m`<>1!leW~^9&oV=?8kqGz%IQgL&IosygM>0AgZYtW`I^Jfn6bsd|aOD4H1-;G&r4`r1Pe#6#4DmnCnBRUs;p_=uao^Q%Wx)N{wqn|#=-Hgp6G*3O zIfOHPW0_6$6lPqmi6z7M<3e+ASyy*d-3nqGbA? zo{&p-uTfBAvO2f#7ub6;Q*`%l`szY1dp9JNm&a|yc(mjup$Wtl?*})~tKe>(Q)L*q zocXr=$TFMRb^Qls9{KANvlzCl)=ZvUmMsA%4CM3-_>^lVFqh&=0%wd&RzcAYjuaU0 z59CYa2vrLK#&TtSTu1$5zj87cEtFibAsAOlhtjb#PN-j8|3)X2(YzqfsJn=Dsbxmf zuh{;e`lSXvJlSkV5L>b_>(DB_( zsM%M(s5-~M7eq%VOWlJ%*w(jOga)mzi){BY26;B`{N$TfI%`34e9tt3VxPDY{%Y@O zQdaYvImFy6U-WFt$u#|15v5P#cd>?OfXN2&NeP5i)Bcv7uu;7sZf^g|Hf?sJW4^9N z;%cZ{HBjSN4O}5jL%#yedPa{9vh4x{R`A^J?V3ARQcwPBCu(=;3U+2AFL8V70bXQh zg`y{|(>i+1tE_p`H#Kb}LW%GnaOW`Zntd-m=QBcuHAUMiU<>H4fcbwH{pNUT(%K_1?&QR3%S{m`yYyW!OKNbuY&tx)szqE?RMQfSz zp3#!m&Z5QjLqPqCEfY6!D+E}r&@TDo_rZ_?%EhH8`V^OV5$kW{EW)kfEqB_~u~5RZ z3fN;Y?HL}RX@Su)lZCK_Qg ziQv;{A=3ydNqIg={7|O>W>HLP*f#B$ON=pGQEq|)_ato>1x)z9=5AsWiRq@7F#WUH z#!UBsI_d~{Nq);6V8$SH>&!QOI4l85Nc8Dsg* z$truzZ+8#!B|N7NnxJ0$jTYG~*5jKB;f4i-XPkr^R(VXhjIfT0dl5qA(j{FJ2ij0k zo;1ykbh{CN$tG1uPI(R?V~qzLj-qU~QiHfJSwZxZ=F)DZPH7b}cyxy7!4z##;dpT) ziNGG8Zs?iNs|e5dTw$>XVvemN9Ng=ZOY4(!)cC|8-X`3E7;>@I>?SXX7QcrSQcMCP z(`+^pZa!-pCXx-sirbK{;G!&_C;bn z)q4?6z*S~E=3%PjDG_@o-%HmwCGo+R37T8;5ZY8T7+)zk1s~Y67p|mZFDdFK)EcHQ z_*c4!&wvrqpMc3s0ivj_SXam37tAE=C6#m@S{~aR539I#7{5EYfM`S0J)wffq^8*k z8ZV}-rV``?E7Qlg6E50e(ztu&?rYZu9PcmtvOP?q$>Rd@ikJ`t7+EX96?KGYu#x3# zh6IItQUx>~ZktX>ReG0WVAVr4_$tJdboVZIW0^KVnh6W|06jZV2{M|wI~G^&HieW= z?wJ1TkJKqI@bvn~E9eWGMWH>=zu^U_`avWq#LG6z1kd33u^J;ZjyL4NJfOT4-!J}U~oO% z4On31Hd?RNIyZ`BJ)V-`O;7$(7YRqfv!+lxQ^W@==NPyM$ealwJB&5+FG^_$(UPHV z)m?4B4f+I(8P)&b={4r%G~It7LA)m4VowFL7k-v+U_@sEy>ZM&O9#J@6q+wex7&cTKOx^DP$Cu<0Du|+n0=5@~=O|x{>XSeJd#K(boXgd?S~3nzZEH zf>tv~t~G}by`SY$48?RGTe(_{4%ZW*bc(|A77VPJx>`s;Bg^=3xv)7jNvF!X5l5Gf z>cG&VVriF<4kS0%oe#YO;ug~`IWJjP2lK%3ZSxo8k64XyB*SzXAd5Wd496=hq5s(m zea>)LZXSo*1}b7()A{b|>dDI~X+&ykZ?(vS*IQSJ2nY~$LW=c3PYwZ6?n=jftT z{_@Q(@3Ijpq=m$*Jx(6&U>HK9r4lS>A+b! zCmD^PJ2@O!f`z5qy9-PqO7|HRi?#eVV=3pk45nIE9^box=-Sx;+`C*Qg+2=>sYKkW zSk@u$F0HRo(0r2(+cNuZP7NdAE%Ql;sRrVzA$IIU_ZIVTD=q55j1;Rn)6D8HoBZN? z^2tIlO->&V%iL4)&D*7$sIT7XwzjHi_L|Td#(slV{dz+EP(J4Vz`*xJ^|oK{Oh`-V z&_GeMSt~1Yz&vV?kF#*)QB6^QY&v>I8eATji zHVKZ#WsX2IH0OU-wZQoRmLYqvR6HDI;?#A zO6V{7TU387Jg{77oQt@R5a>_EPbze8;~-R-mfiqgT&Wes0$HbGiES-Z7J{B@y~(!& zZ!~YaxWH9f)TBNUJ%z+RS~{2mR)&|$;OgV$D7iR#&*#%ER`a0%2XB1rklo*;G&LE| zz7KHRP^Li~Pno>T)_#SP-+dq9t9k~z%$jWNjXs0;Z?rYAxA-|aTdv;T-@)V0U!-bc z)CFpTyF+ocm%X4V3Kgt^K*A$Rh{@y+{-H$+AAKHo48IYk{OUS;$T|^S{Vq}Zo8{b< zIsfYKc(jTH`k^aDt*MuIfBWioITBZIb3TMDI~ggx>{|Hxd^8-%$p>svAvv>%_XxYk zxDKu!plZ8{kbVa}(A`emOOT65oUAg%&93d03?`Ly)9S)TPw;T53` z=|9-OdmeEJi(@b?cA>GW~_)y$;!xkyST*7Y3JP_o) zZv3U!&Gm*1ME%5?Nub=}YnGT?LHZE5GOe6#u7j%+Luf-Zg?zbJ;|w_r+^#F>gwXgE%IwkTuCMbg$A3~mCl1J^TTxso3@PHxjjv)%j@$&d@% z<@H5T2YOhgc)Jj;<|`*GwXObdoPYgq+uPBL1yv+OF^gS%ZVC798p)ME;@;>i-yx&f z8XW}}FBH-kvW2+NPUinx9QM?``&A6O8>PyD;R~f&Q%zFF*c(`I{OVGYL;0*dHhr`Q zm(pQmiQEit1#{3T3Jy6Jp?}1`G?9toJ7}c+&?RhaBXOci%#7=(+TE*3;%b@6&bWe& zh8js?7X0XxMr`-2D-six&+TQ1UT+71^@?&v2bomGliI$a6{f`4Ttf4ZNA9QCJd(@I zc&0WzP?>*gP@b1-D>4<-LSK*^%kvlTM^6`Dy)cP_7P;1?5LlO)zlPy%do{AKe96s1 z+IAgjRG)cg$%Na93JPf<`~ILN2dl=e(X{)hxpoE?%c3HRkJfXSHVXT;q>(N%(i1h& z%^46_A9BTCQt5IY{ZP*EHwV$f9f2$PY~zt?@pJk+-=>DE9rl8hIJ60w>H~@Br$^aK z+kk)jg7^lu2=Ab~MLP5tAZrGbgAU~;5P5d*(|5$k)xr*1;((_iZhs8BDTzzi8-EY4^L^lwKSW4(X!aNpOf0HDrxzhkCzIQjd zWi#IXbbwBBPibnJLPP|bknNkC!b-^QU@u_3A%s^wU>fEsS&!s%@X|&qynRx11I5TY zX)-T87XqsWA06`R=agq2D2$vjwbkmL;l?ohG9suZDE2BFoY7WF&YMnlA{!r78hI#g z*MrV1-YWCbb6W(+BV7F2I>~Sm46I=UF@&D9fzEm^A@ej>`o{9*%dhATbaklXNqSx3 zHytE95th(DRC-&~ZRQl(Cwa8Y=FNr7WLe9z&f>7BLnV}NI=Fx&byP^}YHVYF8C+0O zwJLi=XRV8`(;jiT+>n*;ZszBDZGvA#nA2Vl4p!Qt{gr$|5uK0iQXC0^B`X(Yx+{k} zsif-|ce%rfGQ_?a^m*3_x(6QPd%2m)yQ#)N`e?5-sMD#|&3WH(oBP)h@J+J`&#P3u ztXPo`CkitnJH~JhSU_va+7~@>9yMkgmnkq2>Y>iAzygJ`d4+hYeGYajuimt214T3z z99lJd^#ZH$Di^lu!>b9RKt&xzEmIseCz=pkD|&0IEF2%%A{OV$N0^*9$h!dZGf)qv zF7DsPfGnk`@WO|O;pF>imvlABGWCr+o#OSNM7K$65g zfs6S!zGPqd33kVl=0nmg8{sJ@Ee|)SCWknde&039I=pA%mZQ|mcm#{JkVuEc@lwZ^ z<3r<}cw|Mr+M#Hj+z9boLiC^$Urf;oM|pSibRI{viv6uGq?(pY2-0Bta&nY(nIpM| zvX^uMD}iTUjZurFW6b`WDsLjJnNE_o1jgQ7zWghi-y>s6f)abP{nBzqI&Fb+nr2eD zpP$l#+?5=;Palzr35Dz13rz^a{c~NwQcXb$qY>{XO5PJFq}gxfp!0UO(!mqf8_JqNQFjEM z-wuj8Vhdn((uYt@A123wVO3;R?VZ)Sz5rF z)3k6ElY(E2;ai7dexjS`+0+?LC1h%pMIDKKJG72D_EN$cTL6p0d10dLt#CH_*v&kN zi{ic30;DHlKfkz*cBPKbuMsY3h@wUUE#gDMniQ_wx?_>CGYUg{HDCK;3jH#sf?X!a z$$#oHh8iUl&}fx`D3wbIX<`0srm!34J*Les;Ef8p>_xa0vdTIp(SD5fQzOI{XlsSt zHjX*$$EKyQN^r31gZ*(V0|k5gNX#CjjPEZ!z#2u7@~@a|q~*gaNe(=&a<6GZ#GR9O zVYnd*O%d9qB&tw0Y;uVLi+urYvpEKiGO#eudWb@$=5aRisgWmaWkQ@niaMYNSPao~ zKk313K0n0IwN#Z261NW(<|iak+8@DOAqOloqtNp0@a!>+P^HLv30>vZq;M4{bCPJ! zK??e~8WN-Y6Ewzk-5$6%vR*iChYnnU{%E6goZz3k`-ne@8U(ThV@WcvOZpxE9gbJ! z{T6Q~w`luv)J|9%1mDH8aFDraDXe1Ioh2)>eOLj5xkhU#VniSZKt z8Og&9{(xyysS8)Jp!{YJO#gs?v;E(S|(QD7O_&`D#Kb1^(xA7_=k0rUs zTG!v(%u(Vw(VkUmJyT{$9&<+xn)DhX{<*kM!W3eV0E@p-N2|8z^b$wV-x9(vVprewpwN-pvkoM@*LnLEyc8N|QE$A5q5O70>>Hhd% z%)ya+D7Mx=VEG-{Ufo7KwpZc=FA$94h~jBQ932am*o&zIskU_sS^lD5wecD$FYSoaPdW^-_&$n$aM>{2vt* z77#Y}{%H%?6l8@x7Yjc6oGwiOSAkQNmtX<5o-$6EzjSwSZ4pmDB`q z6*Ek24ccm(STjjtC5;Ixd!f$`%o!tzFftdO`niW5V9{+(y0ZZewp#ic;wl8pco}Cj zBb#Bq*ldd6$qg-DWB#@)tuF^l&~-ssxLth>aGfY8h}_3<+Fvro!{<+x;sy`gIYcH_ z8#wmulHTcam%ayoJFK_~Onn0LFRK5-79D?XUF5I#bjvF9a1(>)P=ru-X z^=H~WxG}NE9JL!6_hqLp@`qE%XLR6z)sEJ$OGM11`}pK>Sx`(9z*StSG=WyNnjjgD zW;jS_`bu;eX4c8+<8PnFoH9^5+}R6IYzA)1wSvgkf53nNpcH?u#dAnw@(#oFKgITZ z;JwA)nZFlX>rJJVGE{ZbtOATJb!t)*z!m6$DN4+cRSB&Y&d4B1Dm3hq+dw`YS{|%Z zK1H*t$25fr2&{S47Nb!>G|cjGsm2T>mQ-VUrv)5&VjWW^vs^F&7B__;C`P=+gxid6 zgt_qfnlvD(Ec>F3B)IKvT?)wOXrKMBR<@*VC;Oo<-%0;tWIJ@{wrJ7fIa+Hs)ex^i zBHQx2ZA}tbkHjQIVx!PoxOwvKx*yLl5d$k>GVO5jxj|7&XulKsA0ul|oV5V!9grI~ zz9M1L6i7)^#8s+jrAO$X?rh}AGJ3vm3^B0w(oT?;2^Q0!)WCDhhv$E20T!rOHJ)}3 zmig$O>8^ztuSsde1^qIIs*aT!K|pO)H&^vdRe*hkW(j3AO7ext?kMtDdI>|4h%yx1 zWVuGKFu-D3`kgmyn#9X5wAOV%vV8Kmf)nz!ps%gFaaU9K-IE6i(+u!*s9 z!N=~ns$5Pjm%TWKS{rYGmgmJjjOz@rn6}BDMpv#U=1OO}jIQb|X{TTsIZo3A*InDc zM9fMe6KKBsd6#feEWCX0VRu|HiK-hoZnXDM+%K?f%LA2QH#g1UD+XAAH)Aj|o-S6@ zy@%(Q&l%||eH)|XMGmwdelR0a>yfWF`4m{B1CLiPe9Xn);ie0%T_0RZjym+V{jDjG zL&oGH`ztGw#J-Aw;DtOf*&^RE|1xM79TQQGzjUR33%5$~PjVG5>N!#PZRjUqz=mFh zB!{jEprdCn%{5pCLSkqPr0I0P9K2_YgK&jwljPHgy#dJO@awn*?>4hj>`f~fU;%nV zrm@xIJLiTMyI3}`OtF~)uA!XJ*~&;!I57-a)!5LZtR}x09bJ&POzmKZ{uzthJU+CMS0U70ARf8v_mA4 z?RbR^!3N-Nz>NpIK zDkZpz)$P92Oxj6u4PMm^{JYhvQ9BxIi?Sr5*8#9VPG^a+=joPA8=07E?=Zs<#b@ca z0_)LiRka+5wnLJGS|Zg{TrXxT-aJ7`Zs(Sp}w{dr{i0}P@9Wuj`i2e?M^$ugY z%`(2{EO5Ds_|AAtT(KeJo0oV_9N?DvqdLA!GH`DR?$??%rfEX;2%+Ihu8*J2Y+L}qmhUYVVWn| zpQX|je;Y%&_uUk|!m})}K!lWpClV3UB<6W95vaw))62jFkMnk{(~f&9V20%F=jh2ya&T##P*dpfxsk#LHHl^WuoLEi&Y>||HRMSpPlbLq z3B2sRZ zO~Tq7mJ7X1G0ojeutl+sBJxIw^na4tsUV23ZG% z`{A09_K94sH z@|&epxRkYc6k)J%;wwC`K2R+HGjr{nW`O0dkB*-oF^%(UtSFh}IKqZW%M_~Q*Z;|9@aM8~I ztq+ySX6}9QP_uC1#20vA0Y;W0Yyx4RHqDvK^o`=}*SeNV%Hv#Q6vrN-&LN(D8+5l> zY6JQU=;KkRhj6-^-K$j&xv20H=iV3XUH6e31E1xy1&nZ{A$|zVFHGT@e$t6tD-koym@B^&$2$Re) z>kL~&!i!eH^dA~A%|tJGwgV+&0b#oOnRxc3_cVqd&^^mVR%{V!VGYToTvf)^RxMew zBy$F59luPp*6S(ijCE!7z!^$ne;bwr?imMx3KB#RB?vga~Z)_V1wQj*L;TcHh6*a?3U;R?8g zY>_xSQO(qG+IUBmNt_5%`=$bLHA5*E7G6WOe06`H&o9}GWrfY)J;v~+Dh+%R6C-`B z9*q#|Wl>=*+W})m;Wo;51&yON@NOX;hWy%gIw;)WTfAasxCPYZeLE@5MEQ~qKjz~7 zyyrQnCLWmTQYX^mV>RziMc!^uOo2bd+@yHmCp586S$^}wMAdd;6RX90%xkcuFJ-ee->V(94`&E<5*>1Wtt@r80Bd5glq^Ti zyy=I%sqIZ|FZ62PGmm3m#9RJAQe{Jw*b1UW_EgSUyAySbd95wep(vR zfl^mDN>ab)^E-R0K_oSDnMzr!`#F4qU38FOjPt~d>|=Nn3pV9m;kacH`Kg{&Wze|t z9qN*;A$~h|w0}TkY;?<|yQi~bBB@L!3_Uyo+0~asPzlkb3(dp~CmH}qwn6$P7yf|KWjZwj?XaR8!6?3=bWFH?d%6kb90>t2D%7uW)ITeMf82 zO17G@hIus|XsHm^9LdaE)t6xzT_jy+kmU%>(2bAD3Dj&WVii7J&oDO=IgqE>+@|)- zV4VSv$%m_z9s-(uE=6){ZqUe@x{#eD@sb=^OhJXoaf7>rEI^e@_pcc^L+)@bt>&5r zZbXbN<`3eA|MG}Y2><{f07*naROR5DK6-)S@driivyQw4_zb-gxL_E=xiMG&apl|> z8xm9=L%v|Qw-Zrz<5rI>sbHe;V50n4Ij&laWip|K4qLE1*C*~-uD0bL4EO#v(aO&1 zR9XSIQ1ft|!O;Y36&4e(0DU_Ka_x@RANEix$dToBRm#i10U!1r4p`rcLdXt@ES9@= zZh3_Yd#>^jeAZxEVV>n5rcBaCY9T`Ev#l;jFcU4TZhX|r4EF1zRKghlmaz!A**XD3 zD|2zUg6-EF=IswQ(IM^4E{!Yo0?=L`3n`6arsLQ&qG|Jt+?VKWQe0WIWVO{aiZ;|T z<}=)vQH_?zefE| z(OFNxz=A8Y_49Rlu|5Oa6S;1$hb@5BSt;1SH8bjI%cTj-N-JBav@gfFwz|^Z*4T_1 z!*A^YQXaRcgJf$P%zsHCxj&f4*ko24Sg`tr@iE*vj{eV^X0*2UVVOZD(PJzgSPY9a z!&c>=g?Ss#fx&+-W6&M2&G^EJ6!kge+JMlmEe3eAJrG`302ZhLtFXzs_{wIRmb*$A z)b|9zK?$0beth$&g)sA%#*iD9X%U^6(%atih3_dLW6FSj$PZ&}f-AbEnQCCn_qp)u zO%tqtrmNv6Kc@gJ5Xo9>lhx}hzn>>b&W2P(RNwAFy=gkWrkxg{f0yR+T;L7`vlvz| zxldDsR@ta&aJLaFP!+M5B#Xn0$V@mlinf(leiO$THOOot**0ma0xMC^D&Y!{{XEy& zUGjPwgY~~Rm$|F$Cfnnl5Z}TZ~+)#okc5^H60j z=q|;F+MfSd8CFZzNRA!X+OoeT#!;y$mfwDYMp1(#Wk%o>#*XPQIhwYu%%JKR6Y?|A z1vDAwu5GJWoNUqUK@-!IV?qoI4eaV}Z2sUqMPQ9(Ooaci!8#7X-jDN2CGO+49A#uB z#46Sv{EUmLEDX-HxV=MXwG{@MD2Qa>^eWmZ;`0{hX}igyu~HH-LlXi=Bi*iAE7S>l zJ%J1~p7$QxLRo&N#odeyia56#v@yG)c3qG5-JDe+@7At2_W9N-ouE`~w{$l4@NpHz zup)CDMeR_JjEkpHhdF5gCOyhLorc{a(=n-*;1Dqb6W?_R?0?@`{t=o%D{=gId5t;1 z`hYmk2I)O<{LpQblf}EccA!!$`xL1KSh;0+ZzhZb?@$^Mz67vJg2dK93GFOtP4!}? zG%YME#^@tA2^-(ERoUE07v>2(uL3O4~mVt z+XVC<&e(K21+z{#j-@ngyAgNSkHA}<_$hM%D!6K~ zlCkM-TD_Lw*GcE6y8x`H3FlRwFP;mAEmrWqru-eC`DplHiuz4|Tu zjsudckhY$hk_&7j+;874S$r_IED*N%XwT2Zd|wS%fcS2*y8Axx5@xwX8fTKKR>1xg zVO(1J6W^m5#u^mZluWdN=7yt_!UHVacEVk>=EY<_! z2pTV_0t--QQnEW)x0+0A=8P~`z}04KiB-^?Efdni0#7JF|1{PpQ4y$m{Jg3Cvh%)! z#t6m$_AYV=sv>tSry6@<91)l^n2PuKB<6#gBCw`WPv9Xxsp6`|ORVO$4i#Hz`7k@@ z#M&3gpJ+~Jt()78bEDKwVEygBn8K`l%PQp$>nzt-YZo{IR_>b)QPdt>j?pw5DA)r0 z9c7CT_ErSeqZsy(>*~M)EgURjUHWBFIDOvN6@VqrEX|D4&W6itPJPy>o-i2x9JiZq zNKZ^=GNgf+5M@z7uNhvBOSb@w^EIt-9q&E)QVLiF#4R2}y3yg=R zQ^-Twc*`bvq$}VmT^c8PLNujbH2b#e(MXolry^|pHC0+xn6FgV7BSNROaj{MKiWT+ z{DhV_EbEh}6zmV zTk520EBbP_{r`b~eM^8VSW@BnPu&`ePIob2p<_67%%0oTtCxrcd{Fa@fkNShd)*th zrXetLM<>@4)b6QJHCg`+Ee6(mB)}RAnnm=`=W)3runLfkP={;LRjF!1 zEuhNlsm~ADlVZ*^ zk+_%FqhCS0B||(x+}V++F$a2k5B4?_ZiRZds}f-44kWSlm+j`mUX?b)RXwoa^tO=C z-9e(Tu)`;$@lP!8RY>@-3hQ+;V11+%#TQAiiJrcYOsQsa2lYW$V(@uF#DAKiH152pBLd4HO| zHak|jNQ%Nl7#{MS9%di09k41H11>=CS^oSGvY&mlw^@ShLxv>!UCxJ?{+rx%=lU7Z z+ZRzTC}CCDXVg7Y&B!tlk*%u_T9(1T&07}NzTQ27TGL9~Cx^nU{AYZV$XD}h2dwFq zeQ>VsvjlHXy~^>N+D(e{h&msD7 zwpl~uFPrANGm7dhfGi))W_Q(aF&kO!;8SlqVAWA(19QaqE7s7RKdaqU5OSax30^|n z`H3FWoe>c48zxbJNvXfickaM=uaPQ`DH)@dyn|E-$Wp0eH$MOncZ+qiCRdw@MR6l2 z->92Q+gx@SY2U}&IMuj8Sm5V|x?kpC$Q1adBlTQ{tv7_^#{#bbQGs0-xHB}Gw*8X-yv0sx?%}IBduBA|tZ_LR^H?GEE!VZl=HJ#G^#H-=@>aG^haWxZ?R%EY#F{>8(Joe)V{NYcg& z`PX|wh@I7gs}^sI^6 zh(fDBPHu}I1)cfKf4&-Ezpbz(ysf=jEHAZZf`)a(u^OJHwbd<1Z>#~KIKcKt(#;ib zCEHz)U_(mZR7pfFA{nE$i3IvTOf#P}goO(%@_>;fBc4e;x5)1S$$8%XNW0otKETF0 zqY?b@nXU3jGLZxC;UPEL3<+D&V|4-xrghN0kU|RKx;q0{e5u>{9uZ1`7k$=WXs1E# zljfgJPE4+e;eUeGb_$lyH#Qdm5%!`p|Zk8-Qq|anOD>_Zz8_krsYI&%Adr zw}HH`7gsFxy%dd*rt$KlZ4))Ah2y*R=rlh}z1f2|7w*85>$4>qR$Im~EhdT>7Fl|f zpyo#)TkFdkY!;Ea!hGr%k+l5qRgO>1EQE9?Jn?>YmbxVrXIcj?lL zNKsJfh#-h4Dk>lKOg_AqeC_|{V) zX#^qPE;0bE-zvhm)?Uy_(7#J+_F$s#(6orMe*MU3$Yp6n4byt9V4SUa7Tc9FBP%P3 z#t@3}ny;4m4?#t}Icg;GV~C=45ID=cGZ zP3Y&-uz5J-x@|Qr9aw3?U`L zVtVBlD}CqPr7u|=w!w^jCksLr#(Z9P9}8(j>)t$wEdJ>qwL)yLSwg93RooBA7qbctJm86b8Aw8qm0k{M=umWoV5F*&Jaens%5i#KTgU%TOvcIMGa@MC-gx zu|v9&!C>M~6%~tY{Hl9JFaSm&y!t}MOWA(P42hRJ;QyQ&Q?cw`D7bsFTx&xB4}#vH z^lFboxG=k}9i$sTW`YSx0b{2#8m+B!z7XZyZMTkF>OUVg#_UvY6X)p?MedTE6FPUjpgu);RVXp8;VmQk#5 zD*e;xBv@a;(n1b0VfbE_1UJTf%ei~Fh4m%1OJ>@UqN)s)j}5=C`fPlF8b06a@y}1TYG8Is*<6ElONE14CQ+Kf9ecS8n3dX+IT9&eI!B+XfmeG!2ZD zqF6Hzi$;RFd+A3nMd(7C*8Ol75~AT26vOWn2WAjU@gB;QMoa?Z0$Y}5=~KK#ilujQ zwY3e5TM)gs0T?#&yV~=SLeL1*cGw>`wjqm9}d?r zZM?Zk0$_NA|7-ALt6>XQXY!em4KrA}#gHmFjNDiUR$D-^X4(&sG=wQ$=4O87DzcN< zzxF|6DfBZyp}vJF)S%0-vEVXr00BiODAwM0*_*#L8S?WI5wpTunZaN&Za zzFw$~yMKfBLccCu7ER3hiu&<@5&;Htr*7B653W|x#bzj#pq|1=sA`JGP_y1aT%#i< zKEE>T-C{Nt*d+3chAI~1IPeI6jUy*ftC$AiXCBD;pnl$=%^B~58j!jfTHIbphO)~@ z^?FX-?N$2qcnkpjmw{q#<*z+^_RPvsnIPCvj0&9WU>1YLP?R;cKQODCy@DL{x>`k|Xr+33wP_eoT9rDBu%puC_T85o`6wVuX*>J^z zlPZV_P0$OgBX#?08?IPr_VYfCp2~BUv~;Cp$*bY_ri@Vre?q*^_sfk>8zJ<&fEIS2Q((i9NPU{?=rw=l(W zXF}Pd1{(2|Y}x0{qm<|slN&x*ehm^_XmHFBLcxqWzK}xbdBs9vD~C%y)#S) z{HvFaoM{7W80Y_i(Mjd+RrqpZgW=v-8WcRHvRm#T(O7e*aqc? zYlA6GW_<80L#!!HOHG0sMxw_z41fiu*V*g4{M_t6^k)hLyYyLTS?x& zSCVB^s<8ep84vyhW0-I%B@|0zSPK>U87JCt;35>`hb-km8Z&I0Zn3)5K{w&|o1s*w ze;j~_C9xI5BIOtZKEkMwSf$`1b1CR30Bqji&VVeIg%W2OsH-WEw5b~cr){s)nlQD^sQ6nJy5o=*5u^4KzZm5VmHGs-m{RMDVKh>~K7iiD@gKh(jTVF#evyikL{WEttd z%MU+JG_ztAaDf?uvM8l)l|ub^M+p|94OB3Xx?5*#b!iMZ5yUjXK4%fVV%o#(R{_*0 z0v0sd@@RUPSQlkJ$+`Lgz(CJHdA8Whip5}AM*8oF(;gO^x~f88g3UZD>>%wc1%uFK z4==%&+qq-s9)1cOzp=USh(oouP|;> zFy7<88o-7LOc#)i=GH6SydYEj_bBp!B2ScD_vkSin_O#OW@gWQPaOGTkEJ#?+sfT} z%gBH*^b!ph%Tx%SI^zm$+zU|==PT`z;cZ&8FoPFwk&RFk{>z9f?TLk_D1n9P{6l2f zrOT5sgXKtP=6=wbU#^?tzx$=}si!tc73`Ot+E7*UNqSA&&r1&|sRyCY$4}?b1KYS@ zQa$SA5r9)PD`t%3skNJ|f36BPc1zR{x+2A0sZP-NSN*w-;vX?e?sHs~;#|}KHfWax z6pLZ}*~_t%y?aHqRxbmzd6cXrm!KiLP1PjQ)77Ul`Bzfv&mD~up?}hAeF?nE9sZ7V zU6i^9&bVR2Xqp$-5aFstB0_lXO&Tz=E$UA$i4WwRlzVSE-=!lOA92MJdZilyOTma) zQrhG9h>pVgFHvU_FCT!uaco2M3f9n3iiLP#O%+BzAO zZ+G8fuf~^ztmYqK16S6k%V>SlFfZbsuH(+M&q1B z)1(W*DApbUz)8hUiEbv6agIk^Ncgs%)*cX*e`wPb3fDsf=pL`bcwtJ zW=el3g4+m7P%h`R&SHWvhf-k+Spz?}>06`D8K$teoCY~rt!K`h>AC;EYyju(CWz&R zQhhzBQABkDbUMc0tsqqSEpJ-S%&w`(6`U7@-p>xGaVdRY6!)_s@FzNJz;E6 zC{uCBC8k2W!MC)^Zq!*&5aytd5_}I)_h${eT>DN&!1z(K+IgkYx$E(o7ms#-&QP4U zgS^;XL)VpZRUj*nN(bLL$eVO@&kS89gKvZ5^d0scXqcS{_oI~ngla3E4JLw8Q!<&-DY2^c%Yj+|?LtYDkpvDOu76%ZCH9`=MOUZ;LIf zSPbTnpq3O&ZVehNoi}&tauOp9&Z2%aqVamdCHg(@7HSCQc}MD^SljBlV0+?ok!wt>#=CFjYm5noYv?Y+%Rz@o)-kkU3&iXrQPU!)4|Nt626GUgo9#tm zcI>+i)hinL?L@8MyRZpv8hzJWG*?F~K%UYqyjC?>17l~u(k1%bl{#cu1G+)#xrg^0 z587s<@d}eQk_T-ssoz?)7k-3vpY;_iagN+mYFsQF5ehJeu&?C2J%Yug8zvF(ansnw zzzGD=t_mfd)@CYxgmig(dj@G}RmK3(XBS&uu^7zZM}8`x*oDxCO!x_-Fz8LqGJB+q zTF<>V=%orLpMhtFZ(G_gGjiBlJQ&ACd56@$z$L}_V9W*Ka)drGe)^KW+ZITOSlJu9 zS}@3Gz4VY8Lx@qQ{7%EOE#Vy@nI7_-QW|z zjuW108clR9h8vaM1!htGrB|i>l_)xJTz>>u`I!357ttVUE&p zh|jNbbw`0^|GpEwc`Z5AWwM56+l$v&e~A)p)R$&R(5z9jv-?yUlgjZNdNIU9&DHV6 z9X(kktcLgAVL7m=>5-BW=_sHFIT~H>5cCON@2BdAjMGxV<$gKl+&??+NAHX`B^0dO zfr3vN=gI2`y&b$Z$}DSmjXg?vIJRWD6l}Gfyn?1jb)?;qzdmRj#X`;42)!KX&wwHi zUv1p2^@GW;@5`_^dP4R?7cOZXkWR`R=Itpnt^@n@f{T>19m=l%N;MpIEMaNcj;bOQ zFobp#QrOXmb9URWL9citvEJ(?`JqVCw;H?-w%Tx{(SO(X8%eKpAE2V04ziF!54{n@ z7+7QE#oVVu)DwIMOo5S+2LN63GN}D_eO7(RCE@cdzLF^ABKShK)oyf`fM3miU)ImBbx0+7c C~flL@~}f)iMnrk$Q8wBN|h&7&nWN!6I5|n`xTe_u^9D zgs$N>kfdc#8!f*I4iTlEZ8oKDl+RARnljZ{L7{ZhF?Y&|oe|TAzjBwb0VYn{Yo(*X zm`3RHKqr*Swd}W5&Y4Nx>7=KBPbHt@uK^bg@50ZEXz1)(O>e|@A2zC9v2GS?jF$+F zQ#hp%qcu5Mw2!};K?Nb^01*w8Em~y*3dSv?@-p36DzZrS0dOhawvvGp{(J{VqZaTE z3QiQeB>CT4z6BAf_EaQMsHrJZho1ER;>uMxJiYVPpYY5fd^@0_ea4(wjqP9|H!E0h zf3t*na_?EfuBskAC#K7>;v>*$PJ*qPM+rJT#cYV+9IJS6 zQ+VBnAoQkOHhGZ1%^e;eL^Pq~0dPS>d~gxm>&9jc+Q=KYZdy2tU`|S3#t5{V7RkdF zJO3nu!b4_qV>?*VZWcj=h_-HgOwP9qEyAbkK*W47Bn@G2DxhjWS4pybzxngixw0zT z@_ZpPYLgOUkF{Bq1%Ky<%6n)HwBL<7N>PoYjdyUsK5_mn58@5siPW{@+6n&b_$!$>UQ) zhkkPI!mX>%cdV?#YPfb_40b2VbGo4TNS7h!%5B_%tN-p@cppNv8|NqJ006J3U~qUjklxPi-dP43C|~0M1h4&C_=Ki%uw>jUnY1Re7e?mv zow^i&8uG9(YAKu%H;Cy79s2y>7|923M;fI%oEa6la;J%MQzVOw$jE;;9QtM$2xm5xBnV(dYCT z#S?_xCO-@X4Hf~{3v+!95K#^(cfi9+dsHq*zstpfq~RJKpv4BIc7wT@yASWgSGor|+4_&k-Th*(QdQ}6BWYWA zsPpr=7Eav?>VP@qh~Qe7dkamO(@R|w$}SYKEOA_dzF?SQYc>irwdX!DpGY3ok$&sd zupO!m<4qdCx{U2C>yp|naJ z#=NlOS`^D7-4y8b-0`ulge8Smth}KYA58jZ?e4_9Jmvge1e0Xef44@J@F!G%uEaA1 z{=*NtCYGo0d&~u3{d{;^N#b z1|XjEL;7bhv50A8mE0y%tj7S{vwX&S4@FM)qB(aIOS!*N=YozdaxtDHO;phDy&cmu z!4n4R{=1r7uNViuEk$wh_>THf$zrz&7)alP2Xw)`&_5eRVh?gd*+N%MF}DR6R-{JX zawQr^v8YDa`^SN_pQ4q#*J3^=P<4EF1^-GznJp4d)Nnu~H2x7%v)-Va$|#rGb!B^ph!JSlU2K=~$n z@(=8!`c(J?Lc|sDE``6I)-@A>twJ`iP>A}-Ohd9jv2JO9+*E&phYXN)Q}t4n7Fh9w z=|tlwmd%|M<%SbJf)3jg)EYaeuTEq!HH#R6`6q)z(Dsie{{(svYtK|1@1oWrO+!1#Q(eD}fHY*Gz?*31Ig1 z4tZ?SVIlo4J1uMw+_XTJkafwu8R(V1kZVh;!RKEIK<&BsK)v1We7Y<6DUDTHxTrZL z1Mv^PS4{a=C``25sB32O1#NLUd@f(shW85@4Xb*}(ZW-02X335TeCf}L+Xl!tL>Ud zl_>p*%SBo=27p&E6PkNU!`t%?j7OYn+WXNcOueeVBpz-#R3&ukB=p>uqedY5>$+wq zkV50TMuq3c$P~IzA`$9NpaDp9V^1`qi;sJOph;rrqAya%Ic+jPxPeu0pPx5oR|=TQY? z|G?L}4nhcV#}me~ESGM^jihwSyU{Hm z-4Zo42XKX)4QC3ee61-AN)ewVOu1)90B+(YkgKrfNA$}_%~7v(i{VVeso`26Ioi5W zFV-@8m!ODz6dU~v>0lI~H$4U^mMyk_xb9I2u=H`kPDIlSMVHP)Udzp5av`UYb|Dnp zRQ9pl4(FUxtOne^YHs_z?*`HF<4pcJ~ipC<`14G5;41AsplB49jP9+Oskg zfc$+7%A&uFd+8pLkrA3U!c2*arzuuYbif}!X%sz~fB0>LuGtEr{pCqb%X5?*Jl;Q& zRHJ>gsXDWW-1CAN;_W>$(4*@J4q=M*09a_emJG&k@{y-(zHtUKsP}9)>a9V14Ga0{ z5CsOqu49f)0+;9#?BK)4fhkfZjtGfWO0x<_;w}BA`T#JB*-GQ)>6)=X(1FO7^0PYH zORhl|a_8Jh1Saf;Uc3K7tSB&uPC2uRk%a1R^2#dL4b0P&HSbI?1R&&nmcxMob5(kvzHqvZxba^OOYqN4y&9=o5lV5 zT={wSv7|=zLB(auzzlzC3aX8aJ+P(sR?* zYW+ls?CKDO3LS4QL8zZkg$4!|v$lKL{Pjw=7`1fhFGcrz{hs9FP$&*ImLc<)Wr&f0N}UJL7QEAdr8T2oXRcy`l1Knn!rY$T z{b<$QCQ~eT6dMeJWohV65*I4e(=HHbxrLSJ9G;nP;Z9^;amNJbON3nR8{;95|$W|tE(Os$~p=T)(mclxeuLskC z2{nd_iI zy=`aGRo}>DkpD`(Tp`6OC4U>{i`>+7`7hy;X`@smot`qVW)1d<6&&_+Mb~oVB@^Rq zka~-p*Ye&*$9}U2IOYPkMNWez$rSros1f@PXsVpBNk>N+?2s~E@-+9L-%%$V2K92= z3k*G0btm7R*2pN7kmjZct>q}-NZVlK^ap>DoJ>wGx_WfSs_@^_reGq?}@ZLx+4sP?t)KH7dmxiX9s0Fu_Hp8){tQ)zdx zJeoCHy+aw8KCq4kwt`pUj(ATtatWcj9)_56z`t!P$DcdkYSz_v{=zhIa73&4nZ(Cer8uS4EnS&zZ&DoQ~f7p(4 z_AA_d7=5oCPaMSqFhkE0sBhuiyufG!TM}7Gn!3CDsG*xk`|S>q8&?&(6;8~{%ZsEU zGBuymz^#3Wkq9bYF6b*sv%#QMrz<*L%hxRAjlNc?zONrk`BdZKI>uo|feR>$GGjWs zs)5hnaql+9j7DqB9%{!8-RG{Sf7{0??g0j2gN-R4^C+x?IAG14I>Ezyu!FS-he-u3 zq0Xmwgl#dWXweRg5t(SDVrAn1gi-|_rT5o$x;IC&h>%PTV_d-TVFh=-zr-8!6-?*W z&ag@0TjZ;a6i;s+B8|S!eW`-%N;dDk8i2wF2Ou?psQ_{#U4CYF^oJzHgBbhf5&-Ro zbx*AV;G_%Y!z)Pyw)k_6q-VLP@JKOwxa$|XmMmCXx9E}F}39UNEgE@)_YP=rED0nUa(X0szx-CpOIl=zq%Rg@o zMs}K}g>AgN6n_nkQ!Ko!z+R#b&x7Mbv;>}vM$H&#DjdH=k@~4h9G0Y=Pa>@QKg;a#p8kD0y@Z!iZaSC_NmP6Gxl*l z1}-hq$Y0$)_cost_-XE+#nvO+;%^py9!Yk4n44Q z^6ke|sJNYS1*7FMRuo${(OH99^h%RtEp*qcSMTzB`t=v*Aq@=1bz`ya&5`R!DW=&_ zU^KG$_DRamYDG>dy|nsPQ?iQjW>>Cg zGywhSwC;_PjcDgdr7*1OZ0N(=E0n-F_e}&)cYuK>lIx1 z?{TzK+~VN^HnjUF;15&UO`WE8<&FcN{xj*qgBMp9j)SlH|NOb50dxFVh^;U9^T1{0 z^@bHcz6zSvzF$Uv**9T@R=2%MP_Hvgg3{39(>QW$Wwb)w>CNB!*Mwm?>*Q01ZGIKM z#P%`O;GsVom z)Peo0ksbUU0A{r7Zis6U|ER5a5&WFoc+i@OZIvu+l}5d)5!R>7nj=S*v3;p~<7D15 z^$I1<=aA01lB+|8VB(@`Ons5{Q$1i@gx$ou|;YkM{Z0Nf*syA?0f!zM6y zd_p{(?IXRfbLbz(quN8&UVD$^EeNR2{84%5)|h~H{7y9VT|~rU07U<-x;Icppn5}J z4Y>PPa!)(aWB*WyZjo;D8CQg9-Xs4@S5vKI-KE1|L{0s6)BUPVQ zd)WuxuAc)qK)03J!>n{4ns^G4Np_U?3DmW1_)Q9Qbc(-fz_WOJ!DM6ct%cyOEf3d% zV=6V&0a9wh_a+Cbc8Knuqz$MS@1@iHL|JY0p=%>_Z>k()ydAX=+*{$9$Ib+xaMGR= zm7KA)Vp3P7whDyMXe&bi;qk*$YqI+eV}`Dg-JF4!i#2;5n zFL`eOA`_^m`VhMC`Lt2mj-PZP!?D`JCjE>_BBCsg)7=>-P=$q>^pwl`4O6^StH?GQ z)XFMl)ydV?u3A!2CKpw#bllvVznN7TzeDpM-87CVwIO zMa#7y^(o2XL$f*HEAl-efda{wr)YE>^dKq#T=T%K+dVLUs zcqCOdFAI_>`oJ>(N-$A{v4HoP6U}*BC)wVxB2yC!0%VC%)wvi?rbh?<-;OQTy#=!C zW9EJ*C@?CELsXX8W!<}UWoIkWWKD*a1lACTeLqm5ucEt+H-{Hhy zv-Nk}%ja)UVuXe-!jBb?()AR%kzp}W+REf?VuXi!O~b-YkNJXZ)fL^_As?J(yiWTn zd6x2Qfo6ro3PULuc9VgPl%@usQ9YSbih zCkotO$c?svyJ*JOg8j=TAX?aXystAbK?dZcJ}IpjQaa&V3CGK(eNC}=#}BU(x^AaG z(7jc%_!yVklCOz!em%`zlr-b*GO*Fl9_W($$!J7ac0ij4*zZ^2R_MAHXc%t8=a%Ba zF!_y{>!fWlt7>Tuz*C4`q-;0DufeZo0KFSom0^jm- zq#E4%;%woSpS`bp3+4T1oEu*Cu5l0DBabopbi4cuM_&{&j7@3r>Ig1ynAJOlKhdZUQzQ# z4hU)P-4gF<*Q+?uT;|!Dj!S-RnqK(`a?5H&qbH&-{8IPU%6V*5<*bfIK6y_Rbz^av zpY&d+9|rf@`wb}Gu{|J$6xwMxZnL9ldIbb6@qbk=r6>~Nt-tKjy~Xn3&-hDOZRE4> zOjG4@_{8pZv3(~znL4YY6@tB54PHwpNkY&49a?F!Ud62h@-%XJ3F~R1T5(h^^lm7& zsOcyITV2oV-fkK33-0AkTyNadcgP|G`wp02d$K*|tT~)?bbOaBxxP$3ZBbV(+sb_j z1wk694KpOmJvJyG6;kD6s$L1R)Kit7!T=G?;q3dmw_dK}%&6on2jdpNdE`_=+v@S$ z^g#FA-UkcL)zLb+X}n4*I{uQ(IcFx!lBMjq-P^ z8m(hIMhutq3MkgJ2)(o^*3O+d-#xzY&w)$F^J~Wm{+7Q_VJ>-}m5M6Rv1D3^h;^QE zF=aV0U1~&hc=3#*1Y7AE7fK;q7`O$UV_}mg;l+7Us&}>g7I*T=l_nRh})Rk6T42;mk%I6 zRyweSDwV#_kDpPv3JgxHU z8q-QHD$S7D-{%M*iL)PCHAqYLkRZIiwE=>Jeb_`r1UeJqtT_SAX+vDE20Zv=rMk$Y z9bM$^h0jm6-S&Z1f0U31UX!bzJZB1@^LuFu>*UP1D6J+&G!Lz+j)|pUt(mgWf@jez zMP|Qjj*wsHbIl61s~N2u{5Bxs>bYcvks+Skt3RusWcs(gbE7&=3{f~o^0JO=eU&l) z4B0*xU*i=3!B4Gss{+2Rqw|L4yEUixrmrs{)U!7dC<7=j&E| zG1-T&C30Hv?!oyR?j zz-?9@gONV`X`DxFKj2*u!B3&Rrx5nFo~qc(rPz4ILa0YyW9XnG1qHUFB|J9)&>l87 zFS1Oez24ts=CI|LekC0+MAYhBnV?$R;&`2X42F?BFMfl9ei#O(%Iej7vrX`@Sm#db zc4#wFRM;UkzGNc2xlWs-Ga~~cJR~9n&jfn7j=l#{D=bR>#R@T)=xUwEiOZd$z`GOs zYoU@r0BMmlBmJiukIn0ItuS**B-FjnQhgJcW;pyWnnC zYw|n!PMyDKMUSMBzxK>Zi<$DHd=tn;#$EVik^HFwKePJmW{41R*2CbLz&U9%ax}C- zOO6q<%RHkxMk#Z(BmvMlowHpONy4j)DD+7(%1ri4mT#x@*$Asvmd0o)1Vsh$Es;KjcZ||e9lB`GU3*u_GD)9Zu@XcrEiZq;ix6G1lklx> z)O)h6;isv$vl%EmI;qu?&hopN=MouDOP|q0d&YbACvx3uoPK#}UG_$CyWgY!@Y2Kf;U#21Iwqk2|-wgMlP*c zqZ#vP^Lb=+tZWEy*6La{HnjB-zx`0VM5Z=pslwb+-+)H1r*Mp@@toPwQ%=!R-jn~f zb~mi-&?b<@SN;$o44vKDEYyO)6VY|13z#t!+(uS~>EXmC`6` z^;H*%JuX=k1UO5BR;R5bzUF|Nek7QeIw9TB(4ElBc*Ocf*bPU?lyqQ7twXP*9q<65-MapZxR+?yl+D6Uu|$6l$A{Pzc}RMQLXHE%lVzChb1nW(@*c2nO-l zmm-sS_ z@xtbHRhl#AIDzr`6Vp9C{A_G|Iz~zac=m!pCIKc-QaO9tnzLzD*e93gexr#t8jUobvMtGg7Ja zXOCIos+KSBpT8zGE$6*eFGltf)Azz3DaCdfU8TyndKzP?zC8Vf)vJ1AAg+zuZu~5@ z%>9R?o?4ew_8;7Q8G5bAki^Bk66DD98Y@?Wu5H_BwN!7M?0WgxwO~08U@56!uRW{1 zk%ol_RAqO&<1ha>`|M}`;6PU=y_0KTP@MnIzdbwq*T*-Go!)lk`o^vEthkh{ Z{6C<%72RYJd-?zX002ovPDHLkV1hH +#include +#include + +NetworkInfo network_info; +Size window_size; +int64_t last_bullet_fired_time = 0; +bool alien_hit_right_boundary = false; +bool alien_hit_left_boundary = false; + +struct PaddleEvent { + bool move_left; + bool move_right; +} paddle_event; + +void Update(std::vector &entities) { + std::vector bricks; + bool brick_found = false; + for (Entity *entity : entities) { + if (entity->GetName().substr(0, 5) == "brick") { + brick_found = true; + break; + } + } + + if (!brick_found) { + Log(LogLevel::Info, "All bricks are destroyed. You win!"); + app->quit.store(true); + } +} + +void UpdatePaddle(Entity &paddle) { + if (paddle_event.move_right) { + paddle.GetComponent()->SetVelocity( + {std::min(paddle.GetComponent()->GetVelocity().x + 20, 20.0f), 0}); + } else if (paddle_event.move_left) { + paddle.GetComponent()->SetVelocity( + {std::max(paddle.GetComponent()->GetVelocity().x - 20, -20.0f), 0}); + } else { + paddle.GetComponent()->SetVelocity({0, 0}); + } +} + +void HandleBrickEvent(Entity &brick, Event &event) { + CollisionEvent *collision_event = std::get_if(&(event.data)); + + if (collision_event) { + if (collision_event->collider_1 == &brick || collision_event->collider_2 == &brick) { + Color brick_color = brick.GetComponent()->GetColor(); + if (brick_color.alpha == 255) { + brick.GetComponent()->SetColor( + {brick_color.red, brick_color.green, brick_color.blue, 125}); + } else if (brick_color.alpha == 125) { + Engine::GetInstance().RemoveEntity(&brick); + } + } + } +} + +void HandleBallEvent(Entity &ball, Event &event) { + CollisionEvent *collision_event = std::get_if(&(event.data)); + + if (collision_event) { + if (collision_event->collider_1 == &ball || collision_event->collider_2 == &ball) { + if (collision_event->collider_1->GetName() == "bottom_boundary" || + collision_event->collider_2->GetName() == "bottom_boundary") { + Log(LogLevel::Info, "You missed the ball :( ! You lose!"); + app->quit.store(true); + } + } + } +} + +// Pass a nullptr if the input event was not a chord event so that the chord actions are disabled. +void HandlePaddleChordInput(InputEvent *event) {} + +void HandlePaddleSingleInput(Entity &cannon, InputEvent *event) { + HandlePaddleChordInput(nullptr); + bool pressed = event->pressed; + SDL_Scancode key = event->key; + + switch (key) { + case SDL_SCANCODE_LEFT: + paddle_event.move_left = pressed; + break; + case SDL_SCANCODE_RIGHT: + paddle_event.move_right = pressed; + break; + default: + break; + } +} + +void HandlePaddleEvent(Entity &cannon, Event &event) { + InputEvent *input_event = std::get_if(&(event.data)); + + if (input_event) { + switch (input_event->type) { + case InputEventType::Single: + HandlePaddleSingleInput(cannon, input_event); + break; + case InputEventType::Chord: + HandlePaddleChordInput(input_event); + break; + default: + break; + } + } +} + +Entity *CreatePaddle() { + Entity *paddle = new Entity("paddle", EntityCategory::Controllable); + paddle->AddComponent(); + paddle->AddComponent(); + paddle->AddComponent(); + paddle->AddComponent(); + paddle->AddComponent(); + paddle->AddComponent(); + + paddle->GetComponent()->SetSize({200, 30}); + paddle->GetComponent()->SetOwner(NetworkRole::Client); + paddle->GetComponent()->SetUpdateCallback(UpdatePaddle); + paddle->GetComponent()->SetEventCallback(HandlePaddleEvent); + + return paddle; +} + +std::vector CreateBricks() { + std::vector bricks; + + for (int i = 0; i < 10; i++) { + Entity *brick = new Entity("brick_" + std::to_string(i), EntityCategory::Stationary); + brick->AddComponent(); + brick->AddComponent(); + brick->AddComponent(); + brick->AddComponent(); + brick->AddComponent(); + + brick->GetComponent()->SetPosition({float(190 + 160 * i), 150}); + brick->GetComponent()->SetSize({150, 50}); + brick->GetComponent()->SetOwner(NetworkRole::Client); + brick->GetComponent()->SetColor({85, 0, 0, 125}); + brick->GetComponent()->SetEventCallback(HandleBrickEvent); + bricks.push_back(brick); + } + + for (int i = 10; i < 20; i++) { + Entity *brick = new Entity("brick_" + std::to_string(i), EntityCategory::Moving); + brick->AddComponent(); + brick->AddComponent(); + brick->AddComponent(); + brick->AddComponent(); + brick->AddComponent(); + brick->AddComponent(); + + brick->GetComponent()->SetPosition({float(190 + 160 * (i - 10)), 80}); + brick->GetComponent()->SetSize({150, 50}); + brick->GetComponent()->SetOwner(NetworkRole::Client); + brick->GetComponent()->SetColor({85, 0, 0, 255}); + brick->GetComponent()->SetEventCallback(HandleBrickEvent); + bricks.push_back(brick); + } + + return bricks; +} + +Entity *CreateBall() { + Entity *ball = new Entity("ball", EntityCategory::Moving); + ball->AddComponent(); + ball->AddComponent(); + ball->AddComponent(); + ball->AddComponent(); + ball->AddComponent(); + ball->AddComponent(); + + ball->GetComponent()->SetPosition({600, 500}); + ball->GetComponent()->SetSize({50, 50}); + ball->GetComponent()->SetVelocity({10, 10}); + ball->GetComponent()->SetRestitution(1); + ball->GetComponent()->SetOwner(NetworkRole::Client); + ball->GetComponent()->SetTexture("ball.png"); + ball->GetComponent()->SetEventCallback(HandleBallEvent); + + return ball; +} + +std::vector CreateGameBoundaries() { + std::vector game_boundaries; + + Entity *left_boundary = new Entity("left_boundary", EntityCategory::Stationary); + Entity *right_boundary = new Entity("right_boundary", EntityCategory::Stationary); + Entity *top_boundary = new Entity("top_boundary", EntityCategory::Stationary); + Entity *bottom_boundary = new Entity("bottom_boundary", EntityCategory::Stationary); + + left_boundary->AddComponent(); + left_boundary->AddComponent(); + left_boundary->AddComponent(); + + right_boundary->AddComponent(); + right_boundary->AddComponent(); + right_boundary->AddComponent(); + + top_boundary->AddComponent(); + top_boundary->AddComponent(); + top_boundary->AddComponent(); + + bottom_boundary->AddComponent(); + bottom_boundary->AddComponent(); + bottom_boundary->AddComponent(); + + left_boundary->GetComponent()->SetPosition({0, 0}); + left_boundary->GetComponent()->SetSize({50, window_size.height}); + left_boundary->GetComponent()->SetColor({192, 192, 192, 255}); + + right_boundary->GetComponent()->SetPosition({float(window_size.width - 50), 0}); + right_boundary->GetComponent()->SetSize({50, window_size.height}); + right_boundary->GetComponent()->SetColor({192, 192, 192, 255}); + + top_boundary->GetComponent()->SetPosition({50, 0}); + top_boundary->GetComponent()->SetSize({window_size.width - 100, 50}); + top_boundary->GetComponent()->SetColor({192, 192, 192, 255}); + + bottom_boundary->GetComponent()->SetPosition({50, float(window_size.height - 50)}); + bottom_boundary->GetComponent()->SetSize({window_size.width - 100, 50}); + bottom_boundary->GetComponent()->SetColor({255, 0, 0, 255}); + + game_boundaries.push_back(left_boundary); + game_boundaries.push_back(right_boundary); + game_boundaries.push_back(top_boundary); + game_boundaries.push_back(bottom_boundary); + + return game_boundaries; +} + +void CreateSpawnPoints() { + Engine::GetInstance().AddSpawnPoint(Position{390, 850}, Size{10, 10}); + Engine::GetInstance().AddSpawnPoint(Position{780, 850}, Size{10, 10}); + Engine::GetInstance().AddSpawnPoint(Position{1170, 850}, Size{10, 10}); + Engine::GetInstance().AddSpawnPoint(Position{1560, 850}, Size{10, 10}); +} + +std::vector CreateEntities() { + std::vector entities; + + CreateSpawnPoints(); + Entity *paddle = CreatePaddle(); + std::vector bricks = CreateBricks(); + Entity *ball = CreateBall(); + std::vector game_boundaries = CreateGameBoundaries(); + + entities.push_back(paddle); + entities.push_back(ball); + entities.insert(entities.end(), bricks.begin(), bricks.end()); + entities.insert(entities.end(), game_boundaries.begin(), game_boundaries.end()); + + for (Entity *entity : entities) { + if (network_info.mode == NetworkMode::PeerToPeer) { + if (entity->GetComponent()) { + if (entity->GetComponent()->GetOwner() == NetworkRole::Server) { + entity->GetComponent()->SetOwner(NetworkRole::Host); + } + if (entity->GetComponent()->GetOwner() == NetworkRole::Client) { + entity->GetComponent()->SetOwner(NetworkRole::Peer); + } + } + } + } + return entities; +} + +void AssignOperationsToKeys() { + Engine::GetInstance().BindPauseKey(SDL_SCANCODE_P); + Engine::GetInstance().BindSpeedDownKey(SDL_SCANCODE_COMMA); + Engine::GetInstance().BindSpeedUpKey(SDL_SCANCODE_PERIOD); + Engine::GetInstance().BindDisplayScalingKey(SDL_SCANCODE_X); + Engine::GetInstance().BindHiddenZoneKey(SDL_SCANCODE_Z); + + Engine::GetInstance().RegisterInputChord(1, {SDL_SCANCODE_LEFT, SDL_SCANCODE_SPACE}); + Engine::GetInstance().RegisterInputChord(2, {SDL_SCANCODE_RIGHT, SDL_SCANCODE_SPACE}); + Engine::GetInstance().RegisterInputChord(3, {SDL_SCANCODE_UP, SDL_SCANCODE_SPACE}); +} + +void AddObjectsToEngine(std::vector entities) { + for (Entity *entity : entities) { + Engine::GetInstance().AddEntity(entity); + } +} + +void DestroyEntities(std::vector entities) { + for (Entity *entity : entities) { + delete entity; + } +} + +int main(int argc, char *args[]) { + std::string game_title = "Rohan's CSC581 HW5 Game: Brick Breaker"; + int max_player_count = 100, texture_count = 4; + + // Initializing the Game Engine + if (!SetEngineCLIOptions(argc, args)) { + return 1; + } + + if (!Engine::GetInstance().Init()) { + Log(LogLevel::Error, "Game engine initialization failure"); + return 1; + } + + AssignOperationsToKeys(); + Engine::GetInstance().SetPlayerTextures(texture_count); + Engine::GetInstance().SetMaxPlayers(max_player_count); + Engine::GetInstance().SetShowPlayerBorder(false); + + network_info = Engine::GetInstance().GetNetworkInfo(); + if (network_info.id > max_player_count) { + Log(LogLevel::Error, "More than %d players spotted: EXITING THE GAME. Player ID: %d", + max_player_count, network_info.id); + exit(0); + } + + Color background_color = Color{165, 200, 255, 255}; + Engine::GetInstance().SetBackgroundColor(background_color); + Engine::GetInstance().SetTitle(game_title); + + window_size = GetWindowSize(); + + std::vector entities = CreateEntities(); + AddObjectsToEngine(entities); + Engine::GetInstance().SetCallback(Update); + + // The Start function keeps running until an "exit event occurs" + Engine::GetInstance().Start(); + Log(LogLevel::Info, "The game engine has closed the game cleanly"); + + // Add Game Cleanup code (deallocating pointers) + DestroyEntities(entities); + return 0; +} diff --git a/src/games/hw5_rohan_space_invaders/hw5_rohan_space_invaders.cpp b/src/games/hw5_rohan_space_invaders/hw5_rohan_space_invaders.cpp index 1a10cc8..d23f46b 100644 --- a/src/games/hw5_rohan_space_invaders/hw5_rohan_space_invaders.cpp +++ b/src/games/hw5_rohan_space_invaders/hw5_rohan_space_invaders.cpp @@ -353,7 +353,7 @@ void DestroyEntities(std::vector entities) { } int main(int argc, char *args[]) { - std::string game_title = "Rohan's CSC581 HW3 Game: Platformer"; + std::string game_title = "Rohan's CSC581 HW5 Game: Space Invaders"; int max_player_count = 100, texture_count = 4; // Initializing the Game Engine