From 0340fe0882aa2f4e2580284628315afd1d83b08e Mon Sep 17 00:00:00 2001 From: HalfikChan Date: Sat, 21 Mar 2026 16:12:36 +0500 Subject: [PATCH] Release v1.0 --- Prompt DB.png | Bin 0 -> 104819 bytes README.md | 2 + web/js/prompt_db.js | 1017 ++++++++++++++++++++++++++++ web/prompt_manager.html | 1422 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 2441 insertions(+) create mode 100644 Prompt DB.png create mode 100644 web/js/prompt_db.js create mode 100644 web/prompt_manager.html diff --git a/Prompt DB.png b/Prompt DB.png new file mode 100644 index 0000000000000000000000000000000000000000..4ec001ac77ce99cf607fd878312d8fd0167357bb GIT binary patch literal 104819 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

+n=T;z(huof6-Yt(^`3ywFZ4Ui zeyvs^=T9yL_j|ti629#W*Ko_ZBjnjD(IY*c2>$B#d@|(9_L&EIuKf>$N?fH)14`pY8|8-H2ZMtjXy;9q{b9Vu|S#)!eggaX$ zp_pqkjP{-?>+N}WPi6sp^qB@zHU+l!+oGp7MR7J7iXrSt(XgvXPkpMV_s&E{fV~s@ zc4C2uF;6HyoBD9BB4y4Q@SU?_|BLSrp)fcBw()-C>YAX+Qb23jYqX_MS|#Yl>1SE> zM%K62hi4)!ck%Ho=*S{1Yxn%Hs_XyLs&Eg7OeVn=`IkMHzOH@mRaO}6n{j9?t5!h? z@jYL#2J|eU#fQeT@ms&$ z+HIs^ZK&&zzF*p_I2knPS6o@-lGeTbO)P&$>7Q}$$vl^}fJ0QdqiQtmn828kgFIz| z76kvFhHKx@cZN&<9zG2HG2Hvt(|-?-1AIWHABz7v%thSs{I1J=v05GhPrpCOcr+M3 z>Q^q*wf#2ArMHWEaY@xti|54q95pRp`+*ZKm8{^&q%A|;5_Kd$i=!}k;}+7XvKLlDO#D^`QD$>#GNXdL`(TCx8f=`VN8wf%2yJR#CpgkibpE_%SVG}vT`TaD`bl}p8YT0>v9piuL0 z`?}}p3>0Tj-J!WKua8+~H&_wmG)7(rK}0 zRCf7vjhzdz&b`uK*+E0{BSS(e@A!1>J}wR=m~Nmed%`TGKuT$|UU}kil1bYXsU&^J zG$cu(Tlt*zszj%SQ9F$l*M<>8yj70HJwyfj3u3^^7&9gN5EG|TfS&)yJm{r&05R=Mxx#tucdfb?3%x;H7I5w$!ajdXP{@PSmztZ&LEX&ZN03 z5-nbOAT_cT_Kz=x=2R^AH!lAL&kz3mv=!~&SZMO5aR$W8-N&Zx$o8D%#)E<5WFgaY ztJnD6&}-g0)m@6Sk#-zA1U=o=A|})!=UJ{1Y4ZN$(Bk~$u=j%uctAm+4ObWl{0C?2 zioZf3ZJW@M-{K4s3+gFv+`d;%W%#OC+(n?T`AGrCn?v-6NS9LRJ3V58&T*+FO4>Laol0iM2j$wQuzT`jn;f$^Zp|l-rFA750&_LdbU?GNW&_)fRF&R zF?jvRMZCYhwOq+09G4F7zf)S=m6iFplA z>LTx2YU`@0xxg?gFqLpj%02hEI=|{M#{}j@kTV(qH@H4^C_CLY0cLcZF?0Kcxlj>bO{?sFvLsDv&!*hMUZ56}K&UNrLyfC%PBgndGn$lC#_>DqBZgf5`RQY0Eh% zeRrO$%0A@s(d8(eph0Egn?i)BHCCA+wVnajvsTq!8UE$nixgj9r=N6_ctw!0m)IBN z!1*mGP+hpx@Ek#($NuquYGynz79k_e-(fb1oA#9T0vydJ1bKBX#RBX<&v8z4Y3lM; z-$7{FrT)bfIb?qqI8fl0g5`Xe6gbuZnXRib%Si#vPXI9!EzB9*j6#u>ag!*Ly}|>0 z&qNF^NJgp<1oi|g0urmb+*tIi}$PZ`((O|jv#NOC8Ng=nyFWFh7+O3hwxvUnSd~&9O zD=VvOyI*!N5-6fxJt&r$GRWF?FrB#VRq596QCdzMtV3y_Rg+*MuR{wao`yc|oi|ek z{i5a*%tJ4=|GoL+T^Ab>JA>; zfE_Qx9s10Ffg}$+I(Ea}aPZR_Vf--)XIq$nn1xLEKryhm@s? z<68Dkv-x*oq0jd1j^rFC9U4Jt1oU{hi9hR4!;9$n6*DgQ#`}*oy&u!f$C@&V*XzLZ z1+CHBxD}{MRh|7;rV3XxktE%b6T$JBS|c6utb3gmlUd?5mcWU7Qw&&pOV_37#PYDO zG}1nm;KqLMZaZwenXR8E%(_M026XKVl74~N;ln1LDQ3qc(hIPdiIl;Yt>V6JqibK} zZGwaBU`ThQLhFY3PwMyJmOh`>C@2}3Y@4O5jd|vG;e(n_p9(` zov*R^SCPP~ShVE)>Tkt#veY7wpZK z6D|fv0Qora?yc4vnb*4tOGhk72D(_sV=}cTlg2jfL}=rIqo`8Iwzao^|Je&u1#gF*DanB&TSslXlm5?l|Htx(W~c zmI0A_J!5bF)!U@C*P8f!-e-!rlBz!!zseX@KiH94P3*iL(iKu^lP<|QgT6Ko@-yD} z3`Hxio2fi`dlW2W<1_ij&4qoV;0RXYbHPh>nApMAH2gbyZwmZdo`F;{N|5~)UT}nF zM(5XB3Ni}l`UNQ*baUv=!O>qfEHunNd8iVq%-Fkp>DO5dihG(rU*|KiwGnLILKk7Y zRKbM1qPEr<u}Uvb&^j01&rvoj zEk`7*&Tyyv*}H~U^Y8W#L3^RJWjx6m2E({M_5UUd{cZDm4P~wl^~`+TRHG+T?T zy-&j%co8$hzls;$1oeClvjzM}3V%9#X7tXZKNqCEllzLgj(xc<8bn-+vcG#Ox7$kf z{qE+Ph@iUHFozixuGdqym*ZLB4_NG4jy$zEUD#&i+}TN=)wnDC4s?s$wz3!(>omUL zq(@NOz8f=}BEqyq!Y;O@A?B1px10d4s-xqMwA8?Z zS=xjOC_P$lEu7*gG=0?KgJ1f+)-#E8C5%!sKWNXWd&|!m(N@`NbH=prcN+H_T4qov zv?0!Es_0pzZt-?iK#}~!A@w$q@?bP^z+A<7RGBwz?wf1QYeO->mx9Mux-f(gN>5bb%PH5MIswU~yKBUya^+z(P(eweX!jMOQ=0ZHFnL1tUjuvwDMNO zb)%za(!7DS!Qc9BRecwkt;wEv)Elk!T-g_H!BNh&FvSq7^~n^z1MNh-V;E$~Q=~zf zM>W_0n?b^6pUit^}Dh zQuIc@_e`|@?3U)1PqclDoph(9f6=}ixV&Jof4WAXS|`0%I%x#4HWu4M1blg~Tuc5g zVk<_B&1d_lXUrQHi)a_7c$HuvTN(14(w)SfUm@wopzpZXsf&+O3J=1C*D-8YcuLOPrVII%G)E|AN+?(p1={RW^7f6Lls#dq z#kt%Ng__HmhlC3q{R)Z9#&n@eHTFizfY!f^(+9ibnTD2ZOd)4T0uN#5Efx&9z!xQ_ zq{T$7K)n)Qtx@uuZz*2KEKi1uIJb(!A8p1a5)w!Vos-d`pRvC@D@&;#2Nm7_%O;k> z^A7Ou6xs%5&-b@#Z}EK8G%mc5s~M|+bc30;yw^lL?Li8Sr-oOF+A+Hu1}0rj#$0jY zw%$hGY_@XBYyt8XAX$G8vTo4`tvJ(F!MjwI8OxWOKl4Hvq4Pqbd#P;ZPJmnL+TbbF z5^1bXnwP9L^H=%Xxl{hqS`iQOXhjKk^XnV6d)1Jm7Z)5YgoS@U%d)|{k0;%;zGvr2 z>p0G$YbjSDhsr!#%~NtFD(XJ5jV2WBf(_CL+*62oGlx2gBz_}D8X1Z@U)nQ&Ny$(P z$fUU#_B-nCVfJs zJ58qTSzUnA5w0hvp_hqzoa;g?DMWmf;>Su{FaAx+zD8Y9I##{zl!09|s|o{qt0w4)R$%k^>g_paQiO|gX-}hup}|g_U%SKL8E%BOAzvJKRl#N=l*GCT zC(`_+-s-SGZZ^{d<;$aPO&o72F1i|B|H1*a{zctkjI@Nj-k6Z}ju(5gwwTB>>yV*6 zVg)H1yi8(wSHr4_lfQLyU0oULktDc$!SjR`ug-%K;R3N&tlUekD%e@fDAmw$zspp0 z(n*hk5#n1Un>)prN??z_wJfsB0WMYZWd_55$Hwq(S61;Ks|G8cazI1J<0O5G;<*H z>Uo4u;LUBb&1g_k`_hBVISgpR%kAZU^QyR0-7|MI&a+iLS09fIA==;h9CJVOmzQSj zG(s_j0C@kgcyg`Hkc%v1=!mh+N>t-|vEGrVD85r>*H%bH=krfwoP$DBfo+&Ras;qFKO>pUi{ z=;^c0Z{!Ku1Ao87eX=N~u{B27irw`tA;nh>2lX0dmInpyp3!J_3eixr+ddIuY86%% zV)l{d&}Yt#JBNT2&p8F0cB5EnZf2(p%Xd{6=3(VDRB(iY`X8@<_uBti6X+IR&y-y+ zx1EQko=ht6*-0vZQye31Z%zElCU!0RviDAE^u|g#J;zlAkW)KfBxoznS>-S#e*YrG zrYLhZ0=a~>cU&ZR9XP*=Jsncw=CiHS;MM;HWZifYeRou?uyg(KT8)wCG#gedMoxlX?+|Co^5{kY|&)#NJq?HwvPg%${UsZ$z{7 z(ig4LChT`L>^H}57=x!08u4~gze7eyO%XWD-xREQBP0dt+Qt86%FoK0C0`p9*)K|H!r4 z6vNr})Xw+4ha$`S+g8s*y6vL9%1!C%4Dfd^@GkN7&u)FCnwtl+2rlZ*%=j5xW^0{g zWM0+*ic)qH_G;XOR3_}-k^4jcDY9NKIeDV;i}Hlj*O+-MNh3?z>11mT6qICU370P| z{Ev`5zA9?Uf{dnGJ+gItcKxZyJ`#V<<*Q>;iKiMLyBY+@4_6N=$*cPed-3HZQ9%x@ zCc3Nexf>hde)QL$TvDdi&dvRa2&lDI`zGgBw2}CTxV*k~%(*J9tFtbl#ZZ%>b98?`{rSkTFN;HIb6M^8X3FF+yiZhUe@DO{ z4z6a$9@kDb|6!N&UiCdTt)4uwe(BAAO5_sMR+fQd=W$nYueU@W#eVjI#&Q0JFHW7) z4tNEES^V^I&!B@HOCuZxKbLi-YPk;8HXhlI>o}LM&_S8%-A z@WwG2hpFT4Gu2P)Q-Bu7a;G|(>14eS_wED7wJmwpDI_SR$TaCIynP7?gqV{9AdYvw z<$zchs;RH^`Zjt-PFG&v>kJMEuZ$LpqMa7nFN9dtu|Utf7^i+hwmWB^Y0FD?OC(|G zU*uiWjgOKFIMmhNfm<$v{E^*CFYom!WnYPHvD$!*)hXb!aFc|J50HD`-8J8;qhrFv6Q3 zl*AN5`h#?-*_kuL(*#HB136pb+E1ozxB+Wh9w}l>FOU2#TI@c3d*arlmfnN)kFmRO zMlprBb2xsmjk^`!kT#5uV2j@}-avl}G4k>dGByJGM<7k)5pfOc&2m6vpbY4%mU8pi z8}kEr-JL#7+fd?&p-#{B*t;B|Fg(w*-UIu^KG1P{t2rOtSWBqQ0%I+eniFSV;kiRs zpx3d}Uw0~PfAxsX>6q0xugAztG0raMfCw4=gHd4X3EIFV__k#ScYXr|H(Hk+4_6$K z?F}0HWNrIxT*y}W<3pR7jmPKy>hU#u%1wHa;;qhlhdRv~z1{-=z!Q9a-=vt**YPZM zc6f4W2CDSlj1%>Q1=gnA7igm^i2EEYat8<^$5Ke+2YFrsJ8?d?|5pGV`T?vM*t4}Y zl82Br?i2Zg+63R%$-^V0&6uG+!?NKX)g^IIW8 zuJ@Wq<|Wl_Op`bGdWt~ zEoyszTW*Maxr8+9QnP#iC+7O2=rn2+GXeVTuOb|XABFH|zkRe>+^13Ld!Qqs)Y5$1 zrE(0;Ov5XLRcco>VeigHN3s0?DuPz$_q^*M7sUdw_pSCv8Oi=_*O8JJaNVu3#Ks2F zf8poRWrrM8inVLr}Zvw(}qK9Ev!&Abj$QxXOkR zOx}M_cyR%Q9V5R*y`fpY2CUQFf*MToEsz>s;x=a<4fw_%J^1KKK!KRPxn;P>xz?1n z`jRb!1`so)Fu%F}>6<9v&jr*3XkE~&q?48KkxHLr279R$|IWQO-16)4Q0(qkq~Tx3 zIVH^9(@Yf^^xRNb6H385C;$|+jbGm{SnK`GsbMGdq+In}{Q1to79v3JeN z$c`U3+!m3=ersD-pqyLW_azuFI_W9HDBmf8_WK_6b%ujU^XY z-L2d9*t+zIQ#{#WMUP6hDQ1m*d9pTxdfe?XQsE<3z5na^|4c%QGele6y))x3=`e15 z8=vJe&AK(*6RKIZrI20BAv0=Jx9CQWit{-Cb9yWWDIYVVo990bLvSr~isgV2c!e?o@Sq zZjPZJ)(Rf_Kg&*p@H<-7(3#9a9QStMH(3kX{Y{7M5;rC_cA?!S0QF_wYvk98wISOP z)Wt1azb>vlb!PV7htDC*yU^3xx1i3+g{z$Vz<(OZw2X|?z+DQ8 z<>!5C^RWwDTnCafL31oUyHX!T?dXwgNlflZ)+D7tr`%oh6y`8~kwvErXwczT7p$XJo z(3xeBd@mAu{QkJu(P!=1)EBb%`+T;VB~^@+R-Q^>pS$t-;r1_T%yT2ut*CfyJZ&ir^*Hds zW&cw7iNIkcfxb9##uKpU>-MQteYx#8H-NXaV?kc`)Dl0{p{l-k>}vhe0WypLuNf~> z4qvv2r`HJBhj8;$W^CMpZ$J%VY~9@F2mjD_2wBzF$xuJop7ZoIXDBnXK8r9^2_4&L zNqqC`r$Uoaihy#8*23FXhyH?5KeX?I3U{mI`%ixv5Q8G+yzsfP2*k<5o}+SFO*HZj zL10h|z*i3WU6!m^bQXe(<;2R1;Q+VMDw@L zWAf|p1d9H9Jg?LO_(wnA-oo^S-tOA1-!XZ@&S9ZsZHQkZHWgfVj<3lIRYyEK?Vqm+=y;V82Faoe-NJw1pwv@?9&Fxi@W#`Om(DfspK->`#K^hka4}{fg_YUXuZjGn#(0q3U!dEWv-!nj((m7>PZHNA-||={ zo%Ost?tPj@Z=o;Q6$C)l$=5F)5{p3M#ZA1TVMCwVGhcGA`C-m^rFUk3;xqpFQDPL5 z8h~0*b{dH<(Y_AwUTh-Klpg3uV)FH3B z7pg+%+f)ZoR_fo15;tWlu=KxP-a{2%{wXrxvKnLMa^4?z|9%m{Jhyk6p4JwriWjHpunH;AfPC-5f#geq#89G^F_NP`pB^i?h zp=URwzF{&I9(m(Fi?r`NN;zo~rTk1lMjS4*8+CA4vo0ZS`*)*UXmp!f?Inr^Gw_+t z-u+D(>gNUcEcE5Veq`?(&&<}KbReZcI6soJ2Jl^}ll{j4+!S{OHw7SBSD;j^72KaE zfwy(X5^br)+9+}q&#;Ay?DFCLkp(Q$U7%ZvuJlZG7>7&Vq{s5vzSP?bEZ4oK@1mT5 zqRget$U@QGE^CK9Bil1g={qt#Fb3x|TV12--%JerF?l608iexu09KB%=U=gMt$8ff zL-SD=ZlM9 zer~jknLji$1N&&t-<9ay5z_$?Y9{1cWILy!mjPy}%FizxSFlDB;SPE3YXIEX#L0h! zqotcsTOCI^6LO4?WQ$}&tZ455hANpx1PSH2z1l+L^4K=1QexvmAVJ>cgXMj&+w|JI zft?yl&>Bjwlu#Fh(e}{70iB$)hYzIvw}KW7q$8ihBdLnqUV=!!^LtSc3Pe4^v>zB7 z$}^1YXt)6Ee1xQiueF$1cJUB?O3g#-1w93Qw7sB*oRW>!0C?u=)c>PI*{`P=(r~~_ zERakp_^)xO1~x;U@sS|ZXUZ%W1}&$~!Z}YgYdwKyvGngY^`G4WIye^Ekm6PLTyD~Y z0=d|#n?9oD3k}`5{X77z+y9@SbueJx6O^ZDcHBTW}ay#Z;yl4Xh4iy%R1yZR@Hox`*gfagRzk7OD)4MGi@cH;e9 z|JQ4_aW&3GJDnqAFh)u>BIRUaM_6#M>2s*aW4Gd*at&8+Bs^O0pdQ67U3C`^T<|P;hn8KZ0EB7%`fAYyYAqg1kon*AAG`oi-4cIuN>2f9C;d`&bSP4(yja;>VNTr zKv)^m;1*OA)LMMGwdVKb7ecaYaMmF^v7 z&wacz2sN1;kmj>a3e&BCeNv5=;B3=Jo9l{5u|t>>y$?O(I#`z@kQt`|i!vIX z9c#x*CnGF_I6-QdkwS%_9$`?BGX09zOU5N$MORUS?RVJK9VkAtE6S~vuR~?M4WsapSYc-YR7y> zd_#O^&=zWVX?8~e>x!L`iw#?&K)2#9g zgJsaS6NvMCg)8c7?hLi@o6G~gV`d(@(!)pwcl;Wf9g(i&t4=h+{4C!D&uObNCjxW= zL~?~f4e8eGn-{arwc4anLwyW?cMQHQ1gI$A5aQ zcE)eTH>WdC-v`$$3HC6!Chnp0ppXLO;$fCt>50BOdi2;fbbs6$i34t}ydAFvXS2aP zu6MplqLak8{hrOdXD!Qv?iO+^pUAiP41R0mph2qXIu!2ctD_k69o>&cq@1T9K9dRd zEfQ{qOmkf?@~4R2_2|ZwZq!Scu?vm0?)LoK=6`>$Huo053A(XMivGT3sFqk(+`ObV zUm5K~g7n#Y$E677UtP$}S<7rxEUCn3&G{NO@@}d<5U&5^FS^8=xfYmv_T8GCzCxC4 zcqh$(NG7ebG)W4%Y2BUXr`e6$ey9KH-Fpdh%v9Zg2WU+lFse%M<}P2iUpnQ10mkz# zVW2f6Z#3s+yPuZ!BkYCi7Voher_>k;QQtDWa^@q*rMV^3(b~M*^30<#DP6Yv70G2a zNhr})w$q{@!D70C@3Hu>d*qQiY4S^_#V-2&EL#(&_!3+Mcat0kjv|EgmkFIVQo1=Q z<#2gqd#%=tsLZ@S0GhDrv!Km|Xg+kXojch#M)^sY|7vvF!J zVyy%;M3d^CK*(!a=plIWm%o}8B@+DnoXVJ2sS0@2x;RS4DQ5o`qrxwFaD((ok|aB9 zBa>C?j|kT4x?9?pN6lGx?DZWzYUZD%WK1j9!2pz7GL^os;ErV{@3Qv$%}lHL-r!9(urfd|3~%E@NzK6u+~4cXeQ= zd%Z}>Lw+(izCDxQ4-e=I@j;FG5@t2ZCfkJ*+MoMttYGIcAjBLE5-_APCcmDZIbhL_ z_3)2oMcglzR*ky4sYAyOlABD5&oki(R6Yx}GXp1J`y3RqQX+|A7Q zGTo?YU1bs2hvmml4sx+9qeKN|_r?S6c*U_sw*sgBK|_l2ZA-oO>W=I36dg^zx0+wz zj_mJRKHOim4C~y2C#5?Ft2&fb1kI79jSItB2zhFaG%|oF>|*GsgIVm!j~@L%HlLeJr%Sc!XOqa{$dPNY?Nd;R&h$-044;P##Nt}KGEA{l@6&S z4jmt9p|%11L)DAZ!jEmH_ol&01p!Wyvl*;v576WJ7qT#gJnM&&-x`~LLlab5bu<>+ zQ;g%Gs}*O*ruYrJ>vEcmXVi}J)<;8sOznWe^?gT9fr=4L*@E4SsMEIAXTasBC~dtX z4goNCa8TZhqc*?nO|CJ6ic~RLbwMTO#pQgDJ0{D-U5TGj@#eb%S_hSVDrllvgkPn$ zB)_B_+!j?xK)Abwp9Snyl9MtSyp@9J`@C#=M^-bk%3b&p%7(mG>m1 za;dG+(;mz|*;$vyq42-A4A%-%7eQ-j&LeU^%p(#6rIXjRF%A;X9EcU>lqLT>_q;nF z{pq6SN$pSyDs*_pI9*o`Pv2ANnasltq%r$Fl@P0S_#cFzZ|O8W!s!R@1q=Poh7ze= z)g?6y-gY_I@g>ZWIevpE%Znl>=NtcYXKPF(F3u!yr%~3D;%A{yHka7eImIK5NRByC z`}-ZNMx5FNp5`_r_`=w_&X8E6t63vtg^>dHL^q0`BD4M!Dxk?f)4(C3q;JGeyAE3# z$IQTwzJehF+-6y}aC2VXSNPQ%9omO{&0*O)niOc|BxN3Fx}S4sBJ%T~0e|`P5V6a= zcuU`;ML=BhEWeYsxkl4RlzzdGi5*C9;~Z31bD<(S*oy9Eg-apl{S3X#@#P=Y_dB!? zveRTbyeS2pVSAYKK~9GKhHBQS`45Vd)J!Xde4@gT^IZe0dzDfs8Ff6kG^^wFQ*hd}`Zvf+mq!H?*m=^kkPi zQMWYZ+}OVJ7Efa_miK8V_<<#n@#LV65dW$IIwWMZnah5C5<@w= z_0pn1#wm3Cp{b1qS*b?UMjYtQN5)t1Etl69;nBDgJXv$%;=TbkoIfyD0AIq`4a3^Y+Hj?G((p|#d_6A_B zI56uh84;m^kE+CE3|dE&R1O=$vTvY}ZyIWLP8v|^jA{yA2rgEYO<-72Q}mN3MCT%q zC80FbCB4fL@OF+0O-EueKd*)N5MrirnMG8iR73M_XyHQ+-Fjle#``}8_R2CQ*H|H| zQPs9&Z*3Er&b^sw=RR-6$-`I;ORR;n+|H50JjB(sU77Oj=6uI*u9BRp{)vZF1=Dmh z_c2r}2x}DN0nbd_#ztV~g57t_xyPezFXJq!BdI`s*wFZ@y`T?HTH8tYE_1JEDIFo* z3P{HWU1q}yL!N>~6ejz28|R2|Q0<5-mEJcfIioL3?O4Rqj1cE`K0cR4nUQxYR3~{8 ze2G(1?IJQ&2`7pGa~Q)%6N$qb#E9=5%~yFvY$t1~?0RY%+RYC;W$-1&$*?$4l~S<4 z?VhY=gFj97^ec(ZMe@cn407nH2JM5|R=N{jc5+IDUbRZE2i4|Vg7Lo+>x_5O1D@xJ z!pRH#R#L}v!s}jbMOUO=r6DTFh5vDw_!R%RsiF-PX@!41&M9;KOV?D4DYPfr$Y2Sh z{CZ7U3XD45e3aW=#i*O&aV7Jb>JEH7-Z8j?`K6UqR<$PYvLE%?Vt;j8)A2#m=I+f? zeIG&IbC;RrmI3wHP19;e`*^DJs0(E68KYv0Df&}CMK`j1-eEt{4F7%k;4u&II;Io# z`*Re{iH+bI3r<}ECvaVvA)Uf4@K4h|v)aVwTCOWZ(9JoG5+Jw`8t>5l+@?pg37S;7 z8ap?Avj1CIN!Z+Ffj&?6Z+fwZ5`^PZYbd&7{IIUcrrFjQs*$8$?(9UroU*m;bWJCU zrft>?2jRdd$u3MRt=y|sUf(_ys=%)=tmH|_E3O(jnQ&pl{qelxi z0fKNvx+O$eby1th-tvcudYOJ@~Cv0~1GnK4nBsNT*x%*L<; z2l-*@M89@=S0HbJux#kcnTqhjNG1gjejd6;J>1-Lu9yO`f@#t!cYU8R^ioc2zgNrL3lU}UajtdgoJPmjY*40L zZ$=;+Qzi7lT3%N|^G-L0v<{Y0ncu@ZR4I`ox##C-<$WVYa~W)-02_y}=P^Qg)W~wj z)}&k3m3o?1X@iFjejZbuJb8P+Bh{Uz#|fRHHBwLu!zAifwiJf8B=8LKK9cT6f6dKl zHcCVd_boOVWa2d)hSiYn41N$ck+MjM@T_*x9r&{W=yaax%zb~w+8(RtQP+BGuqw>L zTvH!ssM{UEprn!@q;J(li=-pA&*P$tpf`T>k&O45g=*?m5EQ7hh@<2Rng z%vU(gA6&>o`v{slC2u4u0}fPB!8P)I4VNzo(FJ>>NF=5;AibLiQAid7SMj=(G1i7}i%k?c2=gVelfvAxs}O22E7#eegg&~r|^c<4DH zuK@FE%!cGHF?HIlHQa4)P&*`Mzscq5vEw&D^<-<~ppf!(q^6pqG(?HjZ>|hM+Rhrq z=xA09T9dsIv9HY5T{IhN<<-XNBNFq*EE$)TiB>OH=Cp49K>EDmXJ=y7#3`atL?fy7 zDcs!H{JK(*cshp++@!k0aOZ?dirli;9*M z5z4BEkPm@*+$r$GiYO6V1P$J^2rv0PmEfaaN?jN2JZ|HaLa-j z(IC6D!p@EL^~K}Ar*6I6h$}Vi^%zo~Mmt@3gol*+9U=VSU%mrt3;D(Y57vD#3&Pe= zB6;D{-9I?#nA~=QSsw}tjRtvpA^Cz!iR}W!^wIrds;7V3+;>IE}Nw9;{JA zDW zTtRTAf7xZ>?9*@HY*Iqr z-^gck!&EDSlUk3g?XYa~q%t$Re@c^l%!el$0)+vsf`{C=y)-ALJOY-@tLNn4J zJ|3?=!cD$QE^55^nfPu*ZV}%ow%DYwP&&qXXLf59eH&5re&1Dpksc>_yz)lk*Dq4| zTvkA=xlIJ2A}45yJZiSNNNusYis1XO+?rXr04f?Ea)!V-4Go za`zTHV3Gqdb2$YvesVBE-c5N-VNY@hn;T7-73~sWLNH-T!YNQfuksH@Z`;HuWEWpJ zL(N!(+RTtC4GFLSWs@K2se>b9Y&gW|Et&NBuVINXbYrynMhO3djKbMZ=SM+Xm_$>` z@orOSSJk4iyWrC_Pc`Z@v~*2uZ|E(?&To^|C>M)8x0>oUTO|rSJNnp2=r{kl2<9*S z)nGU3q-HBg`ui$V$2l1(UBTLuOU44J96vLa0Q?+Wr2Vul>abNrDKz<7-un!-mz`{T z9mJTnQX8xUdGZtkeT6p#PTR*LjwNY*)G zJ>OzvlGG_%G97BsTBQ}vA7%<=hikWW+cZJ^4;-X+^UgEO!#wQ{6k7aT3#7>dFW~?K z+Y^rhcO#)J_5}?s<&ib)oy;p8nEV|2AVi0Qt4}NpiqIJ7_9sNqFOkv5$kIIi^Y`$! zfFmPP0yDodTWgU{x@XzrJzc0?+Pitmvs@u&XyLBJ!398C(!xtXEb! zReTaxU9kmn(qD~6`fwusylxzU-#tqYbC&NjieQE$u~QP{;|*8~1_5&F?j}j7ZP*bf zIloBo5i~oM)vyo_0V4EvR&0a0*Wm7hl%3;CQ8HX5MUFA8dX66Hlz`{mfg5#BP~<0{ zCYX`C+hGW-mfZrLS}ROnc6yrdbsyajsYt~b;*`}IyeV~#$O~M|?n0y!LXBDJ`?nEk zqEVVz<91QDeHHi%O*9T8#nxqV*hjN8AfJU>U;%|fxpYrTg@UtFO@HWK=4pI({y@=F zqme{5T2*&C?%^k`N|@!NO#D5HZoA-y*K?c_#oH`7g0wu4mdZd|wYTT%nnsy*G4_~m zTa5bEA1PF_jPm|gv)9OF45eutQZnuQBv< zcgr6YKX@;;4rxB*nPc`e@4YdVULLrOzi&_MxVCR@!R8svdnL`oHjM2o zr3^KL-si(X?{L}`LzI`fK+1P6o0Xv5Ln~m>H+zItXM#uX-FWMMLD9URx&80P6_gv}R5kOo9N#_-}q zbzx|ryD`AxqXMk4_a%mspGp+kifm!^FG8O5&aqeRKI6btlK8eoj1~ak9tHXfbr?yQ*K*r39eBj5gYkS zx}!AiVFs9_0tS6vwVL(%;N4uo+MpPRU&d_>u>dw+x@cg{rudLf?0arNN1*G5VK9O6 z`g;L5uWGX0Q-c(4NHkko4Sj?P3~o)Fm8{IAn8y#nDSqO8XVUWb^y4t_(b%_b1{hiw zyC}Sbect03zC5>4mN0d@{i8f=#249Kr$xGLU5dfaMUnm0205LqcymO9a=zfpNLmkP z|7+VR1aiq-o*5Of{KJ?N-oClehakt)C+Y~9R1&hCr9UiEQo1s2zfu%|RayK3YwMK# z!GFE?JPXB))XH)4Z_sitJDR8%Ov5Wgy8`>bE~|DI2TlNbg{odnux#(-~tmqx#E@hl1uvcYnik9PUNEO~Uw^X}cojfg6 z*@ZRWE#1K`QUpjQ871v&1v4~iRGxnQcrDwaGN6<=j_MW_OFE` z5I1FNrs&RU2w?NX^P+qU(0;cqLl&KcV(!tq0VkA>5Dmw?H`)N|`VFXIVR2TlkCBMd zHvgH{NtL%lv*@kx+4tl`i**Bty%J5xV!%F3{Y`8ikl9WM)5g3bHq>3x<@jyw!78wD z#?Ij9Mp_<;AJ5=JbI2)2&v=&kC6qU3l!KU12u?L|A)9XnM($|D-RRQ{9-s(sFG|WX zVezKOM7dqC&#tn?+NY=JXs%F=RlISG)mQ6<5~ef^-epIskHzrr!rLOcbF@j8B?Ryf z$70mxk0?A&x#?ZDct~+8*5=@wk0Hg8T&VI?%%TO?lJWRiMdDKwTM|2 zZZmc=C%Trqyx{kHz}rNgUvdJYG8wpM{jG+?kN$eo74!x#XJE%yYovY z8^f*Jk8x}ozRDDYZrZAfG3-0yj#->ef>uK-bZa`%{<+wV#TGvN?ktM$NVzD<32>(X z^+*QdI#tj&>;f5XnpA6@J9-RdX)ravYKF$~&3+;}_~tr8+p4@JnJbnyBeH z&?l_mB&9%q z@Ah`IbJp1T<1Mmh1+j0qUo8=HuvP1|m4|;7RJ^g3BI}T?qh{gvyTL)_sE@+@BKjH# zv`@I6+!M3(gN@K{zuO^9PMiNtPvNc|En8$ff_z20qiGq@;q-)(kyoX)z73`zs^tpL z{L=b_D%FWit5W_U>6$z&PvrYz>EHd@MJ~wm*XQITFpGqc-8q3Q!PKOomUI@aUK020 z0-%PMPRfSA?zp+Qwo>$qE4_Y5Q~}p=rT&_v4#F#kCO!C%?d=+MGR)pfEbQ)l^9G!9+`yD+@W;s`ZPNKS6o>z)6 zFI!}oUSQ$PmT^aWDSzYKcZVM#S_GgM+GzfsuAMoC6}SfBbtH0_?kwjQV)nQ%?;A+w|KOjRO$XXD007cH{ELJRpw1nh znYfo;+{+P6_Z>?%09Rp_?yLQ-kCb(vR<~nE;lq^;1TVPX#P2F8hn$V@M+H%kjik-Y zYKd8ZoBMjDre6{YMp&O*$%MxnkrP6v9eTDe1( z2~q*AxD~n&TZ%5QnUR_)??j9Z2NlDs=Fxvkf178>+}9O#scfHuNsc%kE1}(*RhDRa zS1)#|zx?6njT`fHZT#XN?;Lx|Gi7I7AngoJvB=XkG2St}6B3{B@l2x&((##KLsXJZ zX~u%+VX(K~z?lVSi1I1oM+I$E`t_37g87ze>y(J0tx@2=v5EU=Ar!|9BcYcjz8psj zxryx{NhcUY0zp~AM>UoP1O!2^AIs8QRQ5x!cb})wx8zxm#pt-FQZfqJj^H%?Gd>B` z`Cq_Mr0teeDgB5_it9OSCWCM;sjOmf}SMxa4Q5@zZ7(M-2h=Dl@Rw zX6hjT=sy#~_z{;`QN>N)D+VSfK&{1ia{Cvk_RY~Z#NP4YR$bBU;!i!L`Yhb1lQ~;A zeR-h@#AZO6@mw0v$qK(CD?|^-(EToyHs+>mSnjD(x@*zJb?Bu=DihOP?&~b=5}Q zhTo9FUAVLFp%Gx1^E@eDvWhI+-%h_7L@(BbLFdD%?2nBNB>TS=iE+0hLf^v}$qn1j z-vpW-lJXl4?QeHIm_n#R7>Yrh_V-B!CL3d3uTUGl2m{hYvAs9{H{6#4mDr8IK@+!Z zWWHq*EPtt)4``F!-uv6vJ9^;M$z2W-N05J;sucwNSf-4vs_<}s?^?XGGlvLY9=r{& za~QR}4n|C^g*JON$Bk-RdgTP!#CmHXH}r)5*SPJ}gY$YDCbohm!A9DLrXURlKEj8g zrK>HN!ArasrBmU%6C)kwTSH?(Wuxi;9SB`_`w}{4{7{05S;4PC&7p#{dY%kl0eK0yz0632?e^?^Y8YqNNh z?4=6O0aN}=#o}K=Hh>29Ul%B-od?o*L#<}5x_6Z&j!$D!#5;N?zb;OMV(hV+NUgu~ zgZ`UEMC>h5)^(vAa#d%p>F&5lNKChaWE0xKwa3mFZkY9It(xa*6apuIUyj4KqkziJ z)4s;7nMd{oqJgu*AW|NSa#C5yZqj19#c7wCjRB9S!Cz-bL%uUf;n@ITYW5xRTPglb z57x3w!k=y2d9pI}7FcZ8K+GW8U6I`}r60pvKJghyyC)36lV*W!epPSNEW%JZ zJqM2Tq)*n69f?hKtB&#ilCk_`VZb-My{m+ds3mc_XFI@lC%>?#Q zYu?2Vlll(5X%+Un9WL5H%VHX)XWvydW4XHCM;K^^n~YAChUKn}>T5`Na8lxcW0-jN zY5iY{nmMMckDCSK2mO;?n_9No^GvWG zSpR*wRv#_G?dv0nZy>i;z!Tv;2;qM)8wNA}CNYux&pkI_!%Fkpeq@aur^-fUcMSga zTe#PKH`3Tt0EG1eI~8zW9=Se7Ld^$x-q+$1aE^A(@TM5vtoY>6)!_gu?*2dg-G6wB zvXk-?OpCI_l@+r3f7t5&w_5jr-2;x3kg*iE$9VpyR{(w-VAVYKHA&3B{2z7mCsp(R zef9q&@c&N&r*ll-8AwPBWXO?zXV-MrlGtscXX)~qbQqv`vTI!{;o+(N2Oflp6 zA8mTTy1#fsz{{O-yKk%A1)SQG=Sy_Gn)-%T_1`wT0WR{XjN72>C4k`P-PY>(KZ4=^ z)ZPVz!w25x2e!%=wbW4U$=?5Uqvfj)LCx&F6{4Xv6<>7PE0^zy`_6zaN}bZf;@(2x zIfJ$%2+JbCO%gL*Msmy`Lwt;J}c(u9iQlHO0^4h7#(5vNArio{a zz&YMI0X_SdtZemvY)^grA!uyda4N4&#ay3;o)FqEt8_mgvkm;=pKdzH%=&bfx=0uT z2QAMIEFD}MWp+cHNt|dn`tFJL?X?y|+?rQAmflWew3huP-T6-%hP~aeoF?f&?JoNv z&gRBsD8M;Iz>&M4xJlcf;U7fpx$YpY39KOMw_}hfxMF@lzRRLY!@dRJNC`IPyeA`* z!Zd&k09jt^?^)h25>syf64!{&QIQrWGhiT*bh(cR&K{&NJArta>1+}n{KDzLR3|BL z`{qXLu#&yTML`bpz&TbLiUe})1MpAg`2W<+dEQ}E*42klKU4;~RV2G)6i6(-c{-xq zU=dnHd@Unk+_xoHPu%Xf2c%H{At$D)=NIe{dwJ@lw{N0$J#MhfaJjP4 zq7BPik)uVVv$YQp9EG(}m}|hszgW}2q1GW2SQn3EckEGLBT7Z_pZUpK?JJIXkhv>z zz&Q%y(;XJ+7Cl*#Q`s*;BbQ*-EdAceS!i;nZ6^puFR=PKdfO2T%f-u8;1RyhR)$h9 zkwf?uww*@gL}fiJu{2v0Ku%elj$mOD_wS+FNy9`6z}-JpPG)U|)NcYz0o3lEg&MSP1Zt;l##P7+V zy0pDuR{1&22RK6qoBnz=A}S`ZnPgcBpm=su?bbSp<$C9GUsTpwXrgfoPyE#E3U>D) zU`Y0Tge`*YL&?>NUdQ_i$||A~ri!KtO9V%x7)l|}S$e0GPaAsDikyJ$jbxxMuJtqN zl{sDQr&WBe=kGhK&adadWm>`KzM9o}zadK6gR6?Tzz>xznrGRIv4CifNZ+9j45@Lp+smX#}qaoEZDh-Dvs+}WZ%roqzf zHSEz;!PHtGU^o>@A!%%}4#{1-o8sXdqKT)P_F3x60E(-`1HkMqMR=vIWOr+~htv-r z97%I1LiPS`WqRHPd)ub2T64yE<>4=8Vkyi$JoP%w(nPP7miK~#UFLui79UhaWywGj z>(22vc3O5yb@5i-|K|g1Ub9x---#rCf6%i&+e#I>or8~fLamJZptuV9IA$trakt#z zTd%^_V#WRE8#q7y$^C2m7!UsRN&{V@75?Gd3+*fdA5aB${0~*koE3`Kj(jp8{Bc0| zT(Oda&dvdE%X(8YzA_)u2Q4dAsCGd>_Yfeolebrd22+KLg|?|#aHROpR0{_*PpRdF zrLq*hZL)&t`0Vbm^4E zKB`^V&l|;;fN7W3BmMhbZU2B=`Qzt+d)iiJw(9@KZGZkEFqD&jKJ1^z@%7KQ01`&B z-{R=y2{1Bi9}dG?jlR);z|S})RXj|4!r#!5^S@OrwrNZVJJXv&)Dn_A`%I@Esqn6g zXZJ{ya+|4bR75YdB6Qi&Z`bd4bxzsls!CbF(1RB2+fK%j4X#l+X3}*9Pq1f)IeFUg z${LnsSqGG1b1HI-=IecTwyV8W-hZJu|06y=$>_6oNXxyinBtWuC^ZHf|NKRj#^7*=Eij!w ztLS3rlU(qRzj67h%n6G!?6D{gw{;vBga#FEG#Sd$UgS!$o6~}*c_{=FN_OpdeT8Rt zfv%mIxo6VgQYy05bMGv7=D=HRV7STW&0z%%m^&$v@9#t}-*`%oHZg2Q2BA;RS#;*% zL~l&SqxpGhi6@E?&!u+^YxzkgzMs^0yMv3oGjawBeeS+1CuZug*hRx41gu;p=JX zRj`@Vabl}si{$Y>(T(Oa+-ux3Q2r082~&trNNgs1^=X6l*usrJC-!{|{y~dX=>GMm zoYK&fxoV=wZUru(SbJ-xnY~cZ=)`zC_G8^+dUAw{6V4W8dMn)>J8E+5Fm2H&+oQR` z>2`xVw$5tiF`xv`hpu754cxDc3upR*lEKRh`nQM5Da%DoU4#ICFU)PuIw-#-vjch| zQ9IJv+&TR5p%Ck6mo2cQ61ryG*d5R%uyxi|)wr=mlnQT;(@4Zl{B+4HY{rq&OTZ_n zctv1q0Ma%m@#=A|20l?^regmghe18wwO#m8FMEO}0H_X>9Vc>4TV~a7&(AdXHSD3k zy4AfO?Z0@$Xb6(D@eWYz*(q!*VDwian{&H+s@C4_{ydTzQUh|w6lx{&Zgf>0%+!hc zE%Fv2g%PV=mPRLl_K%3hWEkv#?C}B_>1L_D3elL4vO-Rw^>eCC=7E}cetrY2XxEYc z-Ei}sKnsWEu+F^Rp}cWpvCly&QXZBY3C0MqY7>&%6!7cZ`tE<% z3rYtcB0meaeiN(0Q-O|{P^^zSu<5+AhI-DuWik!kb+ksrdj%1ZKfFjDAg_h?&g0-c{ubaGVll zI%O;WdcM@5;b*HpPYk*2Z?({@w~1n~`HYXYBDW}J^(IE=>|5ROl+UHylfnj^=tjAKF+B*X3J-w^tqymf`}g3C=rt108bzMZVJ5<_1%Jfjw`GHu28+m zOsekYjeNB?9KFM?7k`>%@|bp6y<-%l+k2u2iBlELr|e}=Wkn~1kd7mn(3zWl!_O=Z z=Ul&N$VeYCBENaF@|w<#O#+0pu#TQLDt;8=d5w0~RBf)q;ls=5)~d;lWZA$4NvX0* z3b8g}o0eSS`Vc#@Q;GOIZdcT5F?{=JgJ^yYgQ*NZ@EE@6$E`6*Z%RZq^kmhj^PyO?ByjYy^*-iUcpI`ad>v?zia;rJAgCC7x&$!BMxte+k@OGLpUCAu;w`CH4&$m2q zdcd_MT_|)K(A0@_k5X6EA`d7d@1N8X1}H;uMJ<0U&T&`}pca!AwY&q=Qu8lrN!ztO zijN{R;f8KKQb0$QEF)6E&%s!x_U+MBM9ceC3(=p>%>qQOr*Bj1Mz2b^gf_YPRo(yI zxV|8md(**0|L0n0p87~^BDW&az$5Hu4Pobx2~;^h$ezbyR zY`}(fS%%FK4xqUagAY4@$p~gEGKLw~?%m)TbD5n5C9UTpT8-Ezpy9$Z+_M6im^#b{ zQ_kzR#c!TOWr%kVWrOe`vMovS_!gWSyl|P?etF!14_BuPdnGGI8RN=Ven^H`XryaG zk1Iu7omld#@S2cnzkfaG*NYmMMu z`VgFJd=CQtkTYb+t?HggkJV0s*9$iq>C&yax4H{}sUR$FSeRAv8-BBN|N9sLq#6d> zYw9gZ8)UI=U0d3P4!JxJrz_wx0p7oNS}Tq>OU_$6Mfz%Sv2ke%IC5bRFus$ZvZ%xS zbLc@GoZq!txJYAy-lufuNKeYwp2Q8W=v;H%x8j0f#k9;~s#!V7f{n=X2B zzs|%nD#C6Uotw+U*qJ+{tmjZR7cHAe)V$|l?S@YIjY?)qfLX{Zn!q%>&xRDg_&ovw zm*g6P_KBj%j@(2tz9mRDK6NiKcaH^zb_RXjIb4{vrv7@KbRILuU&s!d=#bO%7+tS7 z9wXyx9&xR9;E~@gw9<;ieAT_K^%H_E5SF%%nm8;!3hKORSjhyGC;XAZ=**X&U^E4* zjOpxoYvwof?yWe?2_ueo+op5qwPyhtWirU*j%0X!aLF>YVLhW|NZOf60uFjP^N1gf z%O;xb+a{Tq`Y}Z*S)Tw9&)dr{Pt>qn(|qhNw|#hT@q((jW^2bl_L|RDlT->gN=-pl zf$E?y4p*`Dz{1D=)57Ni|10}xyns(3E1p{Xy|PzPfcN$VJ^^<7A4AO8m+O9$j^tkA z-W_n{BI^lhBG>S=W&Q)5iXh5wx}&w%`-Ik9J$&S|@rrMg= zCOCkX=g4XOKRq$hiWXrDgZ0{UNpSVi;e#*N^xuj{xss}Y1mLQUm>{O)gw+W?#V zj@HjE2`MgIaj#}6wiXwJ*MYzY+=>r}ij>cHB=0rMQ?&&dcV-bak7|Rl{RCcTx5w1_ zqO+m}aQb7MAZswh6EaLGb=$eKPj$so1Dcul=iU!*Z#%!0@VjmrKiujH{#YJme;IHA z)OsKa9{y<%*8{O{>656lePOa=M~7B2413@V3ryL{M3G+kACOwuZ(8{tHsc@Q_akqQ ze^-W0T;jru@hx%8oWtni$n9;gNV=LCo{!-J2 z`KLl~*z%7Sspu5UO1Od4mwZHb()4SGmTbEsI>nTA@DSXv*Ze&z!tT_DE!^PVWf?K* zkqPM|LxvzBvqNuUv|+vO_i=x~@(;c!3)|=zhTFIqQGf6L_oF|Z%l5;E6+rnS-hi&L zLX%r$rK>l#Z`V#6i~Vo#<+R>YKtS0*Paq_iU)YRXj$57^uAB&yj!PFg8`%iQ`Z^iy z=Lyx6cv%Q&Zi4G~d(!heq^NaJf8)mbpC0k@mk;xCvC7Gbb7UZnJHpKwQrH=aK-RB& z;M2)V7Qj@|{~6Za_>-sxs5HVj z4jk9LxQNk1TzW{#IF4xjOynH=D3T7DbY#9R7cwILAA9c|)nvN;k22#N85QA-jV8pg zfC7S|6lt-eAfVEP5D@_pLKB1lNmND{rKt#rG?gYb^iCooM2LXWA_Nj3QbHslfh44I z-{72c^n1?lyUxAq{&Uy5uH`?xdEck*XYc)aK6~%wql!_&qm4|O;5yzwziYd9rg}84 z{7GcpyYW%L0pWcygZoWiQ=GejmHj3W4?qA1GwA9{>w&G)O}1*?FbZaWfX*iCjY;-P zuG(ZdRWkVMAIqzQr{Q0c0=PE%>=Sp6q;;W(UbN4mpW>5D&-5xAxnRHptGXdPPuiDU z!Eo26d6rm&dp{5d_%4If;@HF|VqD_meB0EnO>M_d4sHJ=w*(~B<6{KFWhkvx_M1i) z*;hS6>^tOi%n+4%0f9RzG;t_yt3?c*vvClfCWQ0<;Xo8gbJ?bDU+XMIJ^^0bE&$_;WQxuNudQNdMMg| zI}^GlwrZ!PVV7&7YNB$ZUaXJB)_gLC3)w>2y<~$^i}$fX2WFZL-V+^r<3AWjtR%2F z{pup>HwShO`W(!1MDF=g7v~s>zgctSn1Ylc(+D1UCNO<=X@~-J>y=dxXNOL5?R@a; zOq2b^zZ@V&^MV}G8QI8_eT>dwh!j>xZ$If`I!?HEfD{sES`8*5g<6gDyH`h#=yYWn zpfou;SV2+)e)aK1QvMa5ZQ=$nTi>%bd0hy zs!xsA(V{$E_g*f>yKA%$FlJ)YmY{VfFktui(EE=*d)x!!`u4R=uX?*}A!pb653S)M z#*F89oir?eRE5PzvQArdi!2vn?LDq9c=y)KSkB7Hn6u0bQJ@H(nlm?kb<6|syId$@ zmSBZ8U0^QasbWG?Jrsx5up9fHeK{CsQnSE^$IeoomXA|?0@WIs^IVNggY2F?Ch2Ad zKz!cE#pfh}7;+mUr`C@4u36dkpY_jJJOk$~Y0%QTxZtpA6SIhxOjvJhxnvyNtoj=>vtP!|8Of$$=tpu6klk{~ z0yD7J^7A!&A>!=&_yP1|c{BOzqFKfx`CjY=uZE3gAA{EH4`aZZ_~v8`0pipQAST}n zRyQD6g%aCS&ikce@^cu}h_NYnbqKW^6)cwVRWj0)oZah;^8YgQ zx#PlWude9o9q*r5&UQH$9=iC^N;14}upJAtG?N*2e~djs^PJvp@P5b}(fK^FcMS)* zV=b}9zgw+4)(2jJe*D9lz5XvbUwh>{n|FH<%h0_)r60R`kp_QJ9kU+sDT-tcKEvGy z0K;o{1a{^u2{uZ4G`5C~Lc7+m(KUFo)Vy^cN&;R>fX?mCNfDO+CzSI$a)G2pI^YLi zeRB?IG1(4e2Q+C0fWK>4?6)S*{GZ_1ho$CO`3Omqbv0{E8UcCf0AO_u)dhf6jRgs? zx&|Zvk0yf$dAfcpjl)aF)r-tt^I!3zfI<0N(sG^Gn0Bup)<{6uHOTo4DYv}e47l9* z1|2&m{nZG}2k{+pEuY68C_@%-H2Ve}uYu*?s*OtU;E4@|_+zuh4*_~zoWJ5c z`^1p^f{z&hQERsT1EN;yU%MxOMy!Forul1NFJ>74teuni7HjZ5gu2!$J7w)!V-3Cs z26{jw87McOJ5c%^v*n>7+|I6J>GgniMYgoj33jWNJr}r!upBmf4#YD8R{|RE`4ZIq z+f78|;HBX;p#N!Y&UZHvsilacK#*K$3R?onuiZpE;=ax;m8^Ty0bg*>?tfvL=-0{S zo*xu*HpuqcP2}3fL?Eo$rjgH;MccB5B0yHj5=S<7?8@3e;APx_qd?d5*^)-H2oYeb zQ^UE)Zx5ZzxSx(*H=QqJOP1l=LsG8Wl~oC5zxL*L@Eee+L!+4Q44JYU$3?xl^LS_8 zr}d{=G5P#w^S*EmI<@cy8pHjxckK?cyO6PVL5F6Dj&6V_&C>*u<>JsH!B!`Sb5;3k zv)alhnI}JDzmCO7w(|`vhC8tLi)k^MAsO?i4GN+)Q)RP`Ip&B>hB^MAIlFOey zn1%dp+gbL3p?W)zEu!Zu${E;_+Gp6G48L`u;I(8>3wCzkgj1y4`GvK=S^m=4*8e93-ZdkFNP{Iz7R*4|vBxqahs5fYQlrH%{!jSuzzoO5G$8k;NK zb?5FLPav(RZpi0w#;HeVdkSY9(Y9yt;0+EV}S(c54TZjpD=Aff30@XV1Sl#J-t(q^@}B=SlfKT-s-MC3&$wfpbq9CMn*QF`D$pD`G!Uig z3FOZ`SEA6Te@3m(<-n0%IZ)pdMId-p_$P29%x+Sv-3i>pe|+#W);1>lAWqd_Y~%j_ zuDxQQz1LyKQ)^r+2=l_ZP~gt7_91h3FZRrgj;qEIFYTd?!mn@%pBjw5^e_Iz@CNm4 z?RD$pYkuA+^)b@Utz--+2)`L1u1uf&_ms(-F1E^RMGJ#yEAt>efJC?_bI2+VAO$6K0w0M`iD%{&I=DT7i}H6 zmY9f~SO2;@E(Onnovf9j3btPa_#C;cE7NsAZ39ULZu$R^fqS?L1Mo*k3-C1QB>PI} z#nM6>LL8?cAWCol+iLWL{K3VgIKlG069Eyqq8BS@W_Y9DXJyC^BfQqTxUDV|X_NDa z-~YjRm@2Y-fMg}-)SU$8z}U{(8@pVc0K`lM@A~(w*SB|$dkOzH1_N^5+`kt3t z9$37!ZPQt(2aq~hDa3*dT>Y1m>h08We9QtU8e|CX~P*YiJa`aha!JhNjTPP@1M4(SEU zX*!sup2(Dp$n-yq2!ZDV{P2z)4C;N9c$KZmv?8zETvTd4t`jk2rUyhtj5L@SwO)GT zjm`cUOP>dBY5@W1u%9sSnX#ZXen*m6$k#qtOb3-~JeHPGH~>gTCRX96JF=JHCBcr< z=x+BETp5IQOc{s^X^I093;;>|*FyZIUQ0`M5c+ee&WXF^Ckvn6nnG&+uCt%DDS%wE zeL~Nlschm+P9^BDZndWVj3pfnoY-Ho3w^E_aVy>aWnG_abniv?(6sv_2}nr-W;kMP<2>x)Zvk%qg8-V5FXA{r)z(Y1U!zz{ zegE&H%YJ~^#ioT_n>>RoHXSN&EY-L~^ojlH`ybsQoxBUuc=4LZcHq^u7}b{DR`~w0 z)ZD=}8umAi8x?Xl0ALk4Ftg*H+w`E_3f%(gob7?0eE*8)aY;_!|F8UUTx(H~D~_K2 zW2;S?{J8x>i~v5jr@3UP^Ld|SqdAw= z3+DH-^V+<-@BFl9`ZFa4e;Aj!TO?Q~HEQ*3MKxmWRqH+8+yR!6zWWFHe<{g6@OqvODv68??0uUc$ z_Ztunun_XFBu-)W0ppE}rSR&R$GRYcill-o0SM=Zh6RCeqwZnl^V4?~xaan3t{Rf8n8r}2}P(NgCy8bQLJd8zoRZs*UY?%i_QtgNSyAiAf zNq1{}!CSNr`=K8i1?j#{b(374S&1yN+oP;@#>v7y-P+HiRGNTjZoIbg>>iav#p(e z(m+m`zbdH!TM9UsvrDA`@*+YKmLOTdm%AVCr*A5%`@ktV4a@yzpxT`L>BWsu)xEzK zA+FNXOn@RX|E!U+ivg_DS}_>O`L0g;X>c8!JpPviyuO1O1FD#$098yRszMSbr~Xpv z;@;4r$Ro|P;y>}?l7E!lStoU7&%YP9`N>WZP97|ie9pcLU~>9_cMHfv0AKWZ;XyBq zM&vzDvwBz4dZ2WPeUjY!Ewe43W`Srl`|GV-fH_-Btl-+G(@j?a^YX}O9U<|#s`JcN zR_61t(CV_Y0= zC4HzX+)g_HcPk?#7VaE~vJ6wmxy3$)U|TsK7Df4zFiJ-eB_^v86`6!E{860A@$HL_ zcdX6`^0Y{Zrc`v$9Mf8DBN#KIsxQT36E~tSaw&)X)C9Zw=hsN)0Y%D< z=B3`WIREi|M7Pz7bgs17Q<$&+?GKxFX|gayAK+x{ss{X>Ko*8v9Y1)a6dw8c>o|!^ zH%%(5D$L)I2=7A&URZZCu{1yOniUp3NZ!><}MI^)9o$zZnP-GIF;FS>q@l)a{BQ zo%kXCYiVyysH8k<+pc-bNKcWeiznM7pu3JhewshrQb*EUG~Sy*AJNbR{?l@dzsQ%j zunV-5uJ`4Td)my5wfev<_6}%Nw`P3f4W8QwZ#`J;)fGt%u(Br6HGa(hS^gpRMwA$XhQ5dqec{h2c~b6%3F4YVz@>q~y^|etT6w7!#}{yD@GH z7xZKnMEo6SexIabF-%T6x+^*7i4|HkRix7i(s_82o@)Wr{(7)vrZxI`H8IQ$-TT1Q z(y{i@r0EMC@V3hn((iWDLOpx=m;}o5^}FO62+P8$r3!`qU{JX3eS9e)1t>r^TZ=Z? zo;d&(7PM4BJ*Q)vf5rmwYev@3rmUVf+RgOh9RR|uewyPy zsp0S~qg9H{ttSQ%eWuT8I;#=rH;k;0~HvOan) zIZ^)1@7zoK zyhuY?YZa~}fepXm6O3&RW?_UE&)o(69si-J>Bx5#%MmI#YKO;tlpErlzA1I}<)x+O z4R;*UogKq|D0^#!&LYMxeM!wr>WJhAlVo4md}t{#{;M+WF{u~j-4`d)F8-2s)Fy8c z#`}peTxY3N-@W-EYj9~2>aI3UC)~t3H+YZh6N1jPey#(uCA1kCjM^vFgWb0+kNoYA zP|ZbUAPY%o)ixSXu7>{9S@)R7-JBl+GH1@;z`wmandRd7>X_9LX2IOT-?^4WEZZA~uQRCOLB}=Y zbbQ1qo*p1l9;3aT6=m*UFSYl`5h6#gafX`Y`RV5+9&!3f3Ih*8aVkqm%*xUT4kF$3 zR<=GOCcb&vI~eDHY6_-AEwFRokkqd$PO0Pdhr|7wwKmT9@)KNdb^M};neeXSQw^?P zTN&+YzTQ@U4=(djz~{fp+;wMB~W@!)C-qj}2PPQWi+JRWtz@MOG&$wsAag+wey}sVfJOB))G~@07T#TWW4P>Epmy0+S77_ z1<{JMbErdvQpF=hPG^1^SQx{$U|c+_4d$%`@Chg3RO3O zFg1&W`TGQdOt%7Jm6t>YKg8uKWN}QP@V!wDWvj&(0uluk>HXnp=RFqQ7h#uE0v8~; z&jgLw%>*}8WOzhqwn8$Pxw7{*c^T7OIAGmq?8r$jH38YeU- z%edmu@Q%E%9OTS)P&^r>;~G93E-nxkYmI}Ax8u)I;Av+Di77RQF?69_6yH1^mdne& z%^aUBpRX0CVYd4>PEE6QlUJ1Ryf^pTgJbbYKrUCgc6qa~Fhf+73RvvUN=^DhE@>*V zWmq)mqQTT3;-8wl8#pbE(Tj-ax>$+11PcBzBqt}x*D+PlR{W6cnuA)ZT;wGo^Vn{` z@^>eMrfUr+*0@1)wp*Lfj!f!-M8v=W!`mpK<>ZGhmVC?-2^`;rju0<4R|g1*TEk>v zTjayarrMkbh=EqHECIsxP3B2^%5`h_L3e)}l!s(c#sh}Eyd2q_h!?u$mzsO61P`II z2CF`qjM&L?Wn|;d=mEy_ax&f*V;ouWrnRTlD^QB;tLYUFD|Z9atDx<$L=C* z(2FDGHl41r_WWYB$rk_gF`GQD@n&)@3IB$F&I6*IRC{WHKEU603kstIz<`ob|V zi$zPFr%D};OKzOez|r#pZ|lXlem;MfzoROUkZt&}+aL5Xo!C>{ME?Si*r9>fZE*d( zC(hMqr%59ElyES1O7kbWT-bQn>eXH0!sS;wtJ902wFXhkk0(pEVp)L=eig#IfpfRo zSs?zHsNHckas6q^orQ{W=NYQ1-HnJdj8kFA>&q5Z8E>W68;HO%T!b!Wm`Mu6t!s~9 z2;Q_^I;OH@GFuQhZp@I&NdoUrbVJ-8&zF7+M`MknCNPsx?F6+krQW#c-dL>O7)UP3 zEt&H&U^D7!X^Vb%l^oV+G`8MkCtbPKe=<>%weW|h1tqjRBo{Hc7+Xsgoi${1Fx5m= zfioFcdH*JEWgycsX32yLOS+%I5W6)jzJ->^?TT+%ge1k%7~xv3D1yP;xSInTqZ@|W z9#+%k2uM0Ja3KSwX>vqXn7x!9*um($`)A+aFt?yjWZ1&)B;VAoKGB4_t&#e;lcgQ^ zI_&E5O(OFJ?Qryop_M-dKFLK<{=hKhVv_&B9u+5=t$JRV`15e2lDagwV)N9O_FSZg zlDayRt+T2&7PMkI`L=|yIjrOE^m&t=Daw=u0UE9D=6HdhcOp|9(y*A?n5ZM?{WnSVxnX z}d*C79{!`M{DWBq1TU0t*9Byu6xpI zo~lc!?!ovkIPBarmsr#R@lb4g%8}lI<#r!&acA`8I=PwX5%1NRMV%htvy(5*VB`wd zjSc*w?38fSYu3VGG-m@^Fh-etXjx2#Y}FRdCAGVdk@y?@q;`A9ZAht|E8z`O<+!(Z z(`4}FeU1w6%48fef0NDx^JjChyLL8yQJ!1?bnIvFipdqS!799gF1M=RGGkx)^G=2eC_BRSLH=jwrOoRIAW-0 zLT9qMK%QdeR}P5v#&zwptqk1c0+z=djp}QmM^4U=Mcor!RzZ9#23nXO)>8p(n16_0 zAKf6025nZ8+s02FeG}*iKC)8*NlQSfmam9#?Rt(K>c-o<{T|bEvK|7f--6#g4~rNj z8H%ka!$;3gHGKxzp+ZVb*xJoIRG{*>KN{Qg_&0c?Z2BB>mzwFjK8k{{i+iD45p7P< zQ~>0bxbs%nN|YYmW{a>B)nJR5r_J$&Z34~nBj;ZkFFPsGbnpLyEvM1imTjUAm>3-N z-OJfjsS_UY)%*#Mb-g8`ls@m>i5R$#<%Ks;qq#E3Uq9geQor@CQqnt>8!EUi2#fh? zAW`;R-@xGnP4ljx8EK_L8%9f6PG?jC@vA>OTE+?T&F6=tOg!d$`gNrlT{ zuAnr7^E=b`{+b9-mPw2+Rv{9h6ZroGa=V@}+k*NpIB;Q%JP8hXkCuc>2zH{sneuNBVUK3aN9ckxnr zwY#%Z)i>b?dclsI+&)COoq+UH7T1Qt`R}%)w)-oIR=8s{kmdUAfL2Utd+3B?Cu8Tz zwU4M?cvj9R%596Qw)E6L$L+K3(Cv33dH%+hRZ-YyjdRj}=#dNRim_Qz78~lF6UHqa z#q2f}x$?DbhLv&epSX`*z|XN*fg~5zouXkxXH+X^^ouzL&_>VEh6pXO{mQIZBU4^*&teQ@t+S?`g2B2A-ks~(v3e^(i~QzQ zqpv9B%MUyLI=cHL=6zS_{M?3ON+Er7PTrL!x)zj>>cKiT`MlXqfay!C6{FW76~%T#YQ#J~X%Nci{gA+)RQ{%Ys% zY=-(`lf)xYSzli!ArD50Ex|I-?3R9$^NWIck9PGF_MKMiEe;!s$`2&g54*4)FBUb( zCWBu`T`^?M$Hv-xQB_|~V0fH;Kw)2RrZ;4B5!A4JGqf1OZIvlaIyyXULFj-G2-DQ9 zok1M6VMmXJ^Mu$8X>?7Qm}&95SsKRo&k>vEm4V6jFtaU~i>(DD*gf*$fM3(bS%E82 zQ5|$gbDNBVdsl`C`x@1$bCyjMBfnVS+=-`rJ*TxNVOGko#OmCl=H3C%jSqtH){DyE zmyBNG0Nka!yZc~Yq|1}{24i*78)+4Y4M=kpMDXp(L4S_=N=Maz#0qu!hZU;*cBEcr zb)#^JQ7V(FKlUNbKRYb51=y}CwBLr37Yl5P-K* zTNATTf*Zy(N+K z3B6_?#Un;DdnRpz-f$8iV_Lpv-CqI~E)ghwNMYhMAA`TVFuHW%McD64-r(YcZ?zUUP6VJ>BfnexT}gwb;iC$)B{ zuZ)M07xg@n9j#^K>u5lo2@gSBp^Z2OWAV>zo9U*BM#4~{X8)WEeaXyuCU#KLtt;e^ z5$OF4y0|1T$ib^RWc8~Zu;kN_9hU;mBX-VC%vs4KZFWmQ_IL*TN{DJwTE$fg9xw7% z0;ct5)~#7T@e~Mqrn4)e{Y%2&vOT>})Vb^fj|QJp0`I#W^KG-jbJCCmgw8tJo`lfG zx3#xt*`YrCXF-{Rz!87WV*&GNt5pesE-`k}QnzM-cgpkU9j8F+5n8UnB=fg`_s|xw zToCOJ836zK5KT4>VY4UC)IZIcaAbgsxqJV!UGv)pWbQAm;fJ$L%ltEU8d#K|%!#@R>srrk@1O8ZYi*hz(KJ|S&5&*a|R1)LzC4)Z zyjA!R(I@-8Q4)!3Inuzi?wI9)0SqfYjKkS8bEV@t#Wf!<#$W9H5Z1~Fc z(8?Cuhl}(M-^b+Z9~v9#vjf81HmYZ{(ifYWW7mD8nH*~QGa{qh7RU1CQfZ|Y=((&G z2ktS6@vp9BpCda|6=ii`eHy030`;_1!OW+wYICk*aUtL}cOhcwDyBh!tZi5p`Y51Zw-QjVi_-9Eg5Q6BJze1cinzLikUky?z;%BhJ7T<5_H zizNw^OaqJ2XRdNdP+Yd!3V>}iF1NYMl$mt|M5(yKtptX5EA*W6s!4<4e99yy$tK50 z838!2wmE8O=+0IQ6Q6?&TzrS6HihEYEeuPn@_4MB_&xO*A!&=8IkEqT-CrA&ndJnS zkoTP;N7Q4PObmG^gxsrG4PCxFX_CxH9H5zKWl03F07n(?20z2{SZE#1cy@msx)-1@lfv~xNq!@j-|O=5IRx6t`tMC~UA zZOpc)Dw#Y%J=-QfdrS~BIbek0r;Ur)BW?9d zTVT66Lsh89yG}MWiLe@t#pqoy>2g!qnQSXo8~csRI4Bn@n7VpyTH#G`UXZat3p__W zO}cT1{Z#p_m@9-e_#B$!QvwGV;?M@bBPzgmP#FU^?a+@)mG!3;i1n#)4P)lgXU*p>h7Ko3YT*?*i z)ye((aXjh1fG!xV05?sy1rnlj#gu`1SwWn~*=gbQp2>Db)S7{B{qqJOEnbfW97(7bL_15_Kw=N1^&C%PkOfn?9fc{?BsKD**m^5W?Qcb74YVo=fOW`hxY^Sy_rFTCqruk z5+b_5&z)WZ41^B2AbWzKmuTCnY9^!x&gHhNKTq8vyaqk2TED_-&5`w%n^%C=%jIMr zRlu#xQ`q2>S{=;Zh^@&yoDHR<;o7qsW>!tcfA?QWzSNS$)pWctyYP^fk3oya=aRBI zDaR{8Q7f^vzhLQ+icTN^Y*56FJopEmeD`vx%03gD)kQDNGl)u`VTi=ciYBb~KA+%L zE>41Z4h=L6R#D`&7}yY8p`B9sg1i!97=kCfl|PFXTWu9$_&uNaon*!Js23pItKRe? z9cm)2LInVe4<}ad0ldxZbrog$8f^jhz0SRJktaTzkXMNuQye)n&~nY$hlkiwfB0V_ z+hP-IgP_Jv;&U?=(8#6O$(PcY9sc3d%Ra$Oo#|fGEa5F8I%8qd1lk}Nm^`!Dpl>7$ z=L+%%*5T~BUgmlcfaG$q-YebZmA&xM_1j}CHXw)Y-f!c76`WgngP`n9HI!l+OeUTR zcn!`fx|JORvQBC|Fs7?2!v7Gq1=d3-u~<-BG4yV=p2pnGRI>s*vj1AWtsUL-zb7k3k= z0l7GSSV!#CK)GuXl~5_>xR`@Sr#+v#a$aH;WgKj}SLQt?mq7gYbGY|&nSou>o#0?I zRkP67CeKU*`y<~TtVC*ea2`nNYN6B$WSt1dRnpAs_u} zu>5hITrADaqzM%6F+kgjo6g+o7BV+UW&3~iP(|*InwbA&n`UviVHq;C;!|4m*?jOC z!(-Amps}8W%JT#%>^o$=Wd~GMJ94%Dt$gPOMi2tKTo(A6y5WzHd#)jd*5mk!ok7Kf zDF8GUO~$l=mY!}EUSo~D>`U0vXpXuL=g@GdaD~<5Oqa=+Q%73pmDQxCF3@#{Y$H8A z_E~ouIXCm1Z~ptfhd%6>(p9 z*El+{H2ThtngH>kDDk>5b;K#6LeGuST_hwdf_!L&^0Is7cIIu%%iM5?KhJ4pa79ef z0d2}Dj&BWP@AHuf;LGx@ThLdmTBKi~_pbDK3A@S5_Kmc>szhKThQ0gE#_b#sZm}md zC6%lmWW02>!l^QGdH2&E52<^hoWVjiTcE!9gc_%2c?}(J*TigSgR%Z~{9A0gU{Xe{6Kh+J$((2rtB)rjradH^G7ZwYkB(b}b1(N~ z2VO9opG%gup%{z*I8wc-xYF=o@7CD_;1kP3y4veK01Iz_hWR}ZtrxmZdj>6)>*N63 z9KG}G50>KG3)dm76R8i!v5&7lU|$oBO1{63gx3G|`KvT7%C$oh!2M^fQ5(_V0~b@L zzt@}6qeHMC_N1l(;BioT&CWZmyGU`|wGWtnL|tojlJk>hB5RqdcQC-`T)Y+Kqa|~= z?JD}6`M8|4jN7B}3*5d<>xoT&;slO>Q{_b3r=6U-t|IN7U_8#VklAACs&-KND*8`$ zvpn7!xGZV7a7Ffw+i$cm08RL3qkBmVH!Wj{GpD%$SrM8VbXY;6=6`a6E-i1qX8LC4 zH^xtVn^NgHaHZ;1;}2UIKh6E)hc_yuu2z2-F!+-#m0{kp_KO#*?;`Fj9J2YgFWQEk zJ3C&q{d}iK*M_`nc%7drQ+4eZ;;pow>e@}d9~;2`(Z`!0qMhU_;O`>uNPZz{_OtBL zyKf8cm*wdyqogJES?mAr*xGLRe{;qf9=6>p%#1wb3U3pC6^s)>y;%O$&ta~75lO)h zH)If_sbl*0?90zEb~u$^(_9huhI%3l{%RwSJ5nS+rl5U{`=M=BTHsNDs7$78n{5rM z$ms){W_4c4sJGf-M|AGdCNc`17X~=pEG73-suHIfs|`f3j)`!b;W+X`2?DiXbTy7> z>EV}AYXiBO>1kSqXo0@0ZIbmSOfmf)#=^WFrYOS_827!tMsw&S>_|av96OF}+z2IW zs?ZL32x!%Hv~%5F&9`6Ix6UKox?6`-ozG}l!&qXMKY$;`ecBlpLpbCcChC`lcXH=}5oqaJl2q^NZ1C)$ws{_A)!Z zj=#B#+qHNyKeQvGcsog^e6FAvzN^rxiSc{^;^O@BzG}(#`eyx2W4*l55t37EXgV<7 zGo?A_cZQEq?zWj4du{TgWcUq>fFrVAj}>l8!}#WH=D4A!L??TY2OIY{n?Zes#FU{Y zWtaRQG;wgJsAia0p*G9mckriipIvcAA3lruek!AMFX|23%}Zr$B&iKvL9Yx~E`^pt z<7>^#hdZ`(w%+6zwxI{yU;#=?{e7l`81lZAvJ&`|sT5*gn_OKlaGE(DcB%+lXIU-# z`QXXY62RhF4aC}MHWfV&*yYWk3?lb5zuXZ~>M%wh)e1D8_4SVQP#N~j#<*{zbXtT5ms^z>%D=PFMwBL}F>&zWB(YbBnYDj!3&L z0MhgQk<;+H?Oxl}Pjl=OwHfcjZ4Jc8kWXM$r-#u}6d(4NJBBaxvrAaa{H~Lim4LU}V(6BZa83Y$HPh;>Yj(9j_cz@4_?$PGaR*0Dx5caNVefJ1BrzK zbyKyX;FjK`u9|qEc|(Mvv&>FVQq0}u%NP1+Xa>HMR_5$+qE7Xo=#9*5yZ#mD7U-D_ zICXnh=qaknIf{>M&Xdmf!qI$v6s2)^ENyW3K;<%m5K+GEnz<0;4xS+doL9*g`vsTI ze06aVWS$)JpL1!VoWt|uw+pygbuWXJ=dP%waLtdDnvW*g)#YQfHw#|f0y*r3d8Ud{ zQDer0+_q9gkejzp#`C^~0?JX7Bsm#E<4bH7PQwGy1iA^sOt!>59}TZdIx9d0g9TGU z^VLaRA7h$R>`@23j+*n%aARMiUaMIbKZ%uJO)OfIpi59&(gkLLE<8jGK+5odv~$3%{>V#pa+-qj5V3bqeUoV}`#rrj zS+}VsGdiDE%4`%DZ(=Q2;Z^I>S%&Y!`FZh7GwqI+x5%9Q&3V8KBtV>FM}sU!BVj5^ z_yFE`3Dxyn;r46L(AF41U=1kWD7pyh2pAR*vkTy20M_>AaqE?e_(9 zZ^6w6ip#@b#zw%o-dKB#_6V-e}vK-LI_;jD}6xsu6PbIP)5xIS0HeBEwkq1!6YNNIe>pxwvxUxvxRgu}ab|<0-}2HN%pBL>dCtY( z0N0OKBn{Oa2_W-$PjkSOzGV1-eq%JpgubvxAb*r7d^leKOXWAC>%IQ`8&H~-e>ZW--32gX(FHwuv*&DGy79Df<740_ z81K;?1EJ3>1W(jTM#6XzGJ5Y4mj$D@3k5H(nBU52D8ba$_MNBPwk-8a*aM>_zb{zG z+nf)3aXH|2&p_EQ*`UnagIM%>XuL}23fFzNX+f9%tRS~+Jbzm6S*1>PD`Z>mLaK+c zNs{q!kZj3AHnsAhAcQ=zN`*T%xM|cf`^~z08DE4p6y9l|xGYe?8tOr`@EAQe!229w zy>E8nDrx!FsZ847QPfhSo=*l9e&v{a0e+vzMv0;{{|pA{N3uyxR$?ulE|LxJWy-lJRn|hV!YL7^oWT& zOXAq~moSu__?ZBc)lH%sq3PX0@sz^a+hZXMk2_xu->Pjy-%R~rFu)FquuA>f9-`de zkhy%UokKQ3M6?ckG#Km^E$>uWNOQh+E|+twA|%V6XrK}*Lv*aNKH_TYbr|i7HF(cK z4LgK!l}{>>``I^5fz!sclT>;!lll|^-aqyX~sg$j``Vs&S19{$LhA39nql3y_*v)AJFv{EZwzTk%gS!InqMe{F9yTEsjLA+ z1odtOS_x&zEMqr(f$a&{1PHH9iLa49mFs-WS&*r^W z+~#@fzJ<5K5j}IHnE@ilc@mT1T9`x&_){hS88oY&YWM|TyZmVcd4uLch5LkH*Biex#z7 zRgl@^+$h;?!?_o|9K0=|Cbyd3_x8Ny^!^=m+t;%abGWwvRwjxlifE}uJY87LOVEE; zblJ4F>iN_gCqj^BsUvfxo}&)S!F%duz{F8dgRwpJnJyioPZ!NImQ8ZBjs##ItCBlm z=eUAWnrrLrb9!meap=%$eHlu>EL3G_!AGa0N~Pnr>*M8xZYD51H=KeBpN zAJ=^iK~<>B_PEd63fI!;ak;Ul)~5%S-g&KIQe9M?S^iI{t^++DMJ-=D{e`(u4#B=hqElW3-6^jvZ2-m4J~?n2K6G&kh!-{Y zfH~~jk3qEgh;3Y}WM*Xo@tHV7_Oo3#OzF|NS!E@dr8{^y-=J?AR>lx88=s0@RQ6gD zyj!3w(b(%Iy2|XSN{A!J+jVuSGQClh%CV$2S56{(63uBZKCmR3Lu1$`acISSup8U4 zgarg6S|2uhiWHVtfGdlL@ApVe8Q9`7I$T%->)9BDu84}vIA|4MoJJ#N(_`n4IT%S> zl2h_Tri`GQ~qFt zKb1~AbKAd8g&0EWaCR;Yi2vQk#nR)ZJ1C*Mi*w0+)sY7CgWeCl(d2)QD9j@zHe}}{ zL1yimtgEB4^C9(p1fA@ zoh5=2{%Rdtr?#s8F3b~7X=Y%!>|B}t>#>+lf^BY zb#fP0Zb*zXG*36&L_YsF<+hw7fvSLaQr zNG+}@oJTdY!av`~Nh!bdgyGeMDSo|xjcTTOhSaoA>Dn$39X@;eKpl#VVW3k-TwSz2 z{a}v8DQP`>Hui3Fz?%&1d1akCOM|<~88gA@?2L(Jufoe`Z%1eLx-=fX2}xqIhFDMj z(jOVD(-?+^r@^>gKJ9W@VUw$iq7Nd4+L2K?Ty<6;UN*FekeR<}aHmY54$dC%T=E(4 zoN4S*K4<{9dbfNl2%1NH{57NBihf!m9kZu>T$b)OE!pH?SXWt%l`zMY?tqIBZq4Sz zLdW&pRUR2K7hHqs;ZEs6aUsPAZg0b)+4m_3JFHr1=dzuHmpS>lHJ;OVIzsr|!_#-Ck8{oi2kRzT80__e zQPZn!TQ|)MT542PV1+f~`HapgSipmh6!?J06$pb_IV6F|3VG7CeHuN$G7 zU_-Zj8_>%1$G*5)Qu%<#po6)+AZpW`LGi-NQ0384tBm47B@TmgQW;!+ za1X2%2J)J9jIeg>jqW$9ML-?K0~TmmWyI_SY)@sC6Lb^>NQW6J;sVRb&Pabq|4Cii zmnfS)>Um<8$kmEaavsP&O;(@1NHNp$JH@`T2f%$pJ9MYQI>egAegU-S*+&reO?a`)W(Y%zNxg5 zhofSA+5rYW=Jw~N3xvAu1qRvD3os+i!U_of2Ly8B)%s0p8uHxexcTlg%eK9y9|PMj zw|-7sMU&?|<%J0bx2OqL@YdpKuV`p;-vaG1c~_pn6&1YPu=+uC)KGgEb|*sm|>km74o?T=XpCJ$?zYTxD`ZJBR<=i!>@!S!1*y99sEgg<8{`a`IV@1#AQF+K3EP_ zTyEjvoG~9{A#pw|{ea!pUl&?Zv+$PXoB?^$I93B%&nB$T8@LU2aj_vZ9^lw>BiEFO zR%%~}>MYGL;dhnk`malqv(fE$xy&XeOR^ai3k;}n=o6T-s9x3SMS7VB=h-E5Y zc%>p=@S;9Dlq7KX;QfyrPKErvHp{WHlp4Gcn${<%0|DTl$DCGbE8}umWiGEtQ|Vpj zvY||>Cig+}yo))_mV|8&F7Pzq9^@fQIv=O9&wEaPE!~_CSj-OQ&b3K5U6VTNY{51K zSN<>J-aH`5wEG`!rg?IjGG}tyTxX`z$}Q8}m1&w5_sYy&N;5-5GQ%C1vMe*TGPT@j zQ%eP00Cz}DNlhtHP*DgSB|+Q}Q4n}o8;uI8woG#QMe(XgRV6i!p3-PET!Pyb_NkYm3 zs^sX<^bpfFqbZex&I?9VI@qIMOh<(?tRD3EmG6eBB~^Zk-;BvN4fmr9Y6wP;X#I21 zkC;Wj2+b}vIp7KmUO<6Rg%g|I)s;P@tbJeBviw3{JyZ}7fGLLqZu8ZMVjkVFH{@Y( zAEF>D0v`5#UhjZsV<`WQ!J3S`lc04ZWdaJF^L?*qKYRwp`;CfnXPxG10j*m~Utyh} zHSNID^M<&m#uS(kR#ot!V4rQ{S066cee+jz-9GZIdiusyl$Or^&6n zR1tN2bRO~qNd$tRw>EFTXDlttc&p>C$qv6)?1_FG)-<3qaxeX*haDUOGSC< zmt#GAz!YixVeE%THoocs2e2 zH+oUNW{~y%dZw;0{7NxNI7#kd1tJEAD&02xtk3b1gfevaAeq4+S*6d(3jVC^S4=M;Ws z)9#MD4Rolcf9wa9fl}VsMSIQcfE$2J-Fhp1aP5?Vt?q=K@#L?)Z(rdWXI?oCg(Jv+ zKHk;^xo6ZZFk@#gjXXtKw5KJLICb!7w6PbhU?|Q!kPNXs;htP->}N--hICir>p6L{ zRJ-=R;N@~&q({Q%1C(G)sLX2Dm1#aDGj=4}r7GGN`eK}nuAPpPyE0v2;u<4M#;#3= zRCz76(|}K}3HbDu+Ol!NlLb424w`(TUL-evLGuECgp6b(E; zf(JM+CI=;|$e``j-yzHwv5puIOB)pL+yt;CR)Thwwml$;9q+NIR|=wglbi0x+u9n~}uzGzWkP?#DXu;3V(PhFZR_Gg@Be#U9Kb=FJ{iKfc5 zOM^9BP-I7yk?>R&IISbIYScsFn||6^yIbJ>7|xU*H$>M{SfrnAabt2F<}*_gvkOk< z;dPmOMX7=UmG9`Mg@o*-3*??x@n?6*%5d%dH&G=!1a8wX&9X*@6GiCLTfbH zVw53E;AMtFF*7zmY(MrnfA(|AK23xDe7F3>5siKA^nc7XMc=h^Z?oL4-1%a1s`Mn+V< zvJ{a~NVab>E@!YlY+>=8y5LX`qPT2orZ}PFqcpqAQJTH?iT*#+lGk5kIP7(1=bbRr zH)_ZjB~APjYPQe$RPDyxQcBQ+ZLb<5ax5aRym+mRuVXYT#TKiHHj^W?(c{ST*Ia2L zqHTtlW5|eZm-TOMnYkB*jGNaTmWHIs2DaS=^&D1M4IK5`C16f#L|BusFq07tPR3z< z`*LSc4IP>{j*}c8&Wj!(dxORfBLz!KjTY4fXVrg{u=$Ipqt1N(MQC1Zd&5nS{20VQ^y1z&|E!w3H%2%v#+0bGYRw(xtvkz43$%oVNu zMO5$cCZ=W3pu1Te_clIAt!hCM9(_a6rV`qGLT-Sgk;Im<;Zh=aIPov#s2TpT0~uU7 zOu#v$upX-iCv6=ZMW%7J++R({I7Z7u-#i%k~?D5Mo_f}VJR*pmeo~sw&9p=%bJQNLGpV=Aqa0vlGDcJ)S@ZwIApH1;`0#&CMi1Tm zh5`(A4}jFyn{oy7{GLQF<=tYgq^qwScmK{MXMdItGWXMY?GpN)@20V1?p9{b?a->3 z=SR7Xp;YCJ8ZY21GMCfFZAmX#YK!l!m;D>e`RfWY5E}#1lZNIYCw|T{!R4b zHDS-Y|7nN%ybkK8#zS&)aqcHer?+K#pHv@84>;cN>HTCC2bYdCC+Oh&@*Iv;NZ(Qx zCefI0RrW3kUz`76vLjQHj33noRl;Wj7VFuI-%$2p8`MUl|3aqjTPJ`Pl8*q%bh}ae zRe-@d0IRS*{PtShv7ZV|InKoC;cQi0@1CZMh2e^i@t%bWrsBH`+aaL<1eWqVhPM#~ zfMY4%C*psox01CkdvSL5fb8WcR7v2K;MzZj&8lZ!d`TZqUY~u`Lg+is-n1CXnQ<8= zCtct~PD+m2`d}hLlaVbu3k=(KE6xaZ2mayxzs^q8*i}jM1}sI004<%bWX- zwA&Yv??-$>g`c~U7_Et~XR+9luNtarW%V#Puj!6>(;@iEbS7hU<8? zqHWFRUS*auR|AS4eq!GLekbOgrDIE1=hVqrXRyFF+m36JfG|lI9T@9*_i#?5APQDH z|2&l!e+*u(zq&a80~;<(u|zj$z4z%;oekQc&R-vZ6_5mZeAU|1VRd!z5z9?l2ZuM$ zc}MTrNtkkeyp}=-KX`&l97Grfs+&nlobTcXQ2}R~prrzh;9^q!l{gL^pwCH$Mf8OS zAqbyK0Y(;PY#z*L%qBE+@s&MJZ#(SqMb3;(M9(nVdQK^+>ea z7PI4>e0XJXzIN)t^kV&26hEUcp@}sz%?A_hS3221$&1Eb#dz1f|5JLVpZsI9aWv=D`%9)t8@H~6`9@6pNxF?UY__Ct zUSDG*+X~25wuZp#VzDkbT052b_Pu=a;V6^@&N(}i%dc;L{2FWQ&z2A*-J7-qd>?BDMeRbJfhZ6#>-lC$gD;_+He)4Rn(~Eb=YP82XF* z+&qB*rXaq|(buheD=GN(xgVkyd%sJkMT~hu6Uv@&rI1}!NINBRWQs-Bj{iZh<05-$ zMBmvOR3(bLK1}O|n`Ct9Oh(`}XB+yruI-a$X(wm%9FCYERi~R1+8yJwzM;&~7fKzY zlg14;B5hq~p-9yk{g#5P`oK7u1d#X2H64A=avQkGHr~_atn+B9yHFDeP6&YetZ~*~ z03M#1);$ef8uys;+E16Sh#VY>=fsyo$1TmOhd-&o_bqzybJ=zmyVN2c9~TA0|CH~$ z>#-(Hvn#LMgZ`^8F@Gp=Ojrh&WxWvQmb*7jVhuqfmSSOs;7q`6zJq2&l=wJgDYx#L zuDMf0qe_U^hIndHHW6t>=9ZVE<(F{vTV5<{q=Q+J2C6&HWpu@&CoEH2r2=ZO6E?=a4U10K7omW0)%X}p4G!iwnC zyuuEFKqy?HmsOVcv3r*=g{|F@2Q%o72?e}i*A2aV!8xCtkBKrpI-OizWqix~NgIoy z&`a6msD(AQOrd8jYszqrgDS0Lx1T(H=@x zB~65IWd*R^^0IL7_Hh@AiMGgbml>%)o?}`bV*_qd8~$kO#6(;(oL5w$()&A0!)aIQ z*0&zgOc(sxYvCj;Bf8@vSX#pHSS_IP!h~U#OQ}*zWvaB*=Srx7zK}+^&2}HZky$~$ z?+66+VL@IVS^eR-ZBQZ!m1RQ}oMP$v`knabRf6Vm@D4$_xxX$T8PY_9VVY`chd*f8SW=9?_#R&T@~~l7&1+P7 zY2{&%1LR)*vjPNZBzayR;gaJ#=1E-f!LdYACn0uH3Sr3oZQy)?Z*I2uLL2l`L0gJX z&tS2*aC~LtB9OE@Di)bc%fdFF#HZ!5&N3pt8!v$!?AK8*6<8SArtKPs?J@xs7Piw` z;_vaW!@F~4qI!4Q1Qz$Q%Xr7_C{Ugg3It9|a7Cn-#LTc-mI+A?MiGA4sc<<R$imwma3YKrHqu*=@y8%8M7c%|patey>#gE>* zlqJyZ!So#-%Tx>$tl9JL{9byad_%!+gj@?49FHl4;DktLhd@!xdY`G;0=;VQ0YdTB49T z<$ZSX80-zVc0G5+*#KjZv}y8JM~^&5fg8)Qn!8xMzP>+iW}^AYH4YH0Mh*sgu@s$M zPJ*CSbJtLhQ4$%Qi1MV3@7dDVBQ_5tQkxg8?0I#5Wy<#zGdCvdJW^Fvk;jEmHWk_V zp_5hO#{n5d%jeI944(0KmEO7ZBKXXc8knufrp)vO6kUY$C$i1cJzuiUX#NWSjJ92j zi)nyP1#TN*d%0}#r?{!HQdw>9j$#%&?%sEE6e8Ls-IQiGDAwZ%&hNOf_v6oQh5H#LxaXT(f^*g4^~`LfFdyk?Ii%n#1NE#w=% zC6w-&0E&|r6CC4wTnRn+}3wsCRqB+!75Z<6VUc&PKEYiQ!7y-xPKd?*Z zNY)!B1ib{fCQzLEqVlCSFYPK2|ci$VEOt}oV?`Rlkpp8DYe5S=ZCzT+-T)G~cTd1ROs z<~!5k*Y2s}zMue@oWA4%Gn*tByNYUbB|&*Gfk&vl8)VpBR_}}PVY1WnW^(4E>oQ?* z0Fj|x(kpZeTG%oKecjXR053Oy;ct;&peUAI))j#hDUx*y{m1t%9T};l7ChKHVf34! zCAQ3c)Z#B^_;Y%Q@-d|)V zvc~EQ(Gm9CXYpp<+WVdqb>HhB3Q6j{+AqYj@08H1##ogmECGK2d~0%0aenLzK4iy` zho8&)A?dq?mCLC~w@Ba=$3em_+K3&_^DK>ijZC6V5+Z$!A}?Ll$?j2xp}lk2i%30t zy#PTWjZ+I|EqXo6pBV6ftN5%KcIWhajp$bs8VK5!m+LL|3zeOX{lS4YiZmIaKA;4A zSXwsD=heE96=~x{u|1&4Notu6IB&2cOm{*MD6Dppg_Q`)?cMr#G}4QBe|mi{&AF;H z7Bkb(sA^8kD92{?-q(^U#@GWyRt@)zg}5reEbUI z3@Pwo9moo}pY36bDGPbTfL?Xj7WC`Z7rpUA4qi1yhz2J?-_Du&HogOnA)~$Qu z<@o!Nv-3l^t^>#mB>#rSa_OR_9R1XnSuQL;r8FGRVN}%hmD_O!Y*t0 zISYoi=jGx$a>;n=-1Tf|C4<%>_VNwYkmT~;*Svl@naJmZ4hSB%|T~iIC@r?{I`?Xv7rtBjL-LkTaiuC$< z@yuoSqIt&fKa+ga4Ys3q^iAx5dhi`xt^$5$Z9&{Y@A5UjEZEiZ;bdA&{1JBa?!liL z-oa~+?91|!8&jTKZrF8~J_=S#%ThVgi|C4&3MI!GsG9GwbRvp(IjQ7$WD0fFEY2y6 z*aMdY{yx-RQxl|@kFmWDU5K5gCQ|+swNFN(Un;XRj-87+(O`hgInd*=zb1aS!zq?! zN7@w#WiRz*9nNRb>$Q<8%jKN0<^=#N`g0|DfL+Qd5@LVsDuvmY;NzzWZIiumr=`Z3 z?L_lJi#E!t6wJlkBJcNO_AXFfC3-(f>BlEc9f7=%y>RBC{E$EaG$@Ns)T1_4 zaXJNb0=qvX6cV$%@O*R*A|)AuMLlQO}EesaZ_Q z(`Xk_6sl1tvgxj@s6H`z*qK_DsO2OIWqtJZLU1Nn6<+7I%`~JRqu`>7d1tXoN0zd- zupCAx$Xu582cM>2?Xb~96bmfbJy-KEg=&+ES7@&Rcu}w=<9p~l;&D`7=J;*Vqp<|U z2=uP}V!Vq@wyU%VGJM$&HyokTt7y0y?o55g_OQEtItuckKA>3t=RuU7_# zerFO0M(=Auj1Q$jazk0=e)dHw`a|}Z9V9NrFxjG}=Gg=)fgSaWQRvFZpT5`pkDG2t z7wn_H2upAmKxF>F@v_1LSdYmDKB03NlLY|#AIu?qq)2hBOYx3iSim`W7uiYTfkIjw zwPitA*tdfO*dwxL?s$Du6Ir@^Kd`K(?M-j}qjZlGyNaN!DXs3Yx8bICoJB%Gjs%Lv zS};l~E2RMd_>Fb;Xu}}F%FWS$UInlKJjU3WJI5diyJ{rY>drdY4<-}r z&#{hg4-Mrkk`Qjp$miEKmx-sJHWkyWW^DMKL%wIw^-ZUl))f(JdqUPXp!oBr@dBX; z3ba4^S7`Ke`rf2ukB*;?Tp)ATc~7=KHEek2zF{mkq8`XwPcC=&Ey(!wMM+y+Ep2aU z%AUa4z1N#w;zrYYHy@Yr`{oSP^f4vwWGI-|X|p{&gzPTp>WBA~QXA`a>GFae+rZnC z23~p?1AzzDq^#jtw>ch)BlwGJ&%)o*A%k|pil}?` zgZv~bk6m6ONJ9K?O>IXSUzSVlAiJ^-k~i;$6@!67yZS6NW4+M;_P z@6fW{$x9ic_kejM+v}InVL<@rgme*K6M4O448wEC%N7>uN_}RICTU}N$E(~X=Qz8| z?n;))WxA=TK%PriSelm)>$0`}CV{0<1FY`%qMmDLPv+r*bJ*ROb5<%F4#==qrZ)7> z7*Hv%3yV?c?es%=>5zo?rOp|S)G9}e-AE{`s|a!Sr3^Pd;5Gptt}&aYwZnFzdb(U` zla*41dl%%)0d##h%i@|VG+nv8B7k{TlA)ktDoz7lH3o|4suY^*)STIjCDklw;W43* zf=MZ{=E-Y9zOQ}1*qO$B6^(raNP+S(gT7b?+wL)}Gf@#B?-!bQ-2VXq`(<*upM!v}MWXU9DLG`@4G z!HQ-)pBM4{221CxdKF9_e9_6$gFb$M!`!e{z{E0$-^PsR6Ki|sl^mM9b+%;Kd^8xS+_dx(?ziVR%SvYK3KC9 zWxV;3Iq?ZDy7#g<82QG)8kLEBFrBw>yfzpd-Pcd1Jd8T{K&WZ48uJSZlD}&5>=8-p z3TkRDOqITU;Oqb7=Ped(lK}+{t%rK&p{(q7V6X5Q5l7YQP@Lr_MQ<*;iieHGCCA2> z%=UvuaMwU*r!J!p6K;)0yG~FJU%R83W&p)A8i2p&_6JZ`fe2u&o5k9JtCm`lEx!vp{fQmM-tb&XyzfLYtSL#qZn zgu5S#%pkUq0#TuQQnY94?yRV~?PK(v-gmz0mp)Yd9KZnxnGYStr8^w<-09rWWsI4b zRKOp#6L0uPlNlsWD~CY^ejt*C&BBnHFDgoR;aMz!Cj6*QLSFEBPe~lz=QzUtVRU{L zXh_m8A3Tey7ZMjOfqbf91z8k5up4mSmm^E5%?mqgYF?+5WADA!P_OdtyJEa&?Dr8? z@AverN#ox!!^DU(>cF)o7KkYc)=Idm-ttU?I+_n zAvS19B-~%ZkPpt)y+)RZw*5&j5n2_TgVqezRae8{e!NTCRJ4i^amc=j{P;cRwAWDJ zCW$f)_G(hg+w89_&RPMPaahIqt5KF`w4Q2ne%c=K9n_LD7u3YvaG>EGesg+}rTduX z^SRxPW10Nih(&(VMnr4gqq(s@ywe6R`jL#uH^2E(uYCBqF0SxV1Nxx7=6g+7UB$L5 zuW^%$su2;siz6@JFBDre{S0m7Y8ivI4?f1Ve#XDj3vtk1IObvW-mvN+Xl)bOC2 zb&6O(AUL8c-)n{gp}%S-`)p<)DAUSL|^ihc|~@hrfr`0%1y zQM|t35e}@eDKFc(k6(@xH6ICDsBHvHts+kN0Ne*T7EITI*2@}`VG(x6m!tbf6S(Ik#_8vlrR-Wv@BxLv<=JV&%5yH%<{6Ut(aNH+8W_v{dS)$$aujiHA{g_fSvt zP;?&2I@Rm-1$)T*aGM?el9~0!O~z4$v%&=>WW=v&B5V#h#fxSXe8i*^oq=zZkP6e9aM71x@^8=tG2GJ zm9$=oO!|k&DdO#k9n<5w7o$rYe)`~^K%60U5DNOhvQ2^@zzd)SA;+GM9B8{JS#)J_lr)K*z=JecNQN+cAszidSz6A2-mV?nQ?nB4fh` zC9d+jNaPqadt>{^&NfFh+NMq=J2NZLC7%2 zF)Jg}3z69bqp8PGndj%2%~&6!8pz;h;;c^^!gdr>Rl<6#d^AWQK1e|#mpscP=d zsd(iLPPpax=k44c-2?KcL=~GwYgW+O$U0-yL?3vSTK}ROjvM`2(b=#-j21X?)|K58 z%QdKzbkaKcUpB>Bq3$Y7Zk=~}oOAuW9-sd$mHAKR z_;CKKH$eXm`1gXZEHYx(lAUX*N7jXZud6%)oDYx(R2Kf1-!0x2;T?7^YUiLRUnh-`^aNi!R{*4cb2a>E zd4}Zsocx4Ki^wt~avtxhHeTPYV7WQdyM8&S5AQcrHDv)av)mz>rOtL52vbfp7jqQKy* z;Jr+N`J_Yg)|IEOlpv%IPg59aIFs%wy8lV#J$#Mu*n`b8`lwMy?nd`mC#(5)CCQkT zj>gunlaqN=4;7xX9lSRRQUYX=YRSObJOVtJJK_|3or}h-=AV{)AAC|N`vpi}gOx!@ zRJX0y*X>R?CZrd+83@qjq1vQ&J(fdb-fZo>iJzO*9)ICw-_tiZ2P;ixUj7j=x8g{9 zUEtl`_DQ;B`?^y=Rro3!Yuh1#$f^oHU8C_gKK~VLow?#uW{;(lmaYAkrS#&x_~*IV z+O8_M#w7ISKe?agubqlXZXTHXDaz$*gMRzR4%h@==H&vKwy_s$N6}TiQWkn_&s=yd zNNsaTTIRws3to=9AD{sDS2s|J1cTvxp( zA5(s`D1Rxg0$&E&@?-jix!AMmV7kIUN5y-6S-NDht{-qsX-!UAg<>s}a+O~>*h35^ z{`3i^rnZh8_E7X{?rmtOM30rX&`lf zCpBiO27J;*kX@N`$%f7NA`YaWCjXT8445xsQsBA?rR^`dKcdeZw|AUfO+>i6IHJEP-?Bm9{jM|m zO@61O^~xtp?VsEp29>h>%k_OOZHOFX0A2p#CL=YlF$ksQ6qUQ^+Er@e<*7U}`=yvp z8;#o&erY2rYkmVpb1{G$C2fT)?p7(k?g^l1MvqI80_%X(tVy+NW`$$75MO<60KjM~ zL*`9AFtRa>qIR;&X!z(JX8JPnH?A)}w!o(e<=ojReKt>W5tN&NMDZ4ep#DfB`=K7b z{3xnm=!2w~<+;xwfKnWvtG+THM-_SDxACbjnsAHIWP;)6+rU2TGkWrHv}dpn-TSD{ zj0W{o7%!&Yzjx+hWP=V}5;Au?(meWJwub`1TmU0<-5=wtx%{)`?&xny_x?fH{A)4jTh;OPMfBx)2yxH- zu+_kBe9KXBl&{xw0#g-hz9xbo&KS#IO zLw!zA9xnxLDP}PnGct95Ft-1G(UlPi@Ush%9j^UQeyXgjBI5unAFE%UlGP?ljyi1X zr6=0fQ|Vj&WKK(E;5XfHB6P*DvfTR;xu+Z18>^UXI!YoF1+vL_ zbG;rSHuM9;e{bsOqrnexsyfi6X(Ncv66wSp3sXXX}PuL&dNfc1*qKncVr zNm|c;f`ju&`k<$(*A$QQwiq%q-0RtC>jyg2Zh2+~gWNupulQ-rnrO8SMfY!b$C7|a zg%x_|cFpMX5Mvp#$qX?h|CRFTVY>B}id*Nl3!LXHoAg}p1;?2;#|3Rb=d|8KnuW9e zwT!Yr=S#>l{u09QM`9$4^m5#-M!$e^!5(_4fd_Fx?Rp*IM=F3h#;I~tAEn2H*jJ6) z01qb+J7cg21la82zf+bz@Xj2^0~*%n-P-AOS5;LaYZD)M1^0{RaPmJ{8c}}C?46lM zejuSB82WaWUhqyMq_?j_1$%7^>ffrqV%Ma$9bQ-O!K3Q=)KoD7Rx`y+Pq=e zowS46PfD};w{o8^P=}{#^+NPO-=5{c<&nm+IdcS1gmUnkSZRe-{6~4mg~(aiZZYX57|OcJ|0J1 zczFfu)pV&_`tr=^yOS)^BfNS{Md2}_#Eu9ZZHYctW5nvo7R-*W1m7Af$nHPu9vIPT z;h7n$A?RdLYgguC(pc*>!-2xQYi@|Q53br_3ni0r`RzBIHVf~l5~T*B?aZ?C^{`1B z&)|f5RR7}~W3NJxoD7lo&iGMJlnT6ud2jS`*DzhqK%+Kbf4x+&wZhN6yN77}|I)Pg zT~v%iw8@4OM(`dIiMF{ff6KgBWP=WU$$)QDPPziyOh%oiEdQIS6X6M{upx!qFFB{yAs_|#f! zsu1Ot?i!!}PdkiFfO5RQ@|*)x z-N+Z`TrFq|ON5grwEf3s7UP@x^g~#g+5L@1MS?d^nAJz*g(b_rHZvw7d4Hee5-Uqs zUCNC=Thiazqp&KL?}<;IL1J+BSZU#3JBdHc#8p6I6q z_nST%BAC17NDKH^#Wsr}f=BH`<~ltC`1Tvhs{P{eb+mq=*JK?d1Za~36hW;!Z@mf_*(Rvgy`+I2DASPtYL4nYX;fJr zcOT);xmagtZJ@o*6=kToH{;KwD*E*?WYTq(6zb6~Fb&|8`2t-Iy=kN)gU!FjP|Ge* zMHgjduM0mujjh+lqQ43Zm?*sx7Q&v7T=lX1eDLAY+VUjs$|hgMZ%xvpza5btyYi?{2P;VV`Z!?qcyX@yWl@@Ia8Z$!Chm63tk>GdzZxz&4^`)ex#vK(*f zI(@l*!gX5pJ0^pUfRY1g(wE^0-=Pg3ML63i-^AMHGO8zaUW^r%O#0SybE78&llJ=-sBj4cvb zrHImk_d)JK1u?!nqqdQYtgyM+(kluVpl^4!*+|dQr91p8RoT;8RKVD76@IX3ztB;( zN8(uV;9r`ecgsfadkg-8Dxfyt7+|AUXaTKxSi1z0+oGD-U(L68Tk2_it$74!4MaiQ z6+>Fq@3n2BzEgKzJR?^N`~y+xR*5PI_n>6%_5Hf(U#>{IGi^;&hLeHDK@NZwJkaTl zmU{Zx#cE()JpkEn8ZcZ%F=AcIb?vM#$E94>gi<9t0bwg6Z&&v=fT|0a9ob@Azzwne z3o=_V*BgcH0{WgLfV|gzF#EUuL2yJRSuxc7E|as^qNBG|gpV37i~l14K*xafStBzi zXOsTb%;@7$_m$V`t(h6thwa1=nyP;O(v9XecgOtgycAJ8&~EZ!j6&;)$MmY-$v$l%^m&UT|9q}|cYyoffnQgM8&-p5B zR_XOukF9I=e}~lt8aFMx{pF#oeYHcJz|fvq{}%TC3kF5}&3WV+g89F+a{9QwA3vHK1+AIr>eendf!_&0p!fdOC>W>zcQDqy&2YUW zsjhK9G4uC^g7>VD2O%($zHU@l_G2c05U-jOh=dK~pupb)?}g6OFtNYYPL6xs^a9O{ z4-!7V!l2@p#Fz%d#t6=>LBfdBDoOtd8U9~MYPO4^JYOqdW!!Fvcm=>_o{zXq2&>*z zS+G1Xi^GPd_-=CQmRruiVeZXqZM-KIN*wePKR>s;=}fbuEFxW|6L?+top+S(IV>z7 zOC2yjNbYc(MoppW)b<54`)9qSX ztZ8}HLAdsWpvaC>3Gr0lFtz|7afH|$TNevMyntlQeY@jgN?ck`orQnBa`X!O-bPgA z6oG6^i|vGPTXzI#;_PHCvoyuvT+&T)3`S|douvhk^gEEJ*H|I@|B4k(-Qbu*j7=S9 zHTO1qsw=`a#)-daICAy;;RnWgE1v4>GNn|JDkJ2~iHC%kPeAv}J*Mzl2m0?#osCIi zr_4?CiYBp+cEbiy`|ov+ z?RKbtm8U+@D^(eH$;O-H*uyHaKUuCsNMDkj;wCdUQoFX-7~o_4>;W~^y;XFkLXN!ezFZ>h=v~HuX`S$;x@-BV!$t$rpK>iw;83!nBTwir?R7+%rr@Pv+|u4?RdVL19rnwQJ*wX}MpuKr@cQ^JcWa}>rRUJr ztWdDkNxm(=1f#=7D)2X3K{10szmS#G`-RYef5D;S{}v^WbON|%q<`yp(5SzWb;Qz3 z^6gT0L23s|&8w>eu;up*w&@Ggx=JZqtiYH~56ST^H=ee`hzYU^jPNBYxE^2cT{^a^ z#n*=Tr4#wkTjsoCu?_xRPGKBMD0@60>B#|`R@~V`QBI9j;PO@D4M95iP7q7Q$JxPQtDC#$@|Y`UetR3u^){^}hd3HzF}ASSnZ ztpF(Ue&C?h?0|#9bB1QvlJ1Ynm6un>x^Um(QS7d2$Z3};+5c!WW1u!;X+|m0J-Rd< zL(x?5l*{Ns7iU_HMWpOYRm3&hb$`?DuS^waf@bWF9Ez&m(-hZM)jRLCS8qnnQ?6iI znG}WC@etT$Hg!}99Ka=UQ(y|CT>k~mBCY$oq6eVyVv4@Q+|65imfH@kZb@Z_fFp_= z6X9`Pel4OxNu%!#u**v3CzUr5f4eoAHN*wXxPiMGHk(GyjLe`UKc&o!=_+HhKY7WO z<#<5=uqT)A9@+lC?X3%MF*c@l00*yjfm~CHiNTS+`T9MYKr>RG9b>sV%hN%@qr_z@N~IXAL~KN@n;Q7< z)io&_QK03_xRP)BJi$a;H%4kl0$R>Q7XT>MYkMWf00-uO3I6_%&vVMlb(JZCpL5hu zvq^?eOt$f|fR(iS??VTkO=wXse28%R)!21DRl!t>(H&c*XDA|D%I;>hKkELwzRG_5 zNumy#ds*)Bb!X6X_Ug0^Q}Eq}9mtRW>*}n!yuY~5B@GJqbj++S=?u`N9o1Xi(ovGH zUMOqKxm~^3bRb{eg1LPw1$Kah9cT~ob7pbM2_B1`&xbB&uEwPcU8`S-PTGc;7?l=S z{4g`waIE0y(7pu7X(1uSn`YtN7x%KD%4>W7@w_|Y@T6k}Cx-T~-TYU02)vL9iVJ60 ze-%>16lcHB9p16(et%5*$6U+OvPo>56~K=-U!>buYsLLJH)vO3OH~^>7am-RZL`Rs z(cNrA;6id5X)R_vXx9MB00zgNWNi@fe1$_MW2xj%;Pzj8X=1q$p zkgtwx?dF=bT()h`(y_unRjPrdhy2EAbe~CGjRn7JzCm|GJ6erD;nmLtrKIZ;>IN3) zAt6KiyNDu-p|uEpXti*~uGh_nTu?(d9<^tM@ObwvI_HIr1<^kU1|4iy2bB%w!3e3| zw8g>Y)$bVuN83!y!!INO zA`){Z0m+u>ePx@+ z%H@b{Wl<|nRoh9A-8F%Su+tVcWos*s`s@Hq>>R$KpvS2()E0pO7QT!*;ugA>QQcHe z+bw+5&yRRfy;U$6IKq1n-N{GP(0%?Yl3Z)Jy84+VrqQZHF_qw5Jg|YK=ykFU>8~I9 zT)rkQ(&vKJfvN-uubl(tR4UNwJ^tlakUgt>?H&+$1yx}IuxsbmTq5Mhe?4q4R|xAzY=OL3d)5EE*w;(5 zAPZnug8u)=SEcSWw1RTV?0zdad}Za8Q87mi7)@Y;Ch)h_#X%ERnNRSn zX^mD1#8p~-`Bfg;KwQ07#$+E~rQFESD&@o<*lwYR|Gk^+r(ZT~>Opa7p`7Le1Y#Qr zQel{S`SzFL_cFG#iklA^JvX{539lwa4_K&XLwhAyzoy^D_#jscWru6=Fw zuXn}a4J6V(zZUs_q_+|TeZd$V#WYWH3%ztJs`VfG`43$~D~E=HSOkUj{>IS(%*NY= z^3vI953rUodVW8*FI?x`g&%}hRvk!ALPp?1%d8qm*)ppzqrEGx^oGGIVZOQrQjedX@+%aw~8ugn+K^p{m8%CFY z9>CZb`ClFFYO(E!^^B#Oq4fN(_BnE2wImvHei?f1O+nooGxS=WIRn%l$>{%O=$SXA z5V+>PcI^akjrq&a=zlEyhE0n-j_wZoSHLRx&B~=sykvB|xT{53yLh)kc{4Obl-4A* z2XDbhlS*w{%QlG$kh8RwlIf+BR<qeKSpR>l~NR3o>voKz4J%K%nr- zbJ*%&{v`TBtQgPv!5A4BrCa5?worj_qfsp~FcP}d%w@H{c;T%aNvgShLXD$Co~s6_ z2R`mW|2fXpgp^aJlV_iVzMp*|euY_TPyLR5d5v}OInLmvmRV(-d@q-xXi5FeYIc5B zf^V=|NyUUY%_k(ph8i)@)`@(3xXF9VdX=5735>llHYRGh+P>EpASQ3aC~+SJ$pJ0oR1U|9bwt+v??t^YFJvxM&&R!*iDS6g5yH z%{58)tJdps?gOxuNnT9&!GnoZZEi?Op>E;f+2>cTT_6v=nRN!}D3zgqU`M0!qk;21 zZYvCjrR~g%UE!&#a)Na?wi6}KezpbeBFoAwZ=2}UIwa2JM10GMrE7CfST>p@F1~Cz zKl3?RX)B{`$pHzcW{Y`>u%&j^=+kBxHzS?ag?|!xerY}mz9oY^HZfb-LV#7@iMCoT z?42o4VJBE6$_+Rhm9!Ex{6_(Bu8HDdPN*nNRV5juX^eR*6}47^3TR%MJ5fWf+!2a$ z{7RRgN7p5R(MHjXke^+qw!%KFinqAay~!$ZamYPcw@JvDO>@TUw#&LWJ9L`3ncR=y z`hEV7dq5gH)9FFwl$E}&)*WN>Gt!GoHKE(2$)!Fj$rw45+rZ>72KB>J0j)8ILi%52 zY-;hEQC80iZ&P+Dy72POKZg`avcUV@w&pIgvJYH=UZuiEKMS+@kn3#1h1!K|liThi z(&^c9E8$+<%{8bg_ZERONGIa@s)ECU-8RiEwXs?<*pUfKJ=-id2g{2rZ_j7}qxgsb zWFqpcjnb-l2Fa~9Wq^cj+z}Z-GWN=o*%t!#_qd);JP?(bnVPLMh}Zxu71<`Zk~kgWb)Ge2#<(PlgSO1-rPZ*Q_f zVFFZ_TatI^$kougip3h>{Wi1nSB60#(>!#z)j>OrS=edKow!}{`>`M1TybO(9OBq1 z_)VNRYA7(9UGSyb=n=~$$tS;5(AV4HOPHn7*){=49d&K_dLjTzQ%SxJGAFa%%-$H{ zuI?=qONDqGq^VdGgLWuda}STHu#TkW=+WD^CM9$p?GaQq<>*I_%vVN z>C%)ssSVJRu@s#i+i@SRvTm`Bo1h!-z64V8Z*wcrlB8KMJNn>Ce_3E|x9wpWB2K&! zbvS2uaOK*4qYsQN0AF?Ql|^g;?X*jQUvmZBUCs!M|H}Hx8jca#{$ul3 z-EMeJ>qkX*p63r5js0@x&nG8p9K{wUY!*qU3*8mO*s@H3rV|*-I z=YW96%8atEb34?~9nd#UO}7=t9ME)C zWdnLLeNrvaoxE>l@^H+(4Y@Pla^m_8lJTl1H+*HB$o6ZE*^;qg-xiLB;&Y!z74xPl zKW>zElja|nuyi^x_he$zn~-s@d*YA3{BvnzC4mYv?i{n=2SwL5+7`4VSP1jK?X`O)i{gf;fHVQkW16l!Ry*EKb5luHNqP(3GSj#Reb{Bi82e&oO`W5x z_co64;G014JR#SXIjljB5`R!*BTg*U$a*&Ghlp}EBxAM*&Q?sU)9u;}D6h zBnUE!E5fN|u(dG!YtW@>JlQ0Xmn%^n<-bq~+!lEHF(v>093T^|bcd(cx^*b{y-VBh z%o82R%vexqNuSA&3~a{skK5a%{buRazH3$k24E97U@is8;}51++pJxq0M}wtFQ@(o zN>annJKt*G3Pm{-$JJ#oP0eO7?e$mWcn4r>t>WFpQ{?Se<~P#1CfrpwB$p)thgczi z?Hz5pG&ggDPW$!*M!}dREwzFz4r+B>R{R|4w`Qs#t6p8_Hvchw{`^vCi*A7A$?WH{ z+eytPc4F!5=Z5KT!HLm_4koT>w#2~6_A8U0R9ZY*Y_|;SpsvZqTgL_|PDKt(~;R8gt2L}UqT!X{K%A|gZxB!nG8 zNJxN$tnZajHuaqMnQxx?zVFQ7j5C^Cx$kTHZ@>SRKnk(`zz<(9xRK9(JnVXn5;c+DfJ$OdqCe-uAGH^@lRG28M(h3O??w$QDpk z-6u2j-KW667VA23={l4=9>A9)#G)R(L?Ndbb*yJnv#V^T zRfY`#Hoq9Hp<5FT8!pSFx(G=1jxR{{JzamY45;k)tZq7SxrCukTqzlU=UqVsFd2`1 z7@`uzf3EUs@>nQ(5^3hw`n*5P<*-ijp7q0}Zns{}uj%kOfu*rQQUAlTP^b!iwWP}^-asv5;Q6#t<|!UO1z7ed zgQy^3g!YGOLM81iE-7iPM&VeyM~kP93nzBfG9MtbHEZ}T_}#**!mlKDQZ4eGpdzQ5 za~jHUbSQW>#l>H*S_MS`?ZC`Hshd-iRp-P37w9r%j}zvbTKAoLHaHYe_}4J4`%7F* z_6n(CXni5B(q&bb2%-^a=_m9d%3}ftTU$$6EV~;smg~_IuenN-A52&d zLpNWg4DJX3U5lm&H0PllVF`^|?W`N%N#8HnSB_-_fN&UBy6Or#$p8?Qqi6__m(nN1 zcX@ry+0rj@>u8OGUGg=+%r`x-5%lt*@l+Z%+6wPiUGhvZgn?!rX;@&C0;P-#j*lQ1 zj|-KcIO}N`3gw+szOg8IQmQ!r90%<))ODcis0_+XbvwxSd zV!}YRqz-FQ-NkP@V`$WrQ)l$m*P;6BX`(@6g(a2LQim4JzXi_!7$DHwkjZ9@0t7!f zNyDHxbu269!M#Ef&cw*r3tZ)lv%LxThqsEd5R(@P00dcxuY^^+Ms~h8`+d1ma&E?Dr3=+y~EOuXs zz8Walk4WgW#@p*{- zp~VqIVjumUsFw@wjT0L5vMN$S0gWEVT&|iVuJ9OMZx8}Uy%=oPCEdUw*|oG(1AEmd z-TMTEsiV21u?}^JUdDn?VAOTdZLKs5qNte_NjHOxnCxlb++w|M?1yXm{BFpGCaIeW zj}i2xO}iEw3;3*H!vWTib%?d`=p|Z6jplM_$wl6l*E{TeU8TFCfQgLeLfE;icvn*u z)EZ4LTKGNfZ=IC2iVT8jpzppr?*RLkSp(TE!Qdm)ZnvPl@t#h9?D?gzIRd-Zx( zp0z?A(T61t>k-VXd;(gUxuI5~a?C1whSzYmYS^)E*U}A3L!(Q7Xh6XHI`(27Josl> zsCaJ&UYzcRDt@h1sd3<_1!iMaSG0-0A#q1Tg#0GVDyrXLD=owW@G@ZC>ec6swV!OW<@j{rR3Pz-Fog z1u)V4I_X zH_)J!gz67vNhqkZ%L#dU!X}upk#I0*ukV;D)hRfL##=(I^7yec4Z|H_HCQPU1U#6; z-A|-ofu0m)cuc5C&KC^B(7TNZznK9|0$?Oaui+T`)#9;wj6CFEAi{5-q9S2(qCEPV zRON4s_6ToOko05=m<786yHBY$_nC}WkwRb_`8^)|dd#Y5dr=WBbZLJc90)fnnqnf3RP0*rmj21_5 z4)SG?4LvTVq8TC>VFj-{q|~t%&q>FHnmHw*`hiJkX|ikMgL=rubtzSRIAt{+(MqpK zybM`qs#79Sg(*PR5m0nKxk8nAa2Mj|qd+D|?g=|RT6r7(uAUX!llGij);A;!9A$%8 zyanJG-6Fl^64A3JVEeO&ui)J)K>%ZkrX4|3a?7Y9lVBhmNyXvyO0ow5ZjL0)J3je8I3%}`RA*wfUlJ;+D)hq4QP_zSjZ=U5CO9j=2ol+BF z&cv41zLMG0GmJupTguRvbc`Bj#k^VwKTnYZE$EV@dw&(U$%?@3!47wM(4^g@ zmSrgjUJVw0Hr0R;j=e_I!J(chAl%93I6qb^F(KDk!BCtX0T^v9FeVedhdi>ZaA6_e%`6 z;qDFBI7-_mo^`Z;gO6}urJAyrFB~R?9+TFP)A<$zjnIP&+-5I~4#vw;>XJE6t^DD& z{yMTFU-Z!T?F*m0#HSKDy24bT98G zwcBocF#2GD=Q^gH2cmaKspr8SZj=lT#&^gR9L$tcB*O*aBZKyvJ7m!QKTZ+4ds@y^ zprjgzHb8E-=dWnLR6*Vs@5VaU{>Hd+uvspT=IX5mitEV3{TYizU1SE|&*q$pbs5 zd@v3zQU~9ZCyCj5Bqv4c=K*C`l4m_hve8um`OO(pN6+^9HcOX1GKfrnYq_4qi(2LW z6;^N4bz^p6;!arH*a7*@V;}R+jAu_u-v)*pyl@hfv(4J~2%9ntpdZ9zhuC%T>F$Wr zqzwrGKFYHmO93_Hyh5$V0GAX|2@fHvIH( zUXym02@?00)Ll8{MW(kdjgT@snU`4wc${9&x|pX*#Dc1kaa+qGPsKE`f63!}RsK>U zd~>x|j^Oxn=SLds^w9Gb8~<j$0(T=Hr!NZL2({u{SM9;F`ccge1G$BlHsphp2C z<$P(vTRT|?%-Dz4V^XGv#qY5_;IS=d4107y-?e|;tvchCFvl_^mXD*zxno~3D|2mI};|YrjcKC1BsP!54bUAMxz`6B_ zCiL}x3VF=e2hHU_l*HB{*Wp0_(!-!csVum6wnS<7OxHqX zA&ULCQ{~Ahq_6Lu6=nSJ(Sy|t(B*YCNHC0;mtaVlZQKY-p_=ORF%pi;dDSP2GNRX| z!8s4nAir_%y!=LA>D;!+`k#WBEXj+W0uZ7p+lPmXUk2JC#zPh0p{%gjvGthZ;R}WW%j;2ShYl4Jy zZQkM0&HKbp!_6d1GQ!qHJK5UzYzhJ?m#BF?P!V7!2UKM9OYT&CU2_z|;Poqrhk5|B zRFnp^i9$A&-K+9b>vq3Q*rQnESE3rtRi%G*`qX98v|mRGjndq5wiXM;Db|e z^|%{Q5w5o`W91^mj%xBcxRcPXdXaPr8|F>gxdyRFKUog)@!;rV&{=xXKYz*sKuVwu z=!-l3!Ij0*X=?GlnjWAHau5F-2ACMzQk%?1W?MCFE4`=IP&*1+-q1BRrQ{4pNK4lHii4?lblVD1YfL1by3p z@w`8veB@6cG!!c z;S;#8NTE%ZZ4mG4(EBZdK{SEwiaV0fLd&%i%h+EXYhYWd?R4dWY z8Lv<21hKl)uPz%JGc9NS<-tnf|Ij?SOoA;*fjj=LK_8h?Wj>9l#VXCc?;qK6gmM+3 z7RN1DisT-vb2SivhTdN~77#34F7%JT5+$qZ`jF%fKA4fW(-gGmrG371HY|ee*pGgH zP28gJ*%^e-#NwRcpe?*og3O$`N14+Ner9!mX3eZNdRE1#-s@4Vy*VWo8;sXY4_HJ$ zJh##IC-*)q%CBM%P}8K>n+YK5I_1gge@i97nILp;`nmc+QvNajasPz_%0ZY|lrg)2 z1=#0aW59_+R4k2M?_8DZ>6%*>bLdngEJl?w1Y!OH=G%1*^yavOz=KNvce=v`ow1PBffMn=ZC~1-NPGWQ z;4d!dZe-Eoq6rA3Urn)CH?TL#timWIkx0CpBp!~t5bl4H6cPdTM)P_EsC9TYUa*W> z+EbzwTDeRT&2rHc{K4zdd&(h!&hY#eS*Av9&wTN-LBzI^oaDVt6QAS_Xq89%j0yKb zL5WR^4oy>ZjT0@}bWD<{#j`{3vRN)nfxX|r$&RVi5TE;>9fVW>SfWQY!>EGHhqt*( zhX^8cNVK@i=YhZ2nb(`HArCEZ+9!%ZtD24u@kFp2@OIWkKbA@pQ^K;qg*I6o+)>iq zk;<$-;-f@BYn3=v7u9eGTvdVwe)o(1a`d<=&BuPUc(?Rg03)nuLcK|crvPROIRyNr zAge)Lnh5;KfdE|A1!XGy>3F+dMLEIagS zMSB*7^^61op-Xz*xx_FlVLCPpZp)fry^W)MYdZRf<~16QB${v-v`%uE6-!W+PSvn4 zWR5?mB7h19t9+tWzSb05OSEkz@0G&f?fY!w(4uEJ)%+O$C+7ZJIY8CBg#5yR$0=B` ziqGFE;lgPu*o;8QW5ROiO>-ZZ<8!5+865dcgAby`B_-H+rMEGq_Rc7jP7)YRbas(A3K;9_@6e>T$xEvN*)HDf-yGOb} z`ukt?lyuy3em0&l#mC>w<>UIB%aw{uBz4x)<}5Zx#_Z<}(&9C$SfQ)&Gieo5nSP&g z;jub*ds4AEwl`Cj?e-a?8@nAtluv^Qo(89lCg(9vo!v}5Ge6fc{8NVF(ET|Lf*I@E zOY_A3Cxc&sbY2z9I+d7f9pU|_WWVa2%d?~@0&Szj+I#tFRdyL9eEdVn*DN-bE9FPcQuaqVX|bLE!U10jbkNFuFelJqu0nmM z(~P(gIrcrcff-$|F8L$1=BtzeT{pL+fb`(mq*xTDicvS0aHKRb-x)T|9jA0%nN%O- z&;z zfA`8Gmob60_OQM<3Mjx2$-vA^+S>OZDPQti0eeU-Ocx|GX70Ay9-AyRUdZ#VB3y?def0!iUx@}%4!bNT#mi6)AfEQ+;1Q3^l6i? zJbtS-!Tc4Mw+Fk$K5NQwqyN+Lrk|SjMYHCH906EaT14k2?a**PxJDLAL#IwbW%Px- z&oXAbc8|0CjWEaw^S9}c10Hug49>=#0Cjcf+jiLa-pjQ<%G#mzz5B$;Roo-MvXeTD z2EHv-O^LB|js4uN!)x)r?F%>es=QG!sv_LZu~r#fD$y%3#r<~Sd(Yi^xZh3>ep{Ny zUMWR-1-IyxfgmT7@oj0!tg)WapsfX<-q$<+BCN$Z-q9l6ziIuwH_N}E&JXW+&n`3L z=RyVNr}BYIKr@br-d|a@(#RZOI;VMODOlTI^%NsFf9cFDj3jVO6c-@^&mgn9X^0R9#ApUKID&KQsmKH@idUG07A1C~_+Ami@W^Y=GiowRnv7 z)n>;2-j)K0FbxLmvfGyjYQeO z+VS(`?;&NOB8B6}8^X~?jFX7CEg)nc&u1;6Js9L(xi7l#DUr(T5o6;Q+{eo*lFfgooTsdhMgA50CpX-K>_B;vWPZKNufwt8&nkTK z(HM5ouvWPqsFWOBU^myGuU)#8mj@}wvO6{vy5DD6i_kAvwX#utzyL@7fRjovuAybsv=ww?xzxR>5@rn%o3MhSvxXL<~6j%EH^viYz~G` z?XGK1%$JciKB)W>;7B>+de7dzzXEXT`yLNl%8&mOzEE$e{6!#d5EwTX1NL76G8OWU zca_kW#@gDOt80Y%oyx6rQ;keRZ*D*RJ+5SzvanCuX!VUUr%k&2FG&uCUqJ^kR~yT! zV=BVOC%o+02isfkjaAnoA?^OeVc@BZ!)A2@E#yu9?KE>%BC*j7b8l<^R3f-u*C*-= zK&9=ZX!cHXnEk)G{W?*GU2j&Jvm@pNqfPIp42Vvd_F644-~}-PZpMN*og$BgefaO$ z2Z>~2WTJ+hgJ%{bv&U2$`R>WAE?L0vZ--X^ny8z2s(8(>p(QF6&)B<5%1i zRHpQH^^EWI$HhUK_qWX2|8k2V+stOwSa~_rZ&774-WBEL!ap|#%{XEgUc9i?3zutw zoE8|!0?S+w5({E++NN93Ko)ea1ub(yuU@bu7Hp>lYjMFapVkW&poj(VWdUwl0N55F z#RU*`0k2*_=%@991)s!%7iPilwBTu5@GbuT(T&@Aa4|tc{;T+E=xj=^S7B5ctYF8w zJ3sx``HDTR1ySF=ZOjiKCo?{ddNZopLd>tqMSLLHLD5L{iE%^QRD=(&CC|6!`MB?h zkWS{m7J$D76bG(VLkG4IyT3%-JcJhTYNy55qBFY7*6`eJAp6NfLxa8ptT*|uyjCgx zB7L4^OSc<5s%6MM;3}LL0=?|gKp|Ns7kzB8%!>ZGf{rsi04E$FoF??KOtX$a`sY9N z8=iWh=!%h7Pu7WxUoXqV*5XaWTz!pPMgr`N1fWm$nsGN5q*pzPK@$z1f)MBZc%`C{ zuXw4;H1;eMgJ^w&Wj@BO<|-^Hc|AbFwNB(QoaB8<2<8qL+?ve<&ezjCI${y$5F7tPRC3{_%i7FktP7}ghTVG=}jl@69Y*uXT;w1#98e-m|FsmrX?Pv6n$rIxTZ7Waq zHxTg22Yo!(wC_4c2t(;r3dj}^U!n8NFL%a$y%eR>qI>)2?PpFSOBG4158!N+c%vmJ z=`o1)6skKv`_om?Pc-g+eBHU3ME6jz%7g}XCw&}o7@HdGIdAZCp+gqlKFrnc*V!vQ z3<=V#oBFN%Oa#R>kq#@kkRPC)Mf-jh-FhjJL+!SPVk`F>Z=DIJSTuntQ|cR{`xJzx z%|>LDiB)*zwo?m;TrQ-D>#g$4pn)(!nm46*!>nRlaCR566JC^DIMy%`dMvJOsI#;= z2jAMk)kdSWTt#p!X&+Sfja`D{!XbBZ863%*L z)o{RFb?zEp%b^m>JC0}I_OsM}af?I4`*?5mDCG(+phoU?gyhlo*L>GG)Ot)!0tJ&| zT3xTm>~B+UQy76yh$4?Nf6c|M7Fb|$t5-FoxLzG@C;0UBGaetF$iR|l8&Zm%l`(Os z)KaFJ=4H*cu^K((3ln}0nyL}+&%kLWc(?1$o{C4#uPcOoH{8izd#jaGkL-r`K15|L zYm2X~aT5kQlS+2vD@Z2%U`T!af~u_L{f z`@cpl(P&&beRGF*?qnrKb{`3%4sUVOx!^0N|70886DmKn!zaK}4*S!7-1q?}-Ck0*gt6in?Ci1G?OH<2F8Hb!|S0BDgwZx4%ndypUH7Z+S) zzR5sb+Unho+geTLbKX@)U9 z=+rW1(U^>D%w8o22_P5is=6(HW=uw7L-hB3m&ZRFA}@?Bs~!m;srD?#q2BMFn zakF_lwrkh%)QwPC>IVb8*8E=nYLK2QJDY=W@i^nd^9b+j#jl6B@0iYh=;FbeD8g** zhTd0YWw7ylBdNGKas2DrXV@m$D~F;^(iwHFf+OV}kH--MQ~cWLQ+|zm<&_KGi&}HC z{8j6jG&3_-zadtpDZS))WICMS^XYVtR~p=x-qhcyhp~|DT(H)* z=Oxg`Hb39i{j2q}T=4%zi2jR;Se1AP<1Hx>^iv=b+VP3E!)xhB>fK&o zyywk($qJ!<*GrC@&-hiNtGx3-b*a8SMl42;#1JLB;1sv+`NX@LC!3 zZ-xu`?iP6DV(qn9;v=GyVJhQchgU&cp~5V0-Bf;k2?5V}_~VtrG5=v_Gs7GkT|_e3 zc$U!|eF?}9T&SMW$CbZ@2jlj{rKZNmcX*NA+{tqyE3X4>1&PaUZf;6F8XipQf7Rsf zaRHa)n@IMZv)>LuLDcN-{)njzzmo}6)f0bKu?INo z8|sE*sg~a4x&B3Lf$ldiOVzh-Z7Z(dV-{`{Cvea4zw z@g3~8OY>F$P>Dp}6|WV&deA<)r5~=;G!itjRNvn zG*N}oSVQo6U8xj>>c8;vu6z4m^CM!9xz4z|>3eREm&=YdZv6 zPryULV%Huhj?p3F;G%RYrY;j9o`u;$U-n`$Tg;uqxq(R zNX;+I#AFg@l}A8znK7KAAtd}*qUJ+6l%%^(K&}yYdoxZ#{jy9X?N(+rtK@}ijf&Be zQB*e~M9?%5t|$HzDT-uX)N>o@Q1_R|jN+ai35%wK)Pj4-QaU^jNftYVYE;cf*8)w{2$;1E{8EsPBTP5e$lw`*5cLu`=4eTM?zwq~5W#k+NwxAv8c_To3o!Qp(hZjPNDfq!fGRY{mNoFly!d-dcseT zN|apOwi!cbU0qDf~gO zwT#6ChGwG?Qb<2#`q;YDU^EUb_7gO~QSVWVRH`fZeHyt#$;2q0tOsF_op+Bm=3fzv zu9P6Iwx1?x@D!+I`j&vNXCUpe$h`e5@&WeBRYLKQH@XQgs!}4Kgd(y{Bx6=>P%%j} zUk5+>JAxLE$y3D(&~3+vB0}SyLnb|lu~Ga<>N5>@xA5@`U0Cyv<7W^T*#i`J?FqGH z*KZap2ETl>Umt7Gk9W_N?eYkci7GIe>~$f-2@{TpJ~h33EJ{?v$bkkt60ro591}@$ zWT6SS9&WQ1?B0n;tT72Me%jwgMUI*=(lMeF2sWg2-@(43x|QQU53i9@4O94l3WEwcuv~0l zU&zE{v}voDNcj7!26E4om z0EfcmLide9(0#My|I$_tHLUyv)_tpVDavLGAze{unGs$Udlp0VxNrd{^i7y2d>nt8 z6+S`#LHK0Y+yBGjN&b=3ne1*bozjt-I)%6Zs1aEHt zMC_gaN~+%mBA8U1ibhMo~i1VK#9nWKfs1N>TCM+h50NEYlc5P(fs}n2=`4tTEVC+zN5T=QdmE0`uun=Gl<%7m#VN_SoGjQ zYGU@sLSIKlh1Nkw^f<8)O%ZuBF%l1LgtKpiPimijGx2~}c}A^_ZEBW7sokaS(nGWw zZd@D-4E^cv-Vd9w=u9g6t+j?)$e}W}%8aq~V?rsj3qJ7fa*?FVj!UF+4J0UNIUQVe; { + window.open("/prompt_db/manager", "_blank"); + }); + node.setSize?.(node.computeSize?.() || [260, 58]); + app.graph?.setDirtyCanvas?.(true); +} + +// ─── Setup PromptSelector ─────────────────────────────────────────────────── +function setupSelectorNode(node) { + if (node._pdb_selector_setup) return; + node._pdb_selector_setup = true; + + const catWidget = node.widgets?.find((w) => w.name === "category"); + const promptWidget = node.widgets?.find((w) => w.name === "prompt_name"); + if (!catWidget || !promptWidget) return; + + // Strip 📖 marker before sending to Python backend + promptWidget.serializeValue = () => + (promptWidget.value || "").replace(/\s*📖$/, ""); + + // ── Refresh categories + prompts from DB ── + async function refreshFromDB() { + try { + const categories = await API.getCategories(); + if (categories.length > 0) { + catWidget.options.values = categories; + if (!categories.includes(catWidget.value)) catWidget.value = categories[0]; + } + const cat = catWidget.value; + if (cat && cat !== "(no categories)") { + const prompts = await API.getPrompts(cat); + const names = prompts.map((p) => { + const hasLoras = p.loras && p.loras.length > 0; + return hasLoras ? `${p.name} 📖` : p.name; + }); + if (names.length > 0) { + promptWidget.options.values = names; + if (!names.includes(promptWidget.value)) promptWidget.value = names[0]; + } else { + promptWidget.options.values = ["(no prompts)"]; + promptWidget.value = "(no prompts)"; + } + } + await updateLoraDisplay(); + app.graph?.setDirtyCanvas?.(true); + } catch (e) { + console.error("[PromptDB] Refresh failed:", e); + } + } + + // ── LoRA display widgets (read-only info) ── + async function updateLoraDisplay() { + if (node.widgets) { + node.widgets = node.widgets.filter((w) => !w._pdb_lora_display); + } + const rawName = promptWidget.value || ""; + const cleanName = rawName.replace(/\s*📖$/, ""); + const cat = catWidget.value; + if (!cleanName || cleanName === "(no prompts)") return; + + try { + const prompts = await API.getPrompts(cat); + const prompt = prompts.find((p) => p.name === cleanName); + if (!prompt || !prompt.loras || prompt.loras.length === 0) return; + + for (const lora of prompt.loras) { + const displayName = (lora.name || "").replace(/\.safetensors$/, ""); + const strength = lora.strength != null ? lora.strength : 1.0; + const w = node.addWidget( + "text", + `🔗 ${displayName}`, + `${strength.toFixed(2)}`, + () => {}, + { serialize: false } + ); + w._pdb_lora_display = true; + w.disabled = true; + } + } catch (e) { + console.error("[PromptDB] Failed to load LoRA info:", e); + } + const computed = node.computeSize?.(); + if (computed) node.setSize?.(computed); + app.graph?.setDirtyCanvas?.(true); + } + + // ── Add Refresh button ── + node.addWidget("button", "🔄 Refresh", null, () => refreshFromDB()); + + // ── Category change callback ── + const origCatCallback = catWidget.callback; + catWidget.callback = async function (value) { + if (origCatCallback) origCatCallback.call(this, value); + try { + const prompts = await API.getPrompts(value); + const names = prompts.map((p) => { + const hasLoras = p.loras && p.loras.length > 0; + return hasLoras ? `${p.name} 📖` : p.name; + }); + if (names.length === 0) { + promptWidget.options.values = ["(no prompts)"]; + promptWidget.value = "(no prompts)"; + } else { + promptWidget.options.values = names; + if (!names.includes(promptWidget.value)) promptWidget.value = names[0]; + } + await updateLoraDisplay(); + app.graph?.setDirtyCanvas?.(true); + } catch (e) { + console.error("[PromptDB] Failed to fetch prompts:", e); + } + }; + + // ── Prompt change callback ── + const origPromptCallback = promptWidget.callback; + promptWidget.callback = async function (value) { + if (origPromptCallback) origPromptCallback.call(this, value); + await updateLoraDisplay(); + }; + + refreshFromDB(); +} + +// ─── Setup PromptCombiner ─────────────────────────────────────────────────── +const DEFAULT_WIDTH = 500; + +function setupCombinerNode(node) { + if (node._pdb_combiner_setup) return; + node._pdb_combiner_setup = true; + console.log("[PromptDB] Setting up PromptCombiner node", node.id); + + const selectionsWidget = node.widgets?.find( + (w) => w.name === "prompt_selections" + ); + if (selectionsWidget) { + selectionsWidget.type = "converted-widget"; + selectionsWidget.computeSize = () => [0, -4]; + selectionsWidget.serializeValue = () => selectionsWidget.value; + } + + let userWidth = Math.max(node.size?.[0] || DEFAULT_WIDTH, DEFAULT_WIDTH); + + const origOnResize = node.onResize; + node.onResize = function (size) { + if (origOnResize) origOnResize.apply(this, arguments); + if (size && size[0]) userWidth = size[0]; + }; + + let rebuildPending = false; + let rebuildTimer = null; + + function getMaxSelectionIndex() { + let max = 0; + for (const inp of node.inputs || []) { + const m = inp.name.match(/^selection_(\d+)$/); + if (m) max = Math.max(max, parseInt(m[1])); + } + return max; + } + + function syncSelectionsJSON() { + if (!selectionsWidget) return; + const obj = {}; + if (node.widgets) { + for (const w of node.widgets) { + if (w._pdb_dynamic && w._pdb_inputName) { + // Skip muted entries + if (w._pdb_muted) { + obj[w._pdb_inputName] = ""; + } else { + const val = (w.value || "").replace(/\s*📖$/, ""); + obj[w._pdb_inputName] = val; + } + } + } + } + selectionsWidget.value = JSON.stringify(obj); + } + + function getSourceCategory(slotIndex) { + const input = node.inputs?.[slotIndex]; + if (!input || input.link == null) return null; + const linkInfo = app.graph.links[input.link]; + if (!linkInfo) return null; + const sourceNode = app.graph.getNodeById(linkInfo.origin_id); + if (!sourceNode) return null; + const catWidget = sourceNode.widgets?.find((w) => w.name === "category"); + return catWidget?.value || null; + } + + async function fullRebuild() { + // Remove dynamic widgets + if (node.widgets) { + node.widgets = node.widgets.filter( + (w) => !w._pdb_dynamic && !w._pdb_lora_display + ); + } + + // Cleanup disconnected slots + if (node.inputs) { + for (let i = node.inputs.length - 1; i >= 0; i--) { + const inp = node.inputs[i]; + if (inp.name.startsWith("selection_") && inp.link == null) { + node.removeInput(i); + } + } + } + + const nextIdx = getMaxSelectionIndex() + 1; + node.addInput(`selection_${nextIdx}`, "DB_SELECTION"); + + let savedSelections = {}; + try { + savedSelections = JSON.parse(selectionsWidget?.value || "{}"); + } catch (e) {} + + for (let i = 0; i < (node.inputs?.length || 0); i++) { + const inp = node.inputs[i]; + if (!inp.name.startsWith("selection_")) continue; + if (inp.link == null) continue; + + const category = getSourceCategory(i); + if (!category) continue; + + let allPrompts = []; + let promptNames = []; + try { + allPrompts = await API.getPrompts(category); + promptNames = allPrompts.map((p) => { + const hasLoras = p.loras && p.loras.length > 0; + return hasLoras ? `${p.name} 📖` : p.name; + }); + } catch (e) { + console.error("[PromptDB] fetch failed for", category, e); + } + if (promptNames.length === 0) promptNames = ["(no prompts)"]; + + const saved = savedSelections[inp.name]; + let defaultVal = promptNames[0]; + if (saved) { + const match = promptNames.find( + (n) => + n === saved || + n === `${saved} 📖` || + n.replace(/\s*📖$/, "") === saved + ); + if (match) defaultVal = match; + } + + // Check saved mute state + const muteKey = `pdb_mute_${node.id}_${inp.name}`; + const isMuted = localStorage.getItem(muteKey) === "1"; + + // ── Custom single-line widget: ● 📂 Category ◀ PromptName ▶ ── + const closureCat = category; + const closureNames = promptNames; + const closureInpName = inp.name; + const widget = { + type: "pdb_combo", + name: `📂 ${category}`, + value: defaultVal, + _pdb_dynamic: true, + _pdb_inputName: closureInpName, + _pdb_category: closureCat, + _pdb_allPrompts: allPrompts, + _pdb_muted: isMuted, + _pdb_values: closureNames, + options: { serialize: false }, + last_y: 0, + computeSize: function () { + return [node.size[0], 20]; + }, + // ── Custom draw ── + draw: function (ctx, nodeRef, widgetWidth, posY, H) { + this.last_y = posY; + const margin = 15; + const innerW = widgetWidth - margin * 2; + + // Background bar (standard LiteGraph color) + const bgColor = LiteGraph.WIDGET_BGCOLOR || "#29293e"; + ctx.fillStyle = bgColor; + ctx.beginPath(); + ctx.roundRect + ? ctx.roundRect(margin, posY, innerW, H, H * 0.3) + : ctx.rect(margin, posY, innerW, H); + ctx.fill(); + + // Toggle circle (left side) + const toggleX = margin + 14; + const toggleY = posY + H * 0.5; + const r = 5; + ctx.beginPath(); + ctx.arc(toggleX, toggleY, r, 0, Math.PI * 2); + ctx.fillStyle = this._pdb_muted ? "#555" : "#7cacf8"; + ctx.fill(); + if (!this._pdb_muted) { + ctx.beginPath(); + ctx.arc(toggleX - 1, toggleY - 1, r * 0.35, 0, Math.PI * 2); + ctx.fillStyle = "rgba(255,255,255,0.25)"; + ctx.fill(); + } + + // Category name (after circle) + ctx.fillStyle = this._pdb_muted ? "#777" : "#ddd"; + ctx.font = "12px sans-serif"; + ctx.textAlign = "left"; + ctx.textBaseline = "middle"; + const catText = `📂 ${closureCat}`; + ctx.fillText(catText, margin + 28, posY + H * 0.5); + const catTextW = ctx.measureText(catText).width; + const catEnd = margin + 28 + catTextW + 8; // where category text ends + + // Right side layout: ◀ PromptName ▶ (right-aligned) + const rightEdge = margin + innerW - 10; + const displayVal = (this.value || "").replace(/\s*📖$/, ""); + + // Measure prompt name and truncate if overlaps category + ctx.font = "12px sans-serif"; + const maxTextW = rightEdge - catEnd - 36; // space for both arrows + gaps + let valText = displayVal; + if (ctx.measureText(valText).width > maxTextW) { + while (ctx.measureText(valText + "…").width > maxTextW && valText.length > 1) { + valText = valText.slice(0, -1); + } + valText = valText + "…"; + } + + const textW = ctx.measureText(valText).width; + // Positions: ...◀ [text] ▶ + const arrowRight = rightEdge; + const textRight = arrowRight - 14; // text right edge (before ▶) + const textLeft = textRight - textW; // text left edge + const arrowLeftX = textLeft - 14; // ◀ position + + // Cache for mouse handler + this._pdb_arrowLeft = arrowLeftX; + this._pdb_catEnd = catEnd; + + // ◀ button + ctx.fillStyle = "#aaa"; + ctx.textAlign = "center"; + ctx.font = "10px sans-serif"; + ctx.fillText("◀", arrowLeftX, posY + H * 0.5); + + // Prompt name (right-aligned) + ctx.fillStyle = this._pdb_muted ? "#777" : "#ddd"; + ctx.font = "12px sans-serif"; + ctx.textAlign = "right"; + ctx.fillText(valText, textRight, posY + H * 0.5); + + // ▶ button + ctx.fillStyle = "#aaa"; + ctx.textAlign = "center"; + ctx.font = "10px sans-serif"; + ctx.fillText("▶", arrowRight, posY + H * 0.5); + + ctx.textBaseline = "alphabetic"; + }, + // ── Custom mouse ── + mouse: function (event, pos, nodeRef) { + if (event.type !== "pointerdown" && event.type !== "mousedown") + return false; + + const x = pos[0]; + const widgetWidth = nodeRef.size[0]; + const margin = 15; + const innerW = widgetWidth - margin * 2; + const rightEdge = margin + innerW - 10; + const arrowLeftX = this._pdb_arrowLeft || (margin + 120); + + // Toggle area (left 45px — circle click) + if (x < margin + 45) { + this._pdb_muted = !this._pdb_muted; + localStorage.setItem(muteKey, this._pdb_muted ? "1" : "0"); + syncSelectionsJSON(); + updateCombinerLoras(); + app.graph?.setDirtyCanvas?.(true); + return true; + } + + // ◀ button area + if (x > arrowLeftX - 10 && x < arrowLeftX + 10) { + const idx = this._pdb_values.indexOf(this.value); + const newIdx = (idx - 1 + this._pdb_values.length) % this._pdb_values.length; + this.value = this._pdb_values[newIdx]; + syncSelectionsJSON(); + updateCombinerLoras(); + app.graph?.setDirtyCanvas?.(true); + return true; + } + + // ▶ button area + if (x > rightEdge - 10) { + const idx = this._pdb_values.indexOf(this.value); + const newIdx = (idx + 1) % this._pdb_values.length; + this.value = this._pdb_values[newIdx]; + syncSelectionsJSON(); + updateCombinerLoras(); + app.graph?.setDirtyCanvas?.(true); + return true; + } + + // Text area click — open dropdown + if (x > arrowLeftX + 10 && x < rightEdge - 10) { + const that = this; + const canvas = app.canvas; + const ref_window = canvas.getCanvasWindow(); + // Clean display names for the menu + const cleanValues = this._pdb_values.map(v => v.replace(/\s*📖$/, "")); + new LiteGraph.ContextMenu( + this._pdb_values, + { + scale: Math.max(1, canvas.ds?.scale || 1), + event: event, + className: "dark", + callback: function (v) { + if (v) { + that.value = v; + syncSelectionsJSON(); + updateCombinerLoras(); + app.graph?.setDirtyCanvas?.(true); + } + }, + }, + ref_window + ); + return true; + } + + return false; + }, + }; + node.widgets.push(widget); + + // Add LoRA info strips for the currently selected prompt + const cleanVal = defaultVal.replace(/\s*📖$/, ""); + const selectedPrompt = allPrompts.find((p) => p.name === cleanVal); + if (selectedPrompt && selectedPrompt.loras && selectedPrompt.loras.length > 0) { + for (const lora of selectedPrompt.loras) { + const dName = (lora.name || "").replace(/\.safetensors$/, ""); + const str = lora.strength != null ? lora.strength : 1.0; + const loraW = node.addWidget( + "text", + ` 🔗 ${dName}`, + `${str.toFixed(2)}`, + () => {}, + { serialize: false } + ); + loraW._pdb_lora_display = true; + loraW.disabled = true; + } + } + } + + syncSelectionsJSON(); + const computed = node.computeSize?.() || [userWidth, 100]; + node.setSize?.([userWidth, computed[1]]); + app.graph?.setDirtyCanvas?.(true); + } + + // Update LoRA display strips when combo selection changes + async function updateCombinerLoras() { + // Remove old lora display widgets + if (node.widgets) { + node.widgets = node.widgets.filter((w) => !w._pdb_lora_display); + } + + // Re-add LoRA strips after each combo widget + const combos = (node.widgets || []).filter((w) => w._pdb_dynamic); + // We need to insert in order, so collect all widgets to add + const toInsert = []; // { afterWidget, loraWidgets[] } + + for (const combo of combos) { + const cleanVal = (combo.value || "").replace(/\s*📖$/, ""); + const cat = combo._pdb_category; + if (!cleanVal || cleanVal === "(no prompts)" || !cat) continue; + + let prompts = combo._pdb_allPrompts; + if (!prompts) { + try { + prompts = await API.getPrompts(cat); + } catch (e) { + continue; + } + } + + const prompt = prompts.find((p) => p.name === cleanVal); + if (!prompt || !prompt.loras || prompt.loras.length === 0) continue; + + toInsert.push({ afterWidget: combo, loras: prompt.loras }); + } + + // Insert LoRA widgets after their combo (in reverse to keep indices stable) + for (const item of toInsert.reverse()) { + const idx = node.widgets.indexOf(item.afterWidget); + if (idx === -1) continue; + + const newWidgets = []; + for (const lora of item.loras) { + const dName = (lora.name || "").replace(/\.safetensors$/, ""); + const str = lora.strength != null ? lora.strength : 1.0; + const w = { + type: "text", + name: ` 🔗 ${dName}`, + value: `${str.toFixed(2)}`, + options: { serialize: false }, + _pdb_lora_display: true, + disabled: true, + callback: () => {}, + computeSize: function (width) { + return [width, 20]; + }, + }; + newWidgets.push(w); + } + // Insert after the combo widget + node.widgets.splice(idx + 1, 0, ...newWidgets); + } + + const computed = node.computeSize?.() || [userWidth, 100]; + node.setSize?.([userWidth, computed[1]]); + app.graph?.setDirtyCanvas?.(true); + } + + function scheduleRebuild() { + if (rebuildTimer) clearTimeout(rebuildTimer); + rebuildTimer = setTimeout(async () => { + if (rebuildPending) return; + rebuildPending = true; + try { + await fullRebuild(); + } finally { + rebuildPending = false; + } + }, 150); + } + + // Refresh button + node.addWidget("button", "🔄 Refresh", null, () => scheduleRebuild()); + + const origOnConnectionsChange = node.onConnectionsChange; + node.onConnectionsChange = function ( + type, + slotIndex, + isConnected, + link, + ioSlot + ) { + if (origOnConnectionsChange) origOnConnectionsChange.apply(this, arguments); + if (type === 1) scheduleRebuild(); + }; + + // Periodically check for category changes + node._pdb_refreshInterval = setInterval(() => { + if (!node.graph) { + clearInterval(node._pdb_refreshInterval); + return; + } + let needsRebuild = false; + for (let i = 0; i < (node.inputs?.length || 0); i++) { + const inp = node.inputs[i]; + if (!inp.name.startsWith("selection_") || inp.link == null) continue; + const category = getSourceCategory(i); + const existing = node.widgets?.find( + (w) => w._pdb_dynamic && w._pdb_inputName === inp.name + ); + if (category && (!existing || existing._pdb_category !== category)) { + needsRebuild = true; + break; + } + } + if (needsRebuild) scheduleRebuild(); + }, 1000); + + node.setSize?.([userWidth, node.size?.[1] || 100]); + scheduleRebuild(); +} + +// ─── Setup ApplyLoraStack ─────────────────────────────────────────────────── +const APPLY_LORA_WIDTH = 450; + +function setupApplyLoraNode(node) { + if (node._pdb_apply_setup) return; + node._pdb_apply_setup = true; + console.log("[PromptDB] Setting up ApplyLoraStack node", node.id); + + // Find and hide the lora_config text widget + const configWidget = node.widgets?.find((w) => w.name === "lora_config"); + if (configWidget) { + configWidget.type = "converted-widget"; + configWidget.computeSize = () => [0, -4]; + configWidget.serializeValue = () => configWidget.value; + } + + let rebuildPending = false; + let rebuildTimer = null; + + // Get current config overrides + function getConfig() { + try { + return JSON.parse(configWidget?.value || "{}"); + } catch (e) { + return {}; + } + } + + // Save config back to hidden widget + function saveConfig(config) { + if (configWidget) configWidget.value = JSON.stringify(config); + } + + // Trace back through lora_stack input to discover LoRAs + async function discoverLoras() { + const loraStackInput = node.inputs?.find((inp) => inp.name === "lora_stack"); + if (!loraStackInput || loraStackInput.link == null) return []; + + const linkInfo = app.graph.links[loraStackInput.link]; + if (!linkInfo) return []; + + const sourceNode = app.graph.getNodeById(linkInfo.origin_id); + if (!sourceNode) return []; + + const sourceClass = getNodeClass(sourceNode); + + if (sourceClass === "PromptSelector") { + return await getLorasFromSelector(sourceNode); + } else if (sourceClass === "PromptCombiner") { + return await getLorasFromCombiner(sourceNode); + } + + return []; + } + + // Get LoRAs from a PromptSelector node + async function getLorasFromSelector(selectorNode) { + const catWidget = selectorNode.widgets?.find((w) => w.name === "category"); + const promptWidget = selectorNode.widgets?.find( + (w) => w.name === "prompt_name" + ); + if (!catWidget || !promptWidget) return []; + + const cat = catWidget.value; + const rawName = promptWidget.value || ""; + const cleanName = rawName.replace(/\s*📖$/, ""); + + try { + const prompts = await API.getPrompts(cat); + const prompt = prompts.find((p) => p.name === cleanName); + if (prompt && prompt.loras && prompt.loras.length > 0) { + return prompt.loras.map((l) => ({ + name: l.name || "", + strength: l.strength != null ? l.strength : 1.0, + })); + } + } catch (e) { + console.error("[PromptDB] Failed to get LoRAs from selector:", e); + } + return []; + } + + // Get LoRAs from a PromptCombiner node + async function getLorasFromCombiner(combinerNode) { + const allLoras = []; + const seen = new Set(); + + // Read all dynamic combo widgets to find selected prompts + const combos = (combinerNode.widgets || []).filter((w) => w._pdb_dynamic); + + for (const combo of combos) { + const category = combo._pdb_category; + const rawVal = combo.value || ""; + const cleanName = rawVal.replace(/\s*📖$/, ""); + + if (!category || !cleanName || cleanName === "(no prompts)") continue; + // Skip muted categories + if (combo._pdb_muted) continue; + + try { + const prompts = await API.getPrompts(category); + const prompt = prompts.find((p) => p.name === cleanName); + if (prompt && prompt.loras) { + for (const l of prompt.loras) { + const name = l.name || ""; + if (name && !seen.has(name)) { + seen.add(name); + allLoras.push({ + name, + strength: l.strength != null ? l.strength : 1.0, + }); + } + } + } + } catch (e) { + console.error("[PromptDB] Failed to get LoRAs from combiner:", e); + } + } + + return allLoras; + } + + // Full rebuild of LoRA display widgets + async function fullRebuild() { + console.log("[PromptDB] ApplyLoraStack rebuild", node.id); + + // Remove all dynamic LoRA widgets + if (node.widgets) { + node.widgets = node.widgets.filter((w) => !w._pdb_lora_widget); + } + + const loras = await discoverLoras(); + if (loras.length === 0) { + const emptyW = node.addWidget( + "text", + "Status", + "No LoRAs connected", + () => {}, + { serialize: false } + ); + emptyW._pdb_lora_widget = true; + emptyW.disabled = true; + + const computed = node.computeSize?.() || [APPLY_LORA_WIDTH, 100]; + node.setSize?.([Math.max(computed[0], APPLY_LORA_WIDTH), computed[1]]); + app.graph?.setDirtyCanvas?.(true); + return; + } + + const config = getConfig(); + + for (const lora of loras) { + const displayName = (lora.name || "").replace(/\.safetensors$/, ""); + const override = config[lora.name] || {}; + const isEnabled = override.enabled !== false; + const str = + override.strength != null ? override.strength : lora.strength; + + // ── Custom single-line widget: ● name ◀ 1.00 ▶ ── + const loraFullName = lora.name; // closure capture + const widget = { + type: "pdb_lora", + name: displayName, + value: str, + _pdb_lora_widget: true, + _pdb_lora_name: loraFullName, + _pdb_enabled: isEnabled, + options: { serialize: false }, + last_y: 0, + computeSize: function () { + return [node.size[0], 20]; + }, + // ── Custom draw ── + draw: function (ctx, nodeRef, widgetWidth, posY, H) { + this.last_y = posY; + const margin = 15; + const innerW = widgetWidth - margin * 2; + + // Background bar + ctx.fillStyle = "#232333"; + ctx.beginPath(); + ctx.roundRect + ? ctx.roundRect(margin, posY, innerW, H, H * 0.3) + : ctx.rect(margin, posY, innerW, H); + ctx.fill(); + + // Toggle circle + const toggleX = margin + 14; + const toggleY = posY + H * 0.5; + const r = 5; + ctx.beginPath(); + ctx.arc(toggleX, toggleY, r, 0, Math.PI * 2); + ctx.fillStyle = this._pdb_enabled ? "#7cacf8" : "#555"; + ctx.fill(); + if (this._pdb_enabled) { + ctx.beginPath(); + ctx.arc(toggleX - 1, toggleY - 1, r * 0.35, 0, Math.PI * 2); + ctx.fillStyle = "rgba(255,255,255,0.25)"; + ctx.fill(); + } + + // LoRA name + ctx.fillStyle = this._pdb_enabled ? "#ddd" : "#777"; + ctx.font = "12px sans-serif"; + ctx.textAlign = "left"; + ctx.textBaseline = "middle"; + ctx.fillText(this.name, margin + 28, posY + H * 0.5); + + // ◀ value ▶ on right side + const rightEdge = margin + innerW - 8; + const valStr = this.value.toFixed(2); + + // ▶ button + ctx.fillStyle = "#aaa"; + ctx.textAlign = "center"; + ctx.font = "10px sans-serif"; + ctx.fillText("▶", rightEdge, posY + H * 0.5); + + // Value + ctx.fillStyle = this._pdb_enabled ? "#ddd" : "#777"; + ctx.font = "12px sans-serif"; + ctx.fillText(valStr, rightEdge - 28, posY + H * 0.5); + + // ◀ button + ctx.fillStyle = "#aaa"; + ctx.font = "10px sans-serif"; + ctx.fillText("◀", rightEdge - 56, posY + H * 0.5); + + ctx.textBaseline = "alphabetic"; + }, + // ── Custom mouse ── + mouse: function (event, pos, nodeRef) { + if ( + event.type !== "pointerdown" && + event.type !== "mousedown" + ) + return false; + + const x = pos[0]; + const widgetWidth = nodeRef.size[0]; + const margin = 15; + const innerW = widgetWidth - margin * 2; + const rightEdge = margin + innerW - 8; + + // Toggle area (left 50px) + if (x < margin + 45) { + this._pdb_enabled = !this._pdb_enabled; + const cfg = getConfig(); + if (!cfg[this._pdb_lora_name]) cfg[this._pdb_lora_name] = {}; + cfg[this._pdb_lora_name].enabled = this._pdb_enabled; + saveConfig(cfg); + app.graph?.setDirtyCanvas?.(true); + return true; + } + + // ◀ button (decrease strength) + if (x > rightEdge - 70 && x < rightEdge - 42) { + this.value = Math.max(-2, +(this.value - 0.05).toFixed(2)); + const cfg = getConfig(); + if (!cfg[this._pdb_lora_name]) cfg[this._pdb_lora_name] = {}; + cfg[this._pdb_lora_name].strength = this.value; + saveConfig(cfg); + app.graph?.setDirtyCanvas?.(true); + return true; + } + + // ▶ button (increase strength) + if (x > rightEdge - 14 && x < rightEdge + 14) { + this.value = Math.min(2, +(this.value + 0.05).toFixed(2)); + const cfg = getConfig(); + if (!cfg[this._pdb_lora_name]) cfg[this._pdb_lora_name] = {}; + cfg[this._pdb_lora_name].strength = this.value; + saveConfig(cfg); + app.graph?.setDirtyCanvas?.(true); + return true; + } + + return false; + }, + }; + + node.widgets = node.widgets || []; + node.widgets.push(widget); + } + + // ── Add Reset Values button ── + const resetBtn = node.addWidget( + "button", + "🔄 Reset Values", + null, + async () => { + // Clear all overrides + if (configWidget) configWidget.value = "{}"; + await fullRebuild(); + }, + { serialize: false } + ); + resetBtn._pdb_lora_widget = true; + + const computed = node.computeSize?.() || [APPLY_LORA_WIDTH, 100]; + node.setSize?.([Math.max(computed[0], APPLY_LORA_WIDTH), computed[1]]); + app.graph?.setDirtyCanvas?.(true); + } + + function scheduleRebuild() { + if (rebuildTimer) clearTimeout(rebuildTimer); + rebuildTimer = setTimeout(async () => { + if (rebuildPending) return; + rebuildPending = true; + try { + await fullRebuild(); + } finally { + rebuildPending = false; + } + }, 200); + } + + // ── Refresh button ── + node.addWidget("button", "🔄 Refresh", null, () => scheduleRebuild()); + + // ── React to connection changes ── + const origOnConnectionsChange = node.onConnectionsChange; + node.onConnectionsChange = function ( + type, + slotIndex, + isConnected, + link, + ioSlot + ) { + if (origOnConnectionsChange) origOnConnectionsChange.apply(this, arguments); + scheduleRebuild(); + }; + + // Periodically check for changes in connected source nodes + let lastLoraFingerprint = ""; + node._pdb_refreshInterval = setInterval(async () => { + if (!node.graph) { + clearInterval(node._pdb_refreshInterval); + return; + } + + try { + const loras = await discoverLoras(); + const fingerprint = JSON.stringify(loras.map((l) => l.name).sort()); + if (fingerprint !== lastLoraFingerprint) { + lastLoraFingerprint = fingerprint; + scheduleRebuild(); + } + } catch (e) {} + }, 1500); + + // Initial setup + node.setSize?.([APPLY_LORA_WIDTH, node.size?.[1] || 100]); + scheduleRebuild(); +} + +// ─── Register extension ───────────────────────────────────────────────────── +app.registerExtension({ + name: "comfy.promptdb", + + async beforeRegisterNodeDef(nodeType, nodeData, _app) { + if (nodeData.name === "PromptDBManager") { + const orig = nodeType.prototype.onNodeCreated; + nodeType.prototype.onNodeCreated = function () { + orig?.apply(this, arguments); + setTimeout(() => setupManagerNode(this), 100); + }; + } + if (nodeData.name === "PromptSelector") { + const orig = nodeType.prototype.onNodeCreated; + nodeType.prototype.onNodeCreated = function () { + orig?.apply(this, arguments); + setTimeout(() => setupSelectorNode(this), 100); + }; + } + if (nodeData.name === "PromptCombiner") { + const orig = nodeType.prototype.onNodeCreated; + nodeType.prototype.onNodeCreated = function () { + orig?.apply(this, arguments); + setTimeout(() => setupCombinerNode(this), 100); + }; + } + if (nodeData.name === "ApplyLoraStack") { + const orig = nodeType.prototype.onNodeCreated; + nodeType.prototype.onNodeCreated = function () { + orig?.apply(this, arguments); + setTimeout(() => setupApplyLoraNode(this), 100); + }; + } + }, + + nodeCreated(node) { + const cls = getNodeClass(node); + if (cls === "PromptDBManager") + setTimeout(() => setupManagerNode(node), 150); + if (cls === "PromptSelector") + setTimeout(() => setupSelectorNode(node), 150); + if (cls === "PromptCombiner") + setTimeout(() => setupCombinerNode(node), 150); + if (cls === "ApplyLoraStack") + setTimeout(() => setupApplyLoraNode(node), 150); + }, +}); + +console.log("[PromptDB] Extension registered."); diff --git a/web/prompt_manager.html b/web/prompt_manager.html new file mode 100644 index 0000000..8e8c3d6 --- /dev/null +++ b/web/prompt_manager.html @@ -0,0 +1,1422 @@ + + + + + + Prompt Database Manager + + + + +

+ + +
+
+
+

New Prompt

+ +
+
+
+ + +
+
+ + +
+
+ + +
+ +
+
+ 📖 Attached LoRAs +
+
+
+ + +
+
+
+ +
+ + +
+ + + + + + + +