From 0b189669b5c0008fa4fa6e33fdf895f3fb616dee Mon Sep 17 00:00:00 2001 From: Jackz Date: Sat, 23 Dec 2023 12:30:25 -0600 Subject: [PATCH] Misc changes --- gamedata/l4d2_turret.txt | 31 + plugins/abm.smx | Bin 0 -> 46060 bytes plugins/l4d2_hats.smx | Bin 65712 -> 65868 bytes plugins/l4d2_turret.smx | Bin 22488 -> 31158 bytes scripting/abm.sp | 3774 +++++++++++++++++++++++++ scripting/include/epi/director.sp | 2 - scripting/include/hats/hat_presets.sp | 10 +- scripting/include/jutils.inc | 32 - scripting/l4d2_ai_minigun.sp | 32 + scripting/l4d2_extraplayeritems.sp | 15 +- scripting/l4d2_turret.sp | 600 +++- 11 files changed, 4366 insertions(+), 130 deletions(-) create mode 100644 gamedata/l4d2_turret.txt create mode 100644 plugins/abm.smx create mode 100644 scripting/abm.sp diff --git a/gamedata/l4d2_turret.txt b/gamedata/l4d2_turret.txt new file mode 100644 index 0000000..b2d19e6 --- /dev/null +++ b/gamedata/l4d2_turret.txt @@ -0,0 +1,31 @@ +"Games" +{ + "left4dead2" + { + "Offsets" + { + "CBaseAnimating::StudioHdr" + { + "linux" "68" + } + } + "Signatures" + { + "CBaseAnimating::LookupPoseParameter" + { + "library" "server" + "linux" "@_ZN14CBaseAnimating19LookupPoseParameterEP10CStudioHdrPKc" + } + "ModelSoundsCache_LoadModel" + { + "library" "server" + "linux" "@_Z26ModelSoundsCache_LoadModelPKc" + } + "ModelSoundsCache_FinishModel" + { + "library" "server" + "linux" "@_Z28ModelSoundsCache_FinishModelP10CStudioHdr" + } + } + } +} \ No newline at end of file diff --git a/plugins/abm.smx b/plugins/abm.smx new file mode 100644 index 0000000000000000000000000000000000000000..b316310dfaf7ce5e375334fbdf7995691ea7294d GIT binary patch literal 46060 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

az8-gx-t7-1s@|I+JY6f2r{p#%D7+<*o`4O_* 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¥aCx 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�psX= z{`-??2aQncv{lMM@nV&hfubS+`@4UuZPF4|V*)IYhUir(f6zl^S^rFOAcpDTPjB)q z`*k>)GJq#3DhMX1+kx>2Digv&TqzhQmTHrD$iK+mfIhX~Cb6>d+qbu*3QO~9b5F#7 zU4b(9t5yi;4|mW_wou6D_>o|h)*d~`!N)_UmXy}q67gvozep?QqdFLHl0ISKnNV83 z&K6(V2s!sgDs0QDQ6fHB5hAi2xatK^%@8?-Bz!L5>QBDX0(|#gB@m?^Y`CFg3fKm8 z@rz^fHu}F!)}dI+#Ua0ueMkq zDV03pzuVZ$klVC$LM*1xe zS$dArsdIT)8>tkc==v=|vPX4o2WcgKZNK@JAQr2Ett_Jg61rvHNUxNZ<-cB?iMmV< zpTt1T{NgT?#wRhLX>Wi41_s^{l@J8>(cu#`Lg3nV(jAM)yokF@;FcwPv5_v6>BD0-+tMe(*aVnNA@ia3ZC9q) zdW_`s&+f}4^8rxfvtZ28ZNeSd4i4)!y-BY_jiC<%D`suF7gaSb$?d3s(#yE$@&rqQ7^QC#i3By%#c#o1GUW6Qz#ki+8sRj36ab{~4JqZh{TXDLFSzn~mwLX~C2`!`kNzuh-2QMg9co4&oQ7+BMs%MP-$eAd>0dX~ zN?BErt3&aETW&^(xq#C1l>+l|1{0kU&~CZ`v_-BUxZ#pPKUHIz+M^A#3}V&$(F$BN za^bp}n(Ah#RI=uMJp8?0EWReN`F!=z>9|LHY%^iDh)tI3t8shgLkT^x;8%W;=Nr1V zlf0XiJ-aUvS#3{=uRhGlV?ZBG4k)aQjcgp-aqGH?~(Dg}q6IzNK2jju!Cn9dr4I0Fa zKYYhU+5vwhE4KBO9N4huz6a1Bh%%D&y#_m-D}AEpE+PK2TS7X z@s?$&L3~Uj}NT^j86zVaNk(Yo2=aPkABy=ydQ?^k(V@|yxa7J6QK&o&mtW|wWd7kZBJ68QXp zBd4U<>L6Xl_JVl3sL_fzzf9c3{orFP1-(Q}9(_1(mash~+dPfndkK}j_;6ld179UM z_M~6{Y7y{~II|wMIgI9e1(i9?Jx8(GUge!v$2>cBB!cmGOw{UCHgfVLKvmsS)KZdF zIlXs}#zF@YT>M2g5BX=+*3`U}@*DpAdJ;nu2L%WzObg~Lr&}tKka&zR4lD-QsbJT0 z*o0q8S6rJN=vjU{pJXAsKq#SgA}-f2A{qfeu=B_L3lA zLxE}O{VNc|vbtv&SnQIs{KV^m6|^~9)bQuGN_V*Nsi?%OFUTgpUAE`3R(ILji}mgW zkJz}pxEBl|my&dsC~4@{GB}7H&tGOvPPivALMUElzO`}}bJ@%apayjYL6O_3SXQGb z>?|$!Y-5~}%7wm^pS?MT*B2}0(4?5amQed{NMDM0JgV%h`(M>Edx?Fwcnrv-C2tMh zEy@Kl$+j3$uUn~(WoKP8V=;PN^rG$+n~8^OKjHv)_(_a85@gU~Go7Z8@B3_Ax-ZAs zPu=?++X?4t@1XMchG*k3rmcB_jnQnY{pDpMR&HL;2p+4$_pB=BTyh+}Rf^CSTUlP}SKNRw^sQW6THZv0m+X0W#*BtAco$`n{_ij`kWB1yxXC z6_f>rMHi&-nako7r7`tiIQvc595+mjGVR|P5!|-aDW7pTmIPWJB=6$bpqvn)Y!jY> ze-x;Fif+TVmM@hGb^u}xNh4_rTYc7T#AR7?DPs%55Ig}bu(Mf}SQ)|!tY5&Bryq6e z|FC2(wK7mDI2G(ROtCcJDLAo5?b>%6o?96!*&o<wXbosXu2&WLxbR zuh5vkY|vlf!1#H@ZpGwa+ut61Her+8cy!YG!}s}bx$__0FOb!h_uM{7$+Q#(*3;W= zKI%54wq&2RG=UWiH=HybE@{1#ce8>f9;7hY-nthHPvuL5r!pn_dD#2e$Yaj5%Te@p zJcTTFJPv>4$fXc&ly;W|o?%lIQuNZaQtocIur1ApmrCpjPB-M+C0t=7oCs0H$M>l$ zvUxC<4aSKFsq_GDB@*5N(;!PJYG^CtUkM{Q38{l;+Tkc>yI>fTrOL_!_@8cT)wLck zZXgwQN(7^xc#tM&%WMZL+}1?#*e$@mC&fh)JlW9C5)U$}zIS;f`gt9zQ*Llfib_j_ zBKPix3{;ExewHJVT9mNg*7$DM;z(i_=*VQJx4|IV$5-y%G|8-pFPqr7bV>$O=j8QPubpe0hJi;4xm;;``Lh36yb>nS)u?ASGwu< zOO>D)x#1faIlX7_?AX1(A;`VIVK9(0+hvORqQY>uSBx6kOGp*%)wjs+4Mft0BDZKm zkXx@-G|nu}$JEe1UjeKkA(wKE*%P#wHX%Zb@res0R;cUB&pxd(!T*BZTQwA3oT zk2BCW9B1QUJjKiTO6<52vg?dtlB=(KbapUD07Z;hH&*1H{VVR*9`roOkbkGRM`qU| zL?LC#0yQhU(c@=@wocp{j1NWPbV89UW!yA>(jR0?J7tn`PNq|EPMVQ&4x5o!TvFQ2 z6?)ia$4>swGe)~ks8&duv$2$RD8ho@W}7?KF<||xI>D1kyd;hB+x(bgTif-PhF}*l z%o(7EV_O#RiV`pYRiZ&Zd)KjA8DsR12;7;+6!>A7#=~M-P63Jz-&941HK|nyDBh6b zdw3H7i4PP@RUERmJRz#v;y@SoZO2;=**7BvR6 zHkF62nIxRTG2d7$t%E)cA6}3EK{QelU&uMxUsE*3?{HzxUXm!dqQj}v7L1%elcFEmS`{5RgWLg6w(gK~3UiTgvTJ=n(hP>eCcWA00*iOw@7PW| zxKK3;`%7Yu-6GY{A?m+AH|&b5@FP!ILy@QVKOnd611}U% zuiOLz9aJk$YsdjMFwmuO$WR{RmA$E2vGt0=!dipnD>AD*}+ARYo^FJT4wRK&glURu6e;?^BH4l1>Z*e|4w z5(XU?-H(Ap$zd?65=!j322A>N;rDfG!i0MZu_&+3#5kMi8n)y7#rnR18M89?U?9DCd&qq`D4=?85)#-)t1i*mR5*JDhBaC_ddp5G1G z8HQXVGqRaEdRCOgfg|fb!vk{@ZwoFIq0*ja8;*s0p}`JoRUVcqIN#C50hsZ5hJ4Q$ zA>+G$Xv<$$A!epAkk zrb;jEB~WLEVdU=Mct)>v7Ac9t1FiYj>20)Vs*URZGHi#i?8z1XE=P{Uf6|Q>{gS&A zbQ8%k8u|YSmyDx3KV3&<|HqJKR;rrkxF**HMgF#vP|?iD1mvNuqFdw`_rFoo%L%d@ z0+miNnC{r76?#=BjXSp`?6^B$*+5vcBL%oTj*)g_(Fz}O{X=D|@U zz8bwq?t1&Y-6{6Z^$YWl?M!PQNB&1#xzF$;g{5SX?Yu)v)|ZJgw^kx+l+Vob$~zkF zc($$!7saVTwGn4_DQF?A$zwe`v*y|qIgTFk_2 zW|`!wjz%O&e-+q~Rhx5B{Cr@AEnCyv8)O`-Q|7!zMW4Qe;h&yV&a*DQS64^IX$V-b z>d6T-+b!cQcPn~!KaX-R`K#-6*<-$m3tuo#pAJ>@*nFR# zz<+A;@0(gL+8nIn$Xy2ae6--WXdz_qPuH2%u$plgRX*9U!&OfKEA;&)d>C!87o~o9 zH7H}h65*0$7<(d{t1);{zB4uP%OT(`%KVPf-rA{ihMaIVgzY(`{fel+v!tFBKqK)I z`wPk_Hq@K&zKS*Afn^u(Rcjtmds}MWxP<+y?*!_is8Ri1J4K6NOwV$Ul%~dEr4pp7 z{S5*!H^_I=WoXVH#LBG6H8>FSapv9elF%h>bP%va`|okjRt~diDP0 z9r1&3KUWse1he+g%gdj_RVhLuhgKqaK|*V_RZmmoG~uEe+gbGq-z2?!fV^M!s}zJ{Xp7=!uZOT5{t#B-5Kauq{VnRroD?iM7Zz$l)O9e)qaw4Rsm~o}7Qy zk!=MbX8C-;}<&_urJe#qa5}sjCmCs&<-Q5-3=+b_88y-e;1rg~b`4Y=TVS_!35te)H z*;)LutFm)vxmjRqzi(gh@dbi-JZY8C^ie@cbG5mKgBIlWq#(L>uWviQaY;vyw(j=) z%M7C`8`GY!DUcbu4N~&UhWCX?I~&bfy@!Q5x3S|Ec1!+pvj$w%GK4m1oLBk-4o)MWH4G zloPHtXED<*TuLapH#MwVFYZ%wxq@{ml9g7YTL`zZ@d6qm_!u+Y%d%n0xDcmjak3i_ zoMrvF%RFb?`-S{-Sg!AF`bw#haprD4zHj%1O{%(`?;Jp)t!bQ;9{V|0+@)NdubkZ~ zwiz86^yjtbxPc`e-L$`}j}4z=NSS>u9aIu*fP2q&SjsbEr1_i0R@wMY&QbU6=7Nj( zKgO2FdqXbm%}X6TkTN|hT6dKYyw~>Vprh8~?b%i3fK~1qc8=5QJ{93EYL?DLrfMUh z-5~-m!RAbn`sr0X+V^Z2{*A;`OdufnhLkRx+$JpgnVRj?0i^^(s;K<)gHuLZeEKIt z*6SOPMV2Db1v1nM-^0Du%}`i%Bgm#)xM^X{I;tRheMU+4z^qYGpsB8lH=s~?MERmx z-p14`gkxg#!2PfK+gt6Q^ahwLstHB1Z?$W)Pd8usoHRM}A{4p# zj?VS!{0d7SrZ@0hHl&S79p+9JTr)?qr*o)WR4x{mrK!SbBx>rSXq2(Ff|Ep*G^Y6= z6>FQ)Xs47wLR{YsC)2~B-X9sNB`1P=nU&wLxx!7j6#h=1w3MeS=G3g#P9d# zVjaIZP&f7EgZw{$u6Ww&Spy?(#OC zcT6xS`^c|xzak_EFCy_biM^x*mW#3;#p)3%FZ~vjQB#GR?KdKrPC2-nYP7Povr-;(Mc&|RU9N2m0-*WGl3C>T;bEkJ9LNF3oMd#H1@L0|5@*0q){HBi@Sn$VKt=lBGegslt+SAD#EAsqAOT9!lu@uE5zrIgj^}K zAZ5dESsbBjtpZ=iIY$&ot{4L$+o=t4LiGa!Z}D@|p8O_QbUNyFWe9P8WJa)hdxiNZ z=(OwpMbw4*&}iJ;(xYxwT5UJzYsIHBfoSfw-J`Cuy=KXXPBJ&})ZD+U&+gUJEEc_n z!0LyG3?H7S5*q-fPcwa=v~0$$@(wA3<7@`w9}62!x}ThM3-cHAXOQ|(&ZFQ2)P zO^3sNu~T(_;u){0?c3QcZ-h z^nP+2a ztn5|_w3^!C$yW852K zn--s8D8*Q<<^AqqqWS*_T~*Uwan2~~@IQ9u(1_SoEm{rdI7Wr|V|C}q1pKqDVygir zd>Cl*k5>bsyvd)WJFaJirumr-b~COwux;5#O~=<}%B8`_bkewTIujnKKJZp11Vhv4 zdH8s4xzxdYNM2ONtzX^|?2skRSiNoIw%9G+^!pr(i3xZwzG78oI+RKm03UKwLae|o z1wD1RqpXA4yj$wFzw(SNEy)K#E;~G`OHZ;E#Jl$kWp*%8-y$PtRmbPB#0AbL=|@j} z&IIKGyPlrlcU!L+uU$Ko=|Q+SC&Xr~nmF-3;I7%^3=DotWA0Fyj^6&G+x%)cIT;uISw3m*Dq1qt@!xMOGgaUi)6C z%K+xGHfSk6zKn=b8sW8!yzV`HdMd6m%Mu&v4%gOwek#6;VVbuM?txyO5&Z{1=Qb~U zp?!ez5?Fm0xzc)_7Fb!N<&|B*4v+R!X)g%<3waiSeS0U{0_x&qDEZxJr8~r~mWJ$LemgLEjaJ2J5bMGQWnao1|zC3b|HU~b$3y91)zr9mh zjYOdO-W1w_tMUW7A5J&zb(%PI1ZW7i8O`pMN&3nTn^Sj{nNxQ+_{jNmat4BN`>F#9 zO02}r##=+9Hh>*Z^YRrrkMv~7NQv~MXXq;Hd;;;!C`$~N^_+fJ`8fDu0?9#hkKmwJ zCP5#ZkuA46DO_JII-TmN4Lqs+jYD>_M_VqCIj9FqlKlQV7#$nH_n9L;H0>dzMbAcm zUrdGC=Co~KX(@a;goBo58gcRu9kBT0)6&nMOv{X(k|*vux|Afj5<{63?sULk48#~rIzjqed> zNj6$HPAQ9nO4&mRQNj*hSHaJP58p`~TNx~e=bSyYg%w?sOTK#Lop<|`q3hk7F5Vkl zy88yCLr;1~4J69Je0eAl*G8LwrkoaxOLX=U#CQ9%)16AOaB}(Fp^vL$^*d_)BJ{Vb0v^+)KO4%};VT zaz50SU8U9Q5VCgP8A~xsG6#OLWk`z8fH)xX7FFYd5vUn?1~UjJm%;sWkWTtIbz_N*JL}=yp_YRBo(9cpfXDc)7 z(SavO?TN1au-|_vDg>d&CL=nu;rhqPr|R?k`_^Ac#O$!j%ulS&6Ld#Eow5oz3fga6 zv)b&Kz43ZPovWyQjbmJKbm)o(8$gZNyh;PBM|7#oo|9$Eu?N~W6gIKQD*e#AJFCP_ zZgr8SrAyf!ea40u+Z#=ipn|i0%dBzv0PzyZj|HLW4Z!SPaz+49A=A z9!}2(T~Q~=p{E6W2_>a6b$$NpmpNG?Mn2zyZ}#Rw24pm8 zbFvcB-T6V%Y_D#np3`d;hQ&AGj*#o;1+5JQBUQ+C{}~N%O3M?#P*^;mMR|XHs?zNL z`pbP~aZleR#qUWiPlTNW=zO$`6Mxo=`g8l-?%i-T)=j}I6iTeSrs%F^3v9Z+4O}0Sidu7AcWg2^$1Q?693TFXa&>F0@_o-!&@|o%+>hG-A*^SB}J-Z$C=$3-3e<`Gp znno4Fdyp&d;k9#@_;vpXPmiakPjPEeODu#u&zskbf@0vZ9_7gW1f`@9HXP%Xo*pgl z?{>G}9oRNq?aL=h&0*gg2h2fN1Tt+kPE?Mr9XsX$dkBmA z+J3zM_&u$6^%mjn(9-I4>Qoe-E-Pgve1-q-s+D1{dSEereE~;3c1vQz^Q}RoWSh8v z4Ap@TJ$SZ_$!kk75~LE$U#bk@OiMvku8fTp6ml#ur^lv$E5O_ z3GLIEEaY9Og1%&z`C|Lr&nAAgT}q{9u)AK#9`#b3+bvn{8r3Wgq`+Mz*NytxPwH2! zT)MdT$!(0EOWbb#pO4Tv%;_B6&t7>Mn<_3}t?ztm_)6sKP6+n#;3FvhZS)JsG4HGS z;g%jd!?FQ3Ke^Kp2LrvS7N_*vN-WVj&=q^p2d}z#<*Dcc%&3Q#Qzl-%-T28)hm~)X z73tnj$zCj`d)g=}jOb3!EH>IH^Ti;moG_H99%OuHrfwrGxvl6yIU28 zj(?<*4|#fU_o-&mswa!dJtVxnEB$)qLBI@)#rM?*0e@IhLuugsy`fREg{v%ZC?=+O za#Ef~u&>)+>0mw0`x6WTzauAH@1*03krzJoDC<9cnu3i$wrXHuQO&X^pd`;bZglc* zY)rN1B;l)ZBRb*-kLO;Y8h^3OlhfVY(NLE*>Y;%vcI#SU!y7bgPm| zLu@_WqPe-~c{2>F4jbOsUCLG7b&fV?E7W;E6gdX}b|U*PWufeXHba(ua5>b}tT7x0 zukx-xT~&Yzp`3gkN|V}Ea>Ru6POK#(<9u=0dv}ykE!&<3Jjhl19BEdfCnf(dr^AAW zV9ijGhm^ZwBW%V{KD}Oy>aK(RLcG7t)Fk{kY02=gs`==S(%^4Cgv;m3V_7mtAb(7W zvV1LT%oPg-pbIy~a4}C}Qdwy#5yBlm@czNX|Nr|BGIVvOkUj zHXNY*(%pL^4EHO5d8Mw$QG}k=XDPav{wWPX#@Uyjv^PEqQDzOm$jaC9TXZ7OvwFQz zNroAZz>@f`cdA#rJR@`%XqrG12_e$+sVw-~G@e7@`R`IHzvP;uppn)=1YmJm2Zz_9 ztiK<3*XF7;#`kY4dM*gDBg|ysceW*VRSjFlwoKdNX}om4n>R~;Jt%1IWfh9RUG9p$ zzLCaH_I4M72#ztnqtz-dY3p-|X6aP@RhRjx?`uC(=bcQ+h+8OFyhD`dS(x19vM48{ zKOX(sIhgy~S%>}WG*-V{{9N*oKyBaLAYF`n}XcLAe#LFq` yS*1tH6|_*NJFgQy+N8)Qx?rM~#>pUCo8LH2EqiQu>&^Ose)a%y;~McZAP2 z?ik;tD@XYFuKvOI-_L*i3?JVE9;*!<<;&+a z{)ERv<45_{dHZwZaWnoX-%XzP=Giij@9=ym&%`E=@ot&mj@r;D36;BkMW)7`5B(|@mP=7msK90FgeC& z!pmom$Cj4I_|EF`@^=Nhx$~*GxdgiKsrUuG^6_$o{1<{<0(by&3G@nf|1bFRTtHx; z*Z+H|al+}+$g{=X8$J@9`@u0Adh$p2gE;pOi0 zzs>!(g}{Iy*Z+v$gAP?~Wt^D5{{~O`y1AgV= z^S|L>*Z*+H^g2QyM8YPN4qY_8+8t1F?CziEp9zSscf6M+h(b?28vY_N3KNVbQjz_KN2& zxRP6xXW7(8*|uj;AKTaC+Sjw&*Bje!mfsS$$+oyYFr+w8a?t~FMjd68NmMzPmj_+Jv@2eiyrD{P;oc3ydPy(KFRidk{zTt5PW06=uZ!?=qcXbquSSbnS5x! zS$zvodModF_5+o)JPpNx!ZRrA=&5VbwwU&tpKcL8-J;n1Cj&vnfzdOl+tE|J3~of* zTDoYK{dYT?>K{WVsSHXJ&&bdq&CCri0zEOx-+jf7}UYjc`+k$shnnwf-72BBY~X<~?k*RCx| z_L;)=tmt0=?8-@q=(r@GnGdRImv+?3y!lpq`D&wo@72b~m{Xve6FnHX(`K`#owZ7k zTcKN$Wq-%R?ubgqWEEk|?DuHT8%zw5nWyS`lfF*32>{Jf7S9HyM=s2kklr0UR@x}C zo;UX81G3gM=mzxV;xs?Jzt_`BK>hPZ*#y_47!++UCXBVpD$wv zlLi9FT&wAzI?dXR>cn!-n0ucxKT}XkYTr7gUO1Tckx@%^;p3-)-baH?)*XH%{(N)H zzXl7WusmEmwp0V=L*mr!mpg7KZlHcJjj-pmvDJ{ivAL{|W4&&x?mdKG#)y^=DZ$AT zv#gAafUgafi-P6l7KsP6I_)J`(>4}?Rj;QtY8q}qb!^ZS`AG0bZ_iL2JDQW>sD(AB z3$c+1n9Gx2sxI&*5aN&v7l74)ZBxGC^NKcmEl))VCe4+BZK$0V;^|UqSG6$K5&-L6 z?`a#;HT}u@@-$X8c;NNHbf^R434?G$VTS4eLoT-^bRi<9aze`NgWq=CyNEqung_{H zCl*J(P!efFryV?wC__6quWa4ksqJe+W+rw%ltt8~X9(m5--)FWVP}aR@9zzpc!E#N5@Lwpj+tl=6w~OqV&d)2B1>nVfZeyb*qP0u z1aZo@%{a+6N4bc+IAr0s4YsCP(M8J$`}`VB3yQnkhlm!p)x$HT263bHv!?hmo0Oo> ze5=!UStR(8v7r1YRe4jqU}B&z-o&PjANu<9X0?v{3mlLTV4PnE0$&TyKQgLo(S93t zWUM(l3T&8$^Gd8UC^Vt$JOS%g1#%kj{MW>1wFCWKy)>5r7VV*#QKdQJ!=gg|oC&k# zOLv^%vtZGAO8joUTq}E`9b4jFv@NfN{ZxSHrC9ssod0QV`0_f z6+OeUMey{Rb9uXzq)3BM_~Rib*&2M=H~jr|>Z8e`AQuxC)raee7sBy=d)7kXCok^V zy_S43nIIJIdL~@FSFg6tpfaxC=tr1cnZQ^|*^-;3SI@Y=TIof#ytr2X=vM1jV8d6{ zX18&3ha}k`+6yHUk`e^$BQ&EP$F@mjR=iQsH=drT$pD27B1DFZjcu%}ilEjDp$Av9xre4720)`w@sfioVhUdY4sldO1vPh2m!%Ek>az$;{`p7Hns#XK=NGFVv>P zUgZJpJ#OO5Op#?yWojejC|Xd|ga2ojL~YXzQcTU3TQcCil47@I;(LRF=+cZ1n>x-Q z-G7Cqb?4099XFR3;#c@x_6)={_6)K=kS>4fv_(45Sm5Exg~X*=bdCcP?WAUU^T%>>Y>*s{MN!IJqkQXiL}gZ z&|bJP(PpLZC2b8@z?{qv4yfqN1Ky-kBl_wZsqbHN6^stb8z`;IS%=xx7qSy@H_*a> zev|!qJca@&>4HtvcVL$_*8B~jMMUj?*paeY=+FK_#gVgO_$0}!7>x|?oRTgvzt#Nv zMdC36Z#hv-H*%rLn(r5ag>x46Gn9zV&A6$scX~Hj^q&SUH>liWess5<#??kd`PJE# z?8B5-((II1+{2WYNaYJUs0{E^mF0sH9gD-S21!hPrOP(Tkmb`~A!lw@Y6dKbF4HN! zx{C0sS2_P$6w^fF4z&QmQ#ukOwql5o6BY}$rHPlArEkOw)3kT1ujdhVS7&s=VXna~ z8Cj*CmS5Io?jk$e!;9VcyVnP=uTKO-4rEwH>W8FjwSB#X4{#}PP)$QjysuVPdQbo0 z5#cGK(T1|yluV9yb49Oq;4?FJnF&HR2GsG*i?KP$^j`63_j^ih4L+0mL$AA_)_}Hq zylBFeH1;>^2;Zr1OSTy*bMuETmHX3MPE!@u5oM&i1f|*izR@J<1*@~ufm0!^PX3o} zegN=BY-ltZwvkG>@5%2DVO&wG7gJMStVkd=rjgJuRu;hL368kCHpetihd44{glAgbt?3z$C4CB?L|i#;3c0`;Nh=bGqOpoF1k>P*bB z-B-5upRXy#d!~flt}m_~Kp*Tt65lpVf_JH*s{v91kx+VFKlCft!tUL0nfhsRU3(n+Nn#nEMezYu9Gh(O?pIJs1 zhC75t>rWFcFN7;wVy{!2UxZ(oe(Fg5kYGeRKfJVjoB?I!y^2BegJJ^8NDbmv^s*&)g%x!%k* zJD9DXGNSsG@t57v^-_ruKeKx7jvdW>i2A-&I~TMH=nJ=Tt(I-}Xk_0{g+ouxWJMdh z5r=a64=ijWR>L>6gR`LN@G zNH=c7LdZ@c@lY+eWM=8}k5sMqW8Z1wme&V7h+hoO*8DTM`lL?2p|uOpN|C#Y2^uO^ zxwPjC4I4aXG;w+|ewa~4mL~^HY z{`Nn)v<4xl)j?zb`bwj{*^CCD)hp%7>YF@Dqpj80Uvt;gZJK)5ewKtEbMFgei_$+L zho^pLQ=(=q&o6uYbX-#hHZ*1C?N;UC9JkcXSgqz}c(woNR3A_KW6fq?Gb_+a){Ep*=k!ql1j27BkMfFcIx@AO)czoahJYl zm?lP9rXYRbG>+y1EsF!EexcFX0Aol23ajh#4u&e5=LJfRx2G& z9UTf&gOd?x`_gaToGlFY)tNQSfaeapxT`Mar!80PI?tuvQHtzTWk zC_L<*QfTzAl3KwR!rm~V!NtKJxv&`1_tfVy3VA`Qgq5bw}_bbRPsIgNoj2c);L)?I6&kj>_V^BxiN| z7TCm_gNeFRu!-lZHm-cwHF?lliOYGc*w>wYRe=XfYfdU3>e}`*s;>=h#0;LqIjb(< zq>Ou-=N1WyKOayhBgf_68oX~fcX#o17=L}!o-JI@@L-_}9Zx@7HXl#{2yuAZg}HlP zVL)pb4C2`eZXcobgz&;>-sWZlVWQ$97AcMCKo7SH02NJO+ zp|ztmVDitep3CX$fqbcKBZ>#0w7h=afclU3{ujt8UlJgdt%xa?#hFvJ&crPVipnd(sZ%PizlK54f4v z%(v+s|7`7dYNg{e4J}YM?8l%#L8_b311LiJ!c*+xhph%0Lc6fMR${2-e5SmA`DeyU z;>ZIXXHY_NMEsq0BX>;eOQ@x9*13g?Ghq_5VErxmCo$%Qo&iKhd&>Nt(`rl3)OOEs z{O+?S;Vqz(ipJ#cu}yjMRzx_0nC;Ny>lsu%; z>cbpis)h!AZkaU&dxi` zrsRcC1Lr=ns&S9y+lSHSqnN-)%mvDMe-zzT__bCTzS!)x*jsK@d4vKP>=btQQhz?(01dud1Ow8^De z0M9ftHYuxrx&Cb^02Tgza8o|mwoy%p9+t3fna>6&iDrG-VHw3wA*ZMvS^D>$B(p~e zMskDn zz9`{j{jKDC7NY+?yKNg@y2yVUk&al}qcAt9SKZU6OR16FfL7OkQE$UP!RUaUROTQ0 zWSD}e@djA?5q7^3@#F(y^~KAAaht;$YaqH=Hh^7xEwx%;<&rw)WBy#I{Az+Ft-7vz zCM0FDG+cmv&Sn~$b=DhUwBKxk1#-V(xn}WPbpsAQc87ZmU>x?nT-B=^1`Y*Z7RfTR z4L3R*TR3cWKm1cv_(TvGhGl%v2})1Ao4rnpD^EuBDlWjki*vga=Yf&m#fhUK>VFZH ztq%}ad;tV+?Ynzo=H&tFHltVrT8TSQhm2cAl?a@a?>lvykB7NN3LJvUc@HF-iu=^IZ?s!2`xG?DQ97b`*&iXK9W4FxR0sgoq z=Bh0+ObCjrPRhf27`1p?jSDp6KZc0pq^HzZ20vNeOSwH?Wa)HY8)#2-Y(+{g%x@kE z|JgajSj2SJA{O50lLavOdg>Ek41ZeqL1Eh_Yo-E_byrPJF$vLIll!C z`FZXVjDALjn+)79F1G?iv6$QU!7ooSSxjRGHbG_)!^M|6w$8{b5~hbR+qt(k;ZYSw zV^WX@Q^S{F$Wt;%rN+786CX?2tE=Z>z|Et0xC0>3C&{eY`;p9I>9PYC9i8Glw&f4izaGUZiMfHMatUkG9Jb7& zv@F*6XAf|hV<2G&n>uOPM6s7y1TuTAR9FU1#Sxn3Y_l}9h+z+%(@tsxt3~x;yLp`v zkb(cCX{oYQqT;zOXwIMadaNoShsYjMv=?_~AJ0pM9LpW_h2QIeuk6Im>}f@@T&umH zq_ER6+!C$X-wnv;ebAT`_?GzMVD|YfQqt$yJ=G`{U9)isEEmNJtu=z)ii&V{MgsOK zpKxAeZ%Btm1NH=DxE&o)ha8Jj%<^hZ1qLl?2;0kYV~KTfyQ`e`^+gRi5IP(IxO6I= zBc#QOezfHVy!z~rd;k~(Lk?>upTLPpNoEy^bC=I=4I=kx z?eym|iwY*}_~$pUH=$@5!U`A{-Vk|)dVSR!p-CyKQm3Z;4&pJMtT^SC?> z@$i!01*vCcNVDuH08CJZ+twpKvkCdK16e={%E0%%wAjhKfm#}~!mzDQF_DAKb3oA& z&Tw+$0{#4!6*_`YnIN->yu!v$-QpmFD5Sts%#p`h-1jciq;2v{-N5lIE>3l}zQ36# z6{jJOGorX;&y#ks1;CyB(~tw^jt+A7&Tr8rAWOnBi`;e8An1@MMiwb#ToN8@ihXwu z<6iTSDJ!#x&4S>oy9|4fvQ%=fL-sDP7A9^8n-!+aY=TcQOFd@~v~tQptT0V;mTVEo zF6IW-YKGnb=VkXVS-HJV8q86GviFpJEDZ~?t1!}1h8#&GVKE7KuLp>tIMQ<3&TmPx z<#m4Y1fMsBvI}{?5^&qTH*H@ziuLQcP182_{1#S^PGd{(WCHdOheytDAr-cA&To0t36n>&q&V-S;1rNIMMpf8(5)KW0IP7Yz-zPS?W3 zj5zgGtcX)gI)BqPX}UV*HMSJ#KkOKt0z8m5o^1*_#q=y-LZDnl-a#ga2;Pjq8aC5>ZqiYd~Hn+5j9q)1Bzbt4yK7NKtML0ln24zU~8 zNEYEq2!w3YXKcy|+=A0GaQ3V#?ZEdGb92)lt-5dL$COTCI`hg3#DjkcoY)kg+FFV8 z(~PZh-YFujg4AKy12kNQ=Na~RlAss>M^FY!`vGpIoRnES=Q+ErFzb94#ks#0aEgg? z4n8C~$}G|+SC>hTPBD8SzBFch^>Zlf+HU>Yo@!E53UGvZ1kL3o@iID`^X4W`nHgv- zfg6R*T;{D^ZhUfcc&OMGEX>4R zm){OphI9EwO@GyT)L80V)z2%k{*?WN0Lc?25Y@pzTJe$;G&vGHNBedgQ$PHbdSb*S zB|LxU#-iohP$#R{e@tnAJz`FKF6r_Q9rpY};T9B>=tH@00jx@7z*uYMj0SMK@c`5q zc_Jd~uS{l%jAluYMnayy{ z2+Td+!}dKpTG!d@vbETv&jqg{qDq}nD{8H z&dYsws%k5El6kxuSvQE-_JUB3L2H;b-92OneRieudGrl6_+Jx2i6&HN3u$a@d z(U*3B(&=i;Min=S7mhbpzwWcPktMazG_kfTH1TJ!vG7WqNC#bbilb-7GG#AqXPpRg z4spp$9d+uzzvM7L2W<>^zH5z@5%W%t{BbCSG%qb5B3ym2)zB0Fl!(5zj~*W@ZCO^5 zoo5_J3+LQRJDiEo?IlXwNYgStk&m5Xq^Y1(L&h>&pN?!jsOPp2)tp4|VxHz#!unHJ zQ;M6v7X)q9X5jryedCg1D#zF1|MjXK=`NTx z9@_}Iu|5ugT+PuJYmomV+{fuvvgbox0(Q;9N>^G(i^D1vMtQ!O_8zUnS9qy@^#W&< zv|h3Zugu+hmAj|;W}5KXtJ-4B$zjY1;}IFELTO+6tTG7|;=&0}9K&)g!=@o+9BlcW zqJz5ia1m~G>F$NWx~kJTI3<%X&4|tn#Fg!jb0$mn ztq-+SGCzEIDU0%Av56y&Tj+c_$K@h*sxoZ8iG)%r?!Vt8P{7I6lC;Vfih$ty0K;*N z){@@*&ZP8*&QmL;eeP?@zFGwld0vn9|(&Zc-NL3(Q5Y1=w=@>_BdIEc_*@3|734Dp=4BoPFSnU z9E@FSD^>vn10Y5}eMck|tLFCNBec=RBE7yN4qJ641Uh7W66*_nPg2aYf)S=fdNH7b z4BKfz)W*un8>jWK&5>k>;^(TPR`HbR*XHsEpji1&mq~$sOW_mHnYw&@57P1#c9X!N zx=!ka$t+t?fM2(-b=6P#%r1`uPe>!Py0l1p!^u0gLE8JRzxQpq-{PiGzRzPGGz9Bz zIal!8azCrw6K^tDn}o8-*OeNB`g`do^6)Et4$_9pl`?Mp{|p@FLv;4Q1l9^LV?lq@ zYN_#lo4ug(I>sFcjkJNQv^~Cct;NJ|D7v}k*)3e2PvxfL$&|r`_Ncpe$Y;eeryuZ} z`NnA!@T780dS5Ntz@2QmS}^gesSo1F64jmJJ$eOtI7MLTh}1riK!Jb zm}<;`CNgOT)$hYGMLSdlx5X2YN(gj+ISI5tx7`32E@>=C1UjZQyPqE7S4RoeS_Un{ z!zdG9;}{6t=S+hvM%&%{>~LtuA*}do%W#w*SQNUKu;&gjps{mN(2{`ay&Lu7)p5_- z-o4HvBZ3E1WT6161JR3opK~iGI+#-CH&;ScX3w%dP9pNIX3)uz$i|@h4m!in{o+Ej za-g&KoE{~8t#ztH>+NpP&WF98G1`<@ctr4)7g(Dvw_wp$;A}jU-w^de+9NWZiB+OJ zQu2D&h0uJRPhA2oHR$ht7O*oK>brdiI~2GGHq?kGnMf&k`TsqB_7ZmNZCmgfJe&{} za-S7ke0`ulKg8&`=ey^w@mXnG0~irmcSfBNyo=5Sg*}w?c${a!rvKW&*0tSbt>XB% zz3vhu8qR4~t{lDZ_0uhIugiU5ZOlRR@#=#|RPQ*NmfUgQE0RUv-BtU2|G`HYw9QD; z>;Eq2_-G^OTy@~aFgfflQR59Q@o>;Zw`uqHr1=K(9{y@nH0dem&7Dir7?mITq2UHi ztFd*`ki)8XR$+$*)5{=C-!EEtvVnY?La=a?g67V>8ctG8X@~n_~CdP1I}iqij(X{Z3af5Gz4snH-I@Tr!&iy zaj6>N9#(Sy0ir3V9GF-CpP4-K&#|F>HJe zk{5`vn}Zx-d{=<@Z>MG6Gp3jD#`(cy;+zXQ|~rzwCy8 zR}V8_h>HV7TI{zoo4aLJ!BbP(gA@wM@t#MbT=O4{?@qgZ@Aq3}~p8eDp z!`<>18N_n8j(p_A06IC@8*T!$$B~0o#PXTMUhG_a|ZOU?G zJ|LoLrEwI1C6AFO)rlGzH*?^=OE_$@()!pz{aW!-qYomZfBg^X@Rb?7D7k0fD5E7 zoUY3}UD`4=s0>2x@+oe~HI4)CON+$hHQ*v`JI~Zpv~sjB?UWm90q%Hnvqc%iOd*yw<`9j0(9r*V|-$aEn6*kr?9hH+*pM-QR82)SzU?+ z`ihr+@ucVPF;J1m^y>JSZ|?4L&y#y$*!)T)!+Cvr>UMcm|Jeg+4XU!x2Z2>v>4st0 z8|w&MED&{%5t3zs)7y`n7kH}{|Xc-*!%Mj3>A)cc+}|?`{x3ee8MI z9rg=V{T1#YjB*`_E2mrZU&0Pn+Lw@)N9%j4;?TYVx-@t1`DJXvVNsIwVYOCP;3>`v z@Ot^!o)ou+D7JR`vp5QJ!?t_cl)mJ!Jl%w^xksfftk-VLETb62rdp%MWT({Xtk8vS zg5w9hvuerSHZ$Ud>=X8AU8bu)_AXTlvTn(FQJt(aIB|4pN_jf-5z|#})&qXiz~%ut zmZkI6^=)vpDr5WomU*{w9&Fy3M#$fil3n_AsIbOyEG_s9E5v&s8YBF1e=b|!q%|MG zp1@hm09nG^CdSVDwRsIro%pp}Zozgh@HCF}ap(_+wtaR-P5;kb;r?Tg^3FFc>$d`P@Fby2i-QEQ|)!JMP!X2)*=>rn# zC}d7J>v(rnu}ju$tN6q>z}%$%%^EX?k-}>d2ePYwV~V5bi%yOWEc%NPdawCzcjM1u2JA`yKY5 zavWnvGpN1M8fnfcnCAxckfFBGM{S+KEmIqdjJR}?FZMhcy$&OuGF@nJjwAO8q#cH^ zBx)8!hz-V#R@3Vx(!0Pp&4?cwIMH0mgx++uALruQp&mE9%XQmNPA}>`$CJ_Jh zfbzev&xsc+&;Y|=5pfv%K=S}%R#l#SWY>*nrI6W&vW0fTsfkv)3?}L6O()k7oG!CT z+upUF=z4uH_Mmh7drU@*-wabcZTIZcf8Ry-&M0Ra51tMj{Lt37QTJ0E;rHv##rmJm z8Uim-p3}lk=3y0jU#z2hoG$CjhWHfA@GrEBwr7B*(W!T~Fydnu{CDl%ALK0wZHB){ z)*-F$rrp^LH#Wgi>vY=s9+jMyWQG1#??Xn_zE{Cp=&o`2UKS8wKwsE9MKE7 zUdx{-Yh^-z4IyV#bcN!O)B87b_Xqx_9OCuIl=}{Y~9}igGs>hQE&lTvI%GE;Zm6 zEOH~@JND@}Q=uXG=TWHGsO`nwwV>poLw;rW{_W_mRm1);Ct96!tciVl?80w>t^M_4 z&nGz1g5bX^wHmw|jvh}8|1e(Q8~oyybq%A2v^LY^u?HjgqXMz?6I#9i>*Ewz@5rrJ z-HJa^g4#um@6s?oHtJS)49F?%t;UG0ft^PKDItju=XX!Vi$tQ^#-)Wt!&H{u3E7ZH zA74snH{r^yWKn$^`t;fd-;yAiA1Jn@uD;2AyIM~rldKyLbQ#qedIx9sTbKP!b2a=Z z@WKe)@>A!KRtk68)mr-=6)b6YAWnbV{+pw3)n_JHCg1m$hNJvPxPiMCtoMM!?R6>Wm zWBnHfIWGCBE7*@2j84IYro49yGZ-Bk-^EdXyW7s{?_c;w5`8&g6xMN^YOMCxp^TWg z#1%GswQ+9bliKQlY)q9#UEmku*SEIwxxcM$PCbEz`(%oK5JcL`wN?G`i8?fi}?Y!XdjPGsXwNja-lM*iyPFgvYreG!?_5!B$ zd-AzF_DR6rrd&K(LvDsa;%;j`)+(Bp}wWR7TnCo)E(qLJ_=|{&p_8CSo+8BWu_fACDLEV(LwO z0x9j^`F!x5wXF0kR!sa|?@s)PfdaaZVw3gCpo`{|Y|@7`SD5}m=?K54ex~(xD2Ube z5t6s|a+!Rr*8inbnp6cyqP6XsUpTDgXQLn0KTd6EYYX`FumI;%ZJ)ofUr#VqJF(I> z_9Bq&eV3k{F#3BaZgFt&!LO|E)sW{!^jw;4Ch_!>#fb|l;D=yKM|8--1CD^f)O3P* z?BQfypXYgs%}D|Zz103;@WGt&>W3GV=iXs^2Q#DA>R;bz&UN~m-7D|VdZrxxmKHmL5>CbJ4hc^MT+-=h&Y2WjUPc5B zniv{r!V+DFlI2VCYwnZZaQ#&Y=T@AQkthqV4`t2A!cPPrtlLTYL|hH<)PZsq7`?f% zHxq+KgK1J)(v^QNRXt9l510qTC_QgBnaWd#DxMc&=uDNL(ZRi1wRY-EYj}Hh+1E-kOPv~O+ ztS`ZnHyuECpGhS*&w97v1;7xq-8p3hem@3&+01>{DRjD4V+0d78;!QLzog|T9fTX4 zbe!@f@UI$dm?VVVY$x{5{BD#5Xz8L$O7yI!m%Ef&O;)YCPpS`LOlpH3aU$YO&i&QW zFR(E6;8c-wq?$=vvM^S>+Ic3TI^-x>rs$(*C0KqT^TC!?AS{QeWyBJ1=Cl_pd*fd; z(^f8_-xXpkU{K_JPp9P8!IU=XS9!|$PX#WM?T~esqTTJ$b0al@&-`h7*S!?909%Dk zvx~binSx5#Z)5sLOVVB6joEB6A-)|GTCREJTbP1HEl59&OS*dfT!k}lN_#(Y>Rq-5 zEiR^2i$Reqke*u}G%k$6*9pjKZs{?@yzW<~mjqjU)4Lrx{UpqI z@50X@dJ*sblqd5r=Jo|aI~wQ86J{nuLd%2qszE-SWYr)dZx-7j1~s=)x(wf@w~unF z!V_imlnSs=;Ik(+(qJWei4As(0 z^bFbQiyI;joL&2dG!Q!|cyEetqgRj5nglJ>Lf5WVE``}B^h2sd+C42p9>~9?JwlXMSwVow%ec#^sJeL$Xcz9y`w1Tg?oG+z!GBLyKjgx}* zyN*EH@#yQ@)N^6|dfep=lkyPr0GYm)b;nl-HPU?DR9#!i`6RI)IV&pvAnTkLwiz$V z=T3`EJXM27L-qP+{)JG1^E43gdSl*?{%y~Dq0p7fIcvJvvkwAK?~nT*;Pw zRrn{f*@T0MW?L$!qRya^aDFX2bv1UbTkv)*2VFzj$aWsep{$kH(6hb-x`GJ4uUGl` z0~#I&lf7%`DXRsDwaJA{)M(y~aK*8#VYJTIerPh6U8~c{GbCeaGVJWOs=>>BVycoN zOX*?Yv5#9}-@m-(-6>GpK0*^1N^A3X3IJ~y&UAjL*sX$#Ab(=A1%^Ly3o#BOd>qxT zCSqsH(K35yapK&>yW3VfFaJbDYK2*^;o=(EQjxKr;3}?_Ax>t)?%!Zzg5(aTpLnk1 z&m~T&MGCkOAhOP%pe(Y-e-=JmbZ-v5g0P;Acu&=E`sS&RhcLGzV!%#*nK6}3Wy@xY z`cKy@x|Mz$eZDuv;`GG1hwQki;w^=_r~2JbibP97xdKvggHjD=pwV{F0*!3N6%&mSHb zN_}-e`d*w7+Vh6yN?pRp*r`%@7hf7g1WwF$$--W&~@fZc3iXhc2IaX z?-Gy5uZm+OO3ZFQLeZ@$-GI#$l#1F_FrCRzU~>BzuG3)QRdJ4Xj__DpIuVV4p+hR= zg;OcR^|HP5A+*_7j%_&IdtZwTP(xfjQ=5)M(2Mfl;z*E77qo@bQT$f@6V$i`8Z7b? znCc8o1&lPiIyH3R4&tC-8%^t%6d$D~b^hJdhmkF-#vP#!S3+lQ_F{17w|&|q`e_*} zLqDt&t*da9}hj2p2>{Fpi=kZF$kOKLb=lP#i@^xNOpO}Bd%2Wx(;Lf}J-X&_q zW;- zAaZ8m+%aE8NqzZQfdm@)B#W)L*qW~SlUQ$02db8mZzLb=5LjU$_5Pn-P6eE6i(dEt za!{f9B-mb1{Nhq`jQW_e^D`S&1lj{vJ}g=jy0Z=z?b~Zvy&W13D{@r{8#cO#TbdEO zs-Ny3(28yIcpg#|>j+%#wTtcn9w6w+LuU?T4a|{OJl}^fr?Z=RGhzBxVmm@b5>}TS zchIfg{=P@tp08$eeZg&G7_eE-izu`iIV!l=#rwiIN9OMIuhw;sQj5&iyAPMz*S=@8 z+8@EAN1H33(xweolnFa%Dk$9CvBAuJ{v9VsPPDu#=}zQp|Fxdi=GdfPTU8X*UCRA| zjREERFvlm+w4+5x4E!-s~_Z)Qj*A@~eZ$SC_f_t>Zb9(W~!*aH`9$!`y=h z?8N^pAw9P)i@83BF9*T+Oq?9 z4M8spjjjd!{_(A1tDRx}v(3G&``@Gr4U-kKzav0veZnzsMwAc-5u!r{zChYs8 z1~o00|Nh-(f^hTE4l3H0SjIGJ5Z+!H+CJ0z(wO@_rOO}tyTbSJoIy1sK}%f5d#t{j z-#y=b)w+)&Kr?UyLUHy%B^C`?)9jJH@BklWU!1L3g6{_K+|M1sdfya^hC4LiKDl{6 zWVCMKP;8_X{YTEi;F(1?@JA@?QzNhv?*qw(!i>4o{@I_}n=(RzRqSl(yXcj$s&eyGr>HU2M^&;eG_R`ZyA8mw+EdB*RT`kb<* z?kEHf$gd4OZKF9A%4geRn{9J;2l6evKj$`D!trX8EI|IX@B@xS^0T(1f6*x;`zVd7 z@oa|F&GaJj22>O zNfy7j906qC@N{^^80!YomgnLHGCW)OO@YIt1UKI_U(J;c9YxWsCs4~%feIU*x!ab_ z1ylb*OLSD@w@Y;-ZxtmSp6+IQrGW?Y569$4Ukc9ITQ?4&@9Je9@}t{qiFQ2UYm=|$)*-g~uMkR~$|0^@7k{-ClZ zFL?0FRf=B41Ft8rt_q@(;mdF30?!DvT{I>mZ zj1rw_(TOB#)QH}q6D3MQ^bn%AsG~-rM2!+e??j8Ywxw*Yp>_o&wAE9S4N0Npn}AFjFn|BgAOQ8Uuvd1y>L)g>s%w^U4pu*^7L?=A6)Na`05D}^~a#~onJZ9Dl&DfhQ zE&?AU7HaP4rfcqnZCwqI_&_R2q9qF~u?$nhMZS92+-_CcihBQeasQT^d5aSMV_s)t zmAUKwi_q&C)e)gPNzU!%xu?@Uvp9^qKaM2Ge;H>k6hpnvx!KXx*Pg~T=!gNZgG|iM zhrIXxIun)dk;c;!jjbH#pF_6o>;{@0_Z-@#vo+joNG)G0n zqeH-$meST6>!apaSPH~5VWC zsDO4;1nP@DX^Oj)SGV-kDg5ZcSuM87F(Kwx<2_s=kwsqsHxOO^Hngc`-y5j7!5~8a z+k33ONN()x5P5R`%y#s{?zvRftB#9rTLP{rMNZ#$&8#+iV%1jcp}F7R?^2h+xUQ4l z_Ob|*mRf2zEYd8B*h}qCi47#z6&g`jmTjMD{j9_J@%m?Lkq@i71Z2O#6-eKI=u z?lWJ^-||_=(nr8IlKxUc<^Z$;{4EyuSQ{m(U>t$ zu=0su!VkgSh{4*zLE@9Ls=~pyD_U2j-GWrjCZ_w-BR4FtH{^4Cie2J+MiCBC=z57a z-_p{;)6Bl7tL8fOl%x%<#qdN}q8>Ii{b)>W#Be(J$M3j{dw65br=85WH9m0B`+H|p z3NWQ`nchCQz{*JD1RrGifp7dJjV<90%yy;s*@YC_5uYl$1?mD(Z4NkV_|#;Z{7}-* zFpGWpgI_eNWm|ZKf8SRJR{7QK#X?L1Z2x}XrTk@0NTYugnknJjQfm8Ypy5LijkW7x z+gOJtr{D$OV_;099Bewzx98f_tuo)WhP%bKX7+|rtJysqvBpD|CX(TCd3-i>e06M+ z){V56-byU_!&c#x@)h~T&CcJ*W*fzr7E(Uua}wtGT=GE2M2_n6rQ6EIc}AB;=eB$5 zoW}wK8r20aeZ1^XN-N@d-Ig=y9LMgJt_*s24)RG$PWO7%cBDS@?)WQ0ur3~jQtxYZ zZoe4X_}J^7vrE|C}Bg-J(jr|oV;SAJBU0Z(zhwt z`T^XD%4zL%O7l`3{!`Mo&#O_|0SB2bP%C?OS1B&rtaA^cPIjU*@kQVJxMQi-kc?8U;l4zamv5mS z679WRfxzL7Y^p5%lj~SvMD5tp{C=#SKA*?a)$7upubsAM7{Bw4a+@Q2IEk)|N&PO> z?lPAMJ(W`h;kI?grr#UH^arYCf?W|Q=S(AgllkzIKj{!2X^A{LQaw1?c?Mp==5^#A zaqiP=FYH3b77selImmdl(FyE(jNR;zn5R)gA1sI0u2p_$g{`_F#)zV57j5*&J@&oh zw;vpv2X0Op-U;TW=f&=tncIE8K<_!=gbo`kaT0JTBNSCIP7uO!h z1|p03X^IT?H*VX3d|o5fnR~#WR(3doP@scN{m+A{qsyQV*KNax!{r~K{U=K2>n3{U zXZpQ7to)lWE*MYAF1lss*-P-qX;baqZC#5_ql=H38^=8w6SIy1UV!(uCAu^}HMFju zD(m}d*cHy)-z17K>7jseA?pl}MQS=h!eXA9@y}wY+noC*o?omHG%yMK{{fO_eo2OY zF&McBd`nj7Tj8hebM}O#($bS+E^l`Qba6_WhIK-^f4`-=$tpMs{to84YH--pAh&-A z-=FmF{b%}(@VAo_7_LOcc&F=YpPlke zNt)+T+`2LSF|3%h>GQ69SSA!ui>M@EfdvWe+|p7} z+n}gM9rd^`^}YjnJWjj$ar0=Jo8K#V!s|dx#VnOs?x1qw8cigkS!8WSlb-x770)oM z7-b`W>C_(`)AX`vnWQ`Y%Z^}KqkVA+eNJHHxf6YsnLFKXaVBE_#^JN4`X(9}xfEl! zPuR*36{uxG;^1y5CffKo#p%xp^^s|3Yd$m0c7fHI)5gv*1qEZ;)ke_SxsBa`%Lb)< z!_Rqim-VLq9Q<3&!R?_f1WhC(=^Sk=(Hk!X=Xx*vjWVGHW3~51)4iI)9x^X8D9hzj zzYQQ)>~RoZ#QSOWbXQw{l*Lq?&%u zRvxzV`RUJD%c-ev&&r!f_DYbL<1x+v?=})*h04xnsmd=Cd=xf}*CjuJe3#A(uIQg)A;m3be6cOgG#MigMGk+?3gGp?fSK9R{X zZNZ`lXs`FxeZ7J~{;F`n$exmkn+j=W#SxzLORrN}@_?tBCrX3Ajd*XI?rj!Si+90v z)f)OoGI^G#SvFN@)AQi%=(HRE2huzNn;GZN^*;tSui}Mnmc2$D9Mh)U?sv9H0!1?B zW_;M6i?L1jYmdo{c+UV1o&-#I=tC>EjFtVA0t%H+tYi12=0arnu`+}yGB#szYkP}2 zW#Udbd_|(>mpy8z`WJuwCM8}@H3U^?Bb`|GDQ-Yg{(QfN#Y6^&BQmaYma9f)l6L#N zhu400fK#7|usK)iHy3)#7+$Kt7wRKCg804A(~}Mj%6)C2Q~5WwGc7#)tTxvQ&)MC_(2mcmiwA^6^bQjxjVh|9sVD&Gr>_?eHA=1Q$_aI|EvMchsc z=@xSQ>yg&k^NgdB<)%ZQC#CWh6Vah*>)jnUmU)+5NUiaX7Jj; zjf4|WY6xLrD(iYyVclp8B)u?G!~S^B8U=Z!n7{5gI;pA;9uwtsBw^%-Uo`Rg%lg*C z&@VgqXS-SF{9`Rv8Y8cfp<1&abKrAKW}o@>5}4{)3Dx)fJbbKPr}EYVczA561$g8p z!e&AyD4Tx4X&7B zVH=TG4doLj2A0HA@G3=NXf;jvIg;S~m(1SmQm%hM$}Whqm)suYvt{`;R}l zT9)t12$?zDjAXRA_jh zo}Z310PSntM4!A%X_0&7vVj$5n@LEq7|6X(Q(k-&ju`I!$5k1 z*GH%JN_mceQa)OiaC)T`!o@OpP-!gHEtCOrvLpPa;kc`~187xCSyBCnX*$PhVXEX>qE zYgBr`#I<8sIip86FWjS#RDyV8%xl(v=RDF*&9d~_r9NcE%3q`8U9HJ0 zU4bXu8GQE)0?q}@b}5om&IEzie-b7*O=yX`r<4vX3#7w5 zf4__qt!b#ffT6O8Hf1J|-_MoSeG1|$WY1yi`4iXyh}{OXxYHYjtLK%&607R{Vs4%R z+vn=`SpAX1FTNf;m^~Qx*q#o5YXd%z*nZMr{bE({viirU(?xgWWez>xbrhrfA8E_v zK*Q+GVStbXvYKwhKS8|@lwIbyF~f#Rvy=47*59OcL=D1dB(5V?)K)$4#oQgjt`rjJ z`Jj7x2_mL`SJpmWs_kxl1DR3{dx1?YmG`aSdh1Rl{(eoSm*QCrYzXww zV96-Sz3%X23vYEY>-}BmKJvA@BR+9Nxlw8{G(!ll+kIeFTWQOPtAioc<(ld2xJfT`wA9@(H1r z3wo!Ua5=oXz-=!He>_op9l9j_utoi+ow^TDd|eX3b#o?s%H@Ij5#M-3*3{WIJ*y~= z=iL;BgQR(Ho7z&SR0=M*Sp0R*Jx-r{YE@%{lpYrO`xzT;>EiFY3HSRzL8(#o#-kDy zR~RJt z^o<4>NnqY6TnH)5x2et-8k?>9gf)B&a4ThHa6X0~R-cW2Z+bcEJm>Vb)c*4&TPkxw z1AoQQF#C5@8NP?va=N9N37fImt2&$2nJMp+qJe|y9#v7plx=#cvND>tcKOag#L@mN z*YvtFgz?geOv6S#epvVE^>#WiNhE{q$F^VdV{h?FyAtx9aP5Mj`XJlRUav3~u)>kW z`>YxKcM2yTEl3?t1A*;LmUa5iv$&%xArBiOPlhMXrML5XmxQe{J-judM@cFz&A%@Y zI=fz0zYa$IY{2_?m3`T}ONIFU6}emg(?h}0b^LQ(9lMeJ=K}`AM_xVD{TX`?o7}Cx zEu<1GX{v78+D8{vY;C#cG!t+A*z8^_v;GngwC?nPcV!;yn?$nsLGelVc$KQFe{?mx ze(0h$d({L`ATCQx;v*I=YNxW(Hd+!%R!P zvb|>OYitg4Oh-2RrcrRlgBsrk5|T4Mw6ytYHLPKOht?VlpA!~!FtdCY2$K*^w*tc# z8f=zP`&S`SlTfK?7g#&s09MKP>$2?jvw=i%6sEohd;URU@A~RHG-F-s0OmzP0^i<_ zb#dBzdgbrstW{0Pcm|1yL9|dZZhDD{ufqz8MZxN?Zb3C~W!7fQ<=Qkn6yYUC7bBzT zy$>Vo@VfE*q_uYTeNpbL{l=Gt@M_%|$H zlFzSYW~f1!@JldSW1xOF#t1|M`X&fEj81eHdFfU0Tp;f6*^5UW);cEd*GnMzs^ON?a$r%U@QEeJ`?gbu0&gcU3 zri=~&U>bBg97pC5*b%G4y?q`GBMewVeqtsBGs+BpKLEy z#}tiAMyKXLCGjx4@($G5BDiPh$w&jSzyWF#^>hIOs%P zdcJ{QW3JORfT*K6`>gvs>KdA!ZN50vgeeZn;tVb?R!)mwxQpxj7lX+ZOlP*e>b2^A|FcZ+PFEAlkF1 zTD@SSWS4PJD}+DZk8%@#U>cI>3HKsw9#T`}{>!E)A zMMFeW_VxoA{pQTBTiS{O5pAOg%9oNF?0(bm8C z{R*f7zt#Z?e^FgHDL4oq*sCWcIk5KhnggdUz9sre|Gmjm;!py!S?>M`fN*b7s1d@H z4HXe>?7a@8c}s=52}6}-czTy*1~1kF+d4Z#Iw9~~RVR3O_YBCxWyIgVt>DErWw5S` zJwrNX!V-@tUSS7Mitc%xSMf-7prmM{yBD80BIALqWDq#X!eEnFo+#u>Bb(6ypvsS} zw5#S(JmJJ}cq8R77z@J}&DaWQSa+MCQC?iAYp|*>vIzt_YXx%3FdxWus1bRdAsIMQ z4fTiu!4t%hx@JgXQY49iGZX^c)hu;(VR55OC?@Lr7V1Mfi!I*4%a1jl zJcl%ht2f7b8Ej}?Aq)M)aZ8Z99~IPT?x1*~(Z-O1g~-N7{C*G~;+V}G_34=?iRKK% zhFt)L=blZ17_lY;q{%XT48q>RRUIYe;U|a*3IhT|aq;R&iAYYWVe%=MNpyCb@HQZm z!MRke^T;UFBxD+Z!leeC?$zL4ICuIZlY8BVVV+fTuYEzC`};uDB@oXu*RIO>eM3Eb zL0Hn@=by=;{eEa$+k+p1EdYP{woVB0BxmD{h&lYwX^(Md?hj}YCek`H51mL}0JV%f zw3rQf{)f)5FPbfVA%Iy8uS#fg!iN4NnX3u0ADr1H0mKc@SnkNl42HV(dx3}#WDYR~ z^qK_uZ+uZeTe|F>6XLynAMXy6#23%_ASmD&@!rDw8BX>LFn7p_iUCNZ+?Z{jnIN6(HY>DWy%}!qTMpeq906p!ZqIf%|lo7R`9L;4O z0BqWMJ~+s>V0i{niee52(Q4nkt953<^$dC>N~9U=-tLD#FZ2t44@0?KGzGWrjnc!X z*%W)=acLT+2nL+q_6L1It4r9T_|;34qQpINB-Mfr*iAS{=Eg?s@pWKB1SsaA&^U+ecdN)fz1qLOQ%B zDkjG`toCD+6PXDa@qR$B%AMTQes7=27g*mu`HYIC8{p#iv33cv{FR&%PYO{uCUVYo<-fyX0ZyIvE@-HSI%IIuE zB1s^fGDKyb-$BI7x;|=pu<#?dJPGFbD@e$JuU4#-48(TsJq_FW@=Q0|H#2yL=ylF9 z$34X4FcZ+5nHB6@$8*x)N#)PRm5BrWcyk2=KK3NrfMzb^yg}cv8lSyf$$r! zP;iAV@i5d`w!(K~s7YqncMxo%#odKPRm1Awozv|B5fI)buG*ytZGW0TJsxKqE^Qo+ zSR5XXHulETtx`G4E?I_0viA*GaK>2x)hu|&*%)8j{e;*4Z^8n$4;hXC86JKdHnmFd zv%VmnzF?8kT)LFz67;10rG&>hk`f4+m@_2Qok_W!CO zB6kNt^M6+0(Jxtod^ubzIg&LwOv+#%nmdGQrT_PN$25!s_-JD&nnUlhB8oV?S7ZR! zI1E+uU`myc+mOo87lOrsg&4Yv@boT%=^fHG5#J${=UsX?+%;1TclEe6&;PR3|Cp%@ z`n#mvzk}d@m+dTI-rC!Bidl~dVMZtf? zlvd_D=2sfy4rX5eD^^=h;;n!FWhZCVL6%w=;+F z4-~o;nX}~InMvKDy*tJonvmRO5Uh8tJINh{hzplH;3uV2B*D*d-@(i8E{tFZ zz5}1&p?4Af>H+EvNCq7L_tg9of|dU={(pzy4UW6y;=7B$d>29H4#La3j1_hl1T)_S z+Oc;TSjb(AOLm7)=%;sB-o=AEdPox8vFd?$p?Lt=9exsU?+yafUrYEOK^J^iV7Q^b zLtM1U9SWx2Wj|oNI~0_;Q}eqZjp?pE0`px8GT+rB@Gf+Wz00g_Nbb<%wq)G@je*zX zcT6Hf$Q`~Gc-NH3;NCH~%w19m-DSFW#(b^2oH^@X-DByd8YzAF%EV*-Jk{!6aN)DM z#PRR-6Vz|#$64`J@0q;qUnA|p4YyJo)9KXMcp~)P`hef-$)iNBiemk-_eoPf^}`^rsb3(jym{5;ynfcP>$FStF<>cApKg%}n*V+pX}?O~r`pn~Mv$<47uandnA!MiWo{jzDduybXJ`Y5 z2N}SvUDKTO7pW*V1Ll(;-F8|QZ;ZcX-1~Qo@&1nSx!m9B!_@V6jKltxvBlpp4#569 zeg2;DtG{JT^mmMz|8}C-M43}ap8+ytDZ??v%-Mh8&Ehd&#b8jhb1o5)p|OYYHULAi z>||G;kE5OaR_S5qJtCl^{~vr!7#a-H;nVraG#hw6tRUFLWnojkr|rj(`B7+eOpC*V zNR;Fy276F%P{OUIu1n7jv0ZQtLfogZcEiJU&fk!W<}R61B;aCu8-Y1z^Q%1Aqyj3D^v3*5VW)o5gJKbdOJ|B`NLOjGa#jeH7kY)Zw9u8=-p&Ow*V;@;nE~`=AtJ0n^7}jjTXO9*q z@tS2?J>8Kh*V~%VF~tOj54?oijC#g0>V7+#vg;=3pUXTcPI}q(LcafV#_*T>+YhQe zx+JHupj2~!kya(me%z|8EXge^HRF9?;2=}|asL8f1Fh=h z`AJ@LykGk8&APmYB10gd`;F9$QG=5``1FFffwu)o9f1f~MFtJ)zM0~6VP8LzDxIm= zCGaTQH)*N3fof~{ihk2v+tVI*70l@TT{ zxv5mnUSr5HFRRl=wCcwW$NO(q>ZQDRvlipM?pM%2xf44IUO) zPDB~J({$+i^9DGmCdeK}VF=_;8(oj}Q)X33qVue-xBncoTviiZ!Zb|Uz4#eN^GRE4 zVFptC-Q)3t>;w;vwApP*?j@B4SNFouYNFZ&9Ubb&)h|sZU2MS+UO{O}TscD}lG~-Nr`UqMmV;dI5#cP|GWKHbpT_SS|ZR^qW4fc_#v0 zhz8DmU=>ybgz{sDNttYcQ_IruTs^1Q{&Q9JCpu4J5>29H%I8W^Te=JzvI8-Xk4wf) zdnBG5eO)^WDtmBa!C6h0ZiGQ|zQK~_W@z<8 z$)fvCPLjJ@&lB82LwQ7U{s;(XMzV+IALN(6+Lc!3;@WHGrCvL+B5KQf>Q>M0+*>`J z%{6fNTL;-HF=9}x_}IgwW$0?ubpHD`FO+zZ)_&oIui!7pw624wF81u+`ADoQkIT)HI@$5s?P<7+dLmKKW98dS-xd>XUTu90Z@6VhHF__GfV8P0PI`d|%NqHusJ3t%lsz+B=NU>0BU-X4}G00?^IW}zQ3 zxMM-5E$=hXXdg_QuH_}B-IIkAN-cZ=u#a)OhXwjp3(LUg#w4R{Y~4clwzeLPI^a>HO}<~ zXR4!5f6eT>v9OyPF+TP8xGBG0-k0*+_PC+84(4v!srqO9Ls#~Yc7plcI+&IgDD4x# z9EMpZ+K#{LDMQLRf(f8C0|QM++!rR>#t%i9z8X1wm{enDA?l_6!cX2`#m8JdE+1FE zXVAEpKBYMbdit!K89^jL_I5Vxwi+Hm#qN#?1WJ2vJ)O+g{+>k+c5kr5_-9>byE8JYDQM9}v>{ow76@pqr4~irSX9Vp_rYBbFfb zJaMph&p=!#Kdw@>0wG|ZaIo@ny1y|pYys28TU5Y`ZzC6nYeANv=EWeWv&3Nhvm!d$ zcb_f!S3K`T#gB_Uu5BVmYVu`UjcT#!XBZb9j0V}82V&e3?=}^_st`xb%a^W)cJYcN z(WxLU>Fy(VztKH7pkt~Jb8~8H<8~x|;vrdP)h`@1sonrui%X!*T4^p%$2-P?ddyf; zu%-Mi!j02yj=Jyr+Y5A}nDLF=bS43>;YBvV-1v7I-tel+QZ|^L-9dxPO}mBp8Gb&# zH)Zk7^9}xXHrYil{vu2g%sN;%1D@zTZ062%JW-5d`0|hTfF*`er2ilwxJDLEnmA9G zj`=#Hi-Fu5YYUyDLyB1xOeOQ;21k;F=SFKVB1l&j!a4XYC_xqxD`11g1fUD}Bu43i zWpJW9SQ3P9zPy@ZiP;-`A=8;oD2n?zAO?*SgM}DnwGLuyUzoTSUHO|$*G+@Q@t45+e-}#FonFg$ zPs|Wuu8#h+!XAdDm0T};Ha)s%>;NAzoJ(gU3~L@2fIsx53gFLD={eE==iExab$j_2?PiDV8NS~h&4E_%M32wQzp zKbKPljDEjRoa2Zcrj_V^u#CqFGU_<5;W1i zbs|~o5jtb+Sn=6CUFAEnN;_hbmX2P&I)OCtBEqX5G1fyB3n*Okk_jl!YH@fe0-)~o zzNZ1>oL}`z%Z5ItHW!XqY-k)P5J*i4?a6x+qntc+ zdq14$Ebn?P-gE5|TncBeHPHD~{K(RA=Fhw$>$Ze(Q*@UL$9u;!JKhnI)va>Y?cap# zq14Aeo^bmNuJ_2ysLipeSNJA?K$=tKIi_)cq=E}+#sakF085W*#UHWQHt{l-06Tn4 z82cX@_jtaFbiq>%Co{^}vu3RPXxr`WEbO272bF+QcpK`5KRNxy56n(pvzYcWAPIRS z`sUKOi>~3cpU^`)bcza_mG-B)O|Sx!&~T3?-S9!H`PtQWx ztez2yB>ZCUP916P3o=p^=cLBdwNV3%}Nx<@47CVT$MdmEy(nahwtG|8kz$!7)|tL_p$9t0d_Rn%tXaf z?F+V;r~G6;@r(W2e{W-YV0OBZ{{tW z_;%hU3>P9%;z<*{z-$^7td<}^yTH;jZ7(VGZK{XAhed+X8#E!i==TrSZXhu8zhuB0 zftE3R_lntrmWVNhX;MgQG27a4Sx9boPne_tRIoe-6(30#1G_}rRNCeQ8$jL__`$tL zHUB~|D1(Wyud8>lD^7x6g)!3ebK&G!Nxw@%t9k{4C*; z82{>1!jH8c&Pyq#3}Gkf&Kcepyy%b7Iy=_g?t=c*W@UN_Bg~%1+Xf#vhLLIKZcN9P zat>cz7}r_P>F_E=KkP=TnnG4R+=x-)x$PG|;nJg1F+NXmW;i**O;SCM zX~kaW7*SrNOT=>N+A6Qwawk2=O{410cU-7Zd++~Kky+V-LSar zRs4KoLZxWKNk*oPTZNAZCuR7o824l^(aLU^A-tQH+MP_e1KY@^Wh?BZLowRVNPVX{ ziKiu_sI>A*6*5dY(b#ij+A>acguZxnc^!|8`IesIo<92P_Qk46l>`C~t=ce+*#L=> zmZ#6GOLn29?<&rgT1;vE)jn9{JYDb&^BQaoSx+j_t4yp*g-6YCp0E#ocM*+pXc{B# zK6zu2-dZ|vnSf}ms^l*A`R4xh`sbPv29F}BXya{XI8=36n&N=Vm}u;yO@>}2<3tvc zi!%_!KD0$4%18fo?zO`!4qh9c6=2d6rP^55pT0`_;nAIZ#^I|@yC6~!!>L%#AoSalXxu=e$K7%VmA2k}6(QoS& za-h49(tdLhiu)UX43528@8aItEX^0X?RZg|FF&^8?sfVZ@qMd1E#ja{Ydr~_ z%I(ISBKqqB(K}g^Sxm`$lGuBABv`Q+VZnLru1nZ1_YZr*5)(eU4HpkQS~Hm@e}*6M znj=9Y|NQi+ib&dpk~e{)ZXjtN(J0`uMF`EC;nkW?T z^ILvASE+pK)@ynCs=&`#?vD|=mFS95mDU;lm`7oZVdOT%MJ|j=qvT!;QP*XhP3gjv zq&`^7Lj3j&T8Xk%j|6EY&Q3OKcT4jP#xK=4s7!`8ATsZn$Ci*TJ4NA^657yq?O(R! zFiBwytBKdt2nrd%k%E(XU$oKOU=V#6KRMJcx>~bZhgcrtYya+AVdz!&YD3gbbLqPo z;fpps%fKf}u~*hSS!&cA{tX`=?Qg~A@<)A<%;vf&;sPPs*dP%Ip*;-4+_%&(ET?Ha zT`?ygf*?a)H#E62_)qVN5b<%L53_||`)E@QyeoBl&jKy=vwjqL#-Ghq;bo-q^{N@C zZRU%cA;>3+?%OgyJo*?q`|DnYzqkcR{qULPS1%H-+v-t?a-jJ1x`G*^-R2KPf?`eS z6~Fxq8A8@xAd)g5??0o}cV85poOciK+a8!(lQg4N4BuW_b7?1!3A);nVA$Tnj7ao{ z9&=~ZP_AJva#~-g3V~d~?NiQgVOzernZuR=du3MV_}d{oCiuO&)U?all8en%)FYkW zT!nJ9skY~S^bvRenfM}_LY-NF6DcUu@LP+WGod|Sh0D<{uq4pl3~S)2pP;FqbC z*e6BPZ8ynDUfce?tdWVwYjFIR;RCD2ws@r9v_Su# zU9GuI?>qy%OS5|`BeGhA8d;f{&BspCYVNWdrN?g4QOE#LiE^o!YhgQg&Wrw{1AO&y zo8!FdtkVGnErZCJCdfdcGvTSTrV3ttyGd75azvLOmX_QT_Y#e6)V1PVlc}19`L=V` zCF0d)MCFW}?zB!@({9OS_YK6JROo<@xyIW2E2*{0P%vbz%R|V9#?vO^EaWwn#4)u@HRoSXClJr(s60;|DGfBCRg;%d$1>d4aq zL)h;D)Pb8Q#mHM;$Y;Y+1(EL9%|@ zTGAb5-KKS1ho1c<==rMtv8UEhv<*AZE_cv}c52nPW+rM-sjfbK<(;l2E66-I1 z0c=jSU4<7zDNUbM_XODLA2rt*7Wqzw&RRWmSn*Kk*5aVs+_cpA;_P6k)5phWnG$=M zr^-NAQ!QJ}HPFwXgj4N7`)Zx!i}gvV*iY^8Ka$X|pNGGFT4220oeLBKtXnmPx&;x# ze76;o{_MUdFRA8z)29PH#^u8pQINBq_?DmX>5Pw}H@};JAn{UKtXge%AKgiqdB*YZfCjlt#LY{@z)~uclvJj%4m>JchkYk^*+GbbF^M(c}!39D)4=+ zq)CFKDWV@usH zf5f)GwYGWMU(yaMB#KvSmt?)>tUJ=coO)9}i4GG`1|UJg*`RxwsI#DE{(CoG*m{%; zz#1Jh47hmE>O|t(6BSuUEIb)1ZDwp`8qQO|ak-j_ao(h*89}j4NJ1~x0IrC9yBHz# z6pl&tqhb=XQ6yNzPbmAERuT@uJbiqKhT~42ye(idjyl3c&mzA`A96PKwv*ljT~@g) z>SCT69e&NinWPd*oDUGst`F)BxE%?Q)z+$ZMT_pE(zm;QIoRe@rsKZ^{i46)u_V95 z_sMHPub|K*=p)RyfI5V^xlYXyJB#>DNygGDvHniyiF28b82~StbLw}j0W8#V>B0Hq zkFXdZmNHycI!H^#sN@fyLWW_^k1 zF`T!Qy$^>^?~!IU8kKmNC^}e?_oH%YL#dOy~*}4a}zkGT_8GG z3~j|$7O=Ts@s>GuF09C~|i1UR0c7G7AW48HK$mojv)d!&2psaz||EmE+-Z zh?+(g@l7l@6|Qqv6N&c}d!jGBH}isWd%tqhWxqpEA9(@3>8YQH6p<6!h-W9IaW zYMnp~5kDONMTWJ`H{Svdp{puF-g~=h{=}`!Xwh@m!vynF;)04MqSO7f2WIW;TILl5 z(xHu}xG{lRC49k~R~XwE$mMkPjfYn<9sZv}WRz(?XO6e|o*tg)`R^dN4zWY|C5k1|Pt0hnfe^I%8sqsM+(qiwrK0Q?d5)Su z;^L{Lu*#o0hAt<)m~|8jK#e3{K;tzb=BX(YseXx;;KHi|ik>SIvjQeSWn+cfRmuT7 z)=mW3gnq$6_kv4z9%d2-98|5=hK1g`wa~-5YU>+I7oM-an5L5<$1k86K@d!4WuU+C zdDX8$gm@(phn}iQWy+pzaoE=VDGIY`lh3|~u*6)9YKEx7GNv$@EDoud%a#!G_A9}P zv|z6U8th5PoEa=AAbOL{6k9(w2&@^1KCJm(29~jI&FZP+Q1@2?r9tpBBl0tTM@w?E zFb^qGjlr1K@$?%k1Lm=$zaromu^mSYhk3;}BLL+llHSAOEZW0|T{jrs(wD#A1dZg9 z`iJ{kF5fsYDW8)D1Hpxqp}4{wC!d6t@Lh<|5-tqJkw@%!O5aN#HR3SHo4^6^7j26e z(h;8TLf)`~%9l23)Y>Rp@t4hrO@q(S)Q3)=VWcsu0n**B#MfDP4LOTiLG&(A%O$Uz zGHD#YFYj^D56-DvaL+0D5xxbyfDJ$c)=)b^HcdEIr!2L%z@hI_c{?h2wH+B`2B?X{ ze*=gN_B5B`zn32*u=KdyK1c)ujwMaRfcqqf8B+@*5Nl`Dx&r4%5LLU~5|cUE1I&8N zN?a(e-@S85eoQpkx!B<&moZ`v8*}_ooD%>b2(X7?3TS0K$2c@x;%-L3 zm#mlIK}_ZV7v^77-Ve@MTppYg9GWc21ZM$m0F!dVjaZGC-n{0RhD!zQ^6kLj5ezdd zO{}6|_FzJ%7yboKCM>u4MkZ-~Fbx2XEsY^bfTnlBI_EqDX46#bV`U_O|xtOCIelL9v)w01yEhL$p)zN#83PEaLWzc0fD#?X9J&_T*q^02t$% zXwa^G7Qlm>Ni0e80Czrb>?}sVv}IZW@3v5AS;SeXXB(^Hbff-SMJ9B(!UMo)51gsc zWdxXzt+`7baP@Y)#5(|$38kydr#})iY*>>83p3UAx@kNP%Z=Nud-s81mFxC>Bb{`0 zN^1>(-;J}=b4CQ4UX>;^+uM74Z*NZnK%g*ip})tQ!2XUYdx;ib)YJg9&WlvR7rt{J zGT>oyd%wH6qEwg1t8yp8vt;V=OlXF!pluO%+OH`)`!e|vev`V53Me%AdaF58n7bPU zDrNiXXJ8p!Z{zq!-+tz_Y|l_=6ox?aP6f_1pGxh{RM5vg(qZ-dY*)rQKuWaq8aFh( zY~N5|kUog#Ldx~m0MvWWlT@06h-SlQYbQsYz2mQ< zA5Tamyx;_s4btsftCg~|S=BMkjyr_}wa+j^fo{Sq`8wkZhhQ$7Q$fs&_V&P%dBQqQCd{Ww_3+!x6_hDw?6ym{FgGv z1iW1OT2DJz!X+M&ZEF7Tm26t8%lo0VnZJy?+o9$obuXj-RxyAey_Vj!{7t;$N>zP# zPu{%iwt!?O*zeE$d(|i@`)l%FV#v*f>PPW;5kCf+6JhpAs-Xg09}ni`ddbI{=FLK%b8e=^gr%XMj~q36dHR;icde@zi&jj4AvR|E zD_60`EWd+fK+26@_(WTkd}e5UWR3F$%r_(jQqn~Jhb+a{ZT48#d|>V)I9@5~l7 zG_=ul3O4>O*7nU@qn3TWmLRKq5~|60^o#Dj_lwoyV~gIYhM>-Eg{$GueOiTLX`w&(BN|*%&oyfG zR~<{rWCjgen#xjMa8OH1h`$C~`hocu*SQVbD6Luad@SGF<;8uut@ddIAN3~{s!pRn z(f1wo^){MOwzPeyTV5X-x=5jcCw+cq&ik6#$T`|yU&GAoJurUxFjioVDjMf(h`+9A zbhB4xc*!ST7B%-Gr`hX@O^IKLO}kbuaarklwbYf`S}>04otAmdR1N#FwIqsO?Sfx; z(z2mCDQk^fY`IEZvajiN5&U17DVJ8Hn)KKcE>`n-{h%0diN%nwSx>0&yizg;dl03? z?Kam@{p0NV*kcca(xV#D*U0GP--X7><-ZXqFMDgn?6blJXw{$lEZ;3!hqyH|B*bAH zOAxTBz){&FNR=qBlAscoRgR^wIOO@Kon#MNvG!ae=5Hu9c1`b0pF8DLS222i&m;~)9Qv&Was_;UR+ulIXMqqWq1VNrI}nk`yPLq=UNo_o=6C~vMT*| zOMOP>Wv9Dmj1tvaIOA}y*ue`Wk>KYpE6d(a5$Qyl?%9f!i}gI>SMOdXH-?dTecg4!RX=UOAhHK`_)LIKif`cl;!F$& z&28Dclst)Nx(t(Xgwvd0tH)?Vx=|d+<*!OsoUr#IL}Z~ucJ$sL*EsH%G=!yLu*cb@ zv6CY(a#w#}^=7*{+cjpv*;Ta`{@_fjXvTXqp-==+0GQgEB7FziPh%{h{3cgx;_;s_ z1@fyy>q<&itHP7?>VenI;x-Rvy|~IgWqBIfMDG14+x_+X*IlvQDhghrrgUOal@I%> zzZ?vty-gB{N-rlc)56uC?(60p`D7bgsp=VCGb@+uJTu%-ej*|3O}|7e@<%+cH-%obF=4kDv()JqL_EXyaeVFjLCMEgUJt}b|8XWDcTV*J+>v(uVqIFPtyi@6>v=)8;BTM$^v(KCwtuE1>Ymq4p zHvA_gtE`(gwFQ#ME3n=Q+-U3CUlSjd^U-WtrFK{J&9l5%8Fsek0=Y8<5`1pY)U6eN ztNtYu7j%8Qwim*Y)w#@8b@^iAC#(eOg|K=ICRSyB_;6%Q1}y$oR#f8TZl0!3xDd-cFZG_Z|3tx+`< zQe4uf!IJTM_-MO9uY6%?l{430%R2N;*3B40D=GQuu}N+E zY?Q;aQ{tz?Hz1Q=|K+eg1pMLMcW-*WWBT-s#3|W=iz*rU)1TF~X&tMs?3NZ@Eh=^< z{w;yg4|*F&Rdth#QoLK+0?FM>)C>Y|s`k|o8(~WR$#CH;xRr>q)p31gHFSziRUKU9y z{TBBuRNPA%a~uyZ`RUx zN&va3OI_-%MjBMqO~j<=S8Ml|qzXS#z3~^1;+dQI6&GP+pZBx+gJ9CA=R)qU%z=es zhWr|>+)Ff~GhU0Dddwh;=SYZzWuM zXo$`7%hJaB8xSV9J$xB85@aH<+$Sg~s5MyCodjagCbmHrGI?fQ1vOXmubqv(Pt0%h zj%5*L@S3ieod5Sv;zXw1PQ7{~z0{ob??BadMu*;o)KPH=Mp|*FQ)8+}%esy!RY$@L zQxNiewV^u9H>tD=L}3LeVcL5y&v$!et`rifZ#VldiaWP!G&+EK<4OAy`R5vV7GDY_ z^qiXh<91KRcA;@CQ_$0LPs((D{|&oN!&vclG8@+WEtOV~dH0)WGgiH~_8G|S|M+O1 z$(3ba$3_jh3kJogOFrV2o{kYoZe%sk8|5*N*?5$gz4^e{W}2DDqAcO|Sqnd(yuN#B z31rmElOm$(kpKuq9hG6jQt9}?f2@Ylb)z(1P*iw3Y%>?~C-R9o){fRqo4@`UHR8}Z z%E?7cGQwMiVn=@9=|knkjg6@10_hTZ6c*n%G^aW!(;u3QEB^lNwqzp!C`}P)U;9f-gwg#6YUDEKFF_i*0~>Y*B8EFV^KDII5ucweRr~ zXGL$BK-Un{_I&A)W|R8!>2HBTGg)5^_Mh827?KLI_G2Doe_hwl+Tj9=e|TVih$u*P zO-U?CLN${nEaflAvS(d@$h;^(cwP~RBKQe7I` zCF6d%lpO=@sd6npB2uxlro*nOd-J~fpK6M?e?@k_pXa=C8bS^XlnI@Gu3crYZ2oVc zXu~N0KIO9k6739?kHK9jESih$XeG}um{ur>bnc4jN7du}cF-q;zuT|I5FxWxXc&rcy zxr&RC-Zy`aFcBF>zXMxF2wN0n?14+wiW4krt#Z;=k6uEQ;*~5?eJM&y*4~-&9(ey_ zUH}8@T;B)@Mkz`ZZas+I9$Nlw?r5Q~mK;-gIQ&HBy=l(uTAjaI5LzMlO;_@9U*avD z%G*Hx?+LH-boe9z6`at~oIm`@quVL>Uj{{(hl+IZJ$HK0@m#6FWIdGw1|!D5h^e6C zn!Rr)5K}GUx^NnsHbwGuM%S($;@Y2LG(Dk7-8QI`-ci*iW4Q|IN$}V5x&3%6!Mq(C zc2_b@lZw%-XeDKkSSHz@>{|N%;IwJhh*`?UVBh;QO*OACM=wSb?#Yx29Fw6{Cuoe? zGtqx54>cRL|5#cIKV=Nzm1j0_wU?}`e=*$B5&7G;EXuNm$bV;I3H4TaZsSY{nzo?v zDDx_|6ae^EHlRXrbf_7(soEaA(5yygq)J8_lTiCeO*qsCGk^6w_@Ia$8nKBztEF0y zyp}e~%6ihtw-%JR*ca*O`fMZ?o6zVxfBYWdr52`0#qv7QO!K5^eY|T-#m(t_fh>yZ7Mnm6imcFHy_IG z$)^krZ?!frG3v(kf1_OfX=QmZ>OlGSzl69SVQ!qiK1+|jbPAXh|LmP_!I(=C%+oip zMi=5y*ht`f42WHvsR&wi(|%h*DV)DL#1tB%{ZOXwC57^!SzPhH|8NwsI~%-Z=V@eX z(CFr@%XEUq-CqTO$mhQCD@P4CV2_H>zv3$zke}0fx~zKlfBR)}Q@>%$P&3Z?HDg&r zN6qzNQr@XnFx%lP)!TpXxgPtB{m>0~`7J_5dVSNxC+~NcZ~6l2)2tzpLf-d9{&70% zS$h_N_<>Xx;FmYeHl#lJNCw)R8-*a7F)bcmC{&n$-d1lRp zzPB?JLhse5_bnD*TP80Vvus$<9@tATmLm=r?$^ouM)*2WY1j7^HAQ@Lo|71eEy~Sd z96izc^F_fswW|bjo-|^8^&`WS<@Lo+A7=VD9Xq9O?Hq&>fp+{EwY=-wxo6ZX%9XO4 zQX>sSks4V_@al=DVhc0~=&+RPUIW*`C;Tv4gV)eFqYi<Jm7R}uJSp`@M12u^!*NV+6leDLWMQA02IM0hW>RdMXb#Y2K?B z=zn=G<1=d_K+8mvx#pG@-_d=p9SVrD|N1CcO+^&tMUMsYJ`j$g-hG| zM3AsL`fZ3#khSmLWSf_XPUe+vbL&juA6 zk832SGw&L@pQOq^tWx1tmPFe$R0Pt8#T`2O!5I@`ycHMp$2S_uzriK^xf4<+RVKt& zxH7p^{;87582Niaw;$}HgS4bf75ZG%Jh^OITe%5jwHikGG3yQYM+HgSyBOq+iqQyd zJBv#VsgDN{UFw&g;SQ$9PvuRPL@MP5l%__?bp?3_oU$FAD4wxxj_y2d>ueCJI!nkp z6R$9UynV0eF1c3{pI;h2Z>N*|WK8x`+vX^RNS^_Po8=B_N&WfF1yw?aW)oZ9YuSpw zJFFX7jq)b%r78qk6iPaXW;?UX!VdUTSk?kZdN(zVt(FW_o-#LRJc^VN`$Bz?uD42L zWOI=nbG+xv`YzapfhBm^l56F$XNi2)Tpf!*V-K&3d1(TTdzT@cdD~O_`)mxuHTmvm zQPah4?X1GzD}3!)&+>Ic@)rs`)d}=ptp-UXDww(88*W-@MTX#vNA*ACF|Mpl$MNxb zle+n=Y-{nN4h_C;KKexQMDg)NHDl?o-8D<1e_UmDCVMZuVhi!8D)7wSxDihLu9MtQ zo8U66S=H*f^hE$EVNUxkrao8fH*fH9hGVJ8M{+*oy^g+IMUF!53uE>+KYX1~-n+LU(-|Dh@4iu09FOfi3Yji!rN?Jj zzSUWmd^;D1sJLj1%kT32B6)1ZoHcO3lZ9GPDbx_N&N)j!7~ZLw6WIt#OeTwCv{D!w zr}B{e&5=(bTP%$|3u`!x_&d8Py6_d!^1-hnPrv-P<*y3lzOZ?<$LjOWQ ztMhs46wej%O8~A_kN9?CxbV{IW1T3QztvQU8UEZ8<|gGOKtF z=qd>(45y^LHp`6X&vdHrL)^#CkvO*-GU(Ec!^p^xRt)6IKb;NAWb|!w#l?HG-)WUJ zm+>T3R)*8zp9DF;J_QiF`8blG+LD#w4rmaW!=3U}8%^IxQn&zcL(^u0Yv!}4W@BeVE!ANUSbs?;3_$~YcyMw#ic(UKt)pj;(Te@Uu+jYf4t~H`O71u4C08(oD%U!>~I* z-2_AGH|8Due=Q=1+pFLVZ6z$-!__<%iWge#cW4-j=w1_?#L3i=)?+&E8(oYCsu}!haWvnU2-1i(-=Ah1_Qk#lx zyCa!2P%wA+B_6$?YbZ7mVDD+N(D#Yj_UCs4lFWxcNx8$rt&8Ria}H^UJ41$Q&VbCX zM3qDvIBJw>iVXHhd>x*4WwX@%YDliyKA1&4+_EFJ;@8`h5RMRh>>=J*W~Y0fN0GYG zVCBHYIbdZtou9{0^uMPl;g8jCRp(nD8gjyfDJpnOPR?Fvf3hspd;g!M`zM@BjLO5d zcDizKI(+oo=w|8Lc`dP#imKBua^kv)xk^1f19H3{d_A9})R6rhvO@$u>EU!$y3I_G zOVms>rz0==_>V;N;!Ev|TNqR(Uck&gz8S92@;$H0Q4o++ zC-p%SOBA!q+~$ zeWRh=lQS=g=hi=PRaVrygqnQaC9$_f)( zicNk`xkSAT&WhW$&3)&2Jf3{Uvi_XN>ouJ~eEK`i#GChzPDYHo&>w`29*$%w*RC9CVr@}!h zBa_V@8~e)Z%j(P2ykj{3`QBdlYWj^2DS~;7$_I;`P&W7~{=BD_nY>$c7#ZpI(>iM` zB(oMoM7=QX{O$FB4&vrBx+;#oTKx&v$4`CVi*1tmVzn5V5~1*$ z6x9NH-}e^x(Ejn3dR$0s_Tsruf9E>9yx5K35>!5|ud-$! zKX)Qy(f2`Z{^QS}Y@wj4imIQS$2ajf{)39;JLvK_4uOMTn-`$ZC{w)*hKtBZXO%hz zU(@L|CzP39IYa+Ye7?XzvrQ1k>+9MIml$;l{2IKocv67uI7>_!&)^G1VjZU*$eYY1 zE2+fSiC+Jzpp2EV$MwSpiYIe2dP4U#rxR7yOva~V9b)od9&{DSTBGdsjQ`2Jv;YrEhZbVRx9p&9GY4&dlm3crM}3hpRRJ*EZYPq%r~ zV=8&(b6K+mDqKAMHOOiZp{|ur{~BtE9;oPSlJPKY~T1t zdrh%BQq~m}s3-a07Wx?#q*u;_*jk7K3Lns4%dZ+Tea{y@z+7|wywm>faPGpFJLaM< zs9t}M$rq)J7|>p`LTms#r-@YAKbgUB+0$gI7N52}paJ!Zm2`1ORa0;>u-h+oBq(;8 zPLG?S`@bzS&Pi>mu$-zX7W;M5~o-{7ODj#>CaFirhJZ)Y!@4lGo^(4Y4z zXrMwr?l^Z^xOuwO>N6@%Z)lNqW8D@NpC?L)l~v8N_30jibApfSTY7Gvf};-$JpsSR zW<6f!c0u2XolUhhSB(u|!t|CZyW7}C7ZmOd7HZLM1z4ln_54@zJU~#mKiI7W*owD9 zLG*@L$Iw3ol%cG?km=6RTn%>jDJ2Y998U58$oln$U6q#2x7$+=V+^KEkby>RfJV}a znG$3+jw6DbrfJpIJZO7v--3A)+F^_MDbc+T#;ao+pdq<>eaBUygG15ltqRIxUk|d{ zNAg~CPlph~UFxV2y$rUYy@z1q1eqN;uzXrrZO!YD6X1>-*BfF(?AfY9*?h;@m9fU= zf(yk7ZAu<$wT!pkbMiyygtmiM1SecIt--n|4H# zIHkah@tIhy9&) z=qJ>M9vR2jR;Q{khwsKTK1CJq|9<9lidxn;Tq1L5;9UIB8K!jG;K4aof-+FIp9BIEHgLtwQM&UqUbT#- zbzr`jEWzy{+~p@@sK@pgmA)|BZ6#}M(??W){iLqiYGaj(&Z_rM730-*=V>N?<0g2V zt<*uhZN9$$YA0b=NCI`FXZFKX+5yv<4#nHzGP4Hq{ zvmynVvK#XLISq89^RyNk;XJJ~6jGWXv(9uemsiPX;pZ0~L zMPA5UT#~BPtp`UGo1J{pMIl0;zmT~!Nvv=@X?!!?gdQk_uiOOb`W%N!z6e4CS?Je- zyQyPvorJ{Rp=LGt5a(?8COF^fV5=h}8@_EDT5j2eDF5!(6*;R6;6xZNzPdn(YtdPR zrczhd)!Apm2{+65Jv`H($K6L3N7rMb|4&qdkl$w{;f z(UQBaJB-#@*&n9kq6~U+k|;x*rG4-aYZwoIgtdr=(_y{i;q=w{LO~?L`9kd^d)iF5 z;R{+!>=7IL#g4!1+ufvMFyA0=J(yssu*t!mBn`TO=&abMXHs@ zuJ^fXF|9==YBAkL0wm5|2bJWby7PqEsR$WDqd?h0GSn`FL&gSoQ}K$2Wer@?t`nS~ zbjdpB9iUMIm-$k|5E^aKRDAyTCqrj+uDi=xbdxIHx(2QoVo?KsW7kAP$jUdA@z8cfI zRwu9us`Xf5%IKgq|8U#|oAE+3c#p1??;62hcSBZhYXnBu05u*~p7w3QQ}Ya0-dZZa zsL{3Px;ovT3f-%LN7OsVd6MZJR{9&3?Y~yn3^#D9k-=I6(VqCqK3Ax@UOvMyQS9hi z2K3``m#t@8uzqCl$`3DefJ@s-O23IqzAPVD8jbZOK2seB&A(g@Q?{qgl?{^+xz8ocvvs?j{Y=uhiXx6fx;Xculs2EG^3~2FyI;DuX zJ?WPH%%q~76GBN zQNMCNim4^&wV>AqCy)6Z4jaSLxd%{nqJCu{kMIBWzADAtz5JWZpSRn|jb4%Me2ja2 zCimK^ufTZnak6Da)sTKeA&WcnrKCgV_$iWp;~!~>F$wrw!6KxMsil@ zbA~X=-NkY3LBtz4tRyXb_JxV@@4vI%I&wpW1ApuQELe_}V0SPNS}8)<%&8TqX~JEm zUzO>pDYQnlV|r(MSzSuqkT*PHtvCw-nH$=0;X9mLCQJ_k58u`<6i-jxi|%0x%ZNa< z9n*AWB6h@-7w~RKZWs}4sahYVaV2;MnfsOMlXqJ_Z5P`rX;=6Zlf$TYG*tjcz=GzL zLk|!+U)=$7>EZ2tij+n+!P=NUneVmS>sg4n5lU*$Cl-dai(*KT3dnd^KP=KbwoS21 z#e*?KEI@)~T@Xf!dZn6^)Egi9Az?@;6~)=DJ2TN6zE3sz10`6%y>BX_ zF;nl9{)di8*f9jAz02B~vqN@l9eM{k;!~8;m4PPb_ymklGXcVg5z{K7{=vkDqM#o9 zA1rBiuN>Ltc^CC3Ak0ZPfc1vV=M3H0Y5p>F)(?p=f%b;vqhDYy)VuI!q|J4X@1X-H zT}TZ}kyn6611IgstNy#ly(~@`$Qp=beF-UW962YY;b1D#ArCJgsTGr3K!zZ{02}Xy z@O7Vhe6Q}`>&Xzqe#z>epGtRs^EzTrgbl+FoV^<&9zYdB9dPqy|K>m>!Fk`<$8mkv5fpC&7MCe2a zlNPkS9hLSeO+6nJD9x1&6DD%3P4&u;J-yX|1;TiHWp_uUTDH9X4Q-pBZpan|=yDab^Y# z)~0*fF3gL%9d>;jjPExdlRABj>6R9<;M!8+4dA?CKn5@3!=Yn1EKA_AB&k9VjvNcT z?10gVcGo4>->!dxBN(LN zybDUWJ@K8ZL5K>`>sONUmqbXi+ZJ!EgJJpMa+yxNO93)-(+?y-o&2kp0T z5Z7%75L*sh`*osh-wan^jWkz6_NRWpEX!CS*;~{BT8jS?7DTc4My8fYL~*LU8n2Ap zO`Z_Ql6tImmMJk(n8z4s?+|qX37!nY*6nTc&!D@vlMCj4CWrLziFTvU+N8$>r}Fhc z$;h7e+VdydNx5<%-g7ngu!?($M-jX9B-%>ax&C;PS&pe|Ihe4;BOps(fdPuTf+K4N;qbHbt!W)#t zU-HpAZOiYGYE^deaZ?k6J&8y&Ihf8Ft8DB};36?buNj2&Bsj^Qy&kCDO_U~H@Nx_0 zZv6ca&yG||TI;3+-owfR&&%IS5#bc-h;VmjNfbsMhT*L<(2gDJZ+$!N;6N zTtNhgfcGFwSk_BhjYuUJR1}Cj$+Sc=BO_pduZiJPUaQVZfIdVxK6Xm%8zLT`lBal9py~lx^fGI_BnhLqB^7gcdTEIxl5PrYC z^J(37uV9QG;~rSQz-A9N2>ogx*|unHX#`nY%OQ6PYFL{r)c`V@8q+|HJ=^=AV4wtB#d(1a1hghx{WCa=aZTNzW8eoI@ zwz2gv8GR$8ybf4@dWNf{Nk&ikeai*>8*!>Zo)25rF9m!g~Ku&;)W(q?oNARn#=`e9%= zl<-btyfdikKNn*H=|K?ExR%_RHm^b|$J%D>BB>2p!@E*Y3g2QA-G5Sp)X)O_+ZS@Y0q?IXz zg^djV2y!lcHtulZZ8wRj*yx8rzw-7t5=JL}0Hyc>D<8mxp@psakG6<#-o;CzdBXAc z^C^o?K|QW8<4?yeY*>CIDbSln&LKb+BM!5Gfrxd!PKE1y#Sc3^h0S7lcreE1uRg}3 z!uD7#@8hTm>xe%rK8mn8dI%S7u*2~80K^KEz{gl9VfJ{#=%P4@@Z=#uO{UK+xY&rv zr1pr(dR?P3BFe)gzq(w>OZU@8IDV!5is&h)Cam^Jr*AWB$^2O?NxCvmzdD|W^an4D z<_|@{+T@^wA-$t%TreIcOI>%*Y9OHJsmF{5X$bqQE#XO35Yie+tvTf#83AMMZS0kd zkYr8>bHBUSW1a7axgQ`BaBua``9Jb065+eT#4X`lQ7N!eLX)rbs8JIHWXII|Hk5l? zcO#!68?&ZhG)PsXa~UNh{WSc_b*^MXK8o{Roh>#hG3+Kw8yU2#Z&0~+8iEuiY%m!R zpuu%Sirzl$WEiwBkeWx8 z&CQ{e4$Com3nMbO`Y3$9WdZZA$A1)tK3|l!CAAiJ@Hq66RlzO520Xs!02MfIgHhU9Sx{kvFBhT+Bk%lP7Bnv)Z2TmF zW*FVl9o!1+I{i)l?k6&M>9mOcDF*z zDl_yrh`Yo0s0A+6N6q>hgpW|aLg>8KzkR^>pb~~zKEFx;CVTN^CT{PBUBO-T%rE7h zQ#)>+h1lwtcP(9g+fds&gIqq(9GmtfUuv08PdfRm+G}10CE69m5Vyvk4TL7ywsv_H ztk+gctnpq*_!Z2p97XxB^4=WyM?j|#VSt`Me$11trD~J{oV0%eMtj~KCHWQbw#~k= zTK+@=LWb2V3vR5oEw~5hL-E?n2djPf*QoQ{{0G3wl@@%doOv~XbJkZ+s@aQ&N{X}&g3vdx>>5+T0crp|cwnGl& z9-BP`f$l?MuR^-za-;*gm@4v+X>=V7r?k&++KUvO z$_^+RuXE^rw`)AjG=g=WirqGy`V(uHFCI*G&3hezr-86Sa?g2@N3d%qrGz`^PLoTi zW74`pKx-Zjlz2w)BXBV7>xd3G{!wZBKCR_@5R(5oA{gGSf2nyHc2WXp&A`FtQ6RoS z*6WCc8P0L{f1G513<7OrXL=|Mc-^g;Z_N(MI_#_lNpCY;N1T)a0*G#Vr@;6Kb@>7u zEErC^{ti!OpXhKau+3hsfV^|tn**n9hU3+<$}hvB|L50nfJ(=W5mwyi^IgUxA-?D; zyRIOtp{Py`l>2;60qJmk^5g2j(<25~m%i5-`YD>=J9-cGn!)ibr41;u4iqTvj5Gtw!LIS4o)D2UGv{=&X2+m>vCLRU4f0T-YNzQU&U)}b) z7vWj$>s&c8t|$;#uAHz&$=*Ia>>_l6{|sKMffp@>DcHw541-Z*-8ne-bjQk}-jgE0 zf7@t+EDF~Vw0}9Vz-y%d+?`wKv)~Z_i2up>^jfI`_v#kP9}FTyOmkxOu9X&Xk8gW9 z%K?~&*Aaj>_|CIQOHPbFiVUER?`()}<>c*mti2x~|#4pujd zw@|;8B{awz5R&+|7g~t#NW11CfMR@y{nWW9vSpvP=uj2~6+YoVCIwuAmSym*qg66^ z=vd*VdW`z_my0Sr6fPUA5-iaoYl-A^|P_P z>dP;$>SAbQ{OQw}>x8&v;DyEB>~%3Q>er#2lZe}^RqvByPE5%7*!h*O!e0JVAYN(@ zi62U%%e$*n4t-I(2)Yorp~j%uKo;Ouoq~Ei%Z`+eIk#nkO3UZmxq21Pqo-R) z#;g9(7Uz(;dP7{@dd->sh3kC4=V2*`;a2f!4GUh=-B3=Z({L+o+$i4o*+OjOg3IcM zpw2;ov;`M)QIF0+?y&_Ixet=1r^9opn}59ZV>F(Z(thol z3X0h8H=jwz<-xMB3DCmUqg)a4{Qh&63^!dl$*A6|HVEghh`pPL4WI-Gf?2 zaK|fUQcK@FeR2*@PhDdYC%&4Q)~(QUYOsh6ist|pq_`x)y0^|FK%WA)uyLE84JG-2 z|A^N|JedQSPM9>$Ed{1Psm-mW5j06F`#f6`l zZ3}!Bj`1yb;}Dt9j?LLp{}&1t)EuLjAN4mh z1669rx)2%9=*@Wnf0M3zaVuPbt9}D@W-S81wQh@3gvhVBA!f%GfrLDfT36%sw@bNa zj0bx!-L16)Df_)g%`&s}*WWr503@~ima<(@2(58KM~;14KZN+x>EyKK)wa> zyoeNe~-eB}=a+tQn*7eqc5yrD4VF zN5jg{kA~UuAJ_6a5n|X-ZU$N%R#7*eYsn;HLSWST^`ZcV_DczM93RhXnij(DW zth^^F&`J#ODo_151M0+34F(YuSYi`3Uw)o^&t~^oz}}n~Fp93%c)4DBZvm%#B}`~b@U-$1244Grg{9M3gnzIC>{Gr>|DstDK}-Q6q0egW&?GL58muZBWwJ% zG6?7p?=mF=44uvp*+>V_AU5t!+#muKr87HWZ6Q{$Ksj0riNXTWM}RdEBx$RFzN;l9 zKXp*6hA%#cN1uh${sRjqgTnpbmqg!(uk^Z~$~;+c$-LV=fp*Z0fLhC%#kF3rvh>`&?(aFN z?+k|>b~M9&%Y|6Qt&aQ|{@J#bexogU9>`lB1<^d5&hQ`x2m=^(>&O-~-O=M1M3mCqO;W-FvXK zJQZ)${S(`gZ#XdRXw0ByWoC$loH<>&u;v?C&Ld~9wV&tz^S8Nh3gwN-pY|`pFo!bz zEYRa{n-YuZo{|TjDD5kRa>`utaX?)TSISQY{wQ4eGF|Qm*Ei?@*XBbT^kZghJU{xW zYkdT+HUGx8tvLD_2VNn3dUYE8KF~?b(7Ka|c@BSfSm@6D_ipE7E3#TkYGk<4lv|?WmYuMCBfW zn+d@hc}L(%+#z@{?y$IPZveMv&&i#i0d2;ST)7TeCUyJmkX$)cS)~^EZL92z@mLz< zBSvF)%R}{WraZ>805gY|R{Hs-3)$GFwZT?TFD=|kaYm}U(d7?p%g!LFEn4GjPa9GK zX&lH%_5XL)uz1~Y*nuNh!D0k09kyrKFEDgJOaF@hgGR?3LL_WuF-~28Uy*40+#nS{ z*o?qOM|%>vh>KPsS&zR`#Q6i4_wpys5TpCTAj3=Rv8o12wK(u6*&_bkK6^AHQ*QR%|YkkE3Hg{jk*^`y|H#;4tvQ~@GWM1CU2NT#K% zP*^FOTA0y;3k?qqIes^{R9-VEfi(Ng`ewN@bkJ#w>RpE~5msnL5O_#b&6MQ#MG_Ob-r`AL zA}>o#bJq3d`oe|sk4%!EEAP7w3AbEg&@k{%CMoDokg8)}+r$8&)wtdTx6+l!%aM2; z2QkaA4^l2G65N~R5hd7*G3N3&%M*M_o)Kq6#X@d>?63^i{JqyMb#FKT^Mc^y-rWQ%VDN%rP(5kuS{2DC zN&EER>{Etf0%C01Neu5hBSo^lvCE*mCI#vrp3FVPNhEFI$O(=lDe#c>$?aY7|Lf^H z!@anhX zl|g}fZqWa{b`<@^JsbRk%DM9}Uzq^#L*A z!n*Z!Lb~<8sj05+Ua!|63L1p&N#(_Hp@5m)J8h0AA9@MU8539kF_*>(SLY|BGUVYM z9mqog9Z2g909OHS;V@isIz&C#*UvK8caLeX@8{LQz9;9S-^fzKA$!8ZVSB=Ip?kvO zT&bET>}ic!Ef2!Wujd72(^FzC3q@8b3~-@3Y2$g9rzEp9x)rl;>SEjzk1j6hTxc>Z zQ|NH?sKAeRfkd(RDutRIbVluh^F*D8>H_cqaG#*8)1pbGe%_66qgvs3N4LVU3?S_u zPVrE7y*nb z(q*-gL-y{p-Mf-~@s-wJY6H*`251bs1;7Eg3L~J8ofa(c6>@p;M0*HycIAJKt2xSm zuX7m5$n6d4cXqzCqP38dD4%WVEe z+X6?boOj`w`7cpEU;>D28YBGG(hc^_y>+H@pldfCRu0t%ZOq+A1)dLjY0dbC zhJnt`WO39wEf+a(desci|7d-xlDae|+a++OC{OpfhN{_roI0n94rn?DVf)`?CFU}u zmhwA$&IXOizE;o%N%81$Du;lFCt{)j>yA1=FyU(-UNrm)?5EaI@$F5c=5jMva1E|1 zv*kn&mX^{u7<&a*6>1v~Do0e}lu!rzinQfbWv4|s6=j;e2t96+=Hyheuy&@^%$32? zP5A?K@jh#$=H!S8Xk(e3Ag1Hz%SX9{VGFaH9N5RvZqJ!RKpU%Y)WM#(j-RqicW_ma zzI1JYl@;A!)+V5=FXWCm%V3r@orCe%Yt~*L^L?PWI?8kZqcrn5`dAgmjymvU4D+0v zvI1>vY?@Sk8o8^Z;&;jJ9D00ukNF=WxaEx+PdhLKdP2Ij#nkVw?k2p{C~a4y9c1nc zu4?6Z#d{Cpz?r9}PBqAEL!It*!!KxfVvYdX*czwH>FssB48+H&21~Q39L&nXs*1YK zwZ!QhY!pJO%2YIocMJiMEQtI`&j~Ao^7Om|sHV;fP_s1%?uO`vRn<7XZtKr-m8}k| zDiqe79O?pXtgxfVF_W*?`vdvqm_yJkDopPD7TkGOR{O7kv28VT8K^ZXC5-bWKy)cL z`e5%KP-Sgt_ew+2HP3fzp4!`t0gd5@Oag7J)yF@w;(vbCj{i9q^4{c>2hJC$jH~{C zmKwA(XDqME06rD}`tD?I@A*b}xt5<7(3&%zrZTHjek?L#tx_;sU-_ z#%oTt%7QlLbK)Oo@~JWpGF$&Qx3oK&>zd_o4XHcXs)n;hk@ef-$RI+boP5Uv)B&6U z=!?vQ>ZOs_I(-UeK&148;BF^w8l{#GH}htoR|uay5sY~=)6|2m{Fl;6Raeg?=GujG zdjnnNRv)oBN*cD$UCUFmeHVBTKEmiT68k1O26uAO+!Rc`T=g~Q> z<+Gz8{=3LNv!t<2KiE>#QSoBW%ba4#O^5fv;hg)DAT_|KJOoCf_+m@LsH08gA>yOl6@9hGXX zMsy$9Vxl}2m*3av`X+zSH7;asK7fm^7sbZ|dFbi9%Q#V9QUbFqS|2|*ohT=iRM;vY z{gseIror8oPKqX;E@kCg1`{;|`_9r#wW0NwwkHM?zXa_&K9#8JdpZ}DZ-`G+p4oR~ z@zJHz)x0vu6g-tjq^wURR=$~&=gR0y37A4uuTPZ&NmtH^w09)anvPxcXr*8YtjdSMxGnfB)hQ!h_FiaI`2feAqnrgp{DJ*wxCpDsXw5o#8OEjSJ)J) zOPzWw0isi%%mq@Xx|On- zr+tr4g@R>o65ptA*80yt6nyT;r=ndbPL#0VQ_<(!mkKPAZeFjbBfp6k>`PUvh8bX_ z8j6b_dRjC-^qdHl9=Uajgec=e7+OFoC711ZYq{)ry|)=EreY*fGozj%>s8GRb{In_ z=+v2bdBQfD!7g5cJ5>s0W$K^3ULlRznZ1kmc4LG%;{2vm-jv08b{b{K_kQTKw!F-B z*z=*&6?~jyepTjt>QZy~jty#OE*5WE9wffFmiJ7BRGQCp_S$NWNVw35I==EQt`gWLo z?o-KxOnLhA`+a`V>s2pox$PQjD912~) zHG0lI@fvXD%JBR}b>iH|Evj2@D!QJfI#^AQblFAbOC|A{PTXlI`l0PW6!PkxwFWj*w}rkc7>oz;G-z#L4f3;<#k%>423)TH~v{)TI$(NHV@vVVeA zcmB9mn{0Ra+u$B=gPmDyIJ*9H9c5{h4#->zjN527EB>#g*Y}d&@mA1Hux2mj8jpb5WJVsoq=jGZ5MIuf(63@Ykz~fBOrZuQ79JN4h1f z&uyKi2El*N8*+->a8c9c2W zfK%_|j|bSzqLM)*T?NGZ*86Uny{SeaXsIS<_vR03v?^%f85VwOqu|HThHGI0rTWt> zHxcLeygA7W(wxePK8LSFNjza_o0(Y6Ya}zbVC@}6#!sK-Ro@X9@%NKW;~cgXvsl7} zd)r;5t3xyX+yaa<_+HwA>N+!u{8L3!frV#rGUYy}9bDa$!<_yTkFZ8>yET;(O9NZj zPq7q$_)#xXLVQqUI^}yJ1WJfBicE7IXMrNqnrim)M7{3E`A|Isk(i#p+6I^lhsT4{Ea>P~m<4=0e7rLG%Q1yie<6 zPDXdWa6QzT@bi%FK8MTcm?7u&`$oa-4K!ytony!02Sc2f(#t9@%h(j2q&`h88=~l! z7|&dmkt*yPXOV%}Gus6k&6l-3Ly`ZiY7*DvI3tm*pi~{`<@9zFImw%0-K6h)V<)qj zAhJ(E`!D{J+xW)J92;$`StBL9Y9{B=wMlZzX#MK{Jm6#HGZ6U$PLsGYd?B>Di5YWwC2{ETA9vKcB*<{|@dcYK^Cdn-mBRdh;3@*s)qmN$i0i3j&VS zX)$gIQ(Uig-ZAU67{ptr71;ialTWgY^zxX?5~z+nPQS8|W-wu_vro~lgn~rim~3w$ zZxVOppu!gfPP~6s9{gPS_*Rkdl9w~)Gp5|_Ss-p+_n1Rlqx4Yjz9@uH0jII!XNkL2 z@jjLkpKQ4pR6KY4!WL5=6iY#|0ZH`K?I2rRZS~{8_KK2S6;rq5IrzBZWtlDew?)Ud zYC2i!s$T@+2iLF_YfF*E(xcW=L3XG6yV{?i0Qsxv)kH~LSzAgi#w6NQ*y{y$l#3n< zp1K0{#-znZ4x`l|(v<*%!eZa=7(5ju6}0qkYpD!Ml`dSxEMxqQR|`ZATP;|sS(iUB z=n7I&mS|bptD>an5A9l}OpCO<0plCLR`V>i@HRd@@66^|Dnrwzb5!}}Qj+t7P%RZi zmR+-I9u+_dQ)oBKm&@q_RsYFIiM$b?6-seVvZ-{)pnNd_RHOiLRtp(6k7Lad*dyWuFm;yxr;9wUOtt)F86#&xr>SPkMIkO@(t@)mms#$EY~^{lXFe z!1Lnc$q3LlQ2O-yMQhbI&qpLyji=n61}VG8o($c^H?}jO$f}NRBj?v1*8B*vYJPF% z)Z;R#;J7WnU#Va79V3zP;zC)m=-eZ~^vr496B`-fY6fZWY*={U;w8c_=N@@7m9HW$ zS!H$ROm=vcrN-xyXY;-FCahu#_#(5P5@ibYUS)RD=I}IIvvze;ZK6{DvA6}A{59_vE z&oYAy%a#Sc>rRs^<+44DF+BVcv|49&HZe~u3km+jI5yav4G*8K781A2Aj!>hC*NuIP2w0Jd11`r%D39+1H!^o7Ei0v^I>e#I2iN zB;70BG=+SYPXWF`ruH@P`@yAs{UqFXx?w37RUoMY_(;T|JlVbtxQ=tpPjWWq;_*R6zhOGj_U%E zdDbpeR(H9DHHa-`A#SyeHsy?VfwpQ%50~Sq(@Ex(!f#z}$dGRP;-jPm6{etP{)GhN zm@Q;*x0?YMhbHm9%=eG*EWixKxdfRu3cI2yl?&=v7I3f0@y`X77cAiBA!_$o)3MeV zGE%Kru`dyR{2J>QlX8RPVEqhj-%-mba{=GGhV?5Dc#5{)xrX(T=YNVW+bI z0wLyMF{D)S5y2XJOY2bV{9cV2Jn~mljKYl)5t~x)$M6VK+o_lZrY3NV>|L`P_9A|N zcbBrBsAlieW3NqSJ>h-54v-Yg6Ux^`-SP!p?6ohL=e*h2ar^b4XFDGOL#m5qmoXMA zeRA-5sa-AK`|pWKjPP)Ym{EWA55+%=KNhHYiegxvLrRV`sPJdg+<^17b zSo$M~tTYA-xQ?U+zVv}(`$S5g*cJz9?Sxm`-!My~QL>RBBNynyPj6_8Ocp9W_*MQE zvp{cndc$~G_F&5dddn3(U3m1s=Or?q-F{gQ%u*__*q9PhwZOOofWcv@C4ZHan43(v>zoZkc_eTP_r( zr6xnw!p53>(&xjQT~Qk#QtLhsolIv~MyE)hi)1dP+D_}(C6;TcQhHhArh1uwbqp!F zZnGEBhcsBjw*avlsND-)5M-AUvmQLk*&P*% zGXZGDZqCBp5vQ22Do)F>8!YM4LZdf0EG$i+c@#nH{a)^N58z9=Ic(PA7eCr`hMzdBFGEO?HyFpYs!h zB|zkvn{oOeg2)<<3AOWC@3{;?G!7@!-&07%rTtx;wMYYJ@KU2;&>8B~d;ucYrGr{;#*uIj?_VQodySicAodXV8nu)Bm~b6WsmZww2Lcz<6>!$L7NFlbpa!Rdo%i5>gU;4xU9N~eKDPiMcF^>URdsctkDpIb*C?FOWP?OSB-8ka!foJ zIh3b?bEx0B^BVoO!yNudbFoMjg7-G0!h83~;1zpl@rq1gF|L_l)K0nu0HtmBnkWmhgsV{W5?A4hf@Cn1qlg1yS{i%*GIPc3cJ5NW zxgqZD_S~`h@7JjVFmwU5`9~UUozdp+ zodpnn-(6UkeaJ@jRov>=mI7H|MU5cWSIciLV+F+J^X%N zhNVTVLH0wCQ+NLt>QY!b!b=CT$;xwQ04=?M1AeP!$^Qx-EMBhJG$|`*Sv)bO0udm# zpfMM2x;j^r>x=b855WV%S$N#Io-j)1t2y5DmtA#F-)mx7gM+fSgP2nYp+A z=e~zQ=ic!xo@k96EhDUQff*J2ew>zOshb=Su7r}_(F5l?fySg^j9?22p?2!Y&XBLM&Qf3Xe=P-*ncQa(I3v!o z(=QucSk4Z3HH3L9Q)vP@7tnryImy}pKNb)mcpx3_Ss&iF%0y|eznlo7@o7K_w#x_^ay7r>)1!`kx&${>C^!FJE00fHI%GI0m z3Vcf}82q1v;MHxI-;$1yUvYaYDK^K4cnT0^vAJ6aV}NXmp7nGqEvZry(Suvvye7@I zL=-@jQub72?LTj!5#SZCx4j|+|8Dj-Jg+{9ob{n)JG=!D5Br{c$&NjQm)@DWg3w%v zf7>f`*0Y!Xv!`GCulz&I6@uTM54uS1_E@^pAeUpsQ(vEURuEP33H8TqwF+KF28@oPFQ8^BAJk zUhS&>AcS~~K)Hi2aS7wnIH3n%jfFs)h@&P-_Q63Qgbx4f!C)1xJFV(C-Zo#YPU}N!I&Kij}kwBh> zt0zB06^uJJcY1u(OP29h^_)$l&mSAP#DAEh-VvXAjSNZ{nz|FF@X%mN-j-s^Ch)a( zGg?s6nr26$@GW-ygWRC@&aw$YpZV4HiCOE)-XgcIYx)PDo;8AP3^e>L<2+Rf z0&Wgz9KLRbp5P5UJtE;&%(QSwB(0#OTli6q3$W;6&>QpcFij^!rQj*_@tFDh2$yW! z#!zk3+*K@DHNm(l#;Ek)oD1TU8EnRx zaeLCnS!djbuw1;_Wfjqir_`{0uJ8ow6j-&2)B^K`Ysajhk(-xgR+jz3O5|3iZA;gY zq+9fY?K{TY4|gvn+3xu1A26Fe8c}|@^YIg&6>DmY%r0~NYIAyJYujX-syG{Q;a3-_ z@Z1Et%R<_0XL(uEx$&>W?y+O)zJ#Vkxn1IdwravJxyr6)qwJ^yuDN{n+wN^oWAuF% z{z;x*Ie~3Sp6Z>#SRNPrji~vE>)(L&4nWIe7f#7~o|_fc{Ty{MNJP;w>{N11;lZ^C zS01d&ZkteGrrQCSx~CywVXP_9d3GPEdzJ&L8G*;~*?&G>_@^c>=B`5Xz)rt3*Sl0$ z%ScTj@%7Zj6z|S9UM$SkX8$o7@uo2D0R{2t8E>!3GDV)>jQm?=j})=!_h|VuzZUcc^VSAB@125(sTIy+lNvT}Go*%R z;9u%8e}xWpZ-J#4KE;kPBL+FCJ_d3UQj;K|Se^Qa3;+JuRB z8~LXC(_fMu;6{tA!nMkX0mq;_1Iddc>9wOLJX392 z>wU>Qo*0A8m(5y{3N*K6zr7R|tWTV4pJ!wB1L69`UW%N5d!l51<9I!LT;^IF1Vu^(U{0N+EOQdIV*F)gH_nj&SdWEkzbT;3q5lg)RVoU=}EeGsaAI!{?-n@x z)!#98gT%fJ*h)4!>|4;5yKC*I=Xfh0&Nn{IDH4pqsA|v~mfA&*J$Pm*7$K3j|6l&M zx~SG!U1S?nx};%d?CB8|k6Hrb)H-k<)Kng~TH=u^hdr&Jgq2kf-s@aj(iZw5oSx$T zo)Ps0@uK(?-afY0L`GjGz6`TLjxk7#lv!>#A2;~^O+ypsPPQ4Px;l5z=qV;kgRuo( zLrH#c%_MnNVkSX2qGmC6ejW+kYf{;IZ^OuPh}~|-YS4ypD3R>;a*y*G5hpNjBb(_f z+*D!L85I|!klskNc=@*6^BH^Qr{*7TYm1kL1W>`a|4#Z{oi6j1pnOf^G`6!K#>{<8+kT|5OHyAp$y$zh z-*^%wT%Q0bn_Y{J{Ucn_$~NP7!LK*!o5N#q#tJJ3@u>IYfw8#^Y@8Ub zxE@`~mKHj`6kRGYvv+f2R#&>X&zFq^AvWEaoU|BFzI4v&FTI{xOBVF1>vkYd6WxVu z7OhjuwaP-y&ax-RD|Xqg%Q5e?@t#Ims`U=pP8059H5m0>)t+Z4SNl)$yl^GAp|={O zB3h|7kH=;gGLzgYflk}O#@tGGQt90-+nBf&q6mX^9AC9^Ir;s1GRW~mDgW-nHZHak9j>Tx?b=P{uEj0UP6DeByFdffk zg`v3lz%2Tm{|aBN@5Jz?fE`g7;rg+iBGvM-fI8+O)1dpL@ruz9{265wB2_N+E@rw- zD$q3xpZOo#@$DKm#Vr|$bU0#u`_&vX*TB@E|fB* z*MgZtG%6@bdK3KA1HXk-Z@oLF+Q>%9*RDE7wxHMAXC-2 zB3*a7d@wH`%U~t8!W*`7eIt5&N3d5ydMEk1%X{-dCOEb+yiBuLqeCx-ohYHY{hrr7 zAsXF&P@pyt75(8>{SUA@G(&6D!%yIb`cn{5HNnPRW|_J+^3}e=U1hoftRjiEO)IMW z?>F8@HWB9bunubk>;40A=>%)V!+{pc`wd&psI?HT+IO(=a(^B{lA3hY?K&o#8HJ|A zF}~8KlP@hRYQ)XfU)Sc^6q;`SwP$HdY*Ls8{RULQrVrCL-Eu|4b3+q*)l5UqIezKf?0WLQFR9ss! zdi5NZ@80a}`yXk&om|5||3ap{Dui>C#G~z)TGIBJnWb+fcAh2W)WpM$>?#_e@WSt* zDWjU|blvxPp{>JSPQAZuGxHn^+w^P`eGP}_RFoR3L&d<43I%7;QnbJJDpd!pq5@+B=9SB2jc1T zB65QCr)lhAsa{9)ZbPPu;G@`)N0ow934$}=f{xJ^9-H*fho3$v>8TK%^BOZq5;U-0 ziEvoBm!iT?t^kp(ZH;av)f;E6b#6U_Fu;(fA-qLSA`w&RpR{+GS=!L852d{`ic!Os zb%Ql#w^~%hz_?Jo<_Wen{jj+L;og(|4!(Dt2a7Y$K*Z^1BBp6;gcrP78gmKW&je>g zqIMQS+65zWK}2ojR)YC;N(_rA!GCCdem-36vNY$-iVNP~aV-4#iSs{yvM+EBi66LH z8&O~SsxFkPo|`DCa~NOyBq4h5a|FjisZ^=mlMZLhwC@`S%w%CvzJ6x~Z2WBZ0dU9U z?BxsA+6_JXNjA4XN(61u9m$(j#~;$=pjsqvD!)u zI0GZsXq3)undEpnuN@!>VnF+<$Z@oKALwZQ;MRaKdm2JVo=*T9*03MeXGQ zrOfd#xDn0RkwCm?)7^R8YDU7K8{pKL;K)-g z69bbrP>bre>=Df3pZzv=@Si%Bv@_$Dnmm|TW!$pJ>GplYeBZ)N@ra zE#jeDc+fv~AH(L+by>T)p|~~O^z$+LQ2~2hYmGn=HdZvkB|4Km74uK*_l@?jll8~n z3&?v9&6&Ad{bSpmMrxWg0)Hq!A z&B!Oz8b0aqFYy0&X!U_{ zerLgmY;WItwiTPL9SXK>?>lUcpm4c!ZL}Sqa0!J9m@RSSB%CmO)~da6x8}wdPR}2O z*?e!_za!B2&__a_`K?~wD(ab?;%NQYs?n{h$cSZLBVBNDtS%$993^*8e3)&(ssl5F zUQgXA526*&c0C!<31AMLMJdTfW63%-&jc?FL{ZX=aZ8pJu_=2)MOBI}wbiv&(XAGH zzr3#5W4!z)gJZ)D48E)J(-J+j=_s+7Q>ap~z5bKdyM^iQgG6C{829 zi7H=fS!5$a<)A8GTK2aed|*7NTswB0oqutWF&;yX%S*Qi0JYl3Ox#7iiJ7c)ZI|a=? z<20ZPV9&fOO%a`2L00*;;UZt?9%>F9ZR?sXpXu9Pm( z39LZrE)tZ-j<{v71`^eTGGKk!#=@!Nts=w3z0f4*u=^{XPZz>)h@3 zVXm|Hi-ix{1jmWrb>|C$A!PKlk_;=`pKmf@4^uC$cYGRE?9L)T8hfYI&A;E4|L?)H zV1>v+oWt>>>A&U5tNR|k52D?z_>EQN3VH-&g$hCu?)KObLm$%OL9AhT7Cv$MA$&Wy zkpbR{ou}HBY@6ZLHe_^)w&Z=w9P`#GnqxsdYUA<$iVgof{r9eV)%(_F@c3G6BWulz zb%^4YdR^h``CC4R9ZamTEIYWEd_~n4$b?SIVfv4l%35Jbni=jxwPGc?tq0T4_s93P z9%R@~roZ3+*_b$O`hIb{(Q<+RqirN9xmf8oce?st@Jfa9Q^%19Ky>q<#| z-%lSzfOu&@a*`z;D>$~b*9;}K-Mu---t+0d32+4LRfUI-pe@_1QXNRAhZs7Ic;-9} zMfvqU+511oA^df@E9L$71ay&9&hT_^W0A2ptXln+Jt*d!3RlefA_ev;*8YbQ5aOL3}8jI6!j4&lV_Yrh|+t;M@uFMiX zD^yRvcl(ZowEKew+QsB7PG-DuFWXEo#clVI0_Z{~YngUYpo{IHu&(z$s4Ow1S*pI~ zIB1vI%Z)7S0~>!A09X5FEIBcF*bBruJgkKb4QOt2Wb-u*t(iA}VtC;kuO+mFd>gRh zDj5+yuhfEQ96ia$2Y>PF#t4+rL~6x@@soUJelX4}ymsydiRyyOeK&G-DYt$+FCnuPUu0+&>Xx%+CkvVFLjjH>;MtmS$Tu9M;7(w!8c z@L4GNT=+Be_~WC}g_W1P7OW(L?(VEgOu&wjL-jqNb&YPXe*?cf$W+i@0V)E!{^$r?M&!tD(Q z*sNLih_SF(;{moWEPUxtI_dx$nnhG#;biOqHo-$|Y#JhoFcGYcoM`UX~0TRXt!&FVY;q_c3K6dT(B3yTSGu$^S}ldPt|!o@6GmRNXPkb~{s zK{hrD3ttxFVCxfPjXQyyUDyw%M3x?i1F_kC$$RwVV7yTC7JBqn^wucy_J17TP^`Yob$xnwt){_^`SaoCeS zH8WBr-{BX7{aUxXOarI@pNBW~$ZeNT(6;tEaeX~O=%8#Brr=fkt1+W*CG>w9o_#SJ zCCk5d!ItAp>$H!XdfupLd^z-dGco-LA~<4-i#MR`#wb$A5u(ssD(ZMip_$Nrp3p8y zkdh>*8H^emjEcT3uaqQQ<_$147}eo-glILFiaAoRM@-4GZoM@Mk1mHwHY=!!+$Zt| z%<={#@&;r`5_*mxc8(wnBneq@Ki2Ws6rr8S^0T*+%WK9aox5&;F?rfQ6-+iIGPTt`So!EGDa4 zF`9o_*m(rODM|3<4T!%v`aqIkVlaw4=?GD4E9RUEE ziOvyIm8_Zd31X@EsD`lHL*m;7UG*O6KgC@x9iG9x2JeuX+vaedcDae$sunxURA?8AuCMt75`KHBV=jBiJn@LRA< z5Vqz}P3Rpf|0z2~TJ$B3@m1>xMDkli#%Ty>y$*55r{<9l zBz#7J5GGY7LnM?Q zs-KkC3Ujosl8Wq)u9HtV1P_Nv@Lo}0qrnQ489I5}4_3YfGalX6@=94jeypb`xCJ13 z(B*2|3GdrShKaU8mA7e#B>YuFWU&65*)uLDib`*K!OAB39vK4M4^^qC#?52=TIiZg zUA$_OQ?`H?&p$znQ=XTilwrS3Q=6EeJy))A$qVd_sd;~^Nx?p1n z^8ChLzfC<Qrb0W*t&m_)%0?Q2q{bMu>Z6kFcJ)=xJ|ly%(7Z4tfd@VR4N z#3G9MvB6&FkL~ce?n>o`h~rGnAY{3#rZs9?qa>s&u-rpF>^&$X>Tx10>}sG%S=5&6?T4D^ zvX~CtxjJDxUc1kIDkbcbtyZ?9A>QP-SjIAidXQ?>YzJh9-P|0%U4m)OM%nAFi)q4a zr$<%_=C?kb7Erqt5eYMivPzoHPQ}ER)|RhdklTa%XsZ2OV=;7|?x#BB)68FSTlsiF&PUMIMJO9{-}n(FXdP~s)>8IEVy z2P`!%|2eE!!0Bx+{-c)*V{fhJPZ?(@i#U{MbAwIbf z^oTfS6iRC`$5_6?;!|SRgirU?4L8ls^YuX{J#_!#lzXrKODwGIHsJtUD@n z(n`!e9Vg$ulg-m7tBQU}Nf$#%1jd%NLv4PLqgO(=wx2A2ujl!`L}7$p=I!J1HN_vQ zDE@ktP3A=Pi68!`(hUW4JCpF==r~JV|a&X0TaQ0hYjI_%t$Q>=a zy7P;MSUMf_-eNoxrq-byd21wh)rZL;wqW;Mke@#qoa-j&Bni!7^&*H z8IQ6bhuQaml(AyJlH7>|rjfi(n9iwtq`i9OIL0*Jj_N0Zzuu|$%s8*9Ls9$|BzsX( zi8{KJ3mbltXrZ^f3r_gHNLYgZfj{4;C|V}WuNjXCYiRZ+-(KO z37mb4Ys63OcpET3 z0PB=Zp||^~M+T8(l4{`!28`LFxI6A@e=Y4BzqmV^?}z_1jhH54PNRi8}m5c!O{GnqX`f~mPLo;=488IPwS*$ z1UZ`C(p zxJ~`J^R>3a%D%ofFa=fw)h)~f?OA$j109ypRJXS5!c5`WDKc7`C~nb=6}-X}zS;vg zO&xJLM)rCDSyhhQk=WWjNL%M*!kxJU~`*{{3%dQu3GsOwvA(N6@b zPBfZQ95J-4qru>&3_{#i(_p(c%1OCCT8dHn)UCIe^~DbQsi z60iDw%nsaGm`COojK7Wcnor-^5k-Y7as7RZ4da3Df*v$L)*8k`1<73^SIQPhqQ%6Z9lxhm z)Tz`jbU5CDP|AgFm}}$+h>W4ayTHY1q=#0&KG;r03tjc_Uky`YAgS)uT}rNkTJgN0 zHILo(5A6!(8nVgWL%{RT0oDih<=!P|zQGWinxn zI?u&XQ^pdzPG14l@fyhW=9TH%GJ4UvgCR{knb!1-COU*O)`c~D0*&-AfRXm3tq*vw zYgs5$8FEF!n%AxuC~z72Sdm7#9bgI}Kh8zt?)?zCAqs9R&SVx@+1E{=vV-6;rpVMQ zp(mM**$_SK=yVBKJ%jG@nb^w7vZe868amnmUN1%!hRT%~aQ0nwB#dc%MDO}fF z1qC>@ZDcGuJJEGE@HWN85$*apbe5J5+NuXPDtf!9E9NY?0~^6UVZ&Q)=2##R(X?XD z6qzn0ojBA-&$!zYxraWE;a)T9lF_RZvrWL0qR*O}OqFSOZ_C8Vm|)S|^66B4Us6BU zia=iaBPvn@l;FQ-UuUoabJY>zTL{wx*4gn@$K78Ux4sd2^h1Fh7Z>=A)|WU4=YcH! z!j-1vWfdGJCrodU|5lNYc07E2P3+6# zb@8|G@BH5dT@84;R!>=UDRxh0Um4%f@Ao&J>wS7z3zSv=vmxD-Crka3q7yb#=p3k( zTg>Hx1^19z<=s$+5=aIUh;U9x$ zxfHinw1QU(3V^}ng~-&LmW?c?eW7;7Nl#i(QH@ClGL0 zr^vWSP2NHd$}$d?=rvC z3&V&VY3xu}$jh$xU7T6yDN;~we4sC&jS&<51JhK-3<+q2d7ORFF5?I*q<{DTxliM~ zhW1DL>1yC`S)4MnT!#3s-H0eE@U{-!=(D zRK1s7HgM<^gZ`;8 ztZYmldhVzTUokenSKC*)PU69eJrJ!N=EdC)oX@z0+Y9)41S_ziM}oA2@`(*!^GF`8 z;LT*k6K4v@@Q>^*MhA=Gd;a=cOcNaK6i_m2P@SWBZDqqROnvr1_tT);g7W0_S4%sZ zv}a`wlR`sso0zd{6eXk*h!sdmrbE*zJ539WvQsbdjK1;hEv_;e1JaG$MsCIngl8*y zruY;tZOuGdfGXt0!RvB17_EFu{(je@kt+w8I(k0usDy0ltKRhoNYMw(b&DGf-G^hW zS_fZCuMF}~Q~dSoNV{x7nBZDH($Ezlj=8CGXw?S1%QMZ4i}S*)$K|aM8EZvdxzchF z$MzKLMo`CvFCq>OIU;o2;=Y{o*0fBmpCAZepbM~~ZEF;7o z0IYdF>O8madcaQl1M2c@qTju0XNf^Ihi_4N6dFn*Lai?G zhTMAiU6OfDFE3Y}i zl+QV>OJ|1P+NM5j)3FB(h3aW9Qk`0B#>4DKIx^z6It0$7=w&Xshrz>q6#?Vk3R`0E zv|2O6OR=R^HD0PYuRzuIaBil0v8BQ~_lJ+5D>vw_@z25{ z%g{W#CdSsH8hJzPv>PO$E~ckGb6eodLJ=mQC1m~vN!^b={dHI8Zm4(@EKEBOZIRu! z)A2pt{;>$Figp~s*;mvaQ){LMfGO6zP#_EUYJ0Mfh91w-Nv4{;pSiNwbq6Xwm=(S&T9q|DkjrwnGKBb+5mpFuP%hQBp;G+q^#mJ9iwy-EEkyFJRdP^t0rPhq zbwy7bs%*<_;*vFFPH%QD(tF$-vUUdrC}Lg~lersN4UOuIr7-xAG?M{oxPgtKZ{2fX zaH)`VowA7^4k0yP|Gi@Go|BK zVsrZ#C)#fc((P2f7jq0}(;>?ApiUeEhPCK?-BEkG`y`t&mPfkd5XwE^vN~q2eyb+7 zYxX0wrG*{+umsI|nC&#>EO5*BRm1{*-L1CrFZF?wbny2df?iI(2KH9!>b$bDUuNpO z4*XHcTV@v&`jK3+fZoKHAZoBl(3Rd7)R9&3!=w_PfzObz_9In1v@o*xWju;Lh7OZn zvc(|&J(>AJQKyWROJ8cB6w_XiG=6hlepiBqW4mWKrxA+r^CrNfsJ!)shnSi=NH zy+GI~gzZMHBT4B-o3N#NGZqzlY~>R>g(ur=cXv?lIL08(sN3`tNW?kDlBT9=%pl#4 z;ln3r2X9Reb=t#g?>~fT>-78k_T|_^=`*Ttb=zJNB$15+gDt^R0u00auv?)Jon^#P zhURb+`mi34DXkHv^rbI{CLc2;zF7vPqdMu6Jg?6CD_V9!8bs)u=tHPzzfZKQsMFuX z#Ok)f#$eRZa&kHYx9g2fX26+28@tuaYe6O0 zyR=u+xL;hMs6}vBU{K?PLu?k$2%Q3ZWkR3CQ(XoW_iLS8aPcco zyin?J7-5(^O;1Ci-RQ^1`^@~q=J{x`R=X5oNLbj~ZsW%J73fgSdu_V~Ouhnnhul=( zo5Fd}GVwsWet(PE zOr@7F+9b)q6PH2?-H0ya(F|fP16*Vke~=Ozfd{e3!*uMopV6rtGvpB%W4n~n25B6z z!G?v7rd&0Lp|AJi8?>pEXW6t6lD0t!Mpm)H9u;(SYxm7y6A5N8T(L9Qzk2RxSQ{VZ zZgu$1Ad@_@GAE$WXwQXW1g}o5v<=za*DYu~$q=4s!@|hiDJT4pTU7 zL@9!^Zru+AI2Qa0nBPxBjHKowb?7t!95$!D`yz^mlK&ido+AX(;vOF#){ln_|6(bw zyWU0&BXJevZs9E%PnUMesoH;p+OJ|9`KS$hJi9C2_x8GzH9*Y!%n-9!=(xH7>X({~ zlmNs3n*hv0+*`sEvu(B=3SGA=&dPw<2_#WIss%6KZ6ZrC0m!>!Q1I{<$mmdzkLF{T z@0hET!4S6N97@!URe<5KhHyj1(>2w%urSf&Fx9MUgW2oVMM^H((ZS-sn6#v8?yr}` zxAe?|85~_7phsyP2ME~@=ZS8*OtUqynND$k%;m~1@O1ENnu-K5n|ph;(CSnTSfbwd z&zI5+S2y(9|cO`B;c-wkmD>QKnyZ&V0 z2tzlRmS3vJOUc~|Q&(&l5~lEP{f5ZDI&8$O;k?bE|Y^Z;0{ZsDA;Og7-DtK z>Lu#ZZ)WL}u2k`5)=M(I6Ik@-Lh{xM6eT~+^mN~%4;7$G(1|TZ->(1Y&WOn`^_w$yizD~k9!{MI zGrcvu6HGwY@1W{+hNu(0I^^%58+u&#Th{OyS|BoUY=X9Z$W(m8y&pZZG_6ItR($-m z`EZNd)DRhtlE3D7Fd4nq+k{hsmg}6_Mtoh)dH{HAytaVJMLCVwKfx7>{?_|6RPh7> zv%{VkTRGZIT_D>*tEb{3s%*+a&{2y*TIk&5t5W0i;HPEu?|`U4Dn1(pJO3E{`$KPg zIf{@oUQMP=H&UdDz<#P{@<(c)+Tl4`uf%GngQ<;TBq~0CxjF*Q6WM^CFM-UmQ$H`P zA4~7Z1^JV=hsz*?h0A$YVYilSb^g%G#j^W0nlh>xT6?%cMbtSA-idvF3F)qKdCT`D zHQMhXH+@g}WPs3R*m{Q1eD0n3|1L7Iro+$KrK8;scN%+Y|LD;^>1(<(~*k z#@66Dt)yiDKe|z4J9s+;5QxK}7A#RX>fx|wE3fQCYu;45Uy{0{Hd&|OSPXxp(#GtR zQHHLGrb!ELK6EGCyrfI;#PK@Q<6c+&vohuLJg!m6;qTsJx)9UjE`mq z1uEHe-3GUeK6yBCjEifjp&DTGU1i7UPVGZ!k={)~VH==0>+?j<$aM*frk*3Pf$T|M zdJhSE+<5O>Y-u*p|7;!YMxzZHBO&SaS=1|J7$LrSn z8kz5_Hp>RM^7wUo=9mj6x#xR9T9!sgap`6q09QjD(&s`O3=4!>^$uy_gk5W}rhZ@h zT5a3!;5Qu|8)ZR|z9}1T^whEWEXYa?6j_oWn>1IK;YZEP8;vx>z@a+Hr!Ye}dir_# zz4q~Uy>myLloV&Q5-O%H)Z&!|;NXV^aB%uT{A4UvCsh-l*}a$y=2gXP2E#QpNUcpl zmrnEnd^C`GG2vtrkxaf8-Qz@$`bhYnYRR?<&x+@gDC)KO>PF)^x8cAL7N?uV~xeKm2MoHVs zud6ZqI?r#Z3hlm9Ox&^>&eAyTsVg&sQ%_DEXAt;N_`Z>y-tMU3?K6 zmJ78|qzYU%Fm+~p9ho~P_0}El2OAd@ySay`tQ7PKIp;n`9*8+RdAF}d?iBbTwBL6! zbxwEKamOU~2r8}9TDerzO|}w{m<>LlmC%6B8-*)1c!*ZC?c7+X9ZbPJ9uP*<7dgC| zfJZj-qE{OV>tZ!GlJOr(ZQ-IhmUFJ*T_IuG{zNbhm9*?0G2YSOs8qm$%@J zEBVe6I;m8zhNSP`o>->$s^}R7Sw&UYwZ?P3`@CxZDBzT#O5nII;BKsu>zlzW34Ps6 zQ}I5R_SNQX4>eFM^-fo5Bz_oxLQ|Sfw(`18F;Fo+m+Py&m zQmHUf~w>gltw-rV!3lFNmp93?%X;8(bLnkCXWg)e){B`TcRC=8Lv zUhj(@`?e})GVdScSPHhcwUti6b5SOrG&-f&S8;_^ngxtZwYCS#PakJD2dlL61b>cB{ zTe&Xg1LsweM`Nb$$kCdl&PorX`GM#lDYbkPT}8Q5w}1BVwt>d^;=p4K?@cXT)u6RE z9u4|3jX#LX%Q>&c7u-eer0c$~)vqgP$e4#$o%VIxX#U=Iydon$-6?Y5o#5D{Ho0v^ zWaUT9ZO6-ZUo4aqn_sv_@l6l5*dmP}lB`|oq1}d}52Z_~!{Hl~yIbZ_Wny{pr@2uN zgFcr(rS95|UMY-FG`ysmn9CNtA{%Bm=%x9_Yg9GK)eAGV(ziMi>gtt>oyDwTp;Pi# zlJl>?KRat2S}5)Z_c89jQ+;l2fY*2{R#lq@rX;v7yt!B0$>lY5lEyZc{_PRyc=}FZ zG5q1$E_xE+!}Z{cJ{eBbFV-MLiC9brJ#AV*nES7V`%|M!wXYgCb5E5GRzn6Z1aJ5*&qnV^x=)&f`TCahNDrF?Y>!6c^Dc^P z)$*F!L_Zlreg+&1G;u~Ib$Z`A$Tu5%ke9kDE|T=SnOFw6bpsDX*H+xv5pnG?=~Y$& z@bS7ro-d&Rz>ja%WDjS3+*mv=;)m?GgcuWi-$&G#^9z4McvGx6^&1K|sE#)Z_Ig8^ zKJoaI|2@H9DbHxfy{DI~I2*ofUfC-gUij8^efb?xtJO~U)CM>@omQz55OB>Fk!wvI z7d?EM)^=!IpBgM>ciF!<^|)ecdNqGarCn*3X_7#kFek``2rWVY!`y|a22+9qFJf5A z&FWg1W8#l($;Zh5ia1jx@jZD*t+nQD*e7e~*G-g|L*==)p6fm!hnzh0`fexDYf zNqBxC?ePol(_gN0FaLTjRrQg(;sQhB#L?R?|K|UAg8S)puJMx-aj@6=2i`w^c}UIT z<1y7Q`W%1B2>89P4Coq<&+R|>jLLsR9b@GW|EGWOKl&9lYO<#o`stA8>#68{XC$`hwMwwxxzcn%`0~9-p`lOg z#!s&aKS8YTJEPeCGYafGHik}nU+EN=O*yX?z^tE{jKEqx0pXQEItVy*iw7SFW99#MH8n+2lky)c4l9fd-dP;p6p1iAx@lhS}o^en}6geRsEgpKQc%BzD`o%u)kx*@2{lk{z6du=ddureLYGiYTsSgeZw@ZM|pnu z@2T3MY2V;Mz5R!r-6A4McjWIZdHUbZ`5y_G;=cb9llJ%Uj{oooN-ZrT@Lx3odSHLE z-uy$I|0*2}-FCm-%3-qzvttA?7Lv5{{#2_*)#iZ&(ND^xW@h? z4Cyk|8Yj!JaeD8^|6a`=?5`*AKl9ucx)#Md@Mr0!*zCUy;`{GO;{M!~`;%+-SBA8Y z6Nh!sqhJKVy=c(hKINaGwErGn+J9c~wg8IG_UGYZ1V4$3_-D0;?;mcg09r2r?Q@jC z|I36PGy;|G{2z6h`kzbs_u0dmdtcwA{|`=Bu)hIZf07%2hapD(pTi2geP73N*x!R- z&-aap#)y5%efw++>zt-x%E2sU0U@1fuPs6FZchTcjMpYg!R&;61FJ@|ET(e|69oaoh#7@9MbKY@DtcS zYs`P;v&MbMyY)2g%u)6I?PWRBHWv{h``-@LjsKA_t3l7~g5@8v-dyC|j6Uh zSn})a>zh-a00LE1DA>*GpFOUk+|GJRryOe=x~`TDx9KVHJ?dV9Mm-Zh#pqQOYQJVJ zZOwWF?5#+GyuTyB71Z%#OS|In{P_XF1sHwKNUJ8oLBfhjqk8alARKmc0kGLN<_3Gq zS=^JeiXeYaaoXd=tBvgHDCe^oO)oFm4{Xg|>e}gEv+3Fbb?)-d#eY>+^-@eR6r9)& z3|{yt$)ysvGt`==1e$2uuyY^jaarAIYvEUkj8vu8n~WrJMdzmHvN1H|Q+ZmAN{Z2DZL)j;4_^7qw8z8;1>pC&N-npIbHsXg$R}^-3Jp7H;8V>A zAkeTq&QI-^LvPw1VTo6v*;p-DhR{vZ=+dC@nW<-H$*L?roCH`@mlvy zIjtf3N_5@k8zUJPmjOz{?Ml`gusfoi3peg$kki*&4(fU33k-nMeKJ-ybL>v~^!hE| zl!E74mS*Rj=VHdW8EV|E!^ZsZJ~Ob>=2xno00?gJhWlM#G7M@eYU>MfYeHTY#`?$o zG}H;0$z0RI);oHyyb{3sb$tHc;@JO7;_Lrc4JOweH9ec#rw1atXHB%Oxv+cO*#5EtIVHtb2_0E#TY1OTM445+7kz!!le>-Hm+mOdmsVve#C0?J;Ib)|6EwLsJPeHb7~`?FrnMU@cf=zGg#!DD6ABKNNSO@`_Mfa z)X^rEgM9TAa>j7X;K;>T`c;L3!Ha}dqdSMM9-S~r-~kw>zY+67B$19 zLkV76!CLO<9-KU1L)$myk?jL@&fqzz4qSN4Fy+mY!!)YUgkgGBxzC`M7aB-5XkR6~ zgsR&;ye-<>Ly&dBf7`j(-6s=~1T8p^$(gBD%;>g@+x;CmE9!zR01^oI&y&)M=IM>k zzxB<|BU?slg85yQi4Jxf* zjAT@@qC&1=?*&aNY}@ghdLN;wa7E_kQPs)>lei_*H5)Y46^PFo{!m@1>qEF%KDn$Z z@fy0`e16tL5q#5z+JkI(XG!7>fO1g+gZG|lrEc|b&wgsoX^_n5krCk)efmfv@x&Jd zKxHXYNBn;331`Abg>Ds;9^A&Ftj1r+q@%-bcF4bg$|nWES)M7h&4YYEip;(q2g&CR z?9|Z@0X%{5z5LQ&vOqbEXzUO9XMLUR0}X?2JF9Un18vtE36|zm&{u5-=~4cU0fW%> zAUcgMcwcmiB07W@z?&vjs?4iaeA8qy>2ulc!yV(&2hCg5 z?$W&twWgjYV+wM`npvF%9?jBc3@NSGec-&VrIg|M$UZmI>N_nxIE*Oe>kXMa~@I+|4m?2Y(JsY5aBhN z%+}Ojq{vHWqFNMY4qv;oWd|{iiqxCuf_Z+NP|*`p&I&&qu_fHmTI~N(WOOH|yAb3% zx$OI_JAck?G{hr;q12;DzviVF+Hz*X1fUKT>`(@o?Dkx4*@io|)Y6er>xVn^jh?B? zsl?3J2)Eyf<58AIzM=Fv)pk{qC>5t zQp9N!2SSct@p?2Trm5S#o~j|#lZI-oXkT}UE3iD<-m01j&Roz4E^+Mf&0Mgav!35R z(qW~^IM$I-rV>-2A;y&3=~zFBVZNAkM|qybYY;=)uapX34C$%y(eCgOH=uzx`9(Uy zFjpFX_U|@0?tw%SouYhHeL%aREu(GgJ#I78+vBOnXPFDzzXb_zpj+ZX?Pze1ovDUM z0m|bn^R*Lvh2$NwYMPeIhf(og$PodBMLX^t?oe@1jRE;;)4A2)&IUcq+1JFjjwGwQvvEja1pHl*43$|-g>_&!?G%!RelpCb{ePcuYp4xZCmvRXW< z+v#(Wl0983_|sRC9d=x)nF;1)?|`*T8}BhMDV4p-K0+NzE_$_wUSAc7#~G%3$2h6C zt)HF*%><^*+Q<15c);3~&wg&#YS?Q!@7cw16JUu>;K?hxmnMDa9U|HD+uU(z@Sc^( zgowlJ_JIzPZ%Be4U7fd2U|Sy$CP-F_12#IHC7tSkM#cE|Z6#Fbi=b4U3Ha^9M6;RQ zbqPt?IIw>EB@yT{X9vIYLRpKTlHb7%edO+=LpY3*OY!X z`D{bi9&U4N3+-`j*Q|wZPY6$GQ3C=MJ)T1!3w`rGpnC|#>F`2o&tO|@Pd=t0ww}9) z^>HlR;W?)Sccu67te5B}R0NC*_kwxY>OLCBPI?7xio%8Ky|VhP*G!%MS~G}!EIG+3 z9_bK?ZWj1$`WyY*q1k;+@(R}RET*NT{IFV+{kC*Z(|K+7OVd|}rd_rnYaFkUgIBPJ zNs&B16av{?9q;OPSH12GUS{L(_i!wDpiCjq*6hJh<>bk4z;2xhKq??$6_+)RY9o9g zOg6R|t&Sr+nG|`>m&FvqxH~~<>Ly&js%=e6uDzR23>b zHS7HB^AEXk9eEprv@uZ`h~nyXiAxI6niZz%XhE(I->f@(MU3+WR+}vsp5B4%#=QX? zmvxk&Pltj>+M&b8{)CfrBV z3QLwA-;GGwM`&`xD)RBgusQ_TJ!hkt3?anKHcZ|uDl4=FuU8bSv&rvU3 zT%xRq%JrDmH$gdRO2@oR7E~xPPwyR$?%Qavjs-+_hFW0xx|J*3zU#pYUK{o~RNRp& z%6$!;jk@v2q|Bw4SHKNZf`r~!>7gf2R)?I+J9O;N=MvT$)kbM*z#WliFFO2J)DH$t zPR~C~62hB`Xl_fR|rgP5HTa0dI86xxA<4xdtwjygR@}nAMAq?u_;MVb8ne_Y^CU0+HZn%{WoP z(8Kea_bc4Jtuq5?7xzG!4d#;%vC8v|ir`WY6{BJ#*mrjBU^I!i=DBGvQ!wM!uD0&{ zmgtuvm!9^)7Nw*#{rxN`kbwN~G2PVo?R8tZ`U!X9>oMSOsjkqycdNRU8EH9nrk%D) zEg#gE4-3smT>Ea0f%ejlH#FL8kKT?9c-z{YlNBupe4Uv#UhC7+{>C%%&@Gp{0sNxW z7oR819&RJRPMGXU5NOlh*l4OQ#V1$&q$;@Cv-NuzzK>+|%kiU@rgL;)VQ7;MoS|3vo!wYTlxZ&u}h>(`NW>5A5zVEq$}sEgfh&MQ)+lkz;A9o6^vCFH+tD0Y#4RU6RO}{o>hC3RF!%rRc3<7*RrTy@y!JQ z&vtCg%Dt7edI8g{cd_zP=moGI+~L!O!)b2obIGcP364!uPvpkU|KPp!`E20uA_<*R z=~qB6T&zyJU7Q=wy(S&4Jd`s>EFM&Gg*V+4Qp}4-kaN=eg5OFL^BA6Y@jTATCL7#a zlR=F!lD>gvTJIgVY=1wV8oC8aSgAOs%#Z%sb_^7+(sz+h_-TEB8?EI@;y19ee!uw7 zxwenJYv$kGl=gV*?&y=3qqTgfS#2Mp_^Lt;ne~)xaBl$i-rp2XC zq)P<9+p;w(7MT6y)S7_!>$h5hKrN4hAKu(-dXZlBld+XUUKe?@RpfDl{TAn2!TVh% zn1RqgzDs&4k^KxKOUFVd=NVJ-S!t^$bvDB)p83^#;NQQwSNdDwFg%uxnw0U5=Z2J8 zaW3omPQ1%Q&%S5+=bBwg&A0JxFZokv&TvvEI&+q}-Vo_DrIM)Jec^-Z1DkMq3d%=6XO zGAes~B=$t+*@<{Fv^lXSJw5dcn*rP;li}iC$oek?`qsp^2hbX4Xd7N=!!i@`q)U2$ zTZ7Sat1pb++`QuI_4&e*_1#GRp}No=ou!{gO6wOCwSZ(_6cU{-!0lc11XFnU?<`P|AQt+5j(Ya%*OB{y<@!Tj4{UP(0T zs$RcPOPI${e3<{L^=2DAF+cAD&Mi%dM4IPV=|67OWx?9BkaAGFt&)f@XHJ`Q**s?t zdR6U1#BAn#o3{siiNQxG1Mo4?Y9Cn>A6y6T0NWala_vDcOLR0Z%hX$-rOOf}8_q5U zZoO@0F=)tL0XyCY`ggy!bz3imcb3x}FMoo3>`rUvI~O`V6LZ=JbW7WrmogGpevNt9 zzqpJwjwy;ES=X|>!V+t0fm(mbQ-z6PhJJBJJ*yKOZR}xUX(q+p3`hTxYVc_UK zL&>I*M~+`2e2k`A{X;^q2+)L&osxfm?5(Pfh|xB!f%!4!4^c~w zbBj4meK~0YmGq5yf&ffA(sqrHpI6@Z<^A5fW8)d#9!YmW$uFB~toD9vM5sz@8!uqp}Rs{pR zG%I8wFbFt{;(9(D|_#e z{OPt7vj6rtmyv=6@+VeL0vO4(nY^DIMeIr$6)5*+w4F1@Z}n z$SnWuH^4levlZ_}4%DAj2gzR8Q&Wo4o&j=;8Cx(^;H)AyuXh`nS?ro~o|#~i>jTkA zHC|=hu#@@oZ@1zzrKR2#|~tGs6TmH!c7T6Rc^R16gB{l`O^7Q;%F!_4K! zma=z9o5^hCYU~Ox`@b8uw|H*hkc7ID0LcQm=${ZBBEtaJ7&MWPNx;LoHU`k}IKhvJ z|4f?qDTj4R?aR_d682y5<15rjxG5M+7`63nR#;tn30fh7+arK9YB*>QCv7bK9)evmv^4QsPA_mMVK& zdxQXB&JyrM@o_?LeR%@dC-cx z*456#f_!K6qIkxDJu+|dF_YZTJKEq>ntI2;2_9x01f-p` zu~I@(vdzu$ee0kgSR>pOOG8aY3eJXiYe1uYLB>s!yV)C{IIJ4Jf7t&0!t51kF^}2c5-V$bkc&PqJ4eC8AXVOj#raoqBP}-h(*3cq z&7!^^8R7)XA13Q5STHTMyGbiZ^Zh!RoD)(HU~I8zpn_YftH(38RL^VclB{YB7u?ma z|Au>mj7P{|g2jS0wJ(`$a@kiEn?owAl=K_cnac7Wsc;{)u-eEjORFC<@3VO8v-2DO zFbOK}Bq>c5Y#J=j6k@g^&S`%NdjM81Z!OPc1|^0bJT1h(HuKXSV7_?;7b}-AtccB< zc}?QU>fg)EKR)&e`HX?&TB82qW~+X__s5m`X>bfba#hGE752mjt(e*e$N2(WLz0YJ zhLw-re5;!`w{X0ftbN8*{dZ8n={}#TZPqwX^ze>5LR?h7lZQw~VfPd?`9 z&fUneZ_!8)HT+)pz@H*tpRT_>8}|yZHgrK(u`B4OG|+~PEI$#fxlfzHFenzP)g13u zdrib3%LADYx`lAWgimeCuH%fj-t0wEgsz?$iM`p2PC#MDKjE5r5mT_DSyJ$Gl8zDS zYGnInFTn$G1J&*{ERuS9ThsnmnYq1Kt9sff<;~ug)sYKN?NFm4opysgtX8K{k#TVN zpehIu25q(+7kq8ACyz9yeV46{FpIzA35aG3N+ydt?SR*=xqO3#eA?KJ~K# zryX|80P{291Es63CT&c+YG{)^U2JFtsgR$Y>d1vliOSKFpgTG=uy8x(T07%Y(6kG^8rug-cBGkz6YlVw7UKH`yhCv^|)nuwHEV zfz|GOTcm@5CIXvHTf<_;s|IVTW*Qh3n|rWlMr)>fi&)zqU9UPVi+nMJ)t+s0xOQ7S z$v6Tl;)ML(s^0;gUU>c9H|@C6 z3SP2WJvnu!unc{A0gOQ&1y|ogW;Pky>whRGrL=j(h@Rxnukl<2$Apzms^2+PtO@yn zfIi9row(@^q4f^k2u54&-8i>l+h;J0ics}xbZ4J3bLf|!wh9%b!Uv5%3k%b4U_H84 zV4DMCN)ChpRa`icHuI&@R`_4_>5ru_96|q&@q|OPcBg}V zfb**Z4mJyHUW#WpxCB)F}|W^bpFyM zv3Hmtp|N)q_I`eLi7~hzJ?L5l73yJD?102tE8BRB_yv{6S%=z8kwojCXvSK1uJZI& zdz?(!n?cdIYyb_%p{)(XSzFtt)~KzaE9}j7(JeTuRBdyLb*lEL6Cf?J z?U30yU`f1+DX1GXD{>V+h?pJUQwSN7X%@SZ4trYE1F90qoyv5-gR`-___>9h)Foh;gnqgP6D;sV#CCof6 zN-Xz86K|fJXF=(F{j=4>D3y1>xLQuGgjwPBYt8t^KirPZ5ssAhGe zf0Nlhps7k~Mnl`rZ3Xypp<@JqIUBbq_Px~JtvcN7w(Mv~S^djp1HVj7c8BMaU4QYt zL<5kxFdMV}*wauwG#B*x`HShR#?J||zaLBU@=8lDHd5;?rKiuRNRz3(c+nvHNv0v` zabpgyVb&v7Q!!mmgCzkmI9bk%I- zJuTEX3A!o}(|y!@@kwxHH6-jCcB0~;R#T%LubwWTce8qGc`MzT;7}2<}gJT;Qqv>O>myRX7wp_hx@PvFsz%Lpt;} zeSf07ZPnLC@oht)|C`n0E3+8z#3onsdtiRt&DLDj&06A>+}10(66}R!_M>f^eQzI_ z8H^ica?re-Rv{G*XzLG$Zj#~Kl9G0>HRw&vuOwgg%fZ}GwCv0Xt{^e-w?S~t!`0Vp zS4^4@u9}OLO9u=!@8ZvhLr6yn*0%4sYqNauLQ)jNlKiGkYg2frZXXYb5xX3Ioxq`6o(j2*PibhpiIxF%&`NB^O9^(qO;ALGB#BZ&=^$99fDm zw4)A`zOWRJLQlgS-sk=~TwNlQPi!Whi`Nwo&2!68LIu_mSL};wZk{NP%R+nJD^YXe%la?`$PJ7NZKj-CNV!r$ zO@wgGPn=TFc!lWB+zjb_wNiDUZwiZj*c4XAdr;ueZZB_m_`&|i-1P9v-{mIp&dPc- zH#uF1#`X&6TO+|cFDIY z&$*l^X&k6?*bWl~-s;G! z!j6Bd!iwfsVcoNVJ#Y&R>t!n4hZb@gKD$hbs2pNzh;sl`vy>Aoe_CAX#=9!SfF0+R;5-%0>jmw;Fm0&N73(}XmQh!c${$at zd!qX(in5lDogfz`)>a;6E1`-y2|;=tW!cfl6J&*8z<{IGLW)g11tYx+*z`qkY1{bGwiHK93lo@RM6`Wn)h5xw zOYc+N&jal_k5clbWH?Ekhc79*TRnC`-2*sftDr*K1;Z@aF%O&>{&P6OTSNG27I)b_ zz2ZD0RYfS_VPJ1jHKWY8Y$Jscr^DCzPwq8TaQxvL+r>PUS#+Y_=<>?tvoc9AonM!{ zI8j;nX7?K}f=yz?%i1fJ{mfgtRji#t;A3-t;d9PfHYKWMV*Oo^9al+2DT1mjmzM+j zX!&I*S4Zv*&-}|!j^)u%=giw@oeeYCp`4HRjk-->kFvR#4&93v_GODu1>?hByRx~s zq|F)H9GprSPBB)MW{FLXt0w1*G{EVKa+qXonk-&x{^8o`L3!)KLHV06$XMww9dtM`cm5Dco&T7Phmqa!PXF~iW8QacB@xuFQ~%4_ zN4YEBY-vqh66i+YHy*Gl3%fHY+_s_1cjlfEq57dAe6~>!=GrYi?+TA#L|j-E!fYe_ z5y7>L9r#DzggX5OtoDoUd`shKMl(1c<%)Dl@mmJFcr>4n|8U#S*IW1tfYg_IUOJAT zmnm)ZAXFW(BPb;a>Z&pu0viJWepQi*v$=vn-4_in~P^2+Z9tajcJeve=F2WjC{9yLf{#JaFgN zvK1lXDi0-7=?=gv+`7dFe1MClug=%MzS%&={AE7#E#;Tp)iz)s$|%Tgc@_L_ntMNf zEEYfwVIHDMu@#PG8sQYP6~;iE>yD6%ef5xB<`E>)To}{rTX(cn-B<4!$28J4X3p&_ znwoFf@G<~N)0?m3ctRtR+L@c@a**r18Pet1R zceAdeqE@GR7pbhF0ugIIP_uu|(Lxsv@S=RUU`*NM((SaO-sMm~Lm5EE`3!R?y^yb0 zK7?HM|8_L~q<4MV5!}x>h#eLCvSMNS{o2arF{XZ~w(Z#&XlBx)I*7ByD!}>9XCY^N z|JzAZxocNk*pKVgEBY~XNA1zb*V-MBlX-xX2`=fF2W;D!U)mqA)(a(0e91Q_b)K@3 ze{t!woKw$cJdxg+>W~d8I~wHn;v4~&9VJgvEO00YIRc~229W|*Pawr%F-OUBjP+8B zrYr!5n4_dCwFTC7T)K#N#ksmR7hV)Tenfug}}woTNYxK&ljXT_|E}cB@dIChmh)A< z8YMBShr$vU*3|2ZG1R0mqvR1^Co?m)x$xU@J^I#fn=Dqn-T~F`;t6+$vHAc5T~aX@ zFbh*5Kcs`W>iY_5wF9_7%+|Wg9{t@nTH)HQqJeT{Q-t}K&Ukp%Y|~jgxC`XQqBhzb)8Lvib9e? znTMed-p1cWUe}}-7Cq=lJjU~Q2Z{uqh1$_C5q4y4dX{!Er(1IGW+fpK-PO9Owb)3xh(C=L2A<>tTR{|sW9!^;1A^t`G)Q#M`SVDws8Pwc+ zTztMepw;}eMHVGkMhM99V7z4P0%mOFZX*K9NDDXRrH{-@<>82@3!7S{gSnf3#o0nq zk4>HeI=kKk+*BJa>=KsNkC5s(Wu0vrI0|2Zk|8=Qm>!;beAmjXj}8MhnH+2Fi}R<5IJf)R`dy6Kh-aD+ zUs>i**TmDbP+NO*3qAmp^EUm?lJ8!h|B5-eQu6wzG5BK_EpgcRElkXu*6Y)m3-zVU zxEV@l&f)XMfQjpt>if4m_s`EBT~oh>4|<9_%6DjBqt2V&kz6TbLVw?qnZ(YzZX5ix z6auRayuGGxhYuJ2AIUT&Z?Nc*F@YdJ{Bq z!BLey!T=w~r>{UqVWv5ygbDc#4M=El3*LW=a)^j?xOJKQ9$vQY9cvy*awMtYNtcx_ z#Hub_JW%|?1@&N#StoQN8!#P^I^4^?O^d072_w>HRKe-|LIy|V+fLdp6pZytq_Cx@F)|7#9{N0yh z2Nv6kGkivb&!XjHsO205HvNvU+8%Si>^=9dGnUa#VZ?o&+D0El(-C9iFP995p3}F^xNtzRgnsfu*9B6*V6~CThLe7j9X?s=+}Ghpw6ScvWxmc(A)@A_8l%T z#?f90o1-Rh`7u~ym%6_E?4y&WoW~cAPKT(YJuLM$WNY0ofJb^6ZOm*lYz70KJxB zpFkO#I5iaV84OjIfZ#N%<(8RN4YL%?qgv&*JjwLE!KjHU(kpUIIX;FEXT~^y zWCqua-OT?!zV993_+Bey=1+v~H#&*VrBDQtW;pT)k&sFKoyTb@-96K%lNTOU2`n?`r960Xv32}R# zTdRVQVdt{kS{q*DzBi4qFR~wFx`uqDUZMsx58j(xeK#kXtIeYw=9;_yerwN)J1he8 zK+SQYYd+$`dKo2GfA_ZUC5rD7(3-kU=t*+ey<|>}?gE;uUgdnnc{< z!_G1nc|1xRlC(K5j(n2OHbKg@dn;KYRS|VetkQkMIu~wGuVTl4MqIcK>fV+2gzYMH zEurL^X|E(VdEFJ^vs7Kfx83jN_cXC8_p01boV8?x ze~@*0v6Yok? z6OOy&ky*iRq7;%2{nSpJy7CoYOgqd|7L13$q*$TBi{7Rv<=7R(LY-oXAI+wY9o-q} zghSpTYyLzPi5PBkDzp$5OK3-)jTN3V$z<+`J{3S2&B1HWEb>p-C6@21#;+XR*$HaZ}=?tE{QR4RWoN>V5djc zPIz0s!q~%7+*HzXsW5F@fTX8+eIZ{VdHkUEGYe)gfMGh@Wt`?;d8&=9J38S5pr7w5 z3O`9JZ)=YVp{D7Aoi9^bY8f<4igX{5^4DSSW0>zxq7(LKphv9G^yBG!`BZZ`AAKs?|DU+p?*2;GT5d(3n+a{g0H_TETKVPL$W7 zKs4b=m)A?K6kumcfX1z4C)-z)G2cPM#f?WN?^esUb@{h^I#sKa;KpO%zr*ut%oNi< z`b%VvfaT!HGK9v_axi5TvT9>FD29dd*F#1)dzXPoX5t zzz=$HqIj&(wtPvY*`_Lh7!NK;HywV1h7&J~=ZkC^u(TfXPFO*DOq{_tQ*M$r+M-s- zF-3zt-O(%8GKa7Y81p+1A9CQP8;En_98TXqp#i=<9S~5|HLCkoJ|_Nx3}7N{kb!!W z%D-hSQE1uopnuOpCCof&9K*m-l#T>^IC6fg#yOazGWSqXqUjFOnXXhV=Px ziZR!NbD)exkFa*;VY~XG9eEH17{CQi{3TDcUOb9d_9ftDGM%CXAri}crj+wy()?7_AcKL$?)`>iE43Stw<3afX`Oco)c$7FH+xy;DoAY9ys_Z;EOxyWSuj-Jd zr9T(*gV+wAfAX*W#Y;t~f@Zhyi}I*UrVaMV@6z3PIaxmreSzT~cqBKT{FtJulxunB z{|hDy-83f;`XzlM=-cs0O;i)PS!1cDiWb?yGwc%2Fe&)bye|{Ugg&bRI=5oz$?|>tybvFP(H|){Y46YSIZx+4xG`{P)<;SmX25RN)qV z6?Y$TG>`CKatA-MpMJ?cKrY({4{l`sMPsize3Hg*{3hxa&whnZp0wU;El6uV6Qv`oJ2$JKi;%@oyzOiB0KlKP@aSIV05nd&2cgPhF|8V-H6)(`p>lhOJhh% zirDuDmR{FG9)}0{!batE?HIBcB@7qsc4Z0dEm3t$t+=h4C;?V_D;_64JOedl{O6iv zaK(aDgaQc#NZ_a&pcDAaJ|-o0;q*vpfr{&G0lOZC(A(NJG zSa*gNeCSux0gO^2i^Ss-Cm?*CP!o<_5HH3*$klp#r zDSbjWkqi&j8o0WC&r{c6F&ro0NfL0WzG%(;XR&32wv5p+?{BRctF>P)L)*I+?c6Nb zM`M>moUBSFe`72&Cr@|+G~@2|jnTAK=|`io<1lH!iKkEuPyHto9*@Obm$C+14Sa_{qm zC1Fpq=j$sodIoR%H_^idOPVVW`q}KWe)o$r&0t!63@#h}EcY&_mdHWTVKN{>9D8xS zRfFbLJ3EoD4Dch%bECEBt4zOrB>&)w`R!PK&XyBV(4YK_XG!he+j8%)F$vzNB4{sX z4QAKT!(CiA>JG6bh0_0)xR+O5=`|SCZCt&Uj^5W8Z20n|CXWi`sKO}lRRqTtlh3yk zA2ugtb4y^q+ia^RqqKSGKrp&;`F}>9OsS%)dulOX0PJBH#xkZVQf7`Hr7U z38bC;4gy#DOD4ts(rK7~bvur=$ee_m`w$4OaEmlWWAP|0)!?>c%buJyfQ+2!s*kJg z(F)U5z#XD!EI|3m+R)()5)d?z3Z%In=M(-k#gzB#G@cLusN^Cw*g8Yl#PZ?)I^p4U8S?f%|W&MI2OC!=X`(#*n* zJoMu6!o&8?>rozv=4X3l;XzpALp5H|`!CqJ#5WO5AyLs?E2q|vOWCvIQ`K5D z&bzP%+KU`X!@y1kFUKIYwbYDnKYha(fyB27%{bwtZ=aHwFkXBeb=<5UV8dst|Ys1QzGi+S&_<>LxM73OIgtvsa4o3tCVs=t&uG-~{eYWj$DJ g@GSBA(j!G6i0P81?`FC*8vKy`>B?e_H_bKT0m$9{>OV literal 22488 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 +#include +#include +#undef REQUIRE_EXTENSIONS +#include +#undef REQUIRE_PLUGIN +#include + +#pragma semicolon 1 +#pragma newdecls required + +#define PLUGIN_VERSION "0.1.97q" +#define LOGFILE "addons/sourcemod/logs/abm.log" // TODO change this to DATE/SERVER FORMAT? + +Handle g_GameData = null; +ArrayList g_sQueue; +ArrayList g_iQueue; + +// menu parameters +#define menuArgs g_menuItems[client] // Global argument tracking for the menu system +#define menuArg0 g_menuItems[client][0] // GetItem(1...) +#define menuArg1 g_menuItems[client][1] // GetItem(2...) +int g_menuItems[MAXPLAYERS + 1][2]; + +// menu tracking +#define g_callBacks g_menuStack[client] +ArrayStack g_menuStack[MAXPLAYERS + 1]; +Function callBack; + +char g_QKey[64]; // holds players by STEAM_ID +StringMap g_QDB; // holds player records linked by STEAM_ID +StringMap g_QRecord; // changes to an individual STEAM_ID mapping +StringMap g_QRtmp; // temporary QRecord holder for checking records without changing the main +StringMap g_Cvars; // locked cvars end up here + +char g_InfectedNames[6][] = {"Boomer", "Smoker", "Hunter", "Spitter", "Jockey", "Charger"}; +char g_SurvivorNames[8][] = {"Nick", "Rochelle", "Coach", "Ellis", "Bill", "Zoey", "Francis", "Louis"}; +char g_SurvivorPaths[8][] = { + "models/survivors/survivor_gambler.mdl", + "models/survivors/survivor_producer.mdl", + "models/survivors/survivor_coach.mdl", + "models/survivors/survivor_mechanic.mdl", + "models/survivors/survivor_namvet.mdl", + "models/survivors/survivor_teenangst.mdl", + "models/survivors/survivor_biker.mdl", + "models/survivors/survivor_manager.mdl", +}; + +int g_OS; // 0: Linux, 1: Windows (Prevent crash on Windows /w Zoey) +char g_sB[512]; // generic catch all string buffer +char g_pN[128]; // a dedicated buffer to storing a temporary name +char g_name[128], g_tmpName[128]; // g_QDB client name +int g_client, g_tmpClient; // g_QDB client id +int g_target, g_tmpTarget; // g_QDB player (human or bot) id +int g_lastid, g_tmpLastid; // g_QDB client's last known bot id +int g_onteam, g_tmpOnteam = 1; // g_QDB client's team +bool g_queued, g_tmpQueued; // g_QDB client's takeover state +bool g_inspec, g_tmpInspec; // g_QDB check client's specator mode +bool g_status, g_tmpStatus; // g_QDB client life state +bool g_update, g_tmpUpdate; // g_QDB should we update this record? +char g_model[32], g_tmpModel[32]; // g_QDB client's model +char g_ghost[32], g_tmpGhost[32]; // g_QDB queued model for SwitchTeam +float g_origin[3], g_tmpOrigin[3]; // g_QDB client's origin vector +float g_rdelay, g_tmpRdelay; // g_QDB delay time for SI respawn +Handle g_rDelays[MAXPLAYERS + 1]; // Individual respawn SI timers +int g_models[8]; + +Handle g_MkBotsTimer; +Handle g_ADAssistant; // Tries to make sure the AD starts +Handle g_AD; // Assistant Director Timer +int g_survivorSet; // 0 = l4d2 survivors, 4 = l4d1 survivors +bool g_survivorSetScan; // Check to discover the survivor set + +bool g_IsVs; +bool g_IsCoop; +bool g_AssistedSpawning = false; +bool g_ADFreeze = true; +bool g_AutoWave; +int g_ADInterval; + +ConVar g_cvVersion; // abm_version +ConVar g_cvLogLevel; int g_LogLevel; // abm_loglevel +ConVar g_cvMinPlayers; int g_MinPlayers; // abm_minplayers +ConVar g_cvPrimaryWeapon; char g_PrimaryWeapon[64]; // abm_primaryweapon +ConVar g_cvSecondaryWeapon; char g_SecondaryWeapon[64]; // abm_secondaryweapon +ConVar g_cvThrowable; char g_Throwable[64]; // abm_throwable +ConVar g_cvHealItem; char g_HealItem[64]; // abm_healitem +ConVar g_cvConsumable; char g_Consumable[64]; // abm_consumable +ConVar g_cvTankChunkHp; int g_TankChunkHp; // abm_tankchunkhp +ConVar g_cvSpawnInterval; int g_SpawnInterval; // abm_spawninterval +ConVar g_cvAutoHard; int g_AutoHard; // abm_autohard +ConVar g_cvUnlockSI; int g_UnlockSI; // abm_unlocksi +ConVar g_cvJoinMenu; int g_JoinMenu; // abm_joinmenu +ConVar g_cvTeamLimit; int g_TeamLimit; // abm_teamlimit +ConVar g_cvOfferTakeover; int g_OfferTakeover; // abm_offertakeover +ConVar g_cvStripKick; int g_StripKick; // abm_stripkick +ConVar g_cvAutoModel; int g_AutoModel; // abm_automodel +ConVar g_cvKeepDead; int g_KeepDead; // abm_keepdead +ConVar g_cvIdentityFix; int g_IdentityFix; // abm_identityfix +ConVar g_cvZoey; int g_Zoey; // abm_zoey +ConVar g_cvRespawnDelay; float g_RespawnDelay; // abm_respawndelay +ConVar g_cvWrapSwitch; int g_WrapSwitch; // _abm_wrapswitch +ConVar g_cvMaxMinions; // z_minion_limit +ConVar g_cvMaxSurvivors; // survivor_limit +ConVar g_cvMaxInfecteds; // z_max_player_zombies +int g_MaxMates; // X vs X +int g_SILimits; + +ConVar g_cvTankHealth; +ConVar g_cvMaxSwitches; +ConVar g_cvGameMode; +ConVar g_cvVDOUHandle; +ConVar g_cvVDOUOrigin; +ConVar g_cvConsistency; char g_consistency[2]; +char g_VDOUCurVal[2048]; +char g_VDOUOrigin[2048]; + +public Plugin myinfo= { + name = "ABM", + author = "Victor \"NgBUCKWANGS\" Gonzalez", + description = "A 5+ Player Enhancement Plugin for L4D2", + version = PLUGIN_VERSION, + url = "https://gitlab.com/vbgunz/ABM" +} + +public void OnPluginStart() { + Echo(2, "OnPluginStart"); + + g_GameData = LoadGameConfigFile("abm"); + if (g_GameData == null) { + SetFailState("[ABM] Game data missing!"); + } + + HookEvent("player_first_spawn", OnSpawnHook); + HookEvent("player_spawn", OnAllSpawnHook); + HookEvent("player_death", OnDeathHook, EventHookMode_Pre); + HookEvent("player_disconnect", CleanQDBHook); + HookEvent("player_afk", GoIdleHook); + HookEvent("player_team", QTeamHook); + HookEvent("player_bot_replace", QAfkHook); + HookEvent("bot_player_replace", QBakHook); + HookEvent("player_activate", PlayerActivateHook, EventHookMode_Pre); + HookEvent("player_connect", PlayerActivateHook, EventHookMode_Pre); + HookEvent("round_end", RoundFreezeEndHook, EventHookMode_Pre); + HookEvent("mission_lost", RoundFreezeEndHook, EventHookMode_Pre); + HookEvent("round_freeze_end", RoundFreezeEndHook, EventHookMode_Pre); + HookEvent("map_transition", RoundFreezeEndHook, EventHookMode_Pre); + HookEvent("round_start", RoundStartHook, EventHookMode_Pre); + + // base the following on a cvar + HookUserMessage(GetUserMessageId("SayText2"), UserMessageHook, true); + + RegAdminCmd("abm", MainMenuCmd, ADMFLAG_GENERIC); + RegAdminCmd("abm-menu", MainMenuCmd, ADMFLAG_GENERIC, "Menu: (Main ABM menu)"); + RegAdminCmd("abm-join", SwitchTeamCmd, ADMFLAG_GENERIC, "Menu/Cmd: | "); + RegAdminCmd("abm-takeover", SwitchToBotCmd, ADMFLAG_GENERIC, "Menu/Cmd: | "); + RegAdminCmd("abm-respawn", RespawnClientCmd, ADMFLAG_GENERIC, "Menu/Cmd: [ID]"); + RegAdminCmd("abm-model", AssignModelCmd, ADMFLAG_GENERIC, "Menu/Cmd: | "); + RegAdminCmd("abm-strip", StripClientCmd, ADMFLAG_GENERIC, "Menu/Cmd: [SLOT]"); + RegAdminCmd("abm-teleport", TeleportClientCmd, ADMFLAG_GENERIC, "Menu/Cmd: "); + RegAdminCmd("abm-cycle", CycleBotsCmd, ADMFLAG_GENERIC, "Menu/Cmd: | "); + RegAdminCmd("abm-reset", ResetCmd, ADMFLAG_GENERIC, "Cmd: (Use only in case of emergency)"); + RegAdminCmd("abm-info", QuickClientPrintCmd, ADMFLAG_GENERIC, "Cmd: (Print some diagnostic information)"); + RegAdminCmd("abm-mk", MkBotsCmd, ADMFLAG_GENERIC, "Cmd: "); + RegAdminCmd("abm-rm", RmBotsCmd, ADMFLAG_GENERIC, "Cmd: | "); + RegAdminCmd("abm-debug", DebugCmd, ADMFLAG_GENERIC, ""); + RegConsoleCmd("takeover", SwitchToBotCmd, "Menu/Cmd: | "); + RegConsoleCmd("join", SwitchTeamCmd, "Menu/Cmd: | "); + + g_OS = GetOS(); // 0: Linux 1: Windows + g_QDB = new StringMap(); + g_QRecord = new StringMap(); + g_QRtmp = new StringMap(); + g_Cvars = new StringMap(); + g_sQueue = new ArrayList(2); + g_iQueue = new ArrayList(2); + + char zoeyId[2]; + switch(g_OS) { + case 0: zoeyId = "5"; // 5 is the real Zoey + case 1: zoeyId = "1"; // Zoey crashes Windows servers, 1 is Rochelle + } + + // remember vscript director options unlocker settings between reloads + g_cvVDOUHandle = FindConVar("l4d2_directoroptions_overwrite"); + SetupCvar(g_cvVDOUOrigin, "_abm_vdouorigin", ";", "DO NOT EDIT"); + + if (g_cvVDOUHandle != null) { + HookConVarChange(g_cvVDOUHandle, UpdateConVarsHook); + GetConVarString(g_cvVDOUOrigin, g_VDOUOrigin, sizeof(g_VDOUOrigin)); + GetConVarString(g_cvVDOUHandle, g_VDOUCurVal, sizeof(g_VDOUCurVal)); + + if(g_VDOUOrigin[0] != ';') + UpdateConVarsHook(g_cvVDOUHandle, g_VDOUOrigin, g_VDOUOrigin); + else + UpdateConVarsHook(g_cvVDOUHandle, g_VDOUCurVal, g_VDOUCurVal); + } + + g_cvTankHealth = FindConVar("z_tank_health"); + g_cvMaxSwitches = FindConVar("vs_max_team_switches"); + g_cvConsistency = FindConVar("sv_consistency"); + HookConVarChange(g_cvConsistency, UpdateConVarsHook); + g_cvGameMode = FindConVar("mp_gamemode"); + HookConVarChange(g_cvGameMode, UpdateConVarsHook); + UpdateGameMode(); + + float maxClients = float(MaxClients); + g_cvMaxMinions = FindConVar("z_minion_limit"); + SetConVarFloat(g_cvMaxMinions, maxClients); + + g_cvMaxInfecteds = FindConVar("z_max_player_zombies"); + SetConVarBounds(g_cvMaxInfecteds, ConVarBound_Upper, true, maxClients); + SetConVarFloat(g_cvMaxInfecteds, maxClients); + + g_cvMaxSurvivors = FindConVar("survivor_limit"); + SetConVarBounds(g_cvMaxSurvivors, ConVarBound_Upper, true, maxClients); + SetConVarFloat(g_cvMaxSurvivors, maxClients); + + // thanks to bl4nk + int flags = GetConVarFlags(g_cvMaxSurvivors); + flags &= ~FCVAR_NOTIFY; + SetConVarFlags(g_cvMaxSurvivors, flags); + + SetupCvar(g_cvVersion, "abm_version", PLUGIN_VERSION, "ABM plugin version"); + SetupCvar(g_cvLogLevel, "abm_loglevel", "-1", "Development logging level -1: Off, 6: Max"); + SetupCvar(g_cvMinPlayers, "abm_minplayers", "4", "Pruning extra survivors stops at this size"); + SetupCvar(g_cvPrimaryWeapon, "abm_primaryweapon", "shotgun_chrome", "5+ survivor primary weapon"); + SetupCvar(g_cvSecondaryWeapon,"abm_secondaryweapon", "baseball_bat", "5+ survivor secondary weapon"); + SetupCvar(g_cvThrowable, "abm_throwable", "", "5+ survivor throwable item"); + SetupCvar(g_cvHealItem, "abm_healitem", "", "5+ survivor healing item"); + SetupCvar(g_cvConsumable, "abm_consumable", "adrenaline", "5+ survivor consumable item"); + SetupCvar(g_cvTankChunkHp, "abm_tankchunkhp", "2500", "Health chunk per survivor on 5+ missions"); + SetupCvar(g_cvSpawnInterval, "abm_spawninterval", "36", "SI full team spawn in (5 x N)"); + SetupCvar(g_cvAutoHard, "abm_autohard", "1", "0: Off 1: Non-Vs > 4 2: Non-Vs >= 1"); + SetupCvar(g_cvUnlockSI, "abm_unlocksi", "0", "0: Off 1: Use Left 4 Downtown 2 2: Use VScript Director Options Unlocker"); + SetupCvar(g_cvJoinMenu, "abm_joinmenu", "1", "0: Off 1: Admins only 2: Everyone"); + SetupCvar(g_cvTeamLimit, "abm_teamlimit", "16", "Humans on team limit"); + SetupCvar(g_cvOfferTakeover, "abm_offertakeover", "1", "0: Off 1: Survivors 2: Infected 3: All"); + SetupCvar(g_cvStripKick, "abm_stripkick", "0", "0: Don't strip removed bots 1: Strip removed bots"); + SetupCvar(g_cvAutoModel, "abm_automodel", "1", "1: Full set of survivors 0: Map set of survivors"); + SetupCvar(g_cvKeepDead, "abm_keepdead", "0", "0: The dead return alive 1: the dead return dead"); + SetupCvar(g_cvIdentityFix, "abm_identityfix", "1", "0: Do not assign identities 1: Assign identities"); + SetupCvar(g_cvZoey, "abm_zoey", zoeyId, "0:Nick 1:Rochelle 2:Coach 3:Ellis 4:Bill 5:Zoey 6:Francis 7:Louis"); + SetupCvar(g_cvRespawnDelay, "abm_respawndelay", "1.0", "SI respawn delay time in non-competitive modes"); + SetupCvar(g_cvWrapSwitch, "abm_wrapswitch", "0", "Intercept chooseteam/jointeam commands"); + + // clean out client menu stacks + for (int i = 1; i <= MaxClients; i++) { + g_menuStack[i] = new ArrayStack(128); + } + + // Register everyone that we can find + for (int i = 1; i <= MaxClients; i++) { + SetQRecord(i, true); + } + + AddCommandListener(TeamSwitchIntercept, "jointeam"); + AddCommandListener(CmdIntercept, "z_spawn"); + AddCommandListener(CmdIntercept, "z_spawn_old"); + AddCommandListener(CmdIntercept, "z_add"); + AutoExecConfig(true, "abm"); + StartAD(); +} + +public void OnPluginEnd() { + Echo(2, "OnPluginEnd"); + + for (int i = 1; i <= MaxClients; i++) { + if (GetQRecord(i)) { + SetClientName(i, g_name); + } + } +} + +public Action UserMessageHook(UserMsg MsgId, Handle hBitBuffer, const int[] iPlayers, int iNumPlayers, bool bReliable, bool bInit) { + Echo(2, "UserMessageHook: %d %d %d", iNumPlayers, bReliable, bInit); + // thanks https://forums.alliedmods.net/showpost.php?p=914509&postcount=10 + + // Skip the first two bytes + BfReadByte(hBitBuffer); + BfReadByte(hBitBuffer); + + // Read the message + static char strMessage[1024]; + BfReadString(hBitBuffer, strMessage, sizeof(strMessage)); + + // If the message equals to the string we want to filter, skip. + if (StrEqual(strMessage, "#Cstrike_Name_Change")) { + return Plugin_Handled; + } + + return Plugin_Continue; +} + +public Action TeamSwitchIntercept(int client, const char[] cmd, int args) { + Echo(2, "TeamSwitchIntercept: %d %s %d", client, cmd, args); + + if (g_WrapSwitch) { + GetCmdArg(1, g_sB, sizeof(g_sB)); + + if (IsClientValid(client)) { + if (StrEqual(g_sB, "survivor", false) || StrEqual(g_sB, "2")) { + SwitchTeam(client, 2); + } + + else if (StrEqual(g_sB, "infected", false) || StrEqual(g_sB, "3")) { + if (g_IsVs || IsAdmin(client)) { + SwitchTeam(client, 3); + } + } + + else if (StrEqual(g_sB, "0") || StrEqual(g_sB, "1")) { + SwitchTeam(client, StringToInt(g_sB)); + } + + else { + SwitchTeamCmd(client, 0); + } + + return Plugin_Handled; + } + } + + return Plugin_Continue; +} + +void SetupCvar(Handle &cvHandle, char[] name, char[] value, char[] details) { + Echo(2, "SetupCvar: %s %s %s", name, value, details); + + cvHandle = CreateConVar(name, value, details); + HookConVarChange(cvHandle, UpdateConVarsHook); + UpdateConVarsHook(cvHandle, value, value); +} + +Action CmdIntercept(int client, const char[] cmd, int args) { + Echo(2, "CmdIntercept: %d %s %d", client, cmd, args); + + if (g_AssistedSpawning) { + GhostsModeProtector(); + } + return Plugin_Continue; +} + +public void OnMapStart() { + Echo(2, "OnMapStart:"); + PrecacheModels(); +} + +public void OnMapEnd() { + Echo(2, "OnMapEnd:"); + + StopAD(); + StringMapSnapshot keys = g_QDB.Snapshot(); + g_iQueue.Clear(); + g_sQueue.Clear(); + +// if (!g_IsVs) { +// SetConVarInt(g_cvMaxSurvivors, g_MinPlayers); +// } + + for (int i; i < keys.Length; i++) { + keys.GetKey(i, g_sB, sizeof(g_sB)); + g_QDB.GetValue(g_sB, g_QRecord); + + g_QRecord.GetValue("onteam", g_onteam); + g_QRecord.GetValue("client", g_client); + g_QRecord.GetValue("target", g_target); + g_QRecord.SetValue("status",true,true); + + if (g_onteam >= 2) { + g_QRecord.SetValue("inspec", false, true); + } + + if (g_IsVs) { + g_QRecord.SetString("model", "", true); + } + + else if (g_onteam == 3) { + //SwitchToSpec(g_client); + g_QRecord.SetValue("status",false, true); + g_QRecord.SetString("model", "", true); + QueueUp(g_client,3); + } + } + + delete keys; +} + +public void OnEntityCreated(int ent, const char[] clsName) { + Echo(2, "OnEntityCreated: %d %s", ent, clsName); + + if (clsName[0] == 'f') { + bool gClip = !StrEqual(clsName, "func_playerghostinfected_clip", false); + bool iClip = !StrEqual(clsName, "func_playerinfected_clip", false); + + if (!(gClip && iClip)) { + CreateTimer(2.0, KillEntTimer, EntIndexToEntRef(ent)); + } + } + + else if (clsName[0] == 's' && StrEqual(clsName, "survivor_bot")) { + SDKHook(ent, SDKHook_SpawnPost, AutoModel); + } +} + +public Action KillEntTimer(Handle timer, any ref) { + Echo(2, "KillEntTimer: %d", ref); + + int ent = EntRefToEntIndex(ref); + if (ent != INVALID_ENT_REFERENCE || IsEntityValid(ent)) { + AcceptEntityInput(ent, "kill"); + } + + return Plugin_Stop; +} + +public Action L4D_OnGetScriptValueInt(const char[] key, int &retVal) { + Echo(5, "L4D_OnGetScriptValueInt: %s, %d", key, retVal); + + // see UpdateConVarsHook "g_UnlockSI" for VScript Director Options Unlocker + + if (g_UnlockSI == 1 && g_MaxMates > 4) { + int val = retVal; + + if (StrEqual(key, "DominatorLimit")) val = g_MaxMates; + else if (StrEqual(key, "MaxSpecials")) val = g_MaxMates; + else if (StrEqual(key, "BoomerLimit")) val = g_SILimits; + else if (StrEqual(key, "SmokerLimit")) val = g_SILimits; + else if (StrEqual(key, "HunterLimit")) val = g_SILimits; + else if (StrEqual(key, "ChargerLimit")) val = g_SILimits; + else if (StrEqual(key, "SpitterLimit")) val = g_SILimits; + else if (StrEqual(key, "JockeyLimit")) val = g_SILimits; + + if (val != retVal) { + retVal = val; + return Plugin_Handled; + } + } + + return Plugin_Continue; +} + +public void RoundFreezeEndHook(Handle event, const char[] name, bool dontBroadcast) { + Echo(2, "RoundFreezeEndHook: %s", name); + OnMapEnd(); +} + +public void PlayerActivateHook(Handle event, const char[] name, bool dontBroadcast) { + Echo(2, "PlayerActivateHook: %s", name); + + int userid = GetEventInt(event, "userid"); + int client = GetClientOfUserId(userid); + PlayerActivate(client); +} + +void PlayerActivate(int client) { + Echo(2, "PlayerActivate: %d", client); + + if (GetQRecord(client)) { + g_QRecord.SetString("model", "", true); + StartAD(); + + if (!g_IsVs && g_onteam == 3) { + //SwitchTeam(client, 3); + QueueUp(client, 3); + AddInfected(); + } + } +} + +int GetRealClient(int client) { + Echo(2, "GetRealClient: %d", client); + + if (IsClientValid(client, 0)) { + if (HasEntProp(client, Prop_Send, "m_humanSpectatorUserID")) { + int userid = GetEntProp(client, Prop_Send, "m_humanSpectatorUserID"); + int target = GetClientOfUserId(userid); + + if (IsClientValid(target)) { + client = target; + } + + else { + for (int i = 1; i <= MaxClients; i++) { + if (GetQRtmp(i) && g_tmpTarget == client) { + client = i; + break; + } + } + } + } + } + + else { + client = 0; + } + + return client; +} + +Action LifeCheckTimer(Handle timer, int target) { + Echo(2, "LifeCheckTimer: %d", target); + + if (GetQRecord(GetRealClient(target))) { + int status = IsPlayerAlive(target); + + if(g_model[0] != EOS) { + AssignModel(target, g_model, g_IdentityFix); + } else { + GetBotCharacter(target, g_model); + g_QRecord.SetString("model", g_model, true); + } + + g_QRecord.SetValue("status", status, true); + AssignModel(g_client, g_model, g_IdentityFix); + } + return Plugin_Handled; +} + +public void OnAllSpawnHook(Handle event, const char[] name, bool dontBroadcast) { + Echo(2, "OnAllSpawnHook: %s", name); + + int userid = GetEventInt(event, "userid"); + int client = GetClientOfUserId(userid); + + if (GetQRtmp(client)) { + CreateTimer(0.5, LifeCheckTimer, client); + + if (!g_IsVs && g_tmpOnteam == 3 && !g_tmpStatus) { + g_QRtmp.SetValue("status", 1, true); + State_TransitionSig(client, 8); + } + } +} + +public void RoundStartHook(Handle event, const char[] name, bool dontBroadcast) { + Echo(2, "RoundStartHook: %s", name); + StartAD(); + + for (int i = 1; i <= MaxClients; i++) { + if (GetQRtmp(i)) { + if (!g_IsVs && g_tmpOnteam == 3) { + //SwitchTeam(i, 3); + QueueUp(i, 3); + AddInfected(); + } + } + } +} + +bool StopAD() { + Echo(2, "StopAD"); + + if (g_AD != null) { + g_ADFreeze = true; + g_AssistedSpawning = false; + g_survivorSetScan = true; + g_ADInterval = 0; + + for (int i = 1; i <= MaxClients; i++) { + if (g_rDelays[i] != null) { + KillTimer(g_rDelays[i]); + g_rDelays[i] = null; + } + } + + if (g_MkBotsTimer != null) { + KillTimer(g_MkBotsTimer); + g_MkBotsTimer = null; + } + + KillTimer(g_AD); // delete causes errors? + g_AD = null; + } + + return g_AD == null; +} + +bool StartAD(float interval=0.5) { + Echo(2, "StartAD"); + + if (g_ADAssistant == null) { + g_ADAssistant = CreateTimer(0.1, StartADTimer, _, TIMER_REPEAT); + } + + if (StopAD()) { + g_AD = CreateTimer(interval, ADTimer, _, TIMER_REPEAT); + } + + return g_AD != null; +} + +public Action StartADTimer(Handle timer) { + Echo(6, "StartADTimer"); + + if (g_AD == null) { + StartAD(); + return Plugin_Continue; + } + + g_ADAssistant = null; + return Plugin_Stop; +} + +bool AllClientsLoadedIn() { + Echo(2, "AllClientsLoadedIn"); + + for (int i = 1; i <= MaxClients; i++) { + if (IsClientConnected(i) && !IsClientInGame(i)) { + return false; + } + } + + return true; +} + +public Action ADTimer(Handle timer) { + Echo(6, "ADTimer"); + + g_MaxMates = CountTeamMates(2); + + if (g_MaxMates == 0) { + return Plugin_Continue; + } + + static bool takeover; + takeover = !g_IsVs || (g_IsVs && !g_ADFreeze); + + for (int i = 1; i <= MaxClients; i++) { + if (g_ADFreeze) { + g_ADInterval = 0; + + if (g_MaxMates >= 4 || AllClientsLoadedIn()) { + while (CountTeamMates(2) < g_MinPlayers) { + AddSurvivor(); + } + + if (AllClientsLoadedIn() && StartAD(5.0)) { + RmBots(g_MinPlayers * -1, 2); + //SetConVarInt(g_cvMaxSurvivors, MaxClients); + g_AssistedSpawning = false; + g_ADFreeze = false; + } + } + } + + if (IsClientValid(GetRealClient(i), 2, 0)) { + if (IsPlayerAlive(i)) { + _AutoModel(i); + } + } + + else if (GetQRtmp(i)) { + + //if (IsClientValid(g_tmpTarget, 2, 0)) { + // ResetClientSpecUserId(i, g_tmpTarget); + //} + + if (g_tmpOnteam == 3) { + if (!g_IsVs) { + g_AssistedSpawning = true; + + if (!g_tmpInspec && GetClientTeam(i) <= 1) { + QueueUp(i, 3); + AddInfected(); + } + } + } + + else if (!g_tmpInspec && GetClientTeam(i) <= 1) { + if (takeover) { + g_QRtmp.SetValue("onteam", 0,true); + CreateTimer(0.1, TakeoverTimer, i); + } + } + } + } + + static int lastSize; + + if (lastSize != g_MaxMates) { + lastSize = g_MaxMates; + + g_SILimits = 1; + while (g_SILimits * 6 < g_MaxMates) { + g_SILimits++; + } + + VDOUnlocker(); + g_AutoWave = false; + + if (g_IsCoop) { + g_AutoWave = (g_AutoHard == 2 || g_MaxMates > 4 && g_AutoHard == 1); + AutoSetTankHp(); + } + } + + if (g_AutoWave || g_AssistedSpawning) { + if (g_SpawnInterval > 0 && g_ADInterval >= g_SpawnInterval) { + if (g_ADInterval % g_SpawnInterval == 0) { + Echo(2, " -- Assisting SI %d: Matching Full Team", g_ADInterval); + MkBots(g_MaxMates * -1, 3); + } + + else if (g_ADInterval % (g_SpawnInterval / 2) == 0) { + Echo(2, " -- Assisting SI %d: Matching Half Team", g_ADInterval); + MkBots((g_MaxMates / 2) * -1, 3); + } + + else if (g_ADInterval % (g_SpawnInterval / 3) == 0) { + Echo(2, " -- Assisting SI %d: Matching a Quarter", g_ADInterval); + MkBots((g_MaxMates / 4) * -1, 3); + } + } + } + + g_ADInterval++; + return Plugin_Continue; +} + +public void UpdateConVarsHook(Handle convar, const char[] oldCv, const char[] newCv) { + GetConVarName(convar, g_sB, sizeof(g_sB)); + Echo(2, "UpdateConVarsHook: %s %s %s", g_sB, oldCv, newCv); + + static char name[32]; name = ""; + static char value[2048]; value = ""; + + Format(name, sizeof(name), g_sB); + Format(value, sizeof(value), "%s", newCv); + TrimString(value); + + if (StrContains(newCv, "-l") == 0) { + strcopy(value, sizeof(value), value[2]); + TrimString(value); + g_Cvars.SetString(name, value, true); + } + + else if (StrContains(newCv, "-u") == 0) { + strcopy(value, sizeof(value), value[2]); + TrimString(value); + g_Cvars.Remove(name); + } + + g_Cvars.GetString(name, value, sizeof(value)); + if (!StrEqual(newCv, value)) { + SetConVarString(convar, value); + return; + } + + if (name[0] == 'a') { + if (name[4] == 'a') { + if (name[8] == 'h' && StrEqual(name, "abm_autohard")) { + g_AutoHard = GetConVarInt(g_cvAutoHard); + AutoSetTankHp(); + } + + else if (name[8] == 'm' && StrEqual(name, "abm_automodel")) { + g_AutoModel = GetConVarInt(g_cvAutoModel); + } + } + + else if (name[4] == 'c' && StrEqual(name, "abm_consumable")) { + GetConVarString(g_cvConsumable, g_Consumable, sizeof(g_Consumable)); + } + + else if (name[4] == 'h' && StrEqual(name, "abm_healitem")) { + GetConVarString(g_cvHealItem, g_HealItem, sizeof(g_HealItem)); + } + + else if (name[4] == 'i' && StrEqual(name, "abm_identityfix")) { + g_IdentityFix = GetConVarInt(g_cvIdentityFix); + } + + else if (name[4] == 'j' && StrEqual(name, "abm_joinmenu")) { + g_JoinMenu = GetConVarInt(g_cvJoinMenu); + } + + else if (name[4] == 'k' && StrEqual(name, "abm_keepdead")) { + g_KeepDead = GetConVarInt(g_cvKeepDead); + } + + else if (name[4] == 'l' && StrEqual(name, "abm_loglevel")) { + g_LogLevel = GetConVarInt(g_cvLogLevel); + } + + else if (name[4] == 'm' && StrEqual(name, "abm_minplayers")) { + g_MinPlayers = GetConVarInt(g_cvMinPlayers); + } + + else if (name[4] == 'o' && StrEqual(name, "abm_offertakeover")) { + g_OfferTakeover = GetConVarInt(g_cvOfferTakeover); + } + + else if (name[4] == 'p' && StrEqual(name, "abm_primaryweapon")) { + GetConVarString(g_cvPrimaryWeapon, g_PrimaryWeapon, sizeof(g_PrimaryWeapon)); + } + + else if (name[4] == 'r' && StrEqual(name, "abm_respawndelay")) { + g_RespawnDelay = GetConVarFloat(g_cvRespawnDelay); + + StringMapSnapshot keys = g_QDB.Snapshot(); + for (int i; i < keys.Length; i++) { + keys.GetKey(i, g_sB, sizeof(g_sB)); + g_QDB.GetValue(g_sB, g_QRecord); + g_QRecord.SetValue("rdelay", g_RespawnDelay, true); + } + + delete keys; + } + + else if (name[4] == 's') { + if (name[5] == 'e' && StrEqual(name, "abm_secondaryweapon")) { + GetConVarString(g_cvSecondaryWeapon, g_SecondaryWeapon, sizeof(g_SecondaryWeapon)); + } + + else if (name[5] == 'p' && StrEqual(name, "abm_spawninterval")) { + g_SpawnInterval = GetConVarInt(g_cvSpawnInterval); + } + + else if (name[5] == 't' && StrEqual(name, "abm_stripkick")) { + g_StripKick = GetConVarInt(g_cvStripKick); + } + } + + else if (name[4] == 't') { + if (name[5] == 'a' && StrEqual(name, "abm_tankchunkhp")) { + g_TankChunkHp = GetConVarInt(g_cvTankChunkHp); + AutoSetTankHp(); + } + + else if (name[5] == 'e' && StrEqual(name, "abm_teamlimit")) { + g_TeamLimit = GetConVarInt(g_cvTeamLimit); + } + + else if (name[5] == 'h' && StrEqual(name, "abm_throwable")) { + GetConVarString(g_cvThrowable, g_Throwable, sizeof(g_Throwable)); + } + } + + else if (name[4] == 'u' && StrEqual(name, "abm_unlocksi")) { + g_UnlockSI = GetConVarInt(g_cvUnlockSI); + + switch (g_UnlockSI) { + case 2: VDOUnlocker(); + default: RestoreVDOU(); + } + } + + else if (name[4] == 'z' && StrEqual(name, "abm_zoey")) { + g_Zoey = GetConVarInt(g_cvZoey); + } + } + + else if (name[0] == 'l' && StrEqual(name, "l4d2_directoroptions_overwrite")) { + g_VDOUCurVal = value; + + if (g_UnlockSI != 2) { + g_VDOUOrigin = value; + SetConVarString(g_cvVDOUOrigin, value); + } + } + + else if (name[0] == 'm' && StrEqual(name, "mp_gamemode")) { + UpdateGameMode(); + } + + else if (name[0] == 's' && StrEqual(name, "sv_consistency")) { + GetConVarString(g_cvConsistency, g_consistency, sizeof(g_consistency)); + } + + else if (name[5] == 'w' && StrEqual(name, "_abm_wrapswitch")) { + g_WrapSwitch = GetConVarInt(g_cvWrapSwitch); + } +} + +int GetGameType() { + Echo(2, "GetGameType"); + + // 0: coop 1: versus 2: scavenge 3: survival + GetConVarString(g_cvGameMode, g_sB, sizeof(g_sB)); + + switch (g_sB[0]) { + case 'c': { + if (StrEqual(g_sB, "coop")) return 0; + else if (StrEqual(g_sB, "community1")) return 0; // Special Delivery + else if (StrEqual(g_sB, "community2")) return 0; // Flu Season + else if (StrEqual(g_sB, "community3")) return 1; // Riding My Survivor + else if (StrEqual(g_sB, "community4")) return 3; // Nightmare + else if (StrEqual(g_sB, "community5")) return 0; // Death's Door + } + + case 'm': { + if (StrEqual(g_sB, "mutation1")) return 0; // Last Man on Earth + else if (StrEqual(g_sB, "mutation2")) return 0; // Headshot! + else if (StrEqual(g_sB, "mutation3")) return 0; // Bleed Out + else if (StrEqual(g_sB, "mutation4")) return 0; // Hard Eight + else if (StrEqual(g_sB, "mutation5")) return 0; // Four Swordsmen + else if (StrEqual(g_sB, "mutation7")) return 0; // Chainsaw Massacre + else if (StrEqual(g_sB, "mutation8")) return 0; // Ironman + else if (StrEqual(g_sB, "mutation9")) return 0; // Last Gnome on Earth + else if (StrEqual(g_sB, "mutation10")) return 0; // Room for One + else if (StrEqual(g_sB, "mutation11")) return 1; // Healthpackalypse + else if (StrEqual(g_sB, "mutation12")) return 1; // Realism Versus + else if (StrEqual(g_sB, "mutation13")) return 2; // Follow the Liter + else if (StrEqual(g_sB, "mutation14")) return 0; // Gib Fest + else if (StrEqual(g_sB, "mutation15")) return 1; // Versus Survival + else if (StrEqual(g_sB, "mutation16")) return 0; // Hunting Party + else if (StrEqual(g_sB, "mutation17")) return 0; // Lone Gunman + else if (StrEqual(g_sB, "mutation18")) return 1; // Bleed Out Versus + else if (StrEqual(g_sB, "mutation19")) return 1; // Taaannnkk! + else if (StrEqual(g_sB, "mutation20")) return 0; // Healing Gnome + } + + case 'r': { + if (StrEqual(g_sB, "realism")) return 0; + } + + case 's': { + if (StrEqual(g_sB, "scavenge")) return 2; + else if (StrEqual(g_sB, "survival")) return 3; + } + + case 't': { + if (StrEqual(g_sB, "teamscavenge")) return 2; + else if (StrEqual(g_sB, "teamversus")) return 1; + } + + case 'v': { + if (StrEqual(g_sB, "versus")) return 1; + } + } + + return -1; +} + +void UpdateGameMode() { + Echo(2, "UpdateGameMode"); + + switch (GetGameType()) { + case 0: { + g_IsCoop = true; + g_IsVs = false; + } + + case 1, 2: { + g_IsVs = true; + g_IsCoop = false; + } + + case 3: { + g_IsVs = false; + g_IsCoop = false; + } + } +} + +void SetVDOU(char[] val, any ...) { + Echo(2, "SetVDOU"); + + static const char tmp[128] = "\ + DominatorLimit=%s;\ + MaxSpecials=%s;\ + BoomerLimit=%s;\ + SmokerLimit=%s;\ + HunterLimit=%s;\ + ChargerLimit=%s;\ + SpitterLimit=%s;\ + JockeyLimit=%s;"; + + VFormat(val, sizeof(tmp), tmp, 2); +} + +void VDOUnlocker() { + Echo(2, "VDOUnlocker"); + + if (g_cvVDOUHandle != null) { + static bool restore = false; + g_MaxMates = CountTeamMates(2); + + if (g_UnlockSI == 2 && g_MaxMates > 4) { + static char m[3]; static char l[3]; + Format(m, sizeof(m), "%d", g_MaxMates); + Format(l, sizeof(l), "%d", g_SILimits); + SetVDOU(g_VDOUCurVal, m, m, l, l, l, l, l, l); + SetConVarString(g_cvVDOUHandle, g_VDOUCurVal); + restore = true; + } + + else if (restore) { + RestoreVDOU(); + restore = false; + } + } +} + +void RestoreVDOU() { + Echo(2, "RestoreVDOU"); + + if (!g_ADFreeze && g_cvVDOUHandle != null) { + static char origin[2048]; + origin = g_VDOUOrigin; + + SetVDOU(g_VDOUCurVal, "","","","","","","",""); + SetConVarString(g_cvVDOUHandle, g_VDOUCurVal); + SetConVarString(g_cvVDOUHandle, origin); + } +} + +void AutoSetTankHp() { + Echo(2, "AutoSetTankHp"); + + static int tankHp; + GetConVarDefault(g_cvTankHealth, g_sB, sizeof(g_sB)); + tankHp = StringToInt(g_sB); + + if (g_TankChunkHp != 0 && (g_IsCoop || g_IsVs)) { + if (g_AutoHard == 2 || g_MaxMates > 4 && g_AutoHard == 1) { + tankHp = g_MaxMates * g_TankChunkHp; + } + } + + SetConVarInt(g_cvTankHealth, tankHp); +} + +public void OnConfigsExecuted() { + Echo(2, "OnConfigsExecuted"); + + // extend the base cfg with a map specific cfg + GetCurrentMap(g_sB, sizeof(g_sB)); + Format(g_sB, sizeof(g_sB), "cfg/sourcemod/abm/%s.cfg", g_sB); + + if (FileExists(g_sB, true)) { + strcopy(g_sB, sizeof(g_sB), g_sB[4]); + ServerCommand("exec \"%s\"", g_sB); + Echo(1, "Extending ABM: %s", g_sB); + } + + // some servers don't pick up on this automatically + else if (FileExists("cfg/sourcemod/abm.cfg", true)) { + ServerCommand("exec \"sourcemod/abm.cfg\""); + } +} + +public void OnClientPostAdminCheck(int client) { + Echo(2, "OnClientPostAdminCheck: %d", client); + + if (!IsFakeClient(client)) { + if (GetQRecord(client) && !g_update) { + return; + } + + if (IsAdmin(client) || !GetQRecord(client)) { + SetQRecord(client, true); + } + + else { + int status = g_status; + int onteam = g_onteam; + + if (SetQRecord(client, true) >= 0) { + g_QRecord.SetValue("status", status, true); + g_QRecord.SetValue("onteam", onteam, true); + } + } + + if (g_JoinMenu == 2 || g_JoinMenu == 1 && IsAdmin(client)) { + GoIdle(client, 1); + menuArg0 = client; + SwitchTeamHandler(client, 1, ""); + } + + else if (CountTeamMates(2) >= 1) { + CreateTimer(0.1, TakeoverTimer, client); + CreateTimer(0.5, AutoIdleTimer, client, TIMER_REPEAT); + } + } +} + +public Action AutoIdleTimer(Handle timer, int client) { + Echo(2, "AutoIdleTimer: %d", client); + + if (g_IsVs || !IsClientValid(client)) { + return Plugin_Stop; + } + + static int onteam; + onteam = GetClientTeam(client); + + if (onteam >= 2) { + if (onteam == 2) { + GoIdle(client, 0); + } + + return Plugin_Stop; + } + + return Plugin_Continue; +} + +public void GoIdleHook(Handle event, const char[] name, bool dontBroadcast) { + Echo(2, "GoIdleHook: %s", name); + int player = GetEventInt(event, "player"); + int client = GetClientOfUserId(player); + + if (GetQRecord(client)) { + switch (g_onteam) { + case 2: GoIdle(client); + case 3: SwitchTeam(client, 3); + } + } +} + +void GoIdle(int client, int onteam=0) { + Echo(2, "GoIdle: %d %d", client, onteam); + + if (GetQRecord(client)) { + int spec_target; + + // going from idle survivor to infected, leaves an icon behind + if (IsClientValid(g_target, 2, 0)) { + SwitchToBot(client, g_target); + } + + if (g_onteam == 2) { + SwitchToSpec(client); + + if (onteam == 0) { + SetHumanSpecSig(g_target, client); + } + + if (onteam == 1) { + SwitchToSpec(client); + Unqueue(client); + } + + AssignModel(g_target, g_model, g_IdentityFix); + } + + else { + SwitchToSpec(client); + } + + if (g_onteam == 3 && onteam <= 1) { + g_QRecord.SetString("model", "", true); + } + + spec_target = IsClientValid(g_target, 0, 0) ? g_target : GetSafeSurvivor(client); + + if (IsClientValid(spec_target)) { + SetEntPropEnt(client, Prop_Send, "m_hObserverTarget", spec_target); + SetEntProp(client, Prop_Send, "m_iObserverMode", 5); + } + } +} + +public void CleanQDBHook(Handle event, const char[] name, bool dontBroadcast) { + Echo(2, "CleanQDBHook: %s", name); + + int userid = GetEventInt(event, "userid"); + int client = GetClientOfUserId(userid); + RemoveQDBKey(client); +} + +void RemoveQDBKey(int client) { + Echo(2, "RemoveQDBKey: %d", client); + + if (GetQRecord(client)) { + SetClientName(client, g_name); + g_QRecord.SetValue("update", true, true); + g_QRecord.SetString("model", "", true); + + if (CountTeamMates(2) > g_MinPlayers) { + CreateTimer(1.0, RmBotsTimer, 1); + } + } +} + +Action RmBotsTimer(Handle timer, any asmany) { + Echo(4, "RmBotsTimer: %d", asmany); + + if (!g_IsVs) { + RmBots(asmany, 2); + } + return Plugin_Handled; +} + +bool IsAdmin(int client) { + Echo(2, "IsAdmin: %d", client); + return CheckCommandAccess( + client, "generic_admin", ADMFLAG_GENERIC, false + ); +} + +bool IsEntityValid(int ent) { + Echo(2, "IsEntityValid: %d", ent); + return (ent > MaxClients && ent <= 2048 && IsValidEntity(ent)); +} + +bool IsClientValid(int client, int onteam=0, int mtype=2) { + Echo(6, "IsClientValid: %d, %d, %d", client, onteam, mtype); + + if (client >= 1 && client <= MaxClients) { + if (IsClientConnected(client)) { + if (IsClientInGame(client)) { + + if (onteam != 0 && GetClientTeam(client) != onteam) { + return false; + } + + switch (mtype) { + case 0: return IsFakeClient(client); + case 1: return !IsFakeClient(client); + } + + return true; + } + } + } + + return false; +} + +bool CanClientTarget(int client, int target) { + Echo(2, "CanClientTarget: %d %d", client, target); + + if (client == target) { + return true; + } + + else if (!IsClientValid(client) || !IsClientValid(target)) { + return false; + } + + else if (IsFakeClient(target)) { + int manager = GetClientManager(target); + + if (manager != -1) { + if (manager == 0) { + return true; + } + + else { + return CanClientTarget(client, manager); + } + } + } + + return CanUserTarget(client, target); +} + +int GetPlayClient(int client) { + Echo(3, "GetPlayClient: %d", client); + + if (GetQRecord(client)) { + return g_target; + } + + else if (IsClientValid(client)) { + return client; + } + + return -1; +} + +int ClientHomeTeam(int client) { + Echo(2, "ClientHomeTeam: %d", client); + + if (GetQRecord(client)) { + return g_onteam; + } + + else if (IsClientValid(client)) { + return GetClientTeam(client); + } + + return -1; +} + +// ================================================================== // +// g_QDB MANAGEMENT +// ================================================================== // + +bool SetQKey(int client) { + Echo(3, "SetQKey: %d", client); + + if (IsClientValid(client, 0, 1)) { + if (GetClientAuthId(client, AuthId_Steam2, g_QKey, sizeof(g_QKey), true)) { + return true; + } + } + + return false; +} + +bool GetQRtmp(int client) { + Echo(3, "GetQRtmp: %d", client); + + bool result; + static char QKey[64]; + QKey = g_QKey; + + if (SetQKey(client)) { + if (g_QDB.GetValue(g_QKey, g_QRtmp)) { + + if (IsClientValid(client) && IsPlayerAlive(client)) { + GetClientAbsOrigin(client, g_tmpOrigin); + g_QRtmp.SetArray("origin", g_tmpOrigin, sizeof(g_tmpOrigin), true); + } + + g_QRtmp.GetValue("client", g_tmpClient); + g_QRtmp.GetValue("target", g_tmpTarget); + g_QRtmp.GetValue("lastid", g_tmpLastid); + g_QRtmp.GetValue("onteam", g_tmpOnteam); + g_QRtmp.GetValue("queued", g_tmpQueued); + g_QRtmp.GetValue("inspec", g_tmpInspec); + g_QRtmp.GetValue("status", g_tmpStatus); + g_QRtmp.GetValue("update", g_tmpUpdate); + g_QRtmp.GetValue("rdelay", g_tmpRdelay); + g_QRtmp.GetString("ghost", g_tmpGhost, sizeof(g_tmpGhost)); + g_QRtmp.GetString("model", g_tmpModel, sizeof(g_tmpModel)); + g_QRtmp.GetString("name", g_tmpName, sizeof(g_tmpName)); + + if (g_tmpModel[0] == EOS || g_tmpOnteam == 3) { + GetBotCharacter(g_tmpTarget, g_tmpModel); + g_QRtmp.SetString("model", g_tmpModel, true); + + if (!g_IsVs && g_tmpOnteam == 3 && IsPlayerAlive(client)) { + SetClientName(client, g_tmpModel); + } + } + + result = true; + } + } + + g_QKey = QKey; + return result; +} + +bool GetQRecord(int client) { + Echo(3, "GetQRecord: %d", client); + + if (SetQKey(client)) { + if (g_QDB.GetValue(g_QKey, g_QRecord)) { + + if (IsClientValid(client) && IsPlayerAlive(client)) { + GetClientAbsOrigin(client, g_origin); + g_QRecord.SetArray("origin", g_origin, sizeof(g_origin), true); + } + + g_QRecord.GetValue("client", g_client); + g_QRecord.GetValue("target", g_target); + g_QRecord.GetValue("lastid", g_lastid); + g_QRecord.GetValue("onteam", g_onteam); + g_QRecord.GetValue("queued", g_queued); + g_QRecord.GetValue("inspec", g_inspec); + g_QRecord.GetValue("status", g_status); + g_QRecord.GetValue("update", g_update); + g_QRecord.GetValue("rdelay", g_rdelay); + g_QRecord.GetString("ghost", g_ghost, sizeof(g_ghost)); + g_QRecord.GetString("model", g_model, sizeof(g_model)); + g_QRecord.GetString("name", g_name, sizeof(g_name)); + + if (g_model[0] == EOS || g_onteam == 3) { + GetBotCharacter(g_target, g_model); + g_QRecord.SetString("model", g_model, true); + + if (!g_IsVs && g_onteam == 3 && IsPlayerAlive(client)) { + SetClientName(client, g_model); + } + } + + return true; + } + } + + return false; +} + +bool NewQRecord(int client) { + Echo(3, "NewQRecord: %d", client); + + g_QRecord = new StringMap(); + + GetClientAbsOrigin(client, g_origin); + g_QRecord.SetArray("origin", g_origin, sizeof(g_origin), true); + g_QRecord.SetValue("client", client, true); + g_QRecord.SetValue("target", client, true); + g_QRecord.SetValue("lastid", client, true); + g_QRecord.SetValue("onteam", GetClientTeam(client), true); + g_QRecord.SetValue("queued", false, true); + g_QRecord.SetValue("inspec", false, true); + g_QRecord.SetValue("status", true, true); + g_QRecord.SetValue("update", false, true); + g_QRecord.SetValue("rdelay", g_RespawnDelay, true); + g_QRecord.SetString("ghost", "", true); + g_QRecord.SetString("model", "", true); + + GetClientName(client, g_name, sizeof(g_name)); + g_QRecord.SetString("name", g_name, true); + return true; +} + +int SetQRecord(int client, bool update=false) { + Echo(3, "SetQRecord: %d %d", client, update); + + int result = -1; + + if (SetQKey(client)) { + if (g_QDB.GetValue(g_QKey, g_QRecord) && !update) { + result = 0; + } + + else if (NewQRecord(client)) { + GetClientName(client, g_pN, sizeof(g_pN)); + Echo(0, "AUTH ID: %s, (%s) ADDED TO QDB.", g_QKey, g_pN); + g_QDB.SetValue(g_QKey, g_QRecord, true); + result = 1; + } + + GetQRecord(client); + } + + return result; +} + +void QueueUp(int client, int onteam) { + Echo(2, "QueueUp: %d %d", client, onteam); + + if (onteam >= 2 && onteam <= 3 && GetQRecord(client)) { + Unqueue(client); + + switch (onteam) { + case 2: g_sQueue.Push(client); + case 3: g_iQueue.Push(client); + } + + g_QRecord.SetValue("target", client, true); + g_QRecord.SetValue("inspec", false, true); + g_QRecord.SetValue("onteam", onteam, true); + g_QRecord.SetValue("queued", true, true); + } +} + +void Unqueue(int client) { + Echo(2, "Unqueue: %d", client); + + if (GetQRecord(client)) { + g_QRecord.SetValue("queued", false, true); + + int iLength = g_iQueue.Length; + int sLength = g_sQueue.Length; + + if (iLength > 0) { + for (int i = iLength - 1; i > -1; i--) { + if (g_iQueue.Get(i) == client) { + g_iQueue.Erase(i); + } + } + } + + if (sLength > 0) { + for (int i = sLength - 1; i > -1; i--) { + if (g_sQueue.Get(i) == client) { + g_sQueue.Erase(i); + } + } + } + } +} + +public Action OnSpawnHook(Handle event, const char[] name, bool dontBroadcast) { + Echo(2, "OnSpawnHook: %s", name); + + int userid = GetEventInt(event, "userid"); + int target = GetClientOfUserId(userid); + + GetClientName(target, g_pN, sizeof(g_pN)); + if (g_pN[0] == 'A' && StrContains(g_pN, "ABMclient") >= 0) { + return Plugin_Handled; + } + + int onteam = GetClientTeam(target); + int client; + + if (onteam == 3) { + int zClass = GetEntProp(target, Prop_Send, "m_zombieClass"); + + if (g_iQueue.Length == 0 && g_UnlockSI != 0) { + if (CountTeamMates(3) > g_MaxMates && zClass != 8) { + if (IsFakeClient(target)) { + KickClient(target); + return Plugin_Handled; + } + } + } + + if (!g_IsVs) { + if (g_AssistedSpawning) { + if (zClass == 8) { + + int j = 1; + static int i = 1; + + for (; i <= MaxClients + 1; i++) { + if (j++ == MaxClients + 1) { // join 3 Tank requires +1 + return Plugin_Handled; + } + + if (i > MaxClients) { + i = 1; + } + + if (GetQRecord(i) && g_onteam == 3 && !g_inspec) { + if (GetEntProp(i, Prop_Send, "m_zombieClass") != 8) { + client = i; + i++; + break; + } + } + } + + if(IsClientValid(client)) { + SwitchToBot(client, target); + } else { + CreateTimer(1.0, TankAssistTimer, target, TIMER_REPEAT); + } + } + } + + if (g_iQueue.Length > 0) { + client = g_iQueue.Get(0); + if (IsClientValid(client) && !IsPlayerAlive(client)) { + SwitchToBot(client, target); + } + + return Plugin_Handled; + } + } + } + + if (onteam == 2) { + // AutoModeling now takes place in OnEntityCreated + CreateTimer(0.4, OnSpawnHookTimer, target); + return Plugin_Handled; + } + + return Plugin_Continue; +} + +public Action TankAssistTimer(Handle timer, any client) { + Echo(4, "TankAssistTimer: %d", client); + + /* + * Human players on the infected team in modes that do not officially + * support them, can get Tanks stuck in "stasis" until they die. This + * function works around the issue by watching Tanks for movement. If + * a Tank does not move in 11 seconds, it is replaced with another. + */ + + float origin[3]; + static const float nullOrigin[3]; + static int times[MAXPLAYERS + 1] = {11, ...}; + static float origins[MAXPLAYERS + 1][3]; + static int i; + + if (IsClientValid(client)) { + i = times[client]--; + + if (i == 11) { + GetClientAbsOrigin(client, origins[client]); + return Plugin_Continue; + } + + else if (i >= 0) { + GetClientAbsOrigin(client, origin); + + if (origin[0] == origins[client][0]) { + if (i == 0) { + TeleportEntity(client, nullOrigin, NULL_VECTOR, NULL_VECTOR); + ForcePlayerSuicide(client); + AddInfected("tank"); + } + + return Plugin_Continue; + } + } + } + + i = times[client] = 11; + return Plugin_Stop; +} + +public Action ForceSpawnTimer(Handle timer, any client) { + Echo(4, "ForceSpawnTimer: %d", client); + + static int times[MAXPLAYERS + 1] = {20, ...}; + static int i; + + if (IsClientValid(client)) { + i = times[client]--; + + if (GetEntProp(client, Prop_Send, "m_zombieClass") != 8) { + i = times[client] = 20; + return Plugin_Stop; + } + + if (GetEntProp(client, Prop_Send, "m_isGhost") == 1) { + if (i >= 1) { + PrintHintText(client, "FORCING SPAWN IN: %d", i); + return Plugin_Continue; + } + + if (GetEntProp(client, Prop_Send, "m_ghostSpawnState") <= 2) { + SetEntProp(client, Prop_Send, "m_isGhost", 0); + } + + return Plugin_Continue; + } + } + + if (!IsEntityValid(GetEntPropEnt(client, Prop_Send, "m_hActiveWeapon"))) { + i = CreateEntityByName("weapon_tank_claw"); + if (IsEntityValid(i) && DispatchSpawn(i)) { + EquipPlayerWeapon(client, i); + } + } + + i = times[client] = 20; + PrintHintText(client, "KILL ALL HUMANS"); + return Plugin_Stop; +} + +Action OnSpawnHookTimer(Handle timer, any target) { + Echo(2, "OnSpawnHookTimer: %d", target); + + if (g_sQueue.Length > 0) { + SwitchToBot(g_sQueue.Get(0), target); + } + return Plugin_Handled; +} + +public void OnDeathHook(Handle event, const char[] name, bool dontBroadcast) { + Echo(4, "OnDeathHook: %s", name); + + int userid = GetEventInt(event, "userid"); + int client = GetClientOfUserId(userid); + + if (GetQRecord(client)) { + GetClientAbsOrigin(client, g_origin); + g_QRecord.SetValue("target", client, true); + g_QRecord.SetArray("origin", g_origin, sizeof(g_origin), true); + g_QRecord.SetValue("status", false, true); + bool offerTakeover; + + switch (g_onteam) { + case 3: { + g_QRecord.SetString("model", "", true); + + if (!g_IsVs) { + QueueSI(client, g_rdelay); + + switch (g_OfferTakeover) { + case 2, 3: { + GoIdle(client, 1); + offerTakeover = true; + } + + default: SwitchTeam(client, 3); + } + } + } + + case 2: { + switch (g_OfferTakeover) { + case 1, 3: offerTakeover = true; + } + } + } + + if (offerTakeover) { + GenericMenuCleaner(client); + menuArg0 = client; + SwitchToBotHandler(client, 1); + } + } + + else if (GetQRecord(GetRealClient(client))) { + g_QRecord.SetValue("status", false, true); + } +} + +public void QTeamHook(Handle event, const char[] name, bool dontBroadcast) { + Echo(2, "QTeamHook: %s", name); + + int userid = GetEventInt(event, "userid"); + int client = GetClientOfUserId(userid); + int onteam = GetEventInt(event, "team"); + + if (GetQRecord(client)) { + + if (!g_IsVs && g_onteam == 3) { + SetClientName(client, g_name); + } + + if (onteam >= 2) { + g_QRecord.SetValue("inspec", false, true); + g_QRecord.SetValue("target", client, true); + g_QRecord.SetValue("onteam", onteam, true); + + // attempt to apply a model asap + if (g_ADFreeze && onteam == 2 && g_model[0] != EOS) { + AssignModel(client, g_model, g_IdentityFix); + } + } + + if (onteam <= 1) { // cycling requires 0.2 or higher? + CreateTimer(0.2, QTeamHookTimer, client); + } + } +} + +Action QTeamHookTimer(Handle timer, any client) { + Echo(2, "QTeamHookTimer: %d", client); + + if (GetQRecord(client) && !g_inspec) { + if (g_onteam == 2) { + if (IsClientValid(g_target) && g_target != client) { + SetHumanSpecSig(g_target, client); + } + } + } + return Plugin_Handled; +} + +public void QAfkHook(Handle event, const char[] name, bool dontBroadcast) { + Echo(2, "QAfkHook: %s", name); + + int client = GetClientOfUserId(GetEventInt(event, "player")); + int target = GetClientOfUserId(GetEventInt(event, "bot")); + int clientTeam = GetClientTeam(client); + int targetTeam = GetClientTeam(target); + + if (GetQRecord(client)) { + int onteam = GetClientTeam(client); + + if (onteam == 2) { + g_QRecord.SetValue("target", target, true); + AssignModel(target, g_model, g_IdentityFix); + } + } + + if (targetTeam == 2 && IsClientValid(client)) { + if (IsClientInKickQueue(client)) { + if (client && target && clientTeam == targetTeam) { + int safeClient = GetSafeSurvivor(target); + RespawnClient(target, safeClient); + } + } + } +} + +public void QBakHook(Handle event, const char[] name, bool dontBroadcast) { + Echo(2, "QBakHook: %s", name); + + int client = GetClientOfUserId(GetEventInt(event, "player")); + int target = GetClientOfUserId(GetEventInt(event, "bot")); + + if (GetQRecord(client)) { + if (g_target != target) { + g_QRecord.SetValue("lastid", target); + g_QRecord.SetValue("target", client); + } + + if (GetClientTeam(client) == 2) { + AssignModel(client, g_model, g_IdentityFix); + } + } +} + +// ================================================================== // +// UNORGANIZED AS OF YET +// ================================================================== // + +void StripClient(int client) { + Echo(2, "StripClient: %d", client); + + if (IsClientValid(client)) { + if (GetClientTeam(client) == 2) { + for (int i = 4; i >= 0; i--) { + StripClientSlot(client, i); + } + } + } +} + +void StripClientSlot(int client, int slot) { + Echo(2, "StripClientSlot: %d %d", client, slot); + + client = GetPlayClient(client); + + if (IsClientValid(client)) { + if (GetClientTeam(client) == 2) { + int ent = GetPlayerWeaponSlot(client, slot); + if (IsEntityValid(ent)) { + RemovePlayerItem(client, ent); + AcceptEntityInput(ent,"kill"); + } + } + } +} + +void RespawnClient(int client, int target=0) { + Echo(2, "RespawnClient: %d %d", client, target); + + if (!IsClientValid(client)) { + return; + } + + else if (GetQRecord(client)) { + if (g_onteam == 3) { + Takeover(client, 3); + return; + } + } + + client = GetPlayClient(client); + target = GetPlayClient(target); + bool weaponizePlayer = true; + static const float pos0[3]; + static float pos1[3]; + pos1 = pos0; + + if (client != GetRealClient(target) && IsClientValid(target)) { + GetClientAbsOrigin(target, pos1); + } + + else if (GetQRtmp(client)) { + pos1 = g_origin; + if (pos1[0] != 0 && pos1[1] != 0 && pos1[2] != 0) { + weaponizePlayer = false; + } + } + + if (pos1[0] != 0 && pos1[1] != 0 && pos1[2] != 0) { + RoundRespawnSig(client); + + if (!g_ADFreeze && weaponizePlayer) { + QuickCheat(client, "give", g_PrimaryWeapon); + QuickCheat(client, "give", g_SecondaryWeapon); + QuickCheat(client, "give", g_Throwable); + QuickCheat(client, "give", g_HealItem); + QuickCheat(client, "give", g_Consumable); + } + + TeleportEntity(client, pos1, NULL_VECTOR, NULL_VECTOR); + } +} + +void TeleportClient(int client, int target) { + Echo(2, "TeleportClient: %d %d", client, target); + + float origin[3]; + client = GetPlayClient(client); + target = GetPlayClient(target); + + if (IsClientValid(client) && IsClientValid(target)) { + GetClientAbsOrigin(target, origin); + TeleportEntity(client, origin, NULL_VECTOR, NULL_VECTOR); + } +} + +int GetSafeSurvivor(int client) { + Echo(2, "GetSafeSurvivor: %d", client); + + + float lowestIntensity; + int lowestClient = -1; + + for (int i = 1; i <= MaxClients; i++) { + if (IsClientValid(i) && i != client && IsPlayerAlive(i) && GetClientTeam(i) == 2) { + + // Skip if incapped or on a ledge + if (GetEntProp(i, Prop_Send, "m_isHangingFromLedge") || GetEntProp(i, Prop_Send, "m_isIncapacitated")) { + continue; + } + + float intensity = L4D_GetPlayerIntensity(i); + if(intensity < lowestIntensity || lowestClient == -1) { + lowestIntensity = intensity; + lowestClient = i; + } + } + } + + return lowestClient; +} + +bool AddSurvivor() { + Echo(2, "AddSurvivor"); + + if (GetClientCount(false) >= MaxClients - 1) { + return false; + } + + bool result = false; + if(GetFeatureStatus(FeatureType_Native, "NextBotCreatePlayerBotSurvivorBot") != FeatureStatus_Available) { + // Fallback to manual kick trick if no CreateSurvivorBot API + int i = CreateFakeClient("ABMclient2"); + if (IsClientValid(i)) { + if (DispatchKeyValue(i, "classname", "SurvivorBot")) { + ChangeClientTeam(i, 2); + + if (DispatchSpawn(i)) { + result = true; + } + } + KickClient(i); + } + } else { + result = CreateSurvivorBot() > 0; + } + return result; +} + +bool AddInfected(char model[32]="", int version=0) { + Echo(2, "AddInfected: '%s' %d", model, version); + + if (GetClientCount(false) >= MaxClients - 1) { + return false; + } + + CleanSIName(model); + int i = CreateFakeClient("ABMclient3"); + + if (IsClientValid(i)) { + ChangeClientTeam(i, 3); + Format(g_sB, sizeof(g_sB), "%s auto area", model); + + switch (version) { + case 0: QuickCheat(i, "z_spawn_old", g_sB); + case 1: QuickCheat(i, "z_spawn", g_sB); + } + + KickClient(i); + return true; + } + + return false; +} + +void GhostsModeProtector(int state=0) { + Echo(2, "GhostsModeProtector: %d", state); + // CAREFUL: 0 starts this function and you must close it with 1 or + // risk breaking things. Close this with 1 immediately when done. + + // e.g., + // GhostsModeProtector(0); + // z_spawn_old tank auto; + // GhostsModeProtector(1); + + static int ghosts[MAXPLAYERS + 1]; + static int lifeState[MAXPLAYERS + 1]; // prevent early rise from the dead + + switch (state) { + case 0: { + for (int i = 1; i <= MaxClients; i++) { + if (GetQRtmp(i) && g_tmpOnteam == 3) { + if (GetEntProp(i, Prop_Send, "m_isGhost") == 1 || g_tmpQueued) { + SetEntProp(i, Prop_Send, "m_isGhost", 0); + ghosts[i] = 1; + } + + if (GetEntProp(i, Prop_Send, "m_lifeState") == 1) { + SetEntProp(i, Prop_Send, "m_lifeState", 0); + g_QRtmp.SetValue("status", 1, true); + lifeState[i] = 1; + } + } + } + } + + case 1: { + for (int i = 1; i <= MaxClients; i++) { + if (ghosts[i] == 1) { + SetEntProp(i, Prop_Send, "m_isGhost", 1); + } + + if (lifeState[i] == 1) { + SetEntProp(i, Prop_Send, "m_lifeState", 1); + } + + ghosts[i] = 0; + lifeState[i] = 0; + } + } + } + + if (state == 0) { + RequestFrame(GhostsModeProtector, 1); + } +} + +void CleanSIName(char model[32]) { + Echo(2, "CleanSIName: %s", model); + + int i; + static char tmpModel[32]; + + if (model[0] != EOS) { + for (i = 0; i < sizeof(g_InfectedNames); i++) { + strcopy(tmpModel, sizeof(tmpModel), g_InfectedNames[i]); + if (StrContains(tmpModel, model, false) == 0) { + model = tmpModel; + return; + } + } + + if (StrContains("Tank", model, false) == 0) { + model = "Tank"; + return; + } + } + + i = GetRandomInt(0, sizeof(g_InfectedNames) - 1); + strcopy(model, sizeof(model), g_InfectedNames[i]); +} + +void SwitchToSpec(int client, int onteam=1) { + Echo(2, "SwitchToSpec: %d %d", client, onteam); + + if (GetQRecord(client)) { + // clearparent jockey bug switching teams (thanks to Lux) + AcceptEntityInput(client, "clearparent"); + g_QRecord.SetValue("inspec", true, true); + ChangeClientTeam(client, onteam); + + if (GetRealClient(g_target) == client) { + if (g_onteam == 2) { + AssignModel(g_target, g_model, g_IdentityFix); + } + + if (HasEntProp(g_target, Prop_Send, "m_humanSpectatorUserID")) { + SetEntProp(g_target, Prop_Send, "m_humanSpectatorUserID", 0); + } + } + } +} + +void QuickCheat(int client, char [] cmd, char [] arg) { + Echo(2, "QuickCheat: %d %s %s", client, cmd, arg); + + int flags = GetCommandFlags(cmd); + SetCommandFlags(cmd, flags & ~FCVAR_CHEAT); + FakeClientCommand(client, "%s %s", cmd, arg); + SetCommandFlags(cmd, flags); +} + +void SwitchToBot(int client, int target, bool si_ghost=true) { + Echo(2, "SwitchToBot: %d %d %d", client, target, si_ghost); + + if (IsClientValid(target, 0, 0)) { + Unqueue(client); + + switch (GetClientTeam(target)) { + case 2: TakeoverBotSig(client, target); + case 3: TakeoverZombieBotSig(client, target, si_ghost); + } + } +} + +void Takeover(int client, int onteam) { + Echo(2, "Takeover: %d %d", client, onteam); + + if (GetQRecord(client)) { + if (IsClientValid(g_target, 0, 0)) { + if (client != g_target && GetClientTeam(g_target) == onteam) { + SwitchToBot(client, g_target); + return; + } + } + + int nextBot; + nextBot = GetNextBot(onteam, 0, true); + + if (IsClientValid(nextBot)) { + SwitchToBot(client, nextBot); + return; + } + + switch (onteam) { + case 2: { + if (g_KeepDead == 1 && !g_status) { + if (g_onteam == 2 && CountTeamMates(2, 0) == 0) { + ChangeClientTeam(client, 2); + ForcePlayerSuicide(client); // without this player may spawn if survivors are close to start + } + + return; + } + + QueueUp(client, 2); + AddSurvivor(); + } + + case 3: { + QueueUp(client, 3); + AddInfected(); + } + } + } +} + +public Action TakeoverTimer(Handle timer, any client) { + Echo(4, "TakeoverTimer: %d", client); + + if (CountTeamMates(2) <= 0) { + return Plugin_Handled; + } + + static int team2; + static int team3; + static int teamX; + + if (GetQRecord(client)) { + if (GetClientTeam(client) >= 2) { + return Plugin_Handled; + } + + teamX = 2; + if (g_onteam == 3) { + teamX = 3; + } + + if (g_IsVs && g_onteam <= 1) { + team2 = CountTeamMates(2, 1); + team3 = CountTeamMates(3, 1); + + if (team3 < team2) { + teamX = 3; + } + } + + if (CountTeamMates(teamX, 1) < g_TeamLimit) { + Takeover(client, teamX); + } + } + + return Plugin_Handled; +} + +int CountTeamMates(int onteam, int mtype=2) { + Echo(2, "CountTeamMates: %d %d", onteam, mtype); + + // mtype 0: counts only bots + // mtype 1: counts only humans + // mtype 2: counts all players on team + + static int clients, bots, humans; + clients = bots = humans = 0; + + for (int i = 1; i <= MaxClients; i++) { + if (IsClientValid(i, onteam)) { + clients++; + + if(IsFakeClient(GetRealClient(i))) { + bots++; + } else { + humans++; + } + } + } + + switch (mtype) { + case 0: clients = bots; + case 1: clients = humans; + } + + return clients; +} + +int GetClientManager(int target) { + Echo(4, "GetClientManager: %d", target); + + int result = -1; + target = GetRealClient(target); + + if (IsClientValid(target)) { + result = IsFakeClient(target) ? 0 : target; + } + + return result; +} + +int GetNextBot(int onteam, int start=1, bool alive=false) { + Echo(2, "GetNextBot: %d %d %d", onteam, start, alive); + + static int bot, j; + bot = 0; + j = start; + + if (onteam == 3) { + alive = true; + } + + for (int i = 1; i <= MaxClients; i++) { + if (j > 32) { + j = 1; + } + + if (IsClientValid(j, onteam, 0)) { + if (GetClientManager(j) == 0) { + if (onteam == 2) { + bot = j; + } + + if (alive && IsPlayerAlive(j)) { + return j; + } + + else if (!alive) { + return j; + } + } + } + + j++; + } + + return bot; +} + +void CycleBots(int client, int onteam) { + Echo(2, "CycleBots: %d %d", client, onteam); + + if (onteam <= 1) { + return; + } + + if (GetQRecord(client)) { + int bot = GetNextBot(onteam, g_lastid, true); + if (IsClientValid(bot, onteam, 0)) { + SwitchToBot(client, bot, false); + } + } +} + +void SwitchTeam(int client, int onteam, char model[32]="") { + Echo(2, "SwitchTeam: %d %d", client, onteam); + + if (GetQRecord(client)) { + if (GetClientTeam(client) >= 2) { + if (onteam == 2 && onteam == g_onteam) { + return; // keep survivors from rejoining survivors + } + } + + if (g_onteam == 2 && onteam <= 1) { + if (IsClientValid(g_target, 0, 0)) { + SwitchToBot(client, g_target); + } + } + + switch (onteam) { + case 0: GoIdle(client, 0); + case 1: GoIdle(client, 1); + //case 4: ChangeClientTeam(client, 4); + default: { + if (onteam <= 3 && onteam >= 2) { + if (g_onteam != onteam) { + GoIdle(client, 1); + } + + g_QRecord.SetString("model", model, true); + + if (onteam == 3) { + if (g_IsVs) { // see if a proper way to get on team 2 exist + static int switches; // A Lux idea + switches = GetConVarInt(g_cvMaxSwitches); + SetConVarInt(g_cvMaxSwitches, 9999); + ChangeClientTeam(client, onteam); + SetConVarInt(g_cvMaxSwitches, switches); + return; + } + + g_QRecord.SetValue("onteam", onteam,true); + g_QRecord.SetString("ghost", model, true); + QueueSI(client, g_rdelay); + return; + } + + Takeover(client, onteam); + } + } + } + } +} + +void QueueSI(int client, float delay=1.0) { + Echo(2, "QueueSI: %d %f", client, delay); + + if (g_rDelays[client] != null) { + KillTimer(g_rDelays[client]); + g_rDelays[client] = null; + } + + g_rDelays[client] = CreateTimer( + delay, QueueSITimer, client, TIMER_REPEAT + ); +} + +Action QueueSITimer(Handle Timer, int client) { + Echo(2, "QueueSITimer: %d", client); + + if (GetQRecord(client) && g_onteam == 3) { + QueueUp(client, 3); + + if (AddInfected(g_ghost, 1)) { + g_QRecord.SetValue("rdelay", g_RespawnDelay, true); + g_QRecord.SetString("ghost", "", true); + } + } + + g_rDelays[client] = null; + return Plugin_Stop; +} + +Action MkBotsCmd(int client, int args) { + Echo(2, "MkBotsCmd: %d", client); + + switch(args) { + case 2: { + GetCmdArg(1, g_sB, sizeof(g_sB)); + int asmany = StringToInt(g_sB); + GetCmdArg(2, g_sB, sizeof(g_sB)); + int onteam = StringToInt(g_sB); + + if (onteam >= 2 || onteam <= 3) { + MkBots(asmany, onteam); + } + } + } + return Plugin_Handled; +} + +void MkBots(int asmany, int onteam) { + Echo(2, "MkBots: %d %d", asmany, onteam); + + if (asmany < 0) { + asmany = asmany * -1 - CountTeamMates(onteam); + } + + float rate; + DataPack pack = new DataPack(); + + switch (onteam) { + case 2: rate = 0.2; + case 3: rate = 0.4; + } + + g_MkBotsTimer = CreateDataTimer(rate, MkBotsTimer, pack, TIMER_REPEAT); + pack.WriteCell(asmany); + pack.WriteCell(onteam); +} + +public Action MkBotsTimer(Handle timer, Handle pack) { + Echo(2, "MkBotsTimer"); + + static int i; + + ResetPack(pack); + int asmany = ReadPackCell(pack); + int onteam = ReadPackCell(pack); + + if (i++ < asmany) { + switch (onteam) { + case 2: AddSurvivor(); + case 3: AddInfected(); + } + + return Plugin_Continue; + } + + i = 0; + g_MkBotsTimer = null; + return Plugin_Stop; +} + +Action RmBotsCmd(int client, int args) { + Echo(2, "RmBotsCmd: %d", client); + + int asmany; + int onteam; + + switch(args) { + case 1: { + GetCmdArg(1, g_sB, sizeof(g_sB)); + onteam = StringToInt(g_sB); + asmany = MaxClients; + } + + case 2: { + GetCmdArg(1, g_sB, sizeof(g_sB)); + asmany = StringToInt(g_sB); + GetCmdArg(2, g_sB, sizeof(g_sB)); + onteam = StringToInt(g_sB); + } + } + + if (onteam >= 2 || onteam <= 3) { + RmBots(asmany, onteam); + } + return Plugin_Handled; +} + +void RmBots(int asmany, int onteam) { + Echo(2, "RmBots: %d %d", asmany, onteam); + + int j; + + if (onteam == 0) { + onteam = asmany; + asmany = MaxClients; + } + + else if (asmany == -0) { + return; + } + + else if (asmany < 0) { + asmany += CountTeamMates(onteam); + if (asmany <= 0) { + return; + } + } + + for (int i = MaxClients; i >= 1; i--) { + if (GetClientManager(i) == 0 && GetClientTeam(i) == onteam) { + + j++; + if (g_StripKick == 1) { + StripClient(i); + } + + KickClient(i); + + if (j >= asmany) { + break; + } + } + } +} + +// ================================================================== // +// MODEL FEATURES +// ================================================================== // + + +void AutoModel(int client) { + Echo(5, "AutoModel: %d", client); + RequestFrame(_AutoModel, client); +} + +public void _AutoModel(int client) { + Echo(5, "_AutoModel: %d", client); + + if (IsClientValid(client, 2)) { + SDKUnhook(client, SDKHook_SpawnPost, AutoModel); + } + + if (g_AutoModel && IsClientValid(client, 2)) { + static int realClient; + realClient = GetRealClient(client); + if (GetQRecord(realClient) && g_model[0] != EOS) { + return; + } + + static int set, survivors, character; + set = GetSurvivorSet(client); + GetAllSurvivorModels(client); + + survivors = CountTeamMates(2); + character = g_models[GetClientModelIndex(client)]; + if (character == 0 || character < survivors / 8) { + return; + } + + for (int i = 0; i < 4; i++) { + for (int index = set; index < sizeof(g_models); index++) { + if (g_models[index] <= i) { + g_models[index]++; + AssignModel(client, g_SurvivorNames[index], g_IdentityFix); + i = 4; // we want to fall through + break; + } + + if (set != 0 && index + 1 == sizeof(g_models)) { + index=-1; set=0; + } + } + } + } +} + +int GetSurvivorSet(int client) { + Echo(6, "GetSurvivorSet: %d", client); + + if (g_survivorSetScan && IsClientValid(client, 2)) { + g_survivorSetScan = false; + g_survivorSet = GetClientModelIndex(client); + + if (g_survivorSet >= 0 && g_survivorSet <= 3) { + g_survivorSet = 0; + } else { + g_survivorSet = 4; + } + } + + return g_survivorSet; +} + +void GetAllSurvivorModels(int client=-1) { + Echo(2, "GetAllSurvivorModels"); + + static int index; + static const int models[8]; + g_models = models; + + for (int i = 1; i <= MaxClients; i++) { + if (client == i) { + continue; + } + + index = -1; + + if (GetQRecord(i) && g_onteam == 2 && g_model[0] != EOS) { + index = GetModelIndexByName(g_model, 2); + } + + else if (IsClientValid(i, 2, 0) && GetRealClient(i) == i) { + index = GetClientModelIndex(i); + } + + if (index >= 0) { + g_models[index]++; + } + } +} + +void PrecacheModels() { + Echo(2, "PrecacheModels"); + + for (int i = 0; i < sizeof(g_SurvivorPaths); i++) { + PrecacheModel(g_SurvivorPaths[i]); + } +} + +void AssignModel(int client, char [] model, int identityFix) { + Echo(2, "AssignModel: %d %s %d", client, model, identityFix); + + if (identityFix == 1 && IsClientValid(client, 2)) { + if (IsClientsModel(client, model)) { + return; + } + + int i = GetModelIndexByName(model); + int realClient = GetRealClient(client); + + if (i >= 0 && i < sizeof(g_SurvivorPaths)) { + if(i == 5) { + SetEntProp(client, Prop_Send, "m_survivorCharacter", g_Zoey); + } else { + SetEntProp(client, Prop_Send, "m_survivorCharacter", i); + } + + SetEntityModel(client, g_SurvivorPaths[i]); + Format(g_pN, sizeof(g_pN), "%s", g_SurvivorNames[i]); + + if (IsFakeClient(client)) { + SetClientInfo(client, "name", g_pN); + } + + if (GetQRecord(realClient)) { + g_QRecord.SetString("model", g_pN, true); + } + } + } +} + +int GetClientModelIndex(int client) { + Echo(3, "GetClientModelIndex: %d", client); + + if (!IsClientValid(client)) { + return -2; + } + + char modelName[64]; + + GetEntPropString(client, Prop_Data, "m_ModelName", modelName, sizeof(modelName)); + for (int i = 0; i < sizeof(g_SurvivorPaths); i++) { + if (StrEqual(modelName, g_SurvivorPaths[i], false)) { + return i; + } + } + + return -1; +} + +int GetModelIndexByName(char [] name, int onteam=2) { + Echo(2, "GetModelIndexByName: %s %d", name, onteam); + + if (onteam == 2) { + for (int i; i < sizeof(g_SurvivorNames); i++) { + if (StrContains(name, g_SurvivorNames[i], false) != -1) { + return i; + } + } + } + + else if (onteam == 3) { + for (int i; i < sizeof(g_InfectedNames); i++) { + if (StrContains(g_InfectedNames[i], name, false) != -1) { + return i; + } + } + } + + return -1; +} + +bool IsClientsModel(int client, char [] name) { + Echo(2, "IsClientsModel: %d %s", client, name); + + int modelIndex = GetClientModelIndex(client); + Format(g_sB, sizeof(g_sB), "%s", g_SurvivorNames[modelIndex]); + return StrEqual(name, g_sB); +} + +void GetBotCharacter(int client, char strBuffer[32]) { + Echo(2, "GetBotCharacter: %d", client); + + if (IsClientValid(client)) { + strBuffer = ""; + + switch (GetClientTeam(client)) { + case 2: GetSurvivorCharacter(client, strBuffer); + case 3: GetInfectedCharacter(client, strBuffer); + } + } +} + +void GetSurvivorCharacter(int client, char strBuffer[32]) { + Echo(2, "GetSurvivorCharacter: %d %s", client, strBuffer); + + GetEntPropString(client, Prop_Data, "m_ModelName", g_sB, sizeof(g_sB)); + for (int i = 0; i < sizeof(g_SurvivorPaths); i++) { + if (StrEqual(g_SurvivorPaths[i], g_sB)) { + Format(strBuffer, sizeof(strBuffer), g_SurvivorNames[i]); + break; + } + } +} + +void GetInfectedCharacter(int client, char strBuffer[32]) { + Echo(2, "GetInfectedCharacter: %d %s", client, strBuffer); + + switch (GetEntProp(client, Prop_Send, "m_zombieClass")) { + case 1: strBuffer = "Smoker"; + case 2: strBuffer = "Boomer"; + case 3: strBuffer = "Hunter"; + case 4: strBuffer = "Spitter"; + case 5: strBuffer = "Jockey"; + case 6: strBuffer = "Charger"; + case 8: strBuffer = "Tank"; + } +} + +// ================================================================== // +// BLACK MAGIC SIGNATURES. SOME SPOOKY SHIT. +// ================================================================== // + +int GetOS() { + Echo(2, "GetOS"); + return GameConfGetOffset(g_GameData, "OS"); +} + +void RoundRespawnSig(int client) { + Echo(2, "RoundRespawnSig: %d", client); + + static Handle hRoundRespawn; + if (hRoundRespawn == null) { + StartPrepSDKCall(SDKCall_Player); + PrepSDKCall_SetFromConf(g_GameData, SDKConf_Signature, "RoundRespawn"); + hRoundRespawn = EndPrepSDKCall(); + } + + if (hRoundRespawn != null) { + SDKCall(hRoundRespawn, client); + } + + else { + PrintToChat(client, "[ABM] RoundRespawnSig Signature broken."); + SetFailState("[ABM] RoundRespawnSig Signature broken."); + } +} + +void SetHumanSpecSig(int bot, int client) { + Echo(2, "SetHumanSpecSig: %d %d", bot, client); + + static Handle hSpec; + if (hSpec == null) { + StartPrepSDKCall(SDKCall_Player); + PrepSDKCall_SetFromConf(g_GameData, SDKConf_Signature, "SetHumanSpec"); + PrepSDKCall_AddParameter(SDKType_CBasePlayer, SDKPass_Pointer); + hSpec = EndPrepSDKCall(); + } + + if (IsClientValid(client) && IsClientValid(bot)) { + if(hSpec != null) { + SDKCall(hSpec, bot, client); + ResetClientSpecUserId(client, bot); + } + + else { + PrintToChat(client, "[ABM] SetHumanSpecSig Signature broken."); + SetFailState("[ABM] SetHumanSpecSig Signature broken."); + } + } +} + +void ResetClientSpecUserId(int client, int target) { + Echo(2, "ResetClientSpecUserId: %d %d", client, target); + + if (!IsClientValid(client) || !IsClientValid(target)) { + return; + } + + static int spec, userid; + userid = GetClientUserId(client); + + for (int i = 1; i <= MaxClients; i++) { + if (IsClientValid(i, 2, 0)) { + if (HasEntProp(i, Prop_Send, "m_humanSpectatorUserID")) { + spec = GetEntProp(i, Prop_Send, "m_humanSpectatorUserID"); + if (userid == spec && i != target) { + SetEntProp(i, Prop_Send, "m_humanSpectatorUserID", 0); + } + } + } + } +} + +void State_TransitionSig(int client, int mode) { + Echo(2, "State_TransitionSig: %d %d", client, mode); + + static Handle hSpec; + if (hSpec == null) { + StartPrepSDKCall(SDKCall_Player); + PrepSDKCall_SetFromConf(g_GameData, SDKConf_Signature, "State_Transition"); + PrepSDKCall_AddParameter(SDKType_PlainOldData , SDKPass_Plain); + hSpec = EndPrepSDKCall(); + } + + if(hSpec != null) { + SDKCall(hSpec, client, mode); // mode 8, press 8 to get closer + } + + else { + PrintToChat(client, "[ABM] State_TransitionSig Signature broken."); + SetFailState("[ABM] State_TransitionSig Signature broken."); + } +} + +bool TakeoverBotSig(int client, int target) { + Echo(2, "TakeoverBotSig: %d %d", client, target); + + if (!GetQRecord(client)) { + return false; + } + + static Handle hSwitch; + + if (hSwitch == null) { + StartPrepSDKCall(SDKCall_Player); + PrepSDKCall_SetFromConf(g_GameData, SDKConf_Signature, "TakeOverBot"); + PrepSDKCall_AddParameter(SDKType_Bool, SDKPass_Plain); + hSwitch = EndPrepSDKCall(); + } + + if (hSwitch != null) { + if (IsClientInKickQueue(target)) { + KickClient(target); + } + + else if (IsClientValid(target, 2, 0)) { + SwitchToSpec(client); + + if (GetRealClient(target) != client) { + GetBotCharacter(target, g_model); + g_QRecord.SetString("model", g_model, true); + } + + SetHumanSpecSig(target, client); + SDKCall(hSwitch, client, true); + + GetConVarString(g_cvGameMode, g_sB, sizeof(g_sB)); + SendConVarValue(client, g_cvGameMode, g_sB); + return true; + } + } + + else { + PrintToChat(client, "[ABM] TakeoverBotSig Signature broken."); + SetFailState("[ABM] TakeoverBotSig Signature broken."); + } + + g_QRecord.SetValue("lastid", target, true); + if (GetClientTeam(client) == 1) { + QueueUp(client, 2); + } + + return false; +} + +bool TakeoverZombieBotSig(int client, int target, bool si_ghost) { + Echo(2, "TakeoverZombieBotSig: %d %d %d", client, target, si_ghost); + + if (!GetQRecord(client)) { + return false; + } + + static Handle hSwitch; + + if (hSwitch == null) { + StartPrepSDKCall(SDKCall_Player); + PrepSDKCall_SetFromConf(g_GameData, SDKConf_Signature, "TakeOverZombieBot"); + PrepSDKCall_AddParameter(SDKType_CBasePlayer, SDKPass_Pointer); + hSwitch = EndPrepSDKCall(); + } + + if (hSwitch != null) { + if (IsClientInKickQueue(target)) { + KickClient(target); + } + + else if (IsClientValid(target, 3, 0) && IsPlayerAlive(target)) { + SwitchToSpec(client); + SDKCall(hSwitch, client, target); + + if (si_ghost) { + State_TransitionSig(client, 8); + if (GetEntProp(client, Prop_Send, "m_zombieClass") == 8) { + CreateTimer(1.0, ForceSpawnTimer, client, TIMER_REPEAT); + } + } + + // trade off, see ladders, not survivors + SendConVarValue(client, g_cvGameMode, "versus"); + SendConVarValue(client, g_cvConsistency, g_consistency); + return true; + } + } + + else { + PrintToChat(client, "[ABM] TakeoverZombieBotSig Signature broken."); + SetFailState("[ABM] TakeoverZombieBotSig Signature broken."); + } + + g_QRecord.SetValue("lastid", target, true); + if (GetClientTeam(client) == 1) { + QueueUp(client, 3); + } + + return false; +} + +// ================================================================== // +// PUBLIC INTERFACE AND MENU HANDLERS +// ================================================================== // + +public Action TeleportClientCmd(int client, int args) { + Echo(2, "TeleportClientCmd: %d", client); + + int level; + + switch(args) { + case 1: { + GetCmdArg(1, g_sB, sizeof(g_sB)); + menuArg1 = StringToInt(g_sB); + } + + case 2: { + GetCmdArg(1, g_sB, sizeof(g_sB)); + menuArg0 = StringToInt(g_sB); + GetCmdArg(2, g_sB, sizeof(g_sB)); + menuArg1 = StringToInt(g_sB); + } + } + + if (args) { + level = 2; + } + + TeleportClientHandler(client, level); + return Plugin_Handled; +} + +public void TeleportClientHandler(int client, int level) { + Echo(2, "TeleportClientHandler: %d %d", client, level); + + if (!RegMenuHandler(client, "TeleportClientHandler", level, 0)) { + return; + } + + switch(level) { + case 0: TeamMatesMenu(client, "Teleport Client", 2, 1); + case 1: { + GetClientName(menuArg0, g_sB, sizeof(g_sB)); + Format(g_sB, sizeof(g_sB), "%s: Teleporting", g_sB); + TeamMatesMenu(client, g_sB, 2, 1); + } + + case 2: { + if (CanClientTarget(client, menuArg0)) { + if (GetClientTeam(menuArg0) <= 1) { + menuArg0 = GetPlayClient(menuArg0); + } + + TeleportClient(menuArg0, menuArg1); + } + + GenericMenuCleaner(client); + } + } +} + +public Action SwitchTeamCmd(int client, int args) { + Echo(2, "SwitchTeamCmd: %d", client); + + int level; + + char model[32]; + GetCmdArg(args, model, sizeof(model)); + int result = StringToInt(model); + CleanSIName(model); + + if (args == 1 || args == 2 && result == 0) { + menuArg0 = client; + GetCmdArg(1, g_sB, sizeof(g_sB)); + menuArg1 = StringToInt(g_sB); + } + + else if (args >= 2) { + GetCmdArg(1, g_sB, sizeof(g_sB)); + menuArg0 = StringToInt(g_sB); + GetCmdArg(2, g_sB, sizeof(g_sB)); + menuArg1 = StringToInt(g_sB); + } + + if (args) { + level = 2; + } + + else if (!IsAdmin(client)) { + menuArg0 = client; + level = 1; + } + + if (menuArg1 != 3) { + model = ""; + } + + SwitchTeamHandler(client, level, model); + return Plugin_Handled; +} + +public void SwitchTeamHandler(int client, int level, char model[32]) { + Echo(2, "SwitchTeamHandler: %d %d %s", client, level, model); + + if (!RegMenuHandler(client, "SwitchTeamHandler", level, 0)) { + return; + } + + switch(level) { + case 0: TeamMatesMenu(client, "Switch Client's Team", 1); + case 1: { + GetClientName(menuArg0, g_sB, sizeof(g_sB)); + Format(g_sB, sizeof(g_sB), "%s: Switching", g_sB); + TeamsMenu(client, g_sB); + } + + case 2: { + if (CanClientTarget(client, menuArg0)) { + if (!g_IsVs && !IsAdmin(client) && menuArg1 == 3) { + GenericMenuCleaner(client); + return; + } + + if (GetQRecord(menuArg0)) { + g_QRecord.SetValue("rdelay", 0.1, true); + SwitchToSpec(menuArg0); + } + + SwitchTeam(menuArg0, menuArg1, model); + } + + GenericMenuCleaner(client); + } + } +} + +public Action AssignModelCmd(int client, int args) { + Echo(2, "AssignModelCmd: %d", client); + + int level; + + switch(args) { + case 1: { + menuArg0 = client; + GetCmdArg(1, g_sB, sizeof(g_sB)); + menuArg1 = GetModelIndexByName(g_sB); + } + + case 2: { + GetCmdArg(1, g_sB, sizeof(g_sB)); + menuArg1 = GetModelIndexByName(g_sB); + GetCmdArg(2, g_sB, sizeof(g_sB)); + menuArg0 = StringToInt(g_sB); + } + } + + if (args) { + level = 2; + } + + AssignModelHandler(client, level); + return Plugin_Handled; +} + +public void AssignModelHandler(int client, int level) { + Echo(2, "AssignModelHandler: %d %d", client, level); + + if (!RegMenuHandler(client, "AssignModelHandler", level, 0)) { + return; + } + + switch(level) { + case 0: TeamMatesMenu(client, "Change Client's Model", 2, 0, false); + case 1: { + GetClientName(menuArg0, g_sB, sizeof(g_sB)); + Format(g_sB, sizeof(g_sB), "%s: Modeling", g_sB); + ModelsMenu(client, g_sB); + } + + case 2: { + if (CanClientTarget(client, menuArg0)) { + if (GetClientTeam(menuArg0) <= 1) { + menuArg0 = GetPlayClient(menuArg0); + } + + AssignModel(menuArg0, g_SurvivorNames[menuArg1], 1); + } + + GenericMenuCleaner(client); + } + } +} + +public Action SwitchToBotCmd(int client, int args) { + Echo(2, "SwitchToBotCmd: %d", client); + + int level; + + switch(args) { + case 1: { + menuArg0 = client; + GetCmdArg(1, g_sB, sizeof(g_sB)); + menuArg1 = StringToInt(g_sB); + } + + case 2: { + GetCmdArg(1, g_sB, sizeof(g_sB)); + menuArg0 = StringToInt(g_sB); + GetCmdArg(2, g_sB, sizeof(g_sB)); + menuArg1 = StringToInt(g_sB); + } + } + + if (args) { + level = 2; + } + + else if (!IsAdmin(client)) { + menuArg0 = client; + level = 1; + } + + SwitchToBotHandler(client, level); + return Plugin_Handled; +} + +public void SwitchToBotHandler(int client, int level) { + Echo(2, "SwitchToBotHandler: %d %d", client, level); + + int homeTeam = ClientHomeTeam(client); + if (!RegMenuHandler(client, "SwitchToBotHandler", level, 0)) { + return; + } + + switch(level) { + case 0: TeamMatesMenu(client, "Takeover Bot", 1); + case 1: { + GetClientName(menuArg0, g_sB, sizeof(g_sB)); + Format(g_sB, sizeof(g_sB), "%s: Takeover", g_sB); + TeamMatesMenu(client, g_sB, 0, 0, true, false, homeTeam); + } + + case 2: { + if (CanClientTarget(client, menuArg0)) { + if (IsClientValid(menuArg1)) { + if (homeTeam != 3 && GetClientTeam(menuArg1) == 3) { + if (!IsAdmin(client)) { + GenericMenuCleaner(client); + return; + } + } + + if (GetClientManager(menuArg1) == 0) { + SwitchToBot(menuArg0, menuArg1, false); + } + } + } + + GenericMenuCleaner(client); + } + } +} + +public Action RespawnClientCmd(int client, int args) { + Echo(2, "RespawnClientCmd: %d", client); + + int level; + + switch(args) { + case 1: { + GetCmdArg(1, g_sB, sizeof(g_sB)); + menuArg0 = StringToInt(g_sB); + menuArg1 = menuArg0; + } + + case 2: { + GetCmdArg(1, g_sB, sizeof(g_sB)); + menuArg0 = StringToInt(g_sB); + GetCmdArg(2, g_sB, sizeof(g_sB)); + menuArg1 = StringToInt(g_sB); + } + } + + if (args) { + level = 2; + } + + RespawnClientHandler(client, level); + return Plugin_Handled; +} + +public void RespawnClientHandler(int client, int level) { + Echo(2, "RespawnClientHandler: %d %d", client, level); + + if (!RegMenuHandler(client, "RespawnClientHandler", level, 0)) { + return; + } + + switch(level) { + case 0: TeamMatesMenu(client, "Respawn Client"); + case 1: { + GetClientName(menuArg0, g_sB, sizeof(g_sB)); + Format(g_sB, sizeof(g_sB), "%s: Respawning", g_sB); + TeamMatesMenu(client, g_sB); + } + + case 2: { + if (CanClientTarget(client, menuArg0)) { + if (GetClientTeam(menuArg0) <= 1) { + menuArg0 = GetPlayClient(menuArg0); + } + + RespawnClient(menuArg0, menuArg1); + } + + GenericMenuCleaner(client); + } + } +} + +public Action CycleBotsCmd(int client, int args) { + Echo(2, "CycleBotsCmd: %d", client); + + int level; + + switch(args) { + case 1: { + menuArg0 = client; + GetCmdArg(1, g_sB, sizeof(g_sB)); + menuArg1 = StringToInt(g_sB); + } + + case 2: { + GetCmdArg(1, g_sB, sizeof(g_sB)); + menuArg0 = StringToInt(g_sB); + GetCmdArg(2, g_sB, sizeof(g_sB)); + menuArg1 = StringToInt(g_sB); + } + } + + if (args) { + if (menuArg1 > 3 || menuArg1 < 2) { + return Plugin_Handled; + } + + level = 2; + } + + CycleBotsHandler(client, level); + return Plugin_Handled; +} + +public void CycleBotsHandler(int client, int level) { + Echo(2, "CycleBotsHandler: %d %d", client, level); + + if (!RegMenuHandler(client, "CycleBotsHandler", level, 0)) { + return; + } + + switch(level) { + case 0: TeamMatesMenu(client, "Cycle Client", 1); + case 1: { + GetClientName(menuArg0, g_sB, sizeof(g_sB)); + Format(g_sB, sizeof(g_sB), "%s: Cycling", g_sB); + TeamsMenu(client, g_sB, false); + } + + case 2: { + if (CanClientTarget(client, menuArg0)) { + if (!IsAdmin(client) && menuArg1 == 3) { + GenericMenuCleaner(client); + return; + } + + CycleBots(menuArg0, menuArg1); + menuArg1 = 0; + } + + CycleBotsHandler(client, 1); + } + } +} + +public Action StripClientCmd(int client, int args) { + Echo(2, "StripClientCmd: %d", client); + + int target; + int level; + + switch(args) { + case 1: { + GetCmdArg(1, g_sB, sizeof(g_sB)); + target = StringToInt(g_sB); + target = GetPlayClient(target); + + if (CanClientTarget(client, target)) { + StripClient(target); + } + + return Plugin_Handled; + } + + case 2: { + GetCmdArg(1, g_sB, sizeof(g_sB)); + menuArg0 = StringToInt(g_sB); + GetCmdArg(2, g_sB, sizeof(g_sB)); + menuArg1 = StringToInt(g_sB); + } + } + + if (args) { + level = 2; + } + + StripClientHandler(client, level); + return Plugin_Handled; +} + +public void StripClientHandler(int client, int level) { + Echo(2, "StripClientHandler: %d %d", client, level); + + if (!RegMenuHandler(client, "StripClientHandler", level, 0)) { + return; + } + + switch(level) { + case 0: TeamMatesMenu(client, "Strip Client", 2, 1); + case 1: { + GetClientName(menuArg0, g_sB, sizeof(g_sB)); + Format(g_sB, sizeof(g_sB), "%s: Stripping", g_sB); + InvSlotsMenu(client, menuArg0, g_sB); + } + + case 2: { + if (CanClientTarget(client, menuArg0)) { + if (GetClientTeam(menuArg0) <= 1) { + menuArg0 = GetPlayClient(menuArg0); + } + + StripClientSlot(menuArg0, menuArg1); + menuArg1 = 0; + StripClientHandler(client, 1); + } + } + } +} + +public Action ResetCmd(int client, int args) { + Echo(2, "ResetCmd: %d", client); + + for (int i = 1; i <= MaxClients; i++) { + GenericMenuCleaner(i); + if (GetQRecord(i)) { + CancelClientMenu(i, true, null); + } + } + return Plugin_Handled; +} + +bool RegMenuHandler(int client, char [] handler, int level, int clearance=0) { + Echo(2, "RegMenuHandler: %d %s %d %d", client, handler, level, clearance); + + g_callBacks.PushString(handler); + if (!IsAdmin(client) && level <= clearance) { + GenericMenuCleaner(client); + return false; + } + + return true; +} + +public Action MainMenuCmd(int client, int args) { + Echo(2, "MainMenuCmd: %d", client); + + GenericMenuCleaner(client); + MainMenuHandler(client, 0); + return Plugin_Handled; +} + +public void MainMenuHandler(int client, int level) { + Echo(2, "MainMenuHandler: %d %d", client, level); + + if (!RegMenuHandler(client, "MainMenuHandler", level, 0)) { + return; + } + + int cmd = menuArg0; + menuArg0 = 0; + + char title[32]; + Format(title, sizeof(title), "ABM Menu %s", PLUGIN_VERSION); + + switch(level) { + case 0: MainMenu(client, title); + case 1: { + switch(cmd) { + case 0: TeleportClientCmd(client, 0); + case 1: SwitchTeamCmd(client, 0); + case 2: AssignModelCmd(client, 0); + case 3: SwitchToBotCmd(client, 0); + case 4: RespawnClientCmd(client, 0); + case 5: CycleBotsCmd(client, 0); + case 6: StripClientCmd(client, 0); + } + } + } +} + +// ================================================================== // +// MENUS BACKBONE +// ================================================================== // + +void GenericMenuCleaner(int client, bool clearStack=true) { + Echo(2, "GenericMenuCleaner: %d %d", client, clearStack); + + for (int i = 0; i < sizeof(g_menuItems[]); i++) { + g_menuItems[client][i] = 0; + } + + if (clearStack == true) { + if (g_callBacks != null) { + delete g_callBacks; + } + + g_callBacks = new ArrayStack(128); + } +} + +public int GenericMenuHandler(Menu menu, MenuAction action, int param1, int param2) { + Echo(2, "GenericMenuHandler: %d %d", param1, param2); + + int client = param1; + int i; // -1; + char sB[128]; + + if (IsClientValid(param1)) { + for (i = 0; i < sizeof(g_menuItems[]); i++) { + if (menuArgs[i] == 0) { + break; + } + } + } + + switch(action) { + case MenuAction_Select: { + menu.GetItem(param2, g_sB, sizeof(g_sB)); + menuArgs[i] = StringToInt(g_sB); + i = i + 1; + } + + case MenuAction_Cancel: { + if (param2 == MenuCancel_ExitBack) { + if (i > 0) { + i = i - 1; + menuArgs[i] = 0; + } + + else if (i == 0) { + + if (g_callBacks.Empty) { + GenericMenuCleaner(param1); + return 0; + } + + g_callBacks.PopString(g_sB, sizeof(g_sB)); + GenericMenuCleaner(param1, false); + + while (!g_callBacks.Empty) { + g_callBacks.PopString(sB, sizeof(sB)); + + if (!StrEqual(g_sB, sB)) { + g_callBacks.PushString(sB); + break; + } + } + + if (g_callBacks.Empty) { + GenericMenuCleaner(param1); + return 0; + } + } + } + + else { + return 0; + } + } + + case MenuAction_End: { + delete menu; + return 0; + } + } + + if (g_callBacks == null || g_callBacks.Empty) { + GenericMenuCleaner(param1); + return 0; + } + + g_callBacks.PopString(g_sB, sizeof(g_sB)); + callBack = GetFunctionByName(null, g_sB); + + Call_StartFunction(null, callBack); + Call_PushCell(param1); + Call_PushCell(i); + Call_Finish(); + return 0; +} + +// ================================================================== // +// MENUS +// ================================================================== // + +void MainMenu(int client, char [] title) { + Echo(2, "MainMenu: %d %s", client, title); + + Menu menu = new Menu(GenericMenuHandler); + menu.SetTitle(title); + menu.AddItem("0", "Teleport Client"); // "Telespiznat"); // teleport + menu.AddItem("1", "Switch Client Team"); //"Swintootle"); // switch team + menu.AddItem("2", "Change Client Model"); //"Changdangle"); // makeover + menu.AddItem("3", "Switch Client Bot"); //"Inbosnachup"); // takeover + menu.AddItem("4", "Respawn Client"); //"Respiggle"); // respawn + menu.AddItem("5", "Cycle Client"); //"Cycolicoo"); // cycle + menu.AddItem("6", "Strip Client"); //"Upsticky"); // strip + menu.ExitBackButton = true; + menu.ExitButton = true; + menu.Display(client, 120); +} + +void InvSlotsMenu(int client, int target, char [] title) { + Echo(2, "InvSlotsMenu: %d %d %s", client, target, title); + + int ent; + char weapon[64]; + Menu menu = new Menu(GenericMenuHandler); + menu.SetTitle(title); + + for (int i; i < 5; i++) { + IntToString(i, g_sB, sizeof(g_sB)); + ent = GetPlayerWeaponSlot(target, i); + + if (IsEntityValid(ent)) { + GetEntityClassname(ent, weapon, sizeof(weapon)); + menu.AddItem(g_sB, weapon); + } + } + + menu.ExitBackButton = true; + menu.ExitButton = true; + menu.Display(client, 120); +} + +void ModelsMenu(int client, char [] title) { + Echo(2, "ModelsMenu: %d %s", client, title); + + Menu menu = new Menu(GenericMenuHandler); + menu.SetTitle(title); + + for (int i; i < sizeof(g_SurvivorNames); i++) { + IntToString(i, g_sB, sizeof(g_sB)); + menu.AddItem(g_sB, g_SurvivorNames[i]); + } + + menu.ExitBackButton = true; + menu.ExitButton = true; + menu.Display(client, 120); +} + +void TeamsMenu(int client, char [] title, bool all=true) { + Echo(2, "TeamsMenu: %d %s %d", client, title, all); + + Menu menu = new Menu(GenericMenuHandler); + menu.SetTitle(title); + + if (all) { + menu.AddItem("0", "Idler"); + menu.AddItem("1", "Spectator"); + } + + menu.AddItem("2", "Survivor"); + if (g_IsVs || IsAdmin(client)) { + menu.AddItem("3", "Infected"); + } + + menu.ExitBackButton = true; + menu.ExitButton = true; + menu.Display(client, 120); +} + +void TeamMatesMenu(int client, char [] title, int mtype=2, int target=0, bool incDead=true, + bool repeat=false, int homeTeam=0) { + Echo(2, "TeamMatesMenu: %d %s %d %d %d %d %d", client, title, mtype, target, incDead, repeat, homeTeam); + + Menu menu = new Menu(GenericMenuHandler); + menu.SetTitle(title); + int isAdmin = IsAdmin(client); + char health[32]; + bool mflag = false; + int isAlive; + int playClient; + int bossClient; + int targetClient; + int manager; + + for (int i = 1; i <= MaxClients; i++) { + bossClient = i; + playClient = i; + + if (GetQRecord(i)) { + + if (mtype == 0) { + continue; + } + + if (mtype == 1 || mtype == 2) { + mflag = true; + } + + if (IsClientValid(g_target) && g_target != i) { + isAlive = IsPlayerAlive(g_target); + playClient = g_target; + } + + else { + isAlive = IsPlayerAlive(i); + } + } + + else if (IsClientValid(i)) { + isAlive = IsPlayerAlive(i); + + if (mtype == 0 || mtype == 2) { + mflag = true; + } + + manager = GetClientManager(i); + + if (manager != 0) { + if (target == 0 || !repeat) { + mflag = false; + continue; + } + + bossClient = manager; + } + } + + else { + continue; + } + + // at this point the client is valid. + // bossClient is the human (if there is one) + // playClient is the bot (or human if not idle) + + if (!isAlive && !incDead) { + continue; + } + + if (GetClientTeam(playClient) != homeTeam && !isAdmin) { + continue; + } + + switch(target) { + case 0: targetClient = bossClient; + case 1: targetClient = playClient; + } + + if (mflag) { + mflag = false; + + Format(health, sizeof(health), "%d", GetClientHealth(playClient)); + if (!IsPlayerAlive(playClient)) { + Format(health, sizeof(health), "DEAD"); + } + + else if (GetEntProp(playClient, Prop_Send, "m_isIncapacitated")) { + Format(health, sizeof(health), "DOWN"); + } + + GetClientName(bossClient, g_pN, sizeof(g_pN)); + Format(g_pN, sizeof(g_pN), "%s (%s)", g_pN, health); + IntToString(targetClient, g_sB, sizeof(g_sB)); + + if(bossClient == client && menu.ItemCount > 0) { + menu.InsertItem(0, g_sB, g_pN); + } else { + menu.AddItem(g_sB, g_pN); + } + } + } + + menu.ExitBackButton = true; + menu.ExitButton = true; + menu.Display(client, 120); +} + +// ================================================================== // +// MISC STUFF USEFUL FOR TROUBLESHOOTING +// ================================================================== // + +void Echo(int level, char [] format, any ...) { + static char g_dB[512]; + + if (g_LogLevel >= level) { + VFormat(g_dB, sizeof(g_dB), format, 3); + LogToFile(LOGFILE, g_dB); + PrintToServer("%s", g_dB); + } +} + +void QDBCheckCmd(int client) { + Echo(2, "QDBCheckCmd"); + + PrintToConsole(client, "-- STAT: QDB Size is %d", g_QDB.Size); + PrintToConsole(client, "-- MinPlayers is %d", g_MinPlayers); + + for (int i = 1; i <= MaxClients; i++) { + if (GetQRtmp(i)) { + PrintToConsole(client, "\n -"); + GetClientName(i, g_pN, sizeof(g_pN)); + + float x = g_origin[0]; + float y = g_origin[1]; + float z = g_origin[2]; + + PrintToConsole(client, " - Name: %s", g_pN); + PrintToConsole(client, " - Origin: {%d.0, %d.0, %d.0}", x, y, z); + PrintToConsole(client, " - Status: %d", g_tmpStatus); + PrintToConsole(client, " - Client: %d", g_tmpClient); + PrintToConsole(client, " - Target: %d", g_tmpTarget); + PrintToConsole(client, " - LastId: %d", g_tmpLastid); + PrintToConsole(client, " - OnTeam: %d", g_tmpOnteam); + PrintToConsole(client, " - Queued: %d", g_tmpQueued); + PrintToConsole(client, " - InSpec: %d", g_tmpInspec); + PrintToConsole(client, " - Model: %s", g_tmpModel); + PrintToConsole(client, " -\n"); + } + } +} + +Action QuickClientPrintCmd(int client, int args) { + Echo(2, "QuickClientPrintCmd: %d", client); + + int onteam; + int state; + int manager; + + PrintToConsole(client, "\nTeam\tState\tId\tManager\tName"); + + for (int i = 1; i <= MaxClients; i++) { + if (IsClientValid(i)) { + manager = i; + GetClientName(i, g_pN, sizeof(g_pN)); + onteam = GetClientTeam(i); + state = IsPlayerAlive(i); + + + if (IsFakeClient(i)) { + manager = GetClientManager(i); + } + + PrintToConsole(client, + "%d, \t%d, \t%d, \t%d, \t%s", onteam, state, i, manager, g_pN + ); + } + } + + QDBCheckCmd(client); + return Plugin_Handled; +} +Action DebugCmd(int client, int args) { + ReplyToCommand(client, "CreateSurvivorBot: %b", GetFeatureStatus(FeatureType_Native, "NextBotCreatePlayerBotSurvivorBot") == FeatureStatus_Available); + return Plugin_Handled; +} \ No newline at end of file diff --git a/scripting/include/epi/director.sp b/scripting/include/epi/director.sp index df372c7..a3e836e 100644 --- a/scripting/include/epi/director.sp +++ b/scripting/include/epi/director.sp @@ -454,13 +454,11 @@ Action Timer_DirectorWitch(Handle h) { void DirectorSpawn(specialType special, int player = -1) { if(player <= 0) player = GetSuitableVictim(); - // PrintDebug(DEBUG_SPAWNLOGIC, "Director: spawning %s(%d) around %N (cnt=%d,lim=%d)", SPECIAL_IDS[view_as(special)], special, player, g_spawnCount[view_as(special)], g_spawnLimit[view_as(special)]); if(special != Special_Witch && special != Special_Tank) { // Bypass director int bot = CreateFakeClient("EPI_BOT"); if (bot != 0) { ChangeClientTeam(bot, 3); - CreateTimer(0.1, Timer_Kick, bot); } } diff --git a/scripting/include/hats/hat_presets.sp b/scripting/include/hats/hat_presets.sp index 2f0e258..5e96687 100644 --- a/scripting/include/hats/hat_presets.sp +++ b/scripting/include/hats/hat_presets.sp @@ -17,8 +17,14 @@ enum struct HatPreset { ArrayList locations; int Spawn() { - PrecacheModel(this.model); + if(!PrecacheModel(this.model)) { + LogError("[Hats] Failed to precache preset model: \"%s\"", this.model); + } int entity = CreateEntityByName(this.type); + if(entity == -1) { + LogError("[Hats] Failed to spawn hat for type %s: \"%s\"", this.type, this.model); + } + DispatchKeyValue(entity, "solid", "6"); DispatchKeyValue(entity, "model", this.model); if(HasEntProp(entity, Prop_Send, "m_flModelScale")) SetEntPropFloat(entity, Prop_Send, "m_flModelScale", this.size); @@ -29,8 +35,8 @@ enum struct HatPreset { } int Apply(int client) { - int entity = this.Spawn(); float offset[3], angles[3]; + int entity = this.Spawn(offset); EquipHat(client, entity, this.type, HAT_PRESET); this.GetLocation(client, offset, angles); hatData[client].offset = offset; diff --git a/scripting/include/jutils.inc b/scripting/include/jutils.inc index 0854459..06f2e9a 100644 --- a/scripting/include/jutils.inc +++ b/scripting/include/jutils.inc @@ -266,38 +266,6 @@ stock bool GetGround(int client, float vPos[3], float vAng[3]) { GetClientAbsAngles(client, vAng); return true; } -//Taken from https://forums.alliedmods.net/showthread.php?p=1741099 -stock bool SpawnMinigun(const float vPos[3], const float vAng[3]) { - float vDir[3], newPos[3]; - GetAngleVectors(vAng, vDir, NULL_VECTOR, NULL_VECTOR); - vDir[0] = vPos[0] + (vDir[0] * 50); - vDir[1] = vPos[1] + (vDir[1] * 50); - vDir[2] = vPos[2] + 20.0; - newPos = vDir; - newPos[2] -= 40.0; - - Handle trace = TR_TraceRayFilterEx(vDir, newPos, MASK_SHOT, RayType_EndPoint, TraceFilter); - if(TR_DidHit(trace)) { - TR_GetEndPosition(vDir, trace); - - int minigun = CreateEntityByName("prop_mounted_machine_gun"); - minigun = EntIndexToEntRef(minigun); - SetEntityModel(minigun, MODEL_MINIGUN); - DispatchKeyValue(minigun, "targetname", "louis_holdout"); - DispatchKeyValueFloat(minigun, "MaxPitch", 360.00); - DispatchKeyValueFloat(minigun, "MinPitch", -360.00); - DispatchKeyValueFloat(minigun, "MaxYaw", 90.00); - newPos[2] += 0.1; - TeleportEntity(minigun, vDir, vAng, NULL_VECTOR); - DispatchSpawn(minigun); - delete trace; - return true; - }else{ - LogError("Spawn minigun trace failure"); - delete trace; - return false; - } -} stock int GiveClientWeaponLasers(int client, const char[] wpnName) { int entity = GiveClientWeapon(client, wpnName); diff --git a/scripting/l4d2_ai_minigun.sp b/scripting/l4d2_ai_minigun.sp index a92c898..b0a47bd 100644 --- a/scripting/l4d2_ai_minigun.sp +++ b/scripting/l4d2_ai_minigun.sp @@ -216,6 +216,38 @@ stock int SpawnSurvivor(const float vPos[3], const float vAng[3], const char[] m CreateTimer(6.0, spawn_minigun ? Timer_MoveMinigun : Timer_Move, bot_user_id); return bot_client_id; } +//Taken from https://forums.alliedmods.net/showthread.php?p=1741099 +stock bool SpawnMinigun(const float vPos[3], const float vAng[3]) { + float vDir[3], newPos[3]; + GetAngleVectors(vAng, vDir, NULL_VECTOR, NULL_VECTOR); + vDir[0] = vPos[0] + (vDir[0] * 50); + vDir[1] = vPos[1] + (vDir[1] * 50); + vDir[2] = vPos[2] + 20.0; + newPos = vDir; + newPos[2] -= 40.0; + + Handle trace = TR_TraceRayFilterEx(vDir, newPos, MASK_SHOT, RayType_EndPoint, TraceFilter); + if(TR_DidHit(trace)) { + TR_GetEndPosition(vDir, trace); + + int minigun = CreateEntityByName("prop_mounted_machine_gun"); + minigun = EntIndexToEntRef(minigun); + SetEntityModel(minigun, MODEL_MINIGUN); + DispatchKeyValue(minigun, "targetname", "louis_holdout"); + DispatchKeyValueFloat(minigun, "MaxPitch", 360.00); + DispatchKeyValueFloat(minigun, "MinPitch", -360.00); + DispatchKeyValueFloat(minigun, "MaxYaw", 90.00); + newPos[2] += 0.1; + TeleportEntity(minigun, vDir, vAng, NULL_VECTOR); + DispatchSpawn(minigun); + delete trace; + return true; + }else{ + LogError("Spawn minigun trace failure"); + delete trace; + return false; + } +} void AvoidCharacter(int type, bool avoid) { for( int i = 1; i <= MaxClients; i++ ) { diff --git a/scripting/l4d2_extraplayeritems.sp b/scripting/l4d2_extraplayeritems.sp index 34e4a59..596a2dd 100644 --- a/scripting/l4d2_extraplayeritems.sp +++ b/scripting/l4d2_extraplayeritems.sp @@ -555,6 +555,7 @@ Action Command_EpiVal(int client, int args) { PrintToConsole(client, "realSurvivorCount = %d", g_realSurvivorCount); PrintToConsole(client, "restCount = %d", g_restCount); PrintToConsole(client, "extraFinaleTankEnabled = %b", g_extraFinaleTankEnabled); + PrintToConsole(client, "g_areItemsPopulated = %b", g_areItemsPopulated); ReplyToCommand(client, "Values printed to console"); return Plugin_Handled; } @@ -1187,10 +1188,11 @@ void IncreaseKits() { PrintToServer("[EPI] Warn: No kit spawns (weapon_first_aid_kit_spawn) found"); return; } - + int count = 0; while(g_extraKitsAmount > 0) { GetEntPropVector(entity, Prop_Data, "m_vecOrigin", pos); if(L4D_IsPositionInLastCheckpoint(pos)) { + count++; // Give it a little chance to nudge itself pos[2] += 0.3; SpawnItem("first_aid_kit", pos); @@ -1200,6 +1202,10 @@ void IncreaseKits() { // Loop around if(entity == INVALID_ENT_REFERENCE) { entity = -1; + // If we did not find any suitable kits, stop here. + if(count == 0) { + break; + } } } } @@ -1208,12 +1214,15 @@ void IncreaseFinaleKits() { float pos[3]; int entity = -1; int spawnCount = g_survivorCount - 4; + int count = 0; + PrintDebug(DEBUG_SPAWNLOGIC, "Spawning %d finale kits", spawnCount); while(spawnCount > 0) { GetEntPropVector(entity, Prop_Data, "m_vecOrigin", pos); Address address = L4D_GetNearestNavArea(pos); if(address != Address_Null) { int attributes = L4D_GetNavArea_SpawnAttributes(address); if(attributes & NAV_SPAWN_FINALE) { + count++; pos[2] += 0.3; SpawnItem("first_aid_kit", pos); spawnCount--; @@ -1223,6 +1232,10 @@ void IncreaseFinaleKits() { // Loop around if(entity == INVALID_ENT_REFERENCE) { entity = -1; + // If we did not find any suitable kits, stop here. + if(count == 0) { + break; + } } } } diff --git a/scripting/l4d2_turret.sp b/scripting/l4d2_turret.sp index f6cb857..5701ae5 100644 --- a/scripting/l4d2_turret.sp +++ b/scripting/l4d2_turret.sp @@ -17,12 +17,19 @@ #define _TURRET_PHASE_TICKS TURRET_NORMAL_PHASE_TICKS + TURRET_COMMON_PHASE_TICKS -#define PLUGIN_VERSION "1.0" +// Taken from l4d_machine, thanks +#define SOUND_IMPACT_HIT "physics/flesh/flesh_impact_bullet1.wav" +#define SOUND_IMPACT_MISS "physics/concrete/concrete_impact_bullet1.wav" +#define SOUND_FIRE "weapons/50cal/50cal_shoot.wav" +#define PARTICLE_WEAPON_TRACER "weapon_tracers_50cal" + +#define PLUGIN_VERSION "2.0" #include #include #include #include +#include // #include @@ -35,11 +42,39 @@ // #define SOUND_LASER_FIRE "level/puck_impact.wav" #include +enum MountedGun { + MountedGun_Minigun, + MountedGun_50Cal +} +char MountedGunClassname[2][32] = { "prop_minigun_l4d1", "prop_minigun" }; +char MountedGunModel[2][64] = { "models/w_models/weapons/w_minigun.mdl", "models/w_models/weapons/50cal.mdl" }; +float MOUNTED_HEAT_MIN[2] = { 0.01, 0.0 }; +float MOUNTED_HEAT_INCREASE_RATE[2] = { 0.0003333333, 0.0075}; +float MOUNTED_DAMAGE[2] = { 10.0, 100.0 }; +float MOUNTED_FIRE_RATE[2] = { 0.0, 0.25 }; // Only can fire every value game ticks +enum struct MountedTurret { + MountedGun type; + int entity; + float heat; + int target; + bool cooling; + float nextFire; + int poseParamYaw; + int poseParamPitch; + int poseController; //TODO: kill +} +#define MAX_MOUNTED_TURRETS 6 +MountedTurret MTurret[MAX_MOUNTED_TURRETS]; +int MTurretCount; +#define HEAT_DECREASE_RATE 0.01 + int g_iLaserIndex; int g_iBeamSprite; int g_iHaloSprite; +int g_iTracerIndex; int manualTargetter; +int g_debugTracer; Handle thinkTimer; ConVar cv_autoBaseDamage; @@ -51,6 +86,9 @@ int manualTarget = -1; #define MANUAL_TARGETNAME "turret_target_manual" ArrayList turretIds; +Handle SDKCall_LookupPoseParameter; +Handle SDKCall_LoadModel, SDKCall_DeleteModel; +int Animating_StudioHdr; /* TODO: Entity_ChangeOverTime` @@ -91,6 +129,52 @@ public void OnPluginStart() { SetFailState("This plugin is for L4D/L4D2 only."); } + GameData gameData = LoadGameConfigFile("l4d2_turret"); + if(!gameData) { + LogError("Missing gamedata l4d2_turret.txt, mounted turret disabled"); + } else { + // = + StartPrepSDKCall(SDKCall_Entity); + // CBaseAnimating::LookupPoseParameter(CStudioHdr*, char const*) + PrepSDKCall_SetFromConf(gameData, SDKConf_Signature, "CBaseAnimating::LookupPoseParameter"); + PrepSDKCall_AddParameter(SDKType_PlainOldData, SDKPass_Plain); + PrepSDKCall_AddParameter(SDKType_String, SDKPass_Pointer); + PrepSDKCall_SetReturnInfo(SDKType_PlainOldData, SDKPass_Plain); + SDKCall_LookupPoseParameter = EndPrepSDKCall(); + if(SDKCall_LookupPoseParameter == null) { + SetFailState("Failed to load SDK call \"CBaseAnimating::LookupPoseParameter\". Update signature in \"plugin.turret\""); + } + + // Taken from https://github.com/Natanel-Shitrit/StudioHdr/blob/d95e93134729361e06a0381a163de8b0b5625bc4/include/studio_hdr.inc#L4722 + // CStudioHdr *ModelSoundsCache_LoadModel( const char *filename ) + StartPrepSDKCall(SDKCall_Static); + PrepSDKCall_SetFromConf(gameData, SDKConf_Signature, "ModelSoundsCache_LoadModel"); + PrepSDKCall_AddParameter(SDKType_String, SDKPass_Pointer); + PrepSDKCall_SetReturnInfo(SDKType_PlainOldData, SDKPass_Plain); + if (!(SDKCall_LoadModel = EndPrepSDKCall())) { + SetFailState("Missing signature 'ModelSoundsCache_LoadModel'"); + } + + // void ModelSoundsCache_FinishModel( CStudioHdr *hdr ) + StartPrepSDKCall(SDKCall_Static); + PrepSDKCall_SetFromConf(gameData, SDKConf_Signature, "ModelSoundsCache_FinishModel"); + PrepSDKCall_AddParameter(SDKType_PlainOldData, SDKPass_Plain); + if (!(SDKCall_DeleteModel = EndPrepSDKCall())) { + SetFailState("Missing signature 'ModelSoundsCache_FinishModel'"); + } + + // TODO: REMOVE + Animating_StudioHdr = gameData.GetOffset("CBaseAnimating::StudioHdr"); + if(Animating_StudioHdr == -1) + SetFailState("Failed to get offset: \"CBaseAnimating::StudioHdr\""); + int iOffset_hLightingOrigin = FindSendPropInfo("CBaseAnimating", "m_hLightingOrigin"); + if (iOffset_hLightingOrigin < 1) + SetFailState("Failed to find send prop: \"m_hLightingOrigin\""); + Animating_StudioHdr += iOffset_hLightingOrigin; + + delete gameData; + } + turretIds = new ArrayList(); FindTurrets(); @@ -103,8 +187,10 @@ public void OnPluginStart() { RegAdminCmd("sm_turret", Command_SpawnTurret, ADMFLAG_CHEATS); RegAdminCmd("sm_rmturrets", Command_RemoveTurrets, ADMFLAG_CHEATS); + RegAdminCmd("sm_rmlaser", Command_RemoveLaserTurret, ADMFLAG_CHEATS); RegAdminCmd("sm_rmturret", Command_RemoveTurret, ADMFLAG_CHEATS); RegAdminCmd("sm_manturret", Command_ManualTarget, ADMFLAG_CHEATS); + RegAdminCmd("sm_turret_debug", Command_Debug, ADMFLAG_CHEATS); for(int i = 1; i <= MaxClients; i++) { if(IsClientConnected(i) && IsClientInGame(i)) { SDKHook(i, SDKHook_OnTakeDamageAlive, OnTakeDamageAlive); @@ -126,6 +212,7 @@ enum TurretState { TurretState turretState[2048]; int turretActivatorParticle[2048]; int entityActiveTurret[2048]; // mapping the turret thats active on victim. [victim] = turret +int entityActiveMounted[2048]; int turretActiveEntity[2048]; int turretPhaseOffset[2048]; // slight of offset so they dont all enter the same phase at same time bool turretIsActiveLaser[2048]; @@ -135,18 +222,89 @@ float turretDamage[2048]; int turretCount; void FindTurrets() { - int entity = INVALID_ENT_REFERENCE; + int entity = -1; char targetname[32]; while ((entity = FindEntityByClassname(entity, "info_particle_system")) != INVALID_ENT_REFERENCE) { GetEntPropString(entity, Prop_Data, "m_iName", targetname, sizeof(targetname)); if(StrEqual(targetname, "turret")) { - SetupTurret(entity); - PrintToServer("Found existing turret: %d", entity); + SetupLaserTurret(entity); + PrintToServer("Found existing laser turret: %d", entity); } } + entity = -1; + while ((entity = FindEntityByClassname(entity, "prop_minigun")) != INVALID_ENT_REFERENCE) { + GetEntPropString(entity, Prop_Data, "m_iName", targetname, sizeof(targetname)); + if(StrContains(targetname, "turret_") > -1) + AddMountedGun(entity, MountedGun_50Cal); + } + entity = -1; + while ((entity = FindEntityByClassname(entity, "prop_minigun_l4d1")) != INVALID_ENT_REFERENCE) { + GetEntPropString(entity, Prop_Data, "m_iName", targetname, sizeof(targetname)); + if(StrContains(targetname, "turret_") > -1) + AddMountedGun(entity, MountedGun_Minigun); + } } -void SetupTurret(int turret, float time = 0.0) { +int AddMountedGun(int entity, MountedGun type) { + MTurret[MTurretCount].entity = EntIndexToEntRef(entity); + MTurret[MTurretCount].type = type; + MTurret[MTurretCount].target = INVALID_ENT_REFERENCE; + MTurret[MTurretCount].heat = 0.0; + MTurret[MTurretCount].cooling = false; + MTurret[MTurretCount].nextFire = GetGameTime(); + + char buffer[64]; + Format(buffer, sizeof(buffer), "turret_%d", entity); + SetEntPropString(entity, Prop_Data, "m_iName", buffer); + + int poseCtrl = CreateEntityByName("point_posecontroller"); + DispatchKeyValue(poseCtrl, "PropName", buffer); + Format(buffer, sizeof(buffer), "turret_%d_posectrl", entity); + DispatchKeyValue(poseCtrl, "targetname", buffer); + DispatchKeyValue(poseCtrl, "PoseParameterName", "MiniGun_Horizontal"); + DispatchKeyValue(poseCtrl, "CycleFrequency", "0"); + DispatchSpawn(poseCtrl); + SetParent(poseCtrl, entity); + MTurret[MTurretCount].poseController = EntIndexToEntRef(poseCtrl); + + // TODO: do on start + // char buffer[PLATFORM_MAX_PATH]; + // GetEntPropString(entity, Prop_Data, "m_ModelName", buffer, sizeof(buffer)); + + + // Address pStudioHdrClass = view_as

(GetEntData(entity, 0x13E0)); + // // Address pStudioHdrClass = //GetStudioHdr(buffer); + // PrintToServer("MG%d '%s' pStudioHdrClass=%d", MTurretCount, buffer, pStudioHdrClass); + // MTurret[MTurretCount].poseParamYaw = SDKCall(SDKCall_LookupPoseParameter, entity, pStudioHdrClass, "MiniGun_Horizontal"); + // // MTurret[MTurretCount].poseParamPitch = SDKCall(SDKCall_LookupPoseParameter, entity, pStudioHdrClass, "MiniGun_Vertical"); + PrintToServer("MG%d poseParamYaw=%d poseParamPitch=%d", MTurretCount, MTurret[MTurretCount].poseParamYaw, MTurret[MTurretCount].poseParamPitch); + + MTurretCount++; + PrintToServer("Added mounted gun #%d (type=%d)", MTurretCount, type); + if(thinkTimer == null) { + PrintToServer("Created turret think timer"); + thinkTimer = CreateTimer(0.1, Timer_Think, _, TIMER_REPEAT); + } + return MTurretCount; +} + +void RemoveMounted(int index) { + // Shift everything from [index, MTurretCount] down + for(int i = index; i < MTurretCount; i++) { + if(!IsValidEntity(MTurret[i+1].entity)) { + break; + } + MTurret[i].entity = MTurret[i+1].entity; + MTurret[i].type = MTurret[i+1].type; + MTurret[i].target = MTurret[i+1].target; + MTurret[i].heat = MTurret[i+1].heat; + MTurret[i].cooling = MTurret[i+1].cooling; + MTurret[i].nextFire = MTurret[i+1].nextFire; + } + MTurretCount--; +} + +void SetupLaserTurret(int turret, float time = 0.0) { float pos[3]; GetEntPropVector(turret, Prop_Send, "m_vecOrigin", pos); turretState[turret] = Turret_Disabled; @@ -179,7 +337,7 @@ void DeactivateTurret(int turret) { int ClearTurrets(bool fullClear = true) { turretIds.Clear(); - int entity = INVALID_ENT_REFERENCE; + int entity = -1; int count; char targetname[32]; if(fullClear) { @@ -198,28 +356,47 @@ int ClearTurrets(bool fullClear = true) { AcceptEntityInput(entity, "Kill"); } } - entity = INVALID_ENT_REFERENCE; + entity = -1; + while ((entity = FindEntityByClassname(entity, "prop_minigun*")) != INVALID_ENT_REFERENCE) { + GetEntPropString(entity, Prop_Data, "m_iName", targetname, sizeof(targetname)); + if(StrContains(targetname, "turret_") > -1) { + RemoveEntity(entity); + count++; + } + } + MTurretCount = 0; } + entity = -1; while ((entity = FindEntityByClassname(entity, "env_laser")) != INVALID_ENT_REFERENCE) { if(turretIsActiveLaser[entity]) { AcceptEntityInput(entity, "TurnOff"); AcceptEntityInput(entity, "Kill"); } } - entity = INVALID_ENT_REFERENCE; + entity = -1; + while ((entity = FindEntityByClassname(entity, "point_posecontroller")) != INVALID_ENT_REFERENCE) { + GetEntPropString(entity, Prop_Data, "m_iName", targetname, sizeof(targetname)); + if(StrContains(targetname, "turret_") > -1) { + RemoveEntity(entity); + } + } + + entity = -1; while ((entity = FindEntityByClassname(entity, "info_target")) != INVALID_ENT_REFERENCE) { GetEntPropString(entity, Prop_Data, "m_iName", targetname, sizeof(targetname)); if(StrContains(targetname, "turret_target_") > -1 || StrEqual(targetname, MANUAL_TARGETNAME)) { - AcceptEntityInput(entity, "Kill"); + RemoveEntity(entity); } } + for(int i = 1; i < 2048; i++) { entityActiveTurret[i] = 0; + entityActiveMounted[i] = 0; pendingDeletion[i] = false; } turretCount = 0; - if(IsValidHandle(thinkTimer)) { + if(thinkTimer != null) { delete thinkTimer; } return count; @@ -261,6 +438,8 @@ public void Event_PlayerDeath(Event event, const char[] name, bool dontBroadcast } entityActiveTurret[index] = 0; entityActiveTurret[client] = 0; + entityActiveMounted[index] = 0; + entityActiveMounted[client] = 0; } public void OnEntityDestroyed(int entity) { @@ -271,17 +450,52 @@ public void OnEntityDestroyed(int entity) { DeactivateTurret(turret); } entityActiveTurret[entity] = 0; + entityActiveMounted[entity] = 0; } } public Action Command_SpawnTurret(int client, int args) { + if(args == 0) { + ReplyToCommand(client, "Usage: /mkturret "); + return Plugin_Handled; + } + char arg[16]; + GetCmdArg(1, arg, sizeof(arg)); + float pos[3]; GetClientEyePosition(client, pos); + float ang[3]; + GetClientEyeAngles(client, ang); + ang[0] = 0.0; + ang[2] = 0.0; // pos[2] += 10.0; - int base = CreateParticleNamed(ENT_PORTAL_NAME, PARTICLE_ELMOS, pos, NULL_VECTOR); - SetupTurret(base, TURRET_ACTIVATION_TIME); - ReplyToCommand(client, "New turret (%d) will activate in %.0f seconds", base, TURRET_ACTIVATION_TIME); + if(StrEqual(arg, "laser")) { + int base = CreateParticleNamed(ENT_PORTAL_NAME, PARTICLE_ELMOS, pos, NULL_VECTOR); + SetupLaserTurret(base, TURRET_ACTIVATION_TIME); + ReplyToCommand(client, "New laser turret (%d) will activate in %.0f seconds", base, TURRET_ACTIVATION_TIME); + } else { + GetCursorLocation(client, pos); + MountedGun type = MountedGun_Minigun; + if(StrEqual(arg, "minigun")) { + type = MountedGun_Minigun; + } else if(StrEqual(arg, "50cal", false)) { + type = MountedGun_50Cal; + } else { + ReplyToCommand(client, "Unknown turret type. Usage: /mkturret "); + return Plugin_Handled; + } + // TODO: create minigun + int gun = CreateEntityByName(MountedGunClassname[type]); + DispatchKeyValue(gun, "targetname", "turret"); + DispatchKeyValue(gun, "model", MountedGunModel[type]); + TeleportEntity(gun, pos, ang, NULL_VECTOR); + DispatchSpawn(gun); + AddMountedGun(gun, type); + ReplyToCommand(client, "New mounted gun spawned."); + return Plugin_Handled; + } + return Plugin_Handled; } @@ -310,25 +524,23 @@ public Action Command_ManualTarget(int client, int args) { return Plugin_Handled; } -public Action Command_RemoveTurrets(int client, int args) { - int count = ClearTurrets(); - /*int entity = INVALID_ENT_REFERENCE; - char targetname[32]; - int count; - while ((entity = FindEntityByClassname(entity, "info_particle_system")) != INVALID_ENT_REFERENCE) { - GetEntPropString(entity, Prop_Data, "m_iName", targetname, sizeof(targetname)); - if(StrEqual(targetname, ENT_PORTAL_NAME)) { - AcceptEntityInput(entity, "Kill"); - count++; - } else if(StrEqual(targetname, "turret_activate")) { - AcceptEntityInput(entity, "Kill"); - } - }*/ +Action Command_RemoveTurrets(int client, int args) { + int count = ClearTurrets(true); ReplyToCommand(client, "Removed %d turrets", count); return Plugin_Handled; } -public Action Command_RemoveTurret(int client, int args) { +Action Command_Debug(int client, int args) { + if(g_debugTracer == client) { + g_debugTracer = 0; + ReplyToCommand(client, "Debug mode off"); + } else { + g_debugTracer = client; + ReplyToCommand(client, "Debug mode on"); + } +} + +Action Command_RemoveLaserTurret(int client, int args) { if(turretIds.Length == 0) { ReplyToCommand(client, "No turrets to remove"); } else { @@ -338,73 +550,225 @@ public Action Command_RemoveTurret(int client, int args) { return Plugin_Handled; } +Action Command_RemoveTurret(int client, int args) { + int target = GetClientAimTarget(client, false); + if(target >= MaxClients) { + int targetRef = EntIndexToEntRef(target); + for(int i = 0; i < MTurretCount; i++) { + if(MTurret[i].entity == targetRef) { + RemoveMounted(i); + ReplyToCommand(client, "Removed mounted turret #%d", i); + return Plugin_Handled; + } + } + ReplyToCommand(client, "Not a valid turret"); + } else { + ReplyToCommand(client, "You are not looking at a turret"); + } + return Plugin_Handled; +} + + +bool IsTargetValid(int targetRef) { + if(!IsValidEntity(targetRef)) return false; + return GetEntProp(targetRef, Prop_Data, "m_iHealth") > 0; +} + +void GetAngles(const float pos[3], const float endPos[3], float angles[3]) { + float result[3]; + MakeVectorFromPoints(endPos, pos, result); + GetVectorAngles(result, angles); + if(angles[0] >= 270){ + angles[0] -= 270; + angles[0] = (90-angles[0]); + }else{ + if(angles[0] <= 90){ + angles[0] *= -1; + } + } + angles[1] -= 180; +} + +void ShowTracer(float pos[3], float endPos[3]) { + TE_SetupParticle(g_iTracerIndex, pos, endPos); + TE_SendToAll(); +} + +Address GetStudioHdr(const char[] model) { + if (!model[0]) { + LogError("empty model path"); + } + // Create a new CStudioHdr variable based on the model path. + Address CStudioHdr = SDKCall(SDKCall_LoadModel, model); + if (!CStudioHdr) { + return Address_Null; + } + // Load 'studiohdr_t *m_pStudioHdr' from 'CStudioHdr' pointer. (can be treated as if it was a studiohdr_t **) + Address m_pStudioHdr = view_as
(LoadFromAddress(CStudioHdr, NumberType_Int32)); + // Delete the CStudioHdr variable to not leak memory. + SDKCall(SDKCall_DeleteModel, CStudioHdr); + return m_pStudioHdr; +} + +void SetPoseParameter(int entity, int iParameter, float flStart, float flEnd, float flValue) { + float ctlValue = (flValue - flStart) / (flEnd - flStart); + if (ctlValue < 0) ctlValue = 0.0; + if (ctlValue > 1) ctlValue = 1.0; + + SetEntPropFloat(entity, Prop_Send, "m_flPoseParameter", ctlValue, iParameter); +} + + +void SetPoseControllerParameter(int entity, const char[] parameter, float flStart, float flEnd, float flValue) { + float ctlValue = (flValue - flStart) / (flEnd - flStart); + if (ctlValue < 0) ctlValue = 0.0; + if (ctlValue > 1) ctlValue = 1.0; + + SetVariantString(parameter); + AcceptEntityInput(entity, "SetPoseParameterName"); + SetVariantFloat(ctlValue); + AcceptEntityInput(entity, "SetPoseValue"); + PrintToServer("SetPoseControllerParameter: ent=%d param=%s value=%f", entity, parameter, ctlValue); +} + + public Action Timer_Think(Handle h) { if( manualTargetter > 0) return Plugin_Continue; // Probably better to just store from CreateParticle static int entity; - entity = INVALID_ENT_REFERENCE; + entity = -1; // static char targetname[32]; - static float pos[3]; + static float pos[3], targetPos[3], angles[3], turretAngles[3]; static int count, target, tick; + for(int i = 0; i < MTurretCount; i++) { + GetEntPropVector(MTurret[i].entity, Prop_Send, "m_vecOrigin", pos); + GetEntPropVector(MTurret[i].entity, Prop_Send, "m_angRotation", turretAngles); + if(!IsTargetValid(MTurret[i].target)) { + MTurret[i].target = FindNearestVisibleEntity("infected", pos, TURRET_MAX_RANGE_INFECTED_OPTIMIZED, MTurret[i].entity); + } - while ((entity = FindEntityByClassname(entity, "info_particle_system")) != INVALID_ENT_REFERENCE) { - // GetEntPropString(entity, Prop_Data, "m_iName", targetname, sizeof(targetname)); - // if(StrEqual(targetname, ENT_PORTAL_NAME)) { - if(view_as(turretState[entity]) > 0) { - GetEntPropVector(entity, Prop_Send, "m_vecOrigin", pos); - if(turretState[entity] == Turret_Active) { - // Keep targetting if can view - target = EntRefToEntIndex(turretActiveEntity[entity]); - if(target > 0 && IsValidEntity(target)) { - if(target <= MaxClients) { - if(IsPlayerAlive(target) && GetEntProp(target, Prop_Data, "m_bClientSideRagdoll") == 0 && CanSeeEntity(pos, target)) { + if(MTurret[i].target > 0 && !MTurret[i].cooling) { + // Map to a bogus value: + entityActiveMounted[MTurret[i].target] = i; + MTurret[i].heat += MOUNTED_HEAT_INCREASE_RATE[MTurret[i].type]; + // PrintToServer("mg%d warming - heat:%f min:%f", i, MTurret[i].heat, MOUNTED_HEAT_MIN[MTurret[i].type]); + if(MTurret[i].heat >= 1.0) { + MTurret[i].heat = 1.0; + MTurret[i].cooling = true; + SetEntProp(MTurret[i].entity, Prop_Send, "m_firing", 0); + SetEntProp(MTurret[i].entity, Prop_Send, "m_overheated", 1); + } + else if(MTurret[i].heat >= MOUNTED_HEAT_MIN[MTurret[i].type] && GetGameTime() >= MTurret[i].nextFire) { + // Can fire now + SetEntProp(MTurret[i].entity, Prop_Send, "m_firing", 1); + // TODO: look at + if(MTurret[i].type == MountedGun_50Cal) + EmitSoundToAll(SOUND_FIRE, 0, SNDCHAN_WEAPON, SNDLEVEL_NORMAL, SND_NOFLAGS, 1.0, SNDPITCH_NORMAL, -1, pos, NULL_VECTOR, true, 0.0); + GetEntPropVector(MTurret[i].target, Prop_Send, "m_vecOrigin", targetPos); + targetPos[2] += 40.0; // hit infected better + GetAngles(pos, targetPos, angles); + float angle = 0.5 + (angles[1] - turretAngles[1]) / FLOAT_PI; + SetPoseControllerParameter(MTurret[i].poseController, "MiniGun_Vertical", -90.0, 90.0, angle); + angle = 0.5 + (angles[0] - turretAngles[0]) / FLOAT_PI; + SetPoseControllerParameter(MTurret[i].poseController, "MiniGun_Horizontal", -90.0, 90.0, angle); + // SetPoseParameter(MTurret[i].entity, 0, -90.0, 90.0, angles[0]); + // SetPoseParameter(MTurret[i].entity, 1, -90.0, 90.0, angles[1]); + TR_TraceRay(pos, targetPos, 0, RayType_EndPoint); + if(TR_DidHit()) { + // Obstacle + TR_GetEndPosition(targetPos); + EmitSoundToAll(SOUND_IMPACT_MISS, 0, SNDCHAN_AUTO, SNDLEVEL_NORMAL, SND_NOFLAGS, 1.0, SNDPITCH_NORMAL, -1, targetPos, NULL_VECTOR, true, 0.0); + } else { + EmitSoundToAll(SOUND_IMPACT_HIT, 0, SNDCHAN_AUTO, SNDLEVEL_NORMAL, SND_NOFLAGS, 1.0, SNDPITCH_NORMAL, -1, targetPos, NULL_VECTOR, true, 0.0); + // TODO: improve damage + SDKHooks_TakeDamage(MTurret[i].target, MTurret[i].entity, MTurret[i].entity, MOUNTED_DAMAGE[MTurret[i].type], DMG_BLAST); + } + TE_SetupTracerSound(pos, targetPos); + TE_SendToAll(); + // Get the end of the barrel + GetHorizontalPositionFromOrigin(pos, turretAngles, 10.0, pos); + pos[2] += 45.0; + ShowTracer(pos, targetPos); + TE_SetupMuzzleFlash(pos, turretAngles, 1.0, 1); + TE_SendToAll(); + // For now, make 50 cal swap target (for commons) + if(MTurret[i].type == MountedGun_50Cal) { + MTurret[i].target = INVALID_ENT_REFERENCE; + } + MTurret[i].nextFire = GetGameTime() + MOUNTED_FIRE_RATE[MTurret[i].type]; + } + } else { + MTurret[i].heat -= HEAT_DECREASE_RATE; + SetEntProp(MTurret[i].entity, Prop_Send, "m_firing", 0); + if(MTurret[i].heat < 0.0) { + MTurret[i].heat = 0.0; + MTurret[i].cooling = false; + SetEntProp(MTurret[i].entity, Prop_Send, "m_overheated", 0); + } + } + SetEntPropFloat(MTurret[i].entity, Prop_Send, "m_heat", MTurret[i].heat); + } + if(turretCount > 0) { + entity = -1; + while ((entity = FindEntityByClassname(entity, "info_particle_system")) != INVALID_ENT_REFERENCE) { + // GetEntPropString(entity, Prop_Data, "m_iName", targetname, sizeof(targetname)); + // if(StrEqual(targetname, ENT_PORTAL_NAME)) { + if(view_as(turretState[entity]) > 0) { + GetEntPropVector(entity, Prop_Send, "m_vecOrigin", pos); + if(turretState[entity] == Turret_Active) { + // Keep targetting if can view + target = EntRefToEntIndex(turretActiveEntity[entity]); + if(target > 0 && IsValidEntity(target)) { + if(target <= MaxClients) { + if(IsPlayerAlive(target) && GetEntProp(target, Prop_Data, "m_bClientSideRagdoll") == 0 && CanSeeEntity(pos, target)) { + FireTurretAuto(pos, target, turretDamage[entity]); + continue; + } + } else if(CanSeeEntity(pos, target)) { FireTurretAuto(pos, target, turretDamage[entity]); continue; } - } else if(CanSeeEntity(pos, target)) { - FireTurretAuto(pos, target, turretDamage[entity]); - continue; } + DeactivateTurret(entity); + } + // Skip activation if a survivor is too close + if(FindNearestClient(TEAM_SURVIVORS, pos, TURRET_MAX_RANGE_HUMANS_OPTIMIZED) > 0) { + continue; } - DeactivateTurret(entity); - } - // Skip activation if a survivor is too close - if(FindNearestClient(TEAM_SURVIVORS, pos, TURRET_MAX_RANGE_HUMANS_OPTIMIZED) > 0) { - continue; - } - bool inNormalPhase = ((tick + turretPhaseOffset[entity]) % _TURRET_PHASE_TICKS) <= TURRET_NORMAL_PHASE_TICKS; + bool inNormalPhase = ((tick + turretPhaseOffset[entity]) % _TURRET_PHASE_TICKS) <= TURRET_NORMAL_PHASE_TICKS; - // Find a target, in this order: Tank Rock -> Specials -> Infected - float damage = cv_autoBaseDamage.FloatValue; - target = -1; - if(inNormalPhase) { - target = FindNearestVisibleEntity("tank_rock", pos, TURRET_MAX_RANGE_SPECIALS_OPTIMIZED, entity); + // Find a target, in this order: Tank Rock -> Specials -> Infected + float damage = cv_autoBaseDamage.FloatValue; + target = -1; + if(inNormalPhase) { + target = FindNearestVisibleEntity("tank_rock", pos, TURRET_MAX_RANGE_SPECIALS_OPTIMIZED, entity); + if(target > 0) { + CreateTimer(1.2, Timer_KillRock, EntIndexToEntRef(target)); + damage = 1000.0; + } + if(target <= 0) target = FindNearestVisibleClient(TEAM_SPECIALS, pos, TURRET_MAX_RANGE_SPECIALS_OPTIMIZED); + } + if(target <= 0) target = FindNearestVisibleEntity("infected", pos, TURRET_MAX_RANGE_INFECTED_OPTIMIZED, entity); if(target > 0) { - CreateTimer(1.2, Timer_KillRock, EntIndexToEntRef(target)); - damage = 1000.0; + turretDamage[entity] = damage; + entityActiveTurret[target] = entity; + turretActiveEntity[entity] = EntIndexToEntRef(target); + turretActivatorParticle[entity] = EntIndexToEntRef(CreateParticleNamed("turret_activate", PARTICLE_TES1, pos, NULL_VECTOR)); + // AcceptEntityInput(turretActivatorParticle[entity], "Start"); + FireTurretAuto(pos, target, turretDamage[entity]); + turretState[entity] = Turret_Active; + } + // Optimization incase there's multiple info_particle_system + if(++count > turretCount) { + count = 0; + break; } - if(target <= 0) target = FindNearestVisibleClient(TEAM_SPECIALS, pos, TURRET_MAX_RANGE_SPECIALS_OPTIMIZED); - } - if(target <= 0) target = FindNearestVisibleEntity("infected", pos, TURRET_MAX_RANGE_INFECTED_OPTIMIZED, entity); - if(target > 0) { - turretDamage[entity] = damage; - entityActiveTurret[target] = entity; - turretActiveEntity[entity] = EntIndexToEntRef(target); - turretActivatorParticle[entity] = EntIndexToEntRef(CreateParticleNamed("turret_activate", PARTICLE_TES1, pos, NULL_VECTOR)); - // AcceptEntityInput(turretActivatorParticle[entity], "Start"); - FireTurretAuto(pos, target, turretDamage[entity]); - turretState[entity] = Turret_Active; - } - // Optimization incase there's multiple info_particle_system - if(++count > turretCount) { - count = 0; - break; } } - } - if(++tick >= _TURRET_PHASE_TICKS) { - tick = 0; + if(++tick >= _TURRET_PHASE_TICKS) { + tick = 0; + } } return Plugin_Continue; } @@ -552,27 +916,47 @@ stock int FindNearestVisibleClient(int team, const float origin[3], float maxRan return client; } -stock int FindNearestVisibleEntity(const char[] classname, const float origin[3], float maxRange = 0.0, int turretIndex) { - int entity = INVALID_ENT_REFERENCE; +stock int FindNearVisibleEntityCone(const char[] classname, const float origin[3], const float angles[3], float maxAngles, float maxRange, int ignoreEntity) { + int entity = -1; static float pos[3]; while ((entity = FindEntityByClassname(entity, classname)) != INVALID_ENT_REFERENCE) { // Skip entity, it's already being targetted - if(entityActiveTurret[entity] > 0) continue; - bool ragdoll = GetEntProp(entity, Prop_Data, "m_bClientSideRagdoll") == 1; - if(ragdoll) continue; - // if(GetEntProp(entity, Prop_Send, "m_iHealth") <= 0) continue; + if(entityActiveTurret[entity] > 0 || entityActiveMounted[entity] > 0) continue; + bool ragdolled = GetEntProp(entity, Prop_Data, "m_bClientSideRagdoll") == 1; + if(ragdolled) continue; GetEntPropVector(entity, Prop_Send, "m_vecOrigin", pos); if(maxRange > 0.0 && GetVectorDistance(origin, pos, true) > maxRange) continue; pos[2] += 40.0; - if(CanSeePoint(origin, pos)) { + // TODO: fail if the computed angles to reach 'pos' are > angles + maxAngles + if(CanSeePoint(origin, pos, ignoreEntity)) { return entity; } + return entity; } return -1; } -stock bool CanSeePoint(const float origin[3], const float point[3]) { - TR_TraceRay(origin, point, MASK_SHOT, RayType_EndPoint); +stock int FindNearestVisibleEntity(const char[] classname, const float origin[3], float maxRange = 0.0, int ignoreEntity = 0) { + int entity = -1; + static float pos[3]; + while ((entity = FindEntityByClassname(entity, classname)) != INVALID_ENT_REFERENCE) { + // Skip entity, it's already being targetted + if(entityActiveTurret[entity] > 0 || entityActiveMounted[entity] > 0) continue; + bool ragdolled = GetEntProp(entity, Prop_Data, "m_bClientSideRagdoll") == 1; + if(ragdolled) continue; + GetEntPropVector(entity, Prop_Send, "m_vecOrigin", pos); + if(maxRange > 0.0 && GetVectorDistance(origin, pos, true) > maxRange) continue; + pos[2] += 40.0; + if(CanSeePoint(origin, pos, ignoreEntity)) { + return entity; + } + return entity; + } + return -1; +} + +stock bool CanSeePoint(const float origin[3], const float point[3], int ignoreEntity = 0) { + TR_TraceRayFilter(origin, point, MASK_SHOT, RayType_EndPoint, Filter_CanSeeEntity, ignoreEntity); return !TR_DidHit(); // Can see point if no collisions } @@ -589,13 +973,23 @@ bool Filter_CanSeeEntity(int entity, int contentsMask, int data) { return entity != data; } +bool Filter_IgnoreEntityWorld(int entity, int contentsMask, int data) { + return entity != data && entity != 0; +} + public void OnMapStart() { PrecacheParticle(PARTICLE_ELMOS); PrecacheParticle(PARTICLE_TES1); + g_iTracerIndex = GetParticleIndex(PARTICLE_WEAPON_TRACER); g_iBeamSprite = PrecacheModel("sprites/laser.vmt", true); g_iLaserIndex = PrecacheModel("materials/sprites/laserbeam.vmt", true); PrecacheSound(SOUND_LASER_FIRE); + PrecacheSound(SOUND_FIRE); + PrecacheSound(SOUND_IMPACT_HIT); + PrecacheSound(SOUND_IMPACT_MISS); + PrecacheModel(MountedGunModel[0]); + PrecacheModel(MountedGunModel[1]); if(g_iLaserIndex == 0) { LogError("g_iLaserIndex failed"); } @@ -637,12 +1031,6 @@ stock int CreateParticleNamed(const char[] targetname, const char[] sParticle, c } return -1; } - -stock void SetParent(int child, int parent) { - SetVariantString("!activator"); - AcceptEntityInput(child, "SetParent", parent); -} - /*#define MAX_IGNORE_TRACE 2 static char IGNORE_TRACE[MAX_IGNORE_TRACE][] = { "env_physics_blocker", @@ -684,10 +1072,36 @@ bool Filter_ManualTargetSights(int entity, int contentsMask, int data) { return true; } +float HULL_DEBUG_MIN[3] = { -50.0, -50.0, -20.0 }; +float HULL_DEBUG_MAX[3] = { 50.0, 50.0, 20.0 }; - +bool DebugEnumerator(int entity, int data) { + if(entity == 0 || entity == data) return false; + GlowEntity(entity, 3.0); + return false; +} public Action OnPlayerRunCmd(int client, int& buttons, int& impulse, float vel[3], float angles[3], int& weapon, int& subtype, int& cmdnum, int& tickcount, int& seed, int mouse[2]) { + if(client == g_debugTracer) { + float pos[3]; + float ang[3]; + GetClientEyePosition(client, pos); + GetClientEyeAngles(client, ang); + TR_EnumerateEntitiesSphere(pos, 100.0, PARTITION_NON_STATIC_EDICTS, DebugEnumerator, client); + // TR_TraceHullFilter(pos, ang, HULL_DEBUG_MIN, HULL_DEBUG_MAX, MASK_SOLID, Filter_IgnoreEntityWorld, client); + // if(TR_DidHit()) { + // TR_GetEndPosition(pos); + + // // TODO: use enumerator + // int ent = TR_GetEntityIndex(); + // PrintCenterText(client, "HIT %d - %.0f %.0f %.0f", ent, pos[0], pos[1], pos[2]); + // if(ent > 0) { + // GlowEntity(ent, 3.0); + // } + // } else { + // PrintCenterText(client, "MISS"); + // } + } if(client == manualTargetter && turretCount > 0 && tickcount % 3 == 0) { static float pos[3], aimPos[3], orgPos[3]; GetClientEyePosition(client, orgPos);