From 6b9eb205d40fac9ed6f2afdc7dba99458773217f Mon Sep 17 00:00:00 2001 From: MaddoScientisto Date: Fri, 20 Mar 2026 00:24:27 +0100 Subject: [PATCH] Continued decomp --- .github/instructions/ghidra.instructions.md | 2 + .../00/~00000006.db/{db.12.gbf => db.23.gbf} | Bin 14860288 -> 15056896 bytes .../00/~00000006.db/{db.11.gbf => db.24.gbf} | Bin 14860288 -> 15056896 bytes Crusader.rep/user/00/~00000005.db/db.2.gbf | Bin 0 -> 81920 bytes Crusader.rep/user/~index.dat | 8 +- Crusader.rep/user/~journal.dat | 12 - crusader_decompilation_notes.md | 761 +++++++++++++++++- 7 files changed, 769 insertions(+), 14 deletions(-) rename Crusader.rep/idata/00/~00000006.db/{db.12.gbf => db.23.gbf} (97%) rename Crusader.rep/idata/00/~00000006.db/{db.11.gbf => db.24.gbf} (97%) create mode 100644 Crusader.rep/user/00/~00000005.db/db.2.gbf delete mode 100644 Crusader.rep/user/~journal.dat diff --git a/.github/instructions/ghidra.instructions.md b/.github/instructions/ghidra.instructions.md index 061c025..e0c4598 100644 --- a/.github/instructions/ghidra.instructions.md +++ b/.github/instructions/ghidra.instructions.md @@ -25,9 +25,11 @@ applyTo: "**" - Prefer a single decompile call first. - If the decompiler collapses to thunk-heavy output, use one disassembly lookup to confirm the wrapper or parameter setup. +- **When `decompile_function` output is too large** (>~50KB), the result is written to a temp JSON file that `read_file` returns as empty `{}`. Use `disassemble_function` instead — it returns inline assembly directly and is fully navigable for large functions. - Add a short decompiler comment when a rename is mapped from verified notes so the provenance stays visible in Ghidra. - Keep `crusader_decompilation_notes.md` updated after each verified batch. - Record raw-import addresses alongside original segment-relative offsets when porting names. +- **Always use `rename_function_by_address`** — `rename_function` (by name) fails with "must have required property 'old_name'" and is broken. Use `"function_address": "000c:XXXX"` format. # Current Verified Raw-Import Ports diff --git a/Crusader.rep/idata/00/~00000006.db/db.12.gbf b/Crusader.rep/idata/00/~00000006.db/db.23.gbf similarity index 97% rename from Crusader.rep/idata/00/~00000006.db/db.12.gbf rename to Crusader.rep/idata/00/~00000006.db/db.23.gbf index 8f28c368d132b8ba8df700e435d44ff73fcdce7f..657d96df766e33bad4fdc17dbfdf7f095ef4d27a 100644 GIT binary patch delta 87946 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%0AtuG6+jh^j1}c23S2-sitVa64wno7 zwT5J@9RStxzh>H_TALGo8MUS1*cWN&N4fl(YwjH zZ)qrReje)Qfp_`v>G0oFOM2vY%6*!|PTwim>RYK2K6w4IPgT&SSId{~i5iSl@RtWv zVDZj7zkcKktaibYQQ+;WeNo_Ttc|Wq_e^vDfA6>=)$;58KDE4Ev5K4U@b6ngwGG%C zO6umV1$?@B_iE$YrF&Amh5v7xEE)D?vhevM3Pz`8dxm>=e(^4$#;_OLz69=KBV)pQ zCir5)yVR>x3J<)J-M5rFU?VH3>TSLXjpvr_sVP2JqxPOxs)UDs+!0GDs?wCjTZ z2UbKLI8N8!vB>3Cx{`u*@y_V1i#+_Zt{ka~_s8&M6;z2$*p({bfmJoSe!QGU)^b^7 z2rPDZ_uRRBj~)`otGemdI4$LRJ0KYqEA~W<#x-(LeIh`eR(vafU(8U!WkJ!x^ng8) zWI}kia9=`r7jfg66?;;0|7m+HsewP1;nTn$(NJ*`9{xd((}-9pvw=UyVI;2HGp)&u zx6v{xRRG>3-0-a2GrR}4QPjF!yI-1&E$_MRi!JZPZp5$Jlj4a>zHlPS&AqQV4>wh? z!kEVa;u*%{zUe;<`GDsbCIFsbz|c_KauL(^Mjfo|G6}a$+=bA7YZ)c%QiOgp1HGg$ zX7p1TTyf19=4I4m7X(QEgrO8*FrWiU=Pr$QIZLm@E>m!mbev%-pqc^QYZ^K)GH%U0 z9n?UQMmvqAzQ!;EP{A-0(4GM!&lK*(Xp=#4w?vL+Bq(JBd#eCo{3VR}0f0Ahvv3Ra zC62>80?h`!BzyrL1gvMkh_^irbIF+J0?>sEW1a`-z%U;W$?yW2&3k9 zo7m+Mzysp^IAVSjgsxr~^FjcIa}pi{L@_*$`=;+176IO3SPa<8umpgp3uDGuq%9Af z=&L_%yR*x3q+i^N(E&5cH2Ft%!YCv8ZHASA9So}gNTM)i)V^dF!)ib;hBbiZ3~Mp; z{*_@J;2i~Sb0ugGJ0aiOASZ+|Zvf;oYy{lGfQGnDECVt$=}(3y0Ut1I1{`460zifd zV@5_LO`^Y)|7KLoq<+Eyuno|PVLQOYfE;N35yMWvQw+NR$XH>_y8)9Kkh0bT81@2M zGwcJ@ko6B|-H*ZhMRr1*^}`GY0my%0%pO2F!y&*B2E;{g%kVUy7Q-_b$$!d#W+3qx z1J2=2T*Gt(PSY8l1B_re3P@!@=)^h<&tt&44(lI zU17|h0}e2J0a)Z&Ilt$h(VpbUb+6RD&X`|rZEL3>-cLpNdO`k#M5vz!9=`a-+5x-C zN}v2OE}ts;NSB+w(xr3>AJ^&%*hg3D;$5M=r7qs=%$F|y z1dq}sJp8k+T&apTUJFnqzV@S32@kC51_RG*<2z&y-6$d+;!{FKY}thrH!mBL8#{=7 zROMNDyE@-l`7>VXtir>!!JRTV@0J%3yeWMZOa&JnVmQ{~^w;hUYgELp6EE2F*VI&C z@maNh4y)q9yZrg$!5?Zfo{3$z+RX#V>u-%K)56;e`gEAoN1;@7ga_U+K#slXMbT?F z0+sss^E=SjQOr4o)a38-D22iY?-+8Oy)%u+K6HBf$GF z`V!<(-+436#;qIP;ClNZW5cy|Q3G*G{?d#(rTFB`4R%?UXXDKzeP`oOrx_FD*QIpj zbOzn7dN!q7LYn|Tv~xHR>8 zn+ZV1N^kc8yx#7|IuZ}NAYYq!wN(JTXMF%mN1kSHv*52W@(JQ9~l+^wn)ID!AC%-0>bEz0-7R5PpsI2fJ)G-bf05$UZ=YXHzFjJ_7&t*Gk&&BXcPs8?e7`g_uwrsGD?jT~q;K^sPvL-JVQHTAe=`wgC%5Jukth-KJ`$M;^{y8zz&LBy=6`!dWPz+i^GfCvR{9W^`rD|Xrs*vfDKfGR1B zeh}cz1yu9!P?ePZyi6w8(~sBjG);JN`>FE!3V{=LcENsM zj#PVD5kC=EJ2VHJJ}`{mngt4{RNNpo8nz%s`WuTk2pky{z}v0z4%zK=R!`?Qm!MGUzMw0=dJNG83BcuFu zri)|*s`Rb|2~xQymK7M^MjmZ)d+1K@k&&b_PGw9cCGq-8LV`5z)|JMQM#a)oP28b7 zy+`gLjsIJj?uu7hL`xBR{X*OoZ-+u`OYkWv&ge5@p!|S}Gso3|OEUUKpHnw3{C1&% zJ9NvPhoqAER#KAYRg#&R;$N}gEASErmO2nR4RD^+_ znxVr&gYOdDc>DpS;^k{pbQHDV8WkOd3hza{@%VV9p`0|N_(h_VC>M2w`tOGC_HBnR zcFy-p)5ha>D|KT?T{}N@9b6Ql>!|Z-LkK@z8yYy3t_afA)~hQzw^OQrF4OHYZgJ8a zM(pnw8mESCXfQ|yJpCmFO!fxMO?P$nD;*V121^TF|K%zf?89Re%vY$n&K%LI`R!;g zYM8NT;raR*q3hR9mEq2gr*Q3kr_1grE=9j^>Ml@3)E&CM&wDcDf7ek+Uk%7h@0=%# z@0x7|;mzgHC+9iG<5KuJ1@=E=?3|YA`st6aQlBKAwcIAsq;!&U_Q89>1iTX z1z3gaEGcnf+D&|)LM(XauPJxv+86JV0k8B93h2s^J)f^G(E~kPDkaF7>*dbc7kfxmUwuTX;(R%b#!ME8 zxLAB!B5KBO%g$Tfp+zn4Q6Yy>NMGOMa&}0kkg8DQdVyQI!l$2( z!iH}u9ScZDsyB1;I=eHo{nAJ~v?8Cc-Cj0W-?LKRPu)nLuV>8bnC{=xUbAazu$rxQ z8n9v~5U~h8$rrDVDWV$s(&oSWDlU*fEU8#tB+wZD1KOpz+yIu8|Yzn(NFH&=`TuGK-CK;o=^ z5y^YTDYfj}NfGJf%^9c5=|7Z^*+P~2y8HfVM!VlHpb^M>=2oe0-}|Jlt5;oidakHJ zDx;-3|0dCIS4p|4B!c_JGiNg^?iZ{$L$n2?xDYRI{JZ9$qR83YK}C5sY3}G3<;;L~ zi#~MbyR5Ncr5a!4Y;GVG?0uCK_(liV?(tvJ?Auln0sT|^K+v7@#S%526n{s>l zsHTA#t!9#^5VfLPsN;uWQpNfmq{8pQN_C2kG(d%KgoiY%dgZuil^Qk=Bn|1_NH{xX zTzhE-TuX?M*z6L){4?yrH&WsDNuEB&Tg}m89A?>S<53S|#3+QH6G z>^Op50>!PUpVn-7E9xs0H*J!dJH=Uu&plqFHmC_1>^!E_E~m))S^#HuXK{n*Qwyy( z{*t9%Sq*kOcPX9X{=nDyIkV;cL4Z!$zt#J;45Hw#$!SPMmwu(lWtA5q0!0N=#P$*; za=TA&P`Vby2A~cbT^@P#^dQBN2V<-oRoUp)(EeBMl-g$B@&BVOSlNIvl^D+VzoHuT zS^r;A3sNSZaAeA_+4?2C|CLM`)mislH>wHa%kc$CzHWRe4^nR&S8+`i+QNTrd0lP) zn=*>4_Y=7RacwNLTUsr?u6FnTuHO4u-2n9_p+4;GaipF*gG@(mYDfQ()D0%2X?WqM zEh|$#%?NutDOg*Y)2}tZzBYQMAE0csjM~X>f|RAWe2tQOy5suVa)Y&vP};;zsb4}< ziTeWOAMU)xoF6f3pI4yv}KYu92lRCaHbwgja%m2pIr_c9Q=>R<+Dm@#65}EDvANKjw1T60fj+FaFsqI5?m&?5@ zBIOLY%k^oax)8X+C#bpTI(olUc_y7A*vnVFGSdAcD2HcmxitFUzTE7W0bLqBB=w*E zjP&>P=}&hB3=9y_e^-86DRcyA&sW;(lXkyrEhzDGc-*4K;Wt#ZPe$y>6;g!<)^0I7lIh5Hx%^wt>#cf00KZsuO6)9EJ-3il z@!$-a@-qE3(NKcd&-=bv>s91l6WS>;UTNA(n)s<1Y0CER6=V&h(eAZNf)LKDk~CVR z#-q(iBRA`rj+~TKUxzxKp5?o*|0!>OWeHcMvNyzZ8jtItEW3k$Vam#Ty>|`*BiFHV zz0#MA$hp0D+oUkFe)Nig_jiI-R-xqZ{$;%l~8DZu!Y?zw~z4 z6C+i<#&twh5j=tQFW75T;Vb5Wk?OD~Ohqc1A{Fnw^mCl4+$4+LCgc-2{`|OqTy}r2 z;?h1yL+3RA?#8DeI10PZN(HYzP6~WiVoqjf@mSEUMngiwwM*v^CLlU5NNultAEd2Q zo_`O2eP!1~jphXL&@k*s4bsMs8tGb0@xNib?$^-$VwIlul8n`}TSyN-DS@6GCucM5 z=|Sy--}ls|hOT0=K0U2ksYoOhz6&NhC(Xb5kP6=mBF2fIX^t{IZJrGL%s~pw(^)uw zc6M+JUs_aNg1gCU=j+qc3Z#;!MbGBfoCNl4L9K9pVg2A4o%FN;o)5pi(0-{qi+zi?05=(c2PA~ndK`}e-cew~Q_rr87!GP$m;W%F0Zd@{7En(?L?cb> zyhTAh4*+YZP_)?oAr7lCGTq84&IaH>an0~dWCyz>0!A=&$3wW^7;XcMVK|Q->H@4HrnMg0vN=2B#HtY7XeG zAgdPopr;hf`3a59RR#0lk~~bod>7K+=9r=dAE1I?lpt0jCN)$*>l#}>sDNHF(%)s+ z0#K2|HG-P8Qn}E|OQb`Tr1(PPB%#Wi17-qQv9xQ9z4m z@m{P{_ZoD^o>xGtb7OB}cn^j8rUH8X%Wh>Dg_*JwRYkxCT0d_N-0}N3>FBLYaQgFIHR;WF}a0(EsDqR@8CmFp! zInn!;jjky85HZB2vodnDM7-evhRc9D3h4dOsB8&V`Zzs#lM{(AeA6Md1Xo>FJM^edKktyL~R9RjHQ5xclYs1nCK1y*XUQ{L#KeYP43Xz%s9 zE(vvO;99A(K|#%*@n8!}l#nj1uA5##4j-f_4*qJZdS5qjD%LekQZD*fl+%6%t@Cls zexx8t2dE;dn=wYyYO1ThZpY5(7#>pII=_j%^G_(yR-nb1Lts=sxoo&6V$a1jwcL*k zbCs3a@vTGI-PrFKU{|v~UFa{t8!?zw|8`6W({ z!1VpZqC&se!F$d``$%ko1^qcWqr2Ekol|h`5`3|-q|lC;&=Pjd%^01G0~5+ik;Kws zd-im-yebWU5#MAx&1N7h(qJ!iO_iq$g{pCgqm0b_n~RF`|6hAw9v@e6tUF#n#uiq* z%M14Ls*$W^MjA;Y+46!n47M?NVR3{!8jWOONh7q_76FD3NC+fA2#Fqq3n4%tCO{xI z&H`acE?HQT5N-&NfbDRBu)dHBS#NmXS5N1f!0`C>$xbYwlzfyAy5A#hTV0+vPPSI(xQx*m@}SRyTXx8p9i;M?8?(!-jatx=m}=c(IPk zCa)W>UKA<@mq??sawB*q&+MRsO1)F1Ke}0hR{c}QCwn`Zx=X|o5A%`6h^+OnA)M#} zCEVe;h29nf5sF8npeA`sJGNVh=dpEiH!|Py7e(qzy^XQPwghkLJufJG*nUE^u-F^H zc!Ah^i%4y@Y}tSV18s?t)()ii#>tdk54f!}+1A>TsP&dDU9)DTM+<8$Ev%*9G7N@9 zmzQirZDF6S<-K@qB7(CG&SnvB;Nd6Z;;T2WT8cJFa5#^_;Yu*b=x~?}3#LZ%JJEK% zB>~_Xdwa;f-Cko?YsQTmzJ{la5=^ve#qfA z^n<6CXkClFRsMg++kb^%Vbou2hAB_f+tp>eS(+U~7w$-ST*WvOd%2qH516##zq`EG=z$+*z@VG7H(wIfZ0!Aj*@@6fJDHC`F1QFi(9`XpxoZX=e&lkJ^gXd|;o8aeSwb_hoRVh}a0%_3Hd zAxQilwXHpr(v&@`NTVC#st*VHS9EmuV%_V-bhPh?wWWF!USd}(C3ve$16_Sy8&HfQ z=@dIIBWcoucm|K~MNV*_Ld_IC3%n%S-?g)~8}~bDucPGeO7^yFvwm+#o2T4&aYuEu z;y8_x;+o|N2#X~8hBYX`emyu^S%th4v-;KI%_47=A1H7`yULrw5SlchL2k1>5IPWPKEVKY(+8cx{ zs7gkqwaJ}bWsXp7Jn2iFgY!0DY%Rf2xZXCoA+xns`qN8$lI^WjXZoDHK)6Bn3WPZM z3U3NmdBJ6CR+p{cwBdx6UQ2JRt0~b0vAVk1)4UO8g&vW>tJ)zUAtpN#u*0JuX|ryH z>u3Y*AO&igBVHp2F;ZCoc$L=YqKx_or~Ln^jjVZ5uVJW|R3zNI5dsb(oZQ}pZU)hL z8qn`n?st@F@MyA7d0~J1{Ri@o8@Tz9wE?D0e0P1Kt2Now8uw!HcyBxV1Ve2*L#3f__2jz-&nC8Mz4IMuS%Q5C6RQq&bYuXbz^K%<%aW#EpxrxSU9C6*=LM-jfjuH25AR9FDKI${!E2``Oq~+-j-wC!8Lf>c znj1}Bvl^nIOP5wzn#_5^%U0nq?yz}NOubF3z1P-D_5*ssY=g+1z81xwK4Eb`TU^Lq(<%SQh+j~P8HG- zjzf)x3si;TP8wG$O|qt-GG+N1Fn@3oY{DrCh|5l>m`>0`Ci$OC{PUHLV2(Nek%Ue4 z{zLn+yS2TwE!LH>@u}02-bcj zs9WTBOtjOQ<{A+}HR0m^&U+3_IP-|&PdSgLaq%oA#74;4Zm)SjU(6blO!jxE*sziqZv z=YyO5&IdMosVY+m2xc^f?ea2=?y90jL^}2woEc8s5VadI)EVM$f3PV8(ZsB(pVljXv5ZpwW&*#B;A`Nwf zdA2u<%J*z5#@a0rhZB920vXbR9y03zict1bvzIpT1{0I8w?Pl#XwImHuT)WOg+&ss zT)~g9*l=CPjwjp6nhkrB!Hy)23w>I}V)-G&nIqP#8*Ro+2HgyHw5|jQ2^&f43}-jx zeli8Rf1plJVoN2@I%}DMhwkYtWH}f+_FO7F1wK)I5sFN=cqRiv<|No4=yfmHpm0_kzAfkjpu?Z8fkSRG#^i%u{X2onB=LrzpQFKEKfROu~e8jJ5L} zT+ysY-*WEa-WtvwJ$rUdC?PYR@IEN#Wtfm9~O6V6*;7hAWPvceA$L_#IFK!&}l zGn!>_$mBlI23=g^^Vnc4w(rjG9N2JF|MWcva#Fu{W_pZGL>94`h4u;zdAtP&D>{?O zwo-2u4I;3%V4>=h5o^wx>Vy|$HdRVYDA1Ti1CK4)iS_ht3CZ>d&v=O48xNJHXkM|~ z6oasv230tK9v#~Yy_t1hNx0ajGWuUfH!9fM!7M1MI|;_3bk%~q#sqqheNUx`wJ%Xi zpgt-K1nj~sBIEF@LF$z~NwQ0=w#1Su(oU= zxvNt3byCp=Sm%m0E$S!5c3D!azRtv>e!peO@%lP$7sx3w@Hu8K-K~S>+D!R{He$-= zdz{2q(OGPx3$?67o~DE_uqd-ib=O5J*+ql&Q2+by?Vp|sqKRIS^%HiPq({)P^(!%- ziPeBJqwZp&Bft@sSHf+m%t~UXMc4%TyO}C6(~9Q+&Z9IOc-_5m$Q|xa^=vE5SYA$f zc<3nZr1yb^#TH6aXIUK9@>XnYc95+aF?#Tn7J<=QOc4#{Y=<;ND9FRqL1sy+^>OS! zBxp?TZ4)x+$nY@b#<*RIx=eIj$Ri|ywVcU0cKh>UyC>8Jt-WOJVsDRr&SDEJ`<+eyV(+cNO5*2h=n?ftSo#X5sC7EHmI4`oWWSDJO5GQ6~Z z%)>+T$s}hF!pa$9Mf=A3%Qi@bzhe-7zN^lxmJVH)q*hW53!Zcl(-+zt|5 zSohdLM$S&?Q0Npb+#AvU7q1aixK^!N11Sm{PB%b&n{G40kAZdW>gAB`Ny=^LlQITN zdXl2hAi=4OROMvmU%nhW^L^NtFA<|;27_d>lI+N-*yL;qb2LYeNY|Q*sA{LDoRU?N zJIIAvwvczdBb8Ck6)Q!pI3B^CR96htmI|JE#^A-8o_wTI!w}?BYAm~4+m}(c!Xd3d z`ygy3bC``_vV?J!N&zMm`H~<5gESB(wwo#voOHpPu31lg4JIP}Jl))TxUPc=fKwhV z=1GPJk!d|iVKU{Qh;z@0L=v6@U%1Xh5~QR^*O=Fdc@8=g*c0=C>46ZVJFzK2V+i+N zIAXX>fr(Wj;0_chn>W(>!54_(Y87QCzotr8+t@@bC|LiZf)up=qK+E0WwEso<+t(M z@i-RZR#YX_6Lu!B%957LY2b2vO-B*JLO3~lOIMqf2FG1MbH^CXi8V=lW=QoBt+CfR z!=1=|GB&un4Vmn~jF?9vA)4|cZYKoAHz(s*)uv6B<<$x9-QuT4m}ER<&volFD&%S+ zc6rEM>NA+zv@ZVJq_?bCTm4CEox#fESjAxgHkmc{OVve)wFwm*V_mJQ9@<&^+rE2X zX6p5g*h+=HejApLAcDQ$v5}&VjbPX0F%&ebDFLyUHf?6m14Y5Egzmv=K@RGGcHEld zCY>67V!OZwkmTf^L`sz*u0J_X#Zh6-GI+kFA=cU;WR*C1yM%$^NTh7w9WKR5XJ}|n zhYnNUY3(SH)eBbVM6r+%E=51ANDo#x{xFS`L$I~G!CH*d@$#_9ex)L3Y-Td7FGIc$ znFa%jN?;?P?wfTbu-nGd5Ex(L3&K~8brIurrW{*!Lm$O>p@o}b~xkA)AT3|Vg z;r05}JguDA&FO8#x)w_z)lV{bR4sMNNbGemA_Kl^$GxBO0$+^`hJ%7}G zSJ_o5o(@;2xRozwgiTr=5>qjwcLE>sh!IUrM>t~?sV%Q6hatkwsN)O5s&aS6=#Lw8 z<06A9T*kW5h?%R4s|FBPrfv9m@mg`hsSC?e9Jc}Qw8EH8;Y8WqPV*A&?9dd%C=lc^ zpf*@7I7BkeNkNTmg#3ypF^am9Z7^6RcVbIi?5Uhxp#$S&3`}Ye_^{CRm^n=pIoPM1 z2Eu)1-JercB!LwUj`2a>ij2o;3Ow9q6CkZgaz?8y+0q&}x&INJpD?tBeR2rk)d;-@`h;!L5IjjiC_Z%`G2#$g3g@eLXILfM536M1ofyP{gm+6Hw$W`wD z0Nz;1!?|*Wf$VWeIgl#^A^mZfw{n}i6#;U*Ln?t#b&(4NN8WQtHISb zYX`ZO0U6;CuuJ(thpYf{ze836!SQyxRsrjD$O%ABbjWHT=xDu=8veUOaHu}~D~F&* z!uL94Es)PRWF3%Zhnx&#i9^u(A#orevK(&@1e$=&a<>xrGT?6x0oh7^=@6V~FZqT;wgI`! zAvkYcf85q_M=5UFS^bleLzr(UgzTL29QOskKu!c zTOD#95WfxQ13};Fbpa5JY`u`B;6jJsp90sQRN&*l{1$<&3j7v*0^dix>K?in$RiH9 z1jzLc`6Q504*3+mobYLXDG;CbpT>t1@3?H}xH*p#0h0y-mjm-@{}~_`GL_e7fw-y$ zt^nfK^hzLpO|Qat7=BGZ2jr1`A6wPDX4)|x3&|;(Jgk4|-w#aA9kK3rqg+z|lD{9A zf|OTZ*OamQB<0u<>%MukrW|vXdu;71wJymrt-WcLrp!C&XS!*YOR}=pUUaplK=W~4R5Gm}io)%#eBrZekGG?4YV+kGPvgSBS+;aUUhCXKgRy45|?%F=08 zmQJ&>beff=)2u9=W@YJwl|@#`oz;ceHQM{`SG7j?;7a)7*qps5{9Kdr-cBbyVo6V@ zllE%ToD2Mnv;L$>shqtPH(63vkAC)WH244#9MYpu9i7dotHoKJ zx>}4POO%!ayG@9rw+8FCy%nF*I?tJ_?3}ZA$}mlt-Rx2(zhmwClkx7}$%FE)Y)uWY z4riFu8XDqFiFjMM3d_gC_xuMp8%i$MJ=X63UbFMRJy=)$ZqTmkR?`{Qd zR$yZ_^NFkm4Y;RWdT1hg_s~Q%SQ6o2N47*z8^7@ba%(z9t)Cvpy2P>%#s_j@Ao#gag9a#MLyiSK6Xx88Z?|7Uaa1T{`1nG`Z{Hw+E|c09XI|zaJQxn{(Hl zZ%Ph05VpqNe#ga{a%rxg(rzhxT*}q=Y069cE#=mEuW8CNk6Fsif4kdK9`#eMv6Nmv z7Ku7%JbV?%9hJCr&1$s=l|-QaVn2L-V{B@Kav2lyCVdI!VA8qo4AS=K13f z{gitwrOQwGvX%3ypYl0Px$7=VX?}6EraXC?OL^h1n)1X8e#);k<(_LTW$V|Tw-ndX ztzY|rrd<4emnUizyW7!uYxDxmb7PO6XS=4{bf=$kmZsdc&QDpZDPM2*Qx;pwCO^fq zlq)S|ed9_^xx;bz`o4!9dGO)3pK^|*jQGV`gyKIbp=l z9M3O_-fDRo{5)4$%4k33LP^0_<(9JO+!r*@Z|=5~g|n2ON4$8GOPQ(kLF`yRrS6xA-Ym=kL8`Db<@V*E|ni;ivRk z%DsNdX`1rTaem5DO?m92mQwX)>(j@I{S>3dPoA-q%4b!!jQFv8d*!p;TFy`M{XDAB zBbbt(a)Rdh(N%s*nWp^k_kN1XOni`TDHWSkwv4#{c0Wax%@Ow(_$fDNIp5WlLT*mQ zCgmS|3@>?xBjt>J2mX8@cy#J&w{(za#BV`>SC!!6xmX z;WHHX1E)2k3YE=ozEX!OFY8di~h_XTuVJdr~v%Ib-YKId-3=A zgKM2fn0sk1e{gkrgt?dQ;Sa8)N0@tK4}Wm2@d$Hox|2V+QYU%*$-QkIe{h}X5$4`e z&L3RMJ;K~OzQ`Y3D?CEDK;;jvl^$X4*EjJ8m(ByZUvF15u-fB4xnIB1@KuKYyW*+9 zIht_SU6x^k;&KU?wVw;A55_)Gf@?=akT*)qjne%9`9QT#R6fR7sf8{Q}X)oa4*uEjCM z-w5FzudNz{7Pui7_k$-)0jvF^hz8y>*{ z$1#Dx(AzopV@UlL$%`K(_zb}r1SJ5ASl>lIAh?3ybb=s2-CqcvARw35#R;kiII0%@ znt%deVIRQ>1hW7Zr2a(s6v1wSiwT+uSnmZh3627&eT#rnxc1uw*AuX;+RX%&1ZY5@ z<_&^}2w0DrPJ;CWq*BdLfaos?ZYJns-$hwMl&!1&PXbE1>PHFgCHMlt4gyl4x|U!P zK-FIfo+tPYK|jH{1T3!#6b)3dMwP5lC3~gv7J|zN&})IpQvgzxVg8#35P6f}#{{fg zq}M8!UWYYBD|oJPP3R!j#d{~G}*FFRM|*YUqy1njl)DuNue zKM+1hz}^nuNWeyf>j@SROautMP4GAY-x*@(hq?*a*bv_tB7s9A0Loq__%6Zc3APg~ zBOs@gjRq)XTT7qh*eNAjlwL~ELa>5hE&(~G-u$wdSm1X~DBASff4 z1W^1J0(MUE{RIC)Z~;LB0pC$PpCH99n*T?FrwKUz=QHV_#F1+oKKKU9 z{FLAh0yc5RIRxtnLIlh=oy;_yT{8V!1lJKT-}Dm+W(5}A`%3E4#}BT0Z|{L8p5E7c z)X01D`>!wF@AX$~++9BJ$e-P#1YSq?4+-BmkyOP+as~3ULU_T1*fLk)L@~oc)t^148A+TZU{o{BzhAP zYz2w9@)7{K_GN*5e;~<$<0zeuHPd~A9AC8?Z{Rm0Dk89g+axK)L+cHFnyuhQ{Eo0K z0hdN0V~=v2;41hkz<{J1kd&uSiX|M8v?$+k6>#Ve2;Io!F9RIgy;9zJ=zc_Sbevx9sI7B8MHc}vN7JRAy!qAPA!JfQ^4F#BV_+W*& zTR_=7APdg?Hpqcr+`=XDbsP_&S`e{}5L~#O$Ekfn_U%+UUKVpuhL6t7ArZiM=WK$E zJN(oLNle`iFfHTOVBw~aW%%&}^6^A=O2TrulV!+&Yd9r+W`XW@gM{P)H%c~*aXKU8 z#eTl*a9hZo$44e+WR>qX@rg+uK8m!`+VDHJ|DJdEPneAVMzJSHxX*GlOTjnxofzA_ zY{;z1hYyM*IrDn@-#_PI{=Tm??!I}*;_-(D<&nTX$eOni0I?v&ofkq_G$GmyzN=}l zpgqj7q5r|q{)zieZ`ytI@YD#~Dsls3H*&Z%H!{A4v`LnaXV@F~37ER+wI0ho6OOk>y{BrWPO*tJkBsPe0HxsD#U93JLG^sL-`T%q+wNtn$67Hw@R1G|i^q?98DLb# zU7)xMZUPu2`MP~y+P2#pl5*6QFC6ttHYXG0`M~gM{LZyd5DK0~!%Ue#au3 zUt>9?@ICwhEsVGzfVps^`1%@o5z}{sUtO@l_`R zWY_C30fLZkcrCyz_Y!%BBM1X+vW^=0$mmavE1R5I*|P$0A!{CoxclHwo1K*(4(r*| zIJVAH>k^lhPf>;rcq(O|V@RzAJZ5S_9%W88Ke?$W)REBE zQhs17JTjci7AGCFS^j6Fm|r^Jlo}tCAP=s*H2~Q?f7m!krU(sRaOfj5n~o4W3E79& z^xyT}d#3e2-MV{rYS`sNkOYY{>=K%QJRoYaT|7LX2<^3tRvPlcYq0FxW(X~{b>kg! z6HGhitygTc3;v*Y#6G)VmqY#x!_H7cKCv0RQu}$sXqT-yXb6q6HKQG}2R4;!452x; z@<)cy78}`b2<@;DbG$1?*oqpvLkn#AvkpONVe>_t660(5bh|~%Ysj2Ti`g|)>F)eH z3=`%_I+ym=(#3X%#@3RH4WXsA*yxjc&$VEgF1te;Yf+OSG_V%ZUo^)`F3qcjVY~Ir zqd<)Ixz9X?CHymXhep+4jv=(D&ijEOFYO27ycyHa@mxnN8dB%nWZ7s%o$V<1+HZhN zF=x%Ww4cth-pi%&bmlAe5G|)OCpZLaVQ;1(w3*K6a|l+yGo~6sYw7g!9fB3zaql_= zljU(|7y=tfi6=QI%FYc?57;^Eg;nnc@@)X(h!GIZXW*$L%91l?p{Oaxp}P7addDi7G$s59eQpa zGsX~lZvKd|jCgL&Gl$dSxq0*hmW`g9M-M|2%lpq;w)=?`jRvLn6MTVy;-IvQ0DplJ zbYY<6UV z{2amA1Qc&-l>(gu1eSZP)RTaU>;a4Fprd(_kDuv2{>HlZ6+Xj)B^Pc z{+o*d8JNqq&!t{8_hfavhw6_6I@SlF2N@9-()so@+g3OmX*(U=HE-e5s}|V zu!W$Ofc!D(uLK7Oen>zHPWn7SCjohFQVqd8f^h`+3ru{I;5h<5Hj(vBO(Yp6UO_-o zOeBL$+(f`xe_|QIGy+m@0xLLyl$r1|f(Hn86L92AxR`)6nm~S@z=1k}gqkpyU@XA+ z_X*x0_$k4?~K~*xLy%C+HwJg&;yeT8#M%f$-m$hxqT!1mw{%tpp_DnE3=F0Y36Of*%pwM!ZEL(EyT7qJNApp6*B)Eg%LIReOTSRaaz^IoA9wlJSM}3@tH5#>)V0K_J zApQ%CB;iIf0$}GIGPz#mV z4l%DHOa}>Y@~8e22YHnRU%+?qgT1o<=ifdsIrW9P~tNgpAyTBczHcSZ_v|%c%Ki87k@2CK3w0{3it5laa7!oNlW-Oe33qJ zR=E(79~q?+@fC!lYFLVCZ|#PoB$pNv7fNV2wk+Tc1s;@W#KBwZx5zuhcYOU8lvytX zP5rNR@Rd~}&K#X%X=knwC;6`O@N40GojT8h!6HA1NEF}AheP#+!9wrgh1a-(v2J`W8cgF?;qa{Q*NC^>J0yHakX}uit*B#mp)7Icrq$_j zt`hlb1WJHwHQCProzWx^p*m7u2iJ@as|02~4^eRtmaGG>^f1T4KgWfRx7p&owA&9XV#s(5&Xp}O9`XUN)Sa1wL+B>Pm}@QgGeDZ=;&r8U9nnt zPw-q7*||b2xQ9+hu#pre@wBVpHU)kf zwg@u6roOIDyDfqsFyb&H?GFN5Ras%g7sCmSI2omPTlj_onjWR*@Tg=PqLt89iZ7w) z#zZqqBU)Nk+b}N25C$vwGIAGV<-l7Prxo~5f|nI~0faQAQwQO>&8pMEe8UsLBT zCw0qdu{QXV{I8O0fy@x_EhoV}z)XiDniIN*smfezR11|>(=(BHT!wovx4|jn5<^2f z_qwGPR>T-oW>Vi97I&D^WQ7|P3?7|D;lxTiRyOa&RVTS7!tgfq-|45&W9J5Xs~zh*vMUGAPPFM)iL@h-0`p_fyh1L^k6>j)wn zB_a`-G}9>vyU8Yqvk(vl!WVmk-QcH_J6HuqilHAoRERPUNgXTIQ@=PP@65u6dCQ{ zW8{&*NKIAsWjgsQ8YLQp+b+a*5H~=HuEltv`E^Cm05k}mOyNRk7Ym5StHkkKG+w=x zec|Re?LF~-Q=|UKd{qYXWF!QILfrF8?}+QFG7b(565lO2T%Aa*o8TW=T%AZO|KG={ zx|1S<8ZnYXZVmn-9+{}Fr35KFs+#DMeGA7{Klb-g-HY%alug1&t)e8!j!iC}v z_O=Dzf<*LN3`SNmqO1y|BK%K+e04@Yl8-l=g~SnjW{#$*UoT0A5a4ZSl>EVm$oPp= z%6OPOd4GYNWHzhq;~V+iXEtFuUmhl=E&4Ds39Vi3Utc+(q<)P1ThQ z@1?8+h1`}7VNreIs1_P|skaWx7`TFCQOF1>(FDe7YGv>wq{+kZIFCs~Jr?y(+H+uZ z>YtI}ioN6i85!=Mk>MEYPtL(aYDBfrv1a2^BvQlScF?hbeqy{rf|7S9pf%CeIp&wl z0D0nkPd(TTR4T;LbZa{n8Wg;3Y5_^zwoE*jn;|H?v8}boTyToYpzDb8TDP94gQ`&Lhgp!9t1D#q z0>rvsO*Rnu(YVF*XoJ5@=zv=YntWO$dc?&I1P~B+Y}kiy(45+$>tWBXFC= zV^~V%0}4KZhV4YTZQ{rmdP4_25NnTPUWNXoaRKN%QQcshfk$Rh@gQnz(aS4JaPk)P z*1%-xIZ?;nUyhMGFBnRmf=gMFIquzu?Ux)d67417ziG{6sXGeV1 z+{^&0GJU5mQj?*wgyVg6&WxdDkrh-!N|y-Dvjm|p)4?4@Ehtr&^|~N3QXl{b{S$Kp z!@)2E62Qm5DFUqMu%(k*S8D)ASL z?`pwHho$5D@44^5gf(kK4RoQ2YF)U2bn*PJ#`;g<>14^|tdnl0kPlr(2kXK&9`E}e zZyob;(WnJNbD#vI4TRDubyo+x)he0X4_-!v8DkRLoC4$yhT~u1y`ynL*yM4=2De(?;0ON zX?KC{plE6p=$ja3I9*=zh2^F1_mA6iU~KB?l~{4ZF))KRK$L86MKl;^d1Xbw>=q0M z^n*-9ouqDBYeXiLN(!w#l*{H*8lY~BE~OmoCLgvCtxH79VXnsy7Id33>DjZB9%NBt z%+bCFUOks>6AHEej9CCONrL2t8jIPx1o(44PrpSQt!o(@g#~t~5~~vq$_%TcRonOl zxuWQFEYvn~7>iorTTw_5Z8>;J=pav_+qnd@yck2A^=mLg=%NQNFj?k03uYFU4_gAd z6kU@o#&o0%ZC-=+CA>|m;YGc>2X=)rI2rF9xcJ)`V?4^BjXN6gI9sDzS|Aj5AXyB1 zoXlZLPA?}hTk9%PqO`DQ1jX1v%wp~z@Z@P@5?rA%hJ!0;`Y+qSB_bAm3^iO1GOp;3 z0}ErgX~<$C5yrxEVT&y$F~%5u?v}yhHDY~oHIAI++_ouCz={H{(M7XV0x>9-#ZojX z9bTHiN{$$Ly14^>2hX*arB|tFx)@C~dJzsXAMO-mStAQ-jFiRV(Pk};#D+WC6k^49 zb;n#l6W6&~u0N1yZN#Wx1JGu~z9J<>0D*zD|0I03+%!d^nVDkI5Q7afsKt)fI0Cmx z@E24Y!6jf0X-#hLz<6#;Hew8eC94zVu%On#Q!WAtsLhaD7|C8lx}jpXK)E{t{;UHj zoA4BMFR7>8i$*Y`+VhDHxF=5_)(K-`aRsjO=pl*Rf`zOqw*y*g4W*FMy)ns^F<<54 zWI+$=e1kUQUp7$n7X6N$v3%)9ewh|(sEQ&ys}n`sm5RU?Rp&t;fXCpp#ALJrnId&e zGRTJrM+~2}2uK5UN<=uUavBeU^rM~J$kjF7DZ~=M*c1^;Ym6+^Kiw*XVp;}{YC=3I&dqHDEC>&~3s-U0i+QQy_%uYw`mlVGMH(08I=#k26YSXhFTx z;8So<&nXCw;UOuYjVgbqEHu@?S|V~B<_FmUP)nkY({f!fX(eq9VtQ0J0}qLw+g&D) zaA;9qYNH`t89F1-xqkAamAE|Ho}H%E;c8Lp9nU6oYYbtGA~T%(yA}{9A*_f+`Z{$K zK9ZVgOv?NF<`5{(kYToz~89>9W7YKRpO;?M7B-GR`Y60ChbH5Qov z@BYCMu=hGx1hBh*@V_FJ~-%5|;8XpG&CqB-90dtHrFcgCQZ^ol>s^;JtJM zGJ}SZr0MU`27GL0?$>qa9H-lceFh*f)B_kF5U)_fE+L|y2@Jb@->fCE1B+)5`z%lY z4bjKme}5Qrq^}nIJHCJE$JdP8TXW`57Ec{^MGjK@+%6-Z+B^N}mlw~wGOM)A`|f}I zw(Kifvh`V%c2!nsneW~={UH=L{c~9vtO!<0u6;xI-*eyCeZP9@-uWeG4!fGK_MJ)c z_+`d*w)_8myTS8^yteBPC}cNS3NN0Kl!h+v}(+-}9-|;P>&x$4d_R0g!Jy1gA|-p{2RVUdDbDI+5#T^dl-{IBdKOKUiqCSOR0m7rhyn?R+aoimI9gyXEBM^KI2u~C93ce1v zCwNY-Aevcyk3-%JR0pa*>9DtO>nw-74TPt7c?JJBkfZefK=AkYlIO*HW|l=#TP118 znf%H8!uP1P_=YhF;qWhTzMY$yYs?`5Iq+yk_O-7p$;_T>JLMA6V_?q3S?|yG43Jgi zqRb+XwFy>@R0GSjtbw6JaVK9sx^IYxIm*^D60FajN?9A%{&J9^7-V1Sha_3)=U?|<|H8VnKL^xpE)*WBymm(GP5p!Iy-A+ zx<1)$$hmLXk1cEJOjc!FOgc!LA{(0xaU^FJUi@2o!XBtd7p@O94tQYxud*MIBTSiZ zi1C4x&*nMz75yypi7~M-UtxX4k8%gRpzwjr?8mBt2$I6?Nhz6G`4QU&$tsjg#i~9` zULj?y^220RR_Cz)z#4#t=>J&7hsi7Ciw!C z-B^7Nwk((b$n>-PyVCiyi3qR#BU-kis*rTTS^1ePB70w2twRWU_@^4vFFS;^1D{H9 zASnYw)pl( zm$S1Teys29yEQZGxX!Gho`MN=;8@?g>yGRvK4`4(-Fa{J1A~wC^ibcsW1l^s@@Guv zk;nSpt)F)<2;dspIe+`*zJ(}0~qU&`vW*A z<38oB2`e-j_c!pF-31m{Sx~9Uvh?1IT~K4e*lRF}T~zGYHE|IOmZ(wG5j%>Spjbc{ zHTERd!~&MsTVi5QOrp{JjPLi%?AiZ5?|q(gc0Mz+Q|`TUXBfe}Jjp39Z=sWWd_rPO zN@Pq_=CM9~gpN&;_PC3sg_kQM-Hjjg=+~u1x7M9{^lQ~Fv%?347c2b>f8XRd2-8bt~suKEke*;w}iy(-^d`dxn9cAtK_9dHfJTgZK+vAR1C6Dq&phjhQ{`r#d8TUW ziL_Niuz5_jx%<>n1ILV{c5p~cNK8sCSUkfM;f3%<_#k`{eu#RA`Uro72@!xWBLWdY zh+sqrA`}sZ2uDO9A`wxDXhaMm77>StMm=!EEu=z{2q=!WQy=z-{o=!NKw z_z01O=!5te@d@HnL|;TdM1RBp#6ZL##9+h_L^fh5Vi;mLA_p-7F%mHfF&Z%jF%~fn zk&76Qn1Gmwn1q;&n1Yy!n1+~+_zdwmVg|y3$V1FTuz-Qf zvUxVc0JLP(0?>8U;)cHdmSF_0Ff6#Jnw7I~Q8io4po=PpK^IjU23=IPYY!Jy)Bku0 zE~=*28FW!qG3cUN#_$D3E3hEbMb(}c(M1);s1Ilu{({itHUp>DzIMkhf? zdCTYwTw!zp${AgO#f)x14x>AOqg6`}AV}RmX7m(<tAeS)!z{#rxjgS<@7z8*n1`9&s zeZ~;rFawpFxSBB(m}G@Tz++J&DoHKFfj9=LEzyO6`*y-Z#z^2eV-&ESf$B(@#ux*j zD%CO;NMeiw+z3kj<2>UZ^CH}><4-Uq0Gk*Sff)>(Ks>5kEt7#X#uT77W2zv;J!jy+ z;?6Lp16z6g5k7k+&J^fdh;U0QRhwjX*A=80f^<1Vr)pBW#8oc~J?T|L-%l0EZb{0UV%OwgHnE zUjf}1UjuQBQox0=9X~fbWb6Pe$5~|%PDCv`foY6gKrhB_Ac?UDaATAULfB(Q1#p6~ z7r^w4kb?6z!Hvpm~jN~ zQi1&+#qIwkFFFRCW1wzAP zGhjXAIWUd!0_er~9Y`W5_5TOt#*1DGfQ^NQh@dseV}E$$QKyR zKn?h`XVe4281(^EtWrdOLGZrKz^Qp3U<3dw8D=1t5eRhR@khildq?r2U;y>66fp$v zl&{@M0eu(^0L)N|*bu1AXe0=Ao--N)XBbU@t&FBX zKBF1Xm(d)+_o!F|F&*+!C5Rb+0xHlqW8!%&LY5ikj6f_5}^Bz(=lj)V#Zb|j1v%Rh~al@fi6yrdTCMW@9DvTH_B4-aW@*P`L_sjfv=wep%?MLt>!+J=jk+XyqX zpYvQye`Ys5-EMlC-Skwu=_z*8lkKJ_*-cMWrg)FgDY-K-!YlaS_|dHwPE}=_jq(UFux$gQZCN!LquU=q$VB ztsdng7pz*HsF(L0-R|yNuy6lr#2R_u{sE>Kr2%=dqI^C-FSVJh%UHMB zV6hGS8nlRQ;Mbr--eeSUuw7hNH*P!KXyht+fj zxWj5JU7%9lQCDCtqZ`0IR?{8e9;@jAaF5mW#7NCOR?`ch9!o{j8{iJB`3T?+tH}b? z+C}%#^ntj?YCZ-`>IMYOCm5;UGCl>aF!}=JjDEmkMt>lOF#w=$Pep^1@eNX^1Jj=S4$+Dh3YIHtuWCJ8a{=2HnOs?rVkvVf-EJ-bce2fr0uq1HI2S?rYF3 zy)7$w(P$`_F$Ut!#3E>B zLMM2=d|(q}7J#iNMKc>fPf;-kNMpPw3ME8S(hXQbe*G@g1fGZk|VpWJMC&6&~>59qyZC)y)+t8Zu056 zFpKp5^YSOs-5cvV6|BCs4zXTdeQU$m`{EOP&%0T?@PE47=%cyJ@Zi%+lee%SDH~F&7%}`??^2`=Krv;C`qJ0jM8R z(S-us4Rv9F^}GdLIKbUd7lDh3U(E`-NPzpHE(+j&sEY=;AL?QN?uWWqfZIS92l%N+ zAn5SqW_vTM!;_os&8!YjZmHI8Xc2U{uv2m2Dn*ByOvODx1*$j|UsQp*Pt`KeC@FUs zXswiQ7-+^6baSOp`=($lQ-K;t!3|3VxV|ATz{0ZuSJ1~xHp|F*r1 z)#3hadl{=kH@Cfv)%62v^LP5=?dfyI0N@N`Ah4A{^{*QQ<@2J!0FMQ_A$UjnikD;q z<&2@gVg~Ntu{jLfzhfg9m>a8OjKFKryA0gFW7ewu4~Kvoc+3=DG#aq=d)&XHpYoEi zz$pgq-_f?i&IN2Wj6NUDHLRO}_n5W{o(R|~coNP(%2vaZv1kTw8^;ob#!!lGDv-uN z14r3vcskx=+G-g0??_t>%pLoPIQiw&k|t7n)(FWZ1Dp{o0NtL`fWPTM5@Nue5!y zdZgR;+Ra;Ooww3%UXr@8?MnZX(kJlI&;FKHk`_)VHsMJ@+B=~*!TJDU$bX|eKp1T& zm9LzXlr>RVSI(bUyiX$vQlBZRXH6-ddr~yYE*YClqFb$M+A!W={)eBZvgPpNj8Iqk zV?&Ftl4Wh)CWkzY_`cF*bAXfF$Z7LkAKCZlZi|yVFMM;}Pxuv^6)q+7R%|NCFfaDl zlPS2lr>omC{b+^Zb8EpV`m}1TW6AB9vx1Yy4XZ`DTvK8e6Sg0DazxO7W$j0T1bEDN`4P$vi+u@pUrEEHLj)=f>VLBx~6M}lIZ) zfaJJbaGIlbVL|Kqa7Byvf_@7|6)FZ_X`mi;`FQ%;GC{w7pmlEDCuM_{3676xctvq_ zlaicE5~N(`k}h&JlE(erKVKgZ^rcFd!Da&FZiW)kT^dxsBwi}7U(!XY?O!rLn&poc zXl25@d{apmv(LPse8KUzW!A0M@{3$oSI}?3Ljx6qr&K!t#}YEL$0Wfm^@Tdu-63?# z+kJw5;-9Lu8S?Rf5)XYq$*CrSQ=)Rk;Rxd+haYqj^j}}Ht~FRniYPfIX(O@kmXRfS z2@RfhUMlF<@&UUyyfdQ{{T7(IzC+JO->mpo(68{ce!q(}FbZc}O(`k5q($d9_}2}$ z6zjm}uI(tx+w8u+wBwr@pQA@<)UUgGbuMfdB zPsR05_&4mz`T*qm*9gClo7x>(f zSP#v$Mcl+!fA19>AL-REX#SdfYf)9JzfrC2K6UJ|mx6w#^{(ss zPTG`E(qFC~mY?KZpvx%1>y0fA8KQ&alD8#O?w+wctGT@6@Rm9!G}| zx117gz(QPmN)ePCkzyZF`i@dDrP-7QQNr_?5Nk$K{>?PzCz_&7#n5^&vnXX#qV2^{ z?~I|lNc8WNYA99GjX#>k&}eFg=ysGMk)o)5*#l&C94yry)SQaL5sWyDk@OGGc4Y(&WqDf}I!+mz@`!Z%RDK?>p2 zWy5KM;U=W8x0L9N!zw9#NofQnI)|`0N?u5ze^a6zhtjcy;wM=llqxxtDlasWHXT|E zDdaIFy0?eyqEti)4;ezp$CPL=3o%pDAq7*b1s|uhiBcXVI>6xOl|&sSTw-q(Gd5MF^yd3#4rY(mn%cP#Qp~HKlM$)D6rJDN%1XQx%$5QKFU2bb#gt zltL(ZAO-wK=?NvOqk!)z(boc~LIb{_MAaW)$)?<$QU;}1O4JYmPDrM|DBYt(HDjVC zF?~g81*LpSV<>$>iF$=8jZ!cr>TCYgoc>g`{&brD2Pmzhlt*b0^*?{A5P#}*{?wc5 zQ*WwYO^I5zKAmU%>6H3XYC(z4vpyYQJ=%1=A1UpoR7hzOr7TKKDFsl{Ao=}5iJHW3 zJ0(0x2^K#*z6yRlC{Y#qQK#{xPUA~MurGBQ-({3&J>M>r;wiZy`A{4CP?Px327MM# z8cwMlC2Be!YC3P)vG;eBHdCT{^QI>D&Y=G1O-JZOE#`HL62=L^YYippe_nJZUJWUE zBYD20R6~i5&67qA&(W0HQ;MTRHD8yGt?qeBv|innl&Bi(eoBd&sji#gB_EylWe->B zzs%CEk}h#W9eH8<(ru!g(y{csiyZV(=@chv{@eQv<#q!~{Y7cdH+y`gyYKG@OFn~2 z{Uytw(q>Xg?1uVM*5FcCY0+TJyEwQsSIQq!nkikV+7nVWwA5RadJZe?DeH1dJw$25 zh|+4QdSq!^>Dy7I?L7^HhYuJzW@x|hV+Ty8lR$Cxl9rDy4HD}~KfJwbl3tH4?JIeV zE%lTf#+ELYLcY4|U2uGCDPp^PeC&?4=fyxgjg^hoN%KA^OYl2Lm5ySFGSi3tAoW%h z?NCY6x~#2~)w(Po>d0d2%n@dq&>x{I14TR1OdtBA{`3KllJ2)Io7?`>msXEA(}eys z^#By@1T%f;Pd}#*>@?9#ANn&s^nv9Q&Gex^Lwz5`kR;V^TNdt2R|_#!9@w_bTeS33 zt(|P93H^oLsts+drlv&EPBGJm{$dn;;QMXO^r62vls>S0s+m6Y7fa{^%iEdhLx1rm zeZZM!`p{R`r4P8hnLhN=yv(vh>2zk9+4mvMz>>~p`p{oWrVqG_l+?bgjpYV)Uli?U zX8O?IcuF5w-os2E`kT~EQ4BrJ^r62=mj#OUb2EMDZ|$NFEbnEe5B=@O^nv9w%=DqZ zQ;$BdytkP?^mjVb2mFzlKBUPXmU(Pj^-0*niSbf2&oHE2tc~#CXZDYxJW8Exi z_b26#r3)b&tE9VM?W&UUa^wqAm*|aa3qZtf#2)$XSLIQ?#qTOzE2itEx$TMuOTV-$ zdLmzTE*s?~Z=GEAsb1a?QPEB#UyZK#r&hBbv~#r>y7Lr{s+-+(SG(yhcGI1u3ymt` zLqD{eMHi~I7--Do>2@m{R|GesQJ?30z*E>+E4%5IcGENVOuJsUrT$Sy}KEdf%|oyt5ZYh0PJGUD(>SNYMC%D^7tpZIsMDi3G5zH^zIUXJQo zHQ!qrlT&3-20ZJAjbnKif?ymYjm@d@wv4iyHPUW+gxz$G-87Ah)?ysSQ`nrf^U@q+ zw%z<8cGH9HrU$9hQhrXAe`bHX1=g#G<{0T#VJ$`)?|9mJ)x zn`PJNM!QBg+BLe-uF;Kljc&AdTV*$$?6%p_Zn}frw6%B8y+SaymoDT~#fxpEzwi-i z*VIP4rZ#5SeLY?F8Bx`6mE~XSJX)A$9diWwRvO&`s2H)iv?c1aU__TnAFk<=O2iQ=g|4;41`J$;iFFvbIul+nMgV6S zxSkWXF-8Hi7^4B4hf<7VfF_KwIR6B17M_;k|77F>=NaRH?TiUP0b?S7^Hqv*5|GY7 zi^SJsOu^4ZuNhN;8Y?VDJTJxV;zg+HxP^?*091=ojGqIo7&CwXh6O)R{maM$t}Gd2Rf8EuN8WY#9Y z$k>b@FP|_6S^SVj$?*E5`WExGax~U? zx$0ZY*SKi##FG#utM5&v-cfQ#er@@xsrtoNO=%@FCBvT^)Omj@HKopb`KvNdni&0m z2lre`#0z4h;rST)n!4U|>#Nh}NihNsfZYTCimzlml_hNlVYdQTIGW=e)9lK5z^my_WMngBaJ7Hi$9EJdSKU&(Hdq-hO1}Qc~{R8&6EsRPbl-G#qs}F z8&{>7Khr^6#o&X32u$EJzp6Y!m}#!zs=NBdr3vy1ZsQus;}<&1nn$#XnUdjLZ*`~V zlrE{x`|-9q@5kG;iaM|2CuN>v#ZNR(8k2;b?yA|VcQaJXqB&+th6>38XNq~5L^CBr zx%9_%+H3hKqM4GR{9APo<;wM<&f8O@?qLtEJ?!B{GN0BSyQTe_^cBc;ZLGLmNEg{ap{8GRiZL-HOo5 zMZ*t`^%A$^_nHnha2KD*Nnai+h>}kqIF!*^^r&<>{6cvkHhajA%!l1|a-(BE9u;NZ zQ$POhC0}cFIMGpjj0fez7H4V6>5cxXSa$`SFjc zH-^f&Gpbj%aMAvUpP51t*>dfp)snOP=ybJNlzh)tC&*c6tKB_i-@IQQ1;{VoS9@oO z@z_R9nG?Ng4F7@J0mc6Tz~i3(&j7t^pyK}vfJZE)_&)?97#N+y-ZOp!t}t*BgehGC zGw5|s7;b|~@yDne_OUW)!J?;-GR9zz|1-c@T}|+Rj`whP87}~t@jHN9no|7#0ERGL z0?G)88UB9)b$H2Ncu|MLP>Mgsp^#(N$1}nI6@=T9x(GvAh%yd>{{H}Nc*z^UpYawi z^{`2$`2PziqYCK%KLB?cb;&zmDg#Xv+=YQ!3$}z?Wx^-@laW$PB5;|Z0d_F7z$}Ii z=)-UT5*dzwo`K#Uc!z188-nm_EcC+J6}xfNBQT z_xhS2&rN6quRLCap6%6}f#JgTtBaCqbD$c(F;IhD8+<* zSUim^v|QbX3|tL$4>9@x%NZX7BN(3ms92?#J_URkeeoNGzccy)CmH>L^$ZJ+tj%H z3np|Ck8)mb6fmEGvCN}CV+?>Et`yT)z>P6Z5Zr%ZkANE+;3}0$6 zw5FxhW#npU24_((|Qv4@P8?NR#nqB^r_vfCw9}1?WP|| z`>JY!6S>RMx4GVF`e(aUAJ|RbmoHS+G&(KL$3x$xZLV_h_A@>@dH<42*COOi`z{SV zDOO|22jl8loYsgh>x7}I0rv6YBO#) zW{88Zp&O2R$^GGpNI7!e4QG?wa_fzg*Tl(KaPx&(8vf0N3-bQro4LIEg$&wcISbj9^be<#$CP^f6>=n8n?Gg9eK;$seJ?V+UfNBqvE1U*EkS?LMXblvYwguNKniwviS^iAIprzbRd!w2RVON_6R@qBjevxR!-fjATM8#&IE) zzLx4uiLSyF8g5f=Q#wm&AEhmnmeKf_LKk!ju1g^WqmueZ>nX`JWu{aMDVc_bWV#6? z(;*}uqqLLK8cOph;Sv*)F~A7Pohdb?6iLa85}jrejaNyxD4n4sBUzG4XmTl~8I)+~ zOTthoB(g(0N*F|iMBGn=L^_c~+CZW!Qo?IW z4=A0d^bMW6^42Y(kfs#UAt=ATm_S2DLJTFU%mg}#_!pFJP@<6{eh(#T4dsTV5#lz}oN(Ge0Q|d?QLrS!Ts9;J)q{x3M{Yt5Z(h*AADXpS3hY~eJByAwF z1Eofk!YENyP`?x+o*`KxuG8d6N_#04Q(8=EI;CNhdQxghDV|b&O4Od=uP8mBbb-<# zN~M$}N>ml$V<>%0sV${sN&%Eyk-}crrA%80J5T8wO53Cx33*ZSyS91dCONrll^#D$ zr{3uyO3%~o)R)5>-1+dFr5YCOnRTUJ&lWz!(ws zkdX--XW*p6)-!MkgiT|hJBRgB_K!J+ju2{DDF&QPm>Z)rel&l~=mMNzbOkmsaFn4l z7~O$B3=9CFXbhzoa0!IgX7s}OhdgKX#t-dh7#O)jwlcDSd7HW8 zI*q@f1h5gMXvd&2Q|V?$MT?;`HBg-vwBvC9eaFZJt}(^~m5d3%QpQ98J5!1l9Wn*| zO2uR#lraSmRagY=RNSI(@uF$Ke#UfQ1>-XS$D|bP=RijWx{z|WCu?y+$qu|E5BKhS zjG4e82D(O45ukKtEk?^E9J^Aqvw^ORIY2A}ZJy-JD8Oy~7sfo`7-K%LjZQX_uXO~05C%-+HZgrjDx^9#vz=4R7cifEQ(|t0UQ`d zal5<6I0oR0O3@w%iWuJl6B*wDT^Zj4v5XUdGsAKc_q$(MrvPkUDcaM(I>s4bD&s8B zlko$P$oLVc#lYwt{)llNz+oswdjTj`Cei-di_qu1s2a#()BvfBOMnOCGH!Rz7*_xs ztx~jCfh~-mfSHVIz^9DsKqKq;BWQ0xp1kNL?stDMZUHzerD$&hUo-9ia~OAl0gQV< zGsbt?O9k3#NGH!xjTM^M8cdFm5h#U_1S`ih2`%E({=(p>Wwpx*fR!#ig z3i^|ZMA22&A6ubMko9g4);Y`1O7C@daKRyI=ZeT)_*wm4m?$T-$llXXzW3%{grl>U lT3z_>3z9VV=SaQv_ixEV1`OS!l|$zYz1d1G`$S`Qz~h1S{8Ut7yLFm&bz% zR;*c39%0qI#&G!A@~;i#v<88i2N~fMFf=bKwnCro7Tx-+<%(Jqrp_=29?_@zFIkkMsy8h02hZT6d)sWlYU0$XfI4zGiFk zw_Daca^z7%%{9SCC)db^d(Ff59o_C{n7rmAccV3l$75zYkMo)yw`Vrz|qnijeB@SYP!Kf{JKxlf0#dGYB{ zAv&Vi02^>uUQSL%ZV{(-*_w7I?=n1mc=pMK^GyMRzpyU;tB1k;R}a7FJ!LT8)p|Fi%o4_`O4TEh4Ylm$P+X6Nmwk2#U*a+B2SO;ut*eKX&*cjM0 zu(7ahVdG%qVJY5ru!*qkVUu7xz;=Y~1lt+53v5@|Zm`{9d%z~c_Jr*PdlzhP*gmj* zVf(@MhaCVr5cY1^L9qA04u%~9I}~;p>~Po-up?nd!H$L<13MOW9PD`539u7kC&5mJ zb;3@8O@U2?O@mE`&4A5>oeDb*HVbw->yRJUbJxTd;IW1wrQHv?T$b_QHiU4Li5HP!W923%8J zk1)_RwUU9ZsceQ2Kz{))NV=w4vJ+iX{9i+Ex?Evu3OLSyi?YjFhGu|#20LI70~&}f z4u%#0wCmD@Yg*^4nnv-%Ao|Wv%fFh|3b2780#L*d2^h)%y`5tiS_1+YqBO13HHK)w zX$JW3w3(p|z%_>{7BrHfEg+5oe>zzi;?Z7z&X53jfdS1<$5Mtwz&r-DnH|S6Bmv+m zO$X$^V<1yUwEH(0Issm0=nN=h=mIEV=n9y~&aekl`-C6o%daL?%riKrlmJ+?u{;=m$8*&>yg$VE|wW!$3ef0P(}z4N4aOAO-=N zFx;bQi9a(823%wq0yxMp6tIk87+@O1Z~&4n%?N;^|2S663!7Zv?ONI#m{;%QmBwS&d1USwx8Tn6G%jASpKEo6MNkJP9_A<-|EM!1W zrp*)v9BtE;;UVO|O)%3UO^f-SVKLww!xF%LhKB(-Ak8CybcUsXWQJvcCJc{iTJ+Bh z%K;Y|Tq{5anN|W2P?}YMX$-3Yy&2X3>;fRU((DElG3)^hW!MXdVR#%6z)+4yg=-A^0H+!D16;_JG!>vZ3{L|1OR0u z%~OC929#Q>i3}$J9T`pm8ZbPA8~!&E5dUe=>+JL_0A(r7bAW{m&jY3~AfGL}GQ0=~ zW;mm1;omd71UScl^oOI!rFjLg1b-1f%&VYu@ekrPKr#ao7T$#64NYtDGsByJiwtK0 zI5W~9#um#M-U3WxI1lK}Z~O831BSmetuZnpi~+Lo>kOdAdl~!y3mJ@nDGVm$zj0Tl8gL3` z@W*2T@+*wN3^>PtGZMO=p(bDnLoGl$g9VVxfT9j%0 z07VRufT0Y~+c1WqH6VZ?O4EX_F+>AgrT8Yg&WP z84>_5Fth`dG9&`#F|41G1N?)MD+ z0OuI`1NH;%p#z2ipe5`y5RlGrHz1i|5TFSILI(b<*#!#eXKAm0o4q~A-Mj9_58HHa zTAW*uQJ9xKDRnNr{^npT`U!n{-;qQ+k^20#D7`&u5q+ zJNMXl&XD4^ByapCQ2%l0#*f`shHcztbpJJcW1ye=zEK;4jfUBJ%W)gK=qtu;3^ruy zuaDb!$ezew>4F;?7a|%PiYu#5< zN}3zoXXlr+@8&ioZ`o;eHNkB{7(bMDlQRq`?It@IP}of#U_fCv8P9;iZh|@}j2{ZS z2^ty+DD1|#n@AW8c$HxYU^jznC}=*@Fu-Jn;Q-WCVf;n_&>%?|iN^6Z!zjR;45I<% z3}XO`7;wpirZS8Jpi0BwYVt#FLPObU0vg938E`R#oM)H>c!B|`40(jX3CLua0zl0d z#xDgB#(?O9e`QDmyu+=TA8K##A$H0DEN6h;;OPug0eu;!0a`F*p*j4M0sb4k&oBdU zj3FDanjr_^%4NczMgtl001*uN06&JAXdFLeC;*&bC?`!Y~(bis4?sCWiX}&?1cAJiu^<`vI{G4*+U0Af5)-8A<@pNpNX?4}!L` z(|iCT6UJ`=U^D|-vIYqZ4*}{hEJEY>CBtIC83wda^>;8l3_zNM@p}X?9)FQ8)WD^n zB;f#92B^pIC>qC`49fwpGOPgXW>^V8(uMI`1(?jR8qk?x4WJ>zTC|O~2Q#e$y~(g1 zP|lzOkVRqqHULr?HUhdc;PliD)xRFPCBfZq*p>?xdo$U7rln+OXFB6xoS886FVUIM zzEgtUc+!?I3tG@NUml&WnOd!OcbT*$!sS5q_nJT>HM5FQ$-O2}?|Es{_&U?QN6@_M ztG?Q@VsXg_TihidY)y8!_*5D#7?WtHyc*Faw)vc)HsA$@IsnutVT?8anhgnofJBD6 z0347mI9D+@80rIFW@v!38-uDMj1irym>vu`3o+;(NtZ?#9e9r+7;uy!1b}N%7-J{^ z4Xy+Pj*eu&EiUQ`1Nv4`$0fKlV;Bh6tT4uA09XljJkMWbXbw2Y&;o#3D2x$(tJXak zTH-nV4~A9%PqHHbTiFE(bD+7DwcF?bAsNCLTjOc`ZH6cSYLs+|2B6875CcH@OK5|q z?B^I_0cZiFOIv^^OdP;-j^hC~l)v-D#~!Cq^CR63sPn~(=+lja?>+%)8^VKl=&7^OT!(MjtlT! z701nXIxaofDQtFDVUaTVrbesc| zhbGxsxiir56NQqVAq!<%MoM~7N>;X=!kfQRl^r#NH6?tr=p}McnuL#fo@C_bHqL9Qf*31l9CcqqfDRH7ZOi$ji&&?mp|yqPGQ6YybYC6^%6WCk^zZ z=xrliDwMM@qsW<)l8;!^Gv+vFrDSKNV`f6SoziT+c!7S%aPm{{{2>@atfWrx!F`DQ?v8ZaDwfm#(eHa`aw~ijNWD*j#OFB)Cr=)N}+HM<+MAq zGMzc7iq6dJl&OWJ+fISaXZgDKq-*WldJ-Mizl`1%*Ml>cmXecEkRsAlScGgjWy++I zGbczF8P41j-@f{?WXHlLL`OC=2b!HXjQROKUHwTLqo3?q?k%CBPYK|HBkHa`Kp*- zIw4Xs@84&(>m%E2JJq!@DqvR8Tv1+`DQQ``Q&EcwP?=FV?G)I&ly5tpJbzo~nJ4JD z9u>PSE;EcZ%*{=67G-6ly)4E>k%_CDE^?`4Ne1a6!v!}gbNrW@c}a%Ki|`P7M^)l9 z>aN&rK|@e^KGyx$YUYQy@;pS9t5HU7Mh^0jpE5hwnNsA;&nwLGW?(q_Xwq=p&V^}a z%{+Y7;uEpk+$Um7hpsZbX0fqV!^*AyI$* z*V0?=mwqd~%VY>zXW72ptaZno&iIJ?a7jY9?!kz~%2}Ya$XJagJ)p<-1BSW!O2^@b zewG#Pb3L~I>F2_IQW#S+yk$jaNP->jMY#zvp{LN{47;GG&|wEdIN$*W^b|UbXJ`fB z#?KT1K%Yq%QzTxC-eho~WlegO2|b0R-3;g{B+X}t225r^DJh79N_w7<>J z7VstmdJ65!8PHQ`zes{hGob|91Z%LYFLe>)NvI}|% z?L2wt2$;(*od75aVN6JJ!X*aW{Sy`dkbkH{Pay#@3uD6VJpM8RdJ3L5l%^hlyVxZe z?+SlmKzA*UJ9DO90B#~o@E?a0D2%B$-T}VD&e^0hPZA)hha4c1j1JwhCiHgB5j?Arnx}fD;_Gh+!H4 zDuprOnJLQ7FdcpQ-x+2A-et%Jtd;c-Nyq`^vlGsb=Ov&i4}JM->;f;2(+o2Ko@Ark z9i9>{1aJwPiqNt56mT)XQ@|)sSEQ$eXT!-;!gBzg62|ou=_z5v80jhD`_Sk2l<+)& zr-bhZh!RF>O%DJ(DMgV-pmGRfa+QD*m>vYwVVI9T|CbE7R$HB6SP0n2@DKpG62^ox z(khu@F~G|3FuMGnvVR0nCS1@+nU;b)Wxou7=0F(JqksU0<#;r>=q~8LeQIO($C=w} zSY3S6o0a3l?I~@B=)pN>XBACzqA!(Vr;yekKc^oueB&v*k^CwhH{0o`^bn%%7*Lg; zl2xGe9*eB^XbXS;TO(brQ=GG@X!=-7NXO0Z(eSOb7pZ0 z`sPSLT6RidVOHi`JDMq|y8a&hkm2kc-g@N)I<8a+5C1%#k><=u%a>C z$h2u0IK`P+8QJNHokUMt^n1t5$}G-JYo`<+*hNaou;MrEb%tox1G|)B;US#*x!E{J znZ?=Js*{EXSSOMgp(VmWDHT3iR!bw^9iW3v&pbt0$SprS z=%uRUrk|a@7^>H^hV@YI>0OF*S}mNNqPOnj*2t5R1O7Q&sxz}wLZY2AYx$)m{g9~vTa!j4JJX0H5_2f>-Am-byss6stUdR(a~n%`)F|=u(~j2K z+00yXwe;u6cegO_{4CfVV&8e|qfp~;8qXy2V9uXkXy!N6y~mQbu3lNZO+5+8pvDI4 zdX)_gT=2~7+IZtNULK6BShuCkZg0^ zy}WMa0Ig174|U-CJ zrt%&n*>u?HJ85W@v$TK5zM6eB zbM!0HeYnwo$HmZgTEHteRRl5M;ab3}mlU@tdwF7M6$N|CK8$%yGuKrQ6h;Hz{H1?W zZ}%ZXncd)eyhF+>TEI)+%EQJ&@aI~<%PSQZl|MW$9Qjn2g7Ln6&wTZa7O868-t$uWgv#8 z8XS;p2|JneLQT!w5B)VVmi8x)W`t?xVcCj1@&JrvVZA zI^`=uKM!B7Gm~67n)&0k%GX0LCoSEhnG-fBU*=b%zrgV1L#oqg>G9h3lr$}1W4Uy< zTHd(#rJ0&J$xrzY;NF2`Q@1y}?7N}`EadZOcr$r$V^p`c%D<}^2Rfs^1*-$IxObow zbmf6U<=*ma)`!D1^9j|FwoE_!S$c$K{<*(&x2!ooYHO@!{bi|S+r1YoVe2&WVs+J9 zk}q8TEZke4>qS0}1HHTlBFpt&rm|tKVdi`-;C-n?GtPTw%i093P77|EvMwFY!7cPl z)z;Y3Fa3D{&jgxT255Tw-TEJ)@%yN;Wb5#EdpgmuHn2&qvE$u)&Y(!`naQhl8sYc?>E2pmSzr`CJ$Kb;BUY$D{jGKpejK4`?t~`)6Cn{^<){t1Juer>cbb0 z{D6Teu5-OU+VlO>TEO`R(%stUs-K27#xPNGq+zrEiK%R;>*IBcKhgqTQ-`f_JWi$5 zTCSw5mB1?(!42dp97GnQ=X!Q}fUZ$e8Wqld5 zu#INDq}**2zPxX9g%+?iRmIZa%af1p)B-+GSDc?`^W$^mq(Pl^Y&Nk&ZD{PBU!&%qbwotrX-ccs!#sZ%)fjhy;|1)escR7l+^^uk&pfH^W!J9fO3@=YqP(O+_zk_URE{H zmgX)9C^H1wa&mvr0!}wo3CPt8g3IEPO;MkeYSy1sD{h-zqt~lwJ^oOwiDd)7b5Wt9 z{fD2c(5x4}kZc>J?|_z}Jd&<_HM7R-JgxcPM*Sq?UtsO>`yyNm>SD1px8C*pkDB%N zXVTr4XT3BCL+D@ClWbY4-wsB{sIVKF!*?px!C88X5FAtwN%EknyFNUmtf$NNa5*YR zu~Ij&ZprAuTEMwFlC8<$9I#WeaSnJHSXC}-Pw+nQ*UEh^7`ODdqEz@^;4i?cqh!3d z?#Gk5XaOgrvu4cDSBI3v#nnIf<}Gx`Zm3X08Y~W~fu00k2*E+)u@=aDYO8d&-zR?xLCF zxis6h&U)Ic1w4LHYB8p_F7137?fG`e){)|2&hwCG>cr2VD%LLgb1hK28je1V_f)Ep zw=B|cwEF^JF1YjSnz<&% z%E(yi#r>G~tQPQeq-1NW`1E(KY3AegC0jBQ8k(D+rQq5)C6He@N)N`?`g7rB`L3k% zM-FP%J%i;@Ti*`Jq1QC)HdWnhJv-bOvPuis%&kHozYX7`~n)UeaC%NgTy^cJbg%?L$ zT2p$xJj-9Jlc;))fu`O&4!x=Qf4f%tw*>aypEU#buU(2=1-;*_Ox66JSM}TUOW)6% zo<_H_tMp)-+4md!&sxC6c9N}k_wPO|6dgi(euS|)`j6N$S2HhD-B3&4{v&qaE!4wy z;jCHi>OZ3FH_iOI>PK602edmm9u57c(p^8-vaFpeE(@bymjdM>+xWYGiKvG>sGD1$ zaZpM?8dTn`RQ4W}ws1|AGTL{K+r6jCsati=OU-bj^OWgMFs=&^mw``K;ax-T`Q?H8 z@ywwL)zXmXGs*}x{~>Gox6lHL{!$6}VMyuDZMe8Tmuw9iYJRUhPQB{i8ngA`t;*tE z>J_B)WDFVh@hj0!{6T zyEW@q>P*@)NA3CgTXebyNOwyU*Qh-=194!UI?!}<`nz~?dS{g4;?Wz=)YAN~s|NtT z@5Xjr&`UEvqB@?IKI1kY=&PBJs0wUJ8@F}(Bj_WjmdiF{{Gqzww&8lch_d9NlLiED(E>hHU1Fnaa%QJ{ z&?M|tnx;96uJy*PgB!DP{Gw2~*K%Inf=9Z?Ii*fLHKJ^LGxdI4d9tVOIP^81cW}{? zv2@n`BGGJQ{?>!8NPlrqYkFhqqj8UE0c-Om8wXFD_mBb4@K(vT9@C!RkGoni>JJ&q zkJD=(z*E>SLnPbgOyBzg9vcg1OSXIm#$#iVS@HKg0w&qy>Nx%S2t4%njaMELXM|4Z zTBS0#&VD}W56#@;v~o|#{@@f<5pDp!%khi-S_@dLE_mah+^H5k;K!+IW{J(se%z#4 zw^zvUwqAK(qnxZaevs_4O)IGR+Q;Z+J+C|rE^zd0jH~gC;>iV$zIou+6gvwBZe4|H zkf%7O_{SfPX#QUWNcQ`F)>k>0&@ofBgO+Zy6LTKZjDyq-()8gR4NoH0H^&J7F3mP_ z&VtRTH=CZ43XCJ>#+lHCe&a(G!HBu}&teGT!H$wGf7}D`{$71=bYH{L#soSUD)zA0)N zpTuv3-t(DVq0M@M?%>OaX)N&6T6hW{fH^HwGYanD&onD9E8U~5{%DYoFL(K=T}}fs zw|(iLM*4*NHd^&bXEx5&?@3uZ&)veX?vw5hnRY*9+VhZU??a}?kDAK;lWU?MY`hQl z5qJIM@*j*YY8&FFk?2c;dW3N`A=*-PYfDw8Ep-;!Qj*)=LxKvcZ4g8(b-`lKk-*u} zVsQ$!*h~_GNwg+mglO{x3F=I?q0WqWec6WEC`>&>tKOy|{>I!QahAk>5|peMN>)ri z5@8TxiKYfAno<-!gajozx&}nl1rmozP!kX}kp%S*TGL5wO+C2Qr6lH(7!BcS z9YcR>K{zPK4!S5DkCC8e#nGQcV~9x75J~zYkC9kMg4Bptc##hJM_MA@BSCqHm``FX ziC7Y-m|81(d~bD-#2ONFk$*WKuT?Ml*OUaT*76#OH%OF|c!UJChAk<_E$JMztP2tT z2?@H;!q<|RMS|iCr#QnY&K7Txpo_P~5)uU@29SUkm)3&LcJpsYTp~euK zu>`9r)e^Dds_8cRM}eEBk{C#$H3>>;lg~)JNMbt)RA#LS_1T*ABtbQ$i62Dc|B#>( zZ2Sa?6(nYo7)gTK9?ZQ*`G?Y(4Sk2i5fYTbP%5O*p(L6^g#1o|&TPn&BsP<{m&7O% zl!p)tL@=oerZ~mC_h70d!E;GWAkmpbC`6;*NPG<8YDAT?Q3VOA5smUm3?k8qL{U=Wo|&^Zz(ss05~ z4GYpqEF?jN6f~K{-6W`_f~Zmk)q`m87l|7r&XPDpg7Vp54hhOi$aN0}`i6 z>?E;>L>37u!Mf2TYC!~kLE>c+dq|MKzzhB7e0WCqWgW7FDKN{Ycm$YW|Gt z6u(;S{>X#jb$@^X^Dbkq+V%HFmM28~`%)na3FEID;gU%mO* z$AjFLMwg$g)ueu5QE@6}_hNP{-om9hQxnqKNsqR{?o}z}?aXvBhVxrZn!K2nSBw|; z#rf&<>YQG(=H?aQ4ZaGMt`D4EZg(}Q7J}b9&n`&G&(A23Ug?&uHDG^uQ#zX#chTEX z>249NLKXMIyy619%`WnEV2o4YvwjsHJhe~LUDL}QuBuK`3-XFFsa2J&k#xsa2}$!w z6Ho#oL!39vbHvnVkzcv#7Xn!aLU?kAR8z=!1kB2nlTzud!C3FohM={s8imgUO6kv7 z2ft0Lc*~dt5Ses}nFSdt$<|hS8I^2{Dt_@&xhSQ8W|OKU%SoD2vxP4Ih^oGGv&4jy z0wfyqaWRRuATLKIT7~F_--cB~$P%C|Dj&Tf@rQF&P%QI26|=SFbO5n68hqdl&9l?X zi<3EH1sR!mDUazdY6&0BV-ej>@=Fa&EfuTh>_<}L5~hE(`NQV=*cs)KE}l1l`jeHH zo|WcINlPovDbD6v$f^+x#@Zi(=i!K%GpdAW-l>n%2sSs6qX^D+Puz7DI5si3H`O6wDCSji#Tl5^I}(@YW+;OjB_xbyjMN`LYz6 zFfkW1b?JH(`gpD_yunzK-ScLY+YDWJK2cUKrZCe+Z_er$hSdSzwN)17ITZ@D$o=|~ z?DDamxlL24+-ahVm{6iFY-gtQY`ho0T>5wRNp~_BYcGg@_sN$mwJ>2Wm9#r6O(T_1 z+7sg6mGU{G4#2v} zRTbr>EBtHLw(bwI%NrP6Jllq=GtHHz>e?|OBSB8KkpV1}*E@N}dRbgVXq0pB%_zuI zp2y&qXSjGYqbSwt0_n?$a}ulZR2m;|X+@a3HLEB!+u1H9Mcw$Uee|0-<>`@JfN6R8 zm}iX%@t7xGgvKEabtJtb6$OmNsSn95FLH6EmBm5rKrxmCWEBX1DoFFgr^*ee zxl4L-i5dF7s^VBxU-Egx97S zgXI-bH343~@Bw3^9yV7$;Za=yVv1Zmbw6Q@*$_?F|Ad}hbY6LDSG9TjV)A6w3&uh{ zs-UV<`*ZWEU4oX*@K8-hmAU_Lf-zD*`;JSUa9lL_(fIRkYpUQ3W2DCT4vUS1qeiRl zv=Glyq$-Uywb67-fw8QIsO|BD2E|49B^b+Ui2u4uOnB9dbocn%;w$Aw-Shutf}!+o z%B1c?9j?7{IgoT}`YC?@Wl4_oMe7}rZNA~7n$b1kOh`>{NA0HcWXaQq<&`&%`1i@7 z(yu95&&n%r(d-{4a4JvT^(A@bC9cM5mM6`?L+3*@yPOv3(?-uMO{#lKxRbx}@E4~1 z<)+Ny)|(n~AB}Wn%G5PQ0}QXCmxK5{`L#`fmmt0SA80)68RaIuRet%RAZr>nT_t_q zu5IKKdh@+kLl-}nUkYFa?eyar<96JwKi9jWUrl<5gK-Sf{rXfyxOm=;W2~JHdtWiksLqZt ziVu-Dx}xp$<9Qq97%kcJx;v*jJ4PwKstIF_6|7I~Q!&%UbD$jeh=blaP=(dmF<7!^ zZcI^ib_`K`QxnD-U!5JpBzvaP6bp{_%&l<@RUR&B!dMfkvtzj4qHjf{7^H&-#|Y`{ znf%edIy*+Xhxe^$WT4$-$T+g>^y7UoKD#0)+F)`$16=<9l4 zs?!`!>EAPBb6$0JOi_G82C$B-&W;qxo*9~|5;HqemHR$T7~}ndU7pE@jx_1PGfhTa zCCrX=>F#+k^+0uYWJvbRl2TV8vm;Zv57C6NimO;}IH00lEq)X4nCfmZpu#_7@rLvY z*eBc@(hnGu>tx9gQU>bZwk|F5JyyA~{CWL!=hAcQ|J)Q}qW}RMDA1%&aUI#IZ!0{s zU5^Vdou;4uddo5W>g9_0ddch~o870cR+tQW>8|o~dR+dI&H6VVRSb1UR2;ZA+_3wo z<>24|_sISm=Na5@*F3n}?taE`@M(h%Y1P+69c-zejXD^te;0LdVeKN05qHa(`nBkT z;f5^T9)q8BeOb&wr~XsS!P6o1P@s&ZJO4w7q{S;^54u;zR{D<+Zx+bO(jKeshO+M@ zKnz0%ESmd@0llma`x($9=`f7}y^jtN3|+7oj_VsemM1M`7d&w%sjix4>5e`}QUiAC zf%R`MF(d`hS0K;+zp`70y36CfDrj#v)qFJq{WB{norCEl9_+(j-&xEGzZzLAl{lYK`@HWF}KqbQ%0NsnpSjGZSl)_lX0U9%m z$J5164Ctc9T@dl(h-D(^06R?rcuv@4z*Kf|0-7*P!7HZA3@E6!n;7u0*%nC`hMwEn z`ZJ{CiR%-F4CFs{FH#bMj^YJSQ(3;5m6Y0M)o^ zmR!85dP6C2S@J-OSzSH=^;j6oOh7}10=&FZ?XhMl1T140T#M13i=Y?~&Mvd?UdvM# zP%ooAbzu%b)CDSk%Ulpu1~Qg=0iL>WAHY)==HV5Xr!L$N@YIC|0G_%4m8~C@$}~#} z00kxtjY_xf!!RE=&hKUYL#zux=hz7+!Qr{aQJ@Z-G+``@04*3$YLS03ECIaFfUJr4 zZ^V{I0F+HK7SyW9Zt}loK@qwlZZaXw5#62lDNvA0!#vka>N>loGm za3Kg|SqlhefR~ovGq~1+o?y}es6@h8HUL^PYy{L`Ks68lnBg(NNrue;cooL71%Ub> zVJl!5!!|%00Vo(tDX1npZO0qGPZ@Rqo@LkxfJ$L3WdKwg3A+HJ7HVzSMktL3_{Mz zD$GjF!Ya18>d{Gmw!AWE7#92RN)r`EEIIk-2W6?4C)|2t=83ra@8y+o!>Yf~=-|xk zn3N_%@)RL&NS->R;ujtQ)%GhGua>)>=)?9^2K7N|d4@du?vH|~_QYN!QxLpe6!tly4UO}T@gbr5|r6VhsH|UT9 zi@9DEym-c&3|>^DG9WxOQi^!E)*P|$P!b6bU8$xaXLrYz&Y`h|8BkT9?udLY%=Y*#y ztKh=5me_ZtIM=gB1y3LM#>&&m_5J%R=eUBZ?UzDZuM}d>7MWt6b?OZpqh_P3D20c{ z)iijv-Vtw4q#j-w;?=_|M$CFjMdgS-o-sPHn)Dw=AEho{_T<&Y%c0z_S5$5=xIFu> zh;dK(V&Lxsl2RGZkKTMt&oO|`2?Ri#8Z$el|tHjPEF7^IeJcoMW%4Ns0%Nf93Yc_d3uIan!{ zPxCrL6-+EB{HIaegpM+Do{{Q}oM);kEy6?df82S-souQUr8=I+?p4S0+x622D@XQi zr8dA(MM8~Ewc&1AVp12c4f5*ZHA8w#Wo2CZJHEPAL2<{DhMO;*;I0={R*sCVos*H1 zhIa*t$QQQ_Jk{D89Z$j5uOhk@cY4=R{l$o0_mDghJY`fBp_n`B-A|_gTS=*%mBd9M zlgtY;z0vbRO{GP6XyDmTXSUer|C2oIi@8h3u#qHjkb(C$t=8`XXMP-TGOj>T8~RgwPeVHuLwK)K&NTsg?k^-one zPE}!^bnQ(xPsUcs79M=>%NYU+Ya6&%0F#6CVDDDGO2^78&2ANyFC=uRd1#-~-)Pb$i67aM|cORcXvJ zGBeS}>y>WV5b#=R6<92)zVkaH89z_U_GX8tYby=HL$#MmRbEUf9phvM&=7DQc#SJ7 zAs_Wp#2Zz$xfkB8WvD(EuSfL;=XI(oxbV<`Zpb3A+}A3fzDy?*pw_tPgO67R(COus zFZ$TyIK6ULI@|$s3u)?v48m(-tHi0+%BnbphrpDS)Kn*S11!i+$uD%aQ#XH}H0}+| zlgU+J;h~P4Xtem!@k;llVyGweBPIb3CkuOg?Rd-v>PlLFk^9Ebb+VYu(`M1%XY zsKYF^OlEXExVx7B~^d^p(MtjpnvCcO&{4$gou ztXPzMcv13^W64JYXd?i3txCiIPuT?xQ2S>YdINZr!PW;b zmtFb-q8R!C{2B0EnD`090F-6oDW-vdOoqDw^%(|X2=xrZJphb#31b@!=)y1rqoH3i z3KCC0>ru^~Xz90oKpQ8+Wwr3g@mp%|l- zJi=p}1z5x`vjM2N!q}jxwfe8wP)QwE6uE5of>tQ9p;|eRD`9N&0I0eW?gxZ3Jb;18 zzZg)2k(U`t02p-=#`YkG%ka_8{03gmWmA`EvD3YBX0vH*Pn~0AX76YDQSOU-) z9tNO{gt0vW7{ag=5Y2$gJHpKHD26%z!$Z0@RM}R~uoH@-)ng1e^{r5r!q`>;aJ@)a z4QR`Ne73SMti=H6XAJ8A&oiJ>wA{vk^t)Q3$c3?OfYTU;jevFxn*cTjBrNSrtrXCKq3?E3eWo24thvPiRV`j)z?Ifw55q3N0*2iH zr+Zm|`$|ZFoetJ6tS>*-u*-q9@IATPNxPlVd|28D3;UeWKB;2Iqihk#vz3Imo4{L4 z=x1Zy*d0~%UZF(6EARXw3iMdZA1ePRWlPe^kIA40<)$`u? zcvZd9Aw2M`Buc!PxFyD$#PnFH21}^9l({>{YpazWvB;VqhNT{w8i~gZ@Gy)iOf(yeru5Qgue1lRU0>DK-GF*>yw{4pr>%SBxL|Mgt8NXKr}EEh zXTAC7HMJ^Q;Q^0ja=M;~Rz5T6_BeOYM8wCtEvNuu+Xc@!Rh7A6NC+kpR+&pCGtN5+ zcvHYT4CoW$+;L;7KN4c{eMVBI49Uy-ydinHpGu1G&`?a{m7Cgmrw1152a$Z*{f&2% z;4ld&W?Pjop8cRbt4Y1_@hVdeOLu`fRl;IBXqi;r*vT7oF>UyifgPVzSmC37)vz?A z$z!aZ-88%kc$W_G;p_!Ag_xP*+trxvjT%BSYS+#2cFTFj1j} z2YzH0SyKxU0)1B^=;u%>qfr5PcNx||4f}tY$tAPGyL5OH!@GCrmIU|6Mmz=0XO5RX zB|)AJ-i<*;EVgCvt?lU@(o$t?yr|V18!vWM;f04ggili8&mdpIPzxnSUwQSc{!D@! zTfwQ8;?8q4ovHdaD&2L}mK_`~Iv<|333m=`r+7U(z<6`OJHxOh^!fgMvYow|)D%cR zWVp4xTP@4ihqQBVp7d|?`s@_UvkQt>1MiNa(jvA=X^@|iol%5#Ix_{kiDSG!AHxWG zV4^&Kyf|2e5UYe6{yju`-t1f%DK8WDM#{^Fl?ve@N}UHeEzolv(bP!H3|F(ZT{LZ* zcWC4#>R!FPbY1Bc9(ba;)a$tkx2rzwQKpo4e(-AK9U+v)IN{@eN~%a{ie9Qp4M`KL z>^W%za60&Qafd9c4Kp)lCd!oY4m;kI@ywzm3{?HvIFZh&KXMD#ea~)psTpdv(sv>Oij- z3osoW73~hYcH&V+8ouIq%Mg7DX*8c!VyTJvK014Pw_))rEN3lN!(@zKJ^g6iWW)nQTZlBlQ;RUP;Zzf9 zr^(R1W1dff(WWp>dPoPchgXvb_oce+M%Hp=z7Tdf`iu9=;Z}PD^?E0?iJQ}LQs<WFEFqEZP#UIHK%roIby_seuIsDdUtnMTzPt8xMA|TS|{h)ys^TcVban0Cwp3KUZr$! zg8rQ4WO87YRM63hZa?eEKyzS~Xz1{GyjuJcl zcz5>bQ=J_Zim8gh*!tS($FrNKW50gr#?fO@yupy;0qO49Xrq61cHFNQe0{WE&B3Gv z(a+Nl0S8dem~fVzey}qx{UA3T?DXSd$85zaHKvZ$*)d12ck^hZYZQfox_j;P1(0J04VwhjlWx5qA1fn|2_B^Cf$BEg31;<+&3%7AOyDP|G%|Iy)9h_UueE zx;i@+DPEunV;fVQ9S7?AW7NHAuG9>g?F75C7(9%NK(uB)0bj(yU**!CMoOx>%qqgXO;I&SJw zogHf>d$y;XUY#B56n~%zW1As)AV14E*2@F@WMorAA(xKisE+%WmZ$1AHeAEIt5dF;`a=UY-i>!xrv^6D zpP6>5zq?u1sSOPca~GAIT2%7PqLR~#N}gR*^4y}5=NFZ{u&Ct4MI~nzmAtg5o>s8y-1SbM*K2mFFB2NMU;bK{D}49~A3osT@yhu~1HY4t+^0YH>iG^e)p?6N z=)V2x`9?wRtgGisorcy($%P8D3oU=-QK?94dL1y6;WI#ghR*@b7;d1aeU;&BfScha zU^&Ar>X0*h1L(@|EkNeVg~#FB7zcivoxTICXZRkF!|($@ReP=JkATMPf~&73lnB%G zXTU2AzW_=Zeg({C_zf_a=chLP9fVULOw&IwzKa7A{sdfL_zO_3APm3Z4>A}4V;TGa zZ5fOJe+CmqepTD1h1CGKj<6H_v{=eu2Bb0s06H<$1gLw57FG+rWSk~p!YqJO3|7E8 zhT4E^hB|<|80ag4%|n@>*N#&oOjupO%MA4Z+Zb@>?6Vje0PbN30<>gkh-n2VWnsb^ z0nRf710I*)(!xSOCG3Q>G#kT!6WlD8p$PybCQMjUJat}Sz?l%c3K54jgMEZu?0^)8 z=75e2EdVwE@{fPvsD-He!h|6MO;0kQQZ!x55CNFM5DDnT-~b>W!i3?1Yl7-7Aqwyk zLo{G3Lkyr;#E&CkZ9s$A37Kw!Gzk-in$#FoS3(@%Erxi&UWNpKM_W6 z7zO~&5m1SR4Fv6BCxmYF00YiQqfrc~=8bUDgb5oAFft6myruUUh5{-Xh5?o^3YCc{L)iwu*H z{|1|xCeu_p1|+iqiba^PDF9qO5>l{1%+Cy|fU^u~fZYt~fcqIT0LY;*VVMA22ohXV zL4HirFpK9s24tc`}7}%JirNte84IJDF3jT zAjB+8SOK611B#YM3}HS0Ms=Ja{+dSd(o5mNz+h` zV8TFw9jiD6+NyxE;d18_?^+T3l?d-=A^eWNd9Y!)mS*A8Sm>RssEGK%NqqfPORc zLa+L~9}KPRcFINMdi>N2K?9Le{?x(WQtGqnUPY;LYV_kM)h4|9TW_5T)$@P77~rlw z?ZO|844=C#B^TDzG&FW^d!=+KzE`;F!o!VRfilG;oBbdBcR#WB!l>GM<6{@P>WhzE z2zFmSb|Ll^!x9X!T-;-EKfCne$1(2J$1l!)$?yS=z1^%%$e%LBk&nw?Kjw11UhG+y z{%q{ojxJRwk(;C+BeSaD9#-v!hgEy*;jKR5xA}0XV%3N?y&+le*!FC^OC5~dUfomV z4j!(~3a%ZGRSuxj;<9N%8)?w+&a?GtVEm46*-pr72{%&gnn4y>&YJh zU!OIEqd?y|5FVlm$8mg$49I-LeQ4)9`E~T6pY&+5c=DllU@yVG>z;h*y#uuk>lW8J z{hqtd>Gyx@VfgrHt;_wRTv7q=W$ZZM!v}r%NgqDp!%z9}(>{FChh3+94m{(-&-?HT zKK!B&pYh?BeE8++>~g$P{ea_DAAZe;U-#iReE3ZtKI_BhsLIY9i05C6x9 zulew&K78GWKlkA;yiDyC1zd zeO6t!G5NB8vLO|1%4Pomw|&Xw7Gds$-Ip)DXIO?~S8mzeHMd_m=;wZA=anaoJ}pJ$ zCKcs)nS{u#KD^C`OMQ5|5AXEhG9PyB@;R{EhxhpKULStkhs%9IWj9 z@L`{}Gm_g*RSO~?Q~oDv!bEOXtWI*|7RBnM@=eF`p`HA@Kl=PY%SMZhr?2S7(;xU7 zhT%=p2hNru{^W={{M;1r%R7%dKGTQ0PL{gk`}Cb+aL>Q~?);FWrVnc*8@|Q>%!k)& ziHeWG72Ix{&XFOt$j1P244d&V_!+|%z*YwQX_CRP4G_anil;p8DAG-|@ga8E0r14L z6Au85JFydPo}s@o>;gQ+up2O+VGm#c18$h10Su4h>FrI1a===KeSonH`vD;gZ7T4P z_5srq0Axg%$O8a%jw;#tn!cv)?$mC7uja2j^b#2fx8!ZY7EEv@}kua&<77hn<| zG{2hiSF4+nT9}tzjMvLpekZn2@=;NrRXEhQI5>kdNQIFe8msLu^iRS0iy|C+ItBNG zt);e@EXYFs)a}Js@p>Pgl);$=Fc#2$!T12 z0cy5|Yi{+Ret&XM{$y3PXerqobk4to45t^3)j}d5=9h`jjLXgA@X{R$==}2uHySx^ z{vKR44RlqS)#C<2!u&lT?;~F=U=4Ux0e#YJG`cuS-l4u)NUCq@2}dpwO`C!vcZ!(5 zS5YlE>R0vPsZ%I))pWa573c3?R0~fPtXlLbQz&@V@ZR7kNuMGYCrcLC96rseA@n?& zx%~MvRvdFSR}qV)<2x)ssUGsa#AsBE{c*0s!?Gst>)()+43?oWjV)IdihM}4w)e5pAm(l;K`YPJrG&K}Ss&W>pDViXoWkp7R{>Ikd^!&?- z^b6sW!5_KtoJswydKVkHU!U}0w^Tz-+!#O13#@6DaXP+opKtqC^Fa5`t8=F`3ozbC zADuU>J8JppS)=PZ{3N|f0yhUOX$^@25(7v?kf1Zw{zDQcNNgkV5Q%gW14+;=vwbK; z;twQVAW=zz?wE;7Nzkn?k?xs^!%6fY5kn11BHfV^skvzP9f_+X-XKBIwZlzMYe%=U zb`O%sB|(MRu0M(PBwCQLK_vW6;tLY*ka(U1?q6C0?%rC$BP3>%pp+*JgK#Bur@zr8 zf=N*86Mvh;M`+)o8u(PNUS6=kHj<* zBS|EapxE0`>}@Fa7>YgS3W=9V93fFkVi}1!B+^N^hLY?`!aX1cIosX(d0#<8%gT%WeULbLh#AXspNEDHnLV^^u?nt5~i9iU)?<77aagoGn66kel zj!h)!M7SKJ!I45@Fo`ZCs3;skBzm`;Kor6PNih$lg( zGtvSP@iU1}Nt`F~42k_DHc)~i7Lv#(F_A=n5{V@2B&-mvNJFb@B+ij|T66#2ujJ*X z?smhD1=wQ$x25<92xFP9caOW;lo|mTD;0E=T`t5yv9plov$|8c&;>7Dut*d;nPZ8p zbTLNgZF07UxNo=rD8!IheSB5=X!;#~@32-?x>`Ew0UbVSmh|^ds&uDLvG%uRqbh8o zyJd%u2EXZ|LM3BGC5omBLdF^iNSFWdc`pE+88X(^sAa#(|KghiQSUHB!{rb|41mrs z8QN7lidsA})>u@vKjnYyyNuf0+LMGhz+`qpg=pQGApy{k0aw1`HUrMO<4pz>wWFLN z39yKv10aFFbtRy_*aH~SFmQj3Asukq zy}SRO=8fF3t15f?Ie0ECZK)x*&JoMQi*u=4PdoI}dZP6BI6Z%j+~$G5#i%b{gLUD& zn93WRCM2g6*(pZP7kIt1R{6`k<|-a|w|}n=>@kn^;#D?n@q7%{t4Vw$HVzI-mDu-^ zr&fDaW#kqX7tp$@+@h4M+`{#1D}#n&E-rr_T?H1qZt}_~Z{YL{EIY}YE7Qs!1NA0> zKN6~US&RLE{=c^zmuh)~QLoy*>Z64!ZNkHU|L8=UYG0j@x_NU`uWtSxr+#Z~Wt`{a z|F@4L==OE;RYlWq1lZf6kp1kq1uGoj)Cr;ZnMy ze0A}6XIU3{_;+1tQWfve>n$p%5}&wLs)Pqt)#%RYO3{d5$GiwDuX7WSo!PIDq67!R3h}1!^}9Ip`xZ!k-`YW`sXW zsz0@%GA{k!K5HR0ym|?RCJdjU9T!7~<9p?oRGNf`f6?36~&_SxS2^4DSY@J*F*?iMju&jz{p z?rY4%^B$})^huheaE57k!ut;cdfx4yVVDkhj9~_V?{BmVetRpsX^y1o*QH0<`;tp%9=m;0Dx=Z)wJ2Ky7xJg=e}q8D;~@8Rh_R z^CIKYjB`N^Bx&@?k9g{8lc7)h#FvP_fO&wn4Cr~s@mM(w4gUWQ>adxP=R2TnuQ>umn(-;bA<> zea(RL8|%r?Qot^DSq6Ae#E&D!M?tvN3u9ak=)|xB5X7(&k9prRtOC5jup00Y z%CHxJ0u#oFf{Mzazf}H4RLrOW!U3=k(28L{z`%eKX#D}h6M!cf4ggTF!Wa(%W-=gW zt?ywt1Zd507*IpjKg4a6|Hs~YhsRZ1 zeZXr3NS1^JxcBS6E355lC9Px|+qhwaOKf9`W7fN?l`X7>R&pW0B?J-@LJeU z#57Z#Mu7B$gqk;m60iv&p(iA?kdW{9J7?zZ-L(w7@0aKM>$}gRvpO?#&z(7QX68&g z$0Cnl{_rg{)6g>vy+ZK5o$axm|Es%so{s+h$i~J7AXp207nZ;Wc`8^Pj zm#64SAh%fLDIlLW{ZF9iX<%s^^$d{t7Wo5^@fLX&Gm!Tz@*EIkL!P3&KyJ6lJ|Gub z1l{)Jc8g#bnY_p%F92znWU)VC2J&xK<>84Uw~Y?=gRZv{(ID(sv~y( ze8>PgKkW`!o!{D<&y9lCL2|J}n(8UpsxLWRn=am{M|8F0j<=?K22E2RJN$qB!V6$+ z8#eF_ElIIIEwRFy-VTGD)?8zWwbP%=)@Lt1VM_qvhLj|*8f`9H9PsO+b+I^BKswvI zVEYQz;Ws)v#Z-r&&)J=2&VMs{=OX>iMCvJs< zIW#+ge00(uMRro(-a6NwXj7XL;<`+~Y8__ezWUI-6)n*5Mwzclg8g4l=-8a>{)Sjt{AdFSvos7&i5-o6Kg#dAwHkUu|%-z~8o zU~&c8^OfKKnBm!{C+}Q4Y#>jIaQU!vI1MLSKkDX_;!xdhIML_VQNL#0+2p?VJL_iIau!TiJ$oJ{7)8xv+vO4aHp~hje9v#T?w!4KFh)OWuSJ*R63gBj zi>OQB2`+@@gTYjuAbQ)X(=4(W$V7`Qff8f;Z+ctytltNh0zs@i!DUcE-nYoHK)!1c zsNIzw>E#$pDyQ106;LiP5Xlo<3FHcktO9bpMLq$f%p$9i^#?4n21utx)&j9(P!KQA zc+|$M17eCD2)ZW#YqU`(Vl02vA}0a4)*>eZ0ZDm+>wyfi$R{yK+fF{X0SL;W$xgu# z`-Vm0K%i@C%tjz6As%Fe%lT7F1Ot-9*y(XA1*F5qv;uJ~lEyeFeKi7tZ9p!!F`IxK zWs%Jo`QEe$M$}2)w8*JIP$*>t4P#9@%tqmh&ixhvL!FF8x`0f#NH-SZp0r30kWX0z z6+F@7eJ^^S`)mv-c^5snmodSfAQcsHyqCMJI9LP5$`jlMWUxiHV|cpLB0GS9#j-;w3u^ZfrO=6g2TIY7V`d4it-GSedG z;_wU9CyhA|2m%!OED$f*=ddIFm`30{B~f*8w@&#$1oXDIOcY0mLinH&OnIHk~TwAW!lH?*;;qROB8Y9v2|xWyLlIxh#Ez2ho#yhTO$e1blqM>ns z4+UUS6)j#aM8u;^?+wLbvaH~>yJ8y=g6CkqHeO##`SO?cU5`Kte?IRFZ$t=>r|{h= z`fj9-FCXAI3zGQ>+%a<_LP#LHZ_0yXmKWc8N2Lk*q>p616eFLccd!Mo`$^tD$r8xE zam4*&jw`;^3t3N+lMQ2HUM}}L;Zi_xchFE=pFR8X$HutDw|XHblj6s#)7z#PD$-FD z4_t@0O>saFRu=w5!qLUYuTan5iB!75*5oLhUyHZ(cXYrWd^+6~Pr`dgoR*HWd;ht2 zm|J|~3Exp7=a-X6#3K@m)%ol7z{XJUmXD)1o^X?)cNgh}eDso1FL@?eionh6#t-%m zM@AZI^u-r�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 R?eE;V*l}k2^wfvT{sTab95w&| delta 28106 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 diff --git a/Crusader.rep/user/00/~00000005.db/db.2.gbf b/Crusader.rep/user/00/~00000005.db/db.2.gbf new file mode 100644 index 0000000000000000000000000000000000000000..a40d688458b1ca775a767065effaea2c38b2137f GIT binary patch literal 81920 zcmeI*J#X7a7{GDLQj5lc(F_UDt%Rqz2>b#EL0~y?X}!2Y^!}`XQk7uf2-&9BQ=@ny4|Z@^jVx+FZb8IX47v4f!p&A zC9K#kc6hb6^r>9Fw1b1G8fmw$PINuc;}e~ldQ(rd(eYx&GwFA!-8jrnr#drpUyqaA zWOMt@PJ6fLbgh%d`l+4RJ~%6$7MCkW+oEc<+LB$>maJ;hVN3CMwV0Rp;l@eVnP2VXm|01>Pb-#b#N46YfkN70uRC09WnGY?JN%f6CLnU+kZs zZ3h|x2q1s}0tg_000IagfB*srAbV$W|MF)Q9vs-W zGz1Vp009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5J2Fg6u8y(f-pMt2M4~_i@Jk`7j_1HIb!|!Zdc_d z>Yk32k)7KQSC(CAyFuuMEw}IWS`SvE;sEeqp-D@@2b#`-u(b$nIj{@}ZE=zEnNbPoESWc}BKu1-y2=232x(NV5VbZjNJk0X`FQJmyc RWkyeKubmgRyYc4l@E=|TW(5EM literal 0 HcmV?d00001 diff --git a/Crusader.rep/user/~index.dat b/Crusader.rep/user/~index.dat index b1e697f..0b964be 100644 --- a/Crusader.rep/user/~index.dat +++ b/Crusader.rep/user/~index.dat @@ -1,4 +1,10 @@ VERSION=1 / -NEXT-ID:0 + 00000002:udf_c0a8647bd82013090643707800:c0a8647bd36436342237796300 + 00000004:udf_c0a8647bdaf715949048416300:c0a8647bd36636342258818700 + 00000005:udf_c0a8647bdba516037949612600:c0a8647bd36736342281220400 + 00000000:udf_c0a8647bf0178892741854800:c0a8647bd36236342207469100 + 00000001:udf_c0a8647bf4b212984786819600:c0a8647bd36336342224113900 + 00000003:udf_c0a8647bfe7615910786193500:c0a8647bd36536342248279100 +NEXT-ID:6 MD5:d41d8cd98f00b204e9800998ecf8427e diff --git a/Crusader.rep/user/~journal.dat b/Crusader.rep/user/~journal.dat deleted file mode 100644 index 9db11e9..0000000 --- a/Crusader.rep/user/~journal.dat +++ /dev/null @@ -1,12 +0,0 @@ -IADD:00000000:/udf_c0a8647bf0178892741854800 -IDSET:/udf_c0a8647bf0178892741854800:c0a8647bd36236342207469100 -IADD:00000001:/udf_c0a8647bf4b212984786819600 -IDSET:/udf_c0a8647bf4b212984786819600:c0a8647bd36336342224113900 -IADD:00000002:/udf_c0a8647bd82013090643707800 -IDSET:/udf_c0a8647bd82013090643707800:c0a8647bd36436342237796300 -IADD:00000003:/udf_c0a8647bfe7615910786193500 -IDSET:/udf_c0a8647bfe7615910786193500:c0a8647bd36536342248279100 -IADD:00000004:/udf_c0a8647bdaf715949048416300 -IDSET:/udf_c0a8647bdaf715949048416300:c0a8647bd36636342258818700 -IADD:00000005:/udf_c0a8647bdba516037949612600 -IDSET:/udf_c0a8647bdba516037949612600:c0a8647bd36736342281220400 diff --git a/crusader_decompilation_notes.md b/crusader_decompilation_notes.md index 79d7b5f..abd1e6c 100644 --- a/crusader_decompilation_notes.md +++ b/crusader_decompilation_notes.md @@ -68,6 +68,147 @@ - Uses entity flags at `+0x4d` to select increment/decrement behavior for clockwise/counterclockwise facing updates. - Called from the large gameplay update state machine at `0007:5b9a` inside `FUN_0007_5b6f`. +### Raw 0007 Gameplay Helper Deep Dive: snap_entity_to_ground + +- Function: `0007:2207` = `snap_entity_to_ground` +- Caller in gameplay flow: `spawn_entity_checked` (`0007:22de`, call at `0007:2366`) +- Purpose (high confidence): pre-spawn position adjustment for a small allow-list of entity types so they land on valid ground/height context before normal spawn allocation. + +#### Variable replacement pass (applied in Ghidra) + +- `param_1` -> `entity_type` +- `local_48` -> `snap_entity_type_table` +- `local_34` -> `snap_dispatch_seg_table` +- `local_20` -> `snap_dispatch_off_table` +- `local_c` -> `entity_type_cursor` +- `local_4` -> `dispatch_index` + +#### What the function does structurally + +1. Copies three 10-entry static tables into stack-local scratch buffers: + - from `0x2910` into `snap_dispatch_off_table` + - from `0x2924` into `snap_dispatch_seg_table` + - from `0x2938` into `snap_entity_type_table` +2. Performs a linear scan across 10 entity IDs in `snap_entity_type_table`. +3. If `entity_type` matches an entry, it calls into the unresolved shared FAR thunk target (`0000:ffff`) with spawn coordinate-derived arguments. +4. If no table entry matches, it exits without modifying the request. + +#### Why this is "snap to ground" behavior + +- The only known caller (`spawn_entity_checked`) gates this function behind: + - global mode flag `*(char *)0x27fe != 0` + - a hardcoded list of exactly 10 entity IDs (`0x31c`, `0x31f`, `0x320`, `0x321`, `0x322`, `0x323`, `0x324`, `0x325`, `0x326`, `0x327`) +- That caller prepares local spawn position values, calls `snap_entity_to_ground`, then proceeds to spawn logic. This pattern strongly indicates pre-placement correction rather than generic AI or render logic. +- The segment/offset companion tables strongly suggest per-entity handler dispatch metadata (or per-entity parameter blocks) used by the thunked path. + +#### Current limitation in raw import + +- The common thunk endpoint is still imported as `unresolved_far_thunk_dispatch` at `0000:ffff`. +- In this raw database, that body decompiles as overlapped/bad instruction data, so exact arithmetic internals of the final coordinate projection cannot yet be recovered from this symbol alone. +- Despite that, caller context + table shape + argument flow make the gameplay role of this helper clear enough for naming and control-flow analysis. + +#### Working pseudocode (behavioral) + +```c +void snap_entity_to_ground(entity_type, spawn_x, spawn_y, spawn_layer) { + copy_10_words(local_off_table, DATA_2910); + copy_10_words(local_seg_table, DATA_2924); + copy_10_words(local_type_table, DATA_2938); + + for (dispatch_index = 0; dispatch_index < 10; dispatch_index++) { + if (local_type_table[dispatch_index] == entity_type) { + // Through unresolved FAR thunk in raw import. + // Uses spawn position context to compute a ground-aligned placement. + call_thunk_with_spawn_context(spawn_x, spawn_y, ...); + } + } +} +``` + +#### Next RE target (to close remaining uncertainty) + +- Recover the true callee behind `0000:ffff` for the `0007:224b` call site by relocation/import-table reconstruction or by matching this call path in a cleaner segment-mapped database. That should reveal exact per-slot use of the two dispatch tables and final coordinate math. + +### Raw 0007 Gameplay Helper Follow-up: AI sweep + checked spawn path + +- Additional gameplay-side annotation pass completed directly in `CRUSADER-RAW.EXE`. + +#### `spawn_entity_checked` (`0007:22de`) refinements + +- Function signature was expanded to 7 arguments in Ghidra so stack arguments remain visible in decompile: + - `entity_type`, `spawn_flags_a`, `spawn_flags_b`, `spawn_flags_c`, `spawn_x`, `spawn_y`, `spawn_layer_arg` +- Parameter/local naming pass applied for readability in decompiled output. +- New comments added at key control-flow points: + - `0007:22f8`: allow-list gate for ground-snap mode (`0x27fe != 0` + entity IDs `0x31c..0x327` subset) + - `0007:2366`: explicit `snap_entity_to_ground(entity_type, &spawn_x, &spawn_y, &spawn_layer)` handoff + - `0007:247e`: fallback path that calls core `entity_spawn` with original arguments +- Current caveat: + - Decompiler still aliases the temporary y/layer scratch region imperfectly around the thunked call site, but disassembly confirms the call setup uses local `x/y/layer` temporaries (`[bp-6]`, `[bp-8]`, `[bp-9]`) before spawn. + +#### `entity_ai_update_loop` (`0007:0fb6`) structural recovery + +- Added disassembly + decompiler comments capturing stable behavior: + - Reads player entity FAR pointer from global `0x2de4`. + - Copies player world position fields (`+0x40`, `+0x42`) into globals `0x27e7` / `0x27e9` (AI focus position cache used by downstream logic). + - Iterates entity IDs from `2` through `255` and dispatches per-entity processing through the shared thunk path. +- This function now has enough recovered semantics to treat it as the frame-level AI sweep dispatcher even though individual thunked callees remain unresolved in the raw import. + +### Raw 0007 Gameplay Logic: animation / range / command globals + +#### `is_player_in_range` (`0007:0f79`) — fully recoverable + +- Prototype updated in Ghidra: `int is_player_in_range(int entity_x, int entity_y)` +- Reads player world position from `g_player_entity_farptr` (`0x2de4`, fields `+0x40` (x) and `+0x42` (y)`. +- Computes unsigned delta from AI focus globals `g_ai_focus_pos_x` (`0x27e7`) / `g_ai_focus_pos_y` (`0x27e9`). +- Returns 1 if player Y delta == 0 AND player X delta < 0xF0 (240 world units), else 0. +- Only confirmed caller so far: `0007:0bcb` (in unanalyzed function region). + +#### `entity_animation_frame_update` (`0007:26e2`) — fully decompiled + +- Prototype updated: `void entity_animation_frame_update(int *entity_ptr)` +- Key globals read: + - `g_anim_tick_counter` (`0x3a00`) — frame timing tick counter. + - `g_anim_tick_overdrive_flag` (`0x3a02`) — if set, forces max-advance (4 steps). + - `g_speed_double_flag` (`0x27fd`) — doubles speed_factor to 2 when set (fast game mode). +- Local variables renamed: `speed_factor` (1 or 2) and `advance_steps` (0–4, number of frame advances this tick). +- Entity struct fields confirmed (relative to `entity_ptr` as `int*`): + - `[0x1b]` = frame_min (backward direction counter) + - `[0x1c]` = frame_max + - `[0x1d]` = current_frame + - `[0x1e]` = loop_flag + - `[0x1f]` = reverse_direction_flag + - `+0x3f` (as `char*`) = completion handle/sentinel (`-1` = none, `0x2802` = player entity) +- On frame overflow: if completion handle valid and not player-entity, fires thunked event; calls vtable `[+8]` method. +- Added decompiler comment at function entry explaining all fields and behavior. + +#### `entity_command_dispatch` (`0007:0990`) — partially decompiled + +- Prototype: `void entity_command_dispatch(int entity_handle, int target_seg, int command_type, byte absolute_pos_flag)` +- When `absolute_pos_flag == 0`: computes player-relative delta using `g_player_entity_farptr` and stores result: + - delta_x → `g_player_delta_x` (`0x27f5`) + - delta_y → `g_player_delta_y` (`0x27f7`) + - Clears cached origin globals `g_cmd_effect_origin_x` (`0x27f1`) and `g_cmd_effect_origin_y` (`0x27f3`) after use. +- Dispatches entity command through shared thunk; actual command table data not yet resolved. +- No incoming XREFs found in the raw import (likely called via table or vtable dispatch). + +#### Global map additions (renamed in Ghidra) + +| Address | Name | Evidence | +|---------|------|---------| +| `0x2de4` | `g_player_entity_farptr` | FAR ptr to player entity; `+0x40`/`+0x42` are world X/Y | +| `0x27e7` | `g_ai_focus_pos_x` | Set by `entity_ai_update_loop` from player entity `+0x40` | +| `0x27e9` | `g_ai_focus_pos_y` | Set by `entity_ai_update_loop` from player entity `+0x42` | +| `0x27f1` | `g_cmd_effect_origin_x` | Cached effect origin X, cleared after delta in `entity_command_dispatch` | +| `0x27f3` | `g_cmd_effect_origin_y` | Cached effect origin Y | +| `0x27f5` | `g_player_delta_x` | Player X delta from last effect origin | +| `0x27f7` | `g_player_delta_y` | Player Y delta from last effect origin | +| `0x27fd` | `g_speed_double_flag` | 0 = normal, 1 = double speed animation | +| `0x27fe` | `g_ground_snap_mode_flag` | Non-zero = ground-snap prepass active for placements | +| `0x27d0` | `g_entity_update_max_id` | Max entity ID used by `entity_ai_update_loop` sweep | +| `0x3a00` | `g_anim_tick_counter` | Animation tick counter for frame-advance step budget | +| `0x3a02` | `g_anim_tick_overdrive_flag` | 0 = normal, non-zero = force max frame advance step | +| `0x2802` | `g_player_entity_handle` | Player entity handle (used as sentinel in animation completion checks) | + ### Raw 000e Parser Helper Cluster - A small helper cluster in the raw `000e:` area now appears to implement a fixed-size CRLF record parser/table builder, likely used by startup/config or script-ish text data. @@ -521,7 +662,625 @@ All 35+ identified functions renamed and annotated in Ghidra. 5. **Cross-reference entity type constants** with game entities (robots, platforms, triggers) 6. **Identify external segment calls** — the `func_0x0000ffff()` placeholders are all cross-segment calls; resolving them requires importing the referenced segments ---- +1. ✅ **NE Segment 1 imported and analyzed** — all 58 identified functions renamed and annotated +2. ✅ **Raw 0007 segment analyzed** — rendering, camera/scroll, save slot, and scroll region subsystems documented (~60 functions renamed and annotated) +3. **Import additional NE segments** — priority: segments 22, 30, 59, 86 (segment 21 complete) +4. **Analyze raw 0007 draw helper cluster** — `FUN_0007_03b4`, `FUN_0007_04b8`, `FUN_0007_04dc`, `FUN_0007_057f`, `FUN_0007_0614`; called by sprite/draw list functions +5. **Analyze `FUN_0007_4cdf`** — large 15-case animation/movement dispatcher; overlapping instruction warnings; cases 0, 2, 3, 6, 9, 0xa, 0xe are clean +6. **Map file format loaders** — `.FLX`, `.SHP`, `.MAP`, `.TNT` resource formats +7. **Cross-reference entity type constants** with game entities (robots, platforms, triggers) +8. **Identify external segment calls** — the `func_0x0000ffff()` placeholders are all cross-segment calls; resolving them requires importing the referenced segments + +## Raw 0007 Rendering & Sprite Draw List Subsystem (new) + +A complete sprite draw list and tile-based visibility system was recovered from the `0007:e000–0007:fe00` flat range (above seg001, separate segment loaded at `0x7E000+`). + +### Isometric Coordinate Transform + +| Address | Name | Evidence | +|---------|------|---------| +| `0007:be67` | `world_to_screen_isometric` | Classic 2:1 isometric formula: `screen_x = (wx + sx) + (wy + sy)*2`, `screen_y = (wy + sy)*2 - (wx + sx)`. Scroll globals: `0x2bb7` (X), `0x2bb9` (Y). Output to `*param_3`, `*param_4`. | +| `0007:be9e` | `world_to_screen_isometric_wrapper` | Thin wrapper — calls `world_to_screen_isometric` with args shifted by one | + +### Draw List Node Format +Sprite/draw node (size `0x18` = 24 bytes from pool, allocated by `linked_list_pop_2cc3`): +| Offset | Field | Notes | +|--------|-------|-------| +| `+0x0` | vtable | Function ptr for render callback (vtable[0] = draw) | +| `+0x8` | dep_from_list | Near ptr to list of sprites that depend ON this | +| `+0xa` | dep_to_list | Near ptr to list of sprites this depends ON | +| `+0xc` | bbox_xmin | Screen bounding box (4 ints) | +| `+0xe` | bbox_ymin | | +| `+0x10` | bbox_xmax | | +| `+0x12` | bbox_ymax | | +| `+0x14` | flags | bit 0=queued in draw list, bit 5=visible/rendered, bit 6=root sentinel, bit 7=must-redraw | +| `+0x15` | z_depth | int; sort key for painter's algorithm. 1 = root sentinel | +| `+0x17` | order_flag | if set, propagates must-redraw to dependent sprites | +| `+0x18` | tile_index | sparse tile index (for dirty bitmask bit addressing) | + +### Draw List Functions + +| Address | Name | Evidence | +|---------|------|---------| +| `0007:eb36` | `drawlist_pool_init` | Inits free pool: 1500 nodes × `0x2a` (42) bytes from base `0x2cc7`. Sets `0x2ccf = 1500` (count), `0x2cc3` = linked list head. Copies `0x2cc9` → `0x2cae`. | +| `0007:eb12` | `linked_list_push_2cc3` | LIFO push: `node->next = head_2cc3; head = node; count_2ccf++`. | +| `0007:eada` | `linked_list_pop_2cc3` | LIFO pop: dequeues node from `0x2cc3` head, decrements `0x2ccf` count. | +| `0007:ebd9` | `linked_list_dequeue_headtail` | FIFO dequeue from head/tail pair list; calls `FUN_0007_03ec` after dequeue. | +| `0007:ec2c` | `drawlist_enqueue` | FIFO enqueue: appends node to draw list (head if empty, tail always updated). | +| `0007:ec63` | `drawlist_remove_node` | Unlinks specific node from head or tail position; calls `FUN_0007_03ec`. | +| `0007:eca8` | `drawlist_process_and_render` | **Two-stage render pass.** Stage 1: drains `0x8442` (pending), viewport-tests each sprite, moves in-bounds to `0x8446` (visible). Stage 2: drains `0x8446`, calls sprite vtable[0] to draw. Recursive re-run if `0x2cb2` defer flag set. | +| `0007:edfa` | `drawlist_enqueue_sprite_children` | Enqueues all child sprites at node `+8` linkage to draw pending list if not already queued or rendered. Skips if `+0x15` z-depth == 1. | +| `0007:ef3d` | `sprite_add_draw_dependency` | Links sprites A and B with z-order dependency. Allocates link node via `FUN_0007_057f`. Stores in A's `+10` and B's `+8`. Sets must-redraw on B if A has `+0x17` set. | +| `0007:ef9f` | `sprite_enqueue_for_draw` | Null-guard; sets node `+0x14 \|= 1`, enqueues to `0x8442`. | +| `0007:efca` | `sprite_invalidate_and_unlink` | Full sprite removal: re-enqueues all dependents, frees link nodes via `FUN_0007_0614`, clears `+8/+10` lists, dequeues self from `0x8442`. | +| `0007:f2a0` | `sprite_sort_by_depth_and_link` | Compares `+0x15` z-depth of two sprites; calls `sprite_add_draw_dependency` in the correct order (lower z first). Handles equal-depth via thunk. | +| `0007:f654` | `drawlist_init` | Full draw system init: `drawlist_pool_init`, init full-screen viewport (`0x844a..0x8450 = 0..639, 0..screen_h`), allocate root sentinel node (vtable `FUN_0000_2ce4`, z-depth=1, flag=0x40), stored at `0x846a`. | +| `0007:ea00` | `bbox_intersect` | In-place 2D rect intersection: max of mins, min of maxes. Input/output: 4-int array `[xmin,ymin,xmax,ymax]`. | +| `0007:ea6d` | `bbox_union` | In-place 2D rect union: min of mins, max of maxes. | +| `0007:ee5a` | `viewport_update_from_sprite_bounds` | Subtracts scroll offsets from sprite bbox; clips to screen rect (`0x2ca6..0x2cac`); calls `bbox_intersect`; stores updated viewport at `0x844a..0x8450`; dispatches to render. | + +### Tile-Based Visibility System + +The rendering system uses a **6×5 tile grid** at DS:`0x846a` (30 entries × 2 bytes each =60 bytes). Tiles represent screen regions of approximately 128 screen pixels per tile. Each tile holds a near pointer to a linked list of sprite nodes overlapping that tile. Bitmasks track dirty and renderable tiles. + +| Address | Name | Evidence | +|---------|------|---------| +| `0007:f9e2` | `drawlist_mark_dirty_tiles` | Converts bbox to tile grid coords (divide by 128, clamp to 6×5). Walks all sprites in overlapping tiles' spatial buckets; re-enqueues overlapping sprites. Sets bits in dirty bitmask `0x2cbb`. | +| `0007:fb53` | `tile_visibility_update` | Iterates redraw bitmask (`0x2cbb`, up to 10240 tiles). For each dirty tile with a sprite, computes isometric screen position from map X/Y/Z. Checks sprite dimension bitfields at `pbVar8+2..+3` against 640×480 viewport. Sets corresponding bit in render bitmask `0x2cb7`. Clears dirty bitmask after processing. | +| `0007:fd98` | `tilemap_draw_if_dirty` | Guard: if render bitmask `0x2cb7` non-zero, calls `thunk_FUN_0007_001d` to trigger tilemap draw. | + +### Draw List / Viewport Globals + +| Address | Name | Notes | +|---------|------|-------| +| `0x2bb7` | `g_scroll_offset_x` | World-to-screen X offset (scroll) | +| `0x2bb9` | `g_scroll_offset_y` | World-to-screen Y offset (scroll) | +| `0x2ca6..0x2cac` | `g_screen_clip_rect` | Screen clip rectangle [xmin,ymin,xmax,ymax] | +| `0x2cae` | `g_draw_segment` | DS segment for draw node far pointers | +| `0x2cb0` | `g_free_pool_seg` | Segment for node free pool far calls | +| `0x2cb2` | `g_render_defer_flag` | If set, defers current render pass | +| `0x2cb7` | `g_render_tile_bitmask` | Far ptr to bitmask of tiles ready to render | +| `0x2cbb` | `g_dirty_tile_bitmask` | Far ptr to bitmask of dirty/changed tiles | +| `0x2cbf` | `g_tile_origin_x` | Tile grid world origin X (for tile coordinate math) | +| `0x2cc1` | `g_tile_origin_y` | Tile grid world origin Y | +| `0x2cc3` | `g_free_pool_head` | Free node pool linked list head | +| `0x2ccf` | `g_free_pool_count` | Free node pool remaining count (max 1500) | +| `0x8442` | `g_draw_pending_list` | Draw pending list head/tail (near ptrs) | +| `0x8446` | `g_draw_visible_list` | Draw visible list head/tail (near ptrs) | +| `0x844a..0x8450` | `g_viewport_rect` | Current viewport [xmin,ymin,xmax,ymax] | +| `0x846a` | `g_tile_grid_base` | 6×5 tile grid spatial index (near ptr per tile) | + +## Raw 0007 Map Scroll / Camera Subsystem (new) + +A scroll/camera management cluster found in the `0007:bxxx–0007:dxxx` range. + +### Entity State Transition Helper + +| Address | Name | Evidence | +|---------|------|---------| +| `0007:5b6f` | `entity_set_at_target_update_facing` | Sets entity `+0x3a = 1` (arrived flag); calls `entity_set_facing_direction`; clears bit `0x10` from entity type table `0x7e1e[type*0x79+0x59]`; tail-calls thunk to advance state. Called in the entity state machine context. | + +### Animation Start Frame Helper + +| Address | Name | Evidence | +|---------|------|---------| +| `0007:71b2` | `entity_set_anim_start_frame_from_flags` | Reads entity `+0x4b` flags. If bit 1 set: uses type table `+0x59 & 4` (attack active) to select last frame (`+0x39 - 1`), zero, or half-frame (`+0x39 >> 1`). Writes computed value to type table `+0x10`. If bit 2 set without bit 1: dispatch thunk. | + +### Combat Helper + +| Address | Name | Evidence | +|---------|------|---------| +| `0007:894b` | `entity_check_attack_flags_and_dispatch` | Guards on entity `+0x4b` bit 1 AND target object `+5` bits `0x1c`. If both set: dispatches thunk attack event. | + +### Vtable Dispatch Helpers + +| Address | Name | Evidence | +|---------|------|---------| +| `0007:8920` | `entity_call_vtable_slot0c` | Calls `(*param_1)[vtable+0xc]()`. | +| `0007:8cb8` | `entity_call_vtable_slot08` | Calls `(*param_1)[vtable+0x8]()`. | +| `0007:ccf1` | `entity_call_vtable_slot28` | Calls `(*param_1)[vtable+0x28]()`. | + +### Active Flag / Counter + +| Address | Name | Evidence | +|---------|------|---------| +| `0007:8854` | `entity_set_active_flag` | Sets entity `+0x40 = 1` (active); increments global `0x2800`. | + +### Dispatch Table Lookup + +| Address | Name | Evidence | +|---------|------|---------| +| `0007:8508` | `entity_table_lookup_and_dispatch` | Searches 1-entry table at `0x2b46` for `(param_3, param_4)` key pair; on match, calls the entry's function pointer at `[2]`. | + +### Scroll/Camera Functions + +| Address | Name | Evidence | +|---------|------|---------| +| `0007:bab5` | `entity_set_watch_ptr` | Stores FAR entity ptr to `0x2bd8` (the watch target entity). | +| `0007:baea` | `camera_update_and_check_player_scroll` | Calls watch entity vtable `+0x24`; if `0x2bd1` flag clear checks if player position (from `g_player_entity_farptr+0x40`) has moved > 32 units since `0x2be0`; if so, updates `0x2be0` and conditionally dispatches scroll event via `0x45aa`. | +| `0007:c6ba` | `scroll_camera_set_state_params` | Stores word params to `0x8354`, `0x8356`, byte to `0x8358`; dispatches. | +| `0007:cd56` | `dispatch_if_flag_2bd3_set` | Returns unless `0x2bd3` non-zero. | +| `0007:cfef` | `dispatch_if_mode_flags_set` | Two-flag check: dispatches if `0x2bca` or `0xee0` is non-zero. | +| `0007:d0f6` | `scroll_call_set_params_unless_blocked` | Calls `scroll_camera_set_state_params` only if `0x2bbb == 0`. | +| `0007:d119` | `scroll_update_direction_tracking` | Guards on `0x2bd3`. Calls `scroll_call_set_params_unless_blocked`. Compares direction bytes from `0x2cf4/0x2cf5` against cached `0x2bbd/0x2bbe`; if changed, clears `0x2bbc`. Dispatches. | +| `0007:d4a5` | `scroll_set_option_value` | Sets `0x2bc6 = param_1`. | +| `0007:d4b0` | `scroll_set_params_default` | Unconditional call to `scroll_camera_set_state_params`. | +| `0007:d4d3` | `scroll_set_map_index_validated` | If `param_1` in `[0..250]` and differs from `0x2bbf`, updates `0x2bbf` and clears `0x2bbc/0x2bbb`. | +| `0007:d655` | `map_position_has_changed` | Compares map arrays `0x7ded/0x7df1/0x7df5` at index `0x2bc6` against cached `0x2bc1/0x2bc3/0x2bc5`. Returns 1 if changed, 0 if same. | +| `0007:d6b1` | `scroll_clear_dirty_flags_and_dispatch` | Clears `0x2bbb = 0` and `0x2bbc = 0`; dispatches. | +| `0007:de57` | `entity_check_player_range_and_update` | Reads player world position (`g_player_entity_farptr+0x40`); if moved > 59 units from `entity+0x32` (cached pos), updates cache and calls `scrollregion_find_and_dispatch`. | + +### Scroll Region Table (`0x835a`) +8 entries × `0x19` (25) bytes = 200 bytes. Entry layout: +| Offset | Field | Notes | +|--------|-------|-------| +| `+0x0/+0x2` | key pair | Matched by scroll region key lookup | +| `+0x8` | refcount | Reference count (incremented on match) | +| `+0xe` | count2 | Secondary counter | +| `+0x10` | active | Non-zero when region is live | +| `+0x11/+0x13` | x_start/x_end | Bounding X coordinates | +| `+0x15/+0x17` | y_start/y_end | Bounding Y coordinates | + +| Address | Name | Evidence | +|---------|------|---------| +| `0007:e194` | `scrollregion_process_active` | Iterates active scroll entries (key non-zero AND `+0x10 != 0`), reads bounding box fields `+0x11/+0x13/+0x15/+0x17`, dispatches with bounds args. | +| `0007:e214` | `scrollregion_find_and_dispatch` | Finds empty scroll entry (zero key) and dispatches. | +| `0007:e29c` | `scrollregion_register` | Finds or allocates scroll region entry. Existing match: bump refcount / set active. New: init via `scrollregion_entry_init`. Special key `0x4ed`: thunk dispatch instead. | +| `0007:e50f` | `scrollregion_entry_init` | Null-guards param_1; zeroes output param_2, param_3, param_4; dispatches continuation. | +| `0007:e74a` | (unnamed) | Sets up call to walk `0x835a` table (8 entries, stride `0x19`, filter `0x968`), with callback return label `e763`. | + +### Save Slot System (`0x8337` + `0x2ba3`) + +10 save slots, each `0x400` (1024) bytes. Handle table at `0x8337` (10 words). Slot buffer base at FAR ptr `0x2ba3`. + +| Address | Name | Evidence | +|---------|------|---------| +| `0007:ac13` | `saveslot_table_clear` | Fills `0x8337..0x834b` (10 words) with `0xFFFF` (all slots empty). | +| `0007:acab` | `saveslot_free_if_empty` | Scans slot `0x2ba3[param_1*0x400]` for non-zero data; if empty, sets handle `0x8337[param_1] = 0xFFFF`. | +| `0007:ad47` | `saveslot_find_index_by_id` | Linear scan of 10-word handle table `0x8337`; returns index of matching word or `-1`. | +| `0007:ad79` | (unnamed) | Finds a free (0xFFFF) slot index. Complement of `saveslot_find_index_by_id`. | +| `0007:afd4` | `saveslot_get_or_alloc` | Gets slot pointer: calls `saveslot_find_index_by_id`; if not found calls `ad79` to get free slot; returns `0x2ba3 + slot * 0x400`. Returns 0 if no free slot. | +| `0007:b02c` | `saveslot_write_entry` | Navigates to `slot_base[param_3 * 4]`; dispatches thunk paths for write (existing, overwrite, new). | +| `0007:b0de` | `saveslot_read_entry_flags` | Reads from slot entry far pointer at `slot_base[param_3*4]`; extracts 4-byte packed bitfield from `+4..+7` in entry record into `*param_1`. Bit-by-bit extraction loop for 4 bytes. | + +### String & Memory Utilities + +| Address | Name | Evidence | +|---------|------|---------| +| `0007:a96d` | `entity_copy_string_truncated80` | Strlen(param_3) ≤ 0x50 guard; copies string word-by-word from param_3 into `param_2+8`. | +| `0007:b813` | `memcpy_4words` | Copies 4 words (8 bytes) from `param_2` to `param_1`. | +| `0007:ba45` | (unnamed) | Null/non-null far-ptr dispatch: different thunk paths based on `param_2 == 0`. | +| `0007:b46d` | `entity_dispatch_if_slot82e2_valid` | Guard: if `*(int *)0x82e2 != -1`, calls dispatch thunk. | + +### Linked List Utilities (draw pool + sprite) + +| Address | Name | Evidence | +|---------|------|---------| +| `0007:ea00` | `bbox_intersect` | In-place rect intersection: `[xmin,ymin,xmax,ymax]` = max(mins) × min(maxes). | +| `0007:ea6d` | `bbox_union` | In-place rect union: `[xmin,ymin,xmax,ymax]` = min(mins) × max(maxes). | + +### Scroll/Camera Globals + +| Address | Name | Notes | +|---------|------|-------| +| `0x2bb7` | `g_scroll_offset_x` | Isometric scroll X — added to world_x in screen transform | +| `0x2bb9` | `g_scroll_offset_y` | Isometric scroll Y | +| `0x2bbb` | `g_scroll_blocked` | If non-zero, blocks `scroll_camera_set_state_params` call | +| `0x2bbc` | `g_scroll_dirty` | Scroll direction changed flag (cleared when direction tracks) | +| `0x2bbd` | `g_scroll_dir_x` | Cached scroll direction X | +| `0x2bbe` | `g_scroll_dir_y` | Cached scroll direction Y | +| `0x2bbf` | `g_map_index` | Current map/level index `[0..250]` | +| `0x2bc1/0x2bc3/0x2bc5` | `g_map_entry_x/y/z` | Cached map entry X/Y/Z (vs. live map arrays) | +| `0x2bc6` | `g_map_slot_index` | Index into `0x7ded/0x7df1/0x7df5` arrays for current map slot | +| `0x2bca/0x2bc9` | `g_option_toggle_state` | UI option toggle state flags | +| `0x2bd1` | `g_scroll_block_flag` | Blocks camera update path if non-zero | +| `0x2bd3` | `g_scroll_active` | Non-zero = scroll system active | +| `0x2bd8` | `g_watch_entity_ptr` | FAR ptr to entity being tracked by camera | +| `0x2be0` | `g_player_scroll_pos` | Cached player world X+Y (ulong) for scroll threshold detection | +| `0x8354..0x8358` | `g_scroll_state_params` | Three scroll state params (word, word, byte) | + + +## Raw 0008 Gameplay Dispatch Helper Batch (new) + +Small conservative rename batch from direct field-write behavior in the `0008:ba00-0008:be05` cluster. + +### Newly renamed functions + +| Address | Name | Evidence | +|---------|------|---------| +| `0008:ba00` | `entity_dispatch_entry_init` | Constructor-style init: optional alloc (`0x32` bytes), vtable/list-link setup (`0x3b06`, `0x2d10`, `0x3afe`), zeroes state fields, seeds group from global active layer `0x39c9` via `entity_set_group_id` | +| `0008:bbb6` | `entity_set_source_type` | Writes entry word field `+0x04` from incoming parameter, then dispatches through FAR thunk path | +| `0008:bc27` | `entity_set_event_type_checked` | Writes entry word field `+0x06`; when source field `+0x04` is non-zero, validates old/new event transition, including special checks for `0xF0-0xF7` and upper bound `<= 0x0FFF` | +| `0008:bca8` | `entity_set_group_id` | Validates group id range `1..31`, writes low 5-bit group in byte `+0x08`, decrements old per-group counter and increments new one via counter table pointed to by `0x39c5` | +| `0008:be05` | `entity_increment_group_id` | Computes `((entry+0x08)&0x1F)+1`, validates against active-layer assumptions (`0x39c9`), then applies through `entity_set_group_id` | + +### Verified call/xref notes + +- `entity_set_group_id` is called from: + - `entity_dispatch_entry_init` at `0008:bae4` + - `entity_increment_group_id` at `0008:be57` +- `entity_set_source_type` is used from at least: + - `FUN_0008_c92f` (`0008:c94d`, `0008:c96d`) + - `FUN_0008_ca18` (`0008:ca36`, `0008:ca56`) + +### Gameplay relevance + +- This cluster appears to manage core dispatch-entry metadata (`source_type`, `event_type`, group/layer byte and counters) that feeds the seg021 scheduler/event system previously documented. +- The field offsets match the current seg021 entity/dispatch layout notes (`+0x04`, `+0x06`, `+0x08`), strengthening confidence in cross-function struct consistency. + +## Raw 0008 Pair-Sync Helper Batch (new) + +Conservative directional rename batch from the `0008:c7f1-0008:cad7` cluster. +These functions are clearly paired and structurally symmetric, but final gameplay semantics are still partial due to FAR-thunk heavy internals. + +### Newly renamed functions + +| Address | Name | Evidence | +|---------|------|---------| +| `0008:c7f1` | `entity_pair_update_link_slot_a` | Guards on entry flags (`+0x16` must not include `0x4000`), then dispatches through FAR thunk using entry local struct at `+0x28` and partner-side key/id input | +| `0008:c890` | `entity_pair_update_link_slot_b` | Twin of `entity_pair_update_link_slot_a` with identical call shape and guard behavior; used in opposite order by pair-sync wrappers | +| `0008:c92f` | `entity_pair_sync_a` | If either side has unset `source_type` (`+0x04`), copies from partner via `entity_set_source_type`; then calls link-slot helpers in A-order and ends in FAR thunk using first side `+0x1e` data | +| `0008:ca18` | `entity_pair_sync_b` | Mirror of `entity_pair_sync_a` with reversed side/order for helper calls and final thunk argument ordering | +| `0008:c9ee` | `entity_pair_mark_and_sync_a` | Sets bit `0x10` in entry flags at `+0x16`, then calls `entity_pair_sync_a` | +| `0008:cad7` | `entity_pair_mark_and_sync_b` | Sets bit `0x10` in entry flags at `+0x16`, then calls `entity_pair_sync_b` | + +### Verified call/xref notes + +- `entity_pair_sync_a` is called from `entity_pair_mark_and_sync_a` (`0008:ca10`). +- `entity_pair_sync_b` is called from `entity_pair_mark_and_sync_b` (`0008:caf9`). +- Shared helper use inside pair sync wrappers: + - `entity_pair_update_link_slot_b` at `0008:c981` and `0008:ca6a` + - `entity_pair_update_link_slot_a` at `0008:c995` and `0008:ca7e` + +### Gameplay relevance + +- This cluster likely handles directional two-entity relationship synchronization in the scheduler/entity-dispatch layer (source/type propagation plus paired link-slot updates). +- Offsets used here (`+0x04`, `+0x16`, `+0x1e`, `+0x28`) align with the existing seg021 object-field and linker/list usage patterns, which increases confidence while preserving conservative naming. + +## Raw 0008 Flag-0x20 Target-State Helpers (new) + +Two complementary helpers near the pair-sync cluster were renamed using strict field/bit behavior only. + +| Address | Name | Evidence | +|---------|------|---------| +| `0008:cb2c` | `entity_flag20_clear_and_update_target` | Clears bit `0x20` at entry flags `+0x16`; if non-null target args are provided, writes far-pointer target fields `+0x12/+0x14`; then calls shared refresh helper `0008:c01d` | +| `0008:cb5c` | `entity_flag20_set_and_init_target` | Sets bit `0x20` at entry flags `+0x16`; initializes target far-pointer fields `+0x12/+0x14` only when currently zero; then calls shared refresh helper `0008:c01d` | + +Notes: +- Naming intentionally stays flag-centric because high-level gameplay meaning of bit `0x20` is not yet fully resolved. +- Both helpers share the same post-update refresh path (`0008:c01d`), suggesting they are two state transitions in one target/link-management subsystem. + +## Raw 0008 Dispatch Refresh Pipeline (new) + +Follow-up rename batch for the shared refresh node used by the new flag-0x20 helpers. + +| Address | Name | Evidence | +|---------|------|---------| +| `0008:c01d` | `entity_refresh_dispatch_state` | Early-exit when flags at `+0x16` indicate dead (`0x8`) or already refreshed (`0x4000`); otherwise runs pre-clear, sets `0x4000`, calls update vfunc path, then runs flag-conditioned handlers | +| `0008:bfb2` | `entity_clear_status_bits_from_flags` | Clears specific bits in status word at `+0x32` based on state flags (`+0x16:0x400`, `+0x18:0x40/0x80`) | +| `0008:bf8e` | `entity_call_update_vfunc14` | Calls helper `0008:be6b`, then dispatches entity vtable call at offset `+0x14` | +| `0008:beee` | `entity_run_flagged_handlers` | Executes handler calls gated by flags (`+0x16:0x400/0x4`, `+0x18:0x40/0x80`) and then dispatches via FAR thunk using entry slot/index (`+0x2`) | + +Verified xref context: +- `entity_refresh_dispatch_state` is directly called from: + - `entity_flag20_clear_and_update_target` (`0008:cb54`) + - `entity_flag20_set_and_init_target` (`0008:cb86`) + +Gameplay relevance: +- This establishes a concrete state pipeline for dispatch entries after target/link changes: flag-gated status clear -> mark refreshed (`0x4000`) -> vtable update callback -> flag-conditioned subsystem handlers. + +## Raw 0008 Flag-0x100 and Constructor-Variant Batch (new) + +Additional conservative renames from the `0008:d1a4-0008:d27d` cluster. + +| Address | Name | Evidence | +|---------|------|---------| +| `0008:d1a4` | `entity_set_flag100_in_flags2` | Gate-checked setter: ORs bit `0x100` into entry word at `+0x18` | +| `0008:d1dc` | `entity_clear_flag100_in_flags2` | Gate-checked clearer: ANDs entry word at `+0x18` with `0xFEFF` (clears bit `0x100`) | +| `0008:d214` | `entity_dispatch_entry_ctor_vtbl_3aa6` | Constructor variant: allocates `0x40` bytes if null, reinitializes via `0008:cefb`, sets vtable to `0x3aa6`, sets flag `0x200` at `+0x16`, zeroes fields `+0x38..+0x3e` | + +Notes: +- The `entity_set_flag100_in_flags2` / `entity_clear_flag100_in_flags2` pair is a verified complementary toggle with identical gate logic (`0x39a8/0x39f9/0x3991` check path). +- Constructor naming is intentionally vtable-centric (`0x3aa6`) until more direct gameplay semantics are recovered from its callback dispatch paths. + +## Raw 0008 Periodic/Counter Helpers (new) + +Follow-up renames from the `0008:d313-0008:d47d` cluster tied to the `0x3aa6` constructor branch. + +| Address | Name | Evidence | +|---------|------|---------| +| `0008:d313` | `entity_periodic_accumulate_and_dispatch` | Adds global delta (`0x39d0/0x39d2`) into entry accumulator (`+0x3c/+0x3e`), wraps against period (`+0x38/+0x3a`), and on wrap invokes entry vtable callback at `+0x28` with reentrancy guard bit `0x400` in `+0x18` | +| `0008:d3e6` | `entity_set_flag2000_and_update_active_counters` | Atomic (CLI/PUSHF) set of bit `0x2000` in `+0x16`; if bit `0x400` is set, decrements global counter `0x39f6` and increments `0x39f4` | +| `0008:d433` | `entity_clear_flag2000_and_update_active_counters` | Atomic clear of bit `0x2000` in `+0x16`; if bit `0x400` is set, decrements `0x39f4` and increments `0x39f6` | + +Gameplay relevance: +- This identifies a concrete periodic dispatch mechanism (accumulator+wrap callback) and a paired active/inactive counter transition path around flag `0x2000`. +- The `0x39f4/0x39f6` counter swap strongly suggests global bookkeeping for a scheduler subset associated with these entries. + +## Raw 0008 Word-List Management Batch (new) + +Verified helper cluster for entry-owned word-list storage (sentinel-terminated with `0x0408`). + +| Address | Name | Evidence | +|---------|------|---------| +| `0008:da00` | `entity_word_list_set_0408_terminated` | Rebuilds/replaces entry list from stack-provided words terminated by `0x0408`; frees prior list pointer at `+0x06/+0x08`; allocates and populates new list | +| `0008:dba3` | `entity_word_list_free_existing` | Validates list pointer exists, then frees old list buffer referenced by `+0x06/+0x08` | +| `0008:dbec` | `entity_word_list_destroy` | Resets vtable to `0x2d10`, frees list if present via `entity_word_list_free_existing`, and optionally frees object when destroy flag bit `1` is set | +| `0008:dc38` | `entity_word_list_ensure_contains` | Scans existing list for a given word; if missing, appends through `entity_word_list_append_unique` | +| `0008:dcab` | `entity_word_list_append_unique` | Allocates larger list, copies existing words, appends new word plus `0x0408` terminator, frees old list, then rebuilds via `entity_word_list_set_0408_terminated` | + +Notes: +- Entry fields used by this subsystem: count at `+0x02`, list far pointer at `+0x06/+0x08`. +- The explicit `0x0408` terminator appears both in scanner/build logic and append path, making it a reliable list format marker. + +## Raw 0008 Word-List Access/Mutation Batch (new) + +Follow-up renames extending the same list subsystem. + +| Address | Name | Evidence | +|---------|------|---------| +| `0008:deea` | `entity_word_list_get_at` | Bounds-checks index against count (`+0x02`) and returns word from list pointer (`+0x06/+0x08`, stride 2) | +| `0008:df1b` | `entity_word_list_set_at` | Bounds-checks index then writes value into list element (`+0x06/+0x08`, stride 2) | +| `0008:dfa1` | `entity_word_list_find_unflagged_by_id10` | Scans list and returns first value satisfying `(value & 0x400)==0` and `(value & 0x3ff)==requested_id`; writes `0` when not found | +| `0008:ddaf` | `entity_word_list_remove_value` | Removes matching value(s) by counting survivors, rebuilding compact storage for non-matching entries, freeing old list storage, and updating list state | + +Notes: +- `entity_word_list_find_unflagged_by_id10` implies list entries pack a 10-bit id plus flag bits (`0x400` observed). +- This further supports that the `0008:da00..dfa1` region is a compact encoded-ID list manager used by gameplay dispatch entries. + +## Raw Import Note: `0000:ffff` Thunk Target (new) + +Requested deep-dive on `FUN_0000_ffff`: + +- Renamed to `unresolved_far_thunk_dispatch`. +- Current raw-import evidence indicates this is **not valid local executable logic** in this program view: + - Decompiler emits overlapping-instruction warnings and bad-control-flow warnings. + - Disassembly from `0000:ffff` into `0001:xxxx` is nonsensical/misaligned (mixed data/code artifacts). + - The body is heavily shared as a call sink from many segments, consistent with unresolved inter-segment thunking in this import mode. + +Practical interpretation: +- Treat calls to `unresolved_far_thunk_dispatch` as unresolved external/indirect dispatch edges, not as meaningful function internals to recover in the raw flat import. +- Semantic recovery should continue from call-site argument setup and local field effects (the workflow used in recent 0008 batches). + +## Raw 0008 Gate-Callback Wrapper Batch (new) + +Conservative renames for callback wrappers sharing the same global gate condition. + +| Address | Name | Evidence | +|---------|------|---------| +| `0008:d00e` | `entity_gate_callback_wrapper_a` | Gate check on globals `0x39a8/0x39f9/0x3991`; on pass dispatches callback through unresolved thunk using entry `+0x2` and `[0x3b32:0x3b34] + 0x32` | +| `0008:d05f` | `entity_gate_callback_wrapper_b` | Same gate pattern; callback wrapper variant via unresolved thunk | +| `0008:d0b0` | `entity_gate_callback_wrapper_c` | Same gate pattern; passthrough-style callback wrapper | +| `0008:d0ed` | `entity_gate_callback_wrapper_d` | Same gate pattern; passthrough-style callback wrapper | +| `0008:d12a` | `entity_gate_callback_wrapper_e` | Same gate pattern; passthrough-style callback wrapper | +| `0008:d167` | `entity_gate_callback_wrapper_f` | Same gate pattern; passthrough-style callback wrapper | +| `0008:d3d2` | `entity_slot_callback_wrapper` | Thin wrapper: pushes entry slot/index (`+0x2`) and dispatches through unresolved thunk | + +Notes: +- Names remain wrapper-oriented because target callbacks are unresolved in this raw-import model. +- These wrappers are now easier to track from call sites while preserving conservative semantics. + +## Additional Unresolved Thunk Stubs (new) + +Follow-up thunk census after inspecting `0000:ffff` behavior. + +### Confirmed trampoline-only stubs + +All of the following are single-instruction wrappers (`CALLF 0000:ffff`) and were given unique labels: + +| Address | New Name | Observed Caller(s) | +|---------|----------|--------------------| +| `0004:2592` | `thunk_callf_0000_ffff_0004_2592` | `0004:262d` (`FUN_0004_2620`) | +| `000b:f924` | `thunk_callf_0000_ffff_000b_f924` | `000b:0144` (`FUN_000b_010b`) | +| `000c:827d` | `thunk_callf_0000_ffff_000c_827d` | `000c:8985`, `000c:8f96` (`FUN_000c_88b4`) | +| `000c:82f9` | `thunk_callf_0000_ffff_000c_82f9` | `000c:8a10`, `000c:8f79`, `000c:9052` | +| `000c:8356` | `thunk_callf_0000_ffff_000c_8356` | `000c:84a9` (`FUN_000c_84a5`) | +| `000c:e4f9` | `thunk_callf_0000_ffff_000c_e4f9` | `000c:e4f5` (`FUN_000c_e4e0`) | + +Notes: +- This confirms `unresolved_far_thunk_dispatch` is represented by multiple local trampoline copies in different segment regions. +- Separating them by address improves call-graph navigation and makes subsystem-specific tracing less ambiguous. + +## Raw 000c State-Dispatch Helper Cluster (new) + +After separating thunk stubs, a coherent local state/chain management cluster was lifted in `000c:ab32-000c:ac8f`. + +| Address | Name | Evidence | +|---------|------|---------| +| `000c:ab32` | `entity_state_tick_dispatch` | Core state tick helper using fields `+0x38/+0x39/+0x3b/+0x3d/+0x5b`; clears mode bit `0x100` when `+0x38==0`, may call cleanup helper `000c:ac55`, calls `000c:7730(state,1)`, and conditionally advances chain | +| `000c:ab96` | `entity_state_reset_and_tick_dispatch` | Reset wrapper: zeroes `+0x38` and `+0x39` then calls `entity_state_tick_dispatch` | +| `000c:abb4` | `entity_state_advance_next_or_fallback_a` | Advance path A: when `+0x49!=0`, follows node-next pointers from `+0x3b/+0x3d` using offsets `+2/+4`; when exhausted, either clears active flag and re-dispatches, or falls back to backup pointer `+0x41/+0x43` | +| `000c:ac8f` | `entity_state_advance_next_or_fallback_b` | Advance path B: same structure as A but follows alternate node offsets `+6/+8` and fallback pointer `+0x45/+0x47` | + +Notes: +- This cluster gives a concrete local interpretation for part of the large `000c:88b4` control flow without relying on unresolved thunk internals. +- Naming remains direction/path based (`a`/`b`) where high-level gameplay meaning is still pending. + +## Raw 000c State-Flag Guard / Input Handler Batch (new) + +Second sweep through `000c` adjacent helpers — gated thunk wrappers and input/animation tick handlers. + +| Address | Name | Evidence | +|---------|------|---------| +| `000c:9f74` | `entity_state_flag100_check_and_dispatch` | Init latch guard at `[0x6053]`; clears `[0x8c55]` on first call; checks `[ptr+0x5b]` bits `0x100` and `0x40`; three-path thunk dispatch | +| `000c:a1ad` | `entity_state_clear_flag40_and_dispatch` | Skips if `[ptr+0x5b]` has `0x180` bits set; if `0x40` set, clears it and calls far ptr at `[0x5e82/0x5e84]`; then dispatches twice with args `(0x0b,0x10,0x1,0x0)` (record/state-key pattern) | +| `000c:a74e` | `entity_state_dispatch_if_flag_bit2` | Tests `[ptr+0x5b]` bit `0x2`; if set pushes extra arg + ptr and dispatches via thunk | +| `000c:84c3` | `entity_state_set_byte40_at_global_ptr` | Sets byte `[DAT_0000_6828 ptr + 0x40] = 1` then calls thunk unconditionally; enables global entity flag | +| `000c:ac55` | `entity_state_fire_if_handle_valid` | Guard: fires thunk dispatch only when `[0x6054] != -1`; no-op otherwise | +| `000c:ac6d` | `entity_state_fire_with_args_if_handle_valid` | 3-arg variant: pushes `[BP+0xe]` (byte), `[BP+0xc]`, `[BP+0xa]`, handle `[0x6054]`, then `CALLF 0000:ffff` | +| `000c:afa5` | `entity_state_check_field49_and_call_vfunc3c` | Checks field `[ptr+0x49]`: −1→reset to 0 return 1; 2→call `vtable[0x3c]` return 0; else thunk dispatch | +| `000c:b153` | `entity_state_animation_done_tick` | Checks `[param_2+0x14+0xa]` animation-complete flag; if zero increments `field49` and calls `entity_state_check_field49_and_call_vfunc3c`; if set calls `vtable[0x3c]` | +| `000c:b199` | `entity_state_input_key_handler` | Full input dispatcher: ESC/x/X → `vtable[0x3c]` (cancel); Left/Right arrows `0x14b`/`0x148` → prev state; n/N/0x14d/0x150 → next state; e/E → set `field47=1`; `-` with counter → trigger at 4. Manages `field47` and `field49` | +| `000c:b2c3` | `stub_noop_000c_b2c3` | Empty stub; returns immediately | +| `000c:b2c8` | `entity_state_dispatch_if_field49_eq4` | Fires thunk only when `[ptr+0x49]==4` | +| `000c:b349` | `entity_state_dispatch_if_far_ptr_nonzero_a` | Fires thunk if far-pointer args non-zero | +| `000c:b383` | `entity_state_set_field3f_and_dispatch` | If non-NULL: writes `&DAT_0000_2d18` to `[ptr+0x3f]`, then dispatches | +| `000c:b3d8` | `entity_state_dispatch_if_far_ptr_nonzero_b` | Same null-guard pattern as `b349`, variant b | + +Patterns confirmed in this batch: +- `field49` = state-sequence index; 0=reset, 2=vtable callback, 4=triggered end +- `field47` = keystroke-combo counter +- `field3f` = linked data pointer (event/record reference) +- Global `[0x6054]` = current entity handle; `[0x6828]` = another global entity far pointer +- Bits in `[ptr+0x5b]`: `0x1=init`, `0x2=active/event`, `0x40=pending dispatch`, `0x100=flag100`, `0x180=skip-all mask` + + +## Raw 000c Palette Fade + Entity VM Cluster (new) + +Two distinct subsystems identified in `000c:cdde-000c:f98b`. + +### VGA Palette Fade (000c:cdde, 000c:ce57) +| Address | Name | Evidence | +|---------|------|---------| +| `000c:cdde` | `palette_fade_step_down` | Writes (R−offset, G−offset, B−offset) clamped to 0 to VGA I/O `0x3c8`/`0x3c9`; decrements `[0x630d]` by step `[0x6316]`; clears active at `[0x630a]` when black | +| `000c:ce57` | `palette_fade_step_up` | Same loop, adds offset, clamps at 63 (0x3f full VGA). Clears `[0x630a]` when fully bright | + +Globals used: `[0x6312]`=start index, `[0x6314]`=count, `[0x630e]`=palette src ptr, `[0x630d]`=brightness offset, `[0x6316]`=step, `[0x630a]`=active flag. + +### Entity Mini-VM / Record-Player Context (000c:f6b8-000c:f98b) +| Address | Name | Evidence | +|---------|------|---------| +| `000c:f6b8` | `record_table_get_by_index` | Bounds check `param < [0x8c88]`; return `word at [0x8c84 + param*4]`. Table at 0x8c84 | +| `000c:f6e8` | `entity_vm_stack_init_with_data` | Init stack ptrs at `[ptr+0xcc..+0xd4]` pointing to self; max depth 199; copies optional initial data | +| `000c:f772` | `entity_vm_state_copy` | Copies 200 bytes (100 words from `[src+4]` to `[dst+4]`), then copies 4 words at `+0xcc..+0xd2` | +| `000c:f7c7` | `entity_vm_stack_push_frame` | Push call-frame: saves ret offset at `[ptr+0xd4]`, decrements `[ptr+0xcc]` by param_size, zeroes new frame | +| `000c:f844` | `entity_vm_context_setup` | Calls `entity_vm_stack_init_with_data`, then sets `+0xd6..+0xe3` with position/dimension/state params | +| `000c:f600` | `entity_vm_pair_stack_push` | Push (word_a, word_b) onto 31-entry array at `[ptr+0x80]` (count); error if full | +| `000c:f63c` | `entity_vm_pair_stack_pop` | Pop and return word from pair stack; error if empty | +| `000c:f94f` | `entity_vm_counter_add` | `[ptr+0xd6] += param_2`; simple accumulator | +| `000c:f98b` | `entity_vm_set_field_da_to_global` | Writes `[param_2+0xda far-ptr + 2]` into `[0x8c94]` | + +Notes: +- Field offsets `+0xcc`=VM stack ptr, `+0xce/+0xd0`=segment regs, `+0xd2`=base, `+0xd4`=frame depth, `+0xd6`=counter, `+0xd8/+0xda/+0xdc`=VM position/bounds. +- The 200-byte body region at `[ptr+4..+0xcc]` holds 100 words of script/state payload. +- The pair-stack (field `+0x80`) is separate — likely pass/return value stack for the mini-script. + +## Raw 000c Cursor Zone / Slot Array / String Queue Batch (new) + +Three utility subsystems identified in `000c:e6d9-000c:eadd`, plus companion slot array API. + +### Cursor / Directional Zone Classifier +| Address | Name | Evidence | +|---------|------|---------| +| `000c:e6d9` | `cursor_zone_quadrant_classify` | Splits screen by `[0x63d6]/2` and `[0x63d8]/2` vs bounds `[0x8c6c..0x8c72]`; returns directional code from 9-word table at `0x6401` | + +Zone table layout (9 entries): NW/N/NE / W/Center/E / SW/S/SE based on horizontal threshold at `0x8c6c/0x8c70` and vertical at `0x8c6e/0x8c72`. + +### Slot Array System (000c:ea53-000c:ee44) +A complete 29-slot menu/choice array with fixed stride 0x15 bytes, base at `[ptr+0x67]`, count at `[ptr+0x7a]`: + +| Address | Name | Evidence | +|---------|------|---------| +| `000c:ea53` | `entity_slot_count_update_and_notify` | Sets `[ptr+0x72]=param-1`; calls `slot_array_get_current_entry` and `slot_array_find_and_dispatch`; calls `vtable[0]()` when `+0x75` flags set | +| `000c:eba5` | `slot_array_dispatch_matching` | Walks 0xb-stride array from `[ptr+4]`; calls thunk for each entry where `[entry+9]==param_4` | +| `000c:ec30` | `slot_array_dispatch_if_nonempty` | Returns `0xffff` if count < 1; else dispatches | +| `000c:ec9e` | `slot_array_find_and_dispatch` | Searches 0xb-stride array for `[entry+9]==param_4`; calls thunk on first match | +| `000c:ecf5` | `slot_array_push_entry` | Copies named string to `[base+0xc]`; writes 6 param words at `+0x12..0x20`; increments count | +| `000c:edb0` | `slot_array_push_raw` | Copies 0x15-byte raw entry from `param_2`; increments count | +| `000c:edf7` | `slot_array_pop` | Decrements `[ptr+0x7a]`; asserts `>= 0` | +| `000c:ee19` | `slot_array_init` | Sets `[ptr+0x78]=0`, `[ptr+0x76]=0`, `[ptr+0x75]=1` (active flag) | +| `000c:ee32` | `slot_array_clear_flags` | Clears `[ptr+0x74]=0`, `[ptr+0x75]=0` | +| `000c:ee44` | `slot_array_get_current_entry` | Returns `ptr + [ptr+0x7a]*0x15 + 0x67` (current entry ptr); 0 if count <= 0 | + +### String Queue +| Address | Name | Evidence | +|---------|------|---------| +| `000c:eadd` | `string_queue_push` | Appends string to 10-entry queue at `[ptr+4]`; count at `[ptr+2]`; sets `[ptr+0xd]=param_4` | + +### Additional VM-Adjacent Helpers +| Address | Name | Evidence | +|---------|------|---------| +| `000c:f2e7` | `entity_call_vtable_entry_10_if_valid` | Null-guard: calls `(*[ptr+8+0x10])()` if param_1 non-null | +| `000c:f39f` | `string_table_lookup` | Searches `[0x65bc/0x65be]` table by key string; returns matching words to out-params | + +## Raw 000c Cursor Nav Dispatcher / State Reset Batch + +Cursor navigation subsystem in `000c:d3e9–000c:db68`. Manages directional zone changes, mouse button reads, keyboard scancodes, and entity vtable dispatch for interactive UI cursors. + +### Cursor Navigation Fields (entity object offsets) +| Offset | Purpose | +|--------|---------| +| `+0x32` | Current zone code (0–8) | +| `+0x33` | Previous zone code | +| `+0x37–+0x3a` | Directional booleans: N/S/W/E | +| `+0x3f–+0x42` | Mouse button flags | +| `+0x45` | Last keyboard scancode | +| `+0x47` | Navigation index | + +Globals: `[0x63da]` = mouse button state, `[0x63d6]/[0x63d8]` = cursor X/Y, `[0x638e]` and `[0x6346]` = reference data tables. + +### Functions +| Address | Name | Evidence | +|---------|------|---------| +| `000c:dac1` | `cursor_nav_state_reset` | Zeros all directional/button flags; sets `[+0x32/+0x33]=0xff`, `[+0x47]=0xffff` | +| `000c:db68` | `cursor_nav_update_and_dispatch` | Calls `cursor_zone_quadrant_classify`; updates `[+0x37..+0x3a]`; reads `[0x63da]`; switch on direction (0–8); maps scancodes 0x48/0x50/0x4b/0x4d/0x39 | +| `000c:d3e9` | `cursor_set_ref_and_dispatch` | Null-checks param; sets `*param_1 = &DAT_0000_638e`; calls dispatch | +| `000c:d710` | `cursor_set_ref2_and_dispatch` | Same pattern; sets `*param_1 = &DAT_0000_6346` | +| `000c:d75e` | `entity_call_vtable_1e_via_ptr` | Calls `(*[*param_1 + 0x3c])()` — vtable offset 0x1e | +| `000c:d775` | `entity_call_vtable_1e_via_ptr_b` | Near-identical to `d75e`; duplicate generated by compiler | +| `000c:d7c6` | `stub_noop_000c_d7c6` | Empty stub | +| `000c:d7cb` | `stub_noop_000c_d7cb` | Empty stub | + +Direction code mapping (from `cursor_nav_update_and_dispatch` switch): +- 0=N, 1=NE, 2=E, 3=SE, 4=S, 5=SW, 6=W, 7=NW, 8=Center + +### Timer Rate Sync (cursor subsystem) +| Address | Name | Evidence | +|---------|------|---------| +| `000c:e4e0` | `cursor_timer_rate_sync` | If `[0x63e0]` (cursor active) non-zero: copies PIT rate `[0x39ce]` into entity object at `[0x4458+0x24]`, clears `+0x26/+0x27`, then calls far thunk. Called from `cursor_nav_update_and_dispatch` at `000c:db97`. | + +## Raw 000c UI Listbox Event Handler Batch + +Analysis of `000c:880c` and `000c:88b4` — the primary UI event-dispatch island in segment `000c`. + +### Overview +`ui_listbox_event_handler` (`000c:88b4`) is a **large UI widget event handler** (~8KB of code, `88b4` through `9daa`). It takes the signature `(entity_far_ptr, seg, event_far_ptr)` and is stored as a far-pointer vtable entry (no direct code xrefs found; referenced from data). It dispatches on the event code at `[event+0x6]` (keystroke/mouse codes) and updates entity fields to drive menu/listbox navigation state. + +Guard function `entity_state_if_flag80_call_thunk` (`000c:880c`) sits just before the handler: it checks entity flag bit `0x80` at `[param_1+0x5b]` and gates a far thunk call. + +### Functions + +| Address | Name | Evidence | +|---------|------|---------| +| `000c:88b4` | `ui_listbox_event_handler` | Dispatches on event code `[event+0x6]`: confirm keys `0xd`/`0x20`/`0x152` → `entity_state_tick_dispatch`; nav keys `0x148`/`0x14b`/`0x14d`/`0x150` → same; list-prev `0x2c`/`0x3c`/`0x55` → `entity_state_advance_next_or_fallback_b`; list-next `0x2e`/`0x3e`/`0x53`/`0x73`/`0x75` → `entity_state_advance_next_or_fallback_a`; Esc `0x1b` → tick dispatch; comma `0x2c`/`0x3c` → `ac8f`; misc UI events `0x6f`/`0x7e`/`0x13b–0x143`/`0x241`/`0x410`/`0x420`/`0x426`/`0x42f`/`0x432`/`0x441` → various paths. Guards: `[BX+0x5b] & 0x80` (active), `& 0x100` (modal lock from `[0x604b]`, `[0x844]`). Large scan loop `0x100..0x27ff` at `000c:a80f` for option/device enumeration. Falls through to common retf at `9da7`. | +| `000c:880c` | `entity_state_if_flag80_call_thunk` | Guard: tests entity `[param_1+0x5b] & 0x80`; returns if clear; else calls far thunk. Active/visible gate for forwarding display/tick calls. | +| `000c:ace5` | `display_fullscreen_blit_with_entity` | If coords (param_2:param_1) are 0:0, calls wait thunk (`0x48c`=1164ms?); loads display object at `[0x4cd0]`, reads byte `[+0x5]` (video mode/palette), builds full-screen 640×480 rect (`0`..`0x27f`=639, `0`..`0x1df`=479), then calls far display function with entity + position params. Returns display-space coordinate pair in DX:AX. | + +### Key Globals in this Handler +| Address | Meaning | +|---------|---------| +| `[0x7e22]` | String/resource pointer used as data context (`[0x7e24]` = flag) | +| `[0x604b]` | Modal active lock (nonzero = block most events) | +| `[0x844]` | Engine/game-ready flag (0 = block hardware toggle events) | +| `[0x604f]` | Toggle state for event `0x410` | +| `[0x6045]` | Toggle state for event `0x7e` | +| `[0x8638]` | Counter for event `0x432` (wraps 0x11→0x12..0x14→0x0) | +| `[0x5e82/0x5e84]` | Far pointer called when entity flag `0x40` is cleared | +| `[0x4cd0]` | Display/screen manager object far pointer | + +### Event Code Reference Table (partial) +| Code | Meaning | +|------|---------| +| `0x0d` / `0x20` | Enter / Space (confirm) | +| `0x1b` | Escape (cancel) | +| `0x2c` / `0x3c` | Comma / `<` (prev in list) | +| `0x2e` / `0x3e` / `0x53` / `0x73` | Period / `>` / S / s (next in list) | +| `0x55` / `0x75` | U / u (up action with far-ptr check) | +| `0x6f` | o (some option panel event) | +| `0x7e` | `~` (toggle event, gates on `[0x844]` and `[0x6045]`) | +| `0x13b` | Shift+F1 area | +| `0x13c` | Jump-to-display event | +| `0x13e` | Blanked event (gates on `[0x604b]`) | +| `0x141` / `0x142` / `0x143` | Option toggles (gate on `[0x844]`, `[0x2bca/0x2bc9]`) | +| `0x148` / `0x14b` / `0x14d` / `0x150` | Arrow keys (Up/Left/Right/Down) | +| `0x152` | Insert key (alias confirm) | +| `0x241` | Display position query → `display_fullscreen_blit_with_entity` | +| `0x410` | Toggle event with `[0x604f]`, gates on `[0x844]` | +| `0x420` | List-scan init (loop 0x100..0x27ff) | +| `0x426` | String-push event (calls DS:[0x7e22]) | +| `0x42f` | Push `0x103` thunk event | +| `0x432` | Counter cycle event (`[0x8638]` wrap 0x11→0x12, 0x14→0x0) | +| `0x441` | Pattern-fill loop event | ## NE Segment 21 Analysis — Timer/Event Dispatch System