From 552a2c73bc1c25b90821cf813e6fb7ec1b16d74b Mon Sep 17 00:00:00 2001 From: Chris Date: Sat, 25 Apr 2026 14:02:11 +1000 Subject: [PATCH] 90 --- README.md | 14 ++++++++++++++ image_filter_nodes.py | 11 ++++++++++- js/audio/beep.mp3 | Bin 0 -> 8386 bytes js/{ => audio}/ding.mp3 | Bin js/audio/honk.mp3 | Bin 0 -> 12348 bytes js/popup.js | 29 ++++++++++++++++++++++++++--- 6 files changed, 50 insertions(+), 4 deletions(-) create mode 100644 js/audio/beep.mp3 rename js/{ => audio}/ding.mp3 (100%) create mode 100644 js/audio/honk.mp3 diff --git a/README.md b/README.md index 7a4bdaf..b4f910a 100644 --- a/README.md +++ b/README.md @@ -35,6 +35,10 @@ or jump down to [example workflows](#example-workflows) for more examples. # Recent Changes +## New in 1.9 + +- [Custom audio](#audiofile) + ## New in 1.8 - Fix for mask image filter when using more than one in a workflow @@ -115,6 +119,16 @@ Set the FPS for playback in the global settings. This is a new, experimental feature, so please report any issues... +### audiofile + +The sound to play when the node is triggered. Can be one of the built-in options, +[`beep.mp3`](js/audio/beep.mp3), [`ding.mp3`](js/audio/ding.mp3), or [`honk.mp3`](js/audio/honk.mp3), +or the path to a local audiofile, or a URL of an audiofile. + +You can add files to `js/audio` and then just use their names. + +If a file can't be loaded, it will fallback to `ding.mp3` + --- # Mask Image Filter diff --git a/image_filter_nodes.py b/image_filter_nodes.py index 5df88e1..45d0047 100644 --- a/image_filter_nodes.py +++ b/image_filter_nodes.py @@ -73,6 +73,7 @@ class ImageFilter(io.ComfyNode, FilterNodeBase): io.Int.Input("pick_list_start", advanced=True, optional=True, default=0, tooltip="The index of the first image (normally 0 or 1)"), io.String.Input("pick_list", advanced=True, optional=True, default="", tooltip="If a comma separated list of integers is provided, the images with these indices will be selected automatically."), io.Int.Input("video_frames", advanced=True, optional=True, default=1, tooltip="Treat each block of n images as a video"), + io.String.Input("audiofile", advanced=True, optional=True, default="", tooltip="Path or URL for the audiofile to use, or name of the file in the default audio folder"), io.String.Input("graph_id", default="") ], outputs = [ @@ -107,6 +108,7 @@ class ImageFilter(io.ComfyNode, FilterNodeBase): graph_id:str="", tip:str="", extra1:str="", extra2:str="", extra3:str="", pick_list_start:int=0, pick_list:str="", video_frames:int=1, + audiofile:str|None="", **kwargs ) -> io.NodeOutput: assert images is not None, "Image Filter received None for images" @@ -124,7 +126,14 @@ class ImageFilter(io.ComfyNode, FilterNodeBase): if len(images_to_return) == 0: all_the_same = ( B and all( (images[i]==images[0]).all() for i in range(1,B) )) urls:list[dict[str,str]] = cls.save_images_return_urls(images=images, **kwargs) - payload = { "urls":urls, "allsame":all_the_same, "extras":[extra1, extra2, extra3], "tip":tip, "video_frames":video_frames } + payload = { + "urls":urls, + "allsame":all_the_same, + "extras":[extra1, extra2, extra3], + "tip":tip, + "video_frames":video_frames, + "audiopath": audiofile + } response:Response = send_and_wait(payload, timeout, graph_id) images_to_return:list[int] diff --git a/js/audio/beep.mp3 b/js/audio/beep.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..5f5c40efed3c5eebaf4abdd89c2b596158b491da GIT binary patch literal 8386 zcmd^^hcjIN|L<4tHHav|>PtlLl3gsKuWk_~(R)}4iC7XOLaZ9S?qZh>!6HOSf`}4r z@ewUeqWcgf(avxE?)~1G`yc$~-p9;2@0oMX%)a+|p0Dyg?;D0HG@x_%?X2NSl#!is z82H`sj}SEuz2hI^>kS-d_ntrSf8j*AL%F~~IRro;(J~M}KfgEyc?xP2u2V3gU~O&f zOu>^v0EGw&4=6l-{5Xw54uuj5H56V^Xs7V*-Mb+QGZem3SflWp0ssJ%-?BD`S-@2k zloS~%E{MhAzK zTo6t3eYX#25H0J2krx$UsV~%=e%J3NfRdNr0w+I|5=2<J>3#5p(EfyreNWExa$iP?L z7;w-1iGr4F7Ay|xAwx$@Y!I4|5Q6nQp`}0M`X-qf=|B%%#SCI9Y^c!JuJL`~@q*uo zSaTatlCe>c87Kk27Z3JfNE$SruB1A+MC-a-ab$#}rsu<6OX_E=^6`*WZmO#?x>O*5 z6*9>xb*}IkL&i9&oZtZ9Xf$pv*gdZr&|m&}IuXyl(m?M;%j(QjHjZ_sMT>DZOvF^? zDbij0VsfPrrYQd2XHKT{cJjS%vluvM$e14VZ?=T|fEzWV8Xp_B3}ErLpG5|tcpORy zgCIBE>W7(r*aBHM3+NjJ*PoigE9TfK{RElDjg+)pbH>@JR^aIUGviiZD%#M3ixjik z^{IBvi_S$10P1#KHkZ~sY=2(h9JXWU#(9R3!}w_x+6&pK`ty{t+{UH0IbbR;zGd83 zjz|~MU$(^sjrKu6K65qJH~MpUS>ye@TZtC8*Y2)mp_N97ryZ?s+PU?G&`z;1c8|7qYjQQ%CkSY&@ncX)fw+B1zi10 zKl{?id}Ff8x17`C*iOX*3jo;L`4iOCN|IW$1?Tvs5*GmAceO_TUq*WI_q$@WVRO`U z+)Q+|J)T2dCN}P`{cjQ{@|OR(w2#ZtRuV&Jy_?pbm_cH*r$zG`nUp(?f}Lax=Ax%M zsxqe&3a8aTo`qK3O6J3310&>L=Ir@8pzk#CB!;Nlz;R^nI+_C&ZM&J@?74e2ptDjv z)ovhrR)?taz?bF79atg@a|6Iar4rmk@31Tr5^&wbvv@WR`0GLl>O9--y7+CRA|W^S<9me9#$*d7B6WGpaS! zzg(TTEi+RSNGr22s_N4ifvLE#Jt-E1E+`c%*~TUIONubXZ1pn0V*72`Ij3Rt7?gKbMr=M;^^#VT)hi~+$ZFiLMXi)u30DKa{;i#xxX{W~L`C6kXHp!n zem&&V$(D8aGJ8B@$@@=G8L{Y@Z!E2m$3|MV@MOL>R~l76K$d3>KM!c-%^QXy)08!M z=$9nj1`}3g7{3?ek)tT<{nWP??T!zDqer_eh!K-9l=jPYxODnEv2NfL)|?ES{UK}M z+?rKywyb?;R&w7fi2|Z(6lYkV9yk-0K`uoPMtnMZJES*wv37V> zcmV5s2irrzBypdV-}ddcNz4||OYuAF$eHQ*0=4or;V*RktF6TK8(GK&)5!7&ZiZRO zQvGUpI#B|ly&_d{FWQlkATG}UK$ju6Li*(X=D9wHAPy#qf7qJ6z$A)3y={SS?&|>H zkgd~ssP`6o2JOAqe!4;2w46c_5NcXi20s0I{7T+rBi@i$4BWli@Baml}xK)#R=dor;#NfR&l`(zrm9+c)7kH@ zMa^r{O+*C^RcdKU<0A&$@v1+nsM##Cru5(RYwjSqgszh56gP7 z6NI@c|HzfaN2$=p({9K8MACKOZ1>gl$WeCdc&i(K&h+`j**w|vIkWiC3eXjZ^6N{a6 z=?!zeGzY96B~ZBo$6hP*t?;0wiq%@H%pu2<1gkfTM~dM@cJy1*$5$KPm%kIe>5aH- zV0x4B&!9KU&731tI8jA4tIC3kwd(hy&(a$e)ecRn1x+Nubda3N;tVl+z1uqtq+!8% z4Iq|=kl!;0lvM1E+03Q}RH|bI3W4JovFmC8Fn7@+x0)0c;BQx8cK3r^_byY%Qb!86 z?so@KC;7jTnO_-mg~5!EBy95Pbb3CDqud#}S_XZzP{yokv-%enjKXH;6oDpLQ`@gl z4fk?bsQuC&`q{Pa!d0#PmpH;83p%4yyMT~o{(Ykws*`AMR)2Q1**^&Y$GX0%0MQCh zI@f0h#E!dfzbV%2#eVJw)xAKWPr$ff`{_qT1eqT643tlm$YKPddRU;WC8pKJhrg}6 z8SZtRJu9$1LlZq9JMdYd**b9dPw$(Ez`!(#Bt$4fF-V?2)^d0q(bvcvL*|Dv_YDay z)}Mk-;v1h=1*FVoD%zw@!P5&2WuztoO=kTD#IHeL|THz0p+m$Qx+3-eJ8UER7eNy3SIN_|-}#>0OUOx_lq{iNd7F zKv7w}OQ$%U)M~!ulK~HH!pqj%#S7{;KVo{MEI8xvliHc&O=RX1DM;F^op1bQB~Er|S#3B+$>BlF~oD^CcN-0XCT$HEglYHlW{6x}a%Uy|u3hIK0hK~-|= zP8H%aC0%$I?KPL9_C^UB1efeS+;9es$L77J+9*|JKq%Wn>&%Nt^4@9D@7r zctLY%;mtO2&0Yc|O1v2U+on$AB7q7(&hjisDx~-=TC%1Azy^3U4mc>26MgjX6G?V5 zGW(xhO8Z)Dv9P(};Y(@Odg-!=JCcO~Wz37(s#JuI3n3}&J^Vu9oe`_JhJ88H>k2N* z_w^o=v5z+_X1ts7OS}_=mSX9V3*)4RKha!Pa_jZT9C8(u$3&+zLV~Yqw61+7*5Hp* zIYkQQr`-TBn7CYfMDFT{l5_{Mbhl3DJQBAAG8pvj^gTGa3$mD9{0t?ypu!~HJ9E#1 zWizx?8>^=q|7zzJ+wsMDU0HADHLL2sXufr$)=APp$9|&G(Uyps5oV8?(^x;0xufS~vyS=Hx683BmtH31CX5+b(S2g% zpWJwJsFlOLt8QIGHv|A%%q*1CzdHd@3on~Sf@f(J-In&IOt(%yL*vi&*$1(IjkewJ zuPz6!LSnJ%sSE7rkG%(FjOhO0B;H4PMXIRzveh9QC){LM?^Q>y3w|rXn4kup%PFj| zEK3oi!f7a`HjP9E1dR*QTQjtB+T_n!s;z~P6ln{F17FC zZjTOncyF^~lAxW{+)vK)2>@dIi?^cqCw`|M5?ceQql1h0ZAVRz^e3re+EQcdkdMUw z43wCKh%K-YdX2-ypP#%7+qd%Bk_CxM=_-V^J)KT5y3x21P+(?E)`kY@=`IutO9rpA z(iZ%cF@=rs!Hqi{V|MnLfAL&#P`^B1V4Qo?bVwf8t$o?uP>q=cQ=M|HXUJ zo!4K(e<^EC{bR|nCH3?R=5Ky`+<43m*l5+wA45GUPU%5E(=JP3G#V9odt1!L_gWzP z8Kgb73qdzzW^t(sDQ#HOZLQ5El-{4_&^r2pd7xZH4f$U3>Qcp^DPa_U7Qz8;N1@0= zO~J@d41dPOlet}#XXV7&SwG6>ar**i_2w{JR2(p;!t1YcO!QrVu;4>pgO>n6b0~VL zGnMn2|Id6%{S_zI&m@}4c}0MLI&dn|7L zql-(qOcMaxIs{B<(!<)4AnZzBa;y!FH2ODh!wd?f&E{8*)=P^Y?RH2MTE161{-1}Y?)F~P@eUXEmfw+R0@0!3Ev<|`9+WIzle7|T3Ue&IuxAyVHLz_LGgcxaRn`< zo>JC#CC!h%@EfITuC!xrJeNoq*N^u$sIwvfXC*kStO2D<3JNK-cN2Ce5`JWm<32*% zH%A7cp7ZP=wB#KO!lXv$NR$Q4=^?9*FI_&ET|8iuPt(que>yDwx~)ff?}_KO&cE9k zq$@)o9D;_RIBSuohG$zXx9rwpnG?r6TuMT1UVgs3#!!(^aXHzZO*Q5;BeQJnMIuXx_x&Jof_;fBbR!IG`1g7LD=Inr`Gm+ z)NPZYc4M3vi8$A11I=N7odbHG-u0$;=gl3W(Rk|dirX3`LB2m(Xvzq?3ZOup<+IS(Y@a9I1IqR^Jg7Q zhN%XAza#{pNEoC-p)BqDGW$ZHJ3y^Qg5sK{{tQ1->pluX+Eu1}L5T#q?|a9S@?2@I z4yUo2tLi6-=F#(TQ9V*t&2Y^1bnt)(I7bZmFKB(0)Q#8V_R@ho495kzwqvcyS+bmB zz01e=)u0@cqofACEa#sqV-gE&U;R+}VyFYtLjfotYZe7ALu z&yonrS2D5!Gtk5VM`96_FDFxS+-$z&&Kq{mREXI>?oxtWd(CxW>)1M?n$p=V^) zK`t#TBPnz>>kM(@#2Dp+kPQR*c9MKR4o<|8*w`>?{If!Qs(}!U@o^F{MNL=AUEy)q zD{TIkkwfmRWo@Hu!>@oNVxt9aj$6ne-blFuoIY%LQ%Y%sp3=IXUM8&vrGD$)^)2iu zl;PC-Ho;%^z!Ua(iI7_ z?g(8T?DS%8K~`g@k%zx*M}cfe01mHaZJ~3;#_w4i02o5&0N{r{+x6KgO9G3_51KR} z!)jr49SV{Y8MhE8aQv%kQ`*vi@ai_M)zb=vBAeK96cOn~Bd=$U2mt z<9C8u9Pm5c<jS5bSO07|peN@^n&mtcsZc9i0$eIoP7F#P4`Ytanit zuBy)T)r?Eq>IusO&6&}~re`-xPm$ZaL6SU?vaRiL#q(mrQd+ehho>Cnuntm;0} z;?#hsC2ACK2Tr%cUp2`~YXX_sYIn(d)}i#XxOJ}d4AGKszJIiW=5vd-+SI%E?ZH*Q(;7i*+0RQ&nBO|x z%24X1z{{NChH$eVPmFu@*{S!O{e^I8%0r&S!teAe1sb`^0lZ~Jfcop@yh-#p(# zdy?C{*<450pX0Od#Ce4b8|7)TS*G)oQcL28cF(HH0G*E0kuc8s0u4|#;qk!=M3YW! ze22U9yp7zHV$ZZp6jbI+8U9b980EetO1!UP^)cy)*A zhaY%!wb8$&39MY-+uk=DiadHC>#zuYxsw;wjWzXB`~LnRdF0j`%ngaUOaIANu~r*u zeBU675WQsLNwP=-W+3}_Z0mq1Hiw9^`}sAtfw%$*9|u-mEU25~2IC5oUO!lOP7M8R zT_;sgGWSkyVR#S?>uOPqt&65Jzzs2%2Oi7LJt%s5i>yEV zwY*bfv2S$ri|bK@E-*TJs+)SYoF(EM?u{*H$-B;7G&i?St8p3_Cd2>d_n7V^wk_UJ zG>C0cm*B9Rx_gYkd}h)-mNFkqWa^nhf%m}FMp^1wpa!ny71}^^yS_3*jtN*N6F0B%GpGRd@QKw?`k5#X+$FmO%tG; zAkZ<)O(pJ*!s=u8B=$Vyr5I>vzq;wI)qZ(CK4$$UB_=9SerKvD=t>z0)qxM63g#6+ zZsO`79v)sArLwUas4Ln-_-g)NCzp{c42;B`G7yNh{nAayVpUxQ?LDJM=Byw)8Cv>& znF2D0g2P4GJh2Vu7V{{^d@$7f(y#3IO;>#6xatky4_(ysSoeqC31+_YCZQ~fhMIH? z;3CVcMhRMpPf>MeX{XaJL`YRF+$uz*p5x~9@{BZL=u2n+%EQhg$n3d3yC9C8aI*~w z6a+?;?P~a!?x*I|NqAMxaufooKJHmH5+Ybz6muu%dqLZTq~dTzD3f`st<7q|Laoca zp>6N`f_BPzhm;!dA5NVX3JS7qMqXY0&z19WQ4QaeV~awgMbEcxjT5^w817~#hbD$H u^R{*W?+1zhX9w8+e+cLKZ5u6l#3lQ;6AijY|7}u06!br2ZvQ__|6k^~5g1c%@(?i$?P-QC?G3kmLU;9uw5 zkN4C4aO>9nRdw~$bk|Jx^fOPt)6;U2TnK zBd^TAvh~WpR~}z^e&yv}s)}MtQe3PY?CikC|7ji%1vL_b5&&-FwH*wnU9107@c(T7 ze82HBKybqVrQ?@Af&fILnGgVpn2*wJNemjUxQ!@}9~=Yja`X~nu`EUl2!&r6!+-N1 z2onegAbLU(RNeP`_k`m7q1S)^#$V?nIS>vZ<5nVLIOCLG6d3_7S0iCP#F+@-%l}#g z0Ab3el6PMFZ`@#loSM%z&o*v8l5arFl}`-FF`ghVR~7vywrcYHa{dR3&n^NA5QJt4 zUn_4_w#r=Am>u(e#wuV4A^e|ZFrESC$J7BJAudS(E?O5RA~hTr+vXr8HyV-V z@8crl-mndQ7HHBV*{u@Pt7r)LR8vMCsX+J1RG-8n;rXle!%3N(-KP`5(nMCvw#SHV zx%K_+D~`J#>#&55kCeqG05m|ZibbgSxLHMo2@85DElRuY+6JLyS=zPn&;|)w)0b-s zxt;y58R5h0_z{$543LCI1yP2S6u;!NgbBCtX`y&fRSAdIl{d1k6+6|xCwF+qHMvBV zd?r03jsafnHw9y>Bvmrslix=e)_TG;yH*=Xlf3G{%*`TJkuJtSr9Ow1_}O-K5vHvC zf@bD0NjrH4c55sFSf1;dZgLfW`Pj<%yJqZL1IFDW`8N?ApNt4TuUE?r6ZQW~Dm5o@ zOLQty(iV}rRqt)N9PjE~o8Ef_&BUa7rax&*sOPmlkw33JpBv8q=dF8wKKFSZ`|rb- z?D6Rb{(uWGbmB#U+_93yV-tonKjE=%J~-j7n1EO-RZW(H0b;a(Hs>rD2`fov8Iff; zF{c=+OMJUOd{KwV@K}r!_OL_D+AGg%z$~2gQ(`{i|CPLjkMu;j?pZy2ku^jjz za!fyQp;SmhF9GIw5;1&airh9<@*ZP3kS_b1URLRs%5S_}mq*G=1xfo0$w{qx`iO(2 z=ETird0|P*&BemiT~cOmqW6bM3jRL-NjbS)Z+@%{G;DnAnybio+HCL6_>>{&K)Zk5 zj|x4~_xZC@+H`fSP=D4aU6oy~G|W9O^!qRu9sod<<;+QbI3#n^MX)on7XHYnZDboN zo##J6(34x6Jd5N0^;i*cLITlWN1cg4LQ-(kD*PCWMV?;`!%bnAHrMB4eTiDyx&PJG zjm#ZE2J7UtiHoVr+QYfx(kMB94c-qHD!O4RTztZRF}#kJ3RYCctCU+LHlq~<;)^WC z`G}UEWj|@J@SU}%17W}TkbtNR=7Ry8<+OcCB&R|*Lj$8OdaTD}6X$TP&-W7+{SahK zo5{bQL4fhHBNCV}0DS5!=UCAQFI8Q18;44Njw{qs$5G_GOgrLfHKF_5%b~M8dQEOT zPu$n$<}ghZ5sb8f`7*5dpC}R8J0>kmL1Lu{vP{Z_D6E7o2e4o;+DG)iSU9=GG<2qg zf?C4(I9B5&i?*g_nGlLbjXzfH$#K8IY`o1?!6xjjD@*+( zE<8!}ayjIWDQV>UY%*Zow zUHJ3dLI6c>qh@Owi-8!# zx!AaifxMa`w58aY<14o3{92k<#<|mA@j1o0c;=k6%ZnCU84G+zQ&pX#)?2;4oe>K_n^X=)}&f43Po80ef{|#S$M|A`IW`q~s zi=)gMpmw1o()<8*QH2A&C|gP=taIaH2@g98r$bT35=pd#_Ir1 zW17Zm*?1M*bW3FXEf?va`4WXUsu7EmQmjfcywwVc@9pVZmmpFsY#MU3qG0nji;$4+ zh-FG!{<2K#`beDP5RaCi+vW_48)%h*Z#JPwu8Kyg}5-jAE%D}fh?)a-82jia51 znN^aZwa{52KF$eKT1qQ_HT4cI!b;1Ii9BC*iZ{I3*F=C*o?X{8x?g;4*kA&wlL?2k{Bf@fO*Vg8-e5<7Q>o1{Cm~$JowF>5*=_br< zWqv+Zx^49Kpb65ajCj>pDQ0QPz#pTdJYi*GXEsY@PX?;)C3nN9qSJ{z{E~6cO!l%KHO%5PxdD>IA*5Yvx&r|urp(t?lvA9Ez3Q*eM zn>NQRDxJHVIcZ^pqkZLIo}`m!;c6s6U!rL+!kKdVky7JC(uW@iAO!dYF9LNh??pT_ znK?#%9d(y^#rb)He@BI6L8jsbwq8t~abNm_6T=gH9luA~e`9o6dz%jMPr7Bohf>4gey^|6(}` zv_l_f3N_C)Hct>^GGyze5Yw6oagYs~WELhZGGAgZ_$)lKL|+i`$cjlg8ue)piL#=a z>unW}yc*q~gAaB!NkY~CAXgPrZC{MkRVCHlt6xRme615}RJDXroHIeXl^XW@Foq&} zdf7rar)=U3)N0$96`0nuok9mtf(N-uoPQ|Md1tyF1-e5DJ{U41O}oy0&>N5&7iDrQddQ zy66h%)5&_5{FaYAwz=pBvSaxgB=z1;?J9F4Mm?%a%E;D>=HCJZ;4V`=r4DD@!wlh9pjT)78*W{FZ zF@Y=}B0yq^Qf`ONkf^}dXpId^maY>+N00XKJJwsn!_~A0X_Td-r$}CIE(gNGD_zGf zL59f!2u-EkI2Gc5Kt#5VMwzLh#xoulLU~@f(5+Wi%+N{GXdST% z-?mb#Ppx*bm9zWgM2(LcCRu2D2|0+D!dxnWk_2zD2l;@e1Otv9+#hhZB|Eq8P`0Bv zYVeIqX9xR?kedq`4qf*1@fu$Bw%t39}o@ zm@W&6M-TCi?txeSEWKo}md8QBsKVQ*;Yg9t0*zro9cg@bPcm8>ZnKM@>WRdW+#ksq zH#P#5?w`_k9XVaqQSWvdB7V-;P{0$D(r$EXA-Moe(SF6E(0iBw=bQKOfe~nRwhIvp zaJ!|(sr*dgH6f6jY@YTAMiG($B+YhA5yL^!Qa|uERk{3Mi}W9DbAxs|4%P@3xMw-) z7ki~^s?{DOw;nrqMj=o3w?B(hloo#Bocx^ufRNw;vvxRdI>$-UZ>33>j+!nq<^R=m zNmdO=VrJ`%9e5z7NPex8jzZrrrt^~&8DB?1&d3rK&`_vao%lAu#_GZNGdZadaX9Ye zKi&fa03EEfJn8YpeNpeqE%)^>oaO9cxtElvY{lOa(>8o}(j}`(;(m-BQHXe$&X-EB zObSH`2}FLQOq0Cwe3za;pPIGE8cM@_4@J(L4v2hn=lnKXT!F$X-RB zJYlv8Ui?jVF0@cqoN)&C%eaz-%W*_YVhdRJ92sKc2{{uoc4A8v!1|$8H0YBk8cI!n zjLl$qx>{_GSaLG(?9Jqc_W4ZrXp%-R%zwm1-LAFYvqlS~7&fwg>NelrY3tZL75d9T z;!XfW^7=Kb6&dYteqfv9S?_Fc>P3bfGMewqGtz@}9-#A?qi#RNnnX|Yq!`rFmFNTg zb+`>)om`z7IWT#&BwDcTS0l4y_3v3P%$khSbWs-ku!Jk>U_OoO-N!KETyCMHn^E}H zN9ZHRzJeRRB)SmlCk|M@JJY||0ZmLmH03&9EN&b`(;+aZoNqj6WFjDj#Ojs`p=W^; zghumu0Sk`rgKxTE$jQWS)0M^Pw{z~sey6H-3lFj8;oC49fwh>(DO*ds+Y&Yrk_l%e z!e$1UH1UR`kXW&PC8WBv6tQhpW_A}{sb$6@uoyw;tgLlU-XK`Vk}n2gP=8l^7{ zUVK^Pi2qmKUlnlFNC1%HoH9{Yx3JMb-tZ)5$2=n*WJ;6oRL`CAl=stae(|Xg_M3b3 zSMOPXAWSJQdZOZ)d<_dtx7;eHL>) zG(LwNefw5>oeV3?HZ)N4W?A$ovZiIjT3wz=Xw$hT;uR7}tcm4R)D0e7}rM9*HUbHL{8_$nzlmWS(NLMpHnD z{1lygb3$7fTy^Vr_c`TzowlJaVp~1w-^b;+VoXbsF`6mo;a?K1=ueavvPq43Q^? z+CA{qg~N4pkidu7klGpkQ1QmEO4nVCqEF{F5@uE|Y(*gXri%>zsWoanA_n-BZ%5#a z<{m_KS9X|pj=!`%__=+xt}RC``|qNiKhiIq`5+Eqd8&!bD+_eot=K~-w?Y+_I{l?a z^lRL61p%rUFL^St*!eIIy($jlmedwjQcDSZ@t#0@s2Y-0(yel1fc8&8A+){h)8U?< zX=)?9v+kdMtd~BBb>eb?EFBsAbP-}(Kx*5*XcXKF9qkmIADk8<1Ibhr#myL`w+O4= zE?e{W&SCmh5~vWF-*1^r}n%DjD3%XP$J^;<|wpdp?#Qv1Vns>zWx#%VQ%{f^cU76wjXWSI1# zDn$ZiI6_A_8c4E`JBsZH*5v6x!mi+9DT#$lt51-yR}nYjvg!rx<|*eJ<<-&9QX%Y4|H0wC;$qvGWwY%Wv^`_VUUW#(RO!2V!*;>fOfHga@edqu8F;Ag{2Z zi1ksOV_->ovrCBSz`WG72(Fh>^T2_>8jT)(SH5^~bNdG_#tKKbRO|My3#i}rFX?$7 zTqdh2M7!Fwd*w{3TWM%9t%&Q^(CR)MbC#64(w|?RXa#a;NfoGZv_hTj%01h>=6kjc zZp8=PQb+A@nz!^IrcnS)^&I47eUf^V@D*rcwA8M8MsiS1tTaP<^m2ibcAZ27TE>68 zX9ohzw_LcFV;O)b+@+gr4PaR&TEi+X4)p^{NJk?3AwL3$yR4 z4n>_Qf%#@ugp8E-q(72K(v|GRHeYGYy=OV)-yN|BMY-FcJ?NrlZySUJ1q1>5F?4w0 z#x#n$=rgXBaE!doA||gM#Wp=FU=j8zqcVP9neEneDa70J>&#w@FedMb_ioW6TOct) za!l>yK#!eBXw<}q*A5a}p;^QUv#&FHGxIz?6}b%F{t z3B2B9?3tmOj6&v(1OfG)sT-4+N{39%#h}4P*rgx%hj*;*XiNM26D3bC*@Rm&MWUE) z#r$vN!8lrxN)FTc+$1m%fn+(jT}?{i&1|82laMKgjH0G4JqJqMNzo9g-i%v;#y1Oa zI2?ci0LW$~jpWaz8dad4K=`o{gKRXmVh1_l>YK|Sy3S>WeM2Mo+N9fgi)Tx_qTRgr zz7jp@3!NbUe77KnSjDB3i)J!^tTkLOX}s)%;jkkTBlfjb5<-z|G}aD}A$d|pQ2(p< zJVAis#;=NF_ZvAXx81eF^7gTYvDa)~b20Lt5)kro*?{yhgk0dj711o(Vt=+Kw0`M~ z`N*$ym{W+o!%69SFq&g}p-lmu7BUBBpiVp*ukq6s-DZ@}Uu3E2WdILNtx1NCpC{E?^*K6YV0WTv|7}dERiW^k3GR3NFwX2+2S2jE+eFYQ;;~mH z>;r(B28;Lfcn2XPdTBHVidbr*mat09qJwH!%UL#yAlMOGAc<5v?ugd(@zg`jg~?H3 zK~n^*WAphA|9u!n^?>t;iV6o44gp!d2+lZm^|al(aZhhot^rR3iqv<9KQjYl%tNF0 z7Af`3+}yYT+|p>dC^T8$n1oLT= z7a=B^=evNRV+e4DfMg;y&I=phxsW@y9_nVF<98)tO>_3;c;mbjZ}p1qf@#LaF&?4g z(uFHt&Jwlur`{W)}DDzv^+UX&l&)u+gx_Kk;1#fnYNLuH% zRQQmr^Ev9#hd33sG{8C<{vq&m*u3OJA?y~Cnlg{HOhjn)&s?HNRQqFu*>@NX|ETNX zo5f;%vbRUejPb-HE8%`T+W!;SHRLss4jw@JU2ORkc#g#9skEEys^(K6Sl+|zb8T}` zZZ1Vj&SC_i2xXq|)LM`fkgX$%f}%ehFS026JJgg)sV4IrPMwwe-Vf;uRfuRp9Ly$0 z-r$H^hfDaHMOX?G)1*~QeOOaL={>ryr!k9=W>u}e-KtM|bCXWom+GG}_Rh5-ieI>u znOEN@Hs11t(6M~x^x5e7_&#QUe&>4D#gP9AR5J4h7GMTkQ5%i1LBX0 zM4L{rg^e~$_oS{u9FU#6QdET1NF=}5ySSBYwm$fuQ#&$DRj7uDY;o6ETy7~C zQY~Tr7*1?E)HeF)+1&o&Ytop}FqBV&QEIbl$W~$s(NdB&ez<3=Qx)VF&de;1&gbsH z?9XLM-=w?w7@|4Ho;*WvOedPS#G}z-(mD&#( z?rRM`&PhAN9`@O=R0)A;Iro-ioB-@&Wj&C^4vq_7gSmY!$b{c_QZX!0%Wrtb3eDoZ z5E71>g$-v#L4onkgEY!Ws|o6kFj)Cy1+B~NSwX6!-*BB|y>KQRY%I`zw@%DJIQ6uy zzxb@Cdiv+Lb(W+5Wks_0vs@OR!F%sMrK2YZVCs9>({cbNUQ>LU)V?f7ne#J7X*N z{SzX28ev;b>zEk61bTgVTXNbj`OXwsR4yK#N|$D+hWZ~k!mP2;-73qCEt>rzD;s$xgT{-u;##V zEZhHY#Z_BO-V;eQMUOOzT2eJ*dw-UJap2ksR@#chN5Y!UX}()*0r=D{D_2J=^n(`$ zdvZV}as=)Hrj&#zhgTg+ESm8J_l|SWOzEecLTTbXKU)v+tBR14r{+xWqOy+4t})8t z`Ov&Sg+I@y0-7ds8yo0q+f1^DTwOkBQb8BVx@pr2$J2K`^AAXvCc9Xu%*vrj{Vq+& zRQ!@pKf8MKt#%@8|D9zJY+he8Ys#xAg@Lny8r=C!&mAEk*_r;hB=K%mYNKcYMYuk} zTvr{O-G;9NGM!qUE+bf~&IAreY{kO`y*@wr1|U>Fi?X!Z#C5g%lupwOX1TLN^?va~ z$Y|T8^l9!0d&{>_u8zL!*`2ZU4+X*L}~^!!p#U#)WWmc@vfe+--?+ zsgh%MPcREEU6_&u;H7};KXRrL^0MyJJ4FwxA-t?7jP^q0GjY(n?u3_$NP3m2G`Z~G zMxD%5B`+gs@x@^D0cv&ocigX9P$l$}hz?B$BlrW|iDk*hrN_31JT^=MD5XF!`(L!~ zV~Hf}yo|Zk15Y*S8^R4lmU=0MDqCN?6|YEaj}au16v)lCH$3zINSKkPO@2P1tgqLM z43i=n*H`b4P4b)nG5?8_N&tZ#g3Rn$@wLN-gpytnvl{P%v#=lL4oRl%O6l!>gRzvT zy*i5PC_eF*e5orFrHg#?Z=Tbv#}6m()_SJ3T6c*p4;*VQ5iB(`Qy+)4*EF_2JO#iB z>UC1xe)m5_h|hu#^(zgCpUs`^#XA!eNI3>0_0OqslX6yyX%^YMe>YlnFw2s=9tAX* z`p>Mo1^^m?r#vwv`Ju2Ta#Q$GY(yCuSSv<0HqC)|K=w$j+Z%De6aX}GQ6?f6r8~w; zZT(lHn(Fa~FDVM1@pld%Rc5@|=1JWB_PBm0q_Zr{642V5SSHD?d3Lg@ccb@r_~)E` zyc>(SPfD@DQ3@vwpYg$pTw=DXA6l95Zi3(8&I!DBw|vscHk7^H-xr7GN21c0giP^W zJ{IXW&FWi4b0Wx|)EP>&YM5auQiqtc&v1oUIH^%|P<mvYQ_29$n+xh-#;8P7v7hh!mEq@3+v?Z+nrTextXM;emgqO+zxkVm@Nq{ z)PW9$6PY{OSOOTg#HGuXIiUnTa{gB1(8`K^Ra4qkcT*A3xc8x%7A@s7=n5+->sp-4 zRa#C z6OOdd826z0sMNP2Qbf|i2S`*6(#O)u?4(Y`1S2lYlWr11tfoj7xnLj$x8xK|>9P-O zM46C)Gwy)^BX3>D?0VI`3+l{L=MoK7d3hzYS(7pw3$V5sQ)w~|GUazOV$8)KhNwid zzz`2_#Vovd7x`^s7FnIg(;jImHRcJY>&k|@#N)y#ul(lQ*3W-y3%?UY!^_y5EE&B6 zxXSg-7pYQo(XbU3ErKP)7 zPhfnB=p_#TKsM!xdp3y$|IlJlQ~E~CntM^02nNFy-N9oZCAf3Ir}?WIeF&GE5Rd=d z13nQSMHV^!f&x~@%)Zb`RGcwqvNGd?m!2UCI!TJ8lzf>R{5kmHR-t(dCJ|-!=W1`gYDi?=AO6F<}Mod0k-=VIw!7kkqLy3vS;xr~S zSW+oXQe@zBo0;CkgecgPAw{&D;=^n|SU8cHq%=D7h=qSs>(Xa7b8P!_wsnGp;@yVt zJLzy*nIZUKIPiBqt*6$-Yelkd8uqv-n$v}g2yTym>~Z9p%}+EE1ozaYZwT=BmE*FqqBKQE;Ebc%%!4hL3Y8+s78zLALVE$nY(n| zUbPk*bu7@AbmYmT%j3_54a$ojLLkfs>;RGA->Dv%sSu}xENN+Ciy8w}X{aixp*<2h zl@R$?CCos8@5ILMF~kqtQSL-d4|G+Fz)~;~bkjfi){jA1Y1+Fr+z4bFG;U<75Yb*K zTJXFliHYCG8o6euVRK$s)}X`zJLyu9d%-kuRgm!yb#2U??6{&(VgV*0XmYZpA6=7$ ztt(xcJgr-c3i@^fv2`T^SK!||1=%EiP+ikVS09H6-_#>Ye@c;WduWqng?jsIKdcg$Cw!d;2bB8HE1YcK+pQv|t;%Hqdb z|MCQrI;n6%1zz>1H=B=5%U*e#e;hVRI2qIHKK{`^3v#lz4Ad`#$_WSW5A^(NH8@VL z!TlyBJ?R;i4bu~3dL*FFN{~evNJ$>pWgDSJ=i`6^;0ugM*A4zke|pZXbZ3gg+~0W-9$piLyo=9Z;KSBk`ZK-}^UV=qo?Cx2sGzF~zk*fe7BUR0n{!UO&J|19@ zLOg6vUtt{&?#sPolh)8`nAQ|gel0%X<6fgt|2QXS9`o@5^3u|fQNfzD!b74*3d*R# zwc#OOtB@oRL5sfUfhG~n+O^;|iKvk-mflltbVRxzEw$>&&+ofv9W=f1=kuEX*TKuu zCJYwc5w*Yi>&1Jo5ClQZ0V$Ih$)joox)_mF?Pa^cee3TBF!>NnM9Ag~@$cY9!|*~ITR^~whYV4cF@Kl< zU;>fgOiY|q@qlna-Eb6t1H}ND{Jm&e_zo^VZ+JtX-$fbUodE@c1~RK;ZAKE_(zR0n z*)t6&ftv_ynnr3d#zQ~j#_?7;7ddki3Zz3t&%Xo(3Len4t4i z420+NF6udcI1nz}%ZBWYf8j4Hp#ZoT-$7p!x$4^w%hq(a0h!mf6MaY?PWb^TyAI6bIx4Z|omFa+}IDKTpufF9