From ec3c6191209dc3b135b877fd9e0ce02ca852a8b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elias=20M=C3=BCller?= Date: Sat, 7 Nov 2026 14:53:00 +0100 Subject: [PATCH] alligator arena minigame: walled pit in a testlevel chapter, waves of alligators with several lives (coins pop out on every hit, blink, back off), bites cost energy, exit opens after the last wave; options for lives, waves, energy, coins per hit and chapter --- docs/manual/18-mods.md | 29 + docs/manual/img/mod_arena.jpg | Bin 0 -> 38262 bytes notes/img/mods/arena_defeat.jpg | Bin 0 -> 34347 bytes notes/img/mods/arena_fight.jpg | Bin 0 -> 38262 bytes notes/img/mods/arena_win.jpg | Bin 0 -> 57430 bytes notes/mod-arena.md | 107 ++++ .../llamamod/mods/ModRegistry.java | 1 + .../llamamod/mods/arena/Arena.java | 201 +++++++ .../llamamod/mods/arena/ArenaImport.java | 183 +++++++ .../llamamod/mods/arena/ArenaMod.java | 139 +++++ .../llamamod/mods/arena/ArenaScripts.java | 510 ++++++++++++++++++ .../llamamod/mods/arena/ArenaTest.java | 159 ++++++ .../llamamod/mods/arena/ArenaTestMod.java | 56 ++ 13 files changed, 1385 insertions(+) create mode 100644 docs/manual/img/mod_arena.jpg create mode 100644 notes/img/mods/arena_defeat.jpg create mode 100644 notes/img/mods/arena_fight.jpg create mode 100644 notes/img/mods/arena_win.jpg create mode 100644 notes/mod-arena.md create mode 100644 src/main/java/com/eliasmueller/llamamod/mods/arena/Arena.java create mode 100644 src/main/java/com/eliasmueller/llamamod/mods/arena/ArenaImport.java create mode 100644 src/main/java/com/eliasmueller/llamamod/mods/arena/ArenaMod.java create mode 100644 src/main/java/com/eliasmueller/llamamod/mods/arena/ArenaScripts.java create mode 100644 src/test/java/com/eliasmueller/llamamod/mods/arena/ArenaTest.java create mode 100644 src/test/java/com/eliasmueller/llamamod/mods/arena/ArenaTestMod.java diff --git a/docs/manual/18-mods.md b/docs/manual/18-mods.md index 088bed4..198c9ef 100644 --- a/docs/manual/18-mods.md +++ b/docs/manual/18-mods.md @@ -59,6 +59,21 @@ not want with **Remove…**. ![Removing a level](img/levels_remove.jpg) +## The Alligator Arena minigame + +The **Alligator Arena** mod (Levels) puts a small minigame on a TestLevel chapter (default 8): +a walled sand pit where alligators come in waves (wave 1: one, then two at a time). Face an +alligator and **kick** (Action) or **jump and press Action in the air** (the llama dives onto +it). Every hit costs it one life: it blinks, backs off and coins pop out – they count on the +coin counter. A bite costs you energy; with no energy left you get the game's usual +*Continue* screen, which restarts the arena. After the last wave five bonus coins and sparkles +appear on the purple pad at the north wall: step on it to finish the level. Unlock TestLevel on +the **Save games** tab and pick the chapter on the world-9 map. The options set the alligators' +lives, the number of waves, your energy (1–5) and the coins per hit. A level project or +another mod on the same chapter stops the apply with a message – pick another chapter then. + +![Alligator Arena: two alligators, coins popping out](img/mod_arena.jpg) + ## Command line LlamaMod can be scripted: @@ -80,6 +95,20 @@ The following list is generated from the program, so it always matches your Llam ### Levels mods +#### Alligator Arena + +A minigame on a TestLevel chapter: alligators come in waves into a walled pit. Each kick or jump attack (jump, then Action) costs one of their lives and coins pop out; the bite costs your energy. Beat every wave and the exit pad opens. Unlock TestLevel on the Save games tab. + +*Id* `arena` + +| Option | Values | Default | Description | +|---|---|---|---| +| Alligator lives | 1 – 10 | 5 | Hits each alligator takes. | +| Waves | 1 – 5 | 3 | Wave n brings n alligators (at most 2 at once). | +| Llama energy | 1 – 5 | 4 | Energy cap of the llama in the arena (5 = normal). | +| Coins per hit | 0 – 5 | 1 | Coins that pop out per hit (5 more at the end). | +| TestLevel chapter | 2 – 8 | 8 | Chapter of world 9 the arena replaces. | + #### Test World Turns the hidden TestLevel (world 9, chapter 1) into a playground island: a gallery of every character and object model of all worlds (standing still, grouped by world) and a parkour course with checkpoints. To reach it, click "Unlock TestLevel" on the Save games tab. diff --git a/docs/manual/img/mod_arena.jpg b/docs/manual/img/mod_arena.jpg new file mode 100644 index 0000000000000000000000000000000000000000..98afa6477008ea8fa5d613c4b7e03776252c3689 GIT binary patch literal 38262 zcmb5Vbyyo)+b&Mspe<0mKwI2PaNmUzN+3`YT#FZi6nA(l(Bc~}nhha@phbeqrnrP4 z36x+(f))*~C*AM&p7VX@I=?@D!*xxDnYGq4Yt4P%>sik;bNS=)C)Gm`P!mXXm_-Jzy^Ku1UWfR>h?@i7zqBUT1l zTIQ$BtnBQZoSgJb&$yp)a6jhYpLsW|02M7JQHfp;Ea-=y~DZncn7Jwvi6O^)v)< zLfnOCvql*oE}-W9^ay&TN9=<%z-VZ}B~>L&STp!nOv(TdT;jQ8##3o~wH@#?*V@L5 zo1v%Y+dzwEZ#>tt&MJVNT>1M)s7{*p5AD#cNG?MnNQm5 z+!#fgfNyN3WbV<-13og&`_V=!bl9j`?^M zV^TV@2GZGL0$7-11~MZSIDoG^YPS39+JiWgji-iYtEv(50lR%Lo+{edv!>&RgyBFR z)(pp&316kOpDn=85L}Z72gHN_%`D5uA>4Uws*U-eJV0vGd^NS>%J6W{~ z@ijR0l_I3>erEeHns>BOYu8cP5MR5u=q)SW)gLeG*38d4h5%ciTB;08f>qYK=i`+A zD$g%U)7Vokh~E70uhVe)?KEYcHdP*e)%#uup^Gul5nM9Cvz*NGN{n&Q$n ze8GOEPY+=&4x*Fsp7^Z72!Po-Gc`gm?O4} zBlv|WYDM70@TYSM*NxJ--Z_Wxmo2g!MruSW0Pc;edgto$CDr^zciqkA(oVKw|0y%W zaAzq-YgxsD=9oV3GQN1>Twy!&M^E?cY>Xt9tiV#d&BCw*l(6+{+>xGQCu_>Zq>@a2 z&E`4Z4)+?*R}0l-57KS!xEsx~jkTJ4CdxvFmsF)<(JEdOcZq@mr$Q?+$<9;fH7=v2 zzInu~2A0)Hz1OP)Gni@w|3>%wPB?w@Bx49$dvyxUHJ#iR=&ua{;Z}}$nO&I4=r5NQ zJx`pY&O==N8|+v3Ur@s+jh}&0_4-L-6a>8Pb>PV ziA1ub0|2&DGSoo(O6s79xk!sOz%@#%)URf^_{H7WA}iQB>{*^~iZCTuH&Gg6=AunV z;_`^eO0rIHZTFxcwZp;ccZ^x&A}-r@i+ zjITFoFMju#>kEr)c@ZhFy*&`lIDip#QZ2wvq$O?x++oMBB;keQz!-BmBye|Azd=|= zI!KG=S*-np&b_K|_OFxk0Vz^dt=IOlIqmlJbI%QujzbY{ddwvi zPs0hYP{%tLS8YBjzb}HchM*kpZ>0t@3>W$O(SIPZHl;rt(^to^Ck+u|^Rle!&j%md zf8Aw~^f^-EGe(0lPx!E6H|?q#!m&3XDp9+R2-Sw7V9|*m3xwF_}M( zr=mY{05vQA8Npst%u`TSkztm=sD-0UMX+(hOSDW+e?n6CdQPIh*elQQu6kgz`o0K# z$t9JjRr;JytFECwnTGR^Vv|cMIUj=;p&g!QXFBp38;UBA;r#u^UJhg*&%|w>FH>+|d|0a4tcw`MD>j4V^9B6B^^I0F&Er9}CY+rTND^g6t-C z?$dZGZ+2M;{(AtceSNB=}1G4hJe#ZJL zs((L_|BkxrS@&_{DN~A$X7#v=$F6n-)}ON>>?YQ#cJ5qFBXi5t(BNm)zO%5(pwN8C z&F*pi6j%K8sIpOYCLn5LYgL^W&gQLR+S6+u12?iIpY_{iCHM52QU9ZanmxY-m-_4O zjc5nEUODkA*6C?aa#a8Qa;r4Jxgk@xcv(=#+c|2;o;E^X50+D&)NZ6FXo*sM?Tp}{ax+Y z$tkujS^S!?AMK25*4cELTRvZq+xI)mNgW%vn(?daN?!E{dpKHHA(o==e@V3uXyx^w zJGmQ1lsblAF)__gIH$==4fNM4vQpErsGSU>N3_M|Ex6u>ZlHP7JghR`EvO88BS+%OT$k*1DNbBP+P#!+o|GPgwBzuYMr%xV>V78R?ItiR>l;<8Ps#^rkuXnt z+m`E^aCwqi@{d*CRNYW0if%fK3uF6XvSW1Dnbl$=|h z%r`raG85moJRICwunQgjrXZ0&1WExV^y&Gz&u)|Kr^zbtcZnXl32eg^#jCY}%Ef-j z*-`z?(xL{RCpnN%vTnzQVPb=dH_|}o4&qsceJyYLds>K@Q|&yRh+w2p74hWx-sgbt zl}(rwCLc#VIaPRy?)}hvQ=t_r3nM;E6@4=|{cgN1-9LL077LF@h;J6{Vsw3%I%d`H;_v zoIroLx;acE$~&&FMqo`EEx32Q!0|w=*s;3zK;QX$HN&eG>I-|KJnN|fR75n_RBtJ` zbCo{qWO!aAkwlK*YuV=h(rZVK{OSkqCn zTC+*8$!QMO*hxTaq$Rwt;gV`lg($PPVos<>0;Qg>>3?Fh%4`b(#Il%m8PK^R%JYfe zjcQ&auCEPlCO^e(A#xtu+vZhuCFh4QMT%~vJuzrGJxmP!$nf`tZ`Qekrko%}X)X!g7jeQh^LJwU87Xea zzj|6U#qDCEsbl^{nSX2~09PY_*8J3Y`Jpl5C-Bub0ZMh9|6LIXx?&?Ck_3DZ;aU^|8A!*?f^}fgIcnv%l`Xwxaeq9X8 z7j!$>QZh>D{wc&}T2qfO4QYS{?|huZSHyz6J`2~K94{wzC(Vb(1i&`#Gac*;nhl|K zZN7V*tn5fVwIsIkRG{YL{Y0EEskEE2v#}WE{Kn?Fyu+MRq*FyDTq0?b-jAKgcnIA@eP8bR@HFi;hi82J$Ve$v5m9bMI@U>G%9;xUCQ_LC~+vyWC#3 zB|JI72JP2Ck66V^(RgOZ238?h>pSL?mSf5aoXw9VAzmq^*n35m7y;CFfQXK-ugnM* znAe}M%5-I-^%S&xCK;%raRB*wZi+e2CTM*nFOBh4KqK3~4=z>Af#qpD|TZ+Ug3=I9u>K zo4ON$@`ek(Qy3c?I}KCA?rGSD*>;}eMrPTJEL=(#&JVb{2(wy3VUvzaTl$TO#Ff8` z@MUSIbq^F^VfA}l!|d_r;p8x{Jyh5Dy^FiED&&fbOp8mZKWfiwLSf{T!LX$FNy}#C zOK;SO#F^FeTX_ncr}vgFmRADZ^Rod+r(yiB^$ATy_s=8k`$~pMC99_S5~$gs`Y;>% zt@3s>xds&?6{bf(^!W!z>9rKB33MS)dfp+dXS!P8TAzoPR26&|msHK&pUW<(;`bQJ zRy5nr#^X8ZSN{rSM|c!8qg0hr&en&mHrGR*of~!RH)!M&0U&wgr`1a;6Sv(~Yw{V+ zIf6K>-hNY5PA#zGwq=mBdnPZ`Ns6a^96Jaw6ULeTM&N%D0N>Ox)GEGCd7mc$9DuN>d zm@A+4{it^4R0({ElHIvz%FmdU;n^^b)+UE-7f-z2pGl^_q%v;EfiCMXUsB!S(7j*` z?Jb`Q4J$S*=h+H_o^aXXlx{Gc*zN(@3Ux^gL0jlVLYIuZg-JiY9)-Q6dK-s0R?=BZ zkppKb{BW;Aa0Koyt5qhBsYO-O3KE$!#Z(tgFT_ z!eyZaqgz20QBS8s|q_Z$`Nj!zrvoNxx-nhHTD3qSeTubx4 z!<{zSuCp$-V_qi0CFW~hZy$3wWJ#M+UXB0X^D&>^0F31&N)!tmsHb#>`;9DpfKHv<^D=D4oIJVu+`K#%?@@Z!0F(Us;0j?W=l{n zr(gcjnl(~Ndi#v!xO-4W1^aikltSSi>T2*t>A}T&Uo~5?v)^+92MSTlg3nr8XYxc# zPr79V)Dn^&Xt26R6#HB}zTdR3fc8OAVT6zuo3|Jb5KA}@Cw@`pEcm`pLH7lr?vm>M zO_FJwCDJHx{JYEf8h!yZpU)qkbK;NnKf0X#O_k?!X7tBYz_yF9k~WQ_n%=d%JuMY-Z@BE+Y<=k z3342P@&Bq+URE~>Pz6W{$}pt-94yI3%6p(8_iPUyH+*Z);;bXqhSa2C$nO@7cC)*} zQdjHunSL>(%)oO%vWKjOJK<*G>T~vwWG$Q(s5FSH*FTPXQfzDZI$Mzk>)qDXfV}ITCW}cP9Diuql_Fo= z@T+6Att(_*Hl%CbT`K{o?OLoRnhgKhA?oJT1QuAp{pnMznk_I2=lwQHrftj#O^phj zKYMWk{|gI|N=3h!pOcyx)4UM4q)Iq(&}~1bU1P-i_kH4;O2Nt}n+8|)3z0Q8GUIE1 zc;P^4I-JXA@DILZ-NjQ=$U$P*!Wj!dhoTn?;}tt*zojF9g|h1X{mVyL*&g2j0D#;} z=8t-MIvoD{o)WZ-=cyDINe}LEP^ZM7*uJ0snCY{#voZ6x3Syhkj)?(ow;ae+rc?B1 z?x-7C3x6eni$zLZQmHBWVC3{shWD@>>!WO!RLeqQXOEfAy%gEyM{1L|YwgYs-wHW9 ziv^rBO{6bZ7OIRi$+AfwNC}LGn+x*|EX^FcOolSBo(+DI0)2~^>68GT=42YWr}8de zI7-S&Ou(6|esOB-p{>>)Jtu?SeM(wQiGkj_xa{LF_8i;8CcFALFPwS1pRC z#F4rcE3h1*WtKW?blp!-D$s<_w$;*af)BDI;$N-UqURPXtC>+cO0Rz?_sch11G zi#QVz8MtVb#4UOykgc zPQNY&(lurrXVIu`EgGaSfID9-Bq{{zRG5m#tZFHD4EQkQAa1U;eJ@_`M@yTFOuGFl zhI}}{w>cs+4d3}4vB#Sg)UuSPR}{e**3|n@+-cE@`!%_{nd7=JrzYv)sm3`OAPd?u z>pZF;Y@l6rrdu~|BhJ(E&TS{h>mwgq|5l^azf+!0=F2~A%sBHXG@CM*W-~2I;rUe4 z-9yHbd{j*KB3G8S49DGkLU{8VwKB4iratw;#{~gjPK4)i6;2mI=MP4`eO8qeWr@8U z1)0vP*7xMf(---hbZPdLw*C^S4&eq_az3L7wj^xwgm0dh{nREct9aoo-e(2zFR>#p zNCUwqDtUU=VO3Ax**&6rT(MzS={y!>P>dd(PnyRiZY(=Vn@cNMNEB5i{w(i~zqXsn znot_#;c-U^BMQTtSklx)51|B;*Lap_$~C*94m=Zc8xN`}Y? zyEp^q>78uo!8xd5GYZN?;0@hY{y`zPpV zO*uh5@Tv3bE&%*xhDC-3&_y;QtW2!F_NuEXDQbvM7QieoZ;CIj1uBj?ZC_H+jc4yw z*!y7#-Du^=pk`DGhGfXzOi%gU5tm+iz0 zR4X=s!#!$a1EX^Xc@aA`j6%L%wj>D4r-zEo1jg}<9Qj3Wtn@mko}!h8ih-4`p^nQJ zDN@r9KGp%q>O(|VsE;V@#a8!4Dg0J}E&+7dD!OneSh)}9E`=RV?KVl2t!C_FvB>ag zxvAG^Sy?_@Qn#2R*N9;Yo;}}1VO5M8m9*Hvbbp4v9A=7?&ne1c)1CJdk-emf;s4?L zXn(z|D^U-1>vMcJi_(|%v?Yy~-WwX}dzibg`@^w1owhlKAd4Lhns?Z{DQ@L&<%ce* zd{Ni{&gWA*pBZNKvRNCj_*Gny_5uOrW$Na$hDY-)$dMvpX`Z~2oB=1Z>?aUJfaMw^ zo1lJC7JJ7Goh1&xW3FOKFw-wJsK*y8l1Mda7ZXc7unFW^%?zEAl)Q6F6aRO`5j~Ae zbjcc7-l%^p5e=q-uTFH>t;D|88z?cVU6a*Rw=Y z?Wb=6?1oEp&4sDr_gCqE)^RwDl{bu5Hy&};K^L-BIKhrSy3>(tV@+nchO0jE!8?1& zrYg_t{3EqY4&y5$Ch(%Zj(-z=G4`X6JmcHWM^$WU3Dpfpzr;2iX4Q$vQ*57(gyv|n z<9wEV(oRmx2!2f`^F(ftgS~5bn1DDx0EySB6C9D-=S&as>I$1zC4lQMN(u-HQSP&haeT<) zAtiR7DW`@%J=Wg%JV|fZ1A{V1xAiT15s*Niv&Y$HroBG<0Q<$=cu9v9u$Q_u4^L0K zp@GMcuF~pKxb7Hw8aL%V&0yu+m z47hWotXK)Gv4;*`E^sHM8pGT(UwC-phPd1g2p6z}Y+!X+i&kntf#BK+{W zrg-qAA4z3WTptA)EO|T$mOROft0`&hqdApkks<~aLW^rzjO})wt^YaxtNv|wE4;DN?r8Orb~AK5|pW~jy`6~B}JYkYZNn8Afk+3P+o zE+JZCpjPk?1Idg@rnimiaGQ7jinj*M4}BHSmzPg1X<&k(voFJd zzJdiobRUl{sZJ$qwYzQOYN;S0<&O%lu#;TM=LbYo)mF~Ku@RWpah=(8}lN8=_RWJJ`JdWP}kTs+Il4_2U zHaIeEJ&%cO;|FyS1Jemn3FOcB)k2zOTfn0^Vf3Mla+z`D?7S&KY2ST)KsJ3Yjg~FW z_89(E=UC#T2!0zO>HXtmx_mK+^Q9z0H*!rqe_BCcuJ!(jB9stR_bW_dI*_TTcjL;bO}?OG2;uj85Y0a$CMc{&BLM- z0O*X^Zkekqu+y;`|FSO8tx0im{(q@-Ox`vQk1C1ibU5BdixjNf|d z<;34xCxp!UJ1E;zee0?D4Xh_I6LMhZH#!K!QY)2cD_d&61e& zRz@-xTr(q=Qgmp^Ge<=;$?V$@%dG62IE7Oy7~R0IYEsf3S>UTI;jqv9Go70nxx-mb zlT%YI<%x0yM`@c}dc{PGL9=?%m#Yf;LPnvBP6lva&mD(LDo1%=TI8e29f>n!Ju4nx zJfq6)xjPt<3$tums8IT5Nj-`|1b`4|&;t?M0`OM?!FMn&B| z4zc7VpB000T`<~oJw^9M%;OEQV^hrRhwpq*&sNj@6W1is{p>jO^o<=x z3W>-ZACA?aIIyDn*Iu|t4TgpA+M>I@?v%I0egZFH0GGB!->$Pe%nRfla7f0Vu`&n> z+iT^Ps+yPuM+1b_V@}D`M@itV_b3+IBml8V&d&HFS23op8dBB2D4N^v`FtqgGv>NB zxah(2L&iat(iXj?=!W$87dFCn1A-(SLCfv|d?|7jLncnV&U6>~)gE?*HB$)TDdz1N zRhQzSadkbyJ3yc04uQw}Ru9+PB8ID~4fkM%S%#)Q&u1lUNb>>P5~Jwk#;J^_qhJrQ zTaA8^3?Kt$Xjy`h$;L#XaG|FxoLtzz{S27o;up~AqZOvz%| zK006t6W>x)fZ(QN9QqJZ&u(}e0t&l|!Q9K(I~Dwfsx9aGv_6KML7Bqf>EdHzt6@!_ zMozs)1@}fbrQ(X%S2kDUC57}tspr=Py7C3Z&VTMbY_3e@McuaN>wO&Jq>5x2%pB0) zO&_S!UXjDV9lcuH<<3|Vv(4oE9Q%nbD`R-Exe5IoK~)a+z--xV0wr%f4-;!+e^@|# zp6&l)BFlL&#tD+b8s$unv$`4Dx#G57JICij`t0Nbf&V;RKdd4bzRNDAxM)SKb@3K$ zBHP49eY;JD!7hT1rc@4$tnU$s{v9uZ*d zVc`hnH>%cxcM8^j;(E^S5of+1m)Fm>Gdo^eUYi|8pP8tr7+%Ec z&i9a8GRr@5gl||`2aiu}S;t7czxdN|LwwiNpFGv6^Q4qnPRLY@GbCPNwc!X5a*x>Z zpN6t?I}D0sm|*H*A?X*v=yMKu=f4Xn{a2w$inRyJeeeP3d4Vo2MFlZ>RIwZ)V|7zE zH^}IRmDHhvzb*Cr*`d*ilnT*-*@MOe|D&{U0Vf}UD><%cY%1-gYs`Juub20T`XP4OQ^lTFh+0(SOryGIZ3j=>TBs>a)gFvvLk16++hu1J@fY!wfjM6L zr%A;v$`E${=Z=kSsTYFD&=Vz<=%?!j5S+E{e0TQVbTIRtm@_5I(6S7pw$8dMe-28K zKFf$xJggGK85o^Lg)wUUk5acrNTqjE1AR10M+^jC1ZC)+#Sc!GUO!jc8|3M#bp^&+ z{q?J0F>tG3EfmR+B-Fib`( z-xx+g%w~I^K0alHoFyt`5f#&Doasg-wOj$&viji|DKH4qo>sjQeEPf7M9M;&nBfnJ zu{+9-Z#zh{^G$KJFirkhvPhh-muYX>wEkK|(A&{qH6>^s2C>3+97@fO@oR}v|2z#j z>mSXiSq8F|7uxb%Lqq~p_SdXhHl&I;nGg}{2XVE2Q=VNt9n3PVThTx|Ho~&0@WYAr zxjvH34%V6g-`r(aF{_*ID+P@cR+8TQv%MNLRZ47U{#jWJNC6q)Bk^Td3b<@eIZMM* zf``}MT6AfO^bqEYMv>nenoT7-=Ijkniw6>)75b9Jxs#iB0Twd`c**ES)<{*EM~>=P zAI%a+vVc-CDw$Qg0AA6knv+NGVFjHfn3T}+rA&~BHdXmB0Ag$eKs>~iwte%=elg{*ua#tLSn7`M}P$}Uf& zQph|MEUtE9;r>Gd_F16)kMREd>Cjo0*?wkRTGQ5qyB9iUxz}nX_>#)mS}C-@7&W?+ zT)MfXyAq^L!SP!dp~&$F!(kPY9vbiu@8DMd@G4Yl#gg!wGlPTw2glw2rcPz>|G=@V zE%n^!xR9peB-H$D0z^CqxrQ-PvUV;1K{G7O^|v0(#YlYCFh}#-PeQF`>@WUp?jM?q z|94xhO8UP!)B9gE{GXipZ3{o{2zK)pI5RP2-FHrKoz%1XFX{y{VOnb_EcW~Me^{*i z|7k{%KrwTWZW>5(Y8NGDoc%voF1T~U)a!fA@4obpjIH(EX><;&{-;+g6qR$|DF3$_ zc(nZ6NCKJg|B#gbb~CocWrG>Zs{bW!|GU?llo8gKA`+g~Q$}XiK{v-aOary^Z#kj# zDI}bN@+yjQiQ#<05EKE_TTh{LU&Q}k+T};luC|CqlQtPwaHw#*(U)~qW5a5z!wF^o zQJ-zwq2|)x>Xnm35tZBPgbc{B6lXN&Z{gPXzlEFfpx%?u-B<8ou74hVsF^)*R$=_- zG4%dNnS9+H-{<=IR46;Lu3Hvkx+_rdAW6c8>CnJmY4eI36qOr{Qi>vK#pF>Qhc|3i zz|D2TlJ6&LHW@F~Kdoxvte>qLO*-bRSfkGl5FGjT=z&ks`As+|K6=e7@8^1(ekxa1 zWs^q9V9d(*F7HXF`daFR9@1+sUv-kyec@hVlI?>ByaVoTEgcU4`xdGN5}xDr+z=y! zWopnoVrPG%$-BI%zmG|c&<<%tHKwR^wBiirdiy?i?CJv+cy}ks($7Ys#n{D~5ct!$ z^TBe3Csi>LQ- zBF{v;GmcKcs$tUzdXIkZZPyXf^tM=ic>QC~TpfgG;=DIfdaj;cwE(I;-uv7?IPOE2 zu@Xk2(l;Cp4Pr)@C=q;^9d?)6uv+H8)=4 z@86Mo3P0wEru>YTLO{Z4RHYte48FOfq8|d)Jnh|+l@Y3FMl;MQA`q;T zh<=1Zb=k^1p*zaav#Z2eZEVTC%lMwTUqEIJk~2!$DwhS5BF#}7Y&*Cc-B_-5)U(!un~|onOj~C;mzP$_QQc*4@;4a>7MbrO)05I z&pzpmhQIB^f-DuIfF$2Cg?iSqJpJ7_Xs8gznD*toci}kJh*7i%1eX#8B4a8K>)+rC zTXTCE=Z%_5+;|KVdBb0ggm%3p5|RTH-~32ksN$*Mo=$ly)dyz9xS5tTVp#{5X*v=2 z3Q3X^l=l3bK!6CnxHbQeAoBr6OtS4~QR5W|(sf_Do}t1xuZDriZJsnhjD1^Z`t7g!JleY9cnj>v>{UKuZeHkmo;YYsnN1F@vq6553v)`xrYT|L$r(0q9Dvd*IZFHHF%dia9ucB~B7TXQ ze+h0#^x;&F&>_V|Sd1OV$BL z6RR3;Vqqm}&enOQk6KD|5;xQNbs2X$8d@Am+p)sC_Gql&UG1FtADJm`Z*r%Sdgr2+ZrVkWZE*ENBJ!#D%h#0?&0RsIt2gc43- z$wjaHKGtq@gZ@*#^|8))?Y*m=6*4gMUmx4;R`>n7Vaaj!rh^5xKiy0~k|SGh%>LD} z(%VJbzvAUq?0}-Y@ay5#{0k!GX31Uu^pPR|EDG}clfqO(rSnv$t*sU`)0_rMKza(r#&!CVlqkQlVqMLI#Fjku?KE1PVze2YH_I_SlN*mX9@ld_sT^ck2lbX3if!$|G@DMK!-v{D z^onxEET=W(rUy#%gdw|TZ@f;OK-9P*{pC+@eWS8v1QS65_TSQqEX5UT=`mK&cbWeA ziSf;3hwi(pd-n1K6w?=;8v{#*MeE~ell{zoCBu&z6{7-t>$)uzy&Ei-7|XASjhTH~ z69%!O?{p?O84%VFRC@U^p^xL8il)xe!1Z+yv)r3=aFuI+50g?)GTtHvfj*=ulNNu8 zKgOd6b{#)%W-p6ZsAK4MlhaFC`r-cl8s*PlG{c7aW`YXG!gZFP?OFL$)_vq**o*L` zutdzkL_Eh*^Oo(OCx6Ez+L?KIEE(zw{PbttGO3pnSaeA)|ZUzXTvAeGYe<#^(3snVmth$;LPDPAw!mQ=UM)tn63Tr6EzBKlAsQ zUwHZ`pz>nFeRt|9352I|kW$t^Qy+6@nXInhTRosCLsw-dWYR|i4jBdS%7(X#>(Ww% zQ>gmG@$}jP{fwGVjs#B!CHrZ4Cw$T2i=%P?CD5DOh^3@QJh+m{YM~fpt&6+eQ2nHtGFF zS&%TsEN9rKw=^;H+w5x~u$xaeO-GL zxx%_sY_HKGrytTr+yphosj#LNd&A|11yrxgx5rH&>a~X!aEDP&@<(>-Hh{@Y7 z84D@MW=&VGrE(oYM*`T*!PU;+3+R{h#@4RX>y(*EI~i;(E}H5OOAx$dTO(uov34X93&0d4dEE^!?tp#LiRqnlXW!jfICq2y0;?^oMihNQ)Q zdN1eFfg%lboLP_}!l=3b6W5aBz|A=SCK0*v%Bf%+g5%*K+c&jtiLlSQv+>k;5?Xr2)svDT#MNcc&yBG z!ul>(P6@jSQ@%a7I6b}@YJeu>cri=?qZa*M$Nm*37)J(l=O$(@zQIW-%Du!7RLfN< z(nfrS+EAerZ@%4Yi@1S!b|s;5cwbw;9@~0N^bZA(L=UOS4!D0eu*^m~zv|By{`hr9 zhPq9yMit|BrpkhO0etlPINio4`jdsH>Dt{ypJ)eu{Q=ro<^+6qro2%R_8wPg6h4?OQ9ZatJA#89&cQn$ zg8{}7ikVg%j=2qKu9Rr$at~RO$==H}X?uCwk^Po~55egDL{(w(LC=(rc#Nbc7es$e zbf@<2#Amn!UeOi_Y%QgmJUz?zI_y_Oew31L2DCwuFzBib%bI?tIxYdJV{DcXSL(8t zV3uH;Pr9Wm2yAxj$7UR0Ci}z;UE77w&&Fs2f_GhsuCJE{-C;cUL%`92t8EK~jM75N zp|xrbGx-)$1IwDbNzZ1MX^B5>l1oNI7S%z+$x1G)(*@@9HnAExp4V+0V-{VBxJUM> zUaS3n@e*9c6|TKZ+*1h3_m<(BA~-rZx48nB?+>i; zezxHVV%_VxUaAmzM_fL0_(Q4XAguXAhmB7WJ_=R;s{LM!vO{qlR%RYjf=r3~!^XuB zoz|yr%S$|99WEXP0G9807*}c^N{Qcyu=aT}C%S|7@W_d22Ucg=hsR*x!zW$InY#|o zqp4j^eI`V<#dl6q^T8)bwO7qv|AbZxluoy(?HIt{ieV z(Yy2!#I>i}w7~0gPbbmgag0=vYqx&|bGBB1C=MMtQuW)OiE_y> zKhlhZd?S+bt)*s$%;V#pPSY|gsHp*m{mjn8oMq7+vrl%>?hSV3&^tU_*U+qC#-pW{ zCc?t*@{w&lqou;C=6&B0Ki<@%g?F!aGB4s30zB8&q{g^v;KHYI1T4;8$7|O_5v$nX z6=qs8;M}UeG14A8Sdc)II#PIo4^VhsSh6Rdg6zdL4f@E3^ytOMJ&_$;uB3dwprZxn zZT>RCbC!5z_+7JuLzM za@kybDfcLUAYt)t=EIIBhFNC=41#w(d#P4@3y+Kc+=hVhLsqd zZNIqqw-*nKqrOUL?xy(@-fb;59HpceNYy17RW zYC|UD)SVTDQ$Nk|7yKbk#BO;w^n0}BLRZ$8+cM=ybyxq)G+^D9=Bm9fmRsKMyC8ZN z`jgtgiZ4!`1W}6r`LY>k8*<{#!T*x^F_{|e?cg@rxFv<&PYyo2SDT?&FZoKqYxJGx z!0i<99*J>4A3jV@`$O}gu~%e$-q^3LQ{H+5voMZ=tN^m=Ou43oooF^P)`P}jTv2S1${L{_}M=BF*s2NKB9dvg`mX##?D`rkOpNQL3tPABLoE6Aq zBp>esvE^uPEXW6q4@PbsW_mY62_Kti7xWF2fCF~h-_*gl+^A1U?mw*LatNaKc@Az} z)wxz z4ZAkJyJhX#j;`&di8?S(cXq=d;zax>L79Xv6?h-B1J=Dc9)teBJ2s!dOC0~2U-+uU z^{2GW_TqVj9JuZ)3QDiXz{7Cg<%6(@IeO5OEIwn7Q(y}CbfA`1%ZhOZ8kp(XN2h1b z>WK1BZSb%PYhDvxw_<1_SI!;WLAlTWyjv6n2NMpz~)N1~~ zbj7yxZe7IlH}%+8fl~v5^XwVCvBm}=0bg<-xeSrO1$JnNd0q@4=*{9w9wzEPU&Pgz zS(16oKI_D7-H&*@nX`Dz?B?8V`x)XPX3H)=jnrtShb1pre?r{M>QsmUFLw`AKy9m& z+}L7+nx`{e+6*f<%!f^D#l5Ej5+Z}>os<{9MWXdut;^jZ;=0ZF&!#M0^IFdmD2Zdh zR(rzZik`no>2?3IG+>Ja(Z6%)b9m-M;Y3BBsTRKvfte)%~$`O*PL+8 z8A}esw^YS@w3KdDMww%a4A?Adp$S5t=HdZ+qKRgf^Wx9C4xOU2B#=5ajQ8)BvKY-a zqTV;|eifz${g^2t=}{)x7w6P@gFemb(2P{=&9WaKVrEk`))0neW|q6Q5J9%AC_X}M z&zCRh#pVs(tz3|B6Me6#`k&n%hJf#yB!ED#hO$35o3FxOC@v+zGLxtTl)Gm#U(zF? zLVZ`qbmnNbw9+DQzpyfde>NTzil5!bFU|#XB(8p0Botp<;MoD#R8@hnr|7?v0ztXAdQ` zncg?q6v!K7oX{koGQJj$cSU@6N24iK?_4CH$)(aLBda1!`H&U1a-tWH+egZ z^AACJyJ8-mt7^`>i!pMco6EZWF94e>px>@pOIrFzIpfhB| z_2m)`yGX2Y9;w{*%2T_P4FMNpc4Raa7kq4~i@Yn$t+RK1&5pO#`c+TMm@9SZ09 z$a6QLctnlXW~_SVkZ&HFeWat+(Js)Hbvx!X-LsARZdDRc!B6mA797GhvkT|C(P>}# z&SXiPw^LLU2`OOuUo^dSTwBl6HcW*Iw51gH7A@{>Z7IPC1ou*$;BJ8yiW4YaybxRq z1h)dktw6Bg4uRkr2z~SY-S6{9K1nuv&TjVX%Bx5v7eSRZ|=F3R{J*Ofj1E`|H6C4%1$ z74mEzgcZd8t`s1d$H*;Oxk=MaF|a@Hhcmvu_Qn?OdgB!Bgd=jV;4N(}RWRVzNI z7JGy=_YC0XIsojEqq>d;m`qUSXX zdp~5Q!!kgljgqMNKW9=-yG7bRl2Gc=+I?Y`tlZ}atVk^T4wg`%}+e#KiHZ+C~B!YGwP{Ze=z|~ zZU(m@jSE)~l>`Hq|4!Em6}XnpYNhxVe{kPCQV_amkD^8KR{b5fcD(E{%O* z95?sYk8IQ*;s-m~M<-y>8E4Xjwx#~4B{SX47>UTh4Y&5cJFr1LEY#v>`AuAR@sQ>A zs~X7V#`qaaLmm%(QQX=n%xqLUW2|+@$dBjmE-!2ntta&lk1c2E(~U~u0T7EFfz{f3 z=fu09CBbd1OR!+a$!_0cV`!Ut*SCERbhsGT`H8GK?6;R@>}*#iMM5w@|A;#WkQ?{= z)TZI>rhAQqL4LrV;i8;F@uYK(6jui6qVtx$#T@`b1pKZG+kQ|^s{A0dNSem>?7yGW?-EyR}V3qAPh+Gd8P<~L2 z#nBPS5%pJ*^=?{uH{3kE3!irV6}2lx4vjl6&ru0Fzlsy&1^>PV>FU+Mn#n2rJAUQt z*wi(&6#nc(eg5IybI`&42hKY8IkaxWQ{M~TGj;+!fsl;4ssr33glKZpNAEqfNQtyte<;mm zHh=toU8>_gV7L_yI+_a>naRj3`cN+=8H1_xd!B)b=)L+pT6nNVjP@|w_=guLH@sYY zZK`emcJpt=9Sxs0Oy`4>HaM_brZn}b;njOuta}JbnrBPGW4G(Ldxys74|eN2+L(n? zY*spU;#OgdnuuV@Y%ZW|o11!E?UH@bv{QbLx!X^n?Al^=CouP^g!O`2XNQDJ5Hy8cG>)|?^M|SACS3M3rl8!)Qi2_EJ%KZ&iYDpiz}VDa z^cxIAD#l^e#4JphPS|V$rk>UFc=keIn0(;WgnzAx&d;$bcM9k!e|!a_#+WP!R1d;S za>_k+981(Sasbs#W4lug9|TSntOrX>jEO|@M10&8$Isbs({D_(LKpVDTnbLuG=T$$ zz|=MWhMmuw9y8gpM?wGa+)w?Vo1UsnZwHy177#?j7sb~(dl+htD&iMm_SBqmyF{_U*pGhLxVC>IHj?>Z?WYp%IFUR7nMIKq}5TnuK`0qxm?(>ihV zTKj0Z#N_o0U*B!t)<$3)1vXa}*P7Wsystu6?h|yamq;*K@zf0%ge4xnm`-0{ZMWS& zdHi=a?#QAEEn3OFxp|7~-o99-=g#BEGc~r&W^U)4WT8cSp&c(z(CIgU%bQeL3rP>5 ze|RbcMH9!;dvOU<)@gqAGD+EzJk0Ik9Xc6;rj6V8BHZb5`=So>^{= z+1K;}ngK1dKL;J1IXe)NpLXfN6T1O7?w~zQ$L1*$1vtwucgM-*@tK{jRYFx9DgaopVx2jQt>ANDT{#uxTpfB|T7jda2 zv&+So<&`!6@Je!aOy*2jC;or^QnYSCv~BhW?y)0VB^ybfEVJ`Jd2>btRJ&XGR?8ch zY~vJN7}!WpJwgQJXx$rzO@&XB&@Re z3p^892VgW(k2$N3*f0!gy%XuXI=3nT2|1_baVoM3aYw+kRCqwkhv|zf@dhjJxP2Q8 zWftes$XXZL-yf&S5X;P_WJ=d;=P_}r6c@J&X{mK90TqNQ*K+>9nlHUbuuqb+_Wt30 zY59kDAJ-?n{`T8%4zP8dh>JFV`Zo^$X}z~y-Jl`2U(NHYXC&BXv4e+B+g9GG*pL6| z;eMpnjYGKA}3qB`l}DH`9;3aCTS=~ndiJ%T9~18EixG@44ZW=ce_ zqL85@6@&YQ2>!|833#y{s4TtORIyEdFH9k|h@_nI+4a91+9 zf;~Y?`4SRZEleiPjgc ze|SH_f5YbC+Y26j^2`Bye^83rreWnX$k2E?(t`IV|mh#ii{psU$D+xrwc=fcCOvN z@w{$Lwh5`B2~x)Vkj~Is2xM@+Xni)tz@xC|+4cfi{5cuB&yX>Ti~O2sJd@W^Qcfw; zqL(bTxfHZTXEELO0^ghEUZ?s$OdWx7-VvVm zRM=#kzq+)*4)9C}rB(J6U7}ndx+x|! zVgce!WRFP|EYKs6{AoB{`8u%2ZU?Mt6sT3ctlM>1>aqH)!^W5nEc-E&SH&4jcoUZG zE}3aFJE3^AjZ}NJF^`S?v5(rn6%ls3sC~9woe4V>n#gomU)PXw>ch%vH{0FBpH%68AM-$QlE88>^EUmQsV&qz1&Ll|$%V zv;2TKbv9Et!&{K~=4NiP;Y^{Y&U#(P4nZ!_l6kiQA)=N!{AxRKGrXB&cTSX`g1t)b zwg#C1yY?Xj_FAsVOVw6DndSn3J9shE5;cb*tyKyrGj7Qk^9AKTVeKFvn}w+?nF_71 zCni9CPIZi}Kw&?Bw!{sgrJosD$#R>WetYOJlRG1@vQ9mZrTdjOIhreshh>p zpaQ>AyPjCV)Md=hG85;iBi&2ytg9z*{*pLOi!SQth0BSyevYDQ=CX#k}`91AsJ z&y#G&i^xVeJSNQIXJahTR}>o2N8(oHZns)Z<#zIJ;?*@{29|KHpY5d*`~^A1!{77T z`+CwiW;V=7Qfc&ksVp3cY<};4h>-&ElHqTN#$>8{aFdwGG9JTCC*ApvQa2QM>jYwp z&((a83P@GQovXC9#8XzGnMC%?Wkywgn7j`;R6<5|U=FwTr+Kr_Zg&&Gk&7$D@IHB_ z(D`EQh;`zj&EON8#Ur-QCYF-XXhpy?lEoXdc<~F-t7q4rdO$Bs>}9*;kAF1@l%^(J z{>YkQIiL9*moVv^nQ>XmE$R0X6H$=C>Gr)TWT*Cud{NxybCiJfQ#W~|H}ICu=&Qcd z@7Um@r8euF75$jnw+Q^To7SHIvpGhAAX~WAC3J1lc!;d~hAC$*(rJQ)&eop*N%!8i z$@fi8bBsXaiSVYk?30v8Eq~tq@0VAfwp&V<7#crptxLOJ;W-JLb!l7?*KA)820b9< z)b11CJ`%Cj9;>>E?s@%@ec>OTIPiiHK-OyW_=?J%K}eLB&#+%1D0caGOh=8*&>?Y} z?{}oh+G;CSb2wPQ62)_pf7zCg7Bn=PZVJ^?$tViDt==+sPjG%UNcHbS2dg{kR+sOukI7;6qeD@&feYcQz3J&Szaw@29*dp5SPFcT~*aCUz3;>`-p z$fJq7Z&gKx$;y1o17g5zQwA;(e8ySS*D$O_Jk}2M_ ziJ(jRjt^(%HU#n4eV__YO&rF$KCI{1Hz+|?b5)&iQV5)G0u8N5R?E2DM{{sNuD4HQ zRSk`&6k_}L^|qJ2lCPUB#{Ej#RTLu!vlrqtoXj;H+BnKm6j}6~bI{5NGTRxZ zo_TDSsiIp12CJ`?Q=Cj502d0IZr!ZU9P@UKX*^A#)ZU~AV7b}~iQ3UC_AT0Gk*3oV z89j#&WVXs8Ey9zw_PgMvyAn){-3_rM)5UAM`Q_gHz*v{`3mT24ki8^qU-ug9_r-do zbo$Mc*bztwmu32Sgp;g;`Adu0_TTfD6#HrH-S9F>r*kAgbYPGbNY-E6w_tX!;XrPM zaU*OCpkeZ^?;N}$*-iii%0oC$}AcJsec{SiR%h z>dk$=rW+g+!KXoNsA&MR4nk>`ZdSp7Q94&KD`~36Ch*-2L{XIWvg$8_f(*^>^F`AaN3j)6u?n*f z<@fen^pbDr_Khuft?Mtk|J)H;E+I%wPHo!{KS;Z>V%jHC$$V_ryC5!U#o42zi zv~$arP0Y9<>KjTtk^!{AnKa?M~~qTc&=pLu6> zMXq+)Q=lTP2CB?WWKzwW&WUZ$ zxXH~3_iIGt`io?rj*vMugj!ww&RpTK+%M@U)vXa+cW-;`#1d))KSIJ^ty%NDnmFemMb@OBAsJ}{uq!gBX&itpre;7 zMo(_Y6(9iC`CB{EE&CNiQWt_LhE?a^l?un!RMWt10gKo9sE(Re_Gzk6CkT!PuLbb4m#l-n}sTwb$5zbT>tBA7KaNk<>mHO_h_~=^8 z3%3iZCkw5;yCk+h^6RVgSSj>otx8nf&xh6LIx6W{{uT_oH6>um*0eTjZl2Uu-|Pbh zdwk>fjDgTel?b~Mt3Mx~)nc*w8D%y_^5L<62p3mv=& zP1e_#;AL01_CrwxYL3Ze&D9)(ZshZvRx&mDBjaj=Jn|7Uik74HV2U%LHi4}>lzzbn zn)Ks9C4U1U_{~7^dy|@Jsj7T+rj+Eu+pr}iQ{!@8F*%$sAob5}ir#bICf|BMOQo?r zvTg)B+%jd8$rI_rvM;nV>Stf8kBY%#IVvimb)V)ZKhWDZP&O9 zQnsf>M+E#-W>0$Ag?j4vN4(-n%A_*Vh`+*{F6q*$i*{a`rA00!BmqM_<1(8_sv{<`HIiq;@=J@ZpW>TXTbm+qi zr~We|i+xu9xFq1Hu$gKm3)oq=E>v1eM;q%qZy?s`i8<%b>6QlK``7{%D#UP06ikx?E&Br>5 z7dwCJCaxlNi|k4k7C#I$!AqvXXqH7+YsUuG`>|0JQ+oP;Zh=>dwwM`8dven9sxvS| zRyjl`P$!6h+gN*hM79x!e~VoV`G+?gtv=M+Z8-UJDsB+Mdn8Q%ym^AIgV=D74^d&_ z=MDpY{wDZsa!8%1^M-2mmkoklx1qJf$`D0i#*~R(mGGo3SyjW}ye7QI{5=c>8Zj_6 zcFFeExXj|o0J2b05AN|Yz@zh0fyz<4+NQ306b_dy-->f3kl)r!;7l4Cl0g%8kQw(K zON<=di-X(q#V{`}@&Jq2aTK)75Z~&Y2S|3)d`4n~*X3Zj|}7@T#y>9&O`UggcNZWuVtR-63HUT3omU{*`r zd>3n~n7tjZK-8+U=@D;?9(f@0W&ORt@o}Rv+J5YhD572+2Mc_-OGN$R`*N;&qd3n%OH9-3j3$Q~0{3oJ0Q}^f zbKM7tl)j(f+6+o>=8|0)ha-AY`f5*@9Ku-1QeDZ}2=`-6mvKzVRH<`uzw1?ga_6)U z4Bglk9*QvvGO!)9x5`IfM8u9?G2ZCK17H{N+`tl=1vJyj4>V3ewd*lF zRCTh(fGqvST8)uzLAI1kAlOc{LVaM@4^Jy6lU7f5WJk#(Rnk-g5i@4i)YqTg%P~we zdb|TP@0{=DqsxHh1EDF>z8OB2XsflY8ytz+>y9%)(EN+YCtY%OR;>>YEv>HlKfOFP z{(X>`e4%(>0P;H%J7H0W{oF_y?=xt5Bv8Qk`SYJJ2Bc8Sj;f(R%#UApfB!_Z><9>0 zz1(JiTm0^%0_IXB{)mYWc4;3MEmpV}pJ4GM1u5-Hnbf~v*~yGqRQZe}D5p}qeO!U~ z{JDQPCYC?YidHJ$dg?>I^~YY-7{yG*h{Jo55ep*U$GH*jvhF$)?x}5bir>J3etl6t z`IPmiR|QQ*8Dt5!;j_-4_B}Q2&UG$8BvUttq2G38xF#Hn>&H*8V%0@RtH_-5^VUas zho_USF#XDIeN*Cnv1fhi%UJy8Dpya!z^;5++HBITr5+;xF{Wu#Z5UDB!v7elWiWB$~xcOj#Ms+^<&d8<4rx(MLUL$K3z-v zxj^DRgE4=RH$iWwG&M8w+q_>WgiTh}8IsC`#h^ft7g@0dW*d{=s;OizofE}4-|dC{ z#NMw!6QtNL^Jypfx=Y1hVPCiAz%;hj5GO!D(4v^xT-KRDw%vmAR76vt33Z1b@ zGuBg^EL>JC7`a}#&hlaxX0v!$c|~tAp-`aa9eOobnbAE{Pl5F001G*ByX^wA?GDvs z*{)U)lR@9;tAWl#jn3*7p`#v7HtK5Er=vu~yISLBq(^~KSHXKabyF3aW{y+JeCb(i zGKtv%G@Cghtz(ZZY)bSdIPK5SoZ2Qc5H@?Z5_4eTck?zwd;{o zX*1M>y!S9ZhO^OGh-GsuJ8NE77vzI>aT z1##ZDNuMVD%FK1EML`GlN2vS`2qqxqE=4xUO(!P0gO107j}%OYV^ivLeU0EjOJO>j znsOMG$l6>#j}>k}hmGOZjhf@CI%>J;s!=rV50-Tlg*=(a+AQ$%M58)!Bv={4tT}+R zlZw8d2kfzJT59!(Gy6pCMHL&6dwym0l-4lyCOT-#&xG(>o7B-=*7FC-6$FOlZ0{uV%HIOKmRS9Zm~ejM6It1*R|+rwbbjZiA^the?iurNr{cIag8Mzwl{(my;( z_2xZ-EM(fP%5Dprzp|&8f9mxefr{N&6jX30R_N>|*Jy5G-erVvZ?CDdD+^I_Aym@Q zuzc9+AAjZ9@$y25%^5&J3^i!duF!4C(p}ce5ggHJ)-ILMd5id#8iMi=g34+j@(aLr z!tx!PrPANcBF~!DlI7H%u@~LcirLo8K^9c+v|~)OzD(NXGxSzC5zTo^|*5fX~FAbW)MC?l5#ABm$aV3!dulzIB=Zv zE+@3Yfi8>wb)zeoK*xe0`OQIwfmAZuzih8LRWFsSvXVn;w8EfC-MP@{^UDJ#Yf;@O z%-rQ0K(d6MOB8U$dJlL0;mxO07pe|n+4|&lS~O+loAIj{$gbT6- ztAp!5adT2qHi!#ucS=FWxOf`9_>97yn2(=^=K7F&wU_ZtpL_U}cw~KI6bpCHIJB!J z0TbR@6r8DB0z-~W56w023n)G`D&{~KK*vJ_@6qE;c@1?kR!$z=S+Df{nh+1kMzgIZ zFgY7|Bua?I8#tS3G*tbi<`1FBkw~I^C`S77GU82RXl1ZViW-R zc6dS7b|vzpo0X3yGMf9zBtA?vt3dC=v5l$)S-(QW@6Ol8ZFwIxEaSgRgPyz@Wufi& ze2t^k{*6*VlX+UK*t9|V^~c(t?;t$anpdg@$Egsky$7ouv$m2={vVw-(G(>Jx+kqy zuWUbTIqy+f7zWu+3!>h`pOKc1w1@qXHVr*stkh-4CX9!teZm3fA2R;J!~e~hQ2DvX zU4S^rVyS;XPm@tVK=f5wBp$5%CMq#L?InRTCCwLn+Ker{s0Xijp9J6FBF^N0dHngN z|1$FR-2KW-dbeo2=MulZNid{fyvn-Li5?ppFCN`N-Ak4LUeg=}1yY-s(^0_%AkLGW zf2`Y-@3IwXq(8&Ujx?CGlSqg)p5J}KGSaXS7u)vMwarvyZ7@AcQ5iXrzVA@6&Ace# zJ0=SbSnmFfc^*<*I#bnl%WsUmJ8atA+w0BbKeQ2j-xiw5F}~zSdzO=@HLXs| zz|@s%3iBy&|GV4VI|vC?+P}z(^7isrZO@+;k?|D|Ocl!Dc{=Xn2PM$cOQn#m8mz3e zshgh7MaiLf{^7+MY{6-;GIumBhDj)%U#a114t3glT4Sky&emJoMb`YT?Gu`c>y<9R zNhBg@8BLP{^=FG`;5@tZyB2UEqCnY;yP-s*ds%*F2C|b4 zkHlO)1QpOzR#y=S7I3D&tkTpzKNZGt_N@EelsRS2XQUc5qy*0I{KK0RftgiLRKW?s zOJKJSRxQU8JjC(Bn}Rkx)ReI`nEoqa67F`G|ywSVSSEG8IB9z8us4U zU{TAXv=eJvd%_?e7+I%IGvyPfFr8~xeAHgzJjc3sxwR@a=_Et+{PeUF6aM^|EW6sY z0Pg6?Ni*oWED7FI8ZS<9P0rRb*i4$+`2=hDeZ9z2rI{bIE`Reh0{5l{dQ6F_xo@)~XR+nGuCjUReAkuh#t5M@h`=)N=ccQ~C8Fg>MO?{d z@ldAmTr06l$*N(cbu2sR+hx9*#Eo*ps`LX;1CGHos~)C{EWBbN0;TA&jb&UiEzRAy z8&p=7^giXeBMQFGOy2EH5^!4!yhlIO`}_p6KU?ByTB__>B$UFKF{p@OB~J8FydnH} zYy)!J8lEp~{{^)x8oo4*Ya==4rQG$FNRFvMJMNyqK)ditwzb@E7~iv_OLsBY_zdOI z(lx4?Y}l6fDvGnN;KpTCmX=nK`=HL25$NTBdBB z2>YB$zc*)f?ms`oLaRo-sXvk)LM z=Eq~1iHoeoI$V~BGt}QQd{CCMGhaG{+A7Pgs(kGGpvt%SGxp{9mNdpeQ`_x;`XC>` zi3PKvsDdi(j+rbyKz|8$j>;3=YrP`8?veA=N4M~<9=~VJ5*dbIT*D~h&`tmXnXnJk zTyg-Z@0Oi_7@J4eWUuk8qTgBm=>Nhb{@PHGxAD(&(P87EMc22x6G56}4}7AHQ=QeW z0xc!&1IN=ys3>AqdWLx>WL}v?@v9G-nFl^wiWwLXTktF5(48;^AHCff>r&je6nlTJ zc}4uCTCsc9kdI^YGU|Xy>|IG}0xk=XB~{yp11@V%Moq*`!M%(snHBXdB@N4Mwqaa; zvTEWFTt9}V3F!8VV+iGm6KF>xRv*51^OmQ~IJFi9y@gc;D*iYUya+WOrmI?fGZjyz z{b_XjGRCPqa9Wl7x|X!G(QJ(#aDsK%g#9e)vF|Ob_kG`j(1)T%}TVT%Qw%&u4Qx6{_}` z{SMekM!%$pbfZ$+iHT46XxxM^Kp?S5fOjv%oB96d)*(kBC~ME){gvjQ?-ldBQt;Q+ zUaNjme}c>1vTrKFjHliBU(z*t-dG5=%M2BYzikF(k0W0v5VF&1_t@1kb7MCbUBlGU zhwQWjpQ$mP0w+Bxa=3~lbSmwE@Wwgeuw+0@id38vBF0nFX%v!VjNYCr z0YMd<;~pe2RDm4L0MooiZVsj8C?ZOb#--;K zCS5xzw+Lgf}vaaNfB|gfo9Z+xuJPGXH=HMDrV38o`%P|VI_8*hKRnSvAi|iIX*Leb} zL)ba*@4RhG^k>U7Z&%B4JLU-~+Dn(8hL+89mT_D`m7N@Ih&a=?r4^j% zAo0+Vsa5TFQx+N-@3m2yv+-RL%_;?rpKxxn>GUEy!(FYygxxkdo}#uBS(&rA--Zg0 z3_o-gkyNNe(D#7`kuy6bY?)iWdy|AzGW}9L%di8&=4p#^W0$FKhZaWlo-WhZ*CTA< zS2;@g^P`E%%Ht;EW=7dokVp2ri{~~y)LvPxo~{H!ZxI!`uz3QHmHCVlC5Bc%!82lz zYv?~bD)ITrE|*^gviU(s6_kIfti7!1O5lUl_LpdTJKdmORFn9k&Y^a<<36y{$K2Ol znln7!qzuV11q;gw-doaAsnzzGT0h`3nAfO<<2GY}EJDAR+Pf2l)lc4gC{eXy^B=68 zCLj1+;C$3o3bedE^~p>SbM@)-)6nyBQv05p0M@pc>*xuy`>0I9((zgZ2dFXE{V}Ie zx`A>Y@VO91cqkQq!*@$@Wj0=RqE6kczn`oU1+6U0NiGs4XIP$>FB?SM{lY!oJKGpU3alhD>lPr3kKVPh8qM38B|z z>ghvjBdr#)IOE_pHZBXx(0|+gt(-&Xl3h0m)e#*OzZw)$MB&n&(;dWTY_E+LmT1u7 zR5JE{qa~)H?406~%A8$npoor;J=zIZ2w6l4q?|-on=mMNTxa9R6mSr_mS}c`-(FlpWGb&2={7Gy@Me z6o!TBE@GSAkAf19Wj?OIcrerG44Pc`c+OKgImo3x&uqF>`c^Nbo?8cNH&!YXoEhx0X{^%3B~GDv;ZboN;EpWO9Mhb{3y+|*v(d=n zUCdId0%+pEZqZQ3;M)qupZX}UH^7yLa>mieZ`riDro`F8-9)n?OMQP&Bx6L(6P#*h zFL@Vp)ezwW)b|uBR!5N;>ggKMCTq7vr>Ad^m5Pbf_ZO8!m&uo>#+?|+S7c|c%9zQa zuE$T}BReaLvmWTcD(y&xsmU9>#!C}DDoZ4EULTJaHl3rI1Rbl)k4BUQdX2~OVv=AU zb`R_(LU5+6yZd$GLn9Mr%TPO>);}dm9$OZ@cp`5MWX;pbteaKGi5)$@KUSyU_B$R( zr+69IolHIAxn;D;;L-kJ+mwelKT=$?F%D_l$`eppod(Y0`Uowag!*2ou&lb>g5pJ4 zk3~ds;eCV=vgXOkxZ39i^d)h2lmeS%gG}D!+J*O|A`X5u>oTt3St}9;`P?5*{%Tt@ z?#fPX#4o`l)EPnYH6(pU>tAgQ-pzW$7){A2Z?*+)m79o z4g=IKX4(UD9nCuBWZs;g854G2y<_*q!=w0r`9>oK7`aH&p7nn*^ZDJsaPNgX>Y)LD z!trZ-k){XChL&gmKyI%9g)>Z84R z6!i7lDG{Q!(CztWr~I<$MKNYVD{`yu?!_vdE?K3p3H1!e3mr~SxQ!;uNb7HmNh)$= zk?cdOkxHU5`sfZQP$AyVo)bRyA3gD-6o`9IBw+Tx^SjVS)@7!Q>_(uzneDwOhjOpD2iNdTR z-0@=bx7{UFo%xAh2gp9j)co*Jr1kom0W?*d;3Lb8cFN1IPfB%D;=NpVo3caXPb<&p znLPkiwECX$^(Fv(wfU6uWCF=JJh`96BqgbSH*S3{roH8$mB?~PnM74RCtq1ekkou4 zsO2#7#HN4roH)rTR!t=!eTw}PdNBQh+H)7P_&is<-A0ExW_^ItiZyw9hWbi z3ov(?FnuvCW`upE%eLlF6ngW!AAb$WoY`;v@xFJ=vwrJ$#J+gizXa@8N`}@~P1p3zpD6n5CP8Nbd?UHEv=kO$?blUFrxwH+zuN zU+n+(cKPF(TrP6=P;KhKrgE;AGWR6?Ws&J}j-pO@kd5j3=7y(_N=TgyMVrf{PvOBH zV7md>QG~n*G|BonX-4$>!iSQt1YYOKQz}`6V@227SM`AZoK%U&%X~&lS(~4jTIF&V zUD+a=Erg*M9Bpv?K$c?u)Pkx{;lKv?;L+Kpm}KW%vb}(=HFPPiV9C^I$z=9#V-=XZ zSUF#C&Ze?w+#i#+&sDz9Ug{+R=e8^7(kv{wTbFstBmp%T`fAMNA3w8a8UAqSKBIou z&b2^W67-9i$a6jQAj|TSYnaQk&awSBXr}5o_>N;-lCp$Lkap(RB5Hnlm^x=Cjda3A zBDL$st*;exRm?!E%ja#?ClS3*`l(A(B;M7}`3hP-`&vcq#`{Fgm+HMyFyn?IE;?XH zUM={Z(+GAPC*OSEt2K=NPxj+OxIh1Fu)f=+q3leq#=HOXUa(g>AewRGz85s2elz+z z;Tn_e0>9gr_Hnq=y?4M%1=$)=+^-6kfDPlAXNo@#xXj!_2R~&MM9VXJvy;%XN*C0p zA|HZGda5}|#Zw+8ewOSe8vf411(1f(PrTzc|1S5sE^4VKs_|YzB?S|+=I_d9p%|yvvsV9k=0^=$UF**+1rLFKuoHMiX zRJ_Kt+J<41lLA(`tLeWuEbiW`rerHZ264!2=l%x7%@1@jIiYUIsZ5l>ed7|0&j*>YvYVDZH>;OKUM#0kF zd1$Y!R@sv6T@cz%DS+}kHbD7q2v{yV%MKcBGp#E_7_=U4p{Lyqrc+T$`PR?Gf8WlJuY zA2$;B8yQ20Y2KS!RY!0UtbMHfmduPth`V`D-CsD{mIfJ)q#-kYXnmerPHV-{S#82x z*?Y!I*!C|}FG5r}#%3|6@6o;~k?^jCLC1I-?Vet%Cws}+M$o_I1bB1-Z zz2i)9oFq*2#pwnif#X7-n*s2Z+Eq3zLaf$w;!0pUjLT_LK^0NjRq)4rpjGY#)eXsJ z@_Mzu`x=>j{TUmmpv_OCK&vJriND?yIFQlYbL(_vNXAg5Ud6W6mP2x;oK$7_yexk# zXz;D}aeFHb4i4p@%DovdBocbIIx|sbOQ#wn}0-Nxv8!c3OLg)sn_Ah0uF$6+q)H(#o$rzW_ zAd-P`y)5?ms7M@SCL}iQPqNQN!DegOtbu+I+(ZI06w#if>nk#2#${7URPx62GLCHL zRA~zCL|tHBZep}x!j`fl-dJ8Rlx~b|-11XohZF`lO;ymTIi!mqUqSs+oh~*;%bk2Z z**WHLBqV}y`c~P-c9rYFq!Sws$|WU+IE{v5b9%n|pgrcX{Wuw?2-H`FMQ#0|7vM>4 z3FA+4o=1Q2m>z!mMZp=&@!l0)*Z=1ycW{1^{ck)xd^dolHHw)qI4zz(@UyTM{+CBz zND}ZKCI;tMy;PO^sy;kOK;B7N&krAbQbU=96iMmCUyoFIiN}nmXS+p^@{s3SFzz;Z zc(^7w8xF~lcucQaK5Dm*f5H#LN!9Tu{D|1VaoeVs_gJN>N#|^fQ^a#WnCxdH<1E+% z+fGKDbm6<1zWtH^uBVpXeZ`P-)|fEmcljq(&DRw}^2~U6zi{`a!n-f z01rSj?&gmLQl~MmsbAF^GL*vp(N*BT1!N4vo74AW9aR8cq`H$pHvxq`K+@=2qEXo>z!! z)l3PCvgvfgJuXMwT}L5}l9`-4FqOK=D#ymW0#3|ibdmF%x;-h0X}h?!@9x;6z6VFG zXVFW@gF5V{zKjW+F*oP&fT!u{yaG%D31sLTw4ep!KoccQ#t}^rm~nq~163kLPC58} z+U`xXd<2Y3S1F3v)H0wlBe-|3EZ!??1`p`#yMmE6CS+#R4ghVVU}dJ)kHt7z1V}FTGEoy&Ds9M z6X3e1w`P$j^o@sb+D;3y9^%f0$Y%B|Em3}M^O$2R(f3a?WU@4d%X*aiG+As+hK(04 zzM#~TR8c39;srN%ojb{#-^^ilFFqzyKJn+Ox%CnmtC+m-Hv*++OEI)jo^Ie^?>qWR zg9LB4?8x3Oj&$W00pR4utgS>!`LpxW88N)CQpDMau<9n(qg61|W;U-GLFtNKHj*~5 z%Oa_Z?9E0GSA3e7Q z97nGmsU&O6rHhrCK^~jO;})N$<78q0T#Z_}3R{`u|HwI_hlX0_A^avlQs5nDWB2!$ zj=8exqUE;}?u#A2$h65QMR&)f^M%ZvKK+WgVt+^@ z)-X>msJ!JR@adOjJLCk@kLcJi3LM&pPhpCWvI~UP7fY3cx;6#GURIZTymH$jn)Bio zymp(98W-oEtNEKvej_6(y5-^Jg|wk9B+K=-Rh*QiQx6M=KRey>pHFr>^*>4)YHQFI zPg7p3x4(VmNs-^f-roCtLtD%%;Xg|LRyjgAdAf$tAj-dWA_P-4Ke&+3D1SsBX10wz zudZrMj2YqC4P8+8@0ynOn@-($<@K?^k6d9W5`o2cO)i zojQHvQM7JDZz9%X|M!;i?a>6$dT}5>f05zNUgr(dG5b>z_YO zUQ*_EE$A*T>R1JHr}|@=RW5TI0S{B-s60zwhIWo(mHTf_tLgp4VE|5Nf7gfsf2Wo)bfyKTfNZb zr~vPaTOa?a<;Mj-UODmEqC1mIR!@&SyOsZGU+)*py!PXdZW#6n`@X+QxP6EAY@zA1 zk@#O%o6Y(>!%K8&n4+sCyelUh|D>;NdhWxK=RsS0m4?nu-oI$CPSjjDx%ZqWrqXrq z8U4Zf@0*+tv2=u~o6MaqI??#{V2yDivqQT*bN-FTSsPw)^Ak>nZ;Cy$>4W!&Niq9M z;~(ri9vF2jGx8*{L6mex`6y?>=Bpz8qTAC!`SmZ-*4Fmwbq79e&T@cHD2^-q7{AA{ z_(A)TImyBw!_R%Y^El>ZQ`SklyIG^1yGl>oyZ3l~&#x_6O_)=>Pf{Ls;e;RAfypa| zKeb)u8>XzcJQmNp_~Rtl@4K;%RU%uxw}86~WLo>hvZmZf&e9N+q(Nnh6$8-?D>*`#%L^xD z+auh8kD8VKKn(kT{@b!uzzeSA*+C2BQHVN;74tPPV_vR~D?6H3kw1mnDd7HT>1Vr zV~1-N`_;bq>iw#|fQ_xIhBxFEM*Mv9msg%oSS#=7R=FgtIeRlUD*Rs5%fyZMqVxCo z_)LEA_{t+c>Nnm?AAB|M$uuRdrE=c+wEB`QRSWM>T5AG}W71CUJX<*(k^juRxBbMn zu*(Ty6@~mAiMw~c*ZbY#mtS;VXtJ0XtLR(K7(@&I$}I#}$%h?VRhiTIoi6&^R%P`cZ-)P84CU3q@}v$}fb zD4j-i#fwJX4C)&XeNk=?k=hlCkJiAh^^#l+lD~W-77rlUWmPmPad=3@z#_}UhA23g zGYeQEGn0e}NXunqVXA#nJUIMLDZJ?xp)lI8lR(tB4r)Y3Wj5?6W0F$aIq1j;oKlv0 z-waD-h69aG*akrQ%WA@esc80_Wg$KAtSN%`st268q1txEw}1lzUTVkt6%s0 znRN)W?f!vF-RrrVhYpr)N+|to_}YKGV*a#i9wy=MRfKyV#+{4!`n{{6wl^LfN^hPv z@5X$+E^?&`ER2WEzTLiJ1W4akT)#@MKxgF3X6$|EVeDWtj@=+PV4B6E#dn{E9met` zcS`9)ALgVN2H#vn+KA#jrq2fSm8!%{GE;a-FML7W<}KAZjmBk`7NC%Ms`N1n70ieN zL8cnWfjJYlfB=UK{sG7VPL@J?kz0vYwOJA=ovav|XYy8$sYUQz)6fE;Zd@tb*av%i z;j$SLWFxZi*bXKv@c#+!`6_Hb2{^?VqSayJ4fVl|hO}!6mY{tHRVF|O%H28AW?Tn2 zHp#HfK2}>^cJM3|{@7cM(4|NKBm-b2PRM#e)*(u`g7UZA9ZAVc{8Ip>DukZ?vBpvj zf@;{3vf#;DG&?k&3gem4Den0d_Sx6V>jRfiFFmW%II#xQB5t)I<5CBW=AOOQOrz0L z4Rb5X)lCBL++V1A3bnL`!Q+K3R|^0cUX@Yc)?b4*4&p4M9xny&%wGWeBhFQ`7_bU) z?x4{@`ga$9kMtJdbuMhuoro?!B+o8aBQ{2No&q*3qt-Vi)r36JuV)^y5Jc9v3Jmjx z)4eG!N2MyXw|)2|b>=P@8irYq_`Zv&9v zbxSiTtkxZh7+9O7&LqaH<%cVL-2vmQ@Vi8A>SdkqYcwR?KOZ- zEATQcqa$ko@S_6g1eIq8jvHUM_Q%vgfpsWY`X`wT5&Q;YR^qLom0=Y$`;R0uWkf2h zhy3v2Tp~b@0oxu_sw~b`YAn1f$dJJS2mtgF9(6#`j?Tt8E(G5gO;wt*`CLVlAVY0z z{XIu9vatc@Z;Se?^4-M4YeO~LL2)abL!p)=k@L!$;af%{OeJ1@D+QxY!GTasG2IXU zt{{KUb+!b}?_t=PplsMHms#!c?N(s_ot#3o33~kc)hyyWPwV6)F(8vfMkF;D*|?JkcgwvS}!N`9Ar@4`rtCB2tpdJjA+UcIV!9Os4*mBnI|AZ9sUSxe_ym% zGZ~s>3;!ag#IImQ0m;&RQ7+Gsjt14``1|4#dDnf>kf}67iR&RdL2jid@Ej+g#AB@6 zsGjx!C4)Ks@9_H>j773I+PWwZ_^z&d%K(uD#7caEmmXG%LN*{6Bx3#YMFce34r&v@ zW(-Yjg=H5uNwrnLXUq$tzziGMBkq9mssZ_VWya;P=oi(cXqNK4#W|c?KwczQ+(h}| zrF*dh4mob6Je0{P*<%O#18rs{wtyf>_UdpOE7GvvcHv*l(NH8Bdh-GVKo-jW32Ao} zYRnJ6)~%#m!KMNPtWepo+m7pI17w_aiiC%@0z5oKM2L+dK_v<|EWpBf*G?k{3v}`1l2*ohVrULQ;}omx;L>9IVqzFUL8&-F8-gi_%FUfL`9-;Pnn#6P{oTXfcyhB z+~I#89N{}V@{K1;D)5t`V|@~4%4lL{Hg5hP4exg5^MN%#RCGI*cz7w-m~m^&c-wvh z`G6Y!!1|8nFcso36)OLKWf+#V&BEh^tv)GacMY!I3qZcGOPmCFf|>FD_q+dpQKG&D z4(=M+XpkZxGL|BQFX_=A$cKgu5h(@i#ZSXyZ0#|atC+7{qrl+E26rRUNA#(-7 hxZ;2`0kF3{l0(xnOU>etU0W8)*)w~{cd@mcR%m5_r>VN4Bb5qRdrRmOPA>A zF46wzF2?DU>8@VBa^=e9tF+tIt5>gGzkTC6?Yc`(fAjYJyAK}RzkB~aBQpmJBNN-h z`}ZF`e#FMf2><{XS)M$7!u6Dc3&8cOl1sEtuV1@<=f;gYTuk?wxcj#N6}oFQ zlm9mQ;L26T$6`9y9=_;je)1M-L9@~yL_Jx zM0fHX7V8#R*>=3d{Z<_6DjyQnU8$-uZ*4HqCG}z}Zm*1V!%%L?``+6~J8Y&uW}W$h zj_vHPw)5?x3%Yf{*<1_tOeknW6t}UlZeACpywTpVWj^OpQqxx8P!B?KKJzs)EXu5Gd-0_o?B z6kkoZ)+_L_ebhGNFF&lGHj9B% z#?>9x$7@sb`8+?<=|6690eV~x}MAB@->){f#0&U0Dz8C>>^FX${Vzy>K_ zuW7XlI-A7+nYAeYgrS>3E2oH$#kmea-=%7{IBYn+`IBT-4cZ&jacy|yFrpduNK(3AA%5=fcF3^Wj!2pAt)s^K zn>?}|t1eC#ba>lxhkQZ{?2e-InO@P&^(v@Sq~eD~Qe`aq&}+0vZT8t*JaRL|V@L*F zsPGcMbenoXr&61@Z(2F)(Ik-1nReFac$DV>g^*vJ1ig}@PjW8Tb27+dRzERgXFKQC zh%3ChZ64QC0Sk?wxns*Y>&dXH){c1KCgYKwEs7P`$@&OI^P3JW1VYtjhXw%li01Ad zadB9+^CLu$xc)y=E>C=a`|y6XrR_FbuyE6dW|#Z99W-wlXT_`5u!>JS*%6WstziXT zvlN$@P$kz0#yQ&BrhcK-8OccVv-l2HW}x`-?_Wwuzs2Kcj9-iJEPJ!epDK%hE zyL|zJewd`C+16;2c%(?TJ|C_v=4L)M{mlE5*bj0&kb?VB~n0JlXR!#sOl zfR_@rnII!vN>l3!i%w@)Z)?ZWdeivgh+_i(T%CW0tbj!$cU38)8_{Ii1U)7)sMaz5 z7qm|olBtyWG{NPnH$bm#TcPVW6b(t%@5Ny;zdDNI=Ft`rXpwQb9gKNEmNR7v8XwC% z61Se?63SK8<;-Mkp>j6C7IWI_S7?Y zk-GYEuRzT!_8=C9-ZhO9T2NB6F6``Fgj4gqChIu0_ufUv>$3xN{yqsB+qfx1#Xce$ zY6YR{4~NbMC26Z)JIq*`1D4?-W-`=gi2>{PB9% z-b*_UdO`O#rLie&=DcHetW%PDOLEMv^WF42;lc{UkAfmqlG5Ei{f8!M{Rb&&=W)u` z<%AW8f6&dq>yy@J4T(9_2;2~$%d;G$nVZfx(`9X4q^f)nZ>vKP8QC0czBGysQ=EsW|3)F`<-%DyR2&#Krai!6X-m1yT zZ|aa99061hNF9WEPD7ksqs{H8F4&3-x^j*O&Z3;n!$DI3REv9q(k3~O&rWp=1(-My zQ#deX*}9-}Z0+$1N|oJDDLPbl(&p5M*48r>;K1ranaFTE8?#R%b$M;vZS*E5vB*5a zs>n^yu1MGgU3UHj-49MbBzLJ?Qr=qeO=1VX#w5c7JDG7J+J5Ix#y;7lh2+CkCIr|)RH*(2)u5Bjh&(ZXx zf%jYKuWfjGP6O!^lER4l!b8IyAvN07i2pgV`*;R^G-7nFrL>?Lfi+bHS z7JoIZ*oFq5w&1SSxK)`b0=Q}4D1>S9ouMV9?VigKpwI4Ih>?b?|J_~Nsu#JWu@1ZZ ze06z1N16z6*^{Rqf@+A~)X#Bmbyo_xq_t4Q5&($X*^t zHW^taH13J!p|O?sKV_5IjBTVB`U7`o?fM|L>&s`?`*Kp=c@@8{y`cN6D!w7@4)q2W z7q;P#?!!yjz_ws(e|+sYNd^1_irliMXGPhzchKdty19w#(ij6H>Z|y#z|KvBON>R# zS73WbB@n2Ei2scSmTL~pm2sR zKfIv(hFjSELG3Z|3tNqExJzaO>pgIfk`|B&@Bs;|Ezutdel#E306_wt%}&`#lr11d z%wSc^E&a{>!`sn2b=A??*fL=WKSP$)N#*noZmfcgOq>Rj z!Z*EI-HBU~XX&Gm>*O>jS?Cy3;gFu*QZX7AX|Nc`H&!JqeXmyDm1$b^as}hw?QQ4E zx4{ud?R#}>W0lhua|bAcU zwsy4Rj{svpi@WfzWl^ft+MI6@outTPf5P1&aVi?RTwWWcQX5F^m>Pf6JsDUd23gIDrg#Ps3 zdom+gQ)8~Lds$rb-{<+KN%XxdZo-iL0}iG=i^hx6;{t31q^8F@aV>lNYfJ5?X{+y2 z@#zE#QKCFo5E@}#dP`=Jw7#``Xk<{#(u3yI)-%amB)pX}psJ&dR#uwrWev`oCbSF_ z)gwXJ(eukR0;=x(`Rn|EYm?n<{Dd@P_<*Eikc{h;w z2SBO4p&k`RK13Z8eF$#4S!RTV%m&LDaRoc)g${a7`e$DoQ41w-b-rCX%LgY(`3H!k}%&1+ZW}f6HL~Q}k z?R)!D z0}6r!szvt*RQJ=!|M`S$4`j)ZUMB!_yj%HOCwEVx_9CHc#f{1T{aIm->unEYWwU99)5XC0rCQT?)CPh z>QJG0A|Og?a*%kwAAW4={ij#R9SOD+DkyXI5TtXxd#hpG%g-d~*nVL2Ts7PA)Hjf? zZ^Y5@Q@T51hAN|w6W}X}8`2NfIt|3C;RZC>_9o0*4E{-K<_eL#wlo4eA$=P>#YRhS zK1_vj``E?ADK;pVah?xL}+e;5?d zNHdiC$uFiLKnsYda)XX&^~hc3XOefj>OqYIA4EOY&-O7%6;UeNhoGsz63PkS@)owj z#vV&J30sg7-5F1+g^{IdD~rrUf1D9Y;t1Bz;|sbSTNkLO#M}G`yQZV$Nym-ZL+@&1 zKp3(2OevAY?y*2smtfMct9_nMroP5j+qRMiWUxVPuh?SjTy@LD<46g4L3bq}$-1Ji z&%uwBfyb9A32Y(t??jh?tXUKeJx zneC5cg4g!;|NNrOf*Txlu7;m!Gch%m#VjkEn%|!DlAB(3G9hTrrUM8d z(IHn;7nT}o*#pf{YRJmP-5sd%o86p2HGS!yj=07Wk~Zb$H=I~ ztpyiZx9~Idr$eWA2M3Fj4qRbVzHC)tx?@MK+K*d3{FT@sk*0%9RSMsc%Vwh1LNjv5 zKkZ$8HR0I!3p!Q8ysnDrID*UYgyq}$fc?Hw#L;<3Ys%WJFS{;-CJ?hc-lcWM)jHhz z+{0-bgt(xC%8QzLW|R{*TX?Gt1^3UUCr;}=yZ7;3&~=H|~2J zPlY65&DQ~&N1Kh(B#1Y7bmR*+JJodoTuQQ$NujyseB1>4e+W^o!*{!hM^ zc$KaMm2~yi1~bsdUfiZSs+DYeM8l9gO&E}$bBu}OZ?Gv1wsK?=1Uaw>}8l!JgRx+?a=#iZ956haG-0Bs~GGZyjhHNcs?nST0 z3sp^)<$+jVMrZU&Y_)N@#GFMJ_0gPZRW--ZO*8VCr}^+G$uYl_YeJ0I|E}HsJu%k&DXq$buXU07ZGPI@_awUf^Hrw`@U@ANoGHGuMS zGat^fH|Bet0{SZs%KkNeRj&H8P$Wf0UkWqSj#&U*K2N`((+-L`=Ea1+r+lk@hyC)j zmgPuab7tv~3-Eg1?7q3$qC0YL73SwoE#}@28;ictI1)r5?A%+IzJdX}oXMW6%@;@5 zVG!qJ2XgIuP!yv2mvCx0jJiIia`d_4WM8}igUM6OSgIFkn) zJKaKrV*BH5YWP#k=>{^xs35nu1o9cR`x|X5mWiDdsvsA$xZ2Y1{i; zEV;NDWVSFyUBvNp*k4|!X};VyrP3tPwu%q2yTw~;9zI=MH(XI=Z!_Fcb>Q;|ZTHUc zG{BBe8p%yX+*36?`_#6j5ILWQT0oRoxhp{i4jGP=OAaP)Y*Z=p_y^?=mbT8WzX21utv1GKlG3&i)#3>4fboP0ShS#16z|$b zW{iY*%r)iMIH9!*f_>cgjg3i`~?icNW=D?u(dKgjMqe0jbD zoS!+ple_G30-rpI76HJ#i^pdzf1pcq^#f47z&JLthaz9bAU~|(tc5!ZyWd#7fDI)% zLXm0&9QFqbTy&fd5T2%8{C3dC^d#CD*z|s%UTPdA5_r|BNyNpzHK+hqFuR+F8EA_? zcC%6Yh=-u7z>_?ZB9Ip5qIIzA1hzr6=f3u)er@9TC~;)NCYPvDDA&xiH3oBI5FF_c zu6$AK3xe!DZqBQk6}|#X<2Ol4dUrwh@z{z;DG18K{Y@K*SH39{^`)70HC9lQ4+v{_6hE9P-kUo|j{g(OKwk|m=;T}&+-QPOJWUCsscP-* zC3Q_&2oz0WwYK{U%FSyjPD`PzEuC$C{3En=bfEuewlx>$ygd4`8n7borucbqF zAETIP3aShJrj;wLBzOvNl`?z}W8*Ps=Nww{^t9~e(joUwr0nW+J!m4Zo`SA69L37Q zBv3hEE}MQRk{^H+$Wg5^Bg|`fA$MH$XR>@@n;p=f~DE(bo-VR zOy2D^>=&J@6`Lo~VDMiJT}x&kW{^n6gSNfKBYDbP{#p`j7RIykS5PF#YVMBG_Y9T< zqcP;)ikDplWxOqXbo&!s*+FMFSm%(FX_!^2_XCu>3viNH*E~(qKLH$} zAx!HEo6Q3KlNI~!YUF2j`)=jBQh~K0M$Z!_Mu=N7p~b|acX<=TXPOi1He*413#JF&7pIYM80530B6zamu-sZ`Q?Iz zv!;PTD*w9UxsZeayz?~Z@(}jB+OZvkUilnFR zjg}=r9HIGGY$l4|+cyVWA3ru)f+;wI^_52SZ5uP`EqS^UYLqjMb;nkm2engnlaQD9 zi7A;L2cPR1t8a3w4@Zyg#&}AN}GP{BrOD{s`>mrUKDk^ zJx5jb=_dW6vN(++f0<(LV2xoFjQP?%`1F_8r*(Zou|7il=Z=VPr%BWPzd$s8`L091>LH>f~scK~E zmpn8}%+XnmuI8JJe!v6>>kFRh^<3z6S*s3oHeFdf7Y>5o=>f;A3>-c&Ey3Q~*nL`4 ziiCR9K1F^BdciAaM@U;ZEE||nP-1p{NQ?2LVKj{q+37=-zZ<)hNsTA2wE8ang?oFKkI({dA|RXV)M42Jqd*csn~{zBh(vQK&-Ui)wr;=i4 zkk#oe7!Y6@9)^obt`z?!4DgC3BxzQ_e#=$Ug}ql8!gxb{QPUcyTL z!Y<=k_v!3-r0kwlWM?PHg`p4^CLI*h+Gr^S)_&u9mU=WJt>x^F}sd^MT`GRWkE|07_G+ zFV=px7~wTil&vYaq!xF6-8tAaFNeNn$lOd;I8g$M=$#T%k=WKO7}8gEuCSi|KHZ30 z9Fse8@Yq001zvSTx2{Mz=fl~;iv+eD2(4|4xD?eIJ~VciMC#=_7xlZF2R~aBUt7^R zW6nRA2{baYkBkNBD01p{02E(UzFu(y`&$)FUCM`VtY^Jf9%#)9 zOKOL)VDoA+(|ZL@EpDo6#sSfBdT7VN$*Y^e0?;=>kHWOu_?T-VE$0Y)sRhx(Zo7-V z?&$emPHT6jQ`A5t*_6dL;I6InX0=AJ|Ee>f1)!c2Sn@;aG!K0jv6enATAQ|$(n;;# z$3HO7Zq#1rY`5X0VoLjoQ#z5$?#>%a^!n{Emj{OS4q5#_9K{;A)J$xqKa7GNx&3~S z&c^PXL~oC(uvVyVRlJ~kaOR0Ag?%NOW^XbHLcvRzk0V<}SgM55!Fx3z(e;t7Go^SV zy{Ij3CXdu5rJOI!Zc{j$*!zaWuY}QQ`{{Ugl^QU8Y|GBd{j-wYC;hLj63N3|S=<|#YmMg5@fPR&dnrHF_G;arpJKN`oxXW*Gt4{|dZZdYFWmknF7By7DkUM4 zyZt*ah1by1{_fi}4gU`@Ru(?qKP|;2ySVyeEL~Yyx>#-DtdCMrIjV+e^W?7GU;ARJ zWYk~Xp}d>)8|)Fb%HofrW&@gBwc2f!@8gvm2I>P2Eh=K&9O_Ezlp0+C&8N=3FehEG z75f8_!(J4$?)xd&MmQl~iINj2s#=+>!2u z!3(<)Fh9Mm)abg+70Sah>LcT^PumOdRq6rs@7>hYyhi0d?HFT~aRR?IBQ^>ReweU{ zi5sdzD$kvNGX;C!Mmay8ygG8(lPfqtDTl<4ly$v|iM)#+V5^qiPQ3Y3k>2^+wmdCc zyR}@=@l6-EXJf(jc@s+yzCuLz>; z>aKrmdKdrxokQj+K+_UT9Fur*R(-B>v=NGRPH{!{owa0qE!7nG!%p%cW!9RHg}`|y z$fcdBL4v>r_O9@w;;*sxhTY>*nTQPg@i`t$ty{2lZ1XvL^kM>$ehCmaBBl*5=*= z|M-k(@-d>V`|Be_q|Gk}yWJ5NFRrTkM^9W#tho3!$MkcuxVZS$(UWV|w3l_Pw0f6#I9L%vhF@jlsn8M+n!89 zY8wAuA*UQ~b4fS*6vi$E3|1XXi~dc{p2K5ef1IxB>IWFPuMqaRn)?GIl{LajV~>x{ zdj2G?m%1-K5=z`3%_Y|c?kWmV-VyK^{k{Pxc4$d%Zlg;EV36X;=<8=YU`BtvKC`&G z?`0z={=Cvhj_qVzg6iF0Kd6+ce&@s(Y{uF}jh2)h9o?y!E;ze>HxoRED2r6Tb7*+O zN7OFWRnV`;%s$T3DpG^M*EVfQ;S=PcOjuGYsACS(h3uY?Ola29-3!w@0pFv z+f~UQwM-7jJ|rpNT~et?f+VxXiDSinT4{i^y`f{!+L-jU(d^%3LM5D$;wq~ zXUZ1&?fs;8Mq+K!#HsQU{%?sp%PJdzfrm=H!vh_av1@I&=SwG|6uuMs0r`r+Bxnzw z9cpX2V`bH~sKG17t!`~hTlaEmPB<2NI2gRWV6K(!-9SedcG>C@R$C{I0Uy7=5N8$P z^sH9jz%R~hob7%{fb%6c)P%*CWE$x{$$1R;u`xrzX@x~KOGz@kHmowcs?o#|ZCgvL z2pG=d+>*|?ir#NG}Jh~(m|l>m_@3g2(GBHKJE=-#LmyBvAmT2uGXVF=FeuTSwlV}$pPa}`x!H?d1G}3^un78LS5XE zs<3P#K?{3l)3;YUm2EsOcHxmiBO`{Qvm9L%$WIAlth}252ru{P9-$VWwuQL}!ZmUF zPD7{0fK9%=#CeZsoKNO5fHhTHDZk^4JMM*W?a)llceofiCFNX&SrltN@5dpipFQ+` z&hvXtYMk9%OlLOh57TrU@pCmd5~)v>J;7q|JHqgyeE$y(djZ#3bd62sOo+R8d|**O zaiN9O@})-#3yhGM0Vn>+gs?oLDOhNaa3K^MSu`X`FU|GYPh#P`?Cz-WosJ2rgMj%2 zEMNjDy&|v=db1~=zaQP+rL|qBjw=ON9njbUsm0kv=#~oH5G#I3G zx?oby+J@RHd||>3*r4^y17rF3I?-sc)H1cLhW-O9Q)9bfTn^T!V^Y4DOEh)WeOWdd z7RA-~mUiZ&=&T&lv`5qT>JIwXHWj5Sj+I!xrRq zHz`t!#|6>a)`naooC!>`T@4j*nI0nSL_t;Jx z$*DS^nWGH>&D{TNb7J)nEiryUv#~W~o?G_cCCuFq&0x50cZJ5#yfYO{WmuDL;5Wj! zGJbDrWd6T8^^c+Lwe@T0yDs@g)BF9{CXe+=n$3SVh`S$LxM4m7j~S!d=UKE%^_iH{*6EO94B^Oc`!LIV1SgyxFp`M`|ozCx0QNKZ`9Q5%A98^ zacy9g4;%BciB!nT6YkLyiB&KA;VHD$;-C_#iZ>}{Yw}~o2gPexO>fGQbB?!4Q>=Pc z31LMkYJ02s{5R7G3{+57Hnfqxyw0I#~vOe*q7T)30J0%AiMXuEUlcsJ*S;C z@fmVA$xAukkr5v5>^_I(|1(0z9w*%8(}!~D`_ohvPjS(q#W~$IXZUvtD z8nu&I@Wkx4;eOkm}6yC;7$RA_kd#Qt{E+?pVthH7_%K3-WgdaYgemHYM z=e}Fjgljch`|@E$N@};ATH|H)=7MgRau)i^Pb`pazw^U+Fz6PJxE$nmrYnN&JO!xg zi3fI!GJx{EKrhVJu-AF^Wh?!KXoc6PL!j@3vRMx829_V?wd{iFvES+oTV|E8YaR**bVmVY$bf%xptR!N$zh6O0Gvv#*?)5yoGgO6so&os|b-{~6$O z$a2omA;@#lH?0lWb!1;mG(349zCD(S+;IRo-Ps-VGmrVN68K-R>hgDvZ#?u<+Osi# z@3EUW^lv!O&?o&LFGUl?x_8dm@_%6$z@STw{6DMtUkv$6LRN%+p_c|HU_Us2BXG5Q zUlxAHOpO+J>?Tv06Gt|uq5|2lR0W!98M!0-PZbY1OkJG6dx8aoUX zEbPT-`kYB-r%Td;k2gAL>=daYRaFzDyXeQ!2JFB_4_QkKOGch7SN&h{`Ty$CuYu_( zi>9nbo1qC~FVTuxvk5sBK>`1?m^OaHhoUQZf^qU9Jct2Gja1rGV*h7+{`c61rJ1p5 z%R_L~8_^=f>`KW6T^(&UywR!uG`F~hhJxXRd099Y-%f1Q(Y|Jo6U&hoX1OwOO!~j# zNqrZ!7&y8xFaF;#8M$y3)bDgw4uewyenr~#e}d!z{GVYy{feauH&!AX*QGFCEm;+f ztC@ZT8Z2I}q5s`zFE9QA>*KrXcypp3YjZX$xl3@vV!vnZ(0YyNS|KR}l{~<(kN0q4 z%jMWS;_V+}5ki}MQ#P9mA%p7*we^`V-(_WpNGUD;T+1nC8*?MR><3GCHH9BbnDvP6 zPtORDCQjU2%^=vS61D>V)5qAKv^c8T4T`B!^)sssJ8KP;z6qEZ{zluULhRWqEW{>` z)4#LNlZl4-_IAo;)*9takM@%dO(hK#ks_>ygf~NxAu38*dooPY_Re)b>Ft$*KNo1P zPQMmE)j-rbVuV!r|+zV@s$NR$r+7vmsBedDG^9PkDCo6qR0v1wrhKyGM zSIo#a-4rD4pm`Hn)o2?NZYakF`DU>v{jPKveQ}bXXQJEAYuZv>1-L{n{n}Yz?}?m- z<|%k5a(HXU#&RiM0G3r&B<(&gRH}*kDEnt7T!y5Nhr*T*j+t`IZf814UCI*bf-kGM zFgs0H)u9JS2UR{P>XhL*8JRR@=a9|Yc#(zenmzFntYoaEPXEmX);iab3`C=vLeaQiM4qk1j(LAJE=wV z>rX>lY^wI9Y#0Up!R4@Y*H^5hi=)51KJgSG68Ohp+=2`j24IM{j$?_p>#DzR3!U`J z3+pc3SJkrza^^j0VjSqRmv47+5n6V+9|w!cNF3s;yKb8arJoKjVbySw3X-G#7viiLJ~+n*4b~ZS|T8(e#Dg93vgT!7kv`)a~!h`;yW! zEt1?fRu*hjjaES~;s}GLh^4O);$n(&B2f_c+CKU!y z559Z-oZOno@}GB}v~=9#C+7ZW=~_{h(B`wv*ZHE(*WIM--PT+)v)~)O0}-FFP)V+I zU3S#}t-!Bh#bR?F7&ph*;;K`_r=3n1n`;8ewe)q( z8DD|wlg$p5s z@LDwMy_)g`SD?uUfIrepP5KyBxyasEQjLxzifr@rRpxZ)U+Hhjfcs5+@2QU8R!=0` zJ}J~JtwJhgK_zulQEk~}_G46b($iSVlM)GSVvukB1Hk;p1l6j!r3dYnzXG;gY@DZebrOl!KpP;cg5M$X2$v)}ERb>V3!bbYBj= z(W%U&U^&53aq~w81={t(eQ(B&|1|cuU?!HrH}<*0nJUkwI!!_l&6|CuQ?ja+WkU92z+&Q)8X)IpHjM7Et)Z=K|Q zu&VeI{lXRg-J+_@UAb~W;9Hm525H(+;PgqjnxZe3Um;*F!te`!5sWL*Cwin$<%5)% z-0ySr(q$Rrw-vO=m9A#0qR_RjB%rG_W6nCH@+)e@c-jaSqq!;EwI!e7?~uLQ5p^3Z zDRuZEk*9lhKykQop$}iM$uz!bk?r8P(9f3eS!aA&4OS%r<0h(Ld2MV;60I)BK8R06 z{;PSM^LZH_j1K&EP%xI|UH?7fL@nGgThNAQ=82=0%tmJ2>|qby?~%FjyuV(OGP_fV zI=&~Dd$~?O*R)5@b7yMlfFmFkizmxZYa|9vec2gFM`mV+WVlZu?`FJE_MoW<^c8vO z!tW?6(^CeAAY2eR;N`XwUpX}-ch1Z4sDj6QtQH;c%sFGMpzt!G_jd;~6L_-v?pPGg zADQdZ8)1?N=HWxadssDj%TJvhA9>p;3FN~Mbb9E;t_N#Oe_tSL|2_ilbXM(|St|1T z{gfn@WXQ(wSgAw}e81V7Bi^UX(D;j!>T~a|6mg_LV&O)(CW9=u$L>8FY+y&R@*lx% zFO7EvV-p)xf2+g;U%Q9SVPuWL<(tpPE@f^DFax(Ex^kcP@u{(hoGmx z{9`R)vHgo*k|b0_<&$Fm)%XG?o&I+=^1cL9Esoz?tv^Sq)Q7aB#+;F2f>DhE-?|O*g6k-MI@Uxi;}?|J3dE? zX*{bUeZ-a0wvcEu@`R29S7Q65^)8~In0vwXZOOh>tF&zOtHPqNn+xTq5XtisYjEx-$&fvEA95eyo|)(jmyCN2dUYjzj~KMZyagsR75Sk1?j%^p=1e6bp{`Yfydb(?Qd)JN*72dj8ymIV{>Zm73m>b3Wsa z)+E`!z=HKEtJq#rgpShQ876mKJ*4yOhf!`MRHwdQ2uYq?XO*x0mp9bex;MqC1*H(h zgNo}Q(LcYmu57$kjZ+Xa$+XT!7wlNUDx)Yw6-}3xKZ8qwB)(6MX+}=3$lfZ1_~^8A z#BUX&<4sbNqLFAdMHgnj-cOeFvd#{?iG)3S5WcCoFwtUn@r|gwuSz1JBsdo8ULgv^ z%7p)ml5@UMj@K~t_Bl=)23f>=@$>v;s|K#qd#>f!ExRkTQ7dya(PalqhUH3BB&uu1 zWIf%EcOTsrvE2%6Q+~qm*y>H-&Yps5fR_17j)On??4}$e+n&Ue(C?QjCw|NfN9!)6 zFf5nZq+*m|dCpZ2`GVtkbrQv=m2bDNM33C;*cUWShJgaO)=yOU%cMZ>**qo{L@gfX zXd9R6jkMdLt=ccY?=+-Fsv4FF_4s_jJO9aUD(bNE+-uRmhO=J7&RfH&;a{A>dxxC& zhExTtWYxHB-?~jj0lD+^yc7LQy4QTlVi3X+smSoC#6|xs26>KevxBIfDb2t^y|dt3 z7>dH*(%ng_()FpA^of^W*O&Y3ilwJolt&7;@wywzYPT?5D%yZdy{+Rmv5B<_VN4{s z{h6s*ap%o=T=Zo9)aHGgRJpX;{1TI~B#F{n;X4y>QV=6e%L@Dc-RlDbLnK&Ud{=sD z2Klfa(&h$tX{QSF6+pr7elB(0SLBqIO57MCd0xop~@%^q#+C@pUnTewO zY{EChg1cfgv%97&RMwjyE3&MGP2>hb!P zvXO^VzPYi8%pe;(_YVf8G@U?VXP~Y1O=zKD^JZ#*P+jjsIsBi5bXqJ@LZ?q%|M+#% z^x(y5C}v9$%#&P(TC{&Wxh)N#XW5jK?@9Kn;fey*D)?5r)~v~kJq%|X3~CKu9PzT~ zLRH!%hy+I_}7)O z6m`)1eyf}%LK0MF*S~XOad=r1g(!4g{9Dn8P1ijpGEt~^y;ah5O255u(+2)qTh5y4 zcr*UCMQ&T?glj);`nCWpM#O12t2S6n&bd^4xl^AnVM8`O^~uikn3Ku3VVxw2^~#AC zmZmpDzQ^+{!YijSFmLe`(^u)yvJ&0etLEP=n2&83ttV!-h04-NGRmn>2m1yrVB$|G zEmfiJcAoMxWRw)hqCLZ^QPa}%q$Zv5oLgE~sAgK)wa;y4PdQDzDIqzIRKj;$#tyW@JE|Ms z&&DrSS+g^~_IIx4U42sfdMW3$iep#Ms!Jj>Q`6q~TbH31K!D3yWL&C>Wz%|kl%ZsD zRiQSyPBzWCgOBi`XtZ+pj}ppqL9200y*JrKXvfOi8-RG_$#E|JTU+B)o8VPb^fY&9 zYIcP?A3g=WdHF^OMMr3V-dCseR&iAK@w!qzvy+?Rjj{RL?^koov5Ow#*6(Cr?*v#m z)w#J$YZ(7gGQz1U*WNlVe*Ai|1m9>ELk}%;)~ew%y$dwllB%3A_$ z6UcBwnvz%y3AsrfCZy05lH6`}VK02%LQFMgVp_tJQgXvRX2JWY#8wUFvvlQFNp_{J zKU!yq{Xzbm51010sr4cs$>>bUE{>jRxf6X9+7cTF>+#1@_Hg}wQRBx-TetH{%na~P15q~Xj_n{4|;#7s>!L1>|@ zH+=x1XYHxuknaCUVufgcc6~xs7um!>duw|ts;Vp4kXG?!?U`coHr|!nBCq6k8ERxE z#&bKyD@Dam{%)oqrr?}LcB-|;Zi}uj7FmI1&@NVSp}~eo%X5X#1<@u|9txAfz0km6 z@Pc(3pdwDISr*@slx?#+?^*}Dp-4c{wp5z_lGv>L@MbK_CfmV1?s=(!wpJG;m!N*h zs*h+KRsob*kp;b9+I&i!ci$X6!#!8;w=R=q&e-kl^_^OV;nJ&ebE;UGb?TD>V@^yW zOl6KZIQP<1-<7^!OPogNREpOc`qy&79@Pvst*0!A#K^6c+I2L9g|&%nI$|Lhj#A#W z=sgQ~CWE-w3jgO*#Y(?ZamB?3S&GpFfjvZskIn%Xu7a zOCoC0hBQYd+OMmgesd5j+?9&_`{{D;*j8=C;&->sRwJy?BZjmZYXXgobcokY(aBpl z#&3DOSiF8ML!)Maz2EA?0yk^uPAi9D7dsnzP;Zw=+tFY85RQFiUW$pa;~7E?Z>1Ty zJeT;HsK6I&B-8`9eY^ZhR&9de$@udF9FyCJ5;#y;P5!x-V&3u2j~vd)C6v08L+lUj ziVc$%sYL~9<|R|166m(w?pqx?bUY=$1Hf zd|fC-eKwN;@~%fBWr|Ox_k)i3ulpgiA_Hp_>Vd~e;g=?Mhv+y40g7IJ6^mf$JcNPo5+~# zQ_LmcY0h`*9=pV~O~4)|%lN=z##_D2v8A1ZnzBs_oswd%2tJnh?<6+;W(qE9*1d0F zCv=4SoA|-IchSBLk0rE4oIsbS{4?RgQ+%40Z!)^PU%9s62rf!01yv+hP40XAmD;UX zvWK0tny*ZTVj3yiyP8zTfyzoB8b?*j&L#{C4UGAr+MK4dCX!y7;i_e-8N>DDJ){6ik=g4pMH7950zpnHzQd3=1zIl|~M7Cl5**4&x%6S^$d1b+tw}Z z%yi&VBK*)46`(x4P?CdaHdvV*u1DtR^b4}Da(DIHKW6D_9v^<2B!f_ij(A+zCOlE< zDJa(X;CW$76MwH%V8V}?-am((=F%c4Y57Gu6EMd)zA{vL;<`yqx#OGXRXVbUb@Oqd z`?u`e#0ae}v4Vp26_O7k)7CF8e zO(Er`q9=A#xBL#u;eCn50St34s`yLT!m0H(U=Fh_h+{iDw_B%B4#yLfV+oF4S4<{W zmksDE)_HR=uoUeRnpgLW0XIaKCCFR&CBa`pmhlN6J3SZ1w{8Cr&cOoSfsJCC# z=i?nP;r+%M?A|_URB!gjHIHplg>>d&e{(V$jQb>UqjoDa6>pX{*N8H*$PD92B`TA4d=dV2O% zzR0%oQqrOgXlSp2O&<6?3UOc*V##tDsqoe zTi3M;j-Q#tbh(s|D19bbTh?#3_jEodMB298NFuJ-m@rw1xMYN;Kx5J8j;&psalK+6 z*1!s17czVQ6$h2E!nNG|v$y_LM!y^IzE!cQkcy?D^dPA+8^L9o@?{)W zG2@}A{rmUO-`6U&?M`0VSxmO2A<9ej+GK=1Q$OI_{^q>n6H0WOMAbA9fE6u+d^ zd#}H5duFG*r>m>Gs(QM+s)%ow;bHcHCO54J#K8%bKleTb+AAAv8#-*UR;szahq9hM zGJmR6^GIgI>gDk8t=D5{{(^eb)=>`O(j*5i>}GDQH6q^gzV<_Mik0POLfl=88YR1U zb;(q>bSvhgjW4mUTigUxUDQMxG#pL8W<@z?g?s9WHSHdvv=p@yu=nhXWV9B1)>efN zcqk9Hcg{C^vbBU-4yfkQXYjf`e zHJ9dmgnl`K#dpkYxU{1t9qa2`U+%1UtvyC^Q?p(fb z6y!I>S#wY7A<-o*X`UM)UrM$WQ>WHmsjo1(CY)HHyR5uyE|H-q4XV&7Y4O?=M$!vu zGI2h*zY?()%MzVk#Q2r`=y`AV5f8iOZKYdI$>ik2Zdsuq?32_0^EDrvxfoKqqNA8p z-q>%z%u35&yx1yql|?zvbZ9J@aPVOSQT|mjERfAI*Xcwnnsguk7*O zxaGb>@)XUC5#C}+G1sMU-Njrt9*R2)l{F&cEAH~^WUCoV?(cMa?W_eu^MZEw-)xe{ zF_%_-zbdf5;OfB0PUd2}cA zmg|esrcAaF&zF0t6*s2KIF*Qs+w@Q&AvBMSpoPpMvr6(_m6^Z+@@k$=!A2PTq9Ja8#v8cE)|;Mr#?)P_PSW4PLTk z;OO4bv+ImW_SFXGySZ#9?$WqS5!NXW%%d$^C#Aj7t$Y{!8f#%Yx7J_LcZ09W$xF8$ zP&1~N)vq%qDkffSc|)h4Uk6MyD^|8VnEVoHpe#~!xyUE8^Z|l_o zk)_A9n7>}@`SgS7xowg1N-M(N^!jIrZrq+o+^;jfhUd;cqwu?R){e{0CJ%n0&Xc44 zyP>bM*t0?uu0n4fmRg4%VlOnuc zD;D#QD1H(c=*@$wEqNku^CrYjqtAJ+33k=8=JZCB(uSpq#1e}Sg3JYaSNhj)j_*d~ zged1(cJC++e%b0J-OI6{=Gk&NW=X2E;=r^e*;}z8gWnmUz9krhW58QS@ZiTWIR)qNiP9D+Q$oSG?g(bFqYEYen0k7{-lGfK!@BH5o~)Qo4wlH#yNQff(7RJ_rsn5TH#GBk43>UT{`9(nlI zf1#7Jc}D#@*@ya8Q3(Hv15~d9nG($0RmxG~xhh?ef1q9@A(kk1!k*!;bR5}zQ5jGH zd8WbK+4L;6k$k@8jD1y+!V4ro4Hu>wn^DV8+^w~LUT_Ctn|`3_4eWQ$c3028R3E>N z+y!~sNJd}!l$fzysUFB#;=FthwbRwH%>U5KL(~PC4`;{)!A-_>Xp}|KIjD+e>oop1 z}vS?it@1gVoB*v)7P|5 zes@hdQUmhZasSX&&fd$52ZNFJ%i6b!D|u0eMR%h+b-M#t(*E=0BD+g0sL!ndFr5*P6$S}p6SWk8eLFR=depu*`hH1LOU-l%-Q)|&V)DEUR( zTpCloFlrO#1G7=SY{=04Mmq<0scjW8079gC@-GvSvd#@|Xe*M)p5P`%O z?^^WFzbS!S^xsI7`XjN_j?RPScpHfj2zk?acQi9iU3G(f{g*r^6{4S)%s4YTxp(z8 zrEQKr#QzOc9q3uyjqaIdW?fkRj!DF{7rv25Mn0{SkVDwv~5oroz0V&EBR$ z2cr~wSJoM7>RUd_EjV9&hCX{@zI=G4_ul@{SdqA_K5bI5NG#TwJas+g$7ZKZZ%il4 zmzDXOvSlBf7GmuxP4EEMh}m+`GJg8V;Lh^do7)JloHzw@@~>5KJVv8iJ7%RiPE~q8 zM?=>dSZQrq?q4Tky)7BV_=QE&0KK^x888=qu4g}LYINROpl3fHWcL2`Qjf}*Nr~gt zo~ov{kBm;Vo&pwR;`^_JOUjwcOF7uhB-%w*;Lon({*kxwp@GX`CA=PA=iL=ky|kxZ}zu%VyXoQq}3oxfXjqTRYwJZ@hi{UCj( zHx^V?1lpd-ewC0KHC00qydC%B#1ijh`K3>Ny7N-VRkEY=36}85377VFh2!~oncqOd z#@4y&jNdVb!yHZUpy&X2;-@*g5Ihpalo3;3wiGGkfi@os&RtH9s}eNy9(yw%lDmNF zxG^`;=NIZ%Rhx?uJcO1QGB46UHOC#&+PG-8^V9`tzY?qKd4P1AmwagAQ`dF3&GdmU zT0EDF)l-h&vrOhbd7iJdFj#Oq58H!!y!Ib3){Ir3DCSjsZywOf4EdDHsn-j>gsom4tR5l#h-gZ!}lDq z_%LREtW;i_=bl_qw1kx}mQKHCMJn>QWOP}pxvIKRpT66gGu!=obQ?u;tE_&f-_rU( z{)2}CdBJzdDz&FHd5<`rtE+dKu6ejP6U~^p{X-KR&?Eh?|7cFUS}UC&V(D+N8X=#5%DMbGFKt}Tx+*pRVH z`aLU4`&<{UQf(EVx1RT9yd6Eu_g>k($9!=1+7Qf7NLYH0MJTGRH)~1a9djER7K-vc zCS&@64nFy|LF$CMcAdPj>XPV4tkA}ek@rdAlij%cwc&eS^`?ZnQu!ru?f8czfNb%l zOlZ^y8?n?jl!H*=Y{fVtOYbw>tiy-D+le~>u9V*-V>Qocw3%}fYLgHi_)`yJl%V`| zxIgC7wY4p3ob7XX@~Fr$du7@pUCSBu9KDr}m?)*6S;K>ak9j*5{jG|%S}cx3{o^$S zDW~^n6M7*c^Jk_s&y%k$4|u{V#aImYNc-Xlb!N_!Qi3MfmIk-t9Btc4oBTdJKe$^L zmKd*0@5eSz!E1z`1@_&YqGAoRO4r3!T*(J%2hU4YYg@2AHODUQO=dX1xXO|r3fyo~ zj;Mpmi@b|Ul(+oqw0W7VKcY%Mi5@(B<$vN-wk@{JhRJwUIC?$8mmPM>aISo8b{K<} zb08XfC-vbxN|Z!PUGDXJ)xjM9ouV|6;y@c}T7&x|h{R&t6N5J#x|7|;CPuqiN$-5z%>IGbo^ zKaYaDPH}Rw$j>Is2QU1jokZe4ySlh}_GQky4*&k-C{dxX6NVscE1yOW(DnlRDjf;9Ehh1P!j;gW~p? zjF@)`UHRYZ*T!EDX4^US6tv_YIX|@z8I1~nZA6-NVy>+ucGAmRhOlC=!d_ws)v6u0 zt3KJgbR)`u@{UU7YnwWfGQtB&y`{8bp+0pf%BE)34n3Tw(c#9M&>~u`8%bEIFhn!a z%c#3+tmvaBW}FmC+hE)f`U0X$L>@uDH!aNA%n>=dYYqcH zg?g$fL$YnXC4{IORya9gNA_gzhRct>G{jvrs1F(&tGPqd-?_G;MvmoU=kM);c9ZyS zDy9{C(DR4fbC2w`;aD*D4p>F%JKB>Ix^7M`yt%01=LbnHP4X;>u3wWM%-^y*Izw{K za8gAwFg~}nE%&>Uw#`tS!)SjpNNB-&m8KyEhhoX5 z?K?~E$h?s%B5e6i?K0Pa>+WaPwj0$7`qs;D6ud!gR{63@3`YanDmIo*Z^8EaPwa|f zsR}24`vj$pGqV!T++y1?H{$|uwalA#&Tl!|%eIrzb4P{@HoC@h)Xhp!uAOJlrl^k^ zKbED#%8*!te?G)Q8*d~l_)bHs6MEtNoH4ip{|1lxVG@sJhz zZg+Gp)aQNtp+o~z)ab{NOBv*WPElF*S}Poy+cHwz>`p1b$u3WHQP}1D{5-%UdZL3u z^76%FmX*g@mR?lyI%ON#5sn1oxJg{BO$Zt}Yw>apIvC+J;Bl7sO8)g^gFU#v2V(Wh%iOvI|T05*tJO;VNctIWV)KdU=)TQ5W0%>wHoOd8Q>ok z;2}EsX%#e>)FpVlWz-}gR`AapIv8AY=fPcJe0ZF%K5?SUO02!2F_8c{BNBiV`^}e_ z1z7^pY)K1aiCzr$=PgYVL$c71oabe55>O!ISFml{%96i}Xw1WJz>gG=$m&Y!Iy2>p zXQ4f*x+Ix#5tX}*Sj{W4?V@{He9o_uqDvp2qgD^clJE?P>+fwFZ)YGQ0`2K>)^841 zsXIBSE>c1hnCJ&@)Yd&MeceUY$tFDzWOj$^Iqu+Hb(Oci!pjbtkf!dh)8edgt&kjBHhPw-|@ zB*b{t^>ncPI_iqm{Ge()^N{eHrb}7K$)RyWiO%I9SIWmld(Bf>$}`I1w`V8y_omjy z#O5`e*>!7&=UW6aboORE$vQ595jKH0HScsJE#^xLJ-!-I!ZP61Y6d=H$E*|kA_OPcsXY5>_5YHZJ#vXr3h8(4L2#x=p5Qt zsMsE;;!_qf%2c0|3Qcho!Ob6`R}=i~oOZfpwE9y-sK8ke<{&`!sE(W!g$&&;S+K{H zcL-0XElWZt&i<*wP}~-$mD>pe|5H0Qq8Q%vJ*SoF@d^`G6m5~7TT!@>LP~xbwFCbX zXMU-ENFDmPpd=S=fKK-N1QLcNI@eJ@@*ke?-0zPTspW6$uBlya;STlKxZ3T+^yYtt zn>|rBe{68Vd~=U|MqQ;nD{IPzxmkzknoAjVRx%SZt57vK=?Z)9mf7YWeX!Fb~T;rY9y=}vOx7{ll##3CP7F?#pDJLT87B4a!B2)-Dvu|ony8&lNz3^xyPgK7V{RlfbUR7vd=l!% zPvcfEv>Xe3fX8bhi@ZD*uj(Cv!hy5;ANcV27ffBVwQYm60_fS=M~`f~V_xp)qB!C; zHbstPLx+Qt;hzl~K~~gaKj__rSzo*Hs(j0(w{3WKNR{sHas9*rr%P7M;5!Z%zV9!G z&y3Q_-X_4M3Qw&z5MEH(?kh7MecOi6#=a{U)g;h|dbRS;7tGHHaG=A;sije}j2;{X z8616>j=Az0MupRyt$U%_5=tBZi8Fv3&H9Sz5Vfz*8X7_|2Am0KkD+oZjD1!#vdmr7p*IiKbKB$0&dv~Q%%Ecd(xZSMiYMaU#rxxyI3u!g-HDrldPx}VR=oY z`;BQ1+TT=h!-klir=FFbr_A_Xd(yed(RL8B(Ng6NRdw1u$_p`D&7T;-<`cYbZ!hMa z-2Lp@9JEG~azS{rRhXyqX6{{O&4HJ_HBNF75_gg_LSzd(RUh*Js-Arckr|4v5SI5}+>1mcK+oW$< zrBm*9QD)rp>EkzLxT_W(&Lmn^laqWzr)w(>rA5LSuM%ofO@0HL%VbCIRaIUoML@$B zhP^TJPDpxRO|7Kmm!`abJ+Gs^(4kx!o_Dzc+F}n2%y6p@&!KghU+;E475h+iiJjb% z%wtUNQupv1cy-`Ks3cBmpx+a3BWifh>><6nz{!+M`8wAj z5bFeANLV(Dj2}YOwGFE5#A?2xHN?q3mrT!}s-za~bM9)gq%D3Nc)~@bCZ8rHXMf#I z8a2W>?m1Fnw&_$U6m$eC^ixaEc91_B>81bRABiRxr7TRIncy47`Rpf;1)cJSTjBHG zh`}(1UyyIq!=H^hvS&gjXapQ^lVm()o(gp|o(Og=aY}5_;TrXrx~eNCshiY=F|7WC zy0gTcMScr7q5W*fXg;$^V0Jc@xAsvp{MQwP_s(b}rj)}=!9J}%AbyapK_tmpkmw74`m|o6BCz<(<31PGQ`Bhe26koB;?>PFf`5= zG8#`mpPU*Q9r!4P+i^9oM^(bJyT(V{f$4G^RjrNQ zW*=;a@y)|E2Os6E_f?zga`OGW-vMp2_By=|_74}No}NqNTqD6US&hIyP*}QnfKLn zb{$JzSbMc%+zAZ0{8XhIZGEenOylhZ)j&tlsf6p3N2AN!WReTY$yjH@4CgLCvy~w z`wg_^)jSmSUL_b@@RsiD;b=|J{RYzgyH;B293NKijn(|sJd`h$?y{`R_RKC~a_b%S zsvb0sRZ=eq$YmT&6AVLAOh4dGsLR`HFC>KWXK8sUrV(+jlR_%%d7Zsz)EjSVTH^V{jOI zOV{kk`Bh)!rspncG8$gqa4d;u_Q>oM+-wFXnG5Z)h2`c@(|g*r4HrrMSWYxLNRG#h ze2QN*HKAND?KkuSPLEnE?b!a-XFDLmBeOq1b#=yT^sMbm13O%sL=9yNg z;+(8M`~)CW1WkWP2y2;L0Va)VOH7RN(2@FJK0YZ2PXG)g4h4SBWh1(HJ*&3aLPxob z$mxM6Fkr4x)lIzIM5WQj8bINowx@2hdBYTf>%ZyKz{j8+{unQz&d15-P2IwI;8;T4 zw^^G*h(n`HII`9$8+p$vMPP3TsZ2W+IlF}661y}Jp@e?g7sO)pep*c>+D81(Bw>uG z9Q2%}9MG?Jj!x=+30&NyjIjd{lrgULXG5pJ4o!s%B?n>>w9+YiYqgd%tnz>#J z9-sHq``fQ`y+q*E<~zCTOm!{ZW+%h_r(%h&K?WX7z145s-+4)CRDRD5{B<V@`lM%u8IO)H-oqS!|-Fz&u1OyQ#z%SmhaOfqbpb@6;rM4dc3aP_FTOa>r_SJ z4`WwSDYc5yM2mE4h1m0ww&T?}%M+G7TVjgABc_Lp%Sw5xY-)1bpgn`}8?UIjZ$&xH zg@@ijidUu!?KX$D$lvWEP-9=4WJy`os7=a#EKRO@+)F*I zU1;3KflOHqZ_DI8)tcG>?t)fV)S2a&6TNB9LvKf&g2R=q^l`i{K|yOfuTS>PP3rge zLw9ACP-erBZBP7)RV|ei2NTwM=(wF*k3j5Rl_d+M-^c9NfH?)ZkRKSd1+St;HE0m!{2{)3M`+1{pj?tm6OT5+V_PJM`n9966{?UoOeCa| zjLKEGqUl7BF~GfU1fUjm%6hm03B@mgk)4_e*;hut;C(ffIyEyVCjV@c#!zT1p>c3m zHK|~hMSnjC@2UeCtGns~dCp=`62@yMzS4fzzEy5``((wkWS%vj#Obc7q;1k_ff`zJ z4)>@$I)|MRCj6SUEM`#j+vJh4^9`G9lgov6 zV`K3}qQHCO*RI~{XAL$9uWkZU@q<+t>x00!x9=} z+mD?@O=oUieruXAp9yjWKabDI=%os0_MeaM>{KZiwDisBs20}`H_Oxx4+Ynd_rH_h8S-(`hFV%H8|$0;hQd%X2b zfUYs7x>7iom*#(q41yQTNN!5Sh)^)Kg8I#;wVJ|J*WX(oio#W6SaPqRxq}7^{U1w0 zrG#@hq4nv~lNC!5q?k5)j*V{8&H0-dG$Y5-H&0hWT(FNj?MWl+D8jLRJx-F02YqSa zfpc=BB9m@X;^@nyemA^12rKPc=o2|(Qq~Q^erLq40lpU^nV^1 zNV!I`-tGkdSe8&bM5@=q8*e}(BU|ogZXk!Yk=xfYR~r-BZ^ja_xw$17Rx(#BMF^bo z`Lk|yqi2fK?Cbx58HvUyJkG#I;mrUervQEul+F!}PYH^-Q7Vl_uhb%L1jt$Y0yIE8 z48dM)t=-NP9XJ9Ly3Cj1y~$i{hWFKTra8!{)EC?bMFlBRw`qNVGN z7WYLdtw0tl>wudpf}p3~g0aNSXtlmkc=~zDaU|YeOzo13_xi5W^g$3;Ph@T3`v$e{ z``jB{4#_g>50b6WOY-!o9VeXUO9$5%=EJAZU>C;#OV{w4n-=n%DGL`XHO;r5V@_XZ ze7t#cuHKf@dvR03o8HV>X)zofh;I!}=*TjPcW!O7zEzV9lU9;15`7RD4F&Dok);!5 z>qs~gS*?>CRBC8Gg&O6nZa&}w6o^Pc&8L*jEYP z*_BIBttV$QUBc^EY61fJ?^j>6s}yxm=~sFEG})Pcx}n^ozCMLs(pDMkxv> z&K!tNq|NoyPVH^mu9rl*Yj}FkIdvv?1G>tT3#R8Po{z{s=&+dN32lw~)r;<>vt&-? zriJjWLIXl}n7|4Cp<$6!l+>eUwe5n~GK#Y>t-{KrfkJ0q{_{PFeT6az!6Vq|H*6)` z2KopViL;Z+XGJl*?D7{KWH@Sr299&g?WxDD_GVSp?+u%%;6Mzf5Tb)PYHVH6ybJ`H zvnjMzZbzM#+6E#uRx2y^WbvakK%w>qAO-+LgTbe0W~zJd?bL6(2=}zwKwFVU#_*d@ zV+$l3sh~$a+i`W1YgCRTp|A*P4#zj9kobP3^}Zj2xHXSs&`@Dh;2e!{oN-)Uddiw1 z2#HKOoMa^+yns#-N~P0QB$cl6j)W_5msDbE4!nE^qm5W2LVUI7U5)NZn7hONjbHR}!_;2r(jNE7NgH zI}6GjF#NXCGa?j;AH~Q{l4Pc|C4Y^VJJ>y?xI$o*Z8){$j61jQHy|)}4im<9rBrWo zjf~H)+dnKRrc~-I99ZexBFN}d%L(SaJS(5nSCX@xq#cSWXW&9{8|r^K|JLW5PG~wmtjqyxu~`u@Mg1r z{jmQYNrL9n2K1pv- z^B{aKs=MWO2i5tql2)^-&`gk=Vcp$>tJzuVd426H_T{PKzvZK~2=7xJ?lQ-HscJ?$(5&93?YV0crFPw?Q^f!aGSZFg zmD-F~BCx2S$rg9B=_tAg{*rlb(%fbA{F+I$EwT?Gdd1Tt$`y6jl%s{pPUP^j_gH(a zen&2`)fDwC$>t2x_-#koH~kb2JGyAGIQZiv&&iv&r2Et8K56XsH9PhyXA<^qlj&C< znD4w)G9FSfi zm()c<&=2U=x}i7_4UV26KL{04iZOsd1pv$vnn2yi4?nY^YRx18p_h#(bUpR-bea&s zo=U!uVof?FqwX{)%{3_`8L^&@xro%MuN~zYw+4yXWE>kck!oAeJgINcTuNKB=!eQF zk6$ip{nPdd)gI>A>AlyH4wWCh%^S=5hTF4>O%et2(66M2vr5{ za%t}TF8~Ti4FCY8*(j9_VF@o6?^|)KgD}NlI~0sP_Ql3l=LRs4_5Is|+7Q2x4g8fC zj2?;O`^CtH(oh>vYg|lx0@virX^ebP+O-1*Hdf!}_|sG63zy~$mjifjxZqh=#RIT* zBnzhtO-fs3bT3nrgpaC@n#tH7msw7 z2E~5$-$2OSJ*IPIN^C>#McUJW3*kmm6ARu=_ww$A9V>1nslDc`!wi(~>Wi>u6Q3&3 zI(WZ8(bl%S>9-}f1|k6u&Y`Mv#oSdgF=OSE0Wlt3x5o6FHyylE(eeUZSz5Vq%5DM% zqXHAXs`3l;Eb{Yg(G`jDeJJ8x-|OF}J)N~Lg-!R>k+{H&x)Wd8FPua`X_V}YPi3^D zG3jakU>*H31V|yEs(%}7=HDoXXpB6>fI)S}KRdzBE)9M1C?0w3k$+nP=~ERz`d^(C zw|GtmA5@Iblvk~F(csPx@Q6`!ULZ~|pT3c$8c^1ZLL_=4|~eaOUfe@mVa z^jNuIAlyF$*(jo;Yby+~F>uAiEdB*(20d9Ko)Pw9cnb6k+}}3_PGSH6HwN7i0382f z!v6vkxjPy&telOI^G(GPk0viYE$BF4m!wCdj)@RE(mVfI9E-2(HsNr{8-%Vek7|{M z>N-}M!Z%=B>hxwWyP^R>#8TwfZ0PqneF-o9wk)_KHRBKNO_|0_J1Ncg`}*>y%myi} zxQX|wE~+e?LYzB@$(5NHzB@H!!Y#0CX<+u!v|1NqMyKLg0VfB*d_#`iBq|8q}> zYy6@jMZEUK8_WFJazHG!KNMU%;*xnP@6*MxMfFYDi2I33m$MEk%M$(v$ z@rZu>;+um|^kbNj^^eF6Bz~C`wY~@qHe!9mHUNRCiw*BYoUkONeUrGOO4@;u2akP> zps!!63)84{4ZUp%${*jy$f3{Y?VdHvr3Awrt~c_kn%6hIXJ`^i5s zf;b_tL=_$z^JQA;iw2-c^-scoTn$~2jeM~`)QkU{fc{BjWWZ~Z0e10T5YvPwqN1YH zx+b+fevJ313)jzIyo-Qw&hs()7yUa~{oUE{AJ}mHE<&?#LJ&t8UMdSc(kMA4)7m??e7ea z%7Iio8z3KOLoi^sdP9Zp7hsPJww=+GN`rt|8$=s8S`mn80M!mUYf@bQ%=V#iVnJ%Q;s{ zyLhSFvi802tB$Pz~AuEk;ZHOm!HgK~G~J+J z2N0<8nPHE+P}ZbTBoK3g+Y|jUbZG(%d;yX_cu+SW#noqhbRc2PiqeiN0hazdAo%Gc zaD>rYg@uz6GGbb@5R=v$^ytr6oRS)zz4=jDY=q^~yY;nJj0bCwI0;Fo;yT|tYWS5y z51sgomAA!TnJPk}c@`*>18481_?QjA0%g<@#JknZD!>aWTzJe2D#U-+_OCks8vUS^ zlFTpV#N{f4P!xT1(X8FZ`JvL!op( z@Br@r%=Q?+x|o;>zuKA)6&?AIj$w9^y%b|!gWOP_U|s_$TR$3PQ~A8zI`Mt|#Ki3O z^iU`gU=M-dN(2}>)JG46Avjv~^>YAleQ-8{-dA3?fXAEZAd@JOp)%UYxMGEE6GO<} zNj7{5uTGHqQUQmsEkX}qzWlntjb6zmwt6b&;4EEQ3}lw8|AEl z;wPlAF;sM{9G7@heLs1`O$D1ou%Y2(KOkQKN#DQT27}4}g*j>irwAc`1RDJsSdVrz z3|YzEpYs5Bs9MQ7cO?j)Khq%W5cTKyCzpsE-^I+(LzZd;e{a442psO>F$43@Ye+~CvZ$g8(!Bk(J0Rq97e~SmSvvnU(d|z zt85nr9!Pkf3X{Y7GAX+eo-nU&?i)N*Z33HEkc^1v5AP3SlszG2WQj+nmJ$5&pDzVa z!9R=`pa<1#{lOFm&<&%%0m>jE z(aYEWMSXvY{NI3}?JtK|4?+D=4gn_mVv4#xzqh9W{%fTCQwS72G?=jlbtr!7TzI~< z=-eq!08}vXad?s)C#On4N(HE#^JLm!r$+O+=t#BB9Y&Ihu20)GgHP`N%O< zv6=U(2lfNNQS$xsS_CNY1XEw1)PN|2A?-^?4Dhej;y-C9a@J6kCjy0n%svG_VsJW@EvHRhJQx3 zovru-mv?vAhS681t~xa@7Tyh5sEMf!qSzxZVg)G)0tv!CvHqQD>Ju z(UwDaA~XFT5d8P;qj&^N0;*`G{!9Qu#BR-qFkFp}M71^yApVsPpJ+?tD~GF4M_B-S zIq(xeE_;HCiYn6|*!|4U4<4;vs4xbTLG5V+WW@i<|L+I^@k=VMf3OiEh=PAV1aArq z>bV$VVCe0j+rgA%K0J15G>oDAOipn$%zw|t2pQY*0gb=cBMR`|(e$pt@eEHCt+~M7 z_~%_9(IPfVx7&gCNsE;@Bx0~aaV1uwvEkzX2a>-_fJ=~>Hk_Q|ZJYRhj(`wAqbq&`;Qgx>RzRfZU$?R+5Gn*v%ct-Jl`u&kCPUNc z`>&LLE-+LK#En^yFFmSjD@Db8(jHIcFU{>2Qx9~&q(PxTTg4v>k5)MwF$Nj`8@r)$ zfE_@f0!t%;G(PLE9ztVelqti=2@|JDtP<(8iDy-XJ`lp2Sf8*Tr(~j?B$7_EErsX`3Slc_Lc#8IOGRK$89Al3>$1`yyi`?n|sT}ggq!*96` z16{6s!7Uv6Gaym7m_bLA;IyO#Cfh{-L2Uap7PE$dj3gVz7Og^TrKwMi!ScVWeH72M zqV)I)LN-D*fbdrDC1uEn74@Uol^1I%yj1^uH1(^my|5Q=ft?!-Z0tXkX)%C-o6&Vh zo^e)v_`a-j^1j+{pipLC4SHtdXaJ0^!I*96KQGKpMkZJxf#XSLeO;1q4pvSu@H`BM z0Ph;ZZaAFdvx3f0wNZ~GIY+8ocj{OyPe^`#)tk4pa5csazbF5DC<6q<%#Y~0?Jx;Y fHGE}24E+g4`LyK-z}kixK=#-A*sik;bNS=)C)Gm`P!mXXm_-Jzy^Ku1UWfR>h?@i7zqBUT1l zTIQ$BtnBQZoSgJb&$yp)a6jhYpLsW|02M7JQHfp;Ea-=y~DZncn7Jwvi6O^)v)< zLfnOCvql*oE}-W9^ay&TN9=<%z-VZ}B~>L&STp!nOv(TdT;jQ8##3o~wH@#?*V@L5 zo1v%Y+dzwEZ#>tt&MJVNT>1M)s7{*p5AD#cNG?MnNQm5 z+!#fgfNyN3WbV<-13og&`_V=!bl9j`?^M zV^TV@2GZGL0$7-11~MZSIDoG^YPS39+JiWgji-iYtEv(50lR%Lo+{edv!>&RgyBFR z)(pp&316kOpDn=85L}Z72gHN_%`D5uA>4Uws*U-eJV0vGd^NS>%J6W{~ z@ijR0l_I3>erEeHns>BOYu8cP5MR5u=q)SW)gLeG*38d4h5%ciTB;08f>qYK=i`+A zD$g%U)7Vokh~E70uhVe)?KEYcHdP*e)%#uup^Gul5nM9Cvz*NGN{n&Q$n ze8GOEPY+=&4x*Fsp7^Z72!Po-Gc`gm?O4} zBlv|WYDM70@TYSM*NxJ--Z_Wxmo2g!MruSW0Pc;edgto$CDr^zciqkA(oVKw|0y%W zaAzq-YgxsD=9oV3GQN1>Twy!&M^E?cY>Xt9tiV#d&BCw*l(6+{+>xGQCu_>Zq>@a2 z&E`4Z4)+?*R}0l-57KS!xEsx~jkTJ4CdxvFmsF)<(JEdOcZq@mr$Q?+$<9;fH7=v2 zzInu~2A0)Hz1OP)Gni@w|3>%wPB?w@Bx49$dvyxUHJ#iR=&ua{;Z}}$nO&I4=r5NQ zJx`pY&O==N8|+v3Ur@s+jh}&0_4-L-6a>8Pb>PV ziA1ub0|2&DGSoo(O6s79xk!sOz%@#%)URf^_{H7WA}iQB>{*^~iZCTuH&Gg6=AunV z;_`^eO0rIHZTFxcwZp;ccZ^x&A}-r@i+ zjITFoFMju#>kEr)c@ZhFy*&`lIDip#QZ2wvq$O?x++oMBB;keQz!-BmBye|Azd=|= zI!KG=S*-np&b_K|_OFxk0Vz^dt=IOlIqmlJbI%QujzbY{ddwvi zPs0hYP{%tLS8YBjzb}HchM*kpZ>0t@3>W$O(SIPZHl;rt(^to^Ck+u|^Rle!&j%md zf8Aw~^f^-EGe(0lPx!E6H|?q#!m&3XDp9+R2-Sw7V9|*m3xwF_}M( zr=mY{05vQA8Npst%u`TSkztm=sD-0UMX+(hOSDW+e?n6CdQPIh*elQQu6kgz`o0K# z$t9JjRr;JytFECwnTGR^Vv|cMIUj=;p&g!QXFBp38;UBA;r#u^UJhg*&%|w>FH>+|d|0a4tcw`MD>j4V^9B6B^^I0F&Er9}CY+rTND^g6t-C z?$dZGZ+2M;{(AtceSNB=}1G4hJe#ZJL zs((L_|BkxrS@&_{DN~A$X7#v=$F6n-)}ON>>?YQ#cJ5qFBXi5t(BNm)zO%5(pwN8C z&F*pi6j%K8sIpOYCLn5LYgL^W&gQLR+S6+u12?iIpY_{iCHM52QU9ZanmxY-m-_4O zjc5nEUODkA*6C?aa#a8Qa;r4Jxgk@xcv(=#+c|2;o;E^X50+D&)NZ6FXo*sM?Tp}{ax+Y z$tkujS^S!?AMK25*4cELTRvZq+xI)mNgW%vn(?daN?!E{dpKHHA(o==e@V3uXyx^w zJGmQ1lsblAF)__gIH$==4fNM4vQpErsGSU>N3_M|Ex6u>ZlHP7JghR`EvO88BS+%OT$k*1DNbBP+P#!+o|GPgwBzuYMr%xV>V78R?ItiR>l;<8Ps#^rkuXnt z+m`E^aCwqi@{d*CRNYW0if%fK3uF6XvSW1Dnbl$=|h z%r`raG85moJRICwunQgjrXZ0&1WExV^y&Gz&u)|Kr^zbtcZnXl32eg^#jCY}%Ef-j z*-`z?(xL{RCpnN%vTnzQVPb=dH_|}o4&qsceJyYLds>K@Q|&yRh+w2p74hWx-sgbt zl}(rwCLc#VIaPRy?)}hvQ=t_r3nM;E6@4=|{cgN1-9LL077LF@h;J6{Vsw3%I%d`H;_v zoIroLx;acE$~&&FMqo`EEx32Q!0|w=*s;3zK;QX$HN&eG>I-|KJnN|fR75n_RBtJ` zbCo{qWO!aAkwlK*YuV=h(rZVK{OSkqCn zTC+*8$!QMO*hxTaq$Rwt;gV`lg($PPVos<>0;Qg>>3?Fh%4`b(#Il%m8PK^R%JYfe zjcQ&auCEPlCO^e(A#xtu+vZhuCFh4QMT%~vJuzrGJxmP!$nf`tZ`Qekrko%}X)X!g7jeQh^LJwU87Xea zzj|6U#qDCEsbl^{nSX2~09PY_*8J3Y`Jpl5C-Bub0ZMh9|6LIXx?&?Ck_3DZ;aU^|8A!*?f^}fgIcnv%l`Xwxaeq9X8 z7j!$>QZh>D{wc&}T2qfO4QYS{?|huZSHyz6J`2~K94{wzC(Vb(1i&`#Gac*;nhl|K zZN7V*tn5fVwIsIkRG{YL{Y0EEskEE2v#}WE{Kn?Fyu+MRq*FyDTq0?b-jAKgcnIA@eP8bR@HFi;hi82J$Ve$v5m9bMI@U>G%9;xUCQ_LC~+vyWC#3 zB|JI72JP2Ck66V^(RgOZ238?h>pSL?mSf5aoXw9VAzmq^*n35m7y;CFfQXK-ugnM* znAe}M%5-I-^%S&xCK;%raRB*wZi+e2CTM*nFOBh4KqK3~4=z>Af#qpD|TZ+Ug3=I9u>K zo4ON$@`ek(Qy3c?I}KCA?rGSD*>;}eMrPTJEL=(#&JVb{2(wy3VUvzaTl$TO#Ff8` z@MUSIbq^F^VfA}l!|d_r;p8x{Jyh5Dy^FiED&&fbOp8mZKWfiwLSf{T!LX$FNy}#C zOK;SO#F^FeTX_ncr}vgFmRADZ^Rod+r(yiB^$ATy_s=8k`$~pMC99_S5~$gs`Y;>% zt@3s>xds&?6{bf(^!W!z>9rKB33MS)dfp+dXS!P8TAzoPR26&|msHK&pUW<(;`bQJ zRy5nr#^X8ZSN{rSM|c!8qg0hr&en&mHrGR*of~!RH)!M&0U&wgr`1a;6Sv(~Yw{V+ zIf6K>-hNY5PA#zGwq=mBdnPZ`Ns6a^96Jaw6ULeTM&N%D0N>Ox)GEGCd7mc$9DuN>d zm@A+4{it^4R0({ElHIvz%FmdU;n^^b)+UE-7f-z2pGl^_q%v;EfiCMXUsB!S(7j*` z?Jb`Q4J$S*=h+H_o^aXXlx{Gc*zN(@3Ux^gL0jlVLYIuZg-JiY9)-Q6dK-s0R?=BZ zkppKb{BW;Aa0Koyt5qhBsYO-O3KE$!#Z(tgFT_ z!eyZaqgz20QBS8s|q_Z$`Nj!zrvoNxx-nhHTD3qSeTubx4 z!<{zSuCp$-V_qi0CFW~hZy$3wWJ#M+UXB0X^D&>^0F31&N)!tmsHb#>`;9DpfKHv<^D=D4oIJVu+`K#%?@@Z!0F(Us;0j?W=l{n zr(gcjnl(~Ndi#v!xO-4W1^aikltSSi>T2*t>A}T&Uo~5?v)^+92MSTlg3nr8XYxc# zPr79V)Dn^&Xt26R6#HB}zTdR3fc8OAVT6zuo3|Jb5KA}@Cw@`pEcm`pLH7lr?vm>M zO_FJwCDJHx{JYEf8h!yZpU)qkbK;NnKf0X#O_k?!X7tBYz_yF9k~WQ_n%=d%JuMY-Z@BE+Y<=k z3342P@&Bq+URE~>Pz6W{$}pt-94yI3%6p(8_iPUyH+*Z);;bXqhSa2C$nO@7cC)*} zQdjHunSL>(%)oO%vWKjOJK<*G>T~vwWG$Q(s5FSH*FTPXQfzDZI$Mzk>)qDXfV}ITCW}cP9Diuql_Fo= z@T+6Att(_*Hl%CbT`K{o?OLoRnhgKhA?oJT1QuAp{pnMznk_I2=lwQHrftj#O^phj zKYMWk{|gI|N=3h!pOcyx)4UM4q)Iq(&}~1bU1P-i_kH4;O2Nt}n+8|)3z0Q8GUIE1 zc;P^4I-JXA@DILZ-NjQ=$U$P*!Wj!dhoTn?;}tt*zojF9g|h1X{mVyL*&g2j0D#;} z=8t-MIvoD{o)WZ-=cyDINe}LEP^ZM7*uJ0snCY{#voZ6x3Syhkj)?(ow;ae+rc?B1 z?x-7C3x6eni$zLZQmHBWVC3{shWD@>>!WO!RLeqQXOEfAy%gEyM{1L|YwgYs-wHW9 ziv^rBO{6bZ7OIRi$+AfwNC}LGn+x*|EX^FcOolSBo(+DI0)2~^>68GT=42YWr}8de zI7-S&Ou(6|esOB-p{>>)Jtu?SeM(wQiGkj_xa{LF_8i;8CcFALFPwS1pRC z#F4rcE3h1*WtKW?blp!-D$s<_w$;*af)BDI;$N-UqURPXtC>+cO0Rz?_sch11G zi#QVz8MtVb#4UOykgc zPQNY&(lurrXVIu`EgGaSfID9-Bq{{zRG5m#tZFHD4EQkQAa1U;eJ@_`M@yTFOuGFl zhI}}{w>cs+4d3}4vB#Sg)UuSPR}{e**3|n@+-cE@`!%_{nd7=JrzYv)sm3`OAPd?u z>pZF;Y@l6rrdu~|BhJ(E&TS{h>mwgq|5l^azf+!0=F2~A%sBHXG@CM*W-~2I;rUe4 z-9yHbd{j*KB3G8S49DGkLU{8VwKB4iratw;#{~gjPK4)i6;2mI=MP4`eO8qeWr@8U z1)0vP*7xMf(---hbZPdLw*C^S4&eq_az3L7wj^xwgm0dh{nREct9aoo-e(2zFR>#p zNCUwqDtUU=VO3Ax**&6rT(MzS={y!>P>dd(PnyRiZY(=Vn@cNMNEB5i{w(i~zqXsn znot_#;c-U^BMQTtSklx)51|B;*Lap_$~C*94m=Zc8xN`}Y? zyEp^q>78uo!8xd5GYZN?;0@hY{y`zPpV zO*uh5@Tv3bE&%*xhDC-3&_y;QtW2!F_NuEXDQbvM7QieoZ;CIj1uBj?ZC_H+jc4yw z*!y7#-Du^=pk`DGhGfXzOi%gU5tm+iz0 zR4X=s!#!$a1EX^Xc@aA`j6%L%wj>D4r-zEo1jg}<9Qj3Wtn@mko}!h8ih-4`p^nQJ zDN@r9KGp%q>O(|VsE;V@#a8!4Dg0J}E&+7dD!OneSh)}9E`=RV?KVl2t!C_FvB>ag zxvAG^Sy?_@Qn#2R*N9;Yo;}}1VO5M8m9*Hvbbp4v9A=7?&ne1c)1CJdk-emf;s4?L zXn(z|D^U-1>vMcJi_(|%v?Yy~-WwX}dzibg`@^w1owhlKAd4Lhns?Z{DQ@L&<%ce* zd{Ni{&gWA*pBZNKvRNCj_*Gny_5uOrW$Na$hDY-)$dMvpX`Z~2oB=1Z>?aUJfaMw^ zo1lJC7JJ7Goh1&xW3FOKFw-wJsK*y8l1Mda7ZXc7unFW^%?zEAl)Q6F6aRO`5j~Ae zbjcc7-l%^p5e=q-uTFH>t;D|88z?cVU6a*Rw=Y z?Wb=6?1oEp&4sDr_gCqE)^RwDl{bu5Hy&};K^L-BIKhrSy3>(tV@+nchO0jE!8?1& zrYg_t{3EqY4&y5$Ch(%Zj(-z=G4`X6JmcHWM^$WU3Dpfpzr;2iX4Q$vQ*57(gyv|n z<9wEV(oRmx2!2f`^F(ftgS~5bn1DDx0EySB6C9D-=S&as>I$1zC4lQMN(u-HQSP&haeT<) zAtiR7DW`@%J=Wg%JV|fZ1A{V1xAiT15s*Niv&Y$HroBG<0Q<$=cu9v9u$Q_u4^L0K zp@GMcuF~pKxb7Hw8aL%V&0yu+m z47hWotXK)Gv4;*`E^sHM8pGT(UwC-phPd1g2p6z}Y+!X+i&kntf#BK+{W zrg-qAA4z3WTptA)EO|T$mOROft0`&hqdApkks<~aLW^rzjO})wt^YaxtNv|wE4;DN?r8Orb~AK5|pW~jy`6~B}JYkYZNn8Afk+3P+o zE+JZCpjPk?1Idg@rnimiaGQ7jinj*M4}BHSmzPg1X<&k(voFJd zzJdiobRUl{sZJ$qwYzQOYN;S0<&O%lu#;TM=LbYo)mF~Ku@RWpah=(8}lN8=_RWJJ`JdWP}kTs+Il4_2U zHaIeEJ&%cO;|FyS1Jemn3FOcB)k2zOTfn0^Vf3Mla+z`D?7S&KY2ST)KsJ3Yjg~FW z_89(E=UC#T2!0zO>HXtmx_mK+^Q9z0H*!rqe_BCcuJ!(jB9stR_bW_dI*_TTcjL;bO}?OG2;uj85Y0a$CMc{&BLM- z0O*X^Zkekqu+y;`|FSO8tx0im{(q@-Ox`vQk1C1ibU5BdixjNf|d z<;34xCxp!UJ1E;zee0?D4Xh_I6LMhZH#!K!QY)2cD_d&61e& zRz@-xTr(q=Qgmp^Ge<=;$?V$@%dG62IE7Oy7~R0IYEsf3S>UTI;jqv9Go70nxx-mb zlT%YI<%x0yM`@c}dc{PGL9=?%m#Yf;LPnvBP6lva&mD(LDo1%=TI8e29f>n!Ju4nx zJfq6)xjPt<3$tums8IT5Nj-`|1b`4|&;t?M0`OM?!FMn&B| z4zc7VpB000T`<~oJw^9M%;OEQV^hrRhwpq*&sNj@6W1is{p>jO^o<=x z3W>-ZACA?aIIyDn*Iu|t4TgpA+M>I@?v%I0egZFH0GGB!->$Pe%nRfla7f0Vu`&n> z+iT^Ps+yPuM+1b_V@}D`M@itV_b3+IBml8V&d&HFS23op8dBB2D4N^v`FtqgGv>NB zxah(2L&iat(iXj?=!W$87dFCn1A-(SLCfv|d?|7jLncnV&U6>~)gE?*HB$)TDdz1N zRhQzSadkbyJ3yc04uQw}Ru9+PB8ID~4fkM%S%#)Q&u1lUNb>>P5~Jwk#;J^_qhJrQ zTaA8^3?Kt$Xjy`h$;L#XaG|FxoLtzz{S27o;up~AqZOvz%| zK006t6W>x)fZ(QN9QqJZ&u(}e0t&l|!Q9K(I~Dwfsx9aGv_6KML7Bqf>EdHzt6@!_ zMozs)1@}fbrQ(X%S2kDUC57}tspr=Py7C3Z&VTMbY_3e@McuaN>wO&Jq>5x2%pB0) zO&_S!UXjDV9lcuH<<3|Vv(4oE9Q%nbD`R-Exe5IoK~)a+z--xV0wr%f4-;!+e^@|# zp6&l)BFlL&#tD+b8s$unv$`4Dx#G57JICij`t0Nbf&V;RKdd4bzRNDAxM)SKb@3K$ zBHP49eY;JD!7hT1rc@4$tnU$s{v9uZ*d zVc`hnH>%cxcM8^j;(E^S5of+1m)Fm>Gdo^eUYi|8pP8tr7+%Ec z&i9a8GRr@5gl||`2aiu}S;t7czxdN|LwwiNpFGv6^Q4qnPRLY@GbCPNwc!X5a*x>Z zpN6t?I}D0sm|*H*A?X*v=yMKu=f4Xn{a2w$inRyJeeeP3d4Vo2MFlZ>RIwZ)V|7zE zH^}IRmDHhvzb*Cr*`d*ilnT*-*@MOe|D&{U0Vf}UD><%cY%1-gYs`Juub20T`XP4OQ^lTFh+0(SOryGIZ3j=>TBs>a)gFvvLk16++hu1J@fY!wfjM6L zr%A;v$`E${=Z=kSsTYFD&=Vz<=%?!j5S+E{e0TQVbTIRtm@_5I(6S7pw$8dMe-28K zKFf$xJggGK85o^Lg)wUUk5acrNTqjE1AR10M+^jC1ZC)+#Sc!GUO!jc8|3M#bp^&+ z{q?J0F>tG3EfmR+B-Fib`( z-xx+g%w~I^K0alHoFyt`5f#&Doasg-wOj$&viji|DKH4qo>sjQeEPf7M9M;&nBfnJ zu{+9-Z#zh{^G$KJFirkhvPhh-muYX>wEkK|(A&{qH6>^s2C>3+97@fO@oR}v|2z#j z>mSXiSq8F|7uxb%Lqq~p_SdXhHl&I;nGg}{2XVE2Q=VNt9n3PVThTx|Ho~&0@WYAr zxjvH34%V6g-`r(aF{_*ID+P@cR+8TQv%MNLRZ47U{#jWJNC6q)Bk^Td3b<@eIZMM* zf``}MT6AfO^bqEYMv>nenoT7-=Ijkniw6>)75b9Jxs#iB0Twd`c**ES)<{*EM~>=P zAI%a+vVc-CDw$Qg0AA6knv+NGVFjHfn3T}+rA&~BHdXmB0Ag$eKs>~iwte%=elg{*ua#tLSn7`M}P$}Uf& zQph|MEUtE9;r>Gd_F16)kMREd>Cjo0*?wkRTGQ5qyB9iUxz}nX_>#)mS}C-@7&W?+ zT)MfXyAq^L!SP!dp~&$F!(kPY9vbiu@8DMd@G4Yl#gg!wGlPTw2glw2rcPz>|G=@V zE%n^!xR9peB-H$D0z^CqxrQ-PvUV;1K{G7O^|v0(#YlYCFh}#-PeQF`>@WUp?jM?q z|94xhO8UP!)B9gE{GXipZ3{o{2zK)pI5RP2-FHrKoz%1XFX{y{VOnb_EcW~Me^{*i z|7k{%KrwTWZW>5(Y8NGDoc%voF1T~U)a!fA@4obpjIH(EX><;&{-;+g6qR$|DF3$_ zc(nZ6NCKJg|B#gbb~CocWrG>Zs{bW!|GU?llo8gKA`+g~Q$}XiK{v-aOary^Z#kj# zDI}bN@+yjQiQ#<05EKE_TTh{LU&Q}k+T};luC|CqlQtPwaHw#*(U)~qW5a5z!wF^o zQJ-zwq2|)x>Xnm35tZBPgbc{B6lXN&Z{gPXzlEFfpx%?u-B<8ou74hVsF^)*R$=_- zG4%dNnS9+H-{<=IR46;Lu3Hvkx+_rdAW6c8>CnJmY4eI36qOr{Qi>vK#pF>Qhc|3i zz|D2TlJ6&LHW@F~Kdoxvte>qLO*-bRSfkGl5FGjT=z&ks`As+|K6=e7@8^1(ekxa1 zWs^q9V9d(*F7HXF`daFR9@1+sUv-kyec@hVlI?>ByaVoTEgcU4`xdGN5}xDr+z=y! zWopnoVrPG%$-BI%zmG|c&<<%tHKwR^wBiirdiy?i?CJv+cy}ks($7Ys#n{D~5ct!$ z^TBe3Csi>LQ- zBF{v;GmcKcs$tUzdXIkZZPyXf^tM=ic>QC~TpfgG;=DIfdaj;cwE(I;-uv7?IPOE2 zu@Xk2(l;Cp4Pr)@C=q;^9d?)6uv+H8)=4 z@86Mo3P0wEru>YTLO{Z4RHYte48FOfq8|d)Jnh|+l@Y3FMl;MQA`q;T zh<=1Zb=k^1p*zaav#Z2eZEVTC%lMwTUqEIJk~2!$DwhS5BF#}7Y&*Cc-B_-5)U(!un~|onOj~C;mzP$_QQc*4@;4a>7MbrO)05I z&pzpmhQIB^f-DuIfF$2Cg?iSqJpJ7_Xs8gznD*toci}kJh*7i%1eX#8B4a8K>)+rC zTXTCE=Z%_5+;|KVdBb0ggm%3p5|RTH-~32ksN$*Mo=$ly)dyz9xS5tTVp#{5X*v=2 z3Q3X^l=l3bK!6CnxHbQeAoBr6OtS4~QR5W|(sf_Do}t1xuZDriZJsnhjD1^Z`t7g!JleY9cnj>v>{UKuZeHkmo;YYsnN1F@vq6553v)`xrYT|L$r(0q9Dvd*IZFHHF%dia9ucB~B7TXQ ze+h0#^x;&F&>_V|Sd1OV$BL z6RR3;Vqqm}&enOQk6KD|5;xQNbs2X$8d@Am+p)sC_Gql&UG1FtADJm`Z*r%Sdgr2+ZrVkWZE*ENBJ!#D%h#0?&0RsIt2gc43- z$wjaHKGtq@gZ@*#^|8))?Y*m=6*4gMUmx4;R`>n7Vaaj!rh^5xKiy0~k|SGh%>LD} z(%VJbzvAUq?0}-Y@ay5#{0k!GX31Uu^pPR|EDG}clfqO(rSnv$t*sU`)0_rMKza(r#&!CVlqkQlVqMLI#Fjku?KE1PVze2YH_I_SlN*mX9@ld_sT^ck2lbX3if!$|G@DMK!-v{D z^onxEET=W(rUy#%gdw|TZ@f;OK-9P*{pC+@eWS8v1QS65_TSQqEX5UT=`mK&cbWeA ziSf;3hwi(pd-n1K6w?=;8v{#*MeE~ell{zoCBu&z6{7-t>$)uzy&Ei-7|XASjhTH~ z69%!O?{p?O84%VFRC@U^p^xL8il)xe!1Z+yv)r3=aFuI+50g?)GTtHvfj*=ulNNu8 zKgOd6b{#)%W-p6ZsAK4MlhaFC`r-cl8s*PlG{c7aW`YXG!gZFP?OFL$)_vq**o*L` zutdzkL_Eh*^Oo(OCx6Ez+L?KIEE(zw{PbttGO3pnSaeA)|ZUzXTvAeGYe<#^(3snVmth$;LPDPAw!mQ=UM)tn63Tr6EzBKlAsQ zUwHZ`pz>nFeRt|9352I|kW$t^Qy+6@nXInhTRosCLsw-dWYR|i4jBdS%7(X#>(Ww% zQ>gmG@$}jP{fwGVjs#B!CHrZ4Cw$T2i=%P?CD5DOh^3@QJh+m{YM~fpt&6+eQ2nHtGFF zS&%TsEN9rKw=^;H+w5x~u$xaeO-GL zxx%_sY_HKGrytTr+yphosj#LNd&A|11yrxgx5rH&>a~X!aEDP&@<(>-Hh{@Y7 z84D@MW=&VGrE(oYM*`T*!PU;+3+R{h#@4RX>y(*EI~i;(E}H5OOAx$dTO(uov34X93&0d4dEE^!?tp#LiRqnlXW!jfICq2y0;?^oMihNQ)Q zdN1eFfg%lboLP_}!l=3b6W5aBz|A=SCK0*v%Bf%+g5%*K+c&jtiLlSQv+>k;5?Xr2)svDT#MNcc&yBG z!ul>(P6@jSQ@%a7I6b}@YJeu>cri=?qZa*M$Nm*37)J(l=O$(@zQIW-%Du!7RLfN< z(nfrS+EAerZ@%4Yi@1S!b|s;5cwbw;9@~0N^bZA(L=UOS4!D0eu*^m~zv|By{`hr9 zhPq9yMit|BrpkhO0etlPINio4`jdsH>Dt{ypJ)eu{Q=ro<^+6qro2%R_8wPg6h4?OQ9ZatJA#89&cQn$ zg8{}7ikVg%j=2qKu9Rr$at~RO$==H}X?uCwk^Po~55egDL{(w(LC=(rc#Nbc7es$e zbf@<2#Amn!UeOi_Y%QgmJUz?zI_y_Oew31L2DCwuFzBib%bI?tIxYdJV{DcXSL(8t zV3uH;Pr9Wm2yAxj$7UR0Ci}z;UE77w&&Fs2f_GhsuCJE{-C;cUL%`92t8EK~jM75N zp|xrbGx-)$1IwDbNzZ1MX^B5>l1oNI7S%z+$x1G)(*@@9HnAExp4V+0V-{VBxJUM> zUaS3n@e*9c6|TKZ+*1h3_m<(BA~-rZx48nB?+>i; zezxHVV%_VxUaAmzM_fL0_(Q4XAguXAhmB7WJ_=R;s{LM!vO{qlR%RYjf=r3~!^XuB zoz|yr%S$|99WEXP0G9807*}c^N{Qcyu=aT}C%S|7@W_d22Ucg=hsR*x!zW$InY#|o zqp4j^eI`V<#dl6q^T8)bwO7qv|AbZxluoy(?HIt{ieV z(Yy2!#I>i}w7~0gPbbmgag0=vYqx&|bGBB1C=MMtQuW)OiE_y> zKhlhZd?S+bt)*s$%;V#pPSY|gsHp*m{mjn8oMq7+vrl%>?hSV3&^tU_*U+qC#-pW{ zCc?t*@{w&lqou;C=6&B0Ki<@%g?F!aGB4s30zB8&q{g^v;KHYI1T4;8$7|O_5v$nX z6=qs8;M}UeG14A8Sdc)II#PIo4^VhsSh6Rdg6zdL4f@E3^ytOMJ&_$;uB3dwprZxn zZT>RCbC!5z_+7JuLzM za@kybDfcLUAYt)t=EIIBhFNC=41#w(d#P4@3y+Kc+=hVhLsqd zZNIqqw-*nKqrOUL?xy(@-fb;59HpceNYy17RW zYC|UD)SVTDQ$Nk|7yKbk#BO;w^n0}BLRZ$8+cM=ybyxq)G+^D9=Bm9fmRsKMyC8ZN z`jgtgiZ4!`1W}6r`LY>k8*<{#!T*x^F_{|e?cg@rxFv<&PYyo2SDT?&FZoKqYxJGx z!0i<99*J>4A3jV@`$O}gu~%e$-q^3LQ{H+5voMZ=tN^m=Ou43oooF^P)`P}jTv2S1${L{_}M=BF*s2NKB9dvg`mX##?D`rkOpNQL3tPABLoE6Aq zBp>esvE^uPEXW6q4@PbsW_mY62_Kti7xWF2fCF~h-_*gl+^A1U?mw*LatNaKc@Az} z)wxz z4ZAkJyJhX#j;`&di8?S(cXq=d;zax>L79Xv6?h-B1J=Dc9)teBJ2s!dOC0~2U-+uU z^{2GW_TqVj9JuZ)3QDiXz{7Cg<%6(@IeO5OEIwn7Q(y}CbfA`1%ZhOZ8kp(XN2h1b z>WK1BZSb%PYhDvxw_<1_SI!;WLAlTWyjv6n2NMpz~)N1~~ zbj7yxZe7IlH}%+8fl~v5^XwVCvBm}=0bg<-xeSrO1$JnNd0q@4=*{9w9wzEPU&Pgz zS(16oKI_D7-H&*@nX`Dz?B?8V`x)XPX3H)=jnrtShb1pre?r{M>QsmUFLw`AKy9m& z+}L7+nx`{e+6*f<%!f^D#l5Ej5+Z}>os<{9MWXdut;^jZ;=0ZF&!#M0^IFdmD2Zdh zR(rzZik`no>2?3IG+>Ja(Z6%)b9m-M;Y3BBsTRKvfte)%~$`O*PL+8 z8A}esw^YS@w3KdDMww%a4A?Adp$S5t=HdZ+qKRgf^Wx9C4xOU2B#=5ajQ8)BvKY-a zqTV;|eifz${g^2t=}{)x7w6P@gFemb(2P{=&9WaKVrEk`))0neW|q6Q5J9%AC_X}M z&zCRh#pVs(tz3|B6Me6#`k&n%hJf#yB!ED#hO$35o3FxOC@v+zGLxtTl)Gm#U(zF? zLVZ`qbmnNbw9+DQzpyfde>NTzil5!bFU|#XB(8p0Botp<;MoD#R8@hnr|7?v0ztXAdQ` zncg?q6v!K7oX{koGQJj$cSU@6N24iK?_4CH$)(aLBda1!`H&U1a-tWH+egZ z^AACJyJ8-mt7^`>i!pMco6EZWF94e>px>@pOIrFzIpfhB| z_2m)`yGX2Y9;w{*%2T_P4FMNpc4Raa7kq4~i@Yn$t+RK1&5pO#`c+TMm@9SZ09 z$a6QLctnlXW~_SVkZ&HFeWat+(Js)Hbvx!X-LsARZdDRc!B6mA797GhvkT|C(P>}# z&SXiPw^LLU2`OOuUo^dSTwBl6HcW*Iw51gH7A@{>Z7IPC1ou*$;BJ8yiW4YaybxRq z1h)dktw6Bg4uRkr2z~SY-S6{9K1nuv&TjVX%Bx5v7eSRZ|=F3R{J*Ofj1E`|H6C4%1$ z74mEzgcZd8t`s1d$H*;Oxk=MaF|a@Hhcmvu_Qn?OdgB!Bgd=jV;4N(}RWRVzNI z7JGy=_YC0XIsojEqq>d;m`qUSXX zdp~5Q!!kgljgqMNKW9=-yG7bRl2Gc=+I?Y`tlZ}atVk^T4wg`%}+e#KiHZ+C~B!YGwP{Ze=z|~ zZU(m@jSE)~l>`Hq|4!Em6}XnpYNhxVe{kPCQV_amkD^8KR{b5fcD(E{%O* z95?sYk8IQ*;s-m~M<-y>8E4Xjwx#~4B{SX47>UTh4Y&5cJFr1LEY#v>`AuAR@sQ>A zs~X7V#`qaaLmm%(QQX=n%xqLUW2|+@$dBjmE-!2ntta&lk1c2E(~U~u0T7EFfz{f3 z=fu09CBbd1OR!+a$!_0cV`!Ut*SCERbhsGT`H8GK?6;R@>}*#iMM5w@|A;#WkQ?{= z)TZI>rhAQqL4LrV;i8;F@uYK(6jui6qVtx$#T@`b1pKZG+kQ|^s{A0dNSem>?7yGW?-EyR}V3qAPh+Gd8P<~L2 z#nBPS5%pJ*^=?{uH{3kE3!irV6}2lx4vjl6&ru0Fzlsy&1^>PV>FU+Mn#n2rJAUQt z*wi(&6#nc(eg5IybI`&42hKY8IkaxWQ{M~TGj;+!fsl;4ssr33glKZpNAEqfNQtyte<;mm zHh=toU8>_gV7L_yI+_a>naRj3`cN+=8H1_xd!B)b=)L+pT6nNVjP@|w_=guLH@sYY zZK`emcJpt=9Sxs0Oy`4>HaM_brZn}b;njOuta}JbnrBPGW4G(Ldxys74|eN2+L(n? zY*spU;#OgdnuuV@Y%ZW|o11!E?UH@bv{QbLx!X^n?Al^=CouP^g!O`2XNQDJ5Hy8cG>)|?^M|SACS3M3rl8!)Qi2_EJ%KZ&iYDpiz}VDa z^cxIAD#l^e#4JphPS|V$rk>UFc=keIn0(;WgnzAx&d;$bcM9k!e|!a_#+WP!R1d;S za>_k+981(Sasbs#W4lug9|TSntOrX>jEO|@M10&8$Isbs({D_(LKpVDTnbLuG=T$$ zz|=MWhMmuw9y8gpM?wGa+)w?Vo1UsnZwHy177#?j7sb~(dl+htD&iMm_SBqmyF{_U*pGhLxVC>IHj?>Z?WYp%IFUR7nMIKq}5TnuK`0qxm?(>ihV zTKj0Z#N_o0U*B!t)<$3)1vXa}*P7Wsystu6?h|yamq;*K@zf0%ge4xnm`-0{ZMWS& zdHi=a?#QAEEn3OFxp|7~-o99-=g#BEGc~r&W^U)4WT8cSp&c(z(CIgU%bQeL3rP>5 ze|RbcMH9!;dvOU<)@gqAGD+EzJk0Ik9Xc6;rj6V8BHZb5`=So>^{= z+1K;}ngK1dKL;J1IXe)NpLXfN6T1O7?w~zQ$L1*$1vtwucgM-*@tK{jRYFx9DgaopVx2jQt>ANDT{#uxTpfB|T7jda2 zv&+So<&`!6@Je!aOy*2jC;or^QnYSCv~BhW?y)0VB^ybfEVJ`Jd2>btRJ&XGR?8ch zY~vJN7}!WpJwgQJXx$rzO@&XB&@Re z3p^892VgW(k2$N3*f0!gy%XuXI=3nT2|1_baVoM3aYw+kRCqwkhv|zf@dhjJxP2Q8 zWftes$XXZL-yf&S5X;P_WJ=d;=P_}r6c@J&X{mK90TqNQ*K+>9nlHUbuuqb+_Wt30 zY59kDAJ-?n{`T8%4zP8dh>JFV`Zo^$X}z~y-Jl`2U(NHYXC&BXv4e+B+g9GG*pL6| z;eMpnjYGKA}3qB`l}DH`9;3aCTS=~ndiJ%T9~18EixG@44ZW=ce_ zqL85@6@&YQ2>!|833#y{s4TtORIyEdFH9k|h@_nI+4a91+9 zf;~Y?`4SRZEleiPjgc ze|SH_f5YbC+Y26j^2`Bye^83rreWnX$k2E?(t`IV|mh#ii{psU$D+xrwc=fcCOvN z@w{$Lwh5`B2~x)Vkj~Is2xM@+Xni)tz@xC|+4cfi{5cuB&yX>Ti~O2sJd@W^Qcfw; zqL(bTxfHZTXEELO0^ghEUZ?s$OdWx7-VvVm zRM=#kzq+)*4)9C}rB(J6U7}ndx+x|! zVgce!WRFP|EYKs6{AoB{`8u%2ZU?Mt6sT3ctlM>1>aqH)!^W5nEc-E&SH&4jcoUZG zE}3aFJE3^AjZ}NJF^`S?v5(rn6%ls3sC~9woe4V>n#gomU)PXw>ch%vH{0FBpH%68AM-$QlE88>^EUmQsV&qz1&Ll|$%V zv;2TKbv9Et!&{K~=4NiP;Y^{Y&U#(P4nZ!_l6kiQA)=N!{AxRKGrXB&cTSX`g1t)b zwg#C1yY?Xj_FAsVOVw6DndSn3J9shE5;cb*tyKyrGj7Qk^9AKTVeKFvn}w+?nF_71 zCni9CPIZi}Kw&?Bw!{sgrJosD$#R>WetYOJlRG1@vQ9mZrTdjOIhreshh>p zpaQ>AyPjCV)Md=hG85;iBi&2ytg9z*{*pLOi!SQth0BSyevYDQ=CX#k}`91AsJ z&y#G&i^xVeJSNQIXJahTR}>o2N8(oHZns)Z<#zIJ;?*@{29|KHpY5d*`~^A1!{77T z`+CwiW;V=7Qfc&ksVp3cY<};4h>-&ElHqTN#$>8{aFdwGG9JTCC*ApvQa2QM>jYwp z&((a83P@GQovXC9#8XzGnMC%?Wkywgn7j`;R6<5|U=FwTr+Kr_Zg&&Gk&7$D@IHB_ z(D`EQh;`zj&EON8#Ur-QCYF-XXhpy?lEoXdc<~F-t7q4rdO$Bs>}9*;kAF1@l%^(J z{>YkQIiL9*moVv^nQ>XmE$R0X6H$=C>Gr)TWT*Cud{NxybCiJfQ#W~|H}ICu=&Qcd z@7Um@r8euF75$jnw+Q^To7SHIvpGhAAX~WAC3J1lc!;d~hAC$*(rJQ)&eop*N%!8i z$@fi8bBsXaiSVYk?30v8Eq~tq@0VAfwp&V<7#crptxLOJ;W-JLb!l7?*KA)820b9< z)b11CJ`%Cj9;>>E?s@%@ec>OTIPiiHK-OyW_=?J%K}eLB&#+%1D0caGOh=8*&>?Y} z?{}oh+G;CSb2wPQ62)_pf7zCg7Bn=PZVJ^?$tViDt==+sPjG%UNcHbS2dg{kR+sOukI7;6qeD@&feYcQz3J&Szaw@29*dp5SPFcT~*aCUz3;>`-p z$fJq7Z&gKx$;y1o17g5zQwA;(e8ySS*D$O_Jk}2M_ ziJ(jRjt^(%HU#n4eV__YO&rF$KCI{1Hz+|?b5)&iQV5)G0u8N5R?E2DM{{sNuD4HQ zRSk`&6k_}L^|qJ2lCPUB#{Ej#RTLu!vlrqtoXj;H+BnKm6j}6~bI{5NGTRxZ zo_TDSsiIp12CJ`?Q=Cj502d0IZr!ZU9P@UKX*^A#)ZU~AV7b}~iQ3UC_AT0Gk*3oV z89j#&WVXs8Ey9zw_PgMvyAn){-3_rM)5UAM`Q_gHz*v{`3mT24ki8^qU-ug9_r-do zbo$Mc*bztwmu32Sgp;g;`Adu0_TTfD6#HrH-S9F>r*kAgbYPGbNY-E6w_tX!;XrPM zaU*OCpkeZ^?;N}$*-iii%0oC$}AcJsec{SiR%h z>dk$=rW+g+!KXoNsA&MR4nk>`ZdSp7Q94&KD`~36Ch*-2L{XIWvg$8_f(*^>^F`AaN3j)6u?n*f z<@fen^pbDr_Khuft?Mtk|J)H;E+I%wPHo!{KS;Z>V%jHC$$V_ryC5!U#o42zi zv~$arP0Y9<>KjTtk^!{AnKa?M~~qTc&=pLu6> zMXq+)Q=lTP2CB?WWKzwW&WUZ$ zxXH~3_iIGt`io?rj*vMugj!ww&RpTK+%M@U)vXa+cW-;`#1d))KSIJ^ty%NDnmFemMb@OBAsJ}{uq!gBX&itpre;7 zMo(_Y6(9iC`CB{EE&CNiQWt_LhE?a^l?un!RMWt10gKo9sE(Re_Gzk6CkT!PuLbb4m#l-n}sTwb$5zbT>tBA7KaNk<>mHO_h_~=^8 z3%3iZCkw5;yCk+h^6RVgSSj>otx8nf&xh6LIx6W{{uT_oH6>um*0eTjZl2Uu-|Pbh zdwk>fjDgTel?b~Mt3Mx~)nc*w8D%y_^5L<62p3mv=& zP1e_#;AL01_CrwxYL3Ze&D9)(ZshZvRx&mDBjaj=Jn|7Uik74HV2U%LHi4}>lzzbn zn)Ks9C4U1U_{~7^dy|@Jsj7T+rj+Eu+pr}iQ{!@8F*%$sAob5}ir#bICf|BMOQo?r zvTg)B+%jd8$rI_rvM;nV>Stf8kBY%#IVvimb)V)ZKhWDZP&O9 zQnsf>M+E#-W>0$Ag?j4vN4(-n%A_*Vh`+*{F6q*$i*{a`rA00!BmqM_<1(8_sv{<`HIiq;@=J@ZpW>TXTbm+qi zr~We|i+xu9xFq1Hu$gKm3)oq=E>v1eM;q%qZy?s`i8<%b>6QlK``7{%D#UP06ikx?E&Br>5 z7dwCJCaxlNi|k4k7C#I$!AqvXXqH7+YsUuG`>|0JQ+oP;Zh=>dwwM`8dven9sxvS| zRyjl`P$!6h+gN*hM79x!e~VoV`G+?gtv=M+Z8-UJDsB+Mdn8Q%ym^AIgV=D74^d&_ z=MDpY{wDZsa!8%1^M-2mmkoklx1qJf$`D0i#*~R(mGGo3SyjW}ye7QI{5=c>8Zj_6 zcFFeExXj|o0J2b05AN|Yz@zh0fyz<4+NQ306b_dy-->f3kl)r!;7l4Cl0g%8kQw(K zON<=di-X(q#V{`}@&Jq2aTK)75Z~&Y2S|3)d`4n~*X3Zj|}7@T#y>9&O`UggcNZWuVtR-63HUT3omU{*`r zd>3n~n7tjZK-8+U=@D;?9(f@0W&ORt@o}Rv+J5YhD572+2Mc_-OGN$R`*N;&qd3n%OH9-3j3$Q~0{3oJ0Q}^f zbKM7tl)j(f+6+o>=8|0)ha-AY`f5*@9Ku-1QeDZ}2=`-6mvKzVRH<`uzw1?ga_6)U z4Bglk9*QvvGO!)9x5`IfM8u9?G2ZCK17H{N+`tl=1vJyj4>V3ewd*lF zRCTh(fGqvST8)uzLAI1kAlOc{LVaM@4^Jy6lU7f5WJk#(Rnk-g5i@4i)YqTg%P~we zdb|TP@0{=DqsxHh1EDF>z8OB2XsflY8ytz+>y9%)(EN+YCtY%OR;>>YEv>HlKfOFP z{(X>`e4%(>0P;H%J7H0W{oF_y?=xt5Bv8Qk`SYJJ2Bc8Sj;f(R%#UApfB!_Z><9>0 zz1(JiTm0^%0_IXB{)mYWc4;3MEmpV}pJ4GM1u5-Hnbf~v*~yGqRQZe}D5p}qeO!U~ z{JDQPCYC?YidHJ$dg?>I^~YY-7{yG*h{Jo55ep*U$GH*jvhF$)?x}5bir>J3etl6t z`IPmiR|QQ*8Dt5!;j_-4_B}Q2&UG$8BvUttq2G38xF#Hn>&H*8V%0@RtH_-5^VUas zho_USF#XDIeN*Cnv1fhi%UJy8Dpya!z^;5++HBITr5+;xF{Wu#Z5UDB!v7elWiWB$~xcOj#Ms+^<&d8<4rx(MLUL$K3z-v zxj^DRgE4=RH$iWwG&M8w+q_>WgiTh}8IsC`#h^ft7g@0dW*d{=s;OizofE}4-|dC{ z#NMw!6QtNL^Jypfx=Y1hVPCiAz%;hj5GO!D(4v^xT-KRDw%vmAR76vt33Z1b@ zGuBg^EL>JC7`a}#&hlaxX0v!$c|~tAp-`aa9eOobnbAE{Pl5F001G*ByX^wA?GDvs z*{)U)lR@9;tAWl#jn3*7p`#v7HtK5Er=vu~yISLBq(^~KSHXKabyF3aW{y+JeCb(i zGKtv%G@Cghtz(ZZY)bSdIPK5SoZ2Qc5H@?Z5_4eTck?zwd;{o zX*1M>y!S9ZhO^OGh-GsuJ8NE77vzI>aT z1##ZDNuMVD%FK1EML`GlN2vS`2qqxqE=4xUO(!P0gO107j}%OYV^ivLeU0EjOJO>j znsOMG$l6>#j}>k}hmGOZjhf@CI%>J;s!=rV50-Tlg*=(a+AQ$%M58)!Bv={4tT}+R zlZw8d2kfzJT59!(Gy6pCMHL&6dwym0l-4lyCOT-#&xG(>o7B-=*7FC-6$FOlZ0{uV%HIOKmRS9Zm~ejM6It1*R|+rwbbjZiA^the?iurNr{cIag8Mzwl{(my;( z_2xZ-EM(fP%5Dprzp|&8f9mxefr{N&6jX30R_N>|*Jy5G-erVvZ?CDdD+^I_Aym@Q zuzc9+AAjZ9@$y25%^5&J3^i!duF!4C(p}ce5ggHJ)-ILMd5id#8iMi=g34+j@(aLr z!tx!PrPANcBF~!DlI7H%u@~LcirLo8K^9c+v|~)OzD(NXGxSzC5zTo^|*5fX~FAbW)MC?l5#ABm$aV3!dulzIB=Zv zE+@3Yfi8>wb)zeoK*xe0`OQIwfmAZuzih8LRWFsSvXVn;w8EfC-MP@{^UDJ#Yf;@O z%-rQ0K(d6MOB8U$dJlL0;mxO07pe|n+4|&lS~O+loAIj{$gbT6- ztAp!5adT2qHi!#ucS=FWxOf`9_>97yn2(=^=K7F&wU_ZtpL_U}cw~KI6bpCHIJB!J z0TbR@6r8DB0z-~W56w023n)G`D&{~KK*vJ_@6qE;c@1?kR!$z=S+Df{nh+1kMzgIZ zFgY7|Bua?I8#tS3G*tbi<`1FBkw~I^C`S77GU82RXl1ZViW-R zc6dS7b|vzpo0X3yGMf9zBtA?vt3dC=v5l$)S-(QW@6Ol8ZFwIxEaSgRgPyz@Wufi& ze2t^k{*6*VlX+UK*t9|V^~c(t?;t$anpdg@$Egsky$7ouv$m2={vVw-(G(>Jx+kqy zuWUbTIqy+f7zWu+3!>h`pOKc1w1@qXHVr*stkh-4CX9!teZm3fA2R;J!~e~hQ2DvX zU4S^rVyS;XPm@tVK=f5wBp$5%CMq#L?InRTCCwLn+Ker{s0Xijp9J6FBF^N0dHngN z|1$FR-2KW-dbeo2=MulZNid{fyvn-Li5?ppFCN`N-Ak4LUeg=}1yY-s(^0_%AkLGW zf2`Y-@3IwXq(8&Ujx?CGlSqg)p5J}KGSaXS7u)vMwarvyZ7@AcQ5iXrzVA@6&Ace# zJ0=SbSnmFfc^*<*I#bnl%WsUmJ8atA+w0BbKeQ2j-xiw5F}~zSdzO=@HLXs| zz|@s%3iBy&|GV4VI|vC?+P}z(^7isrZO@+;k?|D|Ocl!Dc{=Xn2PM$cOQn#m8mz3e zshgh7MaiLf{^7+MY{6-;GIumBhDj)%U#a114t3glT4Sky&emJoMb`YT?Gu`c>y<9R zNhBg@8BLP{^=FG`;5@tZyB2UEqCnY;yP-s*ds%*F2C|b4 zkHlO)1QpOzR#y=S7I3D&tkTpzKNZGt_N@EelsRS2XQUc5qy*0I{KK0RftgiLRKW?s zOJKJSRxQU8JjC(Bn}Rkx)ReI`nEoqa67F`G|ywSVSSEG8IB9z8us4U zU{TAXv=eJvd%_?e7+I%IGvyPfFr8~xeAHgzJjc3sxwR@a=_Et+{PeUF6aM^|EW6sY z0Pg6?Ni*oWED7FI8ZS<9P0rRb*i4$+`2=hDeZ9z2rI{bIE`Reh0{5l{dQ6F_xo@)~XR+nGuCjUReAkuh#t5M@h`=)N=ccQ~C8Fg>MO?{d z@ldAmTr06l$*N(cbu2sR+hx9*#Eo*ps`LX;1CGHos~)C{EWBbN0;TA&jb&UiEzRAy z8&p=7^giXeBMQFGOy2EH5^!4!yhlIO`}_p6KU?ByTB__>B$UFKF{p@OB~J8FydnH} zYy)!J8lEp~{{^)x8oo4*Ya==4rQG$FNRFvMJMNyqK)ditwzb@E7~iv_OLsBY_zdOI z(lx4?Y}l6fDvGnN;KpTCmX=nK`=HL25$NTBdBB z2>YB$zc*)f?ms`oLaRo-sXvk)LM z=Eq~1iHoeoI$V~BGt}QQd{CCMGhaG{+A7Pgs(kGGpvt%SGxp{9mNdpeQ`_x;`XC>` zi3PKvsDdi(j+rbyKz|8$j>;3=YrP`8?veA=N4M~<9=~VJ5*dbIT*D~h&`tmXnXnJk zTyg-Z@0Oi_7@J4eWUuk8qTgBm=>Nhb{@PHGxAD(&(P87EMc22x6G56}4}7AHQ=QeW z0xc!&1IN=ys3>AqdWLx>WL}v?@v9G-nFl^wiWwLXTktF5(48;^AHCff>r&je6nlTJ zc}4uCTCsc9kdI^YGU|Xy>|IG}0xk=XB~{yp11@V%Moq*`!M%(snHBXdB@N4Mwqaa; zvTEWFTt9}V3F!8VV+iGm6KF>xRv*51^OmQ~IJFi9y@gc;D*iYUya+WOrmI?fGZjyz z{b_XjGRCPqa9Wl7x|X!G(QJ(#aDsK%g#9e)vF|Ob_kG`j(1)T%}TVT%Qw%&u4Qx6{_}` z{SMekM!%$pbfZ$+iHT46XxxM^Kp?S5fOjv%oB96d)*(kBC~ME){gvjQ?-ldBQt;Q+ zUaNjme}c>1vTrKFjHliBU(z*t-dG5=%M2BYzikF(k0W0v5VF&1_t@1kb7MCbUBlGU zhwQWjpQ$mP0w+Bxa=3~lbSmwE@Wwgeuw+0@id38vBF0nFX%v!VjNYCr z0YMd<;~pe2RDm4L0MooiZVsj8C?ZOb#--;K zCS5xzw+Lgf}vaaNfB|gfo9Z+xuJPGXH=HMDrV38o`%P|VI_8*hKRnSvAi|iIX*Leb} zL)ba*@4RhG^k>U7Z&%B4JLU-~+Dn(8hL+89mT_D`m7N@Ih&a=?r4^j% zAo0+Vsa5TFQx+N-@3m2yv+-RL%_;?rpKxxn>GUEy!(FYygxxkdo}#uBS(&rA--Zg0 z3_o-gkyNNe(D#7`kuy6bY?)iWdy|AzGW}9L%di8&=4p#^W0$FKhZaWlo-WhZ*CTA< zS2;@g^P`E%%Ht;EW=7dokVp2ri{~~y)LvPxo~{H!ZxI!`uz3QHmHCVlC5Bc%!82lz zYv?~bD)ITrE|*^gviU(s6_kIfti7!1O5lUl_LpdTJKdmORFn9k&Y^a<<36y{$K2Ol znln7!qzuV11q;gw-doaAsnzzGT0h`3nAfO<<2GY}EJDAR+Pf2l)lc4gC{eXy^B=68 zCLj1+;C$3o3bedE^~p>SbM@)-)6nyBQv05p0M@pc>*xuy`>0I9((zgZ2dFXE{V}Ie zx`A>Y@VO91cqkQq!*@$@Wj0=RqE6kczn`oU1+6U0NiGs4XIP$>FB?SM{lY!oJKGpU3alhD>lPr3kKVPh8qM38B|z z>ghvjBdr#)IOE_pHZBXx(0|+gt(-&Xl3h0m)e#*OzZw)$MB&n&(;dWTY_E+LmT1u7 zR5JE{qa~)H?406~%A8$npoor;J=zIZ2w6l4q?|-on=mMNTxa9R6mSr_mS}c`-(FlpWGb&2={7Gy@Me z6o!TBE@GSAkAf19Wj?OIcrerG44Pc`c+OKgImo3x&uqF>`c^Nbo?8cNH&!YXoEhx0X{^%3B~GDv;ZboN;EpWO9Mhb{3y+|*v(d=n zUCdId0%+pEZqZQ3;M)qupZX}UH^7yLa>mieZ`riDro`F8-9)n?OMQP&Bx6L(6P#*h zFL@Vp)ezwW)b|uBR!5N;>ggKMCTq7vr>Ad^m5Pbf_ZO8!m&uo>#+?|+S7c|c%9zQa zuE$T}BReaLvmWTcD(y&xsmU9>#!C}DDoZ4EULTJaHl3rI1Rbl)k4BUQdX2~OVv=AU zb`R_(LU5+6yZd$GLn9Mr%TPO>);}dm9$OZ@cp`5MWX;pbteaKGi5)$@KUSyU_B$R( zr+69IolHIAxn;D;;L-kJ+mwelKT=$?F%D_l$`eppod(Y0`Uowag!*2ou&lb>g5pJ4 zk3~ds;eCV=vgXOkxZ39i^d)h2lmeS%gG}D!+J*O|A`X5u>oTt3St}9;`P?5*{%Tt@ z?#fPX#4o`l)EPnYH6(pU>tAgQ-pzW$7){A2Z?*+)m79o z4g=IKX4(UD9nCuBWZs;g854G2y<_*q!=w0r`9>oK7`aH&p7nn*^ZDJsaPNgX>Y)LD z!trZ-k){XChL&gmKyI%9g)>Z84R z6!i7lDG{Q!(CztWr~I<$MKNYVD{`yu?!_vdE?K3p3H1!e3mr~SxQ!;uNb7HmNh)$= zk?cdOkxHU5`sfZQP$AyVo)bRyA3gD-6o`9IBw+Tx^SjVS)@7!Q>_(uzneDwOhjOpD2iNdTR z-0@=bx7{UFo%xAh2gp9j)co*Jr1kom0W?*d;3Lb8cFN1IPfB%D;=NpVo3caXPb<&p znLPkiwECX$^(Fv(wfU6uWCF=JJh`96BqgbSH*S3{roH8$mB?~PnM74RCtq1ekkou4 zsO2#7#HN4roH)rTR!t=!eTw}PdNBQh+H)7P_&is<-A0ExW_^ItiZyw9hWbi z3ov(?FnuvCW`upE%eLlF6ngW!AAb$WoY`;v@xFJ=vwrJ$#J+gizXa@8N`}@~P1p3zpD6n5CP8Nbd?UHEv=kO$?blUFrxwH+zuN zU+n+(cKPF(TrP6=P;KhKrgE;AGWR6?Ws&J}j-pO@kd5j3=7y(_N=TgyMVrf{PvOBH zV7md>QG~n*G|BonX-4$>!iSQt1YYOKQz}`6V@227SM`AZoK%U&%X~&lS(~4jTIF&V zUD+a=Erg*M9Bpv?K$c?u)Pkx{;lKv?;L+Kpm}KW%vb}(=HFPPiV9C^I$z=9#V-=XZ zSUF#C&Ze?w+#i#+&sDz9Ug{+R=e8^7(kv{wTbFstBmp%T`fAMNA3w8a8UAqSKBIou z&b2^W67-9i$a6jQAj|TSYnaQk&awSBXr}5o_>N;-lCp$Lkap(RB5Hnlm^x=Cjda3A zBDL$st*;exRm?!E%ja#?ClS3*`l(A(B;M7}`3hP-`&vcq#`{Fgm+HMyFyn?IE;?XH zUM={Z(+GAPC*OSEt2K=NPxj+OxIh1Fu)f=+q3leq#=HOXUa(g>AewRGz85s2elz+z z;Tn_e0>9gr_Hnq=y?4M%1=$)=+^-6kfDPlAXNo@#xXj!_2R~&MM9VXJvy;%XN*C0p zA|HZGda5}|#Zw+8ewOSe8vf411(1f(PrTzc|1S5sE^4VKs_|YzB?S|+=I_d9p%|yvvsV9k=0^=$UF**+1rLFKuoHMiX zRJ_Kt+J<41lLA(`tLeWuEbiW`rerHZ264!2=l%x7%@1@jIiYUIsZ5l>ed7|0&j*>YvYVDZH>;OKUM#0kF zd1$Y!R@sv6T@cz%DS+}kHbD7q2v{yV%MKcBGp#E_7_=U4p{Lyqrc+T$`PR?Gf8WlJuY zA2$;B8yQ20Y2KS!RY!0UtbMHfmduPth`V`D-CsD{mIfJ)q#-kYXnmerPHV-{S#82x z*?Y!I*!C|}FG5r}#%3|6@6o;~k?^jCLC1I-?Vet%Cws}+M$o_I1bB1-Z zz2i)9oFq*2#pwnif#X7-n*s2Z+Eq3zLaf$w;!0pUjLT_LK^0NjRq)4rpjGY#)eXsJ z@_Mzu`x=>j{TUmmpv_OCK&vJriND?yIFQlYbL(_vNXAg5Ud6W6mP2x;oK$7_yexk# zXz;D}aeFHb4i4p@%DovdBocbIIx|sbOQ#wn}0-Nxv8!c3OLg)sn_Ah0uF$6+q)H(#o$rzW_ zAd-P`y)5?ms7M@SCL}iQPqNQN!DegOtbu+I+(ZI06w#if>nk#2#${7URPx62GLCHL zRA~zCL|tHBZep}x!j`fl-dJ8Rlx~b|-11XohZF`lO;ymTIi!mqUqSs+oh~*;%bk2Z z**WHLBqV}y`c~P-c9rYFq!Sws$|WU+IE{v5b9%n|pgrcX{Wuw?2-H`FMQ#0|7vM>4 z3FA+4o=1Q2m>z!mMZp=&@!l0)*Z=1ycW{1^{ck)xd^dolHHw)qI4zz(@UyTM{+CBz zND}ZKCI;tMy;PO^sy;kOK;B7N&krAbQbU=96iMmCUyoFIiN}nmXS+p^@{s3SFzz;Z zc(^7w8xF~lcucQaK5Dm*f5H#LN!9Tu{D|1VaoeVs_gJN>N#|^fQ^a#WnCxdH<1E+% z+fGKDbm6<1zWtH^uBVpXeZ`P-)|fEmcljq(&DRw}^2~U6zi{`a!n-f z01rSj?&gmLQl~MmsbAF^GL*vp(N*BT1!N4vo74AW9aR8cq`H$pHvxq`K+@=2qEXo>z!! z)l3PCvgvfgJuXMwT}L5}l9`-4FqOK=D#ymW0#3|ibdmF%x;-h0X}h?!@9x;6z6VFG zXVFW@gF5V{zKjW+F*oP&fT!u{yaG%D31sLTw4ep!KoccQ#t}^rm~nq~163kLPC58} z+U`xXd<2Y3S1F3v)H0wlBe-|3EZ!??1`p`#yMmE6CS+#R4ghVVU}dJ)kHt7z1V}FTGEoy&Ds9M z6X3e1w`P$j^o@sb+D;3y9^%f0$Y%B|Em3}M^O$2R(f3a?WU@4d%X*aiG+As+hK(04 zzM#~TR8c39;srN%ojb{#-^^ilFFqzyKJn+Ox%CnmtC+m-Hv*++OEI)jo^Ie^?>qWR zg9LB4?8x3Oj&$W00pR4utgS>!`LpxW88N)CQpDMau<9n(qg61|W;U-GLFtNKHj*~5 z%Oa_Z?9E0GSA3e7Q z97nGmsU&O6rHhrCK^~jO;})N$<78q0T#Z_}3R{`u|HwI_hlX0_A^avlQs5nDWB2!$ zj=8exqUE;}?u#A2$h65QMR&)f^M%ZvKK+WgVt+^@ z)-X>msJ!JR@adOjJLCk@kLcJi3LM&pPhpCWvI~UP7fY3cx;6#GURIZTymH$jn)Bio zymp(98W-oEtNEKvej_6(y5-^Jg|wk9B+K=-Rh*QiQx6M=KRey>pHFr>^*>4)YHQFI zPg7p3x4(VmNs-^f-roCtLtD%%;Xg|LRyjgAdAf$tAj-dWA_P-4Ke&+3D1SsBX10wz zudZrMj2YqC4P8+8@0ynOn@-($<@K?^k6d9W5`o2cO)i zojQHvQM7JDZz9%X|M!;i?a>6$dT}5>f05zNUgr(dG5b>z_YO zUQ*_EE$A*T>R1JHr}|@=RW5TI0S{B-s60zwhIWo(mHTf_tLgp4VE|5Nf7gfsf2Wo)bfyKTfNZb zr~vPaTOa?a<;Mj-UODmEqC1mIR!@&SyOsZGU+)*py!PXdZW#6n`@X+QxP6EAY@zA1 zk@#O%o6Y(>!%K8&n4+sCyelUh|D>;NdhWxK=RsS0m4?nu-oI$CPSjjDx%ZqWrqXrq z8U4Zf@0*+tv2=u~o6MaqI??#{V2yDivqQT*bN-FTSsPw)^Ak>nZ;Cy$>4W!&Niq9M z;~(ri9vF2jGx8*{L6mex`6y?>=Bpz8qTAC!`SmZ-*4Fmwbq79e&T@cHD2^-q7{AA{ z_(A)TImyBw!_R%Y^El>ZQ`SklyIG^1yGl>oyZ3l~&#x_6O_)=>Pf{Ls;e;RAfypa| zKeb)u8>XzcJQmNp_~Rtl@4K;%RU%uxw}86~WLo>hvZmZf&e9N+q(Nnh6$8-?D>*`#%L^xD z+auh8kD8VKKn(kT{@b!uzzeSA*+C2BQHVN;74tPPV_vR~D?6H3kw1mnDd7HT>1Vr zV~1-N`_;bq>iw#|fQ_xIhBxFEM*Mv9msg%oSS#=7R=FgtIeRlUD*Rs5%fyZMqVxCo z_)LEA_{t+c>Nnm?AAB|M$uuRdrE=c+wEB`QRSWM>T5AG}W71CUJX<*(k^juRxBbMn zu*(Ty6@~mAiMw~c*ZbY#mtS;VXtJ0XtLR(K7(@&I$}I#}$%h?VRhiTIoi6&^R%P`cZ-)P84CU3q@}v$}fb zD4j-i#fwJX4C)&XeNk=?k=hlCkJiAh^^#l+lD~W-77rlUWmPmPad=3@z#_}UhA23g zGYeQEGn0e}NXunqVXA#nJUIMLDZJ?xp)lI8lR(tB4r)Y3Wj5?6W0F$aIq1j;oKlv0 z-waD-h69aG*akrQ%WA@esc80_Wg$KAtSN%`st268q1txEw}1lzUTVkt6%s0 znRN)W?f!vF-RrrVhYpr)N+|to_}YKGV*a#i9wy=MRfKyV#+{4!`n{{6wl^LfN^hPv z@5X$+E^?&`ER2WEzTLiJ1W4akT)#@MKxgF3X6$|EVeDWtj@=+PV4B6E#dn{E9met` zcS`9)ALgVN2H#vn+KA#jrq2fSm8!%{GE;a-FML7W<}KAZjmBk`7NC%Ms`N1n70ieN zL8cnWfjJYlfB=UK{sG7VPL@J?kz0vYwOJA=ovav|XYy8$sYUQz)6fE;Zd@tb*av%i z;j$SLWFxZi*bXKv@c#+!`6_Hb2{^?VqSayJ4fVl|hO}!6mY{tHRVF|O%H28AW?Tn2 zHp#HfK2}>^cJM3|{@7cM(4|NKBm-b2PRM#e)*(u`g7UZA9ZAVc{8Ip>DukZ?vBpvj zf@;{3vf#;DG&?k&3gem4Den0d_Sx6V>jRfiFFmW%II#xQB5t)I<5CBW=AOOQOrz0L z4Rb5X)lCBL++V1A3bnL`!Q+K3R|^0cUX@Yc)?b4*4&p4M9xny&%wGWeBhFQ`7_bU) z?x4{@`ga$9kMtJdbuMhuoro?!B+o8aBQ{2No&q*3qt-Vi)r36JuV)^y5Jc9v3Jmjx z)4eG!N2MyXw|)2|b>=P@8irYq_`Zv&9v zbxSiTtkxZh7+9O7&LqaH<%cVL-2vmQ@Vi8A>SdkqYcwR?KOZ- zEATQcqa$ko@S_6g1eIq8jvHUM_Q%vgfpsWY`X`wT5&Q;YR^qLom0=Y$`;R0uWkf2h zhy3v2Tp~b@0oxu_sw~b`YAn1f$dJJS2mtgF9(6#`j?Tt8E(G5gO;wt*`CLVlAVY0z z{XIu9vatc@Z;Se?^4-M4YeO~LL2)abL!p)=k@L!$;af%{OeJ1@D+QxY!GTasG2IXU zt{{KUb+!b}?_t=PplsMHms#!c?N(s_ot#3o33~kc)hyyWPwV6)F(8vfMkF;D*|?JkcgwvS}!N`9Ar@4`rtCB2tpdJjA+UcIV!9Os4*mBnI|AZ9sUSxe_ym% zGZ~s>3;!ag#IImQ0m;&RQ7+Gsjt14``1|4#dDnf>kf}67iR&RdL2jid@Ej+g#AB@6 zsGjx!C4)Ks@9_H>j773I+PWwZ_^z&d%K(uD#7caEmmXG%LN*{6Bx3#YMFce34r&v@ zW(-Yjg=H5uNwrnLXUq$tzziGMBkq9mssZ_VWya;P=oi(cXqNK4#W|c?KwczQ+(h}| zrF*dh4mob6Je0{P*<%O#18rs{wtyf>_UdpOE7GvvcHv*l(NH8Bdh-GVKo-jW32Ao} zYRnJ6)~%#m!KMNPtWepo+m7pI17w_aiiC%@0z5oKM2L+dK_v<|EWpBf*G?k{3v}`1l2*ohVrULQ;}omx;L>9IVqzFUL8&-F8-gi_%FUfL`9-;Pnn#6P{oTXfcyhB z+~I#89N{}V@{K1;D)5t`V|@~4%4lL{Hg5hP4exg5^MN%#RCGI*cz7w-m~m^&c-wvh z`G6Y!!1|8nFcso36)OLKWf+#V&BEh^tv)GacMY!I3qZcGOPmCFf|>FD_q+dpQKG&D z4(=M+XpkZxGL|BQFX_=A$cKgu5h(@i#ZSXyZ0#|atC+7{qrl+E26rRUNA#(-7 hxZ;2`0kF3l9b@GoD! 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 SwM1T<>MA;Yc<_Uz7rz0{vyuV; literal 0 HcmV?d00001 diff --git a/notes/mod-arena.md b/notes/mod-arena.md new file mode 100644 index 0000000..b074e49 --- /dev/null +++ b/notes/mod-arena.md @@ -0,0 +1,107 @@ +# Alligator Arena (`arena`, LEVELS) + +Package `mods/arena`: `ArenaMod` (writes `wads/T1L9M0nn.wad` + loading picture `T19n.COR`), +`Arena` (level script, village base like the test world), `ArenaScripts` (the strat scripts, +script language 2), `ArenaImport` (compile against a source level + `StpcMerge` import). +Registered in `ModRegistry` (one line). Test-only: `ArenaTestMod` (src/test, script options). + +| Option | Default | Meaning | +|---|---|---| +| `lives` | 5 (1–10) | hits per alligator | +| `waves` | 3 (1–5) | wave n has min(n, 2) alligators (3 waves = 5 alligators) | +| `energy` | 4 (1–5) | llama energy cap (5 = game normal) | +| `coins` | 1 (0–5) | EnemyCoins per hit (+5 on defeat, +5 bonus at the exit) | +| `chapter` | 8 (2–8) | TestLevel chapter; a chapter already written by another mod → apply error | + +Chapter ≤ 8 on purpose: `levelRecord` (coin counter) lives at `0x584F1C[world·6 + chapter]`; for +world 9 chapter 9 that is 0x585018 = furthest progress (unverified risk for level projects on +chapters ≥ 9, see "Issues"). + +Script options (`Arena`, tests/`ArenaTestMod`): `probe=true` (event probe 1.6 ahead of the llama), +`master=false` (no alligators), `start=x,z,rot`, `debug=true` (HUD coin counter shows +kills·100 + wave·10 + alive). + +## Layout + +Island 10..30 in sea (death plane). Pit x/z 16..24 (sand), walls 1.1 high, corner towers. Llama +(20.5, 18) facing +z, start camera node 1.6 behind (inside the pit). CheckPointPost (16.8, 16.8). +Exit pad 1×1 cell at (20.5, 23.5), material 16, gate on the north wall; **ArenaMaster** stands on +it. Alligator spawn spots (20.5, 22.2), (18, 21.8), (23, 21.8). Two Coins at the side walls. + +## How it works + +`ArenaImport.append` compiles the units with `StratCompiler` and appends them to the STPC of +**t1l4m002** (Jungle by day 2, has the Alligator), so `model:47`, `anim:98–104`, `sound:58–62` and +`unit:56+0xf0` (EnemyCoin) / `unit:36+0x28` (Sparkles) are that level's. A unit may refer to an +earlier one as `unit:@Name` (→ `unit:N+off`; the compiler has no `@label` references). +`merge` imports the units into the village base like the editor's cross import (models, +animations, textures, 3 sound samples, EnemyCoin/Sparkles shared), adds one prototype MAP record +per type (nVars/slots/typeFlags/extra), then `LevelBuilder` builds the level. + +* **ArenaMaster** (12 vars, no model): `g104/g105 = −1`, 2 s, then per wave: move to a spawn + spot, **yield**, `spawn<0, 16, 5, 0xC400, 3>(ArenaGator)`, `alive += 1`; waits until + `alive == 0` (gators do `parent.v3 −= 1`), 1.5 s pause. Win: `g101..g103` = door target + (1, 9, chapter), `g104/g105` = its cell (the llama's own material-16 check then ends the level + too), 5 EnemyCoins, Sparkles every 8 frames, `endLevel` when the llama stands on the pad (as + LevelDoor). Each frame `player.health2` is capped at `energy` (also after a respawn). +* **ArenaGator** (spawned, 16 vars): the Alligator's model, collision (0x4000, 3 bones), + particles and animations. `hitDamage = 1793` (1 | 256 | 512 | 1024). `on touched`: if + `damageTaken & 1792` (kick 256, dive 512, charge 1024) → hit flag, else → "bit" flag. Main + loop (switch state): 0 watch (turn to the player, after a timer snap if within 5 units and on + the same floor ±0.4), 1 snap anim, 2 chase (speed up to 0.03 + 0.006·wave), 4/5 lunge and + slow down (original numbers), 3 back off. Hit: lives −1, sound, green puff, `coins` EnemyCoins, + blink 45 frames (alpha 0.25 + red ambient every 4 frames, no further hits), back off. Bite: + back off and rest 90 frames. Clamped to the pit, y = floor. Last life: the original death + (shrink, puffs, 5 EnemyCoins), `parent.v3 −= 1`, remove. The `aim` sub (ported L_03d0) writes + g17..g20 so the llama's dive homes in on it. Fade-in on spawn (setAmbient 0→63). + +## Engine facts found + +* **Compiled `on touched` handlers fire** (event type 4): probe in game – the llama walks into + it, it removes itself and three EnemyCoins pop out and are collected (coin counter 3). +* Contact: each side's `hitDamage` is copied into the other's `damageTaken`, both get event 4. + Llama: kick = 256 (Action on the ground, anim 28, hind-leg collision bones), dive = 512 (Action + while jumping: homes in on the target in g17..g19 that enemies' scripts publish, best distance + g20), charge = 1024. The llama counts a contact as its hit if `damageTaken & hitDamage ≠ 0`, + else `damageTaken & 127 == 1` → `loseHeart` + knock-back (the original Alligator has 513 = only + the dive hurts it, a kick gets you bitten). +* `spawn`: same fields as a MAP record (FUN_0054bfc0); + `extra` = words for collision bones. A MAP-placed type that uses `collisionOn` needs collision + type flags (0x28000 like Coin) – with 0 the game crashed (page fault in the heap allocator + FUN_0041ae20). +* `spawn` copies the strat's matrix/translation block, not `x/y/z`: after `self.x = …` the child + appears at the old place unless the spawner yields first. +* Energy 0: the game's "Weiter / Beenden" screen; Weiter restarts the level (all strats fresh). +* The level tally after the exit shows "Münzen gesammelt 0 / 55" (not our coin counter). + +## Verified in game (apptest :24, Wine 6, load 3–9, 2026-11-07) + +* Probe (`probe=true;master=false`): handler fires, coins collected (counter 3). +* Default options (energy 5 and 4 runs): alligator fades in, watches, snaps, chases, bites (HUD + energy drops), backs off. Kicks (Z) hit: puff, blink, coins pop out, counter rises + (1 → 13 over two waves); defeat with puff and coins; wave 2 brings two alligators + (debug counter 122 = 1 kill, wave 2, 2 alive). Blind kicking dies in wave 2 → Weiter restarts + the arena with energy capped again. +* Win (`lives=1, waves=1, start=20.5,21,0`): one kick defeats it, bonus coins + sparkles on the + pad, walking onto it → tally screen with the arena loading picture. +* Not verified separately: the dive (jump + Action) as the hit (sequences mixed kicks and dives), + the charge, waves 4–5, coins option values other than 1. + +![fight](img/mods/arena_fight.jpg) +![defeat](img/mods/arena_defeat.jpg) +![win: bonus coins on the exit pad, tally](img/mods/arena_win.jpg) + +## Tests + +`ArenaTest`: scripts compile for all option corners (EnemyCoin spawns = coins + 5, gator spawns = +alligators, energy cap code only below 5); wave sizes; settings validation; registered; built +level (CD): Llama, master on the exit cell with its vars, checkpoint, 2 coins, no LevelDoor, merged +code decodes, master spawns the gator unit, gator spawns EnemyCoin, `lives` in the code; another +mod's chapter → IOException; probe option. + +## Issues / limits + +* Loading picture and tally use the TestLevel texts ("TestLevel Kapitel 8"). +* The exit target is the arena itself (1, 9, chapter): it restarts after the tally. +* Level projects on TestLevel chapters ≥ 9 may write the coin counter over furthest progress + (0x585018) – not verified. diff --git a/src/main/java/com/eliasmueller/llamamod/mods/ModRegistry.java b/src/main/java/com/eliasmueller/llamamod/mods/ModRegistry.java index daaee12..9d89296 100644 --- a/src/main/java/com/eliasmueller/llamamod/mods/ModRegistry.java +++ b/src/main/java/com/eliasmueller/llamamod/mods/ModRegistry.java @@ -23,6 +23,7 @@ public final class ModRegistry { "com.eliasmueller.llamamod.mods.cheats.CheatsMod", "com.eliasmueller.llamamod.mods.practice.PracticeMod", "com.eliasmueller.llamamod.mods.freecam.FreeCamMod", + "com.eliasmueller.llamamod.mods.arena.ArenaMod", }; /** {@link ModSource}s loaded by class name (dynamic mods, e.g. level projects). */ diff --git a/src/main/java/com/eliasmueller/llamamod/mods/arena/Arena.java b/src/main/java/com/eliasmueller/llamamod/mods/arena/Arena.java new file mode 100644 index 0000000..cfd47cc --- /dev/null +++ b/src/main/java/com/eliasmueller/llamamod/mods/arena/Arena.java @@ -0,0 +1,201 @@ +package com.eliasmueller.llamamod.mods.arena; + +import static com.eliasmueller.llamamod.levelbuild.Opts.NONE; +import static com.eliasmueller.llamamod.levelbuild.Opts.o; + +import com.eliasmueller.llamamod.levelbuild.LevelBuilder; +import com.eliasmueller.llamamod.levelbuild.LevelScript; +import com.eliasmueller.llamamod.levelbuild.PyRandom; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.function.Function; + +/** + * Alligator arena (based on the village base level like the test world): a walled 8 × 8 pit on a + * small island, the llama at the south end, the exit pad at the north end. The {@link + * ArenaScripts#MASTER} strat on the exit pad spawns the alligator waves and opens the exit after + * the last one. + * + *

Script options (tests): {@code probe=true} places an {@link ArenaScripts#PROBE} 1.6 units in + * front of the llama; {@code start=x,z,rot} moves the llama; {@code master=false} leaves out + * the master (no alligators). + */ +public final class Arena implements LevelScript { + /** Source level of the alligator (models, animations, sounds, EnemyCoin). */ + static final String SOURCE = "wads/t1l4m002.wad"; + + static final ArenaScripts.Layout LAYOUT = new ArenaScripts.Layout( + 16, 16, 24, 24, 0, 20.5, 23.5, List.of(new double[] {20.5, 22.2}, new double[] {18.0, 21.8}, new double[] { + 23.0, 21.8 + })); + + /** Player start (x, z, yaw): south end, facing north (+z). */ + static final double[] START = {20.5, 18.0, 0}; + + /** Collision material of the exit floor. */ + private static final int DOOR_MAT = 16; + + private static final double WALL = 1.1; + + private final ArenaScripts.Settings settings; + private ArenaImport.Merged merged; + + public Arena(ArenaScripts.Settings settings) { + this.settings = settings; + } + + @Override + public String levelName() { + return "Alligator Arena"; + } + + @Override + public long seed() { + return 11; + } + + ArenaImport.Merged merged() { + return merged; + } + + /** The script types in unit order (the master spawns the gator, so the gator comes first). */ + List units(boolean probe, boolean debug) { + List u = new ArrayList<>(); + u.add(new ArenaImport.Unit( + ArenaScripts.GATOR, + ArenaScripts.gator(settings, LAYOUT), + ArenaScripts.GATOR_VARS, + 5, + 0xC000, + ArenaScripts.GATOR_BONES)); + u.add(new ArenaImport.Unit( + ArenaScripts.MASTER, ArenaScripts.master(settings, LAYOUT, debug), ArenaScripts.MASTER_VARS, 0, 0, 0)); + if (probe) { + u.add(new ArenaImport.Unit(ArenaScripts.PROBE, ArenaScripts.probe(), 3, 1, 0x28000, 0)); + } + return u; + } + + /** Imports the arena types from {@link #SOURCE} into the base level, then builds as usual. */ + @Override + public byte[] buildWad(byte[] baseWad, Function wads, Map opts) { + byte[] src = wads.apply(SOURCE); + if (src == null) { + throw new IllegalStateException(SOURCE + " missing (needed for the alligator)"); + } + boolean probe = opts != null && "true".equals(opts.get("probe")); + merged = ArenaImport.merge( + baseWad, src, "t1l4m002", units(probe, opts != null && "true".equals(opts.get("debug")))); + return LevelScript.super.buildWad(merged.wad(), wads, opts); + } + + @Override + public void build(LevelBuilder l) { + ArenaScripts.Layout a = LAYOUT; + PyRandom rnd = new PyRandom(5); + l.sun.azimuth = 200; + l.sun.elevation = 55; + l.sun.strength = 0.7; + + // island in the sea (death plane), arena in the middle + double ix0 = 10, iz0 = 10, ix1 = 30, iz1 = 30; + l.sea(0, 0, 40, 40, -1.5, new double[] {ix0 - 3, iz0 - 3, ix1 + 3, iz1 + 3}); + l.box( + ix0, + iz0, + ix1, + iz1, + -2.2, + 0, + o().top(NONE).side("earth2").sideTop("grass_edge").solid(false)); + l.floor(ix0, iz0, ix1, a.z0(), 0, "grass"); + l.floor(ix0, a.z1(), ix1, iz1, 0, "grass"); + l.floor(ix0, a.z0(), a.x0(), a.z1(), 0, "grass"); + l.floor(a.x1(), a.z0(), ix1, a.z1(), 0, "grass"); + + // pit floor: sand with a stone ring + l.floor(a.x0(), a.z0(), a.x1(), a.z1(), a.floor(), "sand"); + l.floor(a.x0() + 1.5, a.z0() + 1.5, a.x1() - 1.5, a.z1() - 1.5, a.floor() + 0.01, "sand2", o().coll(false)); + // walls (inner faces visible), corner towers + double t = 0.4; + l.box( + a.x0() - t, + a.z0() - t, + a.x1() + t, + a.z0(), + 0, + WALL, + o().top("stone").side("stone_moss")); + l.box( + a.x0() - t, + a.z1(), + a.x1() + t, + a.z1() + t, + 0, + WALL, + o().top("stone").side("stone_moss")); + l.box(a.x0() - t, a.z0(), a.x0(), a.z1(), 0, WALL, o().top("stone").side("stone_moss")); + l.box(a.x1(), a.z0(), a.x1() + t, a.z1(), 0, WALL, o().top("stone").side("stone_moss")); + for (double[] p : new double[][] { + {a.x0() - t / 2, a.z0() - t / 2}, {a.x1() + t / 2, a.z0() - t / 2}, + {a.x0() - t / 2, a.z1() + t / 2}, {a.x1() + t / 2, a.z1() + t / 2} + }) { + l.pillar(p[0], p[1], 0, WALL + 0.7, 0.7, o().side("inca").top("stone")); + } + // exit pad (1 × 1 cell, exit floor material) under a gate on the north wall + double ex = a.exitX(), ez = a.exitZ(); + l.box( + ex - 0.5, + ez - 0.5, + ex + 0.5, + ez + 0.5, + a.floor(), + a.floor() + 0.06, + o().top("pattern_purple").side("inca").rot(0).sideColl(false).mat(DOOR_MAT)); + for (double x : new double[] {ex - 0.7, ex + 0.7}) { + l.pillar(x, a.z1() + t / 2, WALL, 2.4, 0.3, o().side("inca").top("stone")); + } + l.box( + ex - 0.85, + a.z1(), + ex + 0.85, + a.z1() + t, + 2.4, + 2.65, + o().top("stone").side("stone_edge").rot(0)); + + // decoration outside + for (double[] p : new double[][] {{12, 12.5}, {28, 12}, {12.5, 27.5}, {27.5, 28}, {13, 20}, {27, 19.5}}) { + l.tree(p[0], p[1], 0, rnd.uniform(1.3, 1.9), 1.1); + } + + // objects + double[] st = START; + String s = l.opt("start", ""); + if (!s.isEmpty()) { + String[] v = s.split(","); + st = new double[] {Double.parseDouble(v[0]), Double.parseDouble(v[1]), Double.parseDouble(v[2])}; + } + l.player(st[0], st[1], st[2], null, 1.6); + l.checkpoint(a.x0() + 0.8, a.z0() + 0.8); + if (!"false".equals(l.opt("master", "true"))) { + l.strat(ArenaScripts.MASTER, ex, ez, a.floor(), 0.0, null, LevelBuilder.Waypoints.NONE, 0, false); + } + if ("true".equals(l.opt("probe", "false"))) { + double r = Math.toRadians(st[2]); + l.strat( + ArenaScripts.PROBE, + st[0] + 1.6 * Math.sin(r), + st[1] + 1.6 * Math.cos(r), + a.floor(), + 0.0, + null, + LevelBuilder.Waypoints.NONE, + 0, + false); + } + // a few coins along the walls to start the counter + l.coins(List.of(new double[] {a.x0() + 0.6, 20}, new double[] {a.x1() - 0.6, 20})); + } +} diff --git a/src/main/java/com/eliasmueller/llamamod/mods/arena/ArenaImport.java b/src/main/java/com/eliasmueller/llamamod/mods/arena/ArenaImport.java new file mode 100644 index 0000000..ec233e7 --- /dev/null +++ b/src/main/java/com/eliasmueller/llamamod/mods/arena/ArenaImport.java @@ -0,0 +1,183 @@ +package com.eliasmueller.llamamod.mods.arena; + +import com.eliasmueller.llamamod.format.Bytes; +import com.eliasmueller.llamamod.format.Level; +import com.eliasmueller.llamamod.format.MapChunk; +import com.eliasmueller.llamamod.format.TextChunk; +import com.eliasmueller.llamamod.format.Wad; +import com.eliasmueller.llamamod.format.stpcmerge.DialogMerge; +import com.eliasmueller.llamamod.format.stpcmerge.SoundMerge; +import com.eliasmueller.llamamod.format.stpcmerge.StpcImage; +import com.eliasmueller.llamamod.format.stpcmerge.StpcMerge; +import com.eliasmueller.llamamod.format.stpcmerge.TextMerge; +import com.eliasmueller.llamamod.format.strat.StratAssembler; +import com.eliasmueller.llamamod.format.strat.StratCompiler; +import com.eliasmueller.llamamod.format.strat.StratListing; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.TreeSet; + +/** + * Compiles script types against a source level (whose models, animations, sounds and strats they + * use by index) and imports them into a base level with {@link StpcMerge}, like the editor's + * cross-world import: the closure (models, animation sets, textures, sounds, spawned strats such as + * EnemyCoin) comes along. One unplaced prototype MAP record per type lets the level builder place it. + */ +final class ArenaImport { + /** A script type: compiled as its own unit; {@code nVars}/{@code slots}/{@code typeFlags} go into the prototype. */ + record Unit(String name, String source, int nVars, int slots, int typeFlags, int extra) {} + + /** Merged base level and the entry code of every type in it. */ + record Merged(byte[] wad, Map codes, StpcMerge.Stats stats) {} + + /** Units appended to a source STPC: new data and entry offsets (source STPC offsets). */ + record Appended(byte[] stpc, Map entries, Map unitIndex) {} + + private ArenaImport() {} + + /** + * Appends the units in order. A source may name an earlier unit as {@code unit:@Name}; it is + * replaced by {@code unit:N+off} (index and entry offset of that unit). + */ + static Appended append(byte[] stpc, int wfpc, List units) { + byte[] d = stpc; + Map entries = new LinkedHashMap<>(); + Map index = new LinkedHashMap<>(); + Map refs = new LinkedHashMap<>(); + for (Unit u : units) { + StpcImage cur = new StpcImage(d, wfpc); + int base = d.length + 4; + String src = u.source(); + for (var e : refs.entrySet()) { + src = src.replace("unit:@" + e.getKey(), e.getValue()); + } + if (src.contains("unit:@")) { + throw new IllegalArgumentException(u.name() + ": unknown unit reference in " + src); + } + StratAssembler.Result r = + StratAssembler.assemble(StratCompiler.compile(src), StratListing.layout(cur, base)); + Integer at = r.labels().get(u.name()); + if (at == null) { + throw new IllegalArgumentException("no strat " + u.name() + " in its source"); + } + byte[] words = r.bytes(); + byte[] nd = Arrays.copyOf(d, d.length + 4 + words.length); + putI32(nd, d.length, words.length / 4); + System.arraycopy(words, 0, nd, d.length + 4, words.length); + putI32(nd, cur.codeStart, Bytes.i32(nd, cur.codeStart) + 1); + int idx = cur.units.size(); + entries.put(u.name(), base + at); + index.put(u.name(), idx); + refs.put(u.name(), "unit:" + idx + "+0x" + Integer.toHexString(at)); + d = nd; + } + return new Appended(d, entries, index); + } + + /** Imports the units (compiled against {@code sourceWad}) into {@code baseWad}. */ + static Merged merge(byte[] baseWad, byte[] sourceWad, String sourceName, List units) { + Level src = Level.parse(sourceWad); + Appended ap = append(src.wad().require("STPC"), src.wfpc(), units); + TreeSet roots = new TreeSet<>(); + src.map().strats.forEach(s -> roots.add(s.code())); + roots.addAll(ap.entries().values()); + StpcMerge.Analysis sa = new StpcMerge.Analysis(new StpcImage(ap.stpc(), src.wfpc()), roots); + if (!sa.code.errors.isEmpty()) { + throw new IllegalStateException("arena units do not decode: " + sa.code.errors.get(0)); + } + Wad sw = src.wad(); + StpcMerge.Source source = new StpcMerge.Source( + sourceName, + sa, + TextMerge.Textures.of(sw.require("TEXT")), + SoundMerge.parse(sw.get("SMPC")), + sw.get("LGPC") == null ? null : DialogMerge.Texts.parse(sw.get("LGPC")), + DialogMerge.Speech.parse(sw.get("SRPC"))); + + Level lv = Level.parse(baseWad); + Wad wad = lv.wad(); + TreeSet troots = new TreeSet<>(); + lv.map().strats.forEach(s -> troots.add(s.code())); + StpcMerge.Analysis tgt = new StpcMerge.Analysis(new StpcImage(wad.require("STPC"), lv.wfpc()), troots); + byte[] text = wad.require("TEXT"); + TextMerge.Textures tex = TextMerge.Textures.of(text); + int origTail = 8 + 8 * tex.entries.size(); + for (TextMerge.Anim a : tex.anims) { + origTail += 3 + a.data().length; + } + List snd = SoundMerge.parse(wad.get("SMPC")); + DialogMerge.Texts texts = wad.get("LGPC") == null ? null : DialogMerge.Texts.parse(wad.get("LGPC")); + DialogMerge.Speech speech = DialogMerge.Speech.parse(wad.get("SRPC")); + List reqs = new ArrayList<>(); + for (Unit u : units) { + reqs.add(new StpcMerge.Request(source, ap.entries().get(u.name()))); + } + StpcMerge.Result res = StpcMerge.merge(tgt, reqs, new StpcMerge.Target(tex, snd, texts, speech)); + if (res.stats().addedTexts() != 0) { + throw new IllegalStateException("arena types must not need dialogue texts"); + } + MapChunk map = lv.map(); + List recs = new ArrayList<>(); + for (MapChunk.Strat s : map.strats) { + int[] a = s.toArray(); + a[6] = res.target().map(s.code()); + recs.add(MapChunk.Strat.of(a)); + } + Map codes = new LinkedHashMap<>(); + for (int i = 0; i < units.size(); i++) { + Unit u = units.get(i); + int code = res.entries().get(reqs.get(i)); + codes.put(u.name(), code); + // rx ry rz x y z code nParams paramIndex nVars slots typeFlags extra waypoint zero flags last + recs.add(MapChunk.Strat.of(new int[] { + 0, 0, 0, 0, 0, 0, code, 0, -1, u.nVars(), u.slots(), u.typeFlags(), u.extra(), -1, 0, 0, 0 + })); + } + map.strats.clear(); + map.strats.addAll(recs); + Wad out = new Wad(wad.chunks()); + out.set("STPC", res.stpc()); + out.set("MAP", map.build()); + out.set("TEXT", text(text, tex, origTail)); + if (wad.get("SMPC") != null) { + out.set("SMPC", SoundMerge.build(snd)); + } + return new Merged(out.toBytes(), codes, res.stats()); + } + + /** TEXT chunk with the (extended) pages, entries and animations of tex; the rest is kept. */ + private static byte[] text(byte[] orig, TextMerge.Textures tex, int origTailHead) { + TextChunk tc = TextChunk.parse(orig); + byte[] rest = Arrays.copyOfRange(tc.tail, origTailHead, tc.tail.length); + ByteBuffer b = ByteBuffer.allocate(8 + 8 * tex.entries.size() + tex.anims.size() * 64 + rest.length + 1024) + .order(ByteOrder.LITTLE_ENDIAN); + b.putInt(tex.entries.size()); + for (TextChunk.TextureEntry e : tex.entries) { + b.putShort((short) e.flags()) + .put((byte) e.page()) + .put((byte) e.page2()) + .put((byte) e.u0()) + .put((byte) e.u1()) + .put((byte) e.v0()) + .put((byte) e.v1()); + } + b.putInt(tex.anims.size()); + for (TextMerge.Anim a : tex.anims) { + b.putShort((short) a.texture()).put((byte) a.type()).put(a.data()); + } + b.put(rest); + tc.pages.clear(); + tc.pages.addAll(tex.pages); + tc.tail = Arrays.copyOf(b.array(), b.position()); + return tc.build(); + } + + private static void putI32(byte[] d, int o, int v) { + ByteBuffer.wrap(d, o, 4).order(ByteOrder.LITTLE_ENDIAN).putInt(v); + } +} diff --git a/src/main/java/com/eliasmueller/llamamod/mods/arena/ArenaMod.java b/src/main/java/com/eliasmueller/llamamod/mods/arena/ArenaMod.java new file mode 100644 index 0000000..c11f3cb --- /dev/null +++ b/src/main/java/com/eliasmueller/llamamod/mods/arena/ArenaMod.java @@ -0,0 +1,139 @@ +package com.eliasmueller.llamamod.mods.arena; + +import com.eliasmueller.llamamod.format.CorEncoder; +import com.eliasmueller.llamamod.levelbuild.LevelBuilder; +import com.eliasmueller.llamamod.mods.Mod; +import com.eliasmueller.llamamod.mods.ModContext; +import com.eliasmueller.llamamod.mods.ModOption; +import java.awt.Color; +import java.awt.Font; +import java.awt.FontMetrics; +import java.awt.GradientPaint; +import java.awt.Graphics2D; +import java.awt.RenderingHints; +import java.awt.image.BufferedImage; +import java.io.IOException; +import java.io.UncheckedIOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Arrays; +import java.util.List; +import java.util.Locale; +import java.util.Map; + +/** Alligator Arena minigame on a TestLevel (world 9) chapter. */ +public final class ArenaMod implements Mod { + @Override + public String id() { + return "arena"; + } + + @Override + public String name() { + return "Alligator Arena"; + } + + @Override + public String category() { + return LEVELS; + } + + @Override + public String description() { + return "A minigame on a TestLevel chapter: alligators come in waves into a walled pit. Each kick or" + + " jump attack (jump, then Action) costs one of their lives and coins pop out; the bite costs" + + " your energy. Beat every wave and the exit pad opens. Unlock TestLevel on the Save games tab."; + } + + @Override + public List options() { + return List.of( + ModOption.integer("lives", "Alligator lives", "Hits each alligator takes.", 5, 1, 10), + ModOption.integer("waves", "Waves", "Wave n brings n alligators (at most 2 at once).", 3, 1, 5), + ModOption.integer( + "energy", "Llama energy", "Energy cap of the llama in the arena (5 = normal).", 4, 1, 5), + ModOption.integer("coins", "Coins per hit", "Coins that pop out per hit (5 more at the end).", 1, 0, 5), + ModOption.integer("chapter", "TestLevel chapter", "Chapter of world 9 the arena replaces.", 8, 2, 8)); + } + + /** After Test World (50) and level projects (60), so a clash with them is reported here. */ + @Override + public int order() { + return 65; + } + + static String wadPath(int chapter) { + return String.format(Locale.ROOT, "wads/T1L9M%03d.wad", chapter); + } + + static ArenaScripts.Settings settings(ModContext ctx) { + int chapter = ctx.optionInt("chapter"); + return new ArenaScripts.Settings( + ctx.optionInt("lives"), + ctx.optionInt("waves"), + ctx.optionInt("energy"), + ctx.optionInt("coins"), + new int[] {1, 9, chapter}); + } + + @Override + public void apply(ModContext ctx) throws IOException { + apply(ctx, Map.of()); + } + + /** Applies with level script options ({@link Arena}: probe, start; for tests). */ + static void apply(ModContext ctx, Map scriptOpts) throws IOException { + int chapter = ctx.optionInt("chapter"); + String target = wadPath(chapter); + if (ctx.exists(target)) { + Path op = ctx.originalCd().resolve(target); + byte[] cur = ctx.read(target); + if (!Files.exists(op) || !Arrays.equals(cur, Files.readAllBytes(op))) { + throw new IOException("Alligator Arena: " + target + " is already changed by another mod (a level" + + " on TestLevel chapter " + chapter + "). Choose another chapter in the arena's options."); + } + } + ctx.progress(0.0, "building alligator arena"); + byte[] base = ctx.read(LevelBuilder.BASE_WAD); + byte[] wad = new Arena(settings(ctx)) + .buildWad( + base, + rel -> { + try { + return ctx.exists(rel) ? ctx.read(rel) : null; + } catch (IOException e) { + throw new UncheckedIOException(e); + } + }, + scriptOpts); + ctx.write(target, wad); + ctx.progress(0.9, "loading picture"); + ctx.write("T19" + chapter + ".COR", loadingPicture(chapter)); + ctx.progress(1.0, "arena done"); + } + + static byte[] loadingPicture(int chapter) { + BufferedImage img = new BufferedImage(640, 480, BufferedImage.TYPE_INT_RGB); + Graphics2D g = img.createGraphics(); + g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); + g.setPaint(new GradientPaint(0, 0, new Color(0x1f4d2b), 0, 480, new Color(0x0a140c))); + g.fillRect(0, 0, 640, 480); + g.setColor(new Color(0xc9a24a)); + g.fillRect(80, 300, 480, 8); + String title = "Alligator Arena"; + g.setFont(new Font(Font.SANS_SERIF, Font.BOLD, 58)); + FontMetrics fm = g.getFontMetrics(); + g.setColor(new Color(0, 0, 0, 160)); + g.drawString(title, (640 - fm.stringWidth(title)) / 2 + 2, 252); + g.setColor(new Color(0xf5c542)); + g.drawString(title, (640 - fm.stringWidth(title)) / 2, 250); + String sub = "TestLevel – chapter " + chapter; + g.setFont(new Font(Font.SANS_SERIF, Font.PLAIN, 26)); + fm = g.getFontMetrics(); + g.setColor(new Color(0xe8f0e0)); + g.drawString(sub, (640 - fm.stringWidth(sub)) / 2, 350); + g.dispose(); + return CorEncoder.encode(img); + } +} diff --git a/src/main/java/com/eliasmueller/llamamod/mods/arena/ArenaScripts.java b/src/main/java/com/eliasmueller/llamamod/mods/arena/ArenaScripts.java new file mode 100644 index 0000000..3708b35 --- /dev/null +++ b/src/main/java/com/eliasmueller/llamamod/mods/arena/ArenaScripts.java @@ -0,0 +1,510 @@ +package com.eliasmueller.llamamod.mods.arena; + +import java.util.List; +import java.util.Locale; + +/** + * Strat scripts of the arena (script language 2), written against the source level t1l4m002 + * (Jungle by day 2), whose Alligator they reuse: model 47, animations 98–104, sounds 58–62 and the + * EnemyCoin strat (unit 56 + 0xf0) that the original drops when it dies. + * + *

Combat facts from the original scripts: the llama's attacks set its {@code hitDamage} + * (256 kick, 512 dive from a jump, 1024 charge); on contact each side's {@code hitDamage} is + * copied into the other's {@code damageTaken} and both get a "touched" event. The original + * Alligator has hitDamage 513 (= 512 | 1): the llama takes it as a successful hit if its own + * hitDamage shares a bit (only the dive), otherwise bit 1 makes it lose a heart and bounce back. + * ArenaGator uses 1793 (1 | 256 | 512 | 1024) so kick, dive and charge all count. The dive homes + * in on the target that its strat writes into g17..g20 (the "aim" sub, ported from the original). + */ +final class ArenaScripts { + static final String GATOR = "ArenaGator"; + static final String MASTER = "ArenaMaster"; + static final String PROBE = "ArenaProbe"; + + /** Variables of a spawned gator (spawn operand) and of the master (MAP prototype). */ + static final int GATOR_VARS = 16; + + static final int MASTER_VARS = 12; + + /** + * Collision bones of the gator = last spawn operand / MAP "extra" (SpawnedAlligator: 2 bones and 2, + * Alligator: 3 and 3). Too small corrupts the strat heap (page fault in FUN_0041ae20). + */ + static final int GATOR_BONES = 3; + + /** Strat hitDamage bits of the llama's attacks: kick, dive, charge. */ + static final int ATTACK_BITS = 256 | 512 | 1024; + + /** Most alligators alive at once (wave n has min(n, this)). */ + static final int MAX_AT_ONCE = 2; + + /** + * @param lives hits an alligator takes + * @param waves number of waves (wave n: min(n, 2) alligators) + * @param energy llama energy cap (5 = the game's normal) + * @param coinsPerHit EnemyCoins popping out per hit (5 more when it is defeated) + * @param door exit target (tribe, world, chapter), ×0x1000 = raw words + */ + record Settings(int lives, int waves, int energy, int coinsPerHit, int[] door) { + Settings { + if (lives < 1 || waves < 1 || energy < 1 || energy > 5 || coinsPerHit < 0 || door.length != 3) { + throw new IllegalArgumentException("bad arena settings"); + } + door = door.clone(); + } + + static Settings defaults(int chapter) { + return new Settings(5, 3, 4, 1, new int[] {1, 9, chapter}); + } + } + + /** Arena bounds and spots (game units). */ + record Layout( + double x0, + double z0, + double x1, + double z1, + double floor, + double exitX, + double exitZ, + List spawns) {} + + private ArenaScripts() {} + + static int aliveInWave(int wave) { + return Math.min(wave, MAX_AT_ONCE); + } + + static int totalAlligators(int waves) { + int n = 0; + for (int w = 1; w <= waves; w++) { + n += aliveInWave(w); + } + return n; + } + + static String num(double v) { + String s = String.format(Locale.ROOT, "%.3f", v); + return s.replaceAll("0+$", "").replaceAll("\\.$", ".0"); + } + + /** One EnemyCoin, offset from the gator (forward, right) and back. */ + private static String coin(String ind, double fwd, double right) { + StringBuilder b = new StringBuilder(); + if (fwd != 0) { + b.append(ind).append("moveForwardQ(").append(num(fwd)).append(")\n"); + } + if (right != 0) { + b.append(ind).append("moveRightQ(").append(num(right)).append(")\n"); + } + b.append(ind).append("spawn<1, 3, 1, 0x28000, 0>(0, unit:56+0xf0)\n"); + if (right != 0) { + b.append(ind).append("moveLeftQ(").append(num(right)).append(")\n"); + } + if (fwd != 0) { + b.append(ind).append("moveBackwardQ(").append(num(fwd)).append(")\n"); + } + return b.toString(); + } + + /** The alligator: N lives, chases and lunges, blinks and backs off when hit, drops coins. */ + static String gator(Settings s, Layout a) { + double m = 0.6; + StringBuilder hitCoins = new StringBuilder(); + double[][] offs = {{0.35, 0}, {0.2, 0.3}, {0.2, -0.3}, {0.45, 0.2}, {0.45, -0.2}}; + for (int i = 0; i < s.coinsPerHit(); i++) { + double[] o = offs[i % offs.length]; + hitCoins.append(coin(" ", o[0], o[1])); + } + return """ + strat ArenaGator { + alias lives = v0 + alias state = v1 + alias timer = v2 + alias speed = v3 + alias hit = v4 + alias aimH = v5 + alias aimD = v6 + alias cool = v7 + alias top = v8 + alias k = v9 + alias size = v10 + alias bit = v11 + alias rest = v12 + setModel(model:47) + scale(1.5) + self.hitDamage = %HITDAMAGE% + collisionOn<16384>() + collRadius(409r) + collisionBone(0, 409r) + collisionBone(6.0, 409r) + collisionBone(10.0, 409r) + on touched { + if (self.damageTaken & %ATTACK%) { + if (cool <= 0 && lives > 0) { + hit = 1 + } + } else { + bit = 1 + } + } + emitterInit(0, 23r, 1.0, 0, 0, 0, 0) + emitterSetColour(0, 0, 0, 0, packRgb(0, rnd(255.0), 0)) + emitterSetParams(0, 358r, 50.0, 0, 0) + emitterInit(1.0, 23r, 1.0, 0, 0, 0, 0) + emitterSetColour(1.0, 0, 0, 0, packRgb(0, rnd(255.0), 0)) + emitterSetParams(1.0, 0.075, 45.0, 0, 0) + emitterInit(2.0, 23r, 1.0, 0, 0, 0, 0) + emitterSetColour(2.0, 0, 0, 0, packRgb(0, rnd(255.0), 0)) + emitterSetParams(2.0, 256r, 40.0, 0, 0) + lives = %LIVES% + hit = 0 + bit = 0 + rest = 25 + cool = 0 + top = 0.03 + parent.v1 * 0.006 + self.y = %FLOOR% + k = 0 + do { + k = min(k + 2, 63) + setAmbient(k, k, k) + if (!self.animPlaying) { + animPlay(anim:99) + } + call aim + yield + } while (k < 63) + state = 0 + // the k-th alligator of a wave waits longer before its first attack + timer = 10 + parent.v3 * 40 + loop { + call aim + if (hit) { + hit = 0 + lives -= 1 + if (lives <= 0) { + break + } + soundPlay(sound:62) + savePos() + call puff + call puff + call puff + %HITCOINS% + cool = 45 + state = 3 + timer = 10 + rest = 25 + setAnimSpeed(1.0) + animPlay(anim:104) + } + if (bit) { + // the llama was bitten: back off and rest a while + bit = 0 + if (state != 3) { + setAnimSpeed(1.0) + animPlay(anim:104) + state = 3 + timer = 12 + rest = 90 + } + } + if (cool > 0) { + cool -= 1 + if (cool & 4) { + self.alpha = 0.25 + setAmbient(255, 120, 120) + } else { + self.alpha = 1.0 + setAmbient(63, 63, 63) + } + } + switch (state) { + case 0: + if (!self.animPlaying) { + animPlay(anim:99) + } + turnTowardAngleY(self.angleToPlayer, 2deg) + timer -= 1 + if (timer < 0 && self.distToPlayerSqXZ < 25 && abs(player.floorHeight - self.y) < 0.4) { + soundPlay(sound:61) + animPlay(anim:100) + state = 1 + } + break + case 1: + if (!self.animPlaying) { + speed = 99r + timer = 75 + state = 2 + } + break + case 2: + if (!self.animPlaying) { + animPlay(anim:98) + } + speed = min(speed + 6r, top) + setAnimSpeed(speed * 0x1638e) + turnTowardAngleY(self.angleToPlayer, 5.625deg) + moveForwardQ(speed) + timer -= 1 + if (self.distToPlayerSqXZ < 1.44) { + soundPlay(sound:62) + animPlay(anim:101) + setAnimSpeed(1.0) + speed = 243r + state = 4 + } else if (timer < 0 || abs(player.floorHeight - self.y) > 0.4) { + setAnimSpeed(1.0) + animPlay(anim:104) + timer = 30 + rnd(30) + state = 0 + } + break + case 3: + moveBackwardQ(0.07) + timer -= 1 + if (timer < 0) { + timer = rest + state = 0 + } + break + case 4: + if (!self.animPlaying) { + animPlay(anim:102) + } + speed = max(speed - 2r, 175r) + moveForwardQ(speed) + if (speed <= 175r) { + animPlay(anim:103) + state = 5 + } + break + default: + if (!self.animPlaying) { + animPlay(anim:98) + } + speed = max(speed - 4r, 99r) + setAnimSpeed(speed * 0x1638e) + moveForwardQ(speed) + if (speed <= 99r) { + setAnimSpeed(1.0) + animPlay(anim:104) + timer = 50 + rnd(30) + state = 0 + } + } + self.x = clamp(%X0%, self.x, %X1%) + self.z = clamp(%Z0%, self.z, %Z1%) + self.y = %FLOOR% + yield + } + collisionOff<16384>() + soundPlay(sound:60) + self.alpha = 1.0 + setAmbient(63, 63, 63) + savePos() + animStop() + size = 1.5 + k = 0 + do { + call shrink + k += 1 + if (k == 1) { + %DEATH1% + } else if (k == 3) { + %DEATH3% + } else if (k == 5) { + %DEATH5% + } else if (k == 7) { + %DEATH7% + } else if (k == 9) { + %DEATH9% + } + yield + } while (size > 0) + parent.v3 -= 1 + parent.v4 += 1 + remove + } + + // the llama's dive homes in on the nearest target below it (g17..g19, g20 = best distance) + sub aim { + if (g20 > 0) { + aimH = player.y - (self.y + 0.15) + if (aimH > 0 && aimH < 2) { + aimD = distSqToPosXZ(player.x + ((sin(player.rotY) * aimH) >> 1), player.z + ((cos(player.rotY) * aimH) >> 1)) + aimH = aimH * aimH + if (aimD < aimH) { + aimD = aimD + aimH + if (aimD < g20) { + g20 = aimD + g17 = self.x + g18 = self.y + 0.15 + g19 = self.z + } + } + } + } + } + + sub puff { + moveRightQ(randSigned(0.15)) + moveForwardQ(rnd(0.7) - 0.4) + emitParticlesVel(int(rnd(2.95)), 1.0, 0, 0, rnd(40r) + 20r, 0) + resetPos() + } + + sub shrink { + if (!self.animPlaying) { + animPlay(anim:98) + } + call puff + call puff + call puff + scaleX(3 - size) + scaleZ(3 - size) + scaleY(size) + self.alpha = size * 2730r + size = max(size - 409r, 0) + } + """ + .replace("%HITDAMAGE%", Integer.toString(1 | ATTACK_BITS)) + .replace("%ATTACK%", Integer.toString(ATTACK_BITS)) + .replace("%LIVES%", Integer.toString(s.lives())) + .replace("%FLOOR%", num(a.floor())) + .replace("%X0%", num(a.x0() + m)) + .replace("%X1%", num(a.x1() - m)) + .replace("%Z0%", num(a.z0() + m)) + .replace("%Z1%", num(a.z1() - m)) + .replace("%HITCOINS%\n", hitCoins.toString()) + .replace("%DEATH1%\n", coin(" ", 0.32, 0)) + .replace("%DEATH3%\n", coin(" ", 0.16, 0)) + .replace("%DEATH5%\n", coin(" ", 0, 0)) + .replace("%DEATH7%\n", coin(" ", -0.16, 0)) + .replace("%DEATH9%\n", coin(" ", -0.32, 0)); + } + + /** + * Invisible referee at the exit: spawns the waves, keeps the llama's energy at the cap, and + * after the last alligator opens the exit (LevelDoor logic: g101..g105 = target and cell, + * endLevel when the llama stands on the exit floor in this cell) with bonus coins and sparkles. + */ + static String master(Settings s, Layout a) { + return master(s, a, false); + } + + /** debug: the HUD coin counter shows kills·100 + wave·10 + alive. */ + static String master(Settings s, Layout a, boolean debug) { + StringBuilder waves = new StringBuilder(); + for (int w = 1; w <= s.waves(); w++) { + waves.append(" wave = ").append(w).append('\n'); + for (int i = 0; i < aliveInWave(w); i++) { + double[] p = a.spawns().get(i % a.spawns().size()); + waves.append(" self.x = ").append(num(p[0])).append('\n'); + waves.append(" self.z = ").append(num(p[1])).append('\n'); + // the spawn copies the strat's matrix/translation block, updated only when the frame ends + waves.append(" yield\n"); + waves.append(" spawn<0, ") + .append(GATOR_VARS) + .append(", 5, 50176, ") + .append(GATOR_BONES) + .append(">(unit:@") + .append(GATOR) + .append(")\n"); + waves.append(" alive += 1\n"); + } + waves.append(" self.x = ").append(num(a.exitX())).append('\n'); + waves.append(" self.z = ").append(num(a.exitZ())).append('\n'); + waves.append(" while (alive > 0) {\n call cap\n yield\n }\n"); + waves.append(" t = 45\n while (t > 0) {\n t -= 1\n call cap\n yield\n }\n"); + } + String cap = s.energy() >= 5 + ? "" + : " if (player.health2 > " + s.energy() + ") {\n player.health2 = " + s.energy() + + "\n }\n"; + int[] d = s.door(); + String door = (d[0] * 0x1000) + "r, " + (d[1] * 0x1000) + "r, " + (d[2] * 0x1000) + "r"; + return """ + strat ArenaMaster { + alias wave = v1 + alias alive = v3 + alias kills = v4 + alias t = v5 + g104 = -1 + g105 = -1 + wave = 0 + alive = 0 + kills = 0 + t = 60 + while (t > 0) { + t -= 1 + call cap + yield + } + %WAVES% + g101 = %D0% + g102 = %D1% + g103 = %D2% + g104 = int(self.x) + g105 = int(self.z) + %BONUS% + t = 0 + loop { + call cap + if (player.floorMaterial == 16 && int(self.x) == int(player.x) && int(self.z) == int(player.z)) { + endLevel(%DOOR%) + g1 += 1 + remove + } + t -= 1 + if (t < 0) { + spawn<3, 6, 0, 0, 0>(10.0, 204r, 450r, unit:36+0x28) + t = 8 + } + yield + } + } + + sub cap { + %CAP% + } + """ + .replace("%WAVES%\n", waves.toString()) + .replace("%BONUS%\n", coin(" ", 0, 0).repeat(5)) + .replace( + "%CAP%\n", + cap + + (debug + ? " self.levelRecord = kills * 100 + wave * 10 + alive\n" + + " self.hudTimer = 100\n" + : "")) + .replace("%D0%", (d[0] * 0x1000) + "r") + .replace("%D1%", (d[1] * 0x1000) + "r") + .replace("%D2%", (d[2] * 0x1000) + "r") + .replace("%DOOR%", door); + } + + /** Event-handler probe: a big coin that bursts into three EnemyCoins when the llama touches it. */ + static String probe() { + return """ + strat ArenaProbe { + setModel(model:12) + scale(3) + collisionOn<0x20000>() + collRadius(0.3) + self.y = self.y + 0.3 + on touched { + spawn<1, 3, 1, 0x28000, 0>(0, unit:56+0xf0) + spawn<1, 3, 1, 0x28000, 0>(0, unit:56+0xf0) + spawn<1, 3, 1, 0x28000, 0>(0, unit:56+0xf0) + remove + } + loop { + turnLeft(4deg) + yield + } + } + """; + } +} diff --git a/src/test/java/com/eliasmueller/llamamod/mods/arena/ArenaTest.java b/src/test/java/com/eliasmueller/llamamod/mods/arena/ArenaTest.java new file mode 100644 index 0000000..1a68ae9 --- /dev/null +++ b/src/test/java/com/eliasmueller/llamamod/mods/arena/ArenaTest.java @@ -0,0 +1,159 @@ +package com.eliasmueller.llamamod.mods.arena; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import com.eliasmueller.llamamod.format.Level; +import com.eliasmueller.llamamod.format.MapChunk; +import com.eliasmueller.llamamod.format.Strats; +import com.eliasmueller.llamamod.format.stpcmerge.StpcImage; +import com.eliasmueller.llamamod.format.stpcmerge.StratCode; +import com.eliasmueller.llamamod.format.strat.StratCompiler; +import com.eliasmueller.llamamod.format.strat.StratListing; +import com.eliasmueller.llamamod.mods.GameData; +import com.eliasmueller.llamamod.mods.ModRegistry; +import com.eliasmueller.llamamod.mods.TestModContext; +import java.io.IOException; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.TreeSet; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import org.junit.jupiter.api.Test; + +class ArenaTest { + private static final ArenaScripts.Layout L = Arena.LAYOUT; + + /** Occurrences in the generated code (not in the embedded source comments). */ + private static int count(String asm, String what) { + String s = asm.lines() + .filter(l -> !l.startsWith(StratCompiler.SOURCE_PREFIX.trim())) + .reduce("", (a, b) -> a + b + "\n"); + int n = 0; + for (int i = s.indexOf(what); i >= 0; i = s.indexOf(what, i + 1)) { + n++; + } + return n; + } + + @Test + void scriptsCompileForAllOptionCorners() { + for (int lives : new int[] {1, 10}) { + for (int waves = 1; waves <= 5; waves++) { + for (int energy : new int[] {1, 5}) { + for (int coins : new int[] {0, 5}) { + ArenaScripts.Settings s = + new ArenaScripts.Settings(lives, waves, energy, coins, new int[] {1, 9, 8}); + String gator = StratCompiler.compile(ArenaScripts.gator(s, L)); + String master = + StratCompiler.compile(ArenaScripts.master(s, L).replaceAll("unit:@\\w+", "unit:0")); + assertTrue(gator.contains("ArenaGator:"), gator); + assertTrue(master.contains("ArenaMaster:"), master); + // per hit + 5 on defeat; master: one spawn per alligator, 5 bonus coins, sparkles + assertEquals(coins + 5, count(gator, "0x28000"), "EnemyCoin spawns in the gator"); + assertEquals(ArenaScripts.totalAlligators(waves), count(master, "spawn 0, 16, 5, 50176, 3")); + assertEquals(5, count(master, "spawn 1, 3, 1, 0x28000, 0")); + assertEquals(energy < 5, count(master, "popPlayerProp health2") > 0, "energy cap " + energy); + } + } + } + } + StratCompiler.compile(ArenaScripts.probe()); + } + + @Test + void waveSizes() { + assertEquals(1, ArenaScripts.totalAlligators(1)); + assertEquals(3, ArenaScripts.totalAlligators(2)); + assertEquals(5, ArenaScripts.totalAlligators(3)); + assertEquals(9, ArenaScripts.totalAlligators(5)); + assertThrows(IllegalArgumentException.class, () -> new ArenaScripts.Settings(0, 1, 3, 1, new int[] {1, 9, 8})); + assertThrows(IllegalArgumentException.class, () -> new ArenaScripts.Settings(5, 1, 6, 1, new int[] {1, 9, 8})); + } + + @Test + void registered() { + assertNotNull(new ModRegistry().get("arena")); + } + + private static Map> types(Level lv) { + return Strats.levelTypes(lv.wad().require("STPC"), lv.wfpc(), lv.map()); + } + + @Test + void builtLevel() throws IOException { + Path cd = GameData.cd(); + ArenaMod mod = new ArenaMod(); + TestModContext ctx = new TestModContext(cd, mod, Map.of("lives", "7", "chapter", "5"), null); + mod.apply(ctx); + byte[] wad = ctx.written.get("wads/T1L9M005.wad"); + assertNotNull(wad, "written: " + ctx.written.keySet()); + assertNotNull(ctx.written.get("T195.COR")); + + Level lv = Level.parse(wad); + Map> t = types(lv); + assertEquals(1, t.get("Llama").size()); + assertEquals(1, t.get("ArenaMaster").size()); + assertEquals(1, t.get("CheckPointPost").size()); + assertEquals(2, t.get("Coin").size()); + assertTrue( + !t.containsKey("LevelDoor") && !t.containsKey("ArenaGator"), + t.keySet().toString()); + MapChunk.Strat m = t.get("ArenaMaster").get(0); + assertEquals(ArenaScripts.MASTER_VARS, m.nVars()); + assertEquals((int) (L.exitX() * 4096), m.x()); + assertEquals((int) (L.exitZ() * 4096), m.z()); + + // merged code decodes; the master spawns the gator unit, the gator the EnemyCoin + byte[] st = lv.wad().require("STPC"); + StpcImage img = new StpcImage(st, lv.wfpc()); + TreeSet roots = new TreeSet<>(); + lv.map().strats.forEach(s -> roots.add(s.code())); + StratCode code = StratCode.analyse(img, roots); + assertTrue(code.errors.isEmpty(), code.errors.toString()); + Map listing = new HashMap<>(); + for (int u = 0; u < img.units.size(); u++) { + StratListing li = StratListing.of(img, code, u, roots, StratListing.Names.NONE); + for (String n : li.strats.values()) { + listing.put(n, li.text()); + } + } + String gator = listing.get("ArenaGator"); + String master = listing.get("ArenaMaster"); + assertNotNull(gator, "gator unit"); + assertTrue(gator.contains("push 7.0") || gator.contains("pushShort 7.0"), "lives option in the code"); + Matcher sp = Pattern.compile("address unit:(\\d+)\\+0x[0-9a-f]+\\s+; strat ArenaGator") + .matcher(master); + assertTrue(sp.find(), master); + assertTrue(Pattern.compile("address unit:\\d+\\+0x[0-9a-f]+\\s+; strat EnemyCoin") + .matcher(gator) + .find()); + } + + @Test + void refusesAChapterAnotherModChanged() throws IOException { + Path cd = GameData.cd(); + ArenaMod mod = new ArenaMod(); + TestModContext ctx = new TestModContext(cd, mod, Map.of(), null); + ctx.write("wads/T1L9M008.wad", new byte[] {1, 2, 3}); + IOException e = assertThrows(IOException.class, () -> mod.apply(ctx)); + assertTrue(e.getMessage().contains("chapter 8"), e.getMessage()); + } + + @Test + void probeOption() throws IOException { + Path cd = GameData.cd(); + ArenaMod mod = new ArenaMod(); + TestModContext ctx = new TestModContext(cd, mod, Map.of(), null); + ArenaMod.apply(ctx, Map.of("probe", "true", "master", "false")); + Level lv = Level.parse(ctx.written.get("wads/T1L9M008.wad")); + Map> t = types(lv); + assertEquals(1, t.get("ArenaProbe").size()); + assertTrue(!t.containsKey("ArenaMaster"), new ArrayList<>(t.keySet()).toString()); + } +} diff --git a/src/test/java/com/eliasmueller/llamamod/mods/arena/ArenaTestMod.java b/src/test/java/com/eliasmueller/llamamod/mods/arena/ArenaTestMod.java new file mode 100644 index 0000000..8ff7379 --- /dev/null +++ b/src/test/java/com/eliasmueller/llamamod/mods/arena/ArenaTestMod.java @@ -0,0 +1,56 @@ +package com.eliasmueller.llamamod.mods.arena; + +import com.eliasmueller.llamamod.mods.Mod; +import com.eliasmueller.llamamod.mods.ModContext; +import com.eliasmueller.llamamod.mods.ModOption; +import java.io.IOException; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +/** + * The arena with level script options for in-game tests (not registered): {@code + * APPTEST_CP=build/classes/java/test APPTEST_JAVA_OPTS=-Dllamamod.extraMods=}, option + * {@code script} = {@code key=value;key=value} (probe=true, start=x,z,rot). + */ +public final class ArenaTestMod implements Mod { + @Override + public String id() { + return "arena-test"; + } + + @Override + public String name() { + return "Alligator Arena (test)"; + } + + @Override + public String description() { + return "Arena with script options for tests."; + } + + @Override + public List options() { + List o = new ArrayList<>(new ArenaMod().options()); + o.add(ModOption.string("script", "Script options", "key=value;…", "")); + return o; + } + + @Override + public int order() { + return 65; + } + + @Override + public void apply(ModContext ctx) throws IOException { + Map opts = new LinkedHashMap<>(); + for (String kv : ctx.option("script").split(";")) { + int i = kv.indexOf('='); + if (i > 0) { + opts.put(kv.substring(0, i).trim(), kv.substring(i + 1).trim()); + } + } + ArenaMod.apply(ctx, opts); + } +}