From cb6bdc071b7e35b9ae5a3a28f8179ea45fe6fca9 Mon Sep 17 00:00:00 2001 From: butaixianran Date: Tue, 7 Mar 2023 16:59:40 +0800 Subject: [PATCH] verion 0.1 --- .gitignore | 1 + README.md | 64 +++++- img/extension_tab.jpg | Bin 0 -> 49434 bytes img/extra_network.jpg | Bin 0 -> 18827 bytes img/model_card.jpg | Bin 0 -> 21185 bytes img/model_info_file.jpg | Bin 0 -> 13963 bytes img/refresh_ch.jpg | Bin 0 -> 9059 bytes javascript/civitai_helper.js | 312 +++++++++++++++++++++++++ scripts/civitai_helper.py | 434 +++++++++++++++++++++++++++++++++++ 9 files changed, 810 insertions(+), 1 deletion(-) create mode 100644 .gitignore create mode 100644 img/extension_tab.jpg create mode 100644 img/extra_network.jpg create mode 100644 img/model_card.jpg create mode 100644 img/model_info_file.jpg create mode 100644 img/refresh_ch.jpg create mode 100644 javascript/civitai_helper.js create mode 100644 scripts/civitai_helper.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e30f246 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +scripts/__pycache__/ diff --git a/README.md b/README.md index 61af757..fd374fa 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,64 @@ # Stable-Diffusion-Webui-Civitai-Helper -Stable Diffusion Webui Extension for Civitai, to manage your model much more easily. +Stable Diffusion Webui Extension for Civitai, to handle your models much more easily. + +# Feature +* Scan all models to download model information and preview images from Civitai. +* Modified Build-in "Extra Network" cards, to add following buttons on each card: + - 🖼: Modified "replace preview" text into this icon + - 🌐: Open this model's Civitai url in a new tab + - 💡: Add this model's trigger words to prompt + - 🏷: Use this model's preview image's prompt + +# Install +Go to SD webui's extension tab, go to `Install from url` sub-tab. +Copy this project's url into it, click install. + +Or, just download this project as zip file, unzip it to `Your SD webui/extensions`. + +Then reload UI with "Reload UI" Button in Setting tab. + +Done. + +# How ot use +## Scan model +Go to extension tab "Civitai Helper". There is a button called "Scan Model". + +![](img/extension_tab.jpg) + +Click it, extension will scan all your models to generate SHA256 hash, and use this hash, to get model information and preview images from civitai. + +For each model, it will create a json file to save all model info from civitai. This model info file will be "Your_model_name.civitai.info" in your model folder. + +![](img/model_info_file.jpg) + +If a model info file is already exists, it will skip this model. If a model can not be find in civitai, it will create an empty model info file, so it won't scan this model twice. + +### Add new models +When you have some new models, just click this button again, to get new model's information and preview images. + +## Model Card +Open SD webui's build-in "Extra Network" tab, to show model cards. + +![](img/extra_network.jpg) + + +Move your mouse on to the bottom of a model card. It will show 4 icon buttons: + - 🖼: Modified "replace preview" text into this icon + - 🌐: Open this model's Civitai url in a new tab + - 💡: Add this model's trigger words to prompt + - 🏷: Use this model's preview image's prompt + +![](img/model_card.jpg) + +If you click Refresh Button of extra network, those additional buttons will be removed. You can click `Refresh Civitai Helper` button to bring them back. + +![](img/refresh_ch.jpg) + + + +Enjoy! + + + + + diff --git a/img/extension_tab.jpg b/img/extension_tab.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d49a3a1b30ab16484f7aa9f1421c01e69b762876 GIT binary patch literal 49434 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

PbOXuy^Br^dq9}?GYAu@ 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%0Dk2Ye+jqvz?^AtkD_~#O$O&*T@N6}4ji%+Ip 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 F{|{M-Ff{-G literal 0 HcmV?d00001 diff --git a/img/extra_network.jpg b/img/extra_network.jpg new file mode 100644 index 0000000000000000000000000000000000000000..25b2acbdb4afefb348f058a9d45fd8a090eda8ca GIT binary patch literal 18827 zcmeHv2{@JS*7sv3giIN?LWoi!L)b~?WT?oTkSS!IZ9_5>LJ>00WR__sGA1+G=6Pms zSQ6s^}ycxg{iZP1%3jM2Z#s>e}2IaG594RCm|swCOJb!MoLa~ zhKh>v3?(J?*>kkiXX(yTQqnTf($O<8GBQ%pFrQ~)IDd|Tk>O`01VmsNViF1x5()-t zN@|Ax>ks}jKt~SL6J8-AxCju^5fIT4;M)KQ01%LX7=FU|%ZGpv>?0`|ImH=D@PTSt zfRKQQh>)1*XRpDheZl(xF&)Xd3)kgH>9tJBE;=&Y2#C!f=e|?k!l*rfLc_x2;@>1BCcS-^oSBuKlbe@cP*_n}Rb5kC_o@C%YunfMj?S*`!J*-i(Xk)n zh`ITN#iiwy)wOlh?%w{v;Su`ylyfauS#{)X%ixadG!gv7)|#AH8l5fHkA2N4}H z$%X5r=j61=OdaVj-UuLPxD%UE-a^4GqK#yH>NIeMiAQvf7xfd`pOF2}fCc`qko^tV zZ@3Tu6%heActmsn6u|7_ftPr|7!Rc50Zb4C56~-N_)d;6cmNM9p2q{|73;p)HxZ3B3K0@s8Gpm^Yz6pFi4 z1^=Z?3|eUux-x?YAP%U^!ENRkGjSX})*A=I1G`i(j5-9FzA>}+v#!@>cwpXE4M%rM zb9{scIwmkyzwgSGt8@Qp{6AvU4(S+Gf*Cy@0`xO-;(?;JCk#{R-jg_7hHl{5G zDCA5EbGAeNpf1qg>%v&c^m;vW>lM`v1!Q|rhE1hjXTPB>;(H3`hp{+;R#DB#kZ6gD zvn@+ITua}TAI9LAaMgI=wgxdCn4``Fb%Iw=S(v{254HYL!B+c2iDM^WUuZI8maOj&Qnu~JpfwJ5j(@6d=XKCph{C?W%3ytX04EoN2g1r8 zB+2#T1lGK&hoz{aL+0(Sj_gc{R$19qv$=48!}i;itFgv`7UZG1;;aOzhV0+#`aAgV zZNpD<@O#^(Z-R{Z0qcX~WM>vs@BleB1cUsu<)~^1Uik6-?+X0U*bQ+0X5Es0wLE_+ z-}~Q||0l*WLaokNCUWMV%BV#67weeypZ0&V{Qr?ZIDh{$|Nf}(f7IW9ul|kVfxCDh zZ3qv{#NvUkTDUMgAd`m&;M{m1JpTp%=Mt(e_yBaJ3J)AD!cY%knXo=aq zXRh%RI_zs4Z$Yug5X>XUYWf}mcDf5i7lsfnN@LjOzuUCSRR{{L=R*Y^~9CCkSP{hT`G|TQ0lxxdcMJQESYE zVoEA`oM13@b6v2L(ma62p2HcPpM6MdN%%OCC(e`SsLUDr*0qe;+N)|z3Km-GBQWdB zxy)hGrvC;|%;k}IZ1j0bApVUq#f5ia6D?xhHZV$82%C+&eyzXgMhu;`cwFPa+UWT- zTnC@*y?(yF-4(*y4eV5rwA~HUOi0}=%2{toJ88)e7lVyXvb$+@`%8rPIr;r3+-RyEjqbU+TzY_^j z*lT7&mkwUxQxCdV6HZOI3B(4fvFA-&S~_pHXYeF94Bb5#?Vicj-kZuYezrY*QoRR1 zu3f6hD@Qjhkd}ih?EJ|pVrnPcN8WB0PNkmLTkvB_daQhU>UNs%c-ozNPgE{vmh*7k z{k-Y(;PCZ;y^!>y59{$B5k@F>slyPv!U?r`>u-qQ#`}ikIZyAuc=%e8fJ&lB-_jok zU7hAnYD<)5K}XrnQ&cXm$F7adFB>jgSe*D2@VS#GDBAW`8;smf6y5N+ZlrpK*keOy zI8QQh7Y`^m#wmXO+;hW)DCRbadNUKE9=_n7H{Gm?h^wmKacJQ^f$HpJyhGk{z+6Iv zKD`5>LWj7Kdf+-5WuR1J)PK_L+`s5{*`2Dv6|{Vwt;hy7gY2c@=a+__@7FD>@K#5g zF7=6h*7j*^GgpY5>x%azxVEX7!$H$@+_uk*2E5^H&y)I(MIlFp&iUf*tZ{Ud}tnKHkQs5~-O{UObjI zF`sqc`SrneHMU`!0^+!^z^2Raw{^A528=0Vc{;k05Fy>WaYi>sPn!Bx)6TbQw_3PZ z-oN=~WMX~7p{(bQL(L?t&l9#&sWf2^U1@|LjptjHMJ>gctskd5{iB;%i84X&jxL?r zbzqK?aHpcaH48ZJ9z5Wi{3=}1?1$ukO8tAKAuEs>E_f=9Q#-?->Hn`Bd=+>gCI}B0 zX5)c=)(-`n@P%1CFeU)qC(Y+4TJ0O(!Kq;Tu)*LGGjL5eM>iSwhgp_TmxNQ2fTQ5u zeEaD%pmU!`jbl9Scs%VuiUpB4{+vQ-znRNbDKh$I4>EoWgCctZQb5UsnBRp#Ll#QQW!!|0 zLzd4KNG|)5&IlUbEQ#)Ghdg0MzZ43vTeyu#s-cT zZHk;$f1p%Rsm|G>WkP50LnY4|F3G0d0vnG<#8xS4ChFgc$)_8q&_-)T3y~n_Cl(?tJtm?#46UXzQ%3oMcezUBo5L; zLN<5WI1w(Jg9EtIZyC@6GS*4H8&wv52Q)M+z4FZl=_2BVN=M;j=i z&c2DW*7qyVHE17oCo}LA-p(OV6RPQbX*7$f9ERA$w51Us6>7iQ#*nW10nB;oFHL5Q zr#FTS?v$UGr|nptV0}j$C;L>6L$K2o9?f|T1qq3cDzKrQnh>>Sh*z}j4{QSQ5w8syi-(c;Z_6`b+*3{NnZDy z*1h_;UUt*7_!GDJQs)l*$UGUh>nqxN%6DC*T6fw;pxM$bJ}uoPa|b(GztQKTJSZAP z*&)>%9pIJxDvDucGl{N~M<>$%HkH(ZL|?VDtAp-{ef5;~j#kraHBVPTbn?=uA^1UGYT&KIY^Qe?Z|Se$W;Ohu^fG>3wQEC@6>{J>uhqWNV0On9Zn;^$v3 z{`Kbn&0j)qVKf?g(5-m$Jj!mGyY$P@fBv{iY@xTvl2P{2_*CWre zO_1f}!L8uF#KTtK3Jw+>8-&3Yog?r78zvK`0=ik4@E0?4Chr5o`O8vd{lR_%|Jwtd z3)ZnYbbRf9Tftw;{SH>%@0XenGr$@j(*w}-nOU8TDej6(q>NS8H^~gO9N{rDV9FWN@8Etm{rRv-!${u<{mb$l~k|# z;1i9^hC{)a<2hk0((0741A|P$p~X;418a%{Yf2dT zcd&jF9LOV0ke!^sSK06YA0F7!_~)(hmOLlhHTED>xG4`2%pcYc&Y zS6;%8TCz5EA$wm;PG`s343u)%lyV@bvle(j4t5MS@Eo$Sjt4$CVAAnGwd~YiyCv!y zzJT*k!vj97=tM#HG&y#ys^}?3QWebQzC#c>25kspPQ(Ley8R$uQmRk|USEa3TWw{0 z{ZahT5Q(Pfy&}wMEqK!YK55=J>mQ(Y|9vgca$!8M@?`~wsYO48<-5REWuZ=ZU@1i7 zq~|T@NmP_gJ-`ER(yg$6>zC|rqu^tN4Fef{S!U?b68uZdCfM&|CU~GPxDR{mfXq4tM;7OE6}Hm@3x=$7 zKu&04CgI0VV8x$eu#}gvBhX`&!_MX)e%MWwchQCO3*}pFyD}15uGx(3CA7QnhWwoD&2WXc~_L=cO9PF?i_TP@# zpG#%oE_{Qpf|BI{XHpQ>*JPg>4}dn|FmD3>kHFK}alQe+ur|pgEXhxUf&B<8E5Zf9 zcVW2UQ}@5lqk+GUr|tZetihRE*vQSWlH)B+xzv$M#s9I{!@gtMH4RP!#bWZ8e zcMNj^GG2at=to|Hhw;02I)1sNg-v$_=T{|crV__!91fKKa?Sv=oPzZg&m3*yfneQC zf1zK`A-^^8X!Qf-FQ>n6k)QBC&HWVazaq?2^}h@sKjD{*sSj%k;h z7&J+9!?N&zbwgvM_Vf)R#?x;arZ}0ROd~dRO|lenB7%GDs*bVm!Nx)s z^k>Fd9k4|6;3IJ`l&ds1liL%QQ&H&26?<;ZIf^iKAuxhYMO7F6jyyofTIf6v`N$O(TyycWLu-`DLeU=l5y2>W-T7{EQ1_ z_5ozXEC$>MrQ5AI*#!(Nwv^t4z%}(Qf&Wz=BHW4C(&=T_>m!o$=?&C_zLrxWTNaUR za}w^92VNDy8@h0z9JbRp;!AHF_C5_+yVVL1s(HJ+3Plr(r`;i_RU|{XNy0r zfX#wd8e^p5b=^~fgXkk9l_@dKxOb@|>W7dTJ3!)I%uAM;2f>g+7d_rMv(M0Ji(1WJ z?$&lwd060v2au+mi@42nG$Xj|GAsV}PyKXc#0)v6x2W=#yJh6bvr7Atv_ZGP_^n(zR8aR2I zt~o1MALupAf>|r>4%`@Mp)cp*s0#2v&)LGGdo^$MQ|f{jdk8PYPPIFxd2ly-jlede z#Bl*A*i07`T|dx>2NEF%UAEpWCe)2;C?;?z!fr=q;;j+gVKj$69fr7XACinsZA%2z)) zsk_#H{vMKVS#bdj^1~kEXdr7zA$2tppaO*HzhnKls_#P1fWUq@@-zy72EM+m@v9Ij zjfDMioEs22jB_4ZO);8pwCsazs9DUaZ_YxJPK=~4h0l?%$=aW>Xl1WmUS`t zDWPzE*Cm*a*eZlp_S^=P+O?>OO((7EAVTFrv^Sd`t5ReSL%gDMl>o^_=iT^df_4Q* z(UP2&uN^KAG3cY>`i;hWA{i@npYFkCgbkxqE+{Z)68z~< z{~c+c^(*Oqn|9#AuatfM?@4z}V$p{)zmfLPUxxWhvxB#7jw(eQ}cGhpKnf6SKz(}$whV! z$z4jNZu#WqJF&QzfU}qt(5wU8SxQOc8{F2wY`FIe)4jAu@@ zHZp#9y7p0u9JVmnhil3JnL1k|c#F(!>vSdz-*pL{;fpUKdQcNA=h;N zj3~Ul6?aP~_-Kn{w)g(}vTcuALs`|b##9^WP4C)k&8;#hGhm-Bv-1a2jd{l~xzkEYc z$xydUB}a68WzlsZ_#5(IiI-E)c*i2U1Sa_7Wc}!{5(y85Ju@(QHGsC=Os=k1U}<>Y z&ZQk^FOmnl{)sGa#$I_AlTgOKZm+~`4m%+nNP!-s<8fHn;iI#8jvONkDoi`VHu;m+ z?laJ=88J#Sil29Nm+iULn-SKP#$@<@yR6DyWZB7SdD*Q&OHDnswEZ!-i(w0nbun2n zba)A06r;g9gOX4XbJKyMP8~oD%*SJFbHc~e@*vT>1kMk2Lm^Dt<_>fz1nZ=KvVfx) z5Nw?{VUvDwye;&EP*|v|L1=+Zj-@R2FOM8S#-R)CK}bP^u`;nOsTJ)Y%|QM*en#bE zHTu*UEn^ZfzNDcg-KzK@qe9h{NfeP*ABz1uLJ5^|7t26fk`SG@=;1V>c24hpj7)RV zB1f~Hgb>ZW0F&2#U~V)v1oRxr3Sj#pCJyMf#cmUa{}&GLxdTyc3}JuXik>XPs9WvE#S74BT(0V zs+Zu{x+kB!@iFqjmu8WEX~#^A5;8H^y|~xRX4D&6nfs~s=>X#s{Tt*@c*t1x56Xzj zD)7KF4a7tXgrb@4W=NSrA+~NBY;rZR=c3*9_N=&tdd`stZ$)&x zMk!tHU)DivL&G(8C21m>A*j3vjJ)@P1}*yL!rf$*C&`B>(bN1a*@waow3iewXVJ5x z;@tLrV0y(*#_)j0*pvwy)J`L0S{7|uvMOaL)i<%jbb&eDDl}cFbA`{d{N0mLA!5D=&I%gk+zv#Lg>LB1Q)>T#5jgd!QEEE zHJgFXGf(NAcsC$>$@JVD%3?Kk-7b}Ztr_*EsdoPa$M^+cg%>u)b`}C z5B0n{_uU{pI1*Q2k@dZ^+=iJ+Tgl;q%XEPGWrjqPw@-E@*>!fl^aZ=8Gtz|34Q0Qd zu{x1of1!s!h_%&5Ukbl)rtr0#ti2PFOS|OUzC-oIu|1QQ=lh!^=NU%~eE3mK%W&6> z3G^+Kbc1R+-u4vEq+5nx^0K5&-T7s+AKrveHyRa2ELhAL*&rXQ@aR69x&IFLZS}^+ zCFaG;l3WW!C4wc}OqSvSiX=vZqDJy<%xh*jKMdD(ON)E#EGgBvNwmM+$>;I^5Wh+w zHeih5L~W;V>`kG$+uRDw$m<%ct5RMvp=g!k?mSpDNoY0;XxY!*9|^O~l%zUyP4I~a z)c8gR?SL3PPofDzIdJe^bt$Fq2P$VKf?K$4g5{>0M~8+equzRrxgKvgU0XA2If?-f zSbls{krL-`phzowOu9Rn(4AF7I;m~ny>n6lUxepMwXS6Z9x1I}3W-HUXm_2# z{f157#KXh($EJ0iox4+S1kIgWq;(Ane8^Gfe58;a5&PcM8Ybl<&$k_fsiRZ4zvdR} zo>MsOVt&y=m)J!a?X@5}9oDs(+Uy1LAH?r#q{qOCvYLr@obTE%^3{e?Zrrd=qGpx% zs`qJU(N~-}uR9T_7jTAPG4c$kh7^sC%%NueCN0fe>Tb$@{mEw5&Jl?b64MvQ>qR^U^88NxS!){8)0dQb(MGzPMAt4iQfgGU>bkSJ$AXn%si#K z&JdiJndRidj!W?^4f2ipkVBJk7bC@$(?_Ww!b^inr)C#gLtj8W9wP6okd-hSkall& zg5%ai^8ih<&?NH3m<2_L+|F_}n+F*ua|2s}X@v`inRVm-=BJ$mw~}IYq{U7peeR-e z78I|QqaWye9Cm3EJ5VVR-roq#@o0C;zYs`BI$sj>^{UlI=}hi|bxEHn*hW3i z&tVfa*fNzCF1Z>1bcb>3WNq*Km8ttI=JEE!Tu3=?#$mMDEHo4&HwU5fNYWfSP^VEC zaLyFS zsBT?nI&tZGjqA4_SfEkwspt>$3DdWGKj2!PRUd=)<8#DWp;NG#9IRyuP43 zaopw&pMu2eo2QdZt6p@?4<}Yr{KCYK`8N8kZw?x1{FGJgwhzI41eEIQ{H+-3b)<*a zbMgagAqxYguFq{bZtQ6iVgVYR#-<=z22J8oc@gENWWK)HoRD=A`3K{$4sZc0)rPH7 zYig1ny{dk^HL$s2%G$6K^Mq3t(37`Dl> zd|$2Ld_mU$q{vM{CN>@13=m}OS|Pk6j@<+E!CB@e(+;OA;5x1Fd7ov$_MxyNE;^`4 zZ8v7LuGc}EH5C<0K${u5&}VoS%$f1v#FYM4KrIvxG|n9Lf$M6*=MB*-+P6+0KY8}( zQ`jB5r=&;;5?_zc9W{O_zclNnBZ5&!mw^S|4g^bZJ*eZ1Ib=&e1~(d@MStt3XY-$k zc(6Z3nq19cyr%3?spaLZoHTNyjmyiH^~rkX%PQv^%!c15H_i3bxnQ47d#0GHG&nzb zZ=t+(0LJf?qUk5pu*D)g5aqE~oNvY_`E|VgW|jG&Q*+mm(sX}|hDfKCR_kzX-kEBH z2SxW&sxlP#th>cE64uMg;khSi{5A-EuuV=#TNU|fDGfuX8Gcg{o{l~1Q5)eJSPHuv z+H9IQFG-hlmGrZ?MZk9g66yBHN5^2$;IDysRcFFJ)szFl@Pk1@&spw=BlL=4@80?r z5i8L`ui3Xne|A0USn9HN&r@#-T(F-FSvGmZP3(7fY$^yxaqQM4dj{Q#2hMVWp;G6Y z9ke@k2TSL09yZrH2s=Jkfg8@ifY$djFHQju6oQ`lZ?Kk_A9!*!d@i|Ib-9)3J?Hxe ze!qch-bd@=0pbqiPJ|0(13Ywenj6`k$FcbOvGu5aQ}(IQoq~vOu}>{LZVI)| zWX&iEBjr82f+dwU#RCC{Gng1f!ira{baB=j;HEDXTz(qAR?+);UR709l&-qy*8Mj| z$@N}ei%LYHH-Bk3$l?X*y>kTXn&DV*cSDGV4?D<-cSJ&wvJ;?Fy88E*HsBj{n?CT0 z*ki|e86DATZ~j#CxI5BcvS|y?I>ydOoS5x)4T$j$3BQb{2p;aZB<1goBPK%Yt{-8f zV6$L_Z~K0&UDJmHZ18WF)_k8{*v$5`k)t=_@^(CYDZ?uK)-QqYhdpd%`e!m|P5h6j zmHv1^V}p*yf_u+$QyjXt17@wPSqELTdnq%cbKdwvS+RV759uGETs>*?CIc~=&a3O( z3RaU~SI$3Obd}Wp@fkR3*N{C3GAWrsuHk_o_&y6N1V=Uj+m(SJ*J*w|7cRal^CqT? zRq&tz$03Jw#|6n=182sm15PRH?=DQV{rOq2FB4gZ9>~7UF%UO?$S3E}!>Fa;jt&etnzRl5y9U@$7p;Pn`&puM+St>Yi4k1!7t$QE4YL+m)C> zKg((#&0#U&sN|5qsxlI}BJ@YA=5s?^_Clf)x5A>T1}=@m-IzZ-(=?=Fk5)HAt7or6 zDRNP%A<^_&XlL;-A2G+AwWRvxR8RZ3dzQ6478jo(7&yKW0GwX_J{Q9W5h^foF)$mn zJb~Fi7q2cmTHATDgz-ggXui5~W8tfpUq%7iyS4sV5@|*ehl*&EqOxVO-h@S+p2coZ zdpQMRpq#{-9v(Q4yNdRnzmgQ;0-;2|TI`xPVMiEc8t5Aa$-Jw4{H~k0XWkCpaN6d7 zTgGdIhi#u{Rgwb6;UErR|#AJeRVo}c`O?rkFJ1;*WDo;Z~*nKgm?oTJGvXVhS8Figs6 ztPiFXW#n)Si#;$-MbUij%~{3q)S-fNsz>0h?;0<;$Xh!d!R%>O{o}ZI+w4BQIE~>U zB;%3B+(R~3=BQ`2EU2losy~>UPRj1^mYOWqsU59U98?faV!IJnUc(|!6x%0J_QtC4 z4MRc`40N%-y;X}FonFI?#9`J-1F3Zm5uPk@?Re#HCYoaywxju>! zN739LG-$1<^?LBwBMz}`xonWd_AT~qx3+TbT}z$GhVNuO9X+C2Jy`H~cKn8aV#Wo<7!0pMX+Cb1EoW<}Nd3TVhR3kBngqobZ;-rt0 z<%xPcHLf0J(E6oEKdxD5-)1Sz#ymwTR}MCc+0HkyslD-#f81}pqZXp2eq(UmdSDB= z$9=EMe@2##IR3L3DwXklfui>jyw7A0D`Qxws_g{wb>CM;78aO8>@Wm#T~(>NUzBu_ z+d=M`h7%hq#iCc&h-T#J^W;zd2<+|2ge>IPZM0;u8Jn4Ow_8Hzy0#6^J{YUXH8>YOqiM(t<&kR zV$7R)%QbzB^4G=59>!?jP_h#sWD&BPHxYI&y&J_p3AA7L_v6bfDawVH#9_(xFE!u+ zaQ_h|CSMlf|v1A{}-tqI@WRGpPRtOM-Z34Mp3AV^=zlF2a@fuxKM>QQQRx@q>!@T7ht(d%@} za=r|qToz$^fy#M~T%1m}EA{*(S9T=b-Er_Tw4}-12AIj%!P9X5+>8J9?j{Jkx}cq0 z{Mg$4G!dq+5}hV19E?m-xaIxC46N_+vNMXfiHM6+@Rf@p3F2&?FK5JFXKnWbo9}BB+Uy)OKUwh zs{&t4E1b5IT^@ZL_oT+|Bai%x+5BkfYc1W2Pcs^^AAHR6Z>Eb4Co7C*JsXHEn6z@! zo>nh+<4U#+ZTuh%k(A_c{wnNsU&QN{VA*{;S>5A}aaN7Q?{sV4&<2x@if!QzNJt`- zMq194G|998u~wTn?ZeDGb~uJIx_YQ3#LP6y6MFkWBw_Yz+rH89oS1QV1tsLax&@RUvOt??uy{ZNm9=>T z<^?&$r7!$xqsK2rKrfX-gh(EB+IAYwj(+M;w?4CbV7qEN*L@1ZQ3!w`-04^7p%9o; z%F!8#atKI%fQ~&;K*bx5RMF5p?#r88mvRl7F0@Hbi^+>P?GZGJ_UX(J;DR>N2|})_ z7jC+tK6#w>aZXvM38B3&#TTrb&=r?e`Rc`1Db==TYa6J?eWKy0S$x2CRrRVG2~a1$ z?k9lUoaU|w7c_EyfIJw!;Tb!s|5skffM8jzhu27Ptyst0wQyE{oeLGzI8f7HGvXZYiE(Rn6Wmvc2i=aR@F!jqF zsQQiv9|xEFrEis@6Sq$_jMVox$hQ{KzLP%v(7V#hN;(~#!uT#s@iP~_!dOQc)r6IJ z@|PUUq1$1id(V4H;j1gc?Ead*lOir>J`~YiGW|ldC(XuS*DWde9=eW7BIXEdx zY(K59tjfL%yr7U+q(d~eet}n;1Yzvl^YvFXr`E@=>8a!!82m6CH|+H#ws5ad;AoY$ z3wf~gyVfUyH=P8PlzK@s1)%GpRROef!(Q1QFDmDBAz*NJtij z2iMwPx^G~@jE;3_uQ_FmzUfF>|M<)~F z2m>t}`nDo1cY0eo;fh&m`Zlo+RDg6stc}&vhdc{H3|?a2%!?bX(hg;ZzWp3_V|sZbLlAITQp17W2;uR z0kJD;t%*7(;Wl0_QdYI&xvI2T*J${OxAEPW4Ps^8Kc{5;Z07tvllm zuCAlF5xU@x8Tb9xI#uud#&*b>QoVR!+Pw-Dq=b$ zdtLu|eNJLQVJpK64F=T`ega-g9nIt80eOLjL+g|dCmxsBkm}{5? zg}8$EQaT&#LbD45xOv`6U*HOuTAyJP?K^8#AADGwZG*UX;!)!rL6Jzo_b`R;8|TB) z98I3$#p|D6-4Thl44Grsn8lj4>c@mtV{O%kg;F$Pwgy|8zn{yw9ocba`^ojao@Mdw z8~5)&b9i}TxBV$+{iHM_-&S{2-zV88%ERA1mUbi-Cc7v6;SDnsAgSJ`p8qA|Y}m4m5wOV6^Y#}!^(stWA5|CngGp@UmnXTNmFjqZraXxT^T@n~izs@qAwm=s!CdZZo2FRAmS zMdi-8dY3IyNn;QrGlzw$jUDs~YYs@G>`E1c&P~^Uo5kIc zSYIRfz(`oT_EU3Rb9qf;K;EYWqtdi>tK2l}7g;NoFKL-=_@5H`GhDfHFmZxQH%2fH z^_}37=3l_iHj9j};V2sHFaoM3#D zt^xZ0eNjHQ?24}@x#q|@5x?dgKCFEAl#4L|+~{Iv{=|tK)|%tYO4CBk_eGlwi7P2w zwc|smulz^`gwu3AiQ`E_15s5ki%JJ?pII7PDuIW_smfa)0X1)7_+308yjHG1;SO_yk72GKr{V#UX92lr z>|9h1sq}T48CR2IulfTq6yFbX+&=UO3vF)(Gj>1SE>VA9*;Msl`P}-FTW4|BvVvs0$3|D_*>Lqs#qFupN}&BfqWTa-xDYECQXNb* zwp)ShRJ30|WdD{tC?;D7PQ*l1OKWrPN2#Z~Y|`J|RKiF*ANqrdeFOwU4<^7-$;X-D zGVgDZNjIdc;epl;s1?l#2j~^Fh{fOmmMk2nkyW1b9Hc3W~l|4$`-xus?RKESW!Ry!E4V&!>I(-+_Yuv2SC&3_pb;xiooV z@&`j1ajA}Tp*mKkdn{RW z=Ml*gW@C<}b4M7Dgs9IFccTzd7dku>|i1fTW z^(EZis#lLYKX*B@pXlH8`;99D!PB87PadeNnQ6MynV1#LM_USaUm$`BmTI~7-Kvtrw>9ou#)tk_N}wvCEy+t{(qo9~?4&b{sZdhg9O z*RM6lYNM~QCPwe$W9efHfGQ;>DF%RmfB+bLUVx8x0H(67iIc0LgE2R;vW>Z&p`(-W z$0|S=0Qu$1fBI*G`s~nOp`oFmpy6R*VZI{5BO)TeBOo9lqoX1rqah<8pkkwg#G1n>n70ul}4 zqYnTC03e`0G5iO{|85XpK7E9N{R#(<@HwCX74QWD67mZaK77-N_ zmyncFR#8<`*U;1g85x_HnweWTIyt+zy19D<{tgNb2@MO6i%&>QN=`{l%gxI#C@d;2 zDXp!mZ)j|4ZfWi5?du;H92y>(nVp+oSX^3O+1}aR+dlvw9vxp@-`w8aKRiA?{|6TY z0P??K{SUJL2QIWvTwkD|AfaIYgA3w|>*o!L1_k|{2?kwA5!TQigM``tE9TGGzct-( zq%2C8Sic;m;jzhBx5=;m1MR<%{l5bi@c#?h{{Z_xxK;p&kPx52gG2)e0Isr;EY z!&Fm;pKpSWwOBL z5vW-=dq!E;nM!BOT%X2 zEAcMh&ln_!R>G9dnVc-M*P}i1y*PD-_}LCVj%Evwz+-Heb(>#`5r+AYzzX;C@QOn28Stpi57uwT65^Cc#?aGI|Xu7HgvgbS4e&XVm|Hf zY{{h)xiE(*ItE1bCl%-#6jGA94H^r4UPTGEo=x~7T_WJc> zPGUu;K}&*x$h`HF+6}gbuKFc4+Uj8&mN!f3cU1R$G93#gE>7iIMge5sOpdOb-hy6V zUGS3!QLsJfIZej^fBc^7+%mJkKz2UOz-h+Ah*fpuUT4JO%{+5ke z!_q1ev2NKytt#e9N2tl|{ak4GBz$4U*%C=}-TFX?I-*|oy7o=zpwi-7WM#7X!I~st zyW4&~vFXt}7PTzT-}-W|22o7)i@}|uCO0&6z@V${->nf+&bdNO3j?n)!cLVj4-3s0h+j~*`kD^hkn;Rhf?7r}bt@kulKNM|$j zg2?;lzyK}J*m6Q?e9+)RH5&@SThe;k2Aq9_jWaB4ldng|HYDBa%*I-=x%QqUnN3JD z(PK$N1C7JkKqSJ7Q9mBF7!KgI1uEOeGMpbPtkU$002LFbQYI!?V5URPNk7HF8kUoA zTrGG-fKAKnTF&KSF9t4mYsW#p=rN#I9)0x~XwfJWP2u*>7?QL5*ys1WEz*ixU>}or z!yQ&bqgBuswqN4a1F*Zg^8<^TLXjXpM?dy=UN!wd5aVHJASZ@IPShsXZDE0fyP}@$ zmxeXB)_Dd(KG)E0pdgciKrbO~G4cb-pzsgiNNe9N7kP(yTpTjfpuOnQX_O{E!J$F~ zTdY-7t<;$OiOxnx-r#nm{J2uh(ojDAxl~p&XO+06pRqAqJ=McO^9O+NtU0NNgkPD3 zYcjV|{v^EO7O9a@S+gdb!!&l!a2lPR^WjK}?S(UaKXb_s@T48_e5Ix|FZE*$j+1T> ziy_wLw+WV`@=#!Ere4_YB+8O`(n8?}z>;K_4j}?emfdzNtCKwVj5*TACIREQw|j@x zGm2=DLmeb=9^w518#g17>Fgqg8Hrwm-^AHt@{d#J=}9*IGaO;Ab$G1}t(`Yb=H;u# zG@Ve_7h*R7;WtbAgAqze#+)r8?q6k^#}579s7EI`(TTWc66os*j7>}CQ-Av9Y}d_H z3|d?u-vq#F^)xJ;DRz2!H9ipd;EtR3mT5JwMM(&({}jKj#2e5>n<>EN?X$Bac@YU0 zb5%8-Bv*)GISHTk)|>wd;--4o$?^U*=e_#d=W!Bqdm=?TF)yoTdQoA%Pljb*SG!_Fd2e_SjsCK0Ln{ zMFMj*NeWr~+Ha>O>O6@pHhv>&RY5%InAKTas*Z8$)`6+0|1bLwQTpFr+WRBBdmIJ~ z&QY;cwP&ZwS|kC*Ygcg#!(ARDFO1bj!B<&l!*F5rzCQ#Kc@}<5gHnmQ`35Be+reZ8 zMBbu4UzT4~qpAO8E4BWM>vwu8N@KVSS79W0ae1hqgX|lWY0|b_)owG#%+9RH3m^bT5p|Gk#QyIJeM3Fs^NMi!~w7i-i^v0i;$$e)ekZ-%7LaYUH;y?i+a+dEe{*l9SuT)p2-TIzS>me*lVj)id0B+=2bIE{Xwi%cM-0G0K z^HDT^eyGD*51sqf`9*vev6jb zDVDG#`bz45AwvqqTs@9NtDzLxjJ8=o0m;=RAO#56(O;XGfB+C6r{0&g`lQ)d`xEDa z5T>%`S!0GvWvu@460d(h4ZNw4Wl}MpLTdgl@AGs}m(ikVuWsVyVbOhErPn^^pou$+ zHZ&a!wy}eIhM%_)yd#)*CzKczUP@C;>`m(biX~lJTkLgnTgCuj%7E^PLZ;!De!{jp z3>Hdd^KkRw8qaX$Q7qowgD-Yj}gZUSbiK>uXIatfq-{lok5Bv#M0a7EH> z*_^le>&n+-JNLl`Ck68o>eBkUk<#Xs>kN3g-j1lY@dyc=2_09we&!S9*|R+Id?7!_ zI7XDaN-;|sFRT|<>w427EraUc6uiZYkgf8 zU&*r6!x+OxwTCmDVQIAOhi%F54WrGJ15ofD%5mA?SZz@odcstdh#4@*K!uOa3UH6Eb4@BZP67XILuu65| z*$b=J0d3pV1ZWCDp6sd$mAU*Z$urV8M=~*ETxUEek1Q751ONKuq~IduFT+-0^@=rNwNJ0I2ED9P8=QYf_sULwJVJTW3T?WeZZ4Y?%=9ju>b0(`NsmKjmW`3MAJkcT9@Z2&Em3aYU7`+t z0**2k5`MSYoE@c2%n{JlFLjR)+?<-{%GLEMY8^fQ?99Zki)NSPK#X(mes)xG3c)as zMa}nb%kEngH{Z&{J{VZepUp)CsnO;k&60ty%9tJzL?Vndv$!CPYy`AM%%vSgR=7eS zBuAdTEh6H{v{Sp6VC9u{moKAYZHYwVVz@>z22XUL2huSf!_Qff2++3kA|<;Xo<9JQ zWO4Y`@kd(XDY=>oNmd+un5Km^nzTDf7&r-eaR>$=+#>A(HAZ1{c_7m`UqlT0F94$B zkO4u?L)IW2v{iZrb5$5pOmPm~ zjyuXJDYeXEVV9fATeHuQ#MnTVF~F`=pWnT-=?nGhwsqi>dLx( z?c(C$zP9vWBY0pefhG*m%G5e$oE})!<}?tPY!G^j^oUEf`4u~?Jly@tStWM)YVZ4N zxpD0P)4+a_n%S4T13I6fw!>s!YKn2=ze`3g2;nyz zKDxWBAT%*$sL@a6B;^AXnl}!!W!Q|s5}@Z~6*f5TtDBfR^588#=Z@sWbkV>f_HuEZ z=niC;uIP%8MX5Rf$ROiqs`DFz{Gc(jUi?bqk6dc^tgeR-hr7$kspi-vyN(OyPq(8V z;>9tDa+)YFD_u3_L7nqwSwCRoZ8)Lqn-{zj6pvVV+iPQo?WY#@|1}iJVlR_Jw-OF# zAF1PtT1aPP`8k&vE~vaBDYsp*qLql)>2ng8vbC6(98P5fg~kqe)ynaCsPpU+O6Uv! zF-y??3+sr8?%g(3GVmP2^Fw-vBH{N>c?Ut0JOT$vuF74p%d`9yD+-CO zUpX0B2Zh-^_vOft1~(67MtOu0tG14@^>f6{1`cRf5g6k#XV?yv_Srj?0k*Ij(hV++ z9$?;slnwZ5l*G6_24@!bA8X=FwBg*HK&i=jQv~xLD?bxST^L#3WnC2?N#$r+2;!)~ z3^c$4b1$L%mHxa*D3`;UVGLxLubljylPhT+p(nRjtuv_YF@C_2axp03q;4?Vfgb+i zU8qwVU6a{JaUOafoE0*dcVYIiN}U=u-bnr-_+m<>IUsgbrj%~2_JTCNt;0QGA0@O3 z-V|4Hp;FJ{x&PAOK^h+2N81Uod+cC|cWag#n?0UdWaTyaeUgx6vV&gnh7glnktN3b zT2~a&I3?)rpykCI**sOIN!f)5U5QCup!#esn%R8`a`*=B-8rP@d^}PAdoqz&9{sI2 zVso$fNmg@l-rRZlvSQ;<>UN63!d-Gu1-Y|IORJ^?Csntc0QJx!>tM~i^)?HhYOC!_ zFIE-Fa_rdZl-0`H>R=72#Ld7ZOLR{ioqyl8^n4d_7E8Yq@E52zqTby@OA-N(g%Q~f#jKp<3AJ0bO$^|gpQhtz5KgP zeyo}FEl;b;opne|xcDr5$BV_2Ki!Ii9miEdf8Ww9HFWqWLS2>aZgv^vG5(mTnvzUA zHg>gz?GazVOg7^plBr3~Z zufw-tB^MJIg||_JwGmLpksIjA@sxcoW32i^XV*j8M1_@fspbmYsaVZqh@iAG@&F+k zcY_FDYMq)>eiNojBd%^({sxzIyKqfA`C=@^isePl0j?7@x(n2wZT^VJj27gCtn~CR z$?jh8WtFR?=Jadv?L_}R0B;`pXJ4oNRY8Fhm~j^W${d$~Ny}4Vh=rv17;dvSRSYMz)BMq1}~5?hGdL>y{Vs4dcBAnU5Gd z=KnZu<{YFfK){V)*CyR)$=eB=JF^rg44L43`yu}awM3K7B(#YOv0NY%n{XmCyj;kE zWhor|s@P!-wB$#$0uW%RZeL}VQ%N>uzR3e;iY+!MnmU8xhf~-YabQV#!K~jo?6ZKP z$&&RDKF$i|Lbqkw054PrflNa;M^$aAe`A-@!#%@I`><;Z;QMk{C|1M#Nh(#A$!&E9 zIH=$Bp0|JV&_|midrMeD8R%Qer?{I zu>7+;0hZ_WND~*SkNc^Gic-9_Ao`ZQe1|%6ZfHzK!$fLVCa%-Imo6AmIP=6+ij$U+ z%z-Al?`~5>s{sZ|ZNOVPa&c-44;SZ#zyB6Mi8>BWrv`^Haah z4^iWpI84N?9vqK-R+->fau2$mjz2~zt^&{A&ys9Itp+1pO>Ae+v}gCPD9rMzLu&VB z>8{`@NGz!sZ@2njoy6n~Gnw!R`{bSI!1kTE<<0Z*(c=?&`thKu7y2~h6E#vuOQ)_7 zrPCMxpr=TP|+X)*)(f^etS7 zr)g7d*Kok?LQegV-0<4XQzn=Kp=cEm5oP@v+4ozO{q_q?#Lf!&BdqVC5hx=|MrtUsXE6x*ZWs7W;_64=MRmBM z6JIl|UOL2If@w$flLNgO+)m3YoM=)D`;Py|ua~X#d!j;hLQ=Ft;1WncYbIQPwTx;- z%&}`rFXH3ZS`=p)SuHPLQImh?q0Ue@Kmspyi#1B4** zfNbUPGFy9-tz3!l&Gq%br*F6VwQ+5Is+p znIf@5>^jTIaW9H)n{9i4+YrpJrN=FG;`;!6^UA`W&3E}>2B17ItA^dgE7W@AqdS0< zPqM^@1)CW^X}pvSv00QW)qS7!My{O`t$za1y79EB-v2fLL3j&R@y=H^OrrFW1>e&Y zZj?28+9wSI9GWi_26uhYdJrUSjk*0Nx)eSDhhi0)r^6P5xw1C7e5*}FO9YEJR}`qM zCHPRdsmM(4^D00rvY?&~^D5i;xREYD8ektkQ^R8UegKfSEpgzki+2YYRcN)Szf$Nf!+cINy3d zUU0{1^AkK-ye$&Wt%(@6x8>#{ehNhv8kBM6s!W!@s-k6SUjr80^ng(F_^d$U*Sp$l^{Cd2B99prBqSbfag4n;U53s=Q64Rb9K7*oo| zH9tZRBnxyUvm(7It>LJdN-YY-LYJuV`?<9h@iNQ$q#c}?8s&3!rgNJ`R}BUy7dl{P z+wL@&>esETjrsnDhRpEHP?!(#OmCWja}6?~8c{~d%H(;Ibx4B^qpM$F$Ei(sKU?Z6 z)QgPR3g8o?K5be#_!~eP-Y>9XeHK0XrB1)czN4adoJL27xdtVU(c5FrQ=+oKVfdE2 z^URxF6tKSPwDpu%1(u2L(=x7id$B_1HbA%Yg}-^h=TWr9$9E=AKwlc3pq`3UIae86 z$ee1?oLPGe=l>OEbwh19vHT$a0Jx07NM3}42{2~a@Wfmq z8DX9P6I|W-Gii0-+MW3*-!b^8s6^9)Aj{?7L@^#0OYy) z38@WKB8tCmPE=-bn(oq}s>*li>6rS?v8^@aYBUE1BqUKNkEN0Qb4 zp79seB=r5YJXhIacxf{ipC93Ia3;Ny4B8^;Vp?MytA&^l)RpcaQD5^)P&yPwK)$MW zBp&9ul`uv* z@>S57d9@8b;BlN*+=^@H-16y}$yLDGT4QF~So5}djf)nC0Ga!?f*1?*(q2vAQmHQ1 zY0bZFmDO5*0qQ(6MaXVJN=I_DnBeoMA6cJ<|4 zD)V1qO@sGOPC6MT;{sB6Sjx26+NeN82a)q`9qi?-W~@1_m`t2syMUdRH+=clfcYf$ z2!g+8m5B-QXeN3O zxUp973P*MUrEcpk%S6K@%&W+aWd|R6fqJR0WgIGx^40_<+C0f?a8L9A;&(xH-9=?s zpV008K0c^Gin4YZuPecd_eR0LAuXhAH5`6yxZMT@G9Xf4-ghkZUJu^0ow=q|7kpG> z18xpT+xOoVGrDlrcO3d%_tMxZGMwE!L$4MElOYVJg6uPIIgn!xjrbpcD&3yJ#33t) znRIF(Lk6frb+`sx#bs)iif0_LJsk|6E%iNgI0&IVevzx+N$Vh!;419PS%O!t&;aaR zrIv5Q(ZnkFJ2%XAwIDCDD9>8DMxBj}56SGZ14oS*u}c@{8%>iCYebuBHJ8p++Ks3A zw_T%ZvKjuo(R?ZxrSz;Wxg4z37EIuJDBPc`OJ-jspKE)UJQY&jVfAyxN zcvF9tu7PoZLHfZ0T#c0iTjE%FGZ!2&a2Zj;{Ne{xX&c9DUk;0GDQydE3`m2aO1g<} z!hbFg8eWJfkwr;mg}|Pu?KaYK*w<&v&rOl!jwsyX7V+(d-eV*X+!o2&)<-e33>Rln z7&gGIc*B?py6b*!Bptv=qOl}JLCsoeA^<5a>#ZLt7;4XZ#!*>&b6HR18<%RzwGb!G zU71oBIjCTW`-|vE+-ff?-GNBCzM6wQP)(R2FX|9^{(ZKbJbM7ol6W zkaC@Y>(@>C?!a)f7;B$%QFv9%TQd0KIO`Z3@?qPQ+X9JeN!bb_kEn#B2*sRVkKK4X zA=MAu)=V1O0Y3UETSRx{U23Bsv!iSe=Ra@;YHCkRiJT`wk!c3_#3n6tC39K90^vB^ zRv5XE4HFW(ek^)<1-eK-XErP~G0Uh7PKJ(VPiERD`*PW;v0nx$eT4SxrSo`OWm{!U zU1`a35Yd{x-$F}NxZ6ae*YSmaHIW?~#N(UG?P(3(*mnxLBjpBGWokwu#@kKFD3#CB z_UP_H2m4l2rjn#Xp*%wb4|8H)KLFGyy{mDb)HK>LA_^ra_5)C-B!0PVZ5n>QsMZ{H z&b~&GKm!gy7COnet1yHn%9qj^wA(VUCU8DV6SnzV+lLqtW0{^bs%w>UH`Gn=x)5sr zcu>|Dy@QYHooVb&iQ#R)2u_CQj zR*d|LH?D8gJwx=&C(^9gD1M(@3PcI8Z@fh@# zjX|k6jxcNPyB~l>-97A0)8Dy~PYMo$fQ11{=6mITIBv8s4mjZskFLtiq^B1)M_I1u zU!TJdDQc-XSd1_tbFLe7c)CupCg8f4+*x&K-Jt(#QblCVWg}^i!t5$@@j*#P%PUd; zE6Z6s#%G>FC{-kq0p#DWiZvn?uE zgQ7<|_-Ne58(QemxKi3Fsr~+x>WJj!f{RXMlY0svJ^*2v!;?C|_YS91_PwSNi9sp9 zlI>{T+tLFQui}Hrpj;pFEOU85{ETRi$Xl4k$bW;htBY}equCaOzHUr-cqkh-2{mIH zx$th?VLmObVMPD|ebbLgrxMIPn|8DUD+G&qh}gHdXL`=t2k({Sq;>=18&fv7bn6H{zGJ0>m?9yqH=;z?@m1h za%;xVmrQCsU!xw)4C7a;(z(dQ*uIyOzvQ|z~8ADe`CccdGce8sRI4ia zj*aGQqIK`Ik%0{{rE!M}zcoOSz_tqA%JTtkzO~+?jY1!(f5bZ$(!_5DBTXCnb5mzr zBvP2J*RrR1QPJbcwRCH1Jn?r zWg11c^Ag|$Lq4xVdD!fAiQ=L|M#a>zZv2GfECGW>84(~R_}999+QF*EoN&ORJqwZC zVa;nPmzOwQ3wa~wmRFv+z~9P5*;QdmMV4Y__ne4gKKm0HyfC?UfeJ@^x4(n~nCBB; zDFtRKeXWF9f|*erA7o5#Fdd|J4#ZkFa%~kh3s^1CsBBYykVXI(>L&7RB3P(T4d?F0 z1)n3+Ybf0ONb!ay8W2MeTDK9P?^=46e*0wdjBYCIu+ zlE!8!aZ=|835592v|Uby5-(VR?8$u1Rfw#(_T_y(DGg(1M+=VFC~>)`BHMV#EDuvG zDQ}0K;c$6(YlOfDEmf#z`-S4BKesiEk__9SdsP>>Ig>lk#O!u`8QCL#xJ+yO`uZM| z@@VF@0it(#_t2DjzFNvVNVHTgbEiGg+Q0YSonV5x5X4r~V;q=tjK|x|vY7pI$%Ko+ zPTme%7+D@pZrQ(gk*+pKjp^5qV=xZNE~#DM+} zrQB=dL{)h;Ttt>IP5*mjwRz*p~zC<%YVgW#xpLD_2I-T(*qN7%f zoeT@JEdQ^F$md*~uQcP}#5*2$5Qtq{dX>gp=3B%} z?RV-r<{?f(IMS9XzPJa)E9}4U`pt~VYS$`&QtoTmnYIpxZMt$ByiE@DGFk~a1azjZ z%5Uo?P0crj5d%U%202*ZOb0xTbX{CQ6{yLtjxdy2T){J{1p#ug#?sQB??$=Y-C4(0g|6F-wKRehBt zL5Z-&sFpJolR4GP@+G=KK$>D8W?}HCKq^^u6p!jA@=|}9TlmC;!Z(gz$lC)T9FR@~=+HS}6K($6;clKa$nPg$WICH|ZJvUtSa&%s{jtj-#-EE@6%2hG}(={vw- z%PPg)nyX#24wd zY$#z^d@90M#G+=lTZ!hVEgovr-uQYj--~+M>n{o8 zDXaCKxBPLxQ+|WyVM6L%N>2>3a`VF#Q2x2W2*nbnRi~}2?3E`Xdk^k)7 zg*t6`KI(SOHKP5Q+EReD?Q}6701GQl0ZZ3sltOxJB_|203B<s$e;(3OJbLy ze?<$mqx=vx(}3LM|0B1G^1W4b$0$UUSHC~#y084&q7iS ze|&Gxxn%Bq?tHQJx%^U=hGxhnt$zl~e)!SyQay{T_i$uWUyLD9qIZb0!84^;3^@hz zC32(6ad1JcTmWFQt6`L-V)g`(hb3Cw2~=DWjI$*I+>!2 zhGDs>D&7`G(B|xcsxj|$`#`+UGwxnji+q;&=|n$1wVc}@kM1Ym#Db9jT3Q^t{9+?6 z!Gnr0X#n<|52<^}-T?1nBHlv^R4;Gi57UhEIV4CDe?iPg3BYdzDur)H4U5S`2nXs1 zvfP6bvwJvvKpZJ0n`nC|qilN82yJZmYeUUkoa4@plMN%Rfxdrv=dD%4HRHNyATsB< zqlONwPHot5mlLsMyo_Q#&tBiOWd)R{FF@^0VNGH$Q@eJPl>$R$t;j`|rjX_5piTOH zq^X-TUBty|?>J4g=|y}YwQ*^y{Ll&?%Hx;>&D%B?K_BZlW*4@=0xGo2YL2rUgB1`C~K8u#Mx?} z|6rua96iY<-PBJpevLsOc&2i7g#@LeGh)jHi?KmX36cP&Ti+t5B^IWo^hk*#X-em2 zq=hN|Y!<7}ty6iP*O(E-j0AgzAjj(F5XnP!{{r!p}H1%*-JdYNeSk3VT4zl3alG&8*No_wThB%bQfE*+f@9izHLdK-< zPE?AZ%+W<40#!l-iThZc*g=<(x?r-OE7yg|++7KoL&xaN4qDD>R3iY*>bC(zJL2s7 zpe-6_Q-u8?Q`&4I-g?TzKi+@yIc{T2+T~#ZEp+~mJC$w@r?R=LTYiczUU>vj)b86+ z#?BD#xPVHZ#Khdvu7`ep{f+DdCtOH2ERqcAK(B!-XC4g#kMJt*M)_92q?a<*C{a#S zr<890FfoDpH?_H=wLP|UQs{wO8PY}vJ_~7G*|QPa8(P1&2|J1RhP<*M_c`Ykme?m% z5x?@wb9iPsMy^8#{!E&w==KKA{k*9uT`fAl6l2(BYP8B##>mNi)id0uV2+(_3-`$g{(S%B@xF(z%+{S9zN6XxKFWS z*b*=^hcI@gWfWZF<16FrnK+0`oR8Mjc6*I)5j%w#^oXKhmO9R1!0o~!@0ep=&2x_h zs8b>%`y|NPTO*ufh*b<;`DY)=B>ZS#?i*A20^^EkM*}|!wCYrFWuA;fu^I?@wb&mF zwc3hzT5LS>?=lw>NObg|Z?bmZ@s{H>V!#~6FXON&y=zZegvkQN^#Sn0|73R7$a|snLzkxc(ey}RNxPd_ zIZ9S$*;Zp#=Nor#$RINE45fUOC>qHxAIRT1k6LDv(3+aSWfgKIh_Y90M{&LnV>35` z5jRJL8Q>h0IzU8^W&-^x3(&T|#aen4mVcj^=ADjv5E&EVYlV11S;)nlqgN^1vq_Mx zXb^&g&GM!8AENGJg7;Jn!Vi{M;(IJ`QBiWmhH}Asr4D5tGjTf47x82}H@*%DI= zran{^dJy=i&a9(D68(0+*nwsOEOZVI2jmLJUuVe={vA#-xvVD4d|!h1g=DIUh}WlZ9Nqqc+Kdrusj z+!0a#E@72nK(IIG=vGFG)I{uJW43R!c3#mi-mkWus{hx(Q_cHQ7NlGs8Iz(oG_k|n zTxsYf3KbhuIZWXjU1;u9;T^9GzlTVQE_9cd;K~QTDO=MxQm*JHuH)d-z_X&Y=W~GW z9Rm***#55f_h#TnQJ-|i#kg#x>hv@UHRY2c>itrVIzy#c?a8#QiTHKvz`i7S?o(L& zu49DmwztSuW?9S@)Qr@&x8mJ7VP0H)ATE#4P|d?&GuzzXOWCT?K*eI}Pu`Y42+7N`wXa3K=X2eospwAn-((;veS4nbsccz))jGVfci%-l#8wK@WHc3eg z^CdrMHY>M8L{7Z4msTkvRn;@gK31-UiiB*)tJV$oNXLqZSRm^1D2TK6`f+A+G4`I+_W>|AuCJad33MjsR!EO8Q{o=Yx>x)o zNv}HBc*(`ZQH(ODYF>eP*AWV?JQ93Q{OPWVgCELuEUVx;h)21W)+E>Y`t|`BR)5L> zuHXs0A#`4M=)VijXN}t}{cF^JD9o>GFbm;Wu+C~T`A^j&gZFpqoF?cHk0y)!sCsVI zvseAsMBfzJLCO!nU)Oi_&%A4h@MllX-kMhSi={l;nf0)1qY{X~q~_lF z0|35wm+BmweG&e@tnh;>yL$9j{XYu_@NBU{t(B%w9=g~PTWTV1AIdXDGdBACt2GRa z7GjHZJ9j<+du6Y~?!j`M2f81C#N!XZHLQwkFBPnE6KKtS2{@9=?#u48Y=+;$yugZ< zptBd}ITvzMG_3vZ^J!Z10bug>rSiR@{{W2K`949)XfhN0SrzmaS(-eOjT-@v@~|O@ z;0{yByf>HktTWpS|0AK|8oE#^QTM%m_yCYcKmBdIii^#+`MJId8Fjs2y&f))IuhfFYOkS&O>u-cY0vny1OO61 zMwxS~F1~jBR|unD#Hs$TFsN)XiQ%Y)j&MJvl;+!5MgAO}ee(tl7l@2urKx`aJcQ+B zDVA}56MqWHC3_Vg00G}?jSoP|duM|0|G0t_7wP}!gc0_Q{WJOsAls++`cH~r^Ub0^ zSssvq4e-3uoNZ5Xyh&0c2-h2^`v4?&K2d*u-p?7ekMM51`J`9%0U&nfmj*uh)Ct_L zegG;I*2Czm7i_ul@)+uv_|NUrzzc3EF?hi|sFsqM;=#2DptG!ymqd(63wor9qxyfC zO`X}X>%s17#?lz@ZX9w71zaW64dmtSbosgQ@~L-Zx|05|4MOh4$qH~ox8)bC))Nc- z8QmAS*%F?F1lZToD}OyIwgTo$HYYZhju%$Xk`X) z7kLD6yLJoIT7%TJYYh78Y?V;tQr{C!CCfhdqO-w0F~6Rr+Ydle_Du04#lWEALRqA{ z(bT_b0ww0RqEWyW#xw6B%B?AsH_fFE+Xuk?{fAG;ExY#zfKmS*MfwBa5LPC4 zCI3YX;s#<196rSlb>$*xi)8uL6D*zm$s?Dec|5Fiv~edO_~m5Vzhk{X6deDluywZD7l~z5kRaRTZ+9Bx{dTxlrRGp1L`jZA?V#8((=hA0sNOit?jwAXg>eP*$Mn8KTx`y&d^EK0ft|T0JzA(Gm}O9A_6*bq zszmX45x>8_+6-yey?l8Q=q;2^aT@=Lm8?jO&Ql1Q$H0S!Cz1s70=Qq*ZOLZ_;LAl^ zC|R{El#6IMaI6`Y`CIR>2t)~FaeqyGWDG9tSvRCMb_k^E- zR|P1pl)~t5nAs=FL*q}eHY)=s3eD1<((X1kI@=_{%%_7($g(Dn+0y?m-~UOFK+b9%gBTWzSDEw8k#(&wQ&+cqb&;p!PQsC1fa(6qq5Ufx)p=+U587$h^=+A6`rDrJ;35JM^OhW-FRqh9HUc!^)J zh=j;rhlEdW-$UQ7NV8wv7Ic~(1nuo9nAXeGMWE|1k(o8a z1R_0{weaXh?So8Co>a0l0E_ebb->ePV7PVem3-uxkuHhqI;fzI)!G3?(ugz*@S@;G+RG1MzmKU*1Xb#4yVshhIa%>0ql;k+E^TWP`wX1lXJt>W=L`KnAHV*88I3#*Sx_ zBoBYg!7Q~uI!R!?SWRRjAoaAX+#HLQY%Zoabxplrn2NbIN@m>N+eI_&1_oy8TCrMc zj>tMqH-M*};Fmmbi>ZG77%=B4D_dS!e2Er)thgHN{l|A%Fp-#V_V8?VBagT@QnK&$ z`&pvTd-q8_MN^-Co{&$7??n1E_NU!1)j=TDm+JPQI8DHJW%~i@L*+=a8SBk5SMR1L z9Jx$x%w4GnOb}t*G)?2?&T@S@9FzmB)m#}proq-h4HkLG@5GQg#BgD{ zyr0n)kA_!ii#i)lfH4RZaEKL0F!stmTBv_Fd|D>p(u*u81mCsz6YeP&(Br<9fdbp8EyvlXWqD+90|zx z)i~p4z5k|`Ml$)n=zCjqLu%1wOaxvMX?x)kGbOrLOk#yOrFZZ4an8Lj`R*p#&w>eu z3a?xumI(CX1B7+z5#Se;8O`RaX(LVd@{*Am`Dby96F0*mSq%ZJ9rS1L!`yW9$J~qm zu0F>ta)HH!R*+teD+40grdMQg3OxqPxdtto9!k|8C|fF9*Ns+e1mY0|R!EXYkAIPjeO?0Z5nB{-GGc2;%ct^*kzY zUS`o=Ah+k;=IIyP^jxUCd0heCNJAJiQfub|r^^^J{G-|E-Hp3oJg+o~au{VqP&J4_ z37G5jP%G3ZTsdM+$K|?DRPgVZq;9?1Rz=@q;($UsHJe)p0b|pp-y=jCp=B*Uyu5XM zpr-NE2DbspfS@H7*Ll1Tc`rnM?ErXY+RrgfTP|$8AUqs<)*CND0_!)i+Gm1SH zv3is^LoB#*Kg%O%h2!EC=T6sa{z{gAuzLTvDSL?+$rr$ez*?dvk*b(T1lQ>%HU4l# z7wGCY^A8DgxQIt@oA81zBKc{rnH6YgC94}N2KNd-aO-X+4vc$gO7;drmql~-6A?K+ znQx?=0X!zTIg*cEZB;Uwi}LVR-}lli!h9MU^Y-+SS9=}@EJ+4J*S+k z1YLo$2nSIS?MHy)>@D%EV*Bxi6riWx)Pl{&KbjIQ{mQV82lq6&3|ns+t4&%fyt|Wm zY4GajYv*=MLowM?{p2m!dKCRz zJtdgxmB^5`GNFB6G}c#iDA2WH!-@Pgye+Hc%UD%75N<$0yk{7dNN_Djo}7r z)E1_Hm1aFKsZ{K-`sBQ#sT=b{FdA6LiloZV9RZSbrD4TgY?!5kJF~>qnNEl_1XvVhpdd*{#XeDRJJDwYPvs=H%X>FFPZJ>mi81 zAS~XE1*OwZjLO*k{ua70QoocttnDon>hiD>QGg9+Q2*kauM<6P8~6RFFocLyS4~5) z*$Yd^$~fxI*Du`#@|q0{K45JDMynJsutpT$<-T3<)-xg~!ulX~oon zJ%%uCVE)Fp)gu5U)$>kC%S&o?+}T;n!WZTfJ00GZLm@1i1z^L=NA|2vLS0p*lwY4r z`7h#K1=jmJg}ccQ6>j(2_f<40C4l=v7za=<55JLlhnE@F<%Z;fBLGM2WW+9cX&Va$ z$|XPVzTfp}fyK6~gq>=kKRo$EcvI+hGuV2cnmH^F1I)}(gGf%cvP5F<8$*X%&kJrX zOl-Y@uOltv+Io4ShyOCasX-D7<>(gkKi&2Jz=f&T=9We)RmEC#s$R{$NUc1@%?niG z!*l$)Wqw7XyRH=Sqe;mJa<5atc8tRsN9jVPOkdIED#+OAE1jUk>w}D$>7%; zi}1t+5R8?usk?1sFkp1RLl0f?Mb}-k zOVI;7O+Y4k`5eA&Dwp8%d{u7Puk3xucODGcA={PC_R_gc2Tr_qnz5e#WuVu>O1<^j z^@i4s=9*!PNQ599-CQkjLzbKpk*%r@R3v2-RJN5tDtsB9mI>vex0_IsszsZm*RVD%E&0iRI*5h6%}Ms`dyUovCaQT~ z-CF6C_w$nqaqZm@%v|EOb+_qb&TsR$I%>2-Cxvb4ALhV72`{Ic6ha4+$F@m5M0JYU zo4k8{`|f|EsW(l&No8pn^BJj)u%>O-uC=o747`3Y2fG{jp0G+&v!kuYJZ2VRpP%z` zaUB_NFMIR>kvg#WWRV#R`dH&xE&DsuMj_bqRUm$QeCvJo`mU~tqV*!`Kh&NK-Em{7 zmPk0O&4pwLP-&m%$fA0U2c?DMXYOT3!6w|KlfP+P-)+4Zb%ImKA%!7*b^(aiiD)tU zS5pO=D?8nQOU8&zPs=5HLV5L|cU{0*6G6 zyE@NqKhM$RX0GjWlH(7@Yp$Qz=_cC3_T{ho&-%xatf2@XkQOou2j8Yp#&L0~Wh3f& zUw$#ENHLBUu)&m4}gT|LH6~Br)ob#bbD(qcW~`D zHvT!6^Q!7ZAg5H6B3z$dOL29;7mqMxDB3W%amD@6&=B~2)jITxo-njQ=3A5X&S$>2 zwTvxO#L;-9k5uruK{|3`fsbdy_(IxK9=9PQ$VVPgIBALrG71fWl&^h~t%kD&#qnJf zgw8Yig*{TZsOM4Lrh;q($DZGUYvKiALVnH$Ggt?9)!fmp;+YmhD7|~sv~Hn7@uyW$ z2<-!qc-?box*zik1=nq*iX&o4R?@Z8rBBZKNoHByLZ8gb}DGd*RDZokc>?BsvZdnA|s1@O}*7D%+yT!2@2W=2vf#6W)1o}CEcE$SlU4$ z`e4NAZD&=89%@&E>TQxfU+}-AD5c!1{r+Z;gfhd5S*MyJ#o+maIRkSgzDLZF1s$C3 zsTaOf;~+t$UKy?oT8ojN1sYz}>mVPCvQyX@D*Vv=6vM8bOKnz)nU{And(*Z|0~n zd2&f9n^k^$AZ*k9eQ3mq@KMQAm6Y`R^k8Ztu^QVMrgV2dAk6T*@uniFXzqqVvBX6H zw@tR(SBd|U#v}6rC0ZFO3AN{&UvYCpsbp4WdJI`-G%N>&qkb|92zt4A`F)%0a@P^Y zHENFmJ@n9Il^~*how7cz_q)F0f;e2>`>XEw)ycV8_ZJf}mpXu{i#6J5V}uTNJpsdv zD-~V`D{pi;U+4-^8*8NTxOw@XW(~ae`@2fC9x9_0hK7m$Nzr(WPtz~?=%`kvJjc4W zXIJ1GX~*fuhflU;HHunx#%4A!H3#4Ftusk~DHF7s$psp6RF~Hac)CHs^nQfcx~^)2 zvZJF}MObEWW>V5NVn%oS;oF6!web=8Hb}kxtN=3y?LmRTd}mUG)_KF2jZ-nWI&bwA zX!;U+5K_tGAQr@vrzi4z#Guzf zk3J*!(r+hnCTWL2))}8SB9(em!SjM0Y;Y+i+NONHNA%V;m9IXtPAvJ3@!*JBE&NZ2 z>mteUOyq~rHy*PxOr*9@5xZ}PGwl$zB;jXJSY z1S={k7IX5+>VXQ(-G=VrC8eI5O9=Zk^B|t1Dh8yWC(xEw(s*A80kMJ7Wv@j?5alf5 zwiyB=C3JKa;<+S!?7a8D=H&9e)*Vvs)?qkAMU+a&!Y{@h{8N}pov3{6qr)SLt~B?t zg4#~ktSC&8A}$9DqtZ+l3-Do^1nX6347Q=WcrH&V@zus16MCKv{R2BN0coH&9?E|= zFKrKoq6I0!@YbEcHr? zB>c{?40XYTOPt}E=}J*IupO_Nbf{?liouK z9RULg2m}aW^X=~0{rva*|JmKM`zCWvCgsh2W}bUz?sMmS`g{>^MNdmt3qV0Z0eC@v z0M1DOHY2#LtH;Z?HcHoxoE+Y~baAygp9MSsP+qw3_mg~4k)PCb)YMc|)R$;!Y3MFr zx_p`b5O?{D# zfu4cw|M)up4q&DOcv9$6QV0MpFjG)6Q=E4I_yGV4YBGkuVf^=t;sV)58d|!Gm*~k~ zsJ;TYKtV})fr|2PtI6N?BYzH{Vy0%faaV(e)$k>)fHRx)`{)ch!TaT{>`zBm#~QF&0Du+<>VFaDJng9sHvr`qpN3RZ1T+1%-q7t+Q!z--oequ)y>_* z)5|;XLr`!?Xjphm?B}@ngv6xe%&hF3+`RmP!ivhO>YCcR`i8dlj?S*`p5DIEvGIw? zsp%Q?((=mc+WN-N%`N=i{_lgsBf{~?-?%6Ml>ZIZ|3LOHxR}YfE>KZXQqlg6i{gR@ zxluAxQQx>r!=hnG`_h?JK>9r$+x_T_^45!jGEZ^ruilPa;t-Nu62|`x?Y|=X-vbu# ze}(LS0Q;Y~(16R76y(XHWCo}M&Wtj{Zvy^*wbJ{$%a?nLx02mLf(}w&Y>r7Z9dSh2 zMu&0TTtlnOey|FPQ=EP+nsO(9WqMt4 zm`Z&1iJ`-{sP*2lc8=EuR(KIfx!h8w{^57}W%F$etMwS`ujGTRH5Fm17#+cJmZu&M zB!9n+fQQ+58aW$B{Xj~L?wsCu5LM!R>AyBzvpvGnYnXF>n3| zl0?LcYH3`Frp;114d%JFRd$$bm{jhBB-hZ8Cwh;&x#nq>6OCBJ8y@XFoi&p7nLk5W z3tD0~H(&;GvWaLo#lqlLb79|m7foPN#uZbtvtVugrobm-JIm(S9juM{t7Q3WrrJ** z+@iXo(Mr?eL~y}xcb}|9wVfd#^|+v}h?Sz=s__w5A7D^RwQI1){-j5pO`Jxpnzg0g z@v8@?-Ftf^cXj)8cB05x3XxtaP`tQ0YbpJLgZE^;m2;kK4s7AVmFgb}?jy5-t99Je zBgU3}3HzuMnT{`=aT6&Mmf{8{obKYYZJ*$of3m>{~j;3m%j`lA~YWe0AW z$ddV`*!EG2r0lwAm7(Uim?`HQkAgt9V>L~fHe`{n+*lK&7?;smXoM?)ZmWT1ZwSd(5`TQDJBx*Up6}b%MW3^ zJ}E9y4FpSrw(YCM@>i1=2G$K_N4ku4etuYsdlVK!Lvt`>Xh~h@3n7HzPDXK_0q1}= zKC$H8Hm-!Q*ODsgd2<$;_J`43tv2S8xe8Z$?4Afe3q>ZPJ=PS@ELWEOQFzc2!`@a4 zOF3REYiYn8YolZ`e)#N;;wYx~?pY4sTDvcK3N#oR`?=j^(9ir7PIJxyJ<3S)qP)@V zbAT|yEgRKyk{f;Z=J10+mXt6&I(|qIYUjJ@{l; zPq>m=bRHx6vd>#2qFTO2hOK_zRG={E!R=tN9? z94?7{h}P)4tF6`A+D;-hsABSHuhx4cTyg|0W) z_r+8lt6&yKPj|3u7-K(kP2bd&wGo8FE)Bs?T!q!n4G(;dTdT&_DqR3RPc)sQ#@nJt10=(Dd)sVe~<6@aPqrF~nZ+cYoatv10SZCF$1lZstrB!mQdq&zmZI%6Xf@lpt2h5^q zYSmH;WuVD!E#=Vc{(OthLa?UL;h~gt*m|UNruIWom)i+{>0ITWQq}a`T--&PrZJu+ zsN7O*$*?ITG-F-+b!e(R&Dt5(rmHGjnl=XP!#}M>Ue2MroE^{M>#_pp^#pdt$LrDt z`Z}ycNYO*Rixnol*(OJ6YEuke+Hj@RTdK<|w!jy7z6F&Bp~ruvo_KAJrL5VYpt_F3 z%U=@GiQN8DPDch0cl@aHp~>#CE-&GJ`4%&Cj;wykgJNOv3iSzA>IqjxC1(w1?R(qG ze==B>B}w|rZ6R2E&6l95m)hGs__)WL9-cr#EvNQTB4?oC6CnVBA$=sO-jm!9?+Z1fjpnCL)nua;UBKW z30V&=78`zlbw^KLiAxsg@^}iHT{n6_57t{y%&zf*iI^MOAp3N$-PXBWTwL6&LB*%( zsojc*j8{{{1MoEUd7g-NezYY$Zm`ge=5}n=)E+pf$|qRxhi0_#!$exwl8*@&zBNhU zjk+2JbCxg+gxlS%EgT6JD706?AZesp7+Dlh0Xzx&2%lt1Agmh8yj*@3=>4`sR&#nO;jdKp;@1&sx73Ck zZH)LX`E_AFCl;N|m(@4=ZAl!~+GR)|flvkn&eIeiamXq&{MO~0nc;wcHnBib58gIx zS)F-q)7uG|KjWBCz92Zi6*H@oSRKHU^9-#q$>P#TXmAFvu~D?11FStOL3sWUNjH53 zt+C>&#u+JItemcswJ&;z?nw#k>h>MQd7`Rffr<@IYN@sZ26lsR_^RQ`!sRr>UT`)H zM!-DoePp>0kG@tD(DDAuTR&)BW?YC1a@?Pus5U8g%KP>l@I8&IW%8GGBvfB-L%TL+ zeSU>b(0=u%`K8bmKmgrz-Ot<0^wDx?W4P(9XF561aIpMIFi+gCz zS4p??KKhMpf=$>>XZs=P2#7R{1d&`w(-vE13gV-~!^5g}nYYszaiq#+UIn}9YS;r{ zfKMYh60A}H2Ifu)2an#-6--VgaTD|mu0>ttr~jGP*(P$`$Dfk!jo6bgheUYxV$2ciD>`lAAQtn)N20o*eHmfq(Q5UA9LfI}bW1W360N z&%S1mD-Pyki}^s>rYG+*>>VAp@*FlRtVqp(2{GW#MLG&tTQp&&y~q{rG$WW8-j$;p}ln3CfHOXmFaA)?Ims-5Djn~8?5#K*0Ph@K+*2my=c%53H2^?^uJB;BD=h!F3W7mdU+-Y{G+@;_=!rW z&J*45gER&uGWx@60_L6>*N6s7QiKO9aUZ-jYlBJ!8iD=~og>n*lzeO48ZT)W8JS(W zy)@|!whihom#DWTi^MLS1AcMy^0oCp*jteL)$d~*IcpUI_Wdfq6meIOXGd|{eBlox&fS6iFJ20u8sxBd@-X@Y&h%LO>=XcEBHj zOjMpOdR3z(ud5g&2WNHTHpVgn24#VYJW7pi8P42y;{VcHj22{CR@^8hQ4sHrODqR$ zFAaSteGz`BuXk^K7z=*7rQc%nokry%$Z?H?M@xIMFBtxXfJ`lrj^@9hedTZ;$$R{~ zAXm-WNHH@O;js+5a&*0qF{RUmw$&=DOcuSxiGF@sdoG)a=83eBT=etVl-SF|7Fto) z>OSedF@7JtUdKo{{YCLQc{($7mQqX~mll?#Pu1X$%$x3~&MyzcmOPb@oa1d{zfB`Z zo0|1;KfDj8-4;bfl=0cXAp)zIE~(;;+|eQl)Jb)-jqs$k+q+%sT`tJ($%evP67md3 zmu_ah`(N6IiaDP4KJHeH;4%)4aGrhn@=F+=%w!-XndcQ|m9lLcbY1D zWZ|>^3m}R~1&eb#kL`3?{W>+~;IP%?uZ~bhvKo7HLX%;oZVH;1oC` zpZl!4-FqsWf7z`w48pL<#aQm_0C$jIi8$?9wh1el2!|`Y(&>rnN7DB^eZcv?DDcf; z%~5Jx>ZzCHIUsOKW94lhftu62Yw)nLVXP%$&#!nPq{R>-p^K;OJO?ne2>HI9bVbq4 zc%}eH`3=V9BEk-$zUi)Y=iVQzi4L{dx4slPYi)1znPL!RXRuTvOZ3MNA$O}0ES};0 zIyh1WO=^~d5=XgPcCr28vnj1DE4UC`xyNqFMuMvlP!R79msi`%LF!YrNgp(D9{e!EC9;sATPDmK-WuJTB8#OQ zi@MiL#otjc{PscUO%b0q>@aD1oV`ZT9Q^WOXJ1sKIm;sIE~mgLw@$j>VO{wz61v>K zeQS=eJT>{Hz-L^V=2lm0%&h)t32bA_oi)#86X4Yqd-@plJ!)oX>3ubh$R`@v-RkY0 zR|o0u5DRS-Rte-@P=cU?tFQt3v4219}&NKB0Xn0k60p|8Cm9^ za)jgiQOG>w$x=`{Gj30Fe_< z+p)kK_^burd|0WLfO7#hR!#~BXt8((oWAfB5qw*m_v`+xI~(vM?~Co4b$U}fsAH1k z?fEs>SdC9n31Sg@w6!|}v5hMHS;p8zI9SHe%wouyuJfX*x^|-)A8P9N&)+b=>Z@xU z(OCoVH&`fBwCJuCx~C%JnDpX)$nwE1H{l!rA~fPsz?C@pIKFzs64o24DzMw3DG)i6 z0(>*2aM6+Uysj^CSvSEQv%oGqaZq`DHhKvb*yQBr{$*Eyg?(1L?M!%v|3uwLr7ne=h=jz3b2C8B99u zItOrPHH=GUSC>yn=zlh4y$do+(W!bXNVUY)V{KJS>1;J6n|myHOT8ld9Drj-Z2pqt zu4-uXm&63lJ9(e6?+t~h+wZaye3nRo@Rv(E#1|*p?ekKd=&q9d?RB(yW{l#8@OQ1Z z;$04Hotxu8E>5o3;RR*B22)jKd~@pU5cOhNp}i!_3tb_q1($%+e*%@ED%U;%~(tQmiZTdbACFY>}HF(l7ea zwk>d1;p0)z#Q{5e zeDKUjpV9JHy&r-mVR^n}-qBA`)3*~3>g2$1_%eUpwqzJ@vV!B8EJtEC+D>RviVUoi zeT#KZZHQ0QV}`ThSmcIMSm|mW7LUSW=llgd8_oesyX`P&N3=uw?2)%>gynz@TP~}T zmICk_7M}9rZBe8See{>$v*~&uP#MvRaysMm`z6+!-wiq=#qZ9dU}ckrmaHo%UQ6Gn z1O#5ySFvy_jcc??)m|SJ>IzDn1nU`;`(>IX_=;O0AC^m{u!bo(T^jk^+ix%Be-p}2 z-y~e<83G=wDrmYU((HbsR_2^Hj{)DT3ZkED6?kMqwO0?G1t-xv&4ydd7eP-f49)>C zZ|~P)UA-6s!d=MeTcUTmrlBRnQaUmj6^ycxpzUtR`Me-GX%#TJppzA^?Bzxa&8cPy zzOGe#8h8%46yqF6dm~NYEL%l)QOtlHM9BN@UQUS6t{E%Cx}Gsvo?0sfHP2&av}ST@ z1N-B6c(QWGK6fOF8#g%hV&I)3E$%Vy=Kv99W$-bHA&-z-wmEmyC$_;K3aQo(^QBy- zYm!&vHYoFqAA1~SG$|n~Q@C|UgQr68TPIwuCP6AmMx0S66*kQBRj1uW^7t$>{mHmB z?ilx_x3srZ+#+9biBdthz~r@(V#%hNa<)JP z8ftaX!MCTXTyS(exBe>zrQLP~4pyX}Y-2}L-Ja!O?{ba(ZmPL*^FcO@AD6@}vBx!O zxE33gisJTnIChvdgrN@Vcg9Vl9n<-oTruyS5Fhbz#BY{b&{mDSYSs|P4Y_{$-lp}W zaEK>NWb7S1Od=|+ewW36R80iO#&@Fvukfxo3orRaHVG>(3-g@^VKn@F#XpCw)qLm{ zdTafetkTso^|J>Rt!-x>SEV+;K0NsK3rkkpO1L3zWa)AJ?=?rhDz*g-|XWif(^ z5RBgX`3!BXw6B(MOa4A#a4L7g+N^`3LhT30^AcOZg0jH}2urnksKauKAG94u@G!w0 zmZDV$np-jsr?cH^1FQse*Shrh)#>9H-d((;YvKR~BS47cdWpTC*F({g2%EF}-I|lIDhbN&Nlq?g zviXk+Ld*Ec zDmM#GwRDhM*zK=i^28>5U#=t6)4FjEeB5@l@_gy8(7T8G2GN@q->Fw-8pmuxa3S=}Wc; zzfH2bDyKxX%^aHy0AM?0`X7vXPU^~?E89V=o%z#>R_74=cOe_AEi0i@C_94?lE5U! zsD7kWVm0~RjfToGH(;X}_v!~&m{ZC1xa;*Mf3dO(2E4n`_b$s~e~C6|w+Rkk?#04w zC$QQ38DR&YN-Lf=nX8HBUMM@3U$0b#q!6mmjB~(;EUk0E*Xk$|RUTpFPuns^@+ayc zb0@?=^eD;ZsBB*)b`kQcJ;V3TaFdivk%malaVPg>Ne|;4DyT6&`Om?~|)Rm*6a>|X~O!D=sXJ#37k+&wCF3|dw z+;ry-qm|p_{|{W1J&QAeyKOo}f2@1Uwz5sjZ{K)FxZYg zs=DK#`}OC@^mAR=DA;5)Gxv zlFbqs9rpZ{W$#rKUly9TzARX1&EG7`>OU(h#cWBi$9`08VsKVL!nrToyt>KQF*Ntw z4Z5g$Q7)C~8OObGS>UZItQuU&U~aa5%_|H!{rZ^s?f2-~0BIMOe^OZcpKh0uW3shO z+SpiIC+Aop|CKwImj1vUaMZmilnp#MP3Rktet_fbwR$D1R{Y=)cwFK|L#6(yz~AF< zN58H%cJozZBwdLCm;X>24W3k~R#5Cvi-Fcx0qHTn&R!k1sotMafCcX;dqqn=p>?jY zaSnMo5~`a1Pb2>HeJLv=C(|SKJtmlb<9=DQ_tB1(B~c7lLPS?pY%&*2xY`rd-M{tV z1*b(*DyU6fC-8w z2R1Jw%mtU;=8?vX=M36$wJ)t=x&m~Q&$CjA5}0dl=SYnCp|>NH{u!CKvvT2^9DD}# zU8y-Y0)CcS;E+Cj^2&a)@@E5<#^0o=VpFKP<5S)5k^+ z+iJ?tJ%AubMy`pNxx>hVWI8n@|9a)d-aS1_FZS;co<)jFDrFkgm8#-;M-B??K zpwpTH?KO2}tF*Fz%bO@0lUWu71L= zo9^HSoF>I&k@dpj)-+nLh`UZ6*6xCoY(x{BX`7|=h$~p?No7kgMk}J{TLN&RO!hQU z;BF}Tu4+?xpJAM_G{@~(<8MM2l;Ho#pLn^D^Q~t?x$`tdMj(B^?b0&?DMIQE!AZvDI8IVN zY96O4k*hkI@~$cO$+w*2_Ar;2C@mH7s?pl6x59km@Rb^z`9ip12^kkWxx7@uK97u8@V}9B%ckZq;b>D1X z!1DFZsDwMN+?c4;$}FjN2!sBLJKks0Fr7J7;ZzViJI7zKE43ChIMS!S;1GECIJeXY2i zgBe*Y&+}zhzicmWU{6x%PjCL0(C36ShjUJ4ZKEDHKbSRoOe9lS4s39j(0Hn1Pm;%_ zl{;iQ9L8I;Q@PZ?{b0@<`8QoVgOVf~Mmze$bx=ob-cOVg^Y*+QCFa67Um0Mt<-(u=fIz(*o zZ-_vTRy^-FkRu_a9t`{hJAVWm%w@&KFK{a)&W(#_Ya zW^G9Pjk%2Bs0A77vowE}1z%y@U@b@XWPibSa#KTdXLah_Q8b7n@?N}p)tvvyT1{K= zz7Bh~yZi0>PH(1v9|>=c6mX-ZAfjt)t0A|?*Py**7X28@to$Qx$;stb=Rx|{EHJar zdq4gPx3P-)N|v3&z@2A9#Nfg)r#|2=WF4FtE++F=ndsS;$y{oWeVcua3qlN( zP~VP0+_3DTTuLuIGvMdPKNukeeK8EbS@vk3l0BlpbGAKMZUybgb(mn~nuwtuSaoh# zwYC9XkfxKXe)@OyBnrcI4w!aO{~a(`U(TL-wLsV@P|H+XbckIF2`gylN2z1*e#K9uXr<~_2$1}9l~Y)($!1DWO#+0wVmU_&oE zua=2VwW!Q`zB)3iK`=rWu2~N|X`-MPrZ;!jiYsh{>sWOwmM#9_i_4yqb-SS07DdJb{NF$5gDOLQ++vmcfGBcvclI%ld*=IB!YEHg|o9 zu{Lgkv0`?jQL{GeCn_4pYAO+Jp_f$jwqbSZAE3>)e;+$^p|q*4w%{d)OWj%l&vU2ljkl6-!`p6V%HD}kVXUIMK^cR=xVn!_tO(^b)%n;48!;8 z5cb^4AfHW@2TM#W1TA~l2&5Bw)--as7XiNzoYJ=^DQpt`Ks#~mZtdV5I#aRk?Q||V zpQtc(CN~M?Hp@FH2IEzJugt3GNCRv~TP1l_rV`w9#m?`dM5wSl5%J*niDHb|MwJMh z!r!7&;)J5|IRK0r@{7tKBkpX1pPG4Ue^+C`VZsl@c=cTwoJN&98>34kS_UH(sIBYL z6q5gzkzj`h%7L~(8<4~4hfwwMDSPbN#|P;tHWvTu0=%S8`r{Y70VR66rI z&3PDb(b(`QqTh!YhdxbvSI~<-gAp42ebS=B?^-fskw$wnJ(V>`lfx)I@jT63a=WF;Rt7rdgIMh4FsfC*!6OHx+{_=9DmSP0)8TkeGDjte%V zO}E>nN?+@62TF8kvd2Y}UL)Il7eCLxb(C4#uN^!*Et`T-74!|v4(%gircXH8UbVn+ zWnE>g_AMfKA+_5rr;h`Rpcc6aOJ@&$;k9J98y$o%+TAdr_z?Zoex?GL9j-eU(4bC3 z^lnON^=EqTt58PR?^ICZDxa)=nW1TSwTAVfd{eO3*C^MI6>*W$10O`~xm~{8?s7H) zKSlUq7UM8L+1;0YpR*((kT%Q)+;{|Am&LxM&Z%}CV(H2M2p<*T>*fVh%dst6N@p~8 zsM(Wm^!(n?DQ&>2{|%YZVapNruyhB|=Us+Wv0-|r!kSM=Fs`ago6@g6HCcUj13W6% z8vWh&$$f?&UW06ltnc6{S{QBk_O4}u>0Fv=rUmAN)XX){%XqWX%b! zF;!PK71+*ky5j~dqHYXIL?``t!X)Q>JL}=>>NCxSdR;|I$qh?9B(ltxc496+XscI_jXaWb*j=Z#i^f=lqG5Af7|p23)<&V)dN@K}=oJghiQ=$Lq#$l?}n z!<_%|;fNY<1uLP0D*;=Xy`6StqD+M~)1U;};MW4vp@lJep~L9gWXNOJNV?r zr+Xgvdn?5`tHT?7=8N1$pQBPqdMk%dy-TX5CLnu6SG6Q^^kl#@VM7+xFA`*HHmBw#=VPC9f0%nDDbDR`8A%1VlU=E{Y4^x5C%f{WEa?S z|9%9ht~TV?Tg%yNAEE)3vULI%uR;2!J)gGjWfVsH+*NuD${NR$2e?W3RPU#y5W&x5 z#Y|S!Mn!d9lQHQ{iQSu%j?vyVZHA^d&vmwM#5%Hld1#Cps)b_HP7gyzfAjK#8}OXL zzS>Lk+FBsT}NI#w!~4*6S4|a5EaM>kp+$V18psQ2m2x)h}gG zFaPwkvmcMi&WpS3>_AFji1xF zqiy^oWqEHp|B3E&iXUfx-8mqgdzVO=a1IE|`lDC!S)hhgyFY81i~eObB(+W6FIHpp zha|`%irtyA@wl8_6<#|`7A6Q{M%q2Bs1L$ctCkl(8dVwYRg#Ss(869WkH5s|u@)Iz zhO>G+rFPvu?N;-|f%5x|o+&P;$bRS{$lQXJRY`aCEJMSn?_yKMUwwGXpnp3+!%G~f z#gpUTjkQkkj1K-Oi0^w-C{P+J&R~&Y{ryrDwf^!v{CQ*J@RAJ3(`jpYqS*B`_t^u1 ztFKt}?l--ESkY6o&inPHdv6h`SB-bP$~kA&Go`~@|8p95U|Vg3^`Xt~>kLz~_Fm!2 z28G?L>9?|;-Rny}l9F5@`NB~+MhHnH>L0ITK0MWRt+nixBtb?iOtE%9*8FQ{2U->o zW8-^Z)+Ov<9)8~tpR*IC7WXoDvmnl*FhsZrfFWCHjqVkw&hd61Ta3-|-cfi?GMKLBSkQx9~GVJ+Zs-7x`|< z%eM5c#E#w`zB7%^t^3P7X9lb>#W^}hUenIn8x7Mfe9AHp$v|Yck z@5_Q)5vgQHp^IT|>J05mwly_w%&m5uX{`NyF+B7k*Iu=+St_lQ72EHs0&7kSV-}OH zjhhEODjK{8MYB~kM|Ul>?JtObYGAvo9l&e0mKboaJI~95e}BdA9Po~OxCt-&M^6qW zvU7B>kMci>9T2Mb_9h1$7?a8bS+0dX$1#O9-N^SV-3CtWI=Nk(&o-209k`Y7BPdR* zEAo*v56h)UeOsoPy`e{ex_sPtM3}Fzn^o5APb2W=QwwDb`a507ASlAi$lJ+Rmn+L3 zAM9Mk^lWcOeWUC28~|852Q1tF(Q{`Ggy*@Y7p#tv!_B1S z^{NS9xfOL5PsI|~2tP({*j?Gv&`~sp?GuLi?464e@i&6^3PHjeB@_6^MMaK#1n3ij z%d)v^*rRwCXhN)mzMYEaZEI^_yL>lq(>5*zX7Z=kGcWh#I4CM4GWw3y6PuYCyD2!h$7m-gG z(_rO5>P(U;%e>HbuJ|x(*I7S^F4XGnVR3%h({eb;(rBgKlya#r`q)?qOv{tG`jrYLf0mr82kIw zc>Am*AtSNf_Nw>oLC-&aoD#M=75m90k^3%LA=GVvF9C2|t14pAqk0Sw>rgli872+Lad4_6HN#956Jdksh~h%SH_)aFDED_w)En(uQ%{-3n+eAxlZLRWSL5uB)YG zGcdVR6myq_ac^BcG&oxKlDa#?k3`DLcj~PI)3*OZP|1o{pJ>FO$R->dx$mod@E=fO z7+(->96y+MF`bmFt}-h6F3Q5^%Ox^)w7sfM!iYFi7Zr+n-+P=~x=eY}o^j-`DfpUmax z7-`10(3YG(yzx)pbjZ$fZAO&n!Wtpun0@2+WW+f@kRz6y1g4(@9`>62LEgr%7IXb& zo4bd={FSiz`StfJPgH6xi)r22<+z^2H}g9U{b+Eg?|xi_a$EJLCU3~@_}%+&Rl2_` Mb^p&A#re#C0YU^j$^ZZW literal 0 HcmV?d00001 diff --git a/img/refresh_ch.jpg b/img/refresh_ch.jpg new file mode 100644 index 0000000000000000000000000000000000000000..33f616c53cd42ff868f994a0c125215e52ad0a1a GIT binary patch literal 9059 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 literal 0 HcmV?d00001 diff --git a/javascript/civitai_helper.js b/javascript/civitai_helper.js new file mode 100644 index 0000000..555ee52 --- /dev/null +++ b/javascript/civitai_helper.js @@ -0,0 +1,312 @@ +"use strict"; + + +function getActivePrompt() { + const currentTab = get_uiCurrentTabContent(); + switch (currentTab.id) { + case "tab_txt2img": + return currentTab.querySelector("#txt2img_prompt textarea"); + case "tab_img2img": + return currentTab.querySelector("#img2img_prompt textarea"); + } + return null; +} + +function getActiveNegativePrompt() { + const currentTab = get_uiCurrentTabContent(); + switch (currentTab.id) { + case "tab_txt2img": + return currentTab.querySelector("#txt2img_neg_prompt textarea"); + case "tab_img2img": + return currentTab.querySelector("#img2img_neg_prompt textarea"); + } + return null; +} + + +//button's click function +function open_model_url(model_type, model_name){ + console.log("start open_model_url"); + + //get hidden components of extension + let js_msg_txtbox = gradioApp().querySelector("#ch_js_msg_txtbox textarea"); + let js_open_url_btn = gradioApp().getElementById("ch_js_open_url_btn"); + + + //msg to python side + let msg = { + "action": "", + "model_type": "", + "model_name": "", + "prompt": "", + "neg_prompt": "", + } + + + msg["action"] = "open_url"; + msg["model_type"] = model_type; + msg["model_name"] = model_name; + msg["prompt"] = ""; + msg["neg_prompt"] = ""; + + // fill to msg box + js_msg_txtbox.value = JSON.stringify(msg); + js_msg_txtbox.dispatchEvent(new Event("input")); + + //click hidden button + js_open_url_btn.click(); + + console.log("end open_model_url"); + + +} + +function add_trigger_words(model_type, model_name){ + console.log("start add_trigger_words"); + + //get hidden components of extension + let js_msg_txtbox = gradioApp().querySelector("#ch_js_msg_txtbox textarea"); + let js_add_trigger_words_btn = gradioApp().getElementById("ch_js_add_trigger_words_btn"); + + + + //msg to python side + let msg = { + "action": "", + "model_type": "", + "model_name": "", + "prompt": "", + "neg_prompt": "", + } + + msg["action"] = "add_trigger_words"; + msg["model_type"] = model_type; + msg["model_name"] = model_name; + msg["neg_prompt"] = ""; + + // get active prompt + let prompt = getActivePrompt(); + msg["prompt"] = prompt.value; + + // fill to msg box + js_msg_txtbox.value = JSON.stringify(msg); + js_msg_txtbox.dispatchEvent(new Event("input")); + + //click hidden button + js_add_trigger_words_btn.click(); + + console.log("end add_trigger_words"); + +} + +function use_preview_prompt(model_type, model_name){ + console.log("start use_preview_prompt"); + + //get hidden components of extension + let js_msg_txtbox = gradioApp().querySelector("#ch_js_msg_txtbox textarea"); + let js_use_preview_prompt_btn = gradioApp().getElementById("ch_js_use_preview_prompt_btn"); + + + + //msg to python side + let msg = { + "action": "", + "model_type": "", + "model_name": "", + "prompt": "", + "neg_prompt": "", + } + + msg["action"] = "use_preview_prompt"; + msg["model_type"] = model_type; + msg["model_name"] = model_name; + + // get active prompt + prompt = getActivePrompt(); + msg["prompt"] = prompt.value; + + // get active neg prompt + let neg_prompt = getActiveNegativePrompt(); + msg["neg_prompt"] = neg_prompt.value; + + // fill to msg box + js_msg_txtbox.value = JSON.stringify(msg); + js_msg_txtbox.dispatchEvent(new Event("input")); + + //click hidden button + js_use_preview_prompt_btn.click(); + + console.log("end use_preview_prompt"); + +} + + +onUiLoaded(() => { + + + + // get all extra network tabs + let tab_prefix_list = ["txt2img", "img2img"]; + let model_type_list = ["textual_inversion", "hypernetworks", "checkpoints", "lora"]; + let cardid_suffix = "cards"; + + // update extra network tab pages' cards + // * replace "replace preview" text button into an icon + // * add 3 button to each card: + // - open model url 🌐 + // - add trigger words 💡 + // - use preview image's prompt 🏷 + // notice: javascript can not get response from python side + // so, these buttons just sent request to python + // then, python side gonna open url and update prompt text box, without telling js side. + function update_card_for_civitai(){ + + + //change all "replace preview" into an icon + let extra_network_id = ""; + let extra_network_node = null; + let addtional_nodes = null; + let replace_preview_btn = null; + let ul_node = null; + let model_name_node = null; + let model_name = ""; + let model_type = ""; + let cards = null; + for (const tab_prefix of tab_prefix_list) { + for (const js_model_type of model_type_list) { + //get model_type for python side + switch (js_model_type) { + case "textual_inversion": + model_type = "ti"; + break; + case "hypernetworks": + model_type = "hyper"; + break; + case "checkpoints": + model_type = "ckp"; + break; + case "lora": + model_type = "lora"; + break; + } + + if (!model_type) { + console.log("can not get model_type from: " + js_model_type); + continue; + } + + extra_network_id = tab_prefix+"_"+js_model_type+"_"+cardid_suffix; + // console.log("searching extra_network_node: " + extra_network_id); + extra_network_node = gradioApp().getElementById(extra_network_id); + if (!extra_network_node) { + console.log("can not find extra_network_node: " + extra_network_id); + continue; + } + // console.log("find extra_network_node: " + extra_network_id); + + // get all card nodes + cards = extra_network_node.querySelectorAll(".card"); + for (let card of cards) { + // replace preview text button into icon + replace_preview_btn = card.querySelector(".actions .additional a"); + replace_preview_btn.style.margin = "0px 10px"; + if (replace_preview_btn) { + if (replace_preview_btn.innerHTML == "replace preview") { + replace_preview_btn.innerHTML = "🖼"; + } + } + + //get model name node + model_name_node = card.querySelector(".actions .name"); + if (!model_name_node){ + console.log("can not find model name node for cards in " + extra_network_id); + continue; + } + + // get model name + model_name = model_name_node.innerHTML; + if (!model_name) { + console.log("model name is empty for cards in " + extra_network_id); + continue; + } + + + //get ul node, which is the parent of all buttons + ul_node = card.querySelector(".actions .additional ul"); + + // then we need to add 3 buttons to each ul node: + let open_url_node = document.createElement("button"); + open_url_node.innerHTML = "🌐"; + open_url_node.title = "Open this model's civitai url"; + open_url_node.style.margin = "0px 10px"; + open_url_node.setAttribute("onclick","open_model_url('"+model_type+"', '"+model_name+"')"); + + let add_trigger_words_node = document.createElement("button"); + add_trigger_words_node.innerHTML = "💡"; + add_trigger_words_node.title = "Add trigger words to prompt"; + add_trigger_words_node.style.margin = "0px 10px"; + add_trigger_words_node.setAttribute("onclick","add_trigger_words('"+model_type+"', '"+model_name+"')"); + + let use_preview_prompt_node = document.createElement("button"); + use_preview_prompt_node.innerHTML = "🏷"; + use_preview_prompt_node.title = "Use promt from preview image"; + use_preview_prompt_node.style.margin = "0px 10px"; + use_preview_prompt_node.setAttribute("onclick","use_preview_prompt('"+model_type+"', '"+model_name+"')"); + + //add to card + ul_node.appendChild(open_url_node); + ul_node.appendChild(add_trigger_words_node); + ul_node.appendChild(use_preview_prompt_node); + + + + + + + + } + + + } + } + + + } + + //run it once + update_card_for_civitai(); + + let tab_id = "" + let extra_tab = null; + let extra_toolbar = null; + //add refresh button to extra network's toolbar + for (let prefix of tab_prefix_list) { + tab_id = prefix + "_extra_tabs"; + extra_tab = gradioApp().getElementById(tab_id); + + //get toolbar + extra_toolbar = extra_tab.querySelector("div.flex.border-b-2.flex-wrap"); + + if (!extra_toolbar){ + console.log("can not get extra network toolbar for " + tab_id); + continue; + } + + // add refresh button to toolbar + let ch_refresh = document.createElement("button"); + ch_refresh.innerHTML = "Refresh Civitai Helper"; + ch_refresh.title = "Refresh Civitai Helper's model card buttons"; + ch_refresh.className = "gr-button gr-button-lg gr-button-secondary"; + ch_refresh.onclick = update_card_for_civitai; + + extra_toolbar.appendChild(ch_refresh); + + } + + + + +}); + + + diff --git a/scripts/civitai_helper.py b/scripts/civitai_helper.py new file mode 100644 index 0000000..cb501ba --- /dev/null +++ b/scripts/civitai_helper.py @@ -0,0 +1,434 @@ +# -*- coding: UTF-8 -*- +# This extension can help you manage your models from civitai. It can download preview, add trigger words, open model page and use the prompt from preview image +# repo: https://github.com/butaixianran/ + + + +import modules.scripts as scripts +import gradio as gr +import os +import webbrowser +import requests +import random +import hashlib +import json +import shutil +import modules +from modules import script_callbacks + +# from modules import images +# from modules.processing import process_images, Processed +# from modules.processing import Processed +# from modules.shared import opts, cmd_opts, state + + +# init +model_folders = { + "ti": "embeddings", + "hyper": os.path.join("models", "hypernetworks"), + "ckp": os.path.join("models", "Stable-diffusion"), + "lora": os.path.join("models", "Lora"), +} + +model_exts = (".bin", ".pt", ".safetensors", ".ckpt") +model_info_exts = ".info" +civitai_info_suffix = ".civitai" +civitai_hash_api_url = "https://civitai.com/api/v1/model-versions/by-hash/" + +# js action list +js_actions = ("open_url", "add_trigger_words", "use_preview_prompt") + +root_path = os.getcwd() + +# print for debugging +def printD(msg): + print(f"Civitai Helper: {msg}") + + +def gen_file_sha256(filname): + ''' calculate file sha256 ''' + hash_value = "" + with open(filname, "rb") as f: + sha256obj = hashlib.sha256() + sha256obj.update(f.read()) + hash_value = sha256obj.hexdigest() + + printD("sha256: " + hash_value) + return hash_value + +# scan model to generate SHA256, then use this SHA256 to get model info from civitai +def scan_model(skip_nsfw_preview): + printD("Start scan_model") + + for model_type, model_folder in model_folders.items(): + folder_path = os.path.join(root_path, model_folder) + printD("Scanning path: " + folder_path) + for filename in os.listdir(folder_path): + # check ext + item = os.path.join(folder_path, filename) + base, ext = os.path.splitext(item) + if ext in model_exts: + # find a model + # get preview image + first_preview = base+".png" + sec_preview = base+".preview.png" + # get info file + info_file = base + civitai_info_suffix + model_info_exts + # check info file + if not os.path.isfile(info_file): + # get model's sha256 + printD("Generate SHA256 for model: " + filename) + hash = gen_file_sha256(item) + + if not hash: + printD("failed generate SHA256 for this file.") + return + + # use this sha256 to get model info from civitai + printD("Request model info from civitai") + r = requests.get(civitai_hash_api_url+hash) + if not r.ok: + if r.status_code == 404: + # this is not a civitai model + printD("Civitai does not have this model") + printD("Write empty model info file") + empty_info = {} + with open(info_file, 'w') as f: + data = json.dumps(empty_info) + f.write(data) + # go to next file + continue + else: + printD("Get errorcode: " + str(r.status_code)) + printD(r.text) + return + + # try to get content + content = None + try: + content = r.json() + except Exception as e: + printD("Parse response json failed") + printD(str(e)) + printD("response:") + printD(r.text) + return + + if not content: + printD("error, content from civitai is None") + return + + # write model info to file + printD("Write model info to file: " + info_file) + with open(info_file, 'w') as f: + data = json.dumps(content) + f.write(data) + + # check preview image + if not os.path.isfile(sec_preview): + # need to download preview image + printD("Need preview image for this model") + if content["images"]: + for img_dict in content["images"]: + if "nsfw" in img_dict.keys(): + if img_dict["nsfw"]: + printD("This image is NSFW") + if skip_nsfw_preview: + printD("Skip NSFW image") + continue + + if "url" in img_dict.keys(): + printD("Sending request for image: " + img_dict["url"]) + # get image + img_r = requests.get(img_dict["url"], stream=True) + if not img_r.ok: + printD("Get errorcode: " + str(r.status_code)) + printD(r.text) + return + + # write to file + with open(sec_preview, 'wb') as f: + img_r.raw.decode_content = True + shutil.copyfileobj(img_r.raw, f) + + printD("Created Preview image: " + sec_preview) + + # we only need 1 preview image + break + + # for testing, we only check 1 model for each type + # break + + printD("End scan_model") + + + +# handle request from javascript +# parameter: msg - msg from js +# return: (action, model_type, model_name, prompt, neg_prompt) +def parse_js_msg(msg): + printD("Start parse js msg") + msg_dict = json.loads(msg) + + if "action" not in msg_dict.keys(): + printD("Can not find action from js request") + return + + if "model_type" not in msg_dict.keys(): + printD("Can not find model type from js request") + return + + if "model_name" not in msg_dict.keys(): + printD("Can not find model name from js request") + return + + if "prompt" not in msg_dict.keys(): + printD("Can not find prompt from js request") + return + + if "neg_prompt" not in msg_dict.keys(): + printD("Can not find neg_prompt from js request") + return + + action = msg_dict["action"] + model_type = msg_dict["model_type"] + model_name = msg_dict["model_name"] + prompt = msg_dict["prompt"] + neg_prompt = msg_dict["neg_prompt"] + + if not action: + printD("Action from js request is None") + return + + if not model_type: + printD("model_type from js request is None") + return + + if not model_name: + printD("model_name from js request is None") + return + + + if action not in js_actions: + printD("Unknow action: " + action) + return + + if model_type not in model_folders.keys(): + printD("Unknow model_type: " + model_type) + return + + printD("End parse js msg") + + return (action, model_type, model_name, prompt, neg_prompt) + + + + +# get model info file's content by model type and model name +# parameter: model_type, model_name +# return: model_info_dict +def get_model_info(model_type, model_name): + if model_type not in model_folders.keys(): + printD("unknow model type: " + model_type) + return None + + model_folder = model_folders[model_type] + model_info_filename = model_name + civitai_info_suffix + model_info_exts + model_info_filepath = os.path.join(root_path, model_folder, model_info_filename) + + if not os.path.isfile(model_info_filepath): + printD("Can not find model info file: " + model_info_filepath) + return None + + model_info = None + with open(model_info_filepath, 'r') as f: + try: + model_info = json.load(f) + except Exception as e: + printD("Selected file is not json: " + model_info_filepath) + printD(e) + return None + + return model_info + + +# get civitai's model url and open it in browser +# parameter: model_type, model_name +def open_model_url(msg): + printD("Start open_model_url") + + result = parse_js_msg(msg) + if not result: + printD("Parsing js ms failed") + return + + action, model_type, model_name, prompt, neg_prompt = result + + model_info = get_model_info(model_type, model_name) + if not model_info: + printD(f"Failed to get model info for {model_type} {model_name}") + return + + if "modelId" not in model_info.keys(): + printD(f"Failed to get model id from info file for {model_type} {model_name}") + return + + model_id = model_info["modelId"] + if not model_id: + printD(f"model id from info file of {model_type} {model_name} is None") + return + + url = "https://civitai.com/models/"+str(model_id) + + printD("Open Url: " + url) + # open url + webbrowser.open_new_tab(url) + + printD("End open_model_url") + + +# add trigger words to prompt +# parameter: model_type, model_name, prompt +# return: [new_prompt, new_prompt] - new prompt with trigger words, return twice for txt2img and img2img +def add_trigger_words(msg): + printD("Start add_trigger_words") + + result = parse_js_msg(msg) + if not result: + printD("Parsing js ms failed") + return + + action, model_type, model_name, prompt, neg_prompt = result + + + model_info = get_model_info(model_type, model_name) + if not model_info: + printD(f"Failed to get model info for {model_type} {model_name}") + return [prompt, prompt] + + if "trainedWords" not in model_info.keys(): + printD(f"Failed to get trainedWords from info file for {model_type} {model_name}") + return [prompt, prompt] + + trainedWords = model_info["trainedWords"] + if not trainedWords: + printD(f"No trainedWords from info file for {model_type} {model_name}") + return [prompt, prompt] + + if len(trainedWords) == 0: + printD(f"trainedWords from info file for {model_type} {model_name} is empty") + return [prompt, prompt] + + # get ful trigger words + trigger_words = "" + for word in trainedWords: + trigger_words = trigger_words + word + + new_prompt = prompt + trigger_words + printD("trigger_words: " + trigger_words) + printD("prompt: " + prompt) + printD("new_prompt: " + new_prompt) + + printD("End add_trigger_words") + + # add to prompt + return [new_prompt, new_prompt] + + + +# use preview image's prompt as prompt +# parameter: model_type, model_name, prompt, neg_prompt +# return: [new_prompt, new_neg_prompt, new_prompt, new_neg_prompt,] - return twice for txt2img and img2img +def use_preview_image_prompt(msg): + printD("Start use_preview_image_prompt") + + result = parse_js_msg(msg) + if not result: + printD("Parsing js ms failed") + return + + action, model_type, model_name, prompt, neg_prompt = result + + + model_info = get_model_info(model_type, model_name) + if not model_info: + printD(f"Failed to get model info for {model_type} {model_name}") + return [prompt, neg_prompt, prompt, neg_prompt] + + if "images" not in model_info.keys(): + printD(f"Failed to get images from info file for {model_type} {model_name}") + return [prompt, neg_prompt, prompt, neg_prompt] + + images = model_info["images"] + if not images: + printD(f"No images from info file for {model_type} {model_name}") + return [prompt, neg_prompt, prompt, neg_prompt] + + if len(images) == 0: + printD(f"images from info file for {model_type} {model_name} is empty") + return [prompt, neg_prompt, prompt, neg_prompt] + + # get prompt from preview images' meta data + preview_prompt = "" + preview_neg_prompt = "" + for img in images: + if "meta" in img.keys(): + if "prompt" in img["meta"].keys(): + if img["meta"]["prompt"]: + preview_prompt = img["meta"]["prompt"] + + if "negativePrompt" in img["meta"].keys(): + if img["meta"]["negativePrompt"]: + preview_neg_prompt = img["meta"]["negativePrompt"] + + # we only need 1 prompt + if preview_prompt: + break + + if not preview_prompt: + printD(f"There is no prompt of {model_type} {model_name} in its preview image") + return [prompt, neg_prompt, prompt, neg_prompt] + + printD("End use_preview_image_prompt") + + return [preview_prompt, preview_neg_prompt, preview_prompt, preview_neg_prompt] + + + + +def on_ui_tabs(): + # init + + # get prompt textarea + # UI structure + # check modules/ui.py, search for txt2img_paste_fields + # Negative prompt is the second element + txt2img_prompt = modules.ui.txt2img_paste_fields[0][0] + txt2img_neg_prompt = modules.ui.txt2img_paste_fields[1][0] + img2img_prompt = modules.ui.img2img_paste_fields[0][0] + img2img_neg_prompt = modules.ui.img2img_paste_fields[1][0] + + # ====UI==== + with gr.Blocks(analytics_enabled=False) as civitai_helper: + # info + gr.Markdown("Civitai Helper's extension tab") + + skip_nsfw_preview_ckb = gr.Checkbox(label="SKip NSFW Preview images", value=False, elem_id="ch_skip_nsfw_preview_ckb") + scan_model_btn = gr.Button(value="Scan model", elem_id="ch_scan_model_btn") + + # hidden component for js + js_msg_txtbox = gr.Textbox(label="Request Msg From Js", visible=False, lines=1, value="", elem_id="ch_js_msg_txtbox") + js_open_url_btn = gr.Button(value="Open Model Url", visible=False, elem_id="ch_js_open_url_btn") + js_add_trigger_words_btn = gr.Button(value="Add Trigger Words", visible=False, elem_id="ch_js_add_trigger_words_btn") + js_use_preview_prompt_btn = gr.Button(value="Use Prompt from Preview Image", visible=False, elem_id="ch_js_use_preview_prompt_btn") + + # ====events==== + scan_model_btn.click(scan_model, inputs=[skip_nsfw_preview_ckb]) + js_open_url_btn.click(open_model_url, inputs=[js_msg_txtbox]) + js_add_trigger_words_btn.click(add_trigger_words, inputs=[js_msg_txtbox], outputs=[txt2img_prompt, img2img_prompt]) + js_use_preview_prompt_btn.click(use_preview_image_prompt, inputs=[js_msg_txtbox], outputs=[txt2img_prompt, txt2img_neg_prompt, img2img_prompt, img2img_neg_prompt]) + + # the third parameter is the element id on html, with a "tab_" as prefix + return (civitai_helper , "Civitai Helper", "civitai_helper"), + +script_callbacks.on_ui_tabs(on_ui_tabs)