From 975f305fa1b8b3449047ce7b36d386874cafa12f Mon Sep 17 00:00:00 2001 From: type-two Date: Tue, 21 Jul 2026 02:09:20 +1000 Subject: [PATCH] Round 4: balance-arena harness with lua telemetry, minimap radar, damage smoke, harvester-attack warning, Needle Drop + Compression maps MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes a critical bug: undeployed MCV vans now count for short-game survival — previously every match ended at tick 1 (all players 'defeated', local player 'won'). The bot-vs-bot shellmap claim from earlier rounds was invalid for the same reason: shellmaps stall with Bot: players and matches insta-ended. The arena map + tools/balance_report.py is the real, verified harness. Co-Authored-By: Claude Fable 5 --- MEGAPLAN.md | 2 +- mods/vinylgod/audio/mc_harvattack.wav | Bin 0 -> 94844 bytes .../chrome/layouts/ingame-player.yaml | 12 +++ mods/vinylgod/maps/arena/balance.lua | 40 +++++++++ mods/vinylgod/maps/arena/map.bin | Bin 0 -> 5797 bytes mods/vinylgod/maps/arena/map.png | Bin 0 -> 86 bytes mods/vinylgod/maps/arena/map.yaml | 62 ++++++++++++++ mods/vinylgod/maps/arena/rules.yaml | 3 + mods/vinylgod/maps/compression/map.bin | Bin 0 -> 42337 bytes mods/vinylgod/maps/compression/map.png | Bin 0 -> 1281 bytes mods/vinylgod/maps/compression/map.yaml | 78 ++++++++++++++++++ mods/vinylgod/maps/needledrop/map.bin | Bin 0 -> 8837 bytes mods/vinylgod/maps/needledrop/map.png | Bin 0 -> 517 bytes mods/vinylgod/maps/needledrop/map.yaml | 46 +++++++++++ mods/vinylgod/maps/shellmap/map.yaml | 44 +++++----- mods/vinylgod/notifications/vinylgod.yaml | 1 + mods/vinylgod/rules/economy.yaml | 4 + mods/vinylgod/rules/player.yaml | 3 + mods/vinylgod/rules/stream.yaml | 3 + mods/vinylgod/rules/world.yaml | 1 + mods/vinylgod/sequences/assets/smoke.png | Bin 0 -> 607 bytes mods/vinylgod/sequences/economy.yaml | 13 +++ tools/balance_report.py | 34 ++++++++ 23 files changed, 324 insertions(+), 22 deletions(-) create mode 100644 mods/vinylgod/audio/mc_harvattack.wav create mode 100644 mods/vinylgod/maps/arena/balance.lua create mode 100644 mods/vinylgod/maps/arena/map.bin create mode 100644 mods/vinylgod/maps/arena/map.png create mode 100644 mods/vinylgod/maps/arena/map.yaml create mode 100644 mods/vinylgod/maps/arena/rules.yaml create mode 100644 mods/vinylgod/maps/compression/map.bin create mode 100644 mods/vinylgod/maps/compression/map.png create mode 100644 mods/vinylgod/maps/compression/map.yaml create mode 100644 mods/vinylgod/maps/needledrop/map.bin create mode 100644 mods/vinylgod/maps/needledrop/map.png create mode 100644 mods/vinylgod/maps/needledrop/map.yaml create mode 100644 mods/vinylgod/sequences/assets/smoke.png create mode 100644 tools/balance_report.py diff --git a/MEGAPLAN.md b/MEGAPLAN.md index 9b4b74f..7058829 100644 --- a/MEGAPLAN.md +++ b/MEGAPLAN.md @@ -198,7 +198,7 @@ faction, or it reads as clip-art soup. Fix the Blender camera rig once, reuse. Learned the hard way on 2026-07-20 (phases A–F): - **Smoke-test any change by launching straight into a game**: `./launch-game.sh Game.Mod=vinylgod Launch.Map=vinylgod` — `Launch.Map` accepts the map's *folder name*, no UID needed. Run ~45s, then check `~/Library/Application Support/OpenRA/Logs/` for `exception-*.log` (renamed with a timestamp on crash — absence of `exception.log` alone proves nothing). -- **The shellmap is the integration test**: it runs a bot-vs-bot match (BotA MRP vs BotB Stream, `Bot: wax` in map.yaml) behind the main menu. If a trait wiring is broken, the menu crashes within seconds. +- **Shellmaps FREEZE with bot players** (learned 2026-07-21): a `Bot:` player on a shellmap stalls the order manager after one world tick — the menu *looks* fine but nothing simulates. Keep the shellmap a static diorama. The real integration test is `maps/arena` (Lobby-hidden map with two `Bot: wax` players + `balance.lua` telemetry): launch with `Launch.Map=arena`, wait, then `python3 tools/balance_report.py` reads economy/army/eliminations from lua.log. A map validation error (e.g. bad `Enemies:` reference) can also silently stall a match at tick 1 — always get check-yaml to zero before trusting a run. - Chrome image collections must be **power-of-two** textures (a 48×48 png crashes the renderer). - Every rules file must use the same case for shared top-level actors: `player:` not `Player:` — mismatched case = "duplicate values" manifest error. - Speech notification `Sounds`/`Speech` blocks: set `DefaultVariant: .wav` (engine default is `.aud`). diff --git a/mods/vinylgod/audio/mc_harvattack.wav b/mods/vinylgod/audio/mc_harvattack.wav new file mode 100644 index 0000000000000000000000000000000000000000..d3efaa129530292958c399a3b241140fb59e3a2f GIT binary patch literal 94844 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 tr!=Yynf8{7u)kk1ChnR6o8QtZ) zlchX<2j}@2SEEBXCp7{8X%0%9AH=LX2um{Lzcz(Hy~uYMv{NJs!l ziu<5-WV9N=COOY*jKW3f8@v{Fv)}CkX}JMHHVhs8!Po~>7<;*9fC|a3KD_2~@RPHk zDBGwfUx<~VVw=f(@8^o{sWl`QxhMJUr=pam#Vokox8CDAVlX}$uI$5 z@;490X5tK$8>Ul__-u~#6J*y)pPd8B&C~Qyfg=1JJf3cq(m$fto#b$Qcw{2@aYV zJItQhf?1Il?oEIz4LR5Nye!XR%&M!*pK@TY1wra+gW}D`jqe08WnYlN@8E*W13xH_ zXIlqX5&W*s-@wryc#|hf?)lJ zz!$ApZsBdL4zuH4tdd~G4hTB);5*i}=xPfSWGOTDZ|>1i?nNs+yh?%xdpHM6f)*CW zQLhD9gr7_-&Mg=oOF|pB00*rr;Gr}5y`NYQan$#zvw>*8KheNw_K20><)gUHU-{X8 zK`n~8uH%ZeKBfwF;hokM7J_XT!n>}s5I?z2;P~(nekU7UJy>^lVGI2Ne`Faua|Jvk zX1JE3fs46*2On?=dt9^e^!Oi0;-5qy&136`M2=F8nh7V+$IST|mTS(~4N%;;vtlHs z2s(PHV_+g{VolgX`hcw`x|*{4e~J%C0#Wj8@RerlZw7xkFS}-dedd?g56(>Xw{ldw zK46C$h^ONj#=0)|Xf)$giF@!gHkJx@CH9&#Fgm|=8gpk`$Fh(MI(R=#V4vI%BjqON z&qYS3YGj%sJ@*JyZ zd~A<%mEC9(SNJ9OJrVu)5!X-5)rmw!zv5-0e|#{}h<{bA%zTHL$hXz^knl ztA=9uEk_pzu@n>&^bpS;U(TG^kS(aveO7VGTQ)-9BVe^8hH&F+N5hhaW8 zbThYk-V9UCX>4rNTNwY-CusHcVp=7mq4C=I&uC|CrcO1QNVN#npGv&{O|f~dUzweg z#g@WNF(P)63MkEFRqd>#Dr=N~AsE(D&!O;L=dSCX=`QVFq|SA(Q%AYeRZ)GW?oke^ z&y{>AdFIK#Df{J-@*%mKlt)gMcH;=~kuU=njTHDzI?iZv43ALfbGwN1hjrdsh&pzt z{jZg5Jv9GB={Z9GP%om5k6weAto#V~tf8;4i zzVf~LgZn=v8=1)+B?qdrX7YCNu8;LKz5m?xbs&C`t#=32c-y zq%OEb+@h{LMOrO=BQ2NCi9d0L&6#gy@iKjgDr&g7+xW!zT+gT7Lw)#dXh%jydgrt= zZzFFGy}J0Ss$tsIv@MzL(D2N!BYG%BTM$jwv)Q>~4dqG7SQJxrJTpDh zy_>xceP0Cn1|}sgPUxI;IiYLt%ivUh^WbBDdw);gGS5j=k}K8sl&bP@sT8pL88X4F zobnaza9+yxb?*AF= zCtcZjkJDk%y+E;(d!hFW&wWpC_X*{(GBvJol-kIfWkEhA4t6zls#ycb(DUn( z-Z9!nI}<z8G4cx+U%J*W2H`dR_Qc^H<}ZfBL-R(;-jVKK}H{pU;d}Wz&a;jzmLx zS7V4>)4a?oYvZ!j`rh}G`zEVdi)KBRWmn3pQg7)V3&4mp{W!R&&Zd>pz=U| zAdgbZa5YuD-8`*)8Sc^U(rN*;#SNqZ@)c09uTd99>?7tsMj2GuPV{j!Z)AJ;<4~W> z))~dq?xfy*Q~T|xH)UU!ef8kk>ZjKqS9<)*WBKW!7p30X83!Ym^a9payAUUu$F*4K zDSN$T0=JV&rwq+HGh3gmQnqa=C9-^-d_VD@r0z)r6H6tm_2>4#^d9h}xhpF>7|E&d zUq=w_F0uZ$3ZfOw;~Gp{lQTAzNOwGJsfSKQG#~Tjfl5{Nys}q4q)u@!cLz}VW%X{L zM)bb7iyBoPNN1!LQdzO2;C3y7Z}qWN-#Dx#McPHTgkMF@hZ~2baE{R9%rhD1)89*5 zpW5l|+PC_fYp-{`YX0KC=kuQRezyPFepLQy`sz>>)JV&mWn$QMLb)$)klVV;x@#qr zOk9-3%vw3?m24kmOHOH>WlzG0U1VlSmC%0@MpXQDF7(@uTl-5MB^&?&`C znUd{Qwk=t|O&OSM1$F;CUk~pyZ$*#jNn$r1s@~+CY!il&HGD>VvI;+|Cg?VN@FmI$ z&B$@iiPNaU9FS(jl~+)k;KtkrM0$1;T3h%kY8F#n6?|#?Zf^Q=ze$hcjnn6w26}-Xu*<+xymd z^YZo5*PUMN!O>>=o1JOC&>z|XGc`6$+^T%%ZjZkEjXKx+v2Q^jHF14Xovb6X4$XEZ zYyFgMN!=4p`z!kHd;fJSo`&iUuIrX^TrMD$7hkyw6VFPnubuZ|ot$|@B==)`h;Fxv zZv>s(dJfv5Gty*Kryb?B%2Kth+TA-DsUkpP;cDTl;l<(P$j)%R$eZw-@QHBK(1`Hk%z7au^RtZO>8|wp zX;Nyrw?Did_*#3l=JhXcQ_^3BI_tgdwL*1es=K{+owtJbu6KsFx_?*TMZ)~#hAFeN z9?yCx>%Uq2$?by?-vdt`cYD;slVz2fO*whI^p7}&?Dk9)w$v~#QOW518sRwR5q^fx(+|De zOjPF|8$NAqq(*pn_;RROxOezU_;F-rw50Yim9-(!4d|wSi_8wM2#pW*%=`sUtA-gD z(@v&decScT4tDykZ+}buC$oHXnfYZbRV?k!?#be>;LGPP?%(9s0&^0MB{obhkMY5O>tf7ibWfyS_@nUep3xm-NKn#R8P^%=|Syi^fTN;z6|FN)yjN7^Im$H z^v~1WT;qbbzrAglb~OEUsDSp5`ByBvR79=Io>j!>^4<4&{2%+<2G0kVC)G|KoJCFP zm}Po$EWsVLyt6!MN*#Hd)Lu-0?GS)3+(7u9szemM*a)YiJs%$PS?4=k>(&rcY!jZ~ zxul87a%uU0RJZ<=yK~x3ms{c%(n6`F9#kKzpR$H8;!Tr>^WbB#Ao2e+V*M|`!#=aS zS&NMq+TLiH$U;`$w$Rw{@$jWc|L8Q$r61KF>euzZ^`JgOyB~cOiG;I+7i6~1^kIN9=&?RUZ-@1PKKt%Do# zi_lEEDb_>jKTpb!f6+GZcT>uS!tz6|`n6nMxhg-B^T{Wq2GUa^!#wy|*p8P<>H({| zRR=WUOFcbWBKlrrMEEb(VoGE%IL{Bb#y!)g7@dqp#s(b^Iqk?d zok;s9wPD)Ww6^K5Gs=WdMJt;F9gmn_x$2(nz3m(8|JiT&Py2@lG6RvIH&ILcH)(%T zxui=8X#vOA+S4AlsD;$B6yXmTxw&B6E+n6P4_;R@G`Y{6S#Y?*v7b;UY=CX;qH?zw zoTZDjfW7oFI<=Wnb*UP&=IFA(hm&Mg~N3MOsF#M9xR&YisrX#tJILZ;bQCNFw*JmP30R=@3!F%|kgdCuVd{ zzmRr1^?2&U)Nj%bq*o8siY_vGIE#fI%0+iw-$~zn|2F@)z{bF%fEDbPus`v$q_m_X zNoCnl_XQ^UzV=L1ljOg}GVBoj$*D8pQmRxl=2D{yqO563=DQ(|=rZrFxtdTLEG!Na zQ^he-NBL8^7Ha-MQj}`457yW*Aq#A5LHb#`f+Bf1o<&1NTlj}D8%>_v3kGqm*k)WS z*W2^0DP|MA{~Bs*qrIa?qI07iwN~0^`YpYK@yfVkOa(7LYFfr~W3QfDKO5~C85y3N zc_c$m`#SB*)aj`u!AVc29|$FBUz<&1OT~$5hUaI$htJSn&aS+aD#;&7M{!hH#5gDw3W7>t+%Jt3# zz5t(n7yA|mnpW0UM%%Q@ZwtJ=`KH9%QK@gz+l0^R={7EN$^y?(e}Ukm;DO-XK)&Ghz-Pgx z2@4ZCChbh>n_MM%d{Wnh{DHqb1=L?9omggvec8@KjWX_%af+(d2oyGdQL zwX@W)hv2bL1lIfwJPs>L2~wssO)4Pgm5x)>9ZxrhZ>T(0q)zg^t2=8UUO9aVPrI1w z5p|owv8A}kSD`NSJ6zmh)B~P6lk9wC3L(SLJL>(kaI`|SShPy?qv+14PphMsGVYk; ztr}<>#@KHAhFRQbuJw;J32n~!EWK7*pVa4X3#MjITc6%5Gcod!KHP38Br7SNx4t=W zT*8S16W1iJ=Q%CuVN&tr>B;%vlvs(03G4hTJTYSZu0q3DZYRaAXx9R9$PfE!xs!!j zQ!{i0WvS_0iB+bmTLR3niTFw^EcGY){Fdi6cAwhPD=P3ag*nvqGGLO|fLXnon$vD- zdT*$+`i0ZfDoaxNxI_(aG|$he@BBh7xM^%2^@IL)Ys)rz=vB4rk-Cv1VQ*wcjGGYUEra97b)DwQL{u=6#@nTP6iEGp%!d&$z zaJVMq-hYGL+_m=Eg~$^pqYUXOK0$l2mRjdXYB|55lDG_CK7Rc%r=v3sgeYcutV@R5 zIG~@=CbF`}NApMPYS*;d)E+*z>%w^LO?5Iq48ti_Hgl_9P@kd|BRAX@EfviX*$~Q= zX{CRe{(G8}?$0#CKI5LfS{m&c7A%`QDQmXu6LRdz{zbNaDKnDiC%y@e3DyRwf8!7O zv-?8s#%g0J!Sx5u2@|yK(VWra5ucVw!iuRYLS3eZ}K5{KmIl4%@r!O`S+kZJ4yG3s5$-i)~ z$8mn&po73h(1d4T0`*})FOL~0-g2R5*#`RmtL3w*f%yG^<~b|wG|h;;x=>^5N(F6! zoy+>p=tlIRNAqZ(>bjn83^6-f9c=-f-%|8)qfwp|cmA@o;`_0{Y-uWHE3=51*SuqX zX+5;rlU+^3_R6o`KEYc_MY6O=S(P$AC6J|R;%i?nPagGqkiS84VYv}!P-}6sa64Ae zK4^IKty(|bz-3~&@yMLweCIkYY!}LkwWYu0@9>GbqH0Pbb%HWh=>UVXMC_U++0(6b zyvlEx31&aDF8sl;mJnSQ`7rvmHd`;uduib0#=|(s-^eA@cO8IXUkK&iQ7Vv4sR1ia z624ZAjR8h>v!R89J)Gi@s|925U#zI}1oUd2H5cLVS1wyvB=wiSk`4U2x3h<~j=iP6 zHo&wklX%P@Nu-D7&dg+33C)XM$`T)VDW)BMZ$0jH{AbR1ae z>PaRu4Gi=Ld6IliUZ5;evqGDH;oaxYm#`!$Ik{U>?}WO6pudT?fO<{XP5L`qA(zw2X+S!N5n1t`JU*fQ56p^h{{F0M3F6lEpx{YW?=gIpiSR-pd74+8!< zOqC}@L2amB9@S6ky^OWyX}CWlaH{$n7x9^3uUGML*@ClBCRNm((kG&q`r8U(j$zEC z)6N*Kepu`kdadcWMeMS+SW)W}bdj_0gI2&zX7b1?EaOxdL@$C9D0&C8&oyz1*|s^% zoMGm&EbE57-l>C9Xe8)GPiG;h% zO`j~9Xs;N^w2m7uwW47o{Y=`a z)Pzta?IWS7drZ)kG%lr4){JB&cun0U&y;H_SEOas6}wuajFVBEwX{F*Re5S|iTzCl zeu|x7e4tk|x>+APWrZj5Yxh=fnzxhpp!>1h1ZR<`FhD%-+F^fhG}PB?i?rEVQT>21 z#wzDbr*8rX1ar8Zlh;*T94eKgUqe0|;=V%>a76x-UF|Zwz$(t~))J$R{#;Xrs6zlBlAp+WDb+JCgkGnWoOh2m|H9pI9%*j?&JHTDq&XxAU(>*4( zky=StU_q&3KVgFF^H@9lgAU?oa~QPYF=*g+Fs=QlZIkeuSubXaX`t@g&~3IMW~&b; zsjJwMkB#~L&xKoHqw%g|5wt=DsDrdb4LA#Y*n{5Qd8eeFNSt3AWy^gy027Ia{sOc8 zALmvwndw`4Fnonx@*)hpb5bGssrUvYFe}WN-&l>k?GbcGz;g>Wh-CM{i7{#=vlh-1 zX|=#5P6i#DPfov2_+0c$J;;B)5)Xl-4}uLa7YF!Z^f$^0O8zw-W6SK{&>#0j%X$pG z;W8BCRk>?-@J8K4tTLLMqP1wDA^w1x%t+!AH<(v$*fnGMdu7>EiV|%dq}$HaSS|44 zCahhDvuHcmPf^yxHdHUqSp_)A!#Suxth*egO?75gJJdT7^hK9hZR5fC>Vw#n0G)db z$L5-o4!7V143E9w5oOR$yQr2;aQ;BYnUxqX8z|Vv>=$LpbU3S|5bk%a=MZZBV$azLM23F7~TJad%tpju7=bC?#Xg9 z@mE)UQIkSSP2bJnnB>f)o54k%>~iziR`ZQ^E>bo8Rc7PR!svLbg3w4_sJ8K5@!t(D z4o3X}FQsq!9u+~2_4=(f!}`Gfk=^D5yJLMzX6`SvI$8V8Z_HQlt!L41BI3$J=Z)_2 zfAS5vq#TqUqMa`7YDF)oti(k=*2{Pv-SLk3-r9r9R||VKYVTY)@cTembuhHyLX6q< z6}o1VHMtZ`-c@$XfyAL*sEd39??3?Q-iXe8K0J^Gd_2h5-{vd(iQap|c}id>eG67t zSeObPyd6Y)36;^&jeR%rZ#m~*8D_13|68m6xT#2eGmU@34OMuvYrPG|B-(=o50kH2Vv?DtzC9=$s$fefjL1UB&5&4t$K$ z*s;(>*RT&;!`U4cST->rC4yK57#&^FrGJ7hy`M11HHB#EL!6&pqpYrL=fQ`w3B8d{ zf&X0>?u&P%E%H@79X+^ae&zegzrp{&SKYhZU0+=(KM-pPt7Bc9Yj!p?=$m5Q8HtaD zZNdt)`&(F(m0%f3!g+WhLl~?5j9E)OkTu8SWV1(e7ECkWH;)-73@>c8G1fYCFyEm? zbb+|{i~WHY+gPiwS;8>123lUNyyn%v)>j(4%z(YcSqZAQ3e@ul@Y?H~lzlD1x=xh4 z#rlkE4cHBEgsjb-FvJm3Kl!b4*j?FMoZ8bm|G9t|+=63iLEklxp|({n!0_6}ik5{> z(dE(W2X%Z0u=R#`G>u`+rwLbZVatNXVKlSis5qDN@+&f(pqM}f(PF3jj2$N(htOx{ z4P%hLQ>(ANiT)W?$rQ?KN3|OICA}Tz$1THWJ}^E54XtmC(LMUFT48OWR#C5KR5zcP zt*trM=V;dl*&%knvd%VFZ)vsqi?>MdR$_(ZYdB^f@NQE&iBn?Z>@!9mEfm=jy{}KR zW3ey9X7YaJ3-=O_;vMWQ=KaR=*nQW%-F;Y{g}+r^^(Fp&sp2G7&=@C&-5<=et$D~) zaR!aM^!_9KPwWFv?2S}JzAybQYn=EEMN#yCR4jncA;-4aORP2KLUX3Mn)m)#-*5bF zgp56=VcoaC7VL8;5l9Z<4EvwWH$~x&79bq=Q zQezL{S}0uEbyUy?>BAEDT&V(6s(37s6;q$+umEw^Z`7W4!e*Ka9^cJrZ?~~LbZz+0 zDrA?3(|4K{uxG9HD0hzASKzijfh$|zxr2kj1gjTg+Q}GeWHScqpXoW65tE{AqPe5x zquHX>qZ^~EqPwDE)Q${~?2OEdu8W@2F5!dfwX(ngA5KT5Y@FI@;(6()lGC$2&><;D zO4F3xNpBKT1MmAMyDv!lW4*0zW_z=+Q^eJbd0SAPr`GnA_vP}P@U`_F_U7?c^{nz7 zqYs7Z&hP$Ay)N$)OOZL8!*?;&?24M?GZ=JloMx`x)S*(P`FQK)0|&^e^phXTOT=d4 zI!@hzVm|S%Pz9{n zt8C0-y*!R?f>XaV@;yG=W9Y(BEj%zXF47>fo*L!f;eW!-!a2j!!=uB8BL%gs`g8p| za+t5pN7hvPAI^egcHpx3=Ps9KDwox9-XDBUFg>wc@`A+e2~z^U`abqA@R;h~O1iKS z9>g0tpr+tO`%InWzUXQ1z2I5no$D4nbKIvqw>-almbmx3uc)&6T1w&CGQfSNz7X?Er^TbvN$Iq-ALp=EL|Ol1hU9~7P}jVYviwp+S*D^h!TA|^ncP2-tXcdgj`ebviG094?8>5Il2%^zioGX8;6!5I~ zl=e*t97~*<^f38S;@)81;1~XbzOMd|ySjS`d3y(?Dt`H&yGOXccF%V&_B8i(^VRm3 zMETX-U(Hv=f5cbNcgpiz?IUN3-;=9Mf`j!QoRbPpHG6}z6-VfzFv5O>Cqq|L^8DP= zeB3oB$R*_3a(Ak-YlJVz7!qTpVD=8PCR!WK#oVzYaAEVB2aS3-JFYTL8s8ZU&5^K6 zkC;2*^ES{&X%)4jxO+!JWx~0^R5C-+P_A$=+$6j@d?dUy{6#o>_(G^bxNA6Hq)7B! zbgZ^mUqc@2HJ8^i^UgI5p5Va4=Y$ zejJm^SA2C$pwSbn>< z)!%Z=on}X~f!>a`+$Bs~OVC^EXDMq(Ad`a!K8_0Im$bCEsK?$LGHd%7FfpcIVmdM2Q`k6Z0eHmu@2Y9^x z;2G?_?mh1B9LO46AE*>a_BHp8bk}e%R|+YA!BJm_GNmo3#g`}m%2ACS2Os?ukx_S{ zpjc3fN)f3r6`~*TdTc9{aAjw|Y>lJI?~KAIYdea-Cq@^exIS0=2OMy%HbPsbHvvoP zW>kbb^im(7&(^gJ?2J&s~`Q746>jF^a5K%9v23kgMeYr zvF5wpU#|}}t{940$Gl?HGV@bOo6N^A&8cRpnT;$jCt1&8*A!ur_*N>e zu5#D(=JH+hPWD~&wf46PbPf0dQ~d*d|MQK&h5mpq>TT`Kb&qxTbSJwvsz0l< z)e`D_H4$XHi@H_GRH`d$VOu?y4#PH&;bQcL*-#VapG=2dw`<)y_HNv5OMmB6^gW!# z@2PR00~0ww6x;xBfgbFhGh+pC!m8sOw&_wz=IXU7pblMRHU_0SVH`4M7=7s}wO;S7 zyHJQ-)6QwP;a|fg+Uw{o?sG;oEgFtW+F)%f_1J;>I{jb$GEDnaTw}jthq*@Q zr1#BY<~$;-Hgw;sgcnjld^9V;VazJD#-a8vsS8$iFBQRk%sm{gMI-Mp?*VTa-v(bR z|2+Sn{^fkU>d%d`?AyR3I8kK-H3A<7-V1mG-}p0pU47fVS-gLE%HnnJala3%tAt!r zT7=6{8DSEP+^L{kuW;CSpUzoPZjDruqUU(sGsE3zrlFVZSfBa#?-9NrTCJ^W*MQh09oQ20$aZ=__T z0%zs7k@U!L#-pe9k0ugN{Gx~SfsAE2=E8ZiBJB6C?P@3_<`BtTcdZhp(T#Dfyi=L3 z3hr;*iJq69bk@Qg{~dpYz;}VA7@3p{P7A&az7B2;mI}Lir|=5ShL48L@Q0DfksXoDNWtj$(Kpc|+5&K}kd~Dwbcnu#{onwKi$BdG z*4N}g%V7cv@Iilb?V&eyP4=s6@=v(HPjF}PSe_N$0=@;l*S@Cyr~bZyHG#c>zXC@C zr@;L#1rEdM*%(+5s2xb-gsAV=eBYvlZstAVY3{k@9_PNLHe-z#XiP3qIXgi#@P_Jy z1us57JHaw?@QCxhQxoj@3jS5&;bv8|efEFWW@|pGu9j8~>xlWi*%M874)d0=)fi^@ zjWx^$uYQ;=W|imywlUf~T88-WYUFg}@5r3Ugh=m5d+_Szk$sW7kzlk)bU<`R)FGZ& zpxxE7GlDnP~6!jM-Qd%B?Gs!T;c-ah^f>ePLf6E1mWp~cibML%f{$1bl%M&JfA0# znKuI2$bs_Yp1BW~{YB<@T%YTK)o#J_x0sQt?_@_PsXt{j`VudwT4wZ8bPe~sbF^Xf zlW2$NaM0c@(bLgT)I%mVRokN_>W%f;;GsECMjbKS)cU`s;=0FF(CJLF?$Ie_B$0V> z6moUof$w)s$0PQx__I`BPF5Z%E7ZR3a-O}O8feTd?+o7yUladG{}2A1{;li`PyAQ> zZ~S-thx{|qNT>T&_y+m}-z2Z*>FxQCQ}vqKSlz4SS0><_okRK`tdwa~XTN2ioQ8|a zE~g)rzDx9!XbP(HzX2+Q_Trk;;ea1+}gF z035ryp0KBqcZv6uSA)0mp|1lc$OPXk-(+7OUn!r@chS4RJKCGwd)m{37;C&+WPk9h zzbKM2Og<~UkHbM#@j9BI7w8#cRL^R{?Au0#xxV9vv$)tE%G_u{AD%*XfLdTC-uklb zx3lqC7CzVcJdNi$M(k@&kDS(Ja~u0yCp_g}vy1jLiWs_nO+Th@)|au5%pm6&iT3J8 zuz|Il68G`wZ%pR3o-D91*v|?x-7G;BVF8ZmcgWasqC8!SA7Blq7mSk!PKnqY>OQmI zMZ2G%SZamlsyiJA#wxNpLcOZuo8dn0j=5`kI(ok1(bv<-)6LV?Q_)k(qq|SJe|2|q zm%tusrP@*Ts_T^YijD7gJNYGAvut=%)Dj=jb-bAH5baDS>Z`ZOD2G!0QR$bk0Y|>6 zR5Cxt3og-lNe&rz^!tqyWi)rIj$MxqdzIKr%ixfZgp0*p@Q2M*#@brBt$V2Hx}XHi zYvzKVonc(WrQ>&Fv9X-JK;`a_LVvc~ylU!Z8S4vcm37O?!mHGv%WzNoJAC%eQFRTI zvHEeRYfc2S$1&mFFNRTH6W+1_l6^}kDUKI+iS;>4OUV1>T*`1|o$`-zSb2uBv8y^m z-3*^@H4(%Db(%U{{ft?Vp3zjdSl~*y4*&M6@K9OeLpW^Um+E8I{Z=s$6OC=MPdnS!K_+htT(=IO7ntbn7Me z@)@h=3?Akis2&bOf8L$b=0|4wcGlJr)Ua!;CCs4jIfcKpW>YEqjqEjrYR-E5G4-%d zQ1i97R-jq_)0z(YRRxvY2lN!~ubl*2oowL`EKZebi$|#s-iqyZc4LJ z6W*6H!BQ58A2K!%_o9d8HJB>(gJ{ z3{j5{ySra$p4bW>BQNEbmra*BJk zgDT)^>e)ja)!B-t`!8rkzh$<(k6JG`4EP%MIjeSY-H(DFF;9V~=9~l!kGyM9` zx`d8&v9aG+YdoexSIhj$tY-Smv8TA=iLuwjYLZNl%9RbI)MUr=I?v&*{{7-CfN+hx*h`Wi!0x!pd|xiW7GS zw3^lNJ*Xr(FnvCd;@HXqd=`Hcr^5|hj&tTv6qqI+pqEh9?ZPQDu2z@`H>MWx#&fhM z|DrNd(bP%8aX3ZgK!dk4E(_qJRKfdm4~SoOJl#97vuNxe&)8#sC;oa%_l9wtykpGn z=0FtdGNR0aVo-5v4zP7NP`}&G|>v@I}JvBq) zaL28=SGrT&ZPba(6!@_8_o*+9lZK-Lcq-k6Hy@TRG9z}wrFg>HJ1S&{m-qtL`%B^^ z@hLdc4kE66_*}1~dO4oVd^@_!>u`>DP{A(BqcMt+?aY@RU>*IPyTqf97=Z!Sch(0W zFNxGp|3vG#nd`{Z_vnZ9srqDnkY0*<Jxj%BBQ>Uv(m8szDFQsJZAQjlvaHg`tdfS70dp8uK z&2ZqXK_#{X{Tuo)L%x9_R!J-*W(TXvLU)|%!gkbZrKs9fLbEv(4PXuSl1tzo33R%x z;6!kys1IkXv~vUxpzDl;hYmkui4ZVfX$MZDjmBm3s(m2VN%Y9i zm1pXC_qQIp)OZVcx6-4ulfN;XlN@B+>v0OG<1OMTL$3l=U8a1i)Kfl2A>Nb@3R9@I z&Bm>BGA_O%*L_C(Py7rZD;5(EbU3IE;n`r4vE6UFKkbN)8mCj<%IH?zacesM8#Lr~m z5A<_nV4HBS_(gBTPSKndv|SVFs{40jL8LNV)IO12k&0w2ZS|-03H%tXT_b6itg}95 zp?J6qnz7F_hyKDZ{eK7c2dV{X`BQx7J+s_R)h^00dAYocQ)UHq>CLQwzT$7h4No`+ zHiMYY6D|m&#in4{KcOe5`xtx2Ixz%yA{SjLx>L3M3VgK!EQ9e*K&yc@yy7}Bvur~uCf#OMETexByktVYfE7P-h)&Ws<}N87@--3PMuN%TqN9&HvnP~rPC{3AK+ z1#Oja!>Sc~?Xtv6(h^0X&t++PmuT**o_s#RUo23FYQ&Fz!GGAh!_&@PL2aR&lF!O( zz}aPbwHX9&hf4-op>)H|ktN!~|=&i&F{aV^yaI3iOM({EEaIQ^{)g zvx|O&Cq;fc0ypiHwG4l%fAOW5Z`8!|OT|BFsL{dLVSLRgnPME$d+3TD;bd{?1@t=T z@UGM2o`MS3BJb~x-sT&24@u0)d2y9> zk`*l)B{y~Qn&QB>@DkbER>=jM%z;9*c^Tw?i^9T#un&r&Aawm*DUdKd7M&E zeXhFP|F}204|p1T_hY&54PFmc4-O1W^ELDS;NGD&Ri4YuaJm?Zmcx|XQXMf3?etj|CVvmEvdL%mR&auKEi9Fv6bX16<`-Q zI7&aH2SY2OtO1;;ONqx7$FOVS_4N%px*PBva=_ZJM6O#O=dR1RL(Id!dLZj)6tQV1 z6t1h_b_}!*;(x@MsqKgc=wCoT*3oi(sI(#dd!;h;YSy+s|)kixhL zT4GsgI-KoPcp1+m9WRdZQZ_L!Y_Qz8y0+s~-H4;WZ{Xc2=#p3A#6E*uLIA&C$SLcK z)u9GDfs>{rbL2mq=npY}deK2>IBx%$PI2;!Hn4o3TDOTmerBxnvYmykx{`mV|&Fkc`5EV z4?G*aKYR1}dV+)J3?4{$mH2Ps$%Kc2BK~pS6wiKjsIpuR;wLg#+AQ`JLe#VilZ%&k zwt!lWwG%lD-iO^Bj@?5Cze21FCvFY9M-k4F|D>-tk4R>eov`+&Ni(Vc?Zk!pOFSg9 zv7egw180MEl?F4R0vVf(Lq}nJ+1sIjE=4X^FwSm3VRe~jAC%Xs>o5rX6R?$rvBCUo zdFq5UiOu#=56W$RYvd%_tfQ~c3~iJ46X(h`DjVy_?FZ>!>FJuIO&}T@s9n~Y@%?(* z4PugKd?lHY%dH*OH<>+R2~t1xA^q7G`hWGW^e6d>`kr``0#$?U5{<+%NlA&D1O0p# z+ym5Ec*gt%XI&$%SOq7uW~>iR^aJr)`yW}S7bZ>x_>#Zkld(zYz`1gXSpABWn>jLA z>MI{bdy-F?EawM%9wuh88-I@jMn-Hk<1!O&Nfmg`@6%WETYEWupF@SC^W3KPu_da1m$|!%ftA-)?TrCsKVw=i!OQ`(WsAw62;HjZha~ zOe8*xOocp7zpq`O{yF3&(Cw$hk_5b+c;^7v=c9;Hqz%HC!_FC4bU0%u2@*yApA~D-k0kd zPDi0X$WY#kwIs)GNuBtnRnY#`PI8XJS^moT9zU0ge16le2cxSFh{8>@BQ-#}I#Hb{ z20Qu|->n6w_W+fg?bJL*8(EDddRJz|GP?Cu&}L|>v?tU>d-L!5+AJ-mE!5i>{~D$7 z;)xhTQAeyGUfZwlGCI(4Fo9~q0GKA##q3H=PX*s-zv-VBcow)GXch1W76wiQ<-|UT z`x43pE#E88Wp#}*1nloBXH7xWeve&aVwu!Zo>|{fvFS?%{9o{&NBD0PqwiI+=$49u zl5LdSaw{U!@0c@n<$t73QfYB7r|n!^LmZ-v_Rd)&7#sf+8ShawHi=0d|-AqSHf^Dq>t0a zz(nq+xv7wL(sGjF&7w-yO`i@TIaP01oHyC18H!qtV%*{l;kL*QuZYPzQKLgZ# zy3}3W;1`0wpboDQ{53EFH`C7oHG{blb|*eb{3!8{KxtohcNMh(b*`Lpg7gG$iH$Jk z^2GLW2A;S2!!r8Fal<;2I5Fqos!$m%&t~GU_vsB+nwrO0>Hs}a{~X74$$|Mg4~O%8 zxbbw2{Y8!8eP)E$vC(%lv)kifg(n{In8?am&HOt{Cx`&2@-#Gm`<>m?+s8Tw?H>3?4T9Wrvg@gDIZu}_Mi@M>m2MQW;#>~3HVjnE$d!u{-GH=%d*8L;W?RxN7EJ;9)I5S`3NH8eth1dcQd zx6A3wlTWnl@OZM}fiOjTsP)!+qW)8i3}Z0J{%uhF?yR_9=@<9~o#;&-9+BGwg@zCi(+=$ywG>{p*Ggdmg7N_j4>OCf#nvso4xR_7Cg|gf$fJv-yL(UVY=K=o<}o zFw?iszb8;6crGw6Us@8mh@?xCJ1o@($kmU!xcrTmWay1%<1%3Tk& z0IxDaE`sX$ywp zXCm=NW2zhm9%%i+8sJuv$<2nLe1tnTi9EM9EYpJUH+tHSt>X4{av7gp!g8@=q*;|w z@#y9`vmpCvWe|h9oY~3jj|YhZhJYP3f+OTf!`HEZJ#oF-2U6 zGIp_)2X}`6Osrp|Vp4oZ=mvMX8|dpcGTrqsQobXL8$+FN1-V^1m9f!O3u~jjoP*my zjP6p~ab=rL?fwCp!@{62%ZTK2!)>n)mwzjIqchY@XLHZs`=O^j=LE=g_OiMwp+4!1 z(_9*-*?#IG(-@tZ@y_Y&vfb$<^$#c0Z*XosoOAna(;mb~e84(x!{`pB#x#-9o=oij z4Rxk%bTQk-*dHSwI0z^BJ!<$a7!p}fJ2i%3IDpam5}x@q=FMNY8_i-bJWV9|kR9;? z4ny^+`ql>(_?Y+om1{YEY|B7s_7ayq#ck1xav(QaY6&%U5o#PVb-*O{%crO_uM(vl zVNLXdr8}4mrV`xt__de99nMXRS{x6jbUaSm5vK*nYFbfIh75l?~#{p z<*|spY&l$_@5xKY(`Bavd->-)yOXQduJfG8Z#Acs}_d&^q);QjkrX1H^m{+X~22=ChI5c?o>Xo_fO8hI{t*{g$k)Pj* z_q556QX<}o@vksv7UC9*>Wx*w^8+cn_62jAHyz=G_REV(j1JnT*;ZfvTLq zs&Ik$#Cwy(KqFN?Q}|wx>&(U9D8_G<=MGeZliU!$vX1!OeZoCy$Fntet;M_h+6Z5* zs$4-a-cwx15%0Mf@2mOpU7w>H%&BAVI{6%hYrcaKImS9Y$j2kxr+;DFo@F&$VyrHq zaJa#UU&dYS9{2A$&vx}6=^0updc8QsJm5=f6IcHhn@%}>bE<=ZT#e+oq2l!X~ zv%T;Bb(oKFZ@~D@eDK|0JN)kF4r9?pM5D zPXhgK5_kmP^}(UI!Xv&*d$q2y-wUMaVNo z^${a;myx>47{t3QoniFOFdFfZJi+Hj-_5zR%)2u@&hg!g{A|1z=S^nd6P{0brFh?) zct22qYmWEkiTBFM%d-G8EZ$)!-t)8cyO~q;-L=H$Ui?~;V715JnM5ZW{ar7icrVwN z?_T*oc8~ao#=99kz`-rvKj;x%f#Q#NZ=*EMs_?tNYBA&D9a-b^PkHw--UC$S8Gnd; zE&l&_C)WS_FaERfC!$^WXC^C%!<0vS?&|M8kADS_;oWP-e@EnZ;-Q(X6c|PFv;+;t!@qF>_ z-o`tm#=A1b`!T)XZ@y)>i1#Q8F=`rPXEJKQp=hNft}WgxH9oHrIbZVd$i)@q<8H-w zhl0%DGVCs;xsM+(CyVo0MgCujkEPjZYO!w==KIyyC2H}1+<;lfAM*Q2jLdt?0tME9 zo7J6-y2%Vg;{8}TUh^$;370|~Qe;N^99{)4-@W52 z+@mnp@|tT6aWx{l|9yV;4OeGzT{_pJ!fuPj;(JGYhREEzc&93d^CA*ZdzpUj)_Wx>y(2e$J^7 z6$=Tk#c4z^JE>osVkdivemlwa477Pa{Ahvij%C~{;B1iLd>Y$}pMk~qin`hhAJ99c z3QX!^LQ%XYhr4QnNowpw<560Ujg=54!~F>H?sKwNXF(109Jjpj%)kc18D|7KrGmVx zd@(^dEo^sAvQxCDlj0q;YWSHt=VLZrySZb{oGxe$mzcMN?P7&kF(JuyHwFjZ+7j!b z+=hesg(Ikgg>_DO>8$ewcXUJShOoe@EGjv)X<6RHbU0T>a?LJ~RHh+}kr-LB9XZDgi zGW$oFCzQ|l?5225cxXjH8dh|i#+Mo zDlweYKBHVDP3|D~vJ9B>eDbE<+XlKaVuaq~*2Qu4)SE|k3n_XKXjiPGezQEk4yIoZh z&+5ah46}gp#I7P-kC?J1PYn04cB_k|y%~dj9gIT4M74D0Z-F{OzqGAM$?k#=j^t4M z9iJbT3;Dat6gRA>#1Cz4^E0p6TsTTEd`IeiS#&> zD9G-UF%3ub8uB{#X#G`2lcYzkvBt0AQNb&&oYCs;zGjl#P#mZgR37?13H@Pj^^T*O zyT(<+>FxQ*8l=7Nz3nJMUDl7ssi1x(bxZ%m|H^$W)W9l~v`%jx>Fvue42ymw*HR8^ zdMx1C7HX$H7He2T#8YM$m=331E5eUFVazA1U*t zRv9hbjUtcz$GxQ=EprQ5-#6F1xo73cdrJT0)qU69Y?rP6Z|lT_VC96XcS?wN3$%UJ zFw`*kllZOhDq7H(6&T@u^yaqyCP%>B@pg@WkJ!Vhq`x!@B@Z^wh6>2PNd4{4m0FQ- zY`QYb&fZk4Z*x^P@7t%`?>ToO*Ok|5 zZgZM_Q_LT$ENyox8FVc4wuzkxJyYta8^ZfVLoQ)@?D3v$)*!v3+#AfNX6#?%x%ysg zX84tVr1PWJO4;e;6xJ#)!$0Ud6YjgZM&=9kP*MIbq)OWoYljAz*ZeokQ_f1IEIxQ+ zsYcNe)-qx>?y~n247ZiYIgoH zZDGG$mCAx2jJTdrL@%LEmh(i88l8QWCEeLaRbr+%R=Mojp%ue(uzl<^>qqfdVHhg2 zAJBHcXDy=V%Uq$bQ%(L|EQ(&RooLG~?MJ34tyQ1u|F6CC4wIr<_jOfum>FgO$sjpr z2_k}^hy;lSR1g&qlpqKQC}vPVMG#R01F*q_0*XkGAW9M>D=Lyyau6g*nAlZy-(N55 zHru`Txz9O&o;%&o^i)?@ty=3#>sw!1HL`CHH;9b#(=(@7m6Fc5H)fA{t6Mr<1$TeaAlOypDD8iqOK)PHI1%@jnl>4efRx%B~PD z6Dkwy;m-_BaW{Jpvz{ryo*NbI)AsAEtCOrf-XqL-4Xn}ZV?2h;lG9{u{1IB{xAR8Y zv)L7F1)0a|*_G%uYb{yzCH+kIZU3;n%-Lxz$ll?871?WdW?zSQm_I)Du5ueV`LtTs7- z)xDY2*FM1>?B(pA{0&xnGRucrKa%&c(;wliXQ$t*xw|?s zRM!zje}{d5`77K1h~pFVrIf$Zy4k+X>Wl@xvDFG|=5GJE$1VZZG-4M|;Vb{zE6mz2 z6TOn1MQQy!eM@1@R-Lu9rYkJ!=eJlCjLH zrKpp2$ZCl%=p?q1Kha!IqjTKOiupWVfJ!`d8{caa-_w|Vf9sK(?@>|a0C8d8*`0|H zD`zi2)9HXtw1DdW6Y%5D#y)icOL_zH7OMH(tO)tutI!ZP@cfbF*<}(%P#cWtN&i^n>;UYnZ>)Tk5y8>ao-J zql~{Q*}#qcQh3d46JZb`N@1Z@20j>X-Q@pFq~*u{I%0EnSPx^r+-A*TRDGyTJ`Ss9 zG3uu`r{=^sbi!WXVL0@$z`Fy_VI4A;?`EfJj}_F1>}K4C$}tPkG6&=PuT7r+>sXx5 zVw2qurZ4$1)`~~5;CH9;_;zZxzeyxe3wtU1rBA?q_B8p$4e>6m@TyUlVJkZBcyGHq zm&$DAp@nq6iPh0g2bNC*`=RKLWBsyJe!hc9#4Tvyi-Bk*JX4eW^4Mh8gVX8Ef<>s@ z@DR}wUt-@6J6o{Qp2i;Xg#SK%(Khf*9Xo1YX|?nQxUIapjN~NNr51iM{Ot{iWV?+T z1#iH4AET{4Y+p&1>V9gSPp6*zRn|GO3vTe9b6xK@DEA^255^L)+sz+C#6n{$#`lKg zgPp}cJ=uPj2(k-g{r^ftMPa9ry_4v`By23x{psEbGBxM98~vU@>mu4Qdm~~^8i-{q z$yrLi&pl3Wq|KG~H&kXnS53F^WfX)Lgnh#$n5UU5&II* zsgBP6H1Px7u&F=eZ6eoE{+wdOtqrG6O;c#?DD_5qJ4dO>K9P8^XQ=>`<=N=`o>pfY<8Xrv8wy599-?oR6O zzejD&nqc8szfRohHlJLyN3Eg6Ks;a_wA(pRySU#I&*g_aC&|yir(6g<`~YLQ%9)C^ z=}WzV`>e;D;zYYubIPG#hrRsPaC@btiZ_wiFYbE!F~rITzy9ujPVUt%e-e9R{A@o= zo%09%jrJ{6^m)nMo&9lasCOrI$``PEL8^C(9GJ?`U=n-4K7a-M1+SxZj2hf!oNoRP zfu}K_vz(({El57=H*0F%cLt+LM4gVI0^#N1Z^Ktp_k2Ng4K>l)MRrpM zy-KtrwU}-q_ikNyPiS0db@)bh7P=!+f$t3>hr$Di7nl-iMdiH8p$5+HRC(!v+~0&I z;(GP08}Vutatee(#Q3(vvV8~D_sfFcg;cZ1hg<3-^|$9|Uq}6(UgVEmojEU4@j-p? zX7`I#CEovFY?6BlU(FF>(^}!lX+@0hFVw%BLX>7CvrlFu`{A6fC_1qW5wJD z+!pRv#KF#BzqRAB>+qz0?cHZpXJ+eRf8-1Z?}>DdhLSoa^~GZ|fC%@Dq<%@mqG^$u zL`v)+7Pl1@Ng9XillM}excIB0b)prb-$WjZRE^Y#J{g@(4oSV}kJKo8H&h{1o4?Pf z0{I~PbCyaR^BC83?D(6o*4Jf!sB7(!Sn$8Ym+~uKgLkR$`3CWJcd*0L0jhM($l0AU zg^~3nGAJK=^qj#X)7%|QjQfzBX!iEZxtR@#fasPvkzCoS8T&IPXAH>L%Fb3Dvqs_b ze~L_y>S)EA$iO;HzR0ZXrc{W#E7s1f#6BB+tbKNg(B{Z3>>c}YN{y85NfVQsBtOnx zm6IZs!)?QjLeE3bFh>T3y4xhPFD}?5D7|l=267!`!>svug|y`_qUl zobB#rZ@y{RR(fI`TI;__-QgF>wQrO&9&ENIuA?~F<#%Nl%pQ{UBe5S}5t&{Huk}0G z19C3qRHQz86EclQWqwDE*Wo#>sn7N!kAeIAxShI(7WVATtSCmi3uDjZd`#SWU1B{PcH-Tg zb!GM=S!J>pXOGRP8LRIuj@{=b6MuJtOw<+Zt(BfRjSTV|(z~U1&v=);18>fFo!HBj z=`}OnOus&3U3PJQPk31ByZM&ppOHVD?}gO&Qc5N@4qveGpHOGoIlsq7yGTQS zo^@wvNOWZKz&!I)uTR^Q)-3IfJVTOuM+b%1Iq$MJcqR8FHFs`u*Sl?)l^^&2uxhZ& z*!_|3qRpvq{zuY=XxGRks-*7*-)G6s*h*f`%duYM;Vkg_QU|vNIVEGs5jhb0oN7pG zoM)Y7Hv4|FvS{lL!b*p)fA!5QOo z?j>&ZcIadU@l+$&ud!)%t*q3{uhR>q=OJo)WJcwz{@EjPX2o*6@9cJw!YNkjqCC}8 zN=9FCUbMF0DQ@V_BAfL_Hwo|j{nkMHK4(4ol$FA7hOdoKBO!WY(qVS+$PV8bIt%@l zum-ToDFe2qT8r6(WC_(gej-}zw9`2BiZj7k@04|BP-V2Xy~jFFU7Ehk1hZKKKFMgt z5lt}NZsgqS+(PxbS!jPpt^CBKH6R9JfSpD*P#Jb;xdt!L$HeWuhc-6Ft6-f&lku3T zt5dV3Ai7c=yk&Wb&AY~b6${00v1YL=atc$6;4s{?G^Z)~kfp6L)SXMFHqLRh|H=NB zZc1!GcCXCk>2~@9mmay)EWISv7~aopM}){)s>Ow=jo8Nh(0?{`H0h4i2id2zTb>7! zJ`Jz3r+E#i>KG;S`+H&|N_#Q?bGt0H(C#J!?Au6>=s%*3lU`10OYTRb$U$cXR^Q?D ziC8rJ>+gBz{StOxr#}^YMuv}uS0X9w@F$^>c)qW9uCZ&e^UR~(W9~;_b#m-ASMe6- zt&UU~?oPJihvCBEuAySiCM?^>ylcJcM3Gp~;a9|sh0*@EvtQJ9u(jWQ7;SnoD~@l_ zpDR*{Z4tA{_MFdR?Wg@DFPWN@ z9=k@)b<2Xwc6L}bsV&eL8j=liT7 z_I2b;>?G#7ic`RD%dQvGiBDca&DD$8!Mm^;egF$Y8&;BwiSCWq!>AhfC{by3n0Xdj zEv$pyHmdOzB2MlsefWZG;-2WYjfnF2o=S^-sM)v=x-Ewte;}E71>7g82J%DBs+{{` zYhveP`N_DP?B3;__xhvrZzebV5g`5|88>Cg1@29S(n9QrvM^&4dwiBpe>d|1_k=Sf zrGCD<@^{Vmd|IuPNVG-hbM}p&le3RJ_os5Y#$s*-tDW;%s1(u7^{7DnR(MyWK~geV z>f@<%(J3 zkyYTweu<^H<)ErfZiYM6y}|v42(B-vWYxpn&5r1cxaI&{H8XYw$#a+6*!_W;67AT3 zu@<>0Wphe;KiGStkEQ0z+a_&wo;69|hN&LtS9NbjXV^}?rX^l|>rH1aRix@hYeW}? ze;|_gmr&90hVVJ|7P>lIkC|yRI&Tr|81JzI-+9lnn%d+WL1(AKTf+z0X^A`mtV*M( z3)36T_*J|>8Pv~f0+qC5jW~&Q(^=~RR`)d4ja{hn9KzDKhRpB9=#+)QT9eMr`7Sc#VVL&!#WlDeI5*%tB1@>*5# zbBHNF160bhj{VgehmB#Zbrk6LpqgDC>~|%+Z;9hM>}I>avSVchGBwtt<30@~WVpNB zNuyHArM{HD=URip^vO`6*|PyNwD-gPjG=9%4D44cCg4kIsp%VP}nt#4L3}4pn!yU=u6t?V*0< z9Yp$h-dyaJ+0LSnAF4ox>@%U`(@csDBU z69M=Ev|8D!0yIBhzsE;oJ;~Rt?;dkM21Y+($=c0|q&v2RnOI7uP^s*0BH)I)cQQ{k z#eQ3aD5qqq8D)d3vDmr3;IA)!zg5)OD@?_P->@b$CH}e#kz`e%$J5k3dyUMOHo&nQ zxzSsQo%)!l=U-UAM}YVpF>nn^?>~WNVLeM>FHjXI`{fS={9PXq5_| zjoy_!JNbO_@#O21=SA-hkFtOFnz)UqjW;;f4~y{(YqnD{yf6G3`(aI^8o?O$+xVTF zog1BLL`M1lqOY>qQ|D=NTorY(pNPok+0CK^nXVP!*D$Nb z(bVcXi{IdUbZk=dq?e=ppu`(OS2(-yv5q3I-6Cr419tFSVK;a1LxoC_CAW+HY%8!f zUuUl&PV7-ue987{bhbW3k+i@MTbHPkx3Di=M>Lf6)h)wf5eARuekC~B=qw@_# z77X%tv)Yfcv+2vkmR*fK{YS4Ze&g|2ewR^e^?6oOi_s{bA*b~r>IIZVXDmep;F`p3 zKgSC8E~??*4BfW@Uj@9mM9WhN#a&Gt^Dr{m4v??(D)m1vWN(hWWjzrom2x4^k<=Bb zBlCQi>_#4U9>i+5I;S_)s-|Wy$|>m8vJ0`BT&YNJsvvZVPGeu97b3^Q)5smU2Cq=E z^%OY@+ldG~jbu6MKI3<>-=o^}`pE6khmiuGhmSaal65nI8etwQ%-%V}V~%^DHxQf9 zdBQ=elP|H&In0ba(vel9li$#L+}#f66eEInTh6VqPh$PuX?TslwdSF*tR<(jIs1XE z!>Y28b=Bk8eriC+rQKO>Nv{VvM=wJ|QQ|+x+NGfSJVgF2CrZC5kq@njv-8k_Mo{T( z9@d<;=t8r=P+P2HuP|@lkKDYSsEwbH#(k)N?Nh}w1L}R0>plW|)8U)0Kz}4U>3h^d zEK6K!Np#7fd|QJJ^*W*xej|S14>C#zLB(IOpTSmaxC7|zI_T|9o>Lqz%5PNstbzUh zA9yKl#z#YOb0Zt&(J`sQuDb3IlZ4Svszex)1cgbSPG6=6|qQs zfR$@5JBvKQ6-%iW&<}glCaXR+nJHw=zioG7$I1`6qbu`849iwQ?9fGst|-YW;!*6( z&#@Z+%-V=ANB*2T@!A8ou*z7#J?DvrTup4vIU+w+0)qxbDyEZ(P!sEW9%`$vg_4hX z9f@;T3RU(;LcN70?l<=b@?{QVA-23z#D{)HR)p`?rdH{5$jdDDYG}{wy(PAhiVUY> z1CW?w+$~h#Xy_fLW^-w@tc&!cANq*Pdbg+_K}(w9rCW8vH$>|tElRqB_4VvX!SF@< zZtH}%)vba)corL8y5HRS7Ar(QW|V!@>3f`f;7v|l=P|1Cyo!#o7(c=`qEkMHUw`+m zU}USTPwc7A^`XAxHT{lVvNyXmOu@VH98vVmV^2a+WytyIgakcFrR;~Cdiam1IDq$V zgg2X~PT-p9)R5?pZSWQuEPWNE75S1p@@RW&Z}52ZerK&6e4O5pebfiGj<>tTZ@1ewo*;*UJtI+gbVTYWVA?<1X zI@M@e(Stv|Lw{(&!ZBvZ=a7A?u|piib2bYP z#2zaRt)?j%qs_2Q&A>zUHC%DX8%UgNWojN3g#NeSzv_c8X_>Vb$$SO1V6{)kM8=nn zpYCmP7-qs*m5^vN7{M1o!7t-vA@U_B4Yl2EwDw zut0AivhZhY_L)eshq$FndE~K(DKix<%2wm+{Q4 zJfWb!4%t1A_jK@v+hA^QzAx}vVLwYAP$SlEm%!8WZop zcQUJf1YIA;`|~uteIH$+jQI&-rLk|Zpj5WoI^R)s^bhuo+eNN&FDHgg{B!o2zSl2EHRr1A>CiSnA z(SeU)J-p~#OXT-1;+t<}#+**A=$*u3U(c8(Gpf@>vQP4Ak|A=AwQf2weTpPJgbXO` zPe7|5;1woX+hLuPjqWoOZg>j6YJRlFPS^)d;$K+~wcgFT?h7ssQ!590Ce$vp56{17c! zFZ7MCJ>KWJiWjPj_RtGSUxpruJJvwqb@BJzjn!o~GG-^X$Y#*zE_%6@r(VO1p-6nq zeCwFS`ch-2IIEYj(A%%XjobKuyJMN!%l9kr{EtA#Dhc&ZK$r2M`HtLq&Z=o&gC^vY zIX(^FQ5|ZKjDkj+VS^e3UcTqL`pj%$G$=({M~O3-OV7NdWk!DF7r zoO=WEZ3aBs56x>d+}@UJ9_8ppqV1*-nLmKG@APZ=*TDmy!o}a?B^`%UKaPJp!tCmS znf;7!4p%=%l-^l9(N_Vpkvwrd)IAC5_9D-&370+#&#*r=aJ+|>AA*ys}W^;+T{e?gWlqU}HNi=W3PHJ2#+=ZR6=h=iL9HaF8NRf}(f|Mnnr z|9tkl`UogzP>XLF)i~~l5;kz>I(*P`po9GQr7c{<}c;yw~Yn1gY zn(umYSL#t!V&K6j#-X;V2I!1FEnVaQ}BqDPl zF$vE?k8k5wuEvfR8@<7bYqjpP_d%P_5>rwQ-McaQ=J;CKY5NS)s5KbX&gbpm>1nLN zr;~|%H};+b_yY5>*8UYq@D?o{CDXAa6~-sP>t7<{3xn&4Xy%>av10g^+af{dp_#P; zrp3V5Deyd*Sz?7R08dH4TdJ$o9-z7!5iLHgXt+UEvp7p<{R z;g{THU&3p+%_&LMr_${D)t3Dk6`}D2I$!kuK3d`3m6-@Nr$|LapN{wvmZ-(cfi>=i-! z{Y+hpPRs-6s0n!38;&OXAX3ir=3~j~jAwoo5dWBbpm$hpHi6oSbU?-x<;fplrJ;Rt znXX3jyaioh5?oRd&T39J=Q^iID2r+m>+BDy($a-BQZxHJIVa<>^Q^G$B}U_-U4<;* zd}y)_i6+iVZp11oI=^hcLeA*#&`47#yC~fD8Pab*Z#_mDrMPHZ$9Ihtfr#iAm`)R!lhc{x*TuszO3)Z|ZF$dmDWX@D# zb=$$UHK4#E%pdEyb}QUpoM@wq%oZP@<=+DrkA{aGWJ+yt-w-)8f(u2Tm2NLN!Xz~`MLrW;64R?)3ySWYfK^ve@8+fFHk=K}6HX#WnqqkRQWp)Ya z_6l^L4wNRLpLJ!|`RDPCPk{d0@Gi^P3$d~u#10l0@#@c^TG1&a-1oGwl>JCsvX|@! zR2=SuglLE^5ur}Y3|4Zji5%;UcJwkmh#+lOW5xa&E*%C{9`bvT1=Sx}^e#GOA>uhc zLz}yYxpWR(z6ITG5K#iNsljj(Y4QVl^%!!o?jSR3Bx~y@p!Ye@(LabY@#EDQHpgui zLuvbcsNy}izbw%nx3i+#!J54WlBsZf1@tp9YFqI>{mRH2povUn?hS*R+mLDfpxzVA zxvP*IyYb7m9BV5aTupSIoLrTs-kKRWH*A}7;vYAOEz@j`hhmFh(zd;)lk(2i` zvwleg))FXV7W2kX^q+F}t7I3PW$&>1NbF9uI-loVWCkA&)_!E3`h&>#a~vN)2OJ4D zKOq+XI^Z^!xmLL;bC|=g2U3nd6MMyIC?pFhaxJrAPe$8;|M$k_`8?XZ4IV0r^xO?h zv$4=@fPa<)t9octJDGP2FlU~C@0KGK|A0a&vBJHQjKoFA$mf}z)0hDUz&npJdp*HS zJ{LPj6Gna%o*#m)SrdLO$w=O1PF&9H+!mVu2&&n~8vY0oVO_ahhHVeaqFy{qHvjVv^?708D-faEu5Scj2F zyID`X2#i;whb-Y4MbLMOq21~2W25>5%~Dwoy_h%i^IHdSa|SuHhkL1<%g8@PlN`;= zxEk4UnAn-_XmVE}i|znoqku;NRu*T;%?p$1(|~vw)i*1Qu5~pU%26a#Y1+@vEPM*t z&=g6Mf)4vL&sYftUIYJ2kmM`lE2DYv?1%8|7-sp&=&GyG)`l@U4zovZNz=UF^6u9BdGWU^MI_hvKd^Kp24SRD0t5h^|g zRy0Os5qgYJ`8eX(3`VVIC=<(qzLYnnCq=8xQ>Q3>ypq4d@#m*-jpn;Z z{7*0}%$0@sEJE+|(qew#lb7>q&!%lk;nR8+{m7svIZ%PgIMZ46Os!drNmpFtGd+Gq z2BVSn=`0*{ioX+J?G)esYDZam>HL<#bD}^> z*=)+vQVyEQKPw!Ex^nG`{WZ=aj8>yjUY(#(0PGdvOesE!=~`u4>TU85^(^(1DLOs|!7mHwWiwXcpR#Io$Tpof-cl4P zEv{Dk*>U-yUMhcFbB=nD%5_OFdct`=B~jFh4UyWhDqK^-U(j@Ke4|?AUg0Ep++kB z2qK~g!$E?XC`Vb}f{h?AeiY}J?Bry==~x_OMmhe_z&n)5a;o6 z7z=9w>G3TY^S_C(&;pIV6Woztl6s zN8%KXSbZ0DNJ0w|f{woHn?5xr{TFQXP4F;p(~>AN@iNB=zSA#et_ft9t}xW6PvOJ7 zKpig~2j@)tx=+0m#?;>cwuU~ zaDpO$s4{O&mbK37SQ1`G2@Hz*^cT>%@}${Ng|~2X3F?)sJO_q!#>lk{+RvmF@s@I{ z&3{pc$>-L8BWKiG^)7))Gd7LaP_pRONF9T_;G6kfazdjOMT-h_EVu|3dWC6Q(m@=c zXDHV@i~m{lKopkAf3;{KeFR@|lGe@AswL5spD&sa|A^)wI{d;s)o|UF9rgFjI>*6l%lUd zP6*S|&7|F1tR4kn=})2sQJUtQ%(%3Z9Fwe5?=SI}71z7YGlxpwI0IfZb86N+#c$HS zG$v7D2wh%y);L0VHwD-HJWX1d`l{JQI%0l$>&3P4(&$eX*pRkgm~&ZVxGV49N4L%w zA4e+stA|GJV+ksbew@ZtKI`2ybhJoZ19Rz9gw@=6)_OMBb+I;8Mo;^lbwUPuR1%}T zNRCkv=xRHw3F(s_+Q22Q%Z%#=7q~x%Gp88!C9aVK%u9c?(kMxflUds*V-1wfSA-Q= zF;)hrfra{8oi+|YYXgDLQr27@d77$o6kyG^niY|SKkOv!pJA<%Oh&oSI`C=6a~~@L zEQ?sXKE!4jWnJ|?yY}5r1kqz;QjQ33Ww*}yem%E`|9MV7$BFFlUysf7YFR%KJ2ux_ zZ{6=aPxee{Y^YVJRFmO78INYZ-L7i=$n&~k(>;qVU@~jkKgpB1=#RCUU}T3+Bb8X`+E`$ku>Sg!@gK(mauol{ zO<=Jq5j7K8BlRY$N||nz$suY)I|G5q$FkwFQlHE!C?9<)LuAya!1YS&epc{f$hSB^ zFS6y70=@y;^3Q;^LGW-ts~@{T_6T(I5*iPrUMH4*2;Q*SP{l`#Z78;rOIUo*V0p0*2ES7(v?x0*Hc1nhcu5shk*X>yD61UYLX z!Qw$I_C4*wjAR(zlyC4gUBR04QS2&{i4?pO2+s0a(eu4ncwYiqK5O=D#yA{L#fw;Y z>e|bo(p$*(d;$wk2fHJ6AeM7oUj7fjB2^JgWP6`r=NyAg<|MYSpQ$?9+iwQvjYh|< zYHy`_K{+bxEW=0e84-V#s6M60kt$Rh9K@=;ESPAF$EOWc;9zs~p^P4^#q(GtDb9vR^mW7LCzTXn1|X{>f_Y%{H~ zg?vkIOJSq91ST6|n;XvxdKr}79=qOE*f{pWCD($DZj5aX{*s%y|5sM@-|@ud{wm;m zC*0cwem}rdzk?T-;sss+oWsyvveg_5#(s7`J`BAzp#o(w=%4+riA*|4I}c)2e~-L@ z53tK1AIPnF0N%)AZ61TVrva@IR#$wytAP4yR`qvdtuAc!Mm~InPxT()uoRozJ~;kM zo;RGDOYh;A{Sf*rK-JO?*c;13xjpelY>C@}X8DhDW-f5|Ix&RU$0v!!deXWY8|wsoKhH7V9Jr(xzNJ-I7bju8I0O~;f>Or8c}v0h zK6Z>9=RfDAVG}w){`ee!F#OSk9-PF}bVig5{cNQA>Kwl<^6Lbao{{wBd#s`*kUL$m zv}}o6YGx7NQVV~mtUQgd_OyX=e#U=vHP)|1Sb?6#qP!FdkO{Y3kHt0} zYi45pcBxIrp_M59?59*GFbw%h+xtZbviPo!GU?VI`afjaP-L?x&5%k!}~jRc)kB zmSr# zn=Jq*HdNS=5$s3GE~MQFRKwduB;GyrBa`39A+ZM{sUJjQ-j1Am8w+d&=AbZm(cC;9 z4^IuSv<_MrK`R51%KfdW*yI{vRh@whzQDMAENpqPzkY^1`#SFR9z-A7Gb?@%zUx3S zuR?39@%FRx~$}3CWu7y6m*dD(RTatueoruWPR16#i)-5; z*;muQtGQwUt>$MQFN&9M5SHkc&~q*D`6XBX=+DOMpp4zqXi$%G_ou+M2GZspB4Kin zARi(BiXo@Yfi+pn$^wf|iD6m>ezhhk4SuQs4`mAPM-z$RO|1`p4uQ|(KtY+9>CoC~ zFf9Mv8Z0&zQcktscEg`Lx#LG>n3d2?E!r;2Xm7`AUKw2Wf@U1x_B2PTkk$?i>}SM( zGOHg3GV&1A0^h&!eK$`?#b5UTy!Zt3Kuw^h)pQbY?!xFJ^iov_-bU+iflLfMv_{7% zN{l$w7Ko^jSGXDUR|QCZM{CES@)^v3U*cVTA9~aL^)a&LQ)qfWT;2%I?ZVs}Vs=>x z_A9~1?dfAa@c1*FJqH~5v@K8MdLXeHuG)ZAa4$5wioWJyo?OpaRi%>kuOL#v=IUhl z`5f)%gCZ(0wr%tz1999?k^ctA-T+m}su*Jgd$=ad z*dzz81S?r+J1b~uBhL>3<9x{N%{*CNlwaf8w`!xwMx6{*7v-)a{PHvH3e%b3x;$+h z`6<8Am6&w|Y}$k4|0sSFgn0qOrK-lX4{^$RiI)C3<|n}m=VS0FtL z#A)dqqq@lWPeY@5k(ILMscxDimu%6cpwx1-SBzt0lP*I`Rk^n)v~h~|3PG*K_}&P* z&4!+K&^uKUy9k|SaD1G(K8bOK_~xUr7e%J^!N=4KPN+zmTJ6cxQx$C_6RKVe_s)Tz zf1r&&p%txXeV`_o)o69sfq3hW7XNFMr=Xo3+>wWI*WhU->F+5Zc7Qe_z*q9N zAQ(P`EKt=ntqGGDr`Bof1V?Ypdh9vt2S6Ea95so zOF&h!a9E73G_)rUF9K||?lo-`<-B5^iqd{Q?mq*a9p%%9)77$#)Hp<6Ptu0!vdK;_ z8-P~RTKOIa4+ps8B=ES%=U%vYBk!$1J{_vldS5-0)j;vNrQ%dmjlLD9r}^o*S))h! zU7izBjMj)6eHvE?mx4t;+MrWFI5YmF3()Klo_z@Xh&ohdFg4yQWA~LsUA|O#Vl>_? zxan*h;5A0bbL zEYHSDYwV|n4wHeiDuv1-qCeTMj>NkoOsb(tq8)R3}Ie=sD!Oul`17)WsTA=vNuXn8Y^{RsnMq%hmkTCRaMwx)FMkD{Wv9lU1i{A8S zY{!O<1%cpgC|a~&C|me3R#&wa(7hRp@hIrL#$@Qnj6Sg93Jw~pk=MepdZD-4m+e$m zRAb@PvGGBQc6B6f3(lBtg0$?P8j;%8-NvRF_!@;XVMlmSdurA6K~FSxUE$aKrZ)6a z9|fy`69rv^74=wm>VN#wIA!YC;7J^6yg;&%%KmOJC+tX$3TrNZfyLfFiQLyP_bYw90@9BmeSGX5HfegZw3y6v0!dm zGH1;L3?&<%K;YFe)UQv`Y#{9ty%2uHVLGE$MOk_o@0pH`#1d_ZdURgTPV__38^VwJ zY{p_JNVAaf@|aPX5gOc^nbXjTo~CCT+#0CrjQ-3h49AGujBFHV8b70c*QkQ|EEu1m z3^OXV6SOTJQ_n^F!LfRzk?WjhNsYwdQrGE7{Zt!<6Lqz)W2jX};ylB926Or}y$@uU z+R$6D)7$Wgz6GAqppQo0Nw(-MS`OqzAlY@^z(umf;8)`ne)UV@H~ns)W7;zmV9o{< zBN!VQWuRpsWyWf7pfd^h={_R?0vzd#x!ycmJu=S-ct_vNNYr;DH_a8nXcOZ!J=Pe^ zD1+ z$j#^tj~NOy{nW395_P9=rB?vk_?I}9n_h_840Q^^hC=iiT&I4jM~PSP&HSQohEjt& z^eo*I{BGtF^+JDUbh_63Zn#=)hz~BOa6{Fi_e2lOSai2}1${Bx6SSz`5`Btyg%9)W z#Ak4?u1;KI`en`~uGRP8*}?yRZZYvqc-8d=uR79ig1_!GnACBCwhUEC2NT{5$LYxM znYlB#H_?xv*LuR`FVjDLnkQcVo5p$hcXL&6#@rb|z|f~)ns`!xQ{7>3tTW~vw4(n; z$^}#)$z!fF@+&xR#v-aU(&h4=o7TjAdL^J{C_8|dC_N!<#QA2nNpOH#*W27-o?v)F z$A)k8gy5w+^$c^D`ETZaU7et1b8i4K-5ub`w3(pUpk)L31YKT!-q4?+90OxBUj(of z+;peWNCGVAE}adYW#DSg{_{0@c5s!jWBvlXCTJpPLBANho4ZW^Opnbkm$#tvIx8#( z&kZ=xeAhUFdCgpXIUNhi<|TMu4%5FwHGr}H>mGBhIr~=={}&I578BPcdaYm0s0=g` zcnNwOjK#nqfKl*2Xg%m{(6ivY`G5ImaE0M)eQFGb!V=>S&L-|O_Zdhe&i>Dj5+g7p z4O-H35-*M3d<)Jd&Y1JT@4@*51l3aTYjAg><-Z@9EA^?C)TiJm@k?-zxhnC^Tpz#f zZy)BG#M3Vyoh}X92(AmDeEE5EccKmTOO!0DfLaK8n&_{Q`MM+MX)u>2o*4XM?h2k4 zaHsk8-(PK74L*ZA_5bqG1?Ph{%*YJ4sAmcJW@Z?3??1O-#vHT|v}pe8%F7`bTxF<9 zznGWlXFwH(BJ_(H_g@#qzg<3}0H%rS{@wNFoRMj!P18nj{Lel9*KZnM0P%nQ_20K; zU}CPm{P^G9A4r_bfBUcRN&Kp##J9^^xcoSPy3SpG9Q6J2YybPl|J>q#|9;(J#_<0h z$^WeN|KINVuP_o&{pCDmj{iNB)K>7PqrbQP_wR-x^{M&lKfV5b*MGY1^7EHJ`@h@r z|Kxd>Kl^{faV`x0H()V$43|SdG;QcQI7&!{f2H?8zeu!T?)uj&6IYm{M5}-Q<#MU? z_uu~AceV7NTl;r+I1acve3xQk+#g+ML@av_ilfm{gWLLe6cxe&;OKrRGwA&?7!TnOYs SAQu9;5XgnV|27Et{{I2ukY7Ro literal 0 HcmV?d00001 diff --git a/mods/vinylgod/chrome/layouts/ingame-player.yaml b/mods/vinylgod/chrome/layouts/ingame-player.yaml index e8b3dea..8ab1b06 100644 --- a/mods/vinylgod/chrome/layouts/ingame-player.yaml +++ b/mods/vinylgod/chrome/layouts/ingame-player.yaml @@ -16,6 +16,18 @@ Container@PLAYER_WIDGETS: Height: 23 Align: Right Font: TinyBold + Container@RADAR_BOX: + X: WINDOW_WIDTH - 240 + Y: WINDOW_HEIGHT - 240 + Width: 232 + Height: 232 + Children: + Radar@RADAR_MINIMAP: + X: 4 + Y: 4 + Width: 224 + Height: 224 + WorldInteractionController: INTERACTION_CONTROLLER Container@SUPPORT_POWERS: X: 10 Y: 45 diff --git a/mods/vinylgod/maps/arena/balance.lua b/mods/vinylgod/maps/arena/balance.lua new file mode 100644 index 0000000..7a446c3 --- /dev/null +++ b/mods/vinylgod/maps/arena/balance.lua @@ -0,0 +1,40 @@ +WorldLoaded = function() + print("BAL script loaded") + for _, p in ipairs(Player.GetPlayers(nil)) do + Trigger.OnPlayerWon(p, function(pl) print("BAL WON: "..pl.InternalName) end) + Trigger.OnPlayerLost(p, function(pl) print("BAL LOST: "..pl.InternalName) end) + end +end + +-- Balance telemetry: logs bot economy/army every ~10s to lua.log. +-- Read with: grep BAL ~/Library/Application Support/OpenRA/Logs/lua.log +local tick = 0 +local dead = {} + +Tick = function() + tick = tick + 1 + if tick <= 3 then print("BAL tick "..tick) end + if tick == 251 then print("BAL reached 251") end + if tick % 250 ~= 0 then + return + end + local bots = Player.GetPlayers(function(p) return p.InternalName == "BotA" or p.InternalName == "BotB" end) + for _, p in ipairs(bots) do + local units, buildings = 0, 0 + for _, a in ipairs(Map.ActorsInWorld) do + if a.Owner == p then + if a.HasProperty("Move") then + units = units + 1 + else + buildings = buildings + 1 + end + end + end + print(string.format("BAL t=%d %s cash=%d stored=%d units=%d buildings=%d", + tick, p.InternalName, p.Cash, p.Resources, units, buildings)) + if units + buildings == 0 and not dead[p.InternalName] then + dead[p.InternalName] = true + print(string.format("BAL t=%d %s ELIMINATED", tick, p.InternalName)) + end + end +end diff --git a/mods/vinylgod/maps/arena/map.bin b/mods/vinylgod/maps/arena/map.bin new file mode 100644 index 0000000000000000000000000000000000000000..4c216334b6b2e583993ac60f7c088d73d598b536 GIT binary patch literal 5797 zcmeH~Q4Yf(3`1i|%8Is+U7`2xSvNy>f~49s$w0(coaEsj%5J+o?Oeyh?4=_DA|L`H zAOa#F0wN#+A|L`H@O1*8Z<($i5WtcviVDZdsBs-;->@+}s)2<)Y`8Pl_(b_W%&y=u zD8#3TGQ1`aC8xue9FD5-`KjP&b9+>U^&7p^87<~)l-Wh6Cp$Gf#wFj!a8jPfR7t+e Q>5CYLoTrp60{=kZ4JCDLtg{QfgdfBB050tg_000IagfB*srAbSigQ zIa05>s_EriGj7d&KRu%-^H z@w@!K$$H#+7JvLScUX;m?)H_k#VoBQ?DMGoEbS}LO5T2!_Gh}8dxKR=k}q1nt$g`y zTg}q`Y_#@apINM#*@gfD2q1s}0yP4oJ!i`+q?b$0-X3*dpZWas3Q~Fi{mV zq4oX0b}y>>7yFC*)S5K)Ewp=)vTxGAsM*KdQI8c8Qim?G{u`1Pt0gyLO{(&JecfjI z@lji?=h$!2uFF$$YwXg9*8P`klQ|0g_?SDSzQvBqEhf+O=*lB5$!I-BD!0&&m)xmF zLZ9fvckUnJMunG0v@+ChlU%Bu>Bq~h&$;jJL;Cib{3-Wq9hXO}Pndf|S?5P??aOuI z{l9*^UaK@!mE;cMA$eNCyI8+dM*BME?)3T6&K$P- z*mXyzw1Wj(Fh=b00IagfIt%1=ha5b zS-#&5WO^WJ&(>YHo<+ucynoSmmPQw3U1EK7`&oQPiSH?84vp_$H2gM{KYn~qDWfg* z-Td2U!`Anp>xo~Z9$kfsRj_WwY`uP`lB`Ujdz$GZrV*{{x>>9d)@$=}V3Nj#o00Ic~CGZb- COa(Xq literal 0 HcmV?d00001 diff --git a/mods/vinylgod/maps/compression/map.png b/mods/vinylgod/maps/compression/map.png new file mode 100644 index 0000000000000000000000000000000000000000..2d636cd578a24c4adf10e8eda686ab743b572b8f GIT binary patch literal 1281 zcmeAS@N?(olHy`uVBq!ia0y~yU=#si4kn;Ts!*IB0|UzmPZ!6KiaBrZMrX-{i#P;Y zs|a`HF8WxJAm`usvE$EUen;U9fsEDi-{(cW_D+yV3e7+Fuq^!R^Z)<;{^G3IzyHvE z#v{ygPcl!eP!QsGdDQ4(BhbmN^wB{@uHy(!!C$-oxxRbxg zU3H$ci5ke1RKMGEL^e+Oy;s2(Y|dq~4j+65Lai=X_I#V{{{8#^efV^~KmGsyf_vVX zAd@A^)nBGAFt=XE7%c0ozZB%!gj2V^9TePu@q+yO8FiWvTTs1l;935pdw+Phe!ZVG z`<2Dnr6!d?ALi`aHupJm;N$n}ZO%hP=DcK7IJ{@$y_o+OvsRy;ITP&v?AvMWfyR7~ z(hNYFd?Ih_-9B-py>{;L(_bJin(^u8wvXz5kL^E}&Vz_pT)t&?_=@q0&tNU^kX)WS zTXwf)N_0Coh&OFpoAKJeW-g59m;w$s+#!t|CkLjyS2@b;P?iYRW5e*|VvYJs32=Cy zxV7!|wz9LEE9K8T0Yzct?QQq3t-E<&?l6@5EGPT=oBVQcJl#mlmHr<(yBjF9?BAjJ zzb_eqJh=uK#?sbjzRLIB*PihmBBrx>+g9P_AK44fRA)j02AVL=|I4{OQ{H{s8~0n= z{;gg2AF90A`w)Bko4)F!zkc7ow*P8sd=%Jq&@^?xXuC?xIg@*(W=4-KI(A3BT?%$i z#Ct}C>yIzJUF1^*wdDRJgP+cM=M3JTg1Y|Q>GDZ@X<%=!$u0h7o}SI0_Nk%b!NxVY z{oCFIpQzB!mIj76Fcg%&=j9xP>QVsv3my{$(lj)rH{1(9Ik__LwiqP6KHrx6Z7=6O z;Y3+@IB$=+d4JwHupQ8xVsSb1_BHvxpF%$+>p>Fdom*!AY>#~Wf8gW)pvl1ObYP0L zXMU-~)~|-=c#gx8(57v3kEe1Ls=r(Yv1{wwpX>N1PP2`F^dBrRyMEi-XYyC}r?FP` zJT{qr31sDlpSQ{$x}7%ci+-OEj6iYZ@P*~sgj2JZJeL1f>U8`9H2ZAdw)bG~v}76U z`^MRzPz0t`Hf@x2dW5+jl84cf;Q*R3M|?fJYD@<);T3K0RY_O BL=^x4 literal 0 HcmV?d00001 diff --git a/mods/vinylgod/maps/compression/map.yaml b/mods/vinylgod/maps/compression/map.yaml new file mode 100644 index 0000000..550793b --- /dev/null +++ b/mods/vinylgod/maps/compression/map.yaml @@ -0,0 +1,78 @@ +MapFormat: 12 + +RequiresMod: vinylgod + +Title: The Compression + +Author: Monster Robot Party + +Tileset: VINYLGOD + +MapSize: 92,92 + +Bounds: 1,1,90,90 + +Visibility: Lobby + +Categories: Maps + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + PlayerReference@Multi0: + Name: Multi0 + Playable: True + Faction: Random + Enemies: Creeps + PlayerReference@Multi1: + Name: Multi1 + Playable: True + Faction: Random + Enemies: Creeps + PlayerReference@Multi2: + Name: Multi2 + Playable: True + Faction: Random + Enemies: Creeps + PlayerReference@Multi3: + Name: Multi3 + Playable: True + Faction: Random + Enemies: Creeps + PlayerReference@Multi4: + Name: Multi4 + Playable: True + Faction: Random + Enemies: Creeps + PlayerReference@Multi5: + Name: Multi5 + Playable: True + Faction: Random + Enemies: Creeps + +Actors: + Actor0: mpspawn + Owner: Multi0 + Location: 9,9 + Actor1: mpspawn + Owner: Multi1 + Location: 82,9 + Actor2: mpspawn + Owner: Multi2 + Location: 9,82 + Actor3: mpspawn + Owner: Multi3 + Location: 82,82 + Actor4: mpspawn + Owner: Multi4 + Location: 45,7 + Actor5: mpspawn + Owner: Multi5 + Location: 45,84 diff --git a/mods/vinylgod/maps/needledrop/map.bin b/mods/vinylgod/maps/needledrop/map.bin new file mode 100644 index 0000000000000000000000000000000000000000..dc19dfbd757d3a7613d315ff44f8c852b4536974 GIT binary patch literal 8837 zcmeI0TMEK35JfX>Y9II`xQg!o*R|=LX#=H@)FvqiUSmi^<~TV?hGH|j**)CydOe+c z^GyRZKm#;D12jMbG(ZD1Km#;D12jMbG(ZD1Km$KuVEx;Y!zBi!&B4Z_#7iePbbp4M zjsk6v5xqObOhieG97nmM-{Nc8|JqSh{XCsZo7ra=J|9PYzv{r$F)wOM_`kU{HP-{gJLQO-iS*j=rKpGWoE(bkl`ScwE=TvTEbjc-lMKe zs4f#mW0pCspQqmB3w-L?ti12YRH;?Zr|z&(tKOq?!^OTA zZGRH3Jw6oU-@HRfosVgz#<4#;?oKUso7wSYX-%1`Y}V&rKWqYbc-LuPn!e^&&lky; z#+TBUocEYN(N4M6?bn&VGwto`_r8tGk-xY6wn6-hNo#?MW}XeqmwNyI+P~x;L6i8m zU@?fs_;0f30{=ffzT@i5_4OyifF|_lUS-@C!faGv1U7g7B)=VxcS)cS!^b-TVc8pl_i z)2aUy@fFS0U+psg{M=Z*v9>Dmncu5N)vJy5E6=Y2dg`N`-!Tvk@f^gr{@eF0z4cj! zFFgH03ebjcHkoI(N?6Q%$~VXUhn{G!Hq? an!l7G%XmqUh66Bq89ZJ6T-G@yGywoY2K_Ps literal 0 HcmV?d00001 diff --git a/mods/vinylgod/maps/needledrop/map.yaml b/mods/vinylgod/maps/needledrop/map.yaml new file mode 100644 index 0000000..ebe7358 --- /dev/null +++ b/mods/vinylgod/maps/needledrop/map.yaml @@ -0,0 +1,46 @@ +MapFormat: 12 + +RequiresMod: vinylgod + +Title: Needle Drop + +Author: Monster Robot Party + +Tileset: VINYLGOD + +MapSize: 42,42 + +Bounds: 1,1,40,40 + +Visibility: Lobby + +Categories: Maps + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + PlayerReference@Multi0: + Name: Multi0 + Playable: True + Faction: Random + Enemies: Creeps + PlayerReference@Multi1: + Name: Multi1 + Playable: True + Faction: Random + Enemies: Creeps + +Actors: + Actor0: mpspawn + Owner: Multi0 + Location: 7,20 + Actor1: mpspawn + Owner: Multi1 + Location: 34,20 diff --git a/mods/vinylgod/maps/shellmap/map.yaml b/mods/vinylgod/maps/shellmap/map.yaml index d9c3520..679fe75 100644 --- a/mods/vinylgod/maps/shellmap/map.yaml +++ b/mods/vinylgod/maps/shellmap/map.yaml @@ -26,27 +26,29 @@ Players: Name: Creeps NonCombatant: True Faction: Random - PlayerReference@BotA: - Name: BotA - Faction: vinylgod - Bot: wax - Enemies: BotB - PlayerReference@BotB: - Name: BotB - Faction: stream - Bot: wax - Enemies: BotA Actors: - Actor1: popupvan - Owner: BotA - Location: 7,7 + Actor1: pressplant + Owner: Creeps + Location: 12,12 Actor2: digger - Owner: BotA - Location: 9,8 - Actor3: streamvan - Owner: BotB - Location: 26,26 - Actor4: scraper - Owner: BotB - Location: 24,25 + Owner: Creeps + Location: 15,14 + Actor3: ampstack + Owner: Creeps + Location: 10,14 + Actor4: popupshop + Owner: Creeps + Location: 18,12 + Actor5: hornpit + Owner: Creeps + Location: 16,16 + Actor6: streamhub + Owner: Creeps + Location: 24,24 + Actor7: transcoder + Owner: Creeps + Location: 21,25 + Actor8: adblocker + Owner: Creeps + Location: 25,22 diff --git a/mods/vinylgod/notifications/vinylgod.yaml b/mods/vinylgod/notifications/vinylgod.yaml index 65fe1eb..36e50a2 100644 --- a/mods/vinylgod/notifications/vinylgod.yaml +++ b/mods/vinylgod/notifications/vinylgod.yaml @@ -18,3 +18,4 @@ Speech: ShuffleReady: audio/mc_shuffleready SelectTarget: audio/mc_selecttarget Incoming: audio/mc_incoming + HarvesterAttack: audio/mc_harvattack diff --git a/mods/vinylgod/rules/economy.yaml b/mods/vinylgod/rules/economy.yaml index 617a577..7384e42 100644 --- a/mods/vinylgod/rules/economy.yaml +++ b/mods/vinylgod/rules/economy.yaml @@ -55,6 +55,8 @@ digger: popupvan: Inherits: ^Unit + MustBeDestroyed: + RequiredForShortGame: true Voiced: VoiceSet: MrpVoice -WithSpriteBody: @@ -103,6 +105,7 @@ djgrunt: ^EconBuilding: Inherits: ^EconSprite + WithDamageOverlay: FireWarheadsOnDeath: Weapon: BuildingExplode Targetable: @@ -150,6 +153,7 @@ djgrunt: popupshop: Inherits: ^EconBuilding Inherits@shape: ^Buildable2x2 + ProvidesRadar: Tooltip: Name: actor-popupshop.name Health: diff --git a/mods/vinylgod/rules/player.yaml b/mods/vinylgod/rules/player.yaml index 3038d7b..3e8a49e 100644 --- a/mods/vinylgod/rules/player.yaml +++ b/mods/vinylgod/rules/player.yaml @@ -30,7 +30,10 @@ player: WinNotification: Win LoseNotification: Lose BaseAttackNotifier: + HarvesterAttackNotifier: + Notification: HarvesterAttack SupportPowerManager: + ScriptTriggers: editorplayer: Inherits: ^baseplayer diff --git a/mods/vinylgod/rules/stream.yaml b/mods/vinylgod/rules/stream.yaml index dfe9ff2..a2a2d70 100644 --- a/mods/vinylgod/rules/stream.yaml +++ b/mods/vinylgod/rules/stream.yaml @@ -2,6 +2,8 @@ streamvan: Inherits: ^Unit + MustBeDestroyed: + RequiredForShortGame: true Voiced: VoiceSet: StreamVoice -WithSpriteBody: @@ -29,6 +31,7 @@ streamvan: streamhub: Inherits: ^EconBuilding Inherits@shape: ^Buildable2x2 + ProvidesRadar: Tooltip: Name: actor-streamhub.name Health: diff --git a/mods/vinylgod/rules/world.yaml b/mods/vinylgod/rules/world.yaml index a506019..f95520a 100644 --- a/mods/vinylgod/rules/world.yaml +++ b/mods/vinylgod/rules/world.yaml @@ -45,6 +45,7 @@ world: BuildingInfluence: PathFinder: MapOptions: + ScriptTriggers: Locomotor@WHEELED: Name: wheeled TerrainSpeeds: diff --git a/mods/vinylgod/sequences/assets/smoke.png b/mods/vinylgod/sequences/assets/smoke.png new file mode 100644 index 0000000000000000000000000000000000000000..ac9ae9fc1573056ce7bf3a751c0124ae9f808ef7 GIT binary patch literal 607 zcmV-l0-*hgP)#A00Ik1L_t(|ob8y;N&_(v#sI;XmxX^;&9(s^HM8c3{Cfn^=G`~|en|vGc%_P|bfyd+dzm)P6 z>mGG4aNXd2@K~f?z20ccawtS2k8xz7TCMHiy2WDtxvqYav)=i&EKjDBdrGSuuBbGFtZQv^zJlZa5m=QvFQks{p{hNvlK| zkHLZ9l3CQ`tLD1~0Ve>Yo^BkGVmyW$2;5A?X6np$4FW0vOj@~Z0UT_D^!yHGm+a@f zFER+!v8V?=Q}&yPEZNU_zX?3|pYCkg&kBH|GSu{)@p#ndF8?}k5a4H5J!*SWv28(I z@Dh!mU4uY1-=qb>hOvrCd7G{a0vx1y<7zra_v`1h1pq+J)&U;^xu<&}!b46wt{y;T zPaO-lpRQd@9P$7l9=UB5wlMrRDK>Jf7gM@eM$k8;>8h*rosg002ovPDHLkV1i4L9vc7v literal 0 HcmV?d00001 diff --git a/mods/vinylgod/sequences/economy.yaml b/mods/vinylgod/sequences/economy.yaml index 7ef0372..75dc933 100644 --- a/mods/vinylgod/sequences/economy.yaml +++ b/mods/vinylgod/sequences/economy.yaml @@ -200,3 +200,16 @@ algorithm: Filename: sequences/assets/algorithm.png icon: Filename: sequences/assets/icon_algorithm.png + +smoke_m: + idle: + Filename: sequences/assets/smoke.png + Length: 2 + loop: + Filename: sequences/assets/smoke.png + Start: 2 + Length: 4 + end: + Filename: sequences/assets/smoke.png + Start: 6 + Length: 2 diff --git a/tools/balance_report.py b/tools/balance_report.py new file mode 100644 index 0000000..026d749 --- /dev/null +++ b/tools/balance_report.py @@ -0,0 +1,34 @@ +#!/usr/bin/env python3 +"""Summarize a shellmap bot-war from lua.log BAL telemetry. + +Usage: balance_report.py [path-to-lua.log] +""" +import os, re, sys + +path = sys.argv[1] if len(sys.argv) > 1 else os.path.expanduser('~/Library/Application Support/OpenRA/Logs/lua.log') +rows = [] +for line in open(path): + m = re.search(r'BAL t=(\d+) (\w+) cash=(\d+) stored=(\d+) units=(\d+) buildings=(\d+)', line) + if m: + rows.append((int(m[1]), m[2], int(m[3]), int(m[4]), int(m[5]), int(m[6]))) + m = re.search(r'BAL t=(\d+) (\w+) ELIMINATED', line) + if m: + print(f'*** {m[2]} ELIMINATED at tick {m[1]} (~{int(m[1]) // 25}s)') + +if not rows: + sys.exit('no BAL telemetry found') + +bots = sorted({r[1] for r in rows}) +print(f'{"tick":>6} ' + ''.join(f'{b + " $/store/u/b":>28}' for b in bots)) +ticks = sorted({r[0] for r in rows}) +for t in ticks[:: max(1, len(ticks) // 12)]: + line = f'{t:>6} ' + for b in bots: + r = next((x for x in rows if x[0] == t and x[1] == b), None) + line += f'{f"{r[2]}/{r[3]}/{r[4]}/{r[5]}" if r else "-":>28}' + print(line) + +print('\nfinal:') +for b in bots: + r = [x for x in rows if x[1] == b][-1] + print(f' {b}: cash={r[2]} stored={r[3]} units={r[4]} buildings={r[5]}')