From ef5c356bcda5b2ffee6b5eed4a5251e75fad480d Mon Sep 17 00:00:00 2001 From: CraftBlack <80093376+CraftBlack@users.noreply.github.com> Date: Thu, 4 Dec 2025 11:17:07 +0800 Subject: [PATCH] Add files via upload --- Screenshot_29.png | Bin 0 -> 20949 bytes __init__.py | 16 +++++++++ res_node.py | 84 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 100 insertions(+) create mode 100644 Screenshot_29.png create mode 100644 __init__.py create mode 100644 res_node.py diff --git a/Screenshot_29.png b/Screenshot_29.png new file mode 100644 index 0000000000000000000000000000000000000000..d69afdfa22e71287a4b10b0b72f2eaee715ec84e GIT binary patch literal 20949 zcmZU)bzD_V_dYBjB`F98k(LrT97>RuQjn7FgLHQt8l*u&x&)*{y5SI#($ZarPB|bT z{o8my-{-kM@B0Vv*?acPteIKsTGv`@2z#&a7Vi=HqX!Qj;K@i!DnEFD0tJ2!u`qx) z)2qgIz#kMR<+tJw%7!U+fQN@>V)9}S9#lr-TpOSR&)D|TT22oh;CJ5tp!C`m8b5fT zWGN#lrV4`|e8H}v=yw0b&jjKBHCrWi9IR!%W|U6W>lzwIxF*#5C*|QYaYK$U%5MXP zXyT}W4+28P3?I|@4@Hr_mZqVt@p~;DDkc66welU-&yNpL53U@O8k={Ad^deGT=skx z$A!lixrI+MoqWvlo2L#lZsp}&G^Twpsl6&3E*7>#%tY=kM$Wa%k=+m?8wdA=<6N-qi{41YDeZrr*rRnaYP!KPaLv_^xc;PXSU^yx2=Px;GpK z;u0IoUsy14$nd3lE&f95-jkR^95-yp$m-U_)DS1-QrBO7zY%#47s&)mI&L;MoMN}Un@ zh}y!&`8D}7UR#bkpWU`|O=<=)^xY{=^QMZ|@IzjS*gCJ4v!n=pN@5U1 zytiuQRCY-HOf^9ZtY`xDVWK$?q%zqcOL5Ifv0TT#b+aD$lYgy3dw z1dY_e9_ycFE_MfaWQoL14UYur;gL>K+#fJG;?3yf2U(dwKbK=I;|Q<1gPAEXi6G^a z*eg2Gcv`MX(dL~6fjI}87w`1;IpDcMY*(jx^Cok92ge5^uCun6;x6$fvrM6DBpM}g zINerCLw_}n)|L}AZT&U$fh7Ke%u3rCyiTDFnjJ~6c3FipGrkP4AYWP9Flo}wQv+KO zc7yJ{cf_X^qL`&Qdind@-;zeoZcje`Z*TeJA~cK*Gxw{8y~Bhg36F_BHyENSg=-MU zvA(?c#34wX`#Gtrav=VCL1?jw25cVpp{a4I3 z@rcl94wY-m{z!XijyhwzK;Z1v2u}EPcIw)_rb;XrUcwxz=EofK9)A9y#qJXpFGX5q zT~M9J<{lcee@ssxvo$rUU?wX!W?`UtHmCl5@r|F*QS5=kNetIwt5JQF>#Hf*7URsB zi-G8jb@0^y!N14uVim8DdT8)tfFyNMk*(wLzOyTt$Us$m2G!$nN`Zm-DF;ko~Rp@a4?3I8V6qbhdyf#|oh`|l~Zbfu0O@*-M8&eRmO zV|`kW@*su1x*sC`XWQFo>u94TIJ!KwkYenAj|R4FL%T|8#XKL2;uFl090fU#7pci+;wy%tmOwas-E~r z>*!L|3t2?$xh%kiEFdAIzua0+zECXR-JWC920Eiad`?UB)fjYZU<88u9JL(cShQDu zegr~CuTM50zKuHVQeo$5%h&nZ4`>5pmad1EuOlzUl3FLg%Rdo$&e*i{LcTZCzF*=X z+HGTQY*Aq5rRUK?%0uyl;-RAYcbC&nrFwsODqzvC5Lhp{fx&~sI!V}rRPyFgqE0Ef zKKVQX-@pAn<9l}_zufBWq#%`qMzJ@KnB<}jBqX9(cEW0R+9&TW}BQevsyI5b^?zu??;)U4r2F&SMfP-lpFmCFU-&A#TJcPP>kZH9ve zj;G0E9T@!J^b`&55$W^`!^a&j#-ij)>{>-evJDZ>NT}%7t(wo+o1QB&C2DN$ch$e z*aCi46kT_BT{m4C!Zv^P%;2o9!Ge$gdBBBT#0ZRjsQZ(?1Vv0@LR*BK4$T5QJHzy< z-K-{KogQSZ)j(%ox%Ma~D)+I2Bm-2?4tu)4Lh8jHJprgx?%B8clarF@X6s&;lh1z~ zb#tkzC|xP~RJ!(hXmhpScUuvVkkUZ2OtMjs*$gFNQyYA37xGGoT858tPY{y|<{HBv ze~9NY?j3lw1P1XC3eeN;9pQxs%L^c+TRX z&AgSi`^9?o3QIHEUa<8G0qtZ5Un?>)9meT_2kpLre?CPb5;^5-*tc<}#ynRU9diqOS`&nq6%s_Z-W;IZixH1B?vfc?c z+CJ$H;`zOk?MZ7bt8o+?>K8Xdng_-ciwmJ-r+Z9;@Y z+Q~Nv1VdnqcF6tjz^^a>nhcns;#e|d_rO8)hQ#iPL@)q(+g$?2$%Nw4b~BT&v1qX+ zkVN9r9q$1!iRBpUeWnS2OX2VkfI1>S6^Ss7j9TEE+*kO*zkk{zZm!zyJOQv`c>S+F zPaw2`^q*LuZM2=*jDdvW9|L;Wx}L#)R3rj(#jI46_ydy%|5v75$=0jIU#V@EC2jpp z$Al-PcHXj)M)yL{t!}2-4Sx*^GWeM#wt0K?i?5g3*DHENdx1t$4FYLBZ+SlCb9G=Q za*}d0RNv;E%fFo^F;pPB*h}F$Gd=mo512#pBe-F;GbF9js5jLpia%ciE}km`U%s)0 zHnrWJ&Tdu>ym96J&~B2im^osMens+{i|P%7;+qcec;h=_PLNvR<{`%YByc- zJ{fEX3Oxr#DSo8!YCWbrrQEm0O&`)NE1h68fHP26v;Rsnw#u&F?@!%uhX}Jy%UC6S|mkJ_eS{6vlGyo=40c}z`iaPkr;WzRF6M5LM z7WMJ;ZlXZM#^+CGX7Sj~#fV~`i7t^UodF! z`d^bRwH#NR)QegTNQc1Rd?Fi_SYM(@Xm;5T5xw>;c5b^luw%6V^j3N@r*DAd`Fg;{ zy>AMUvypi&+#xBg8IqXORm(v71}<&qMoU9b1nJ=MM~(M4Daz@JGYPXQ=xm;l)ovrg zFn)G$!1Az(0tk~J>rEu~oOm5KfUqV}uf&tsvtZaoj@It8d$bf6^R^)oG4z9^#Kuf} zNDbXwwhI~EJ_%Nh&LNFGOTw@3gxrM3WLl)ke(01Wb%_m3MX@3SrsgqFd(ip7gF%2s z=8``yuj!JN(jL>+R0XUoMwK`Z#!#NMh}$g=D7|6lL7jb=xV=)C#@mtkd;m!&fdMmrK^Y1fJD9Jx8!quuN23kw!oB)0 z1iW}W%q53a1nc<38`nU#lh{>QRbiiKATG^<^&DDWP$GrB>wlRA)ouW#n z+(MDnEyuk0J9zQWu04^N1=5_w$q)4kmG}mlW?SX{uVM@0X_aeF;tS$Q`s1o`iN%$J zLJ1tJMP*+-EDFuewLBNXpY{szknvbwt=V1fEI zjFo2}hO~g7qBN-WR8le! zMusOgq?M<9R)%4nj0K8Td>$C%i1t{bgYamlAT#6Y+eL|HKg$w8^Ip^&{K*^T%^(!- z$A0LwU)j5<-KNxEZ;g-=WzUnvDso1|*lBe|Jf`1&||@R~Jb za-kr?%pU4_P}|s;22e?s&(wE+dQDe5f;Kw|MEAcRZww5@&`LNuDDZDQIT;rGaDlBE!U0xDKlS%QLWINB?GT8Bsj@l)3&ZW7Ux8RUJV_NtQS`R^Rh6DUi2vr z7Aoa9mi9ZW^=uq>dDL)J;t~cYGEK?isCImOG|u`(4}Yrh^kU@hdSt<@D^4gF?^$A6 zEBPucd~EslVA(Y(KxqGZ!CpMJ$A%MC!;4oNXFRbEPrJ~S3_)rcX^Hq$EMo9o^h~+= z84(EL13oJGYV-a*jezvvEi1vrT*t?DYo&g($6tTU5wtnG-r9Q8mw};0X>79E%}chr zfyB!AJW67QW2Y;Vb}R-^@h9}u@`dE7#yQ^<$$nO_oIZ{#hOJR>ebSF$?(!S}*RL;` zP)eFcXlj2YB%6}>C(o(dYWgj4xgMWj>CMvyQJTPbw8yC}_}SGP!EP2s;ji<8 z!d%9dEw^Z;z1Fu9*AR8kAm%+{jL`ZC+HUhfad;Ts(>D?I6Z1ddl1#qS=sKx{nRTs% z&>d?7kI8}F{78k{#0<;l_}l;9Xd3&}BqH|x3tnD0 zAF>Q%;T>r$3`NouXON&P=!ixHynrM4he5d8K8Srwh6N?!K!p)@X+ zL_-&GqYRmL8diWNvR)rC7fSPZdPoHg$z$+FEwdu4S=C903^)#fJY>ZEaqu8ff5`8V z5`LA@d|!Ey7r;@8zuHUbraOvAFj)^0FtW4&mPq{L9WjLP>sPzU7GkmWV2)|V(B^W57T4nR(?R`4tv2Gz=Ob5Q!j3D zs&N&Y?TWyAQSXIKn@gx93yPPAwiFr-4evLx^Z?8 z(?J~!fvR+b9OOYt^*#fP(9i5kwRnI~?`ZHZ66N7B?9_NNSTbmI%gP1UkAXdE3@^0# zKo})*Y3|YzA>14wC=nEV_S5m%x2^F`tQ~ABj>FRxXA}aBB+OW}lozN5XPtuwrw&Kd zcS!2pOPUoWjO~-jbW&0^xC6n{H&*q@?$b02oJKwC`0oiX0H)Q2lN)hT83W@Cc(}et z!pJT6XNdPPI=9*I;H1l+qg6{7ZFaH&Sr#V_l9AV#EaA;YZRBwWX&Iq9TpOkdApaSP zn4#qtbR5z@;Tri@qxnmpr^*5iny3buDKttz2$GN|&sPeyTf*F4u3#UEK?*H8NZ?(p zCrN#sgNvlU2z-tLprzX792O|gA%h{j)-x4Uh;9liO~@+O7WvZKNb<=qq!+SUfvPxk zvNgsxT{vNuA;Q03v`?@`w1bc%B3 z{|8!x_d`i#Rap=GB*__kgd3L4z?vxqFAMYs8?G~DK4wH#E)DCC5&bio)yM;Dh(;_d zNE|gPJG0)ht0asF(W&pF0mll+dJJ-)f#%kqycTMf!m*yEi*mM@kQ0YAj~tpp)TGXh;q2Tp_$hEL8@s54auWKq|uL#Gof0&#%O z4B;dY?N(bH&@Wey9 zeMQLN0k%r`EVQ0%^^p=@7H~oe1tQ=)Zw-;CF0RVyT&^XBfOQVns`G}B%>b1XuwfhGF zAWTD9K*O}K4UY{c27)$KL4eo<(#uIjfaHDdje1DTK}iWAbr-JtK?0KxXu<|QUlrF$ z=PJWOW~=BNnzm1N8)mEl5n-O6&W{IyILQ7lcn(;aBz6lD!8R}gfF}|82THXo4S*uG zLiv!ioe#z$PafL?REov?$s6!;mCMWbO@T2rgtcA+bWq%=*Kh0U{DIc66^A-=4$FTC zNdH=r#C!uy!}#Hhd9`$Wcsvug{EWFvD3Q%3t~f&6G&)9$+>e)pz%;4C?8}2QHsbaS z|7^|u*%uGv*Lq~LMULCkl?z-k!y@>?r)(R$_7X$55Q*7fsKN_L1V%P1Pm91qjL);# zodTY7RBX*E*H0v3`XF)N2*^Jv)p!8uc&c*sT}oUZL?l}Iacm)Gw`^=~%=XXApmtI= z&7UPf76HErsRIjwFwu8z`em9##&-YV91%N^S}$Yc!~0JFR|^Ct@IdpojM-@AaO_ zd|_5-`np~7%H+r2M5Kwd3Nm&Dm7kAwk>Tr7pEN^+=tXt+PXPl(KQs-^{)bwSLYgR;^~I(00@w+7NM9zANX&NO z{Cz=O>nsNNVj6wxCmGAHQHaG^&|hKWbr$B~^s__#MD!nXELDDLCVpTnhehjvw%jgU zXV1Bny7^7H2n+dW#{3hO7$)zbS38O1Jw}9*F8N!_Ql_Yfh7$qkF@ahPYYD~$a=C=c z0{2YPBn1c{#VtRF?^(7xv5)qCjIiFe1M)!huYhc`6Zd+SFK9ZAM^s7*pcPe8n0#f7 z;!O=zp^;31F}Z%89O8IXA44k@PSlFx_2A~K;te-f=Oc^5Ul$eM0vqsget_eP;6sXD zu!#vtxpdM$)WSY~#GJ675&ABPFc#yV(8h=O{()4owc$@bKbXzrF@z=Bhu8)!zz@d` z#@x_MML>{*8A>eP5r7#Pk`m5jgG zAPYTK=!zUp=jY~A=}zV}3MaBxEnVvBj(C>|WWaadxEtVTFuz#{B=ofugLC1%=R}Pv zo-7Fm#h!`}(Bmev;(Ej9-ZYwboD!EWBD$|C3_6>(m^0M7U9L-(lyT|%F9BQ&s{fB1dcA)2?e9MSXtPap7w zlLBGOBR$m<;xa->INkfMTBf`wTK(&ZF$^6Hih|T(tl|lMY?W*m??jj*svi)GO6JpP zd?uP|9;ka*iAy^hn+T(04~yWyl3EXP<0}hQO3V{+O_63oN|vP(GRXNz8qb!9Xu7V= z8MrPKj&`wTQHeeLbcnH#kaq!QCWPbyNsHxl4I^K5wA?U#Jez=zSQ=P#(2ITc=8l@r z9AP-$!z(JSBgj5dzO+bH2O*?5G3zgGyQ0nl&PPkz^Ea)JClf@ z-!%FfRpd(HAk>7NNo16INtYBw^GoXpkTfVDQjeXMmoVJ5YCd~(omo8gk6r79=_sPM z^FhCBcSM7<(e&dPR1zL7I^UX~kAW((ttLY#$RX;?;xu0w4kMHLS{6)$8l?>Pap`ZT^U6;==97lALvIoNT(s;l1oZUcPEuH_p~*J1bPER{ zuoOJDoK5z^HN{nreh^B!aQUN3&kcfnr~4R;5dSC>&R1xU{^#vKaZ>8`pYET$KXByR zmBObFE!!`}0x(=6$W~pGP+QsRLIDC~noe|>RGB8Jj8O~LBjjVu<(K8^ zInDdwAOjpywrw?$if+~cqLDwwHgv|Ub?KXTI_?vGR^;Dhy?;Z`qen!>azt5dr00O^*4&M_`vD<^$I$;`UYZHnaktRhnOAU? zb|5KZhy%Lo&q-uw*3k%vz#@AVj@Q%8_lfWx1^t{P>;5oNh1ds$1DShzT>FuG3MQ7G z?NTItpHqMNPd1*OWr_NF1=Er^lTduD%b}ODK!BY&Ed0DMC#v5CdUx)72hg+J*t^T} zJ1!te4&QCa0@it73iNn}2{1bWrZ3J!KxP|&OeSI=>LHA!sSM*QqwNG3AN_$OE%csh zO8&*|n3~Qq3}qrEk#+(0qtMqvEQBNGdNt-s=lfWPa@Yx<1kof^yAmKspsK*2w1aTj zGaIPWMAAXl!{D_?ud-kzK+ZB=Qo9T1djsH?yLH%^p+sbZuV{!L^-r+S)oE3mZYX>R zY-Hk+WZ*_?=nxl@!L$}bRDW|Ta74;7NiWhzg{m9x0foVgk9tgD#JTM4UmC^6WV|M% z7%e45&U_>(JhcQ#HGc)8cs@f(Jm3)2kHvig!471_evD$O63o25PBPoqXN%K`7iVGt zeqJX15V`1HLkO~1a1LF2NfP-CWFmWUX4afxn~ZaOTpZDYXDd*jaVR3?9`m(@ZDZ!t zY5c3T8?|h*PX3qZt^||7IO8ms49!0A6!cd(=FC`?D4HO(#v@lKkn|TU_4^Z3r3dP& z-lJ(at=?PnsT;R4!3qr#`dq)v+px3HP!&lhGa+{DvNnG;Bur{6!mDX^M>sRjw(1I{ ze+ujjmJaWkhdhs?qm_XVs>52u`-QeaX{J4E>#tb08OnTD)m;uJCzg$KSJ^*#XJ+WS ztE{Py+pF~Wu#?o=^rG}yHAJfLm=*gcc7so$q8#)h_d{xMe01fSM|ChU+*%7SjH#g! z&n0+{!>3r@w5rFdfrgayGN}I=17pzVYi(IxFf!O$OI&52pT}K*OLM)4(-W4_uLrhn zrdoM~^@ubc5bNa989)?emErEd?z}er_eV5;w zB6b*M=@v{>0@drh?yuZqx{wxVE|X>zeXpIN`73d?_6xlTQ0olA)u47%9$3~)?<#{m zP%xz#z>4FcBf=&Qn{j^!TwL(@khGd#Jy7kiXEr@lo>7;sYb+XCab5Sln_c4YL(HE- zoJ0mlAGJZK5oEr%qm=ddGgnXKvm{xw>Aq65X7X63N62g-V0Zk%LCdgmOBk~YTxSVX z#d>0Q0Mx0JY2U+Z(e7>GKb5Xrb@(5z-=lAd#ifh=Iu%~62L2AK2Wr)u6Do>8;cUVY z5yn&;h4U^ONZ!X-uG}XUCQrrwT}}gX3wTeur*mMndDRwyHfn8 z7zy-C+;5&a4KMb{`Sd08+qrWanu?SqViw`sd-)17-g!TmJOAJohy7doxRTQ>dVHYh zA;44ag{0tGkje`^&$#HZUa%NkYSA-`7%Aa?W_E*bRF+z{B{kOTz82YdJ}bn^M^;UH zr8fh$lY476Ee1hO&Si|8uS$7bYy|4zJ+VWi`y_F4>+cB&ins1^_vl`QW!B#C)vHkgKI!~H$Gxt zw3VDJAN1wLMP4jw3gd-EVM4bB{7gJ*U5tHesHgT4d4LUg_H=rP$Mk^LsP1sKmqf+0 z$Dbp|!$dpM!jd!pYol38c`4WC_au)h`#jE}**|kQi)78@kttsij)RELCtW6tgip{% zTHeZlIwJ;-uNoK1&%Svf(Y{S`$^d&@Z~XIExAN;=S}9y)!Fmv$*RyaD&slDYu6b1J zR=;EJJy`Qn&vuR+^E6ACTj&|@!2ZFHj6O~{&6bpwL;1o?t+@Mv1=nWl)^Beyj{uwk zu}fr}hj5EzxmoOc_!B!B+=kv{#j4VUA5hPR?aYfl!YRSM6XZ_=yN4HrG> z`TN9G1kPw`h`q(y9^JDn=oWnz?8Q=S=x@5drJiqcBfl7?SJLeSv>DB~!?&wo{u(NE zF1mg7Y-*_6D&-TPCJ{!F@@YZa`{kJXWV-08*59s7&fZqhjnkPo@yw(8Kv<9E&Tix* z+^X`N*Ks1YgIZ;6mScnz;fu97@4Q^FZhpy5))jj&qc7mRb%5=i)-XA-=raR#mQ38PrjnEkt7`he{1atfiXjhkgq`%x==I0c0uXoQR|a&HG7 zj?bQ@&(1g2mAnbkr?wtD$D8ey9cXq<94V>3Nm#J?n5UqgGKV(Z-&KD^zOTn+Sj`MaW;bLFP@g-UhG@#LO%gVEeC$HCZJ-BX3xkbe7 ziqQ0YN^Klu)ALTVuz97p=<5*B%n<9L1Q-4aql_gi$1A(MwTK$7*>_(Rp+3(6yQ|xI z4Oq{4C3uKmI4P-D#mT9h=qAXW)O?E%d9f32w%AiLltAE}ZR=a=u=K~{r2XU8;I87E z;;a6Msh(xC=mF}cQAFTZVJDX)qB!^eOhal{B-FN!a@sZ4_=$eAKO-bBjV87YB9=k<1$1el`k>+ zC0=t#;Z-M&^ObQbbstqouO}raZFBI8rH80Ms@*_wg|J;$AQX1UlV3Y__E~l)JV_$> z6e7v+Q9akyv9X3%FE69vyE~6(?6Og6n(fd=Uc%$}Nh>>!t%Wa2^#$4uE@wp5&XYE~ zXIK8-X?=1kXKj2#Df5$X)zq@VI*~YUUT(%I3dgqAOrC!^lew;l`IrgfK@{-wgIsXx z;Pcrjd-aY;iRz0rNF}t4T0>qZZa(F%x$>i=N>DE5|rB0+)?Th7b@Ndh3cW&Z8p2`5%0g(A0 zqo?%BGtEgqN7Sb=RSovnO>_+8Ta0`-SqiC7?pXw-_6T3iw4B5)fYs;f)LFJW7h6uw zr53;bjJ+^&r5>(3vw&%%)_4eN=cG*hLSP=xfBGD@wPZE8si%k1kK=^bbX80Uc$~CH zWxmFF78XZsgru1;n@!_^rDZ&Il_U}pl<$)-p6rdWHcBR%uRpSU(C_PiIiC^ub^z{N5qg@yxDo=@gtSrHL9m6*Mu;^wnBh~EU8xR=KvCA_>Efj z4Y;|gw+3Bh;rL%A)Y>S7r%`#1e7iKxovo_<^Bw0xr^}S(s?b?Gt?d1Pby*wDG|7hT z$VwPswmARX?m9S~*sQp#JZ2{QPg}WvHsQ>N4 zX#Z_!I8#;ci9p`MwchhN*JgOI*&HTpb+$?S@}K29o;8r3ATJ;9_BBM~RMEke_&={b zbQ6Bka7pF2MXIP=FUSUgeEFbl=<{0MY17t3R1))$ZnPhr8=6sKTQ6%%`sslYOIhmI zf@pF8=HY#@(E{$>R6#}rt&ZIoONAx(>7jpr#zlkl8}5~Z~V(M07s z=S#Yr+KaXjn&rlbNDJj24YrF{qMQYZ?D&@I@U!;@C@i)ajb{(Tn$g8 zs^WG--|~?@+-vz_#nmP4h76_{&}fc0qe$a@>r`F|x}cpyLVtAS2-Q|`#-Qb()Ox=U z#bNvnr>;*%A2` z7YxqfO|M@HIV4bez>|m*Bhyia5zcqI!pnTV?rbr< zP?A2==jZ>hTWIcmm*DmihSPj{y_2KfpTj>3U>B>YXb!yQem*JXg_|Zo%F6>IU$6Z| z=(2x}*!|gV4UST721MVOCAMR6-#k0!n+2i`8)7;t}$6DwPN`0gS0b6up;vo3l>;+ELT&3dk`$+cX z6H7{QFEO)%&;YNb0BAi=Oy5Getwy{tmrAt>-l5vrFlCbZyu)+@na@9ANEYrYflv_WO-H$F-y2dfBEyWdn5j&jky}C-xyD$E zkk9r+S>b=CeK7)msU|#SaUTMdJX+|TtLgR4N0rMe{PM>k?hVp#Q{P61jw!&5^EbQi zP}AehZn2|hg-=`k z;ON$&Tq)8$3){!b*dX-HgxH#l50qQS64~h(jaUTbw;t7a=#~U&6GDI*GZ65(Dd8Z{ z-9(V4(Q&hY3yr8UOfP#x`{?Myk#ffDdxcm+J6V;HD_2e~0>#YnD2v*5Kr`x#-7kkM zgcU69*njl96|)30ACcc`?{tBo3rkzK%!@}q9-V5c6W_0Na)nkPdALWU^5%yzl`^^# zi&#D*0RaX%Zl9wTXjHVBRso6757t@Ip`|`eR==meyWc|##JSb?*RB_0CJWy-NUn zC#-PXp__j5jAHTk`sdL4)#GovNm|*Hnwbg5aO(w~Q=#w&&--g^SQ4*)?kssPDYozr zrMsG4m}x7Z0ybaz)D+HBzY^fAtNjeZm$La*&Ho{$Q*gpe?>q+`>!cz@A88hC6Uwtu zU9T?d!ON~xPgiI*Rkh_kF|fk;eQvv?{OJMa7KZ3H*9*DZ?+}JT&nXT8*0IQzZtc)Z zv(xKvLwi?2D)o8@RHPD(5K%i2;i5-0 z%*g^GqB%i#h4peLonM>CmOOlOpW5%yIVph9?0mb0PIh}uN9w@gsx7lk4iSyMhwM(n zU_336!3~$SiQb_Q>bFj-c%rXU1_NeoelOhuTnw5s$^&)(we%yuO7ZV0$9;o(2C#gr zs4=!34##kcKFwutiX+!YyBT)jYqe?hvMlLe*8gd(?YbB1qIG=B>m=jk-1lul?hpZ_KUq)bMyFM= zt*VpacAoTQ%g}bO$FgV|kE}>T=e4bMiHEhN|6k4azWm+S2kH#II^8on3-H&Y(W`@5 zMYw6ab(>e?9Mt51Cgk+InC30&Ac-Ph_?ADedHYqQK#ORl@(bt*|4Yx>_pFE@=c}`W zv=f$0fV7-_*zA}sra|NzOn*=d_kq_LH?u6xo9?Txc_Jf9l8Riy(-MPEhAN7vOM1U1 zexL>v|3ug8j#rJyq1wJLQ}u-pvdd)CN%TuWu)K$363dcrEB*NMCD5IB(Ci)cAxGxj zY&O+iP!5J2Ps-&w^#b?#X~?9}dn-VdA$`Zay-P1sgj<-jJ`qEZx8);Lwzu%*&z73+ zkv^B@>>O7I_4-kFPBTTq9k2PjngJSU`XLe*oBbi6MX~HuUOpKX@7}jU5jWK$At@tX zTkl@76~e?a+o&vW_s2s_rEZg2I$}v78J&Kbzpa>0 z|JLqCJS7Q+xwMqkBYLFaIq2VJyI*@dGa$+ZrVUX9;pBP(Y~00nnguX=S&A~xKWO6> zte0=uEU%B}&OKyC32>u+b~Q6J--cG>EWcwM^m$59Ji7OUL9mYCB|s;$54W`MaWo9| z(hFxuodUf?l*+W#RXdL5ZJNZM_RxC4@2N8Tf!`n8c+-)+43>I`2i1P&SM^i(85hL& zTyz}O6v?4yzaqIpexC#Xmy)$ylX}-!4^1c?@OE-_kJ6P8xpPp9vna{TnR;%yba!Ox z(nbUrIYY(=W0JBiE9J0MH;pKcf={seB(~_*!r4I|hY%L6$W6VpA;Ez<6P;S&D;Ec( z&FcKTyeSi+RB4ZpL8tEa`?afFT9dvEUc|IjqCwVQ)&1V++QXv8=78LPR-bZF4(2%l z9dL}aw080wZiA<#&Edrwvr3gdK%MtTAm#2Yz59O{dAdmhPBu35!Rk) z&j>Ed-Le!9q@Rq_?n{B?an;Z@A`z4{?Pj5#R{Yi&w&x@bMN-DT)0FdgEs64jiuY8fgS z5jD9*KyEwI-43-Z8$@ThM#rXhpP<$_D>j$#nqo#hy5C}|59}QBJfFvo3cfv<78D;0 zz+Ct({K41hD${nGq|SI0$8=@ZEETQox75j&@9mc9@L-5XH@0Nw7mpUy_aj@7CwPD& z6A{o6+o5ghIhoD0a5di==mqPs=^o|s@0aNJVgK>_<_Dn?`Z@9CQh!mA5-r60pk#A6 z?QPM{&5!*#L#QTveu4KHXm;Nt$Y^^#a<}#Q?cb%*JVNsBH!&W0SwPc0r=D*5-H2M< zj@;cY^S2^TI|olS^bJHb$!`rQcB?#w@SQH!&khd&hWxtJlTh8q>v{9j@cZmo7-n8L zh(y+7L7MyJsR#G&<6mJ6 zc3w3#KtXQn+lDN>NDD}%R@?^B2)pk_S`=IB9+Am_TL$zLdA5u-Ezc!r>ui@S^F^q= z>M%dO8n0tzo|e0NKa{jR@ewxq_j32W#=SC&vgKo)TFCA1*-YIjnfy)OMp-?L+gjeq zrbFqC)8KPO%57@flP=7z+h$dCG7P?5!GEcr4b&pSlOBG!lvUiM+AYQ2Dz>ni;1MI^ z%o&1T9@?s9cXObV?yFCks}z z;kEW!GYV*Tr=Oi z*>W1gG9_;A{+RM!&q#t9$2k^GRNoBoF~bsV*A8imb#Hzi(+S)|5(}<;z5(p;K-jX? z0A|}quT}>AHV;ckB^bR&5al-*3zHV?WQ$7yb>L^7RYq|Z^Rrj90zT#@K^rXuc1jE- zoTotrlR}~R_n^vE`JsbR1@^F6KBi~5ypUGz(e#&fQu4C!d&y&I2$$z%sEbh} zV~66@OZKMC2B<{pv`W*c8(i=Sx*kJyc!zZbUZf_vfR(F(@W9{(M+{-I-ta~(RA%gQ z#nI^^x!)>p>9=`=`%z;)RQJ_aiO5XT|0M~~yLCjM=@m)|24mKla2Dr!iAr2}!T5qu zN%z9JTn`(}O7XBPf`t0;hj51SOvRGtigafbcrzidS%M&-%=kXypQ12}T(n|On=r8L z>u-<#99^@C&=YKt$0HahRY@Hj?xQZGW5Xm^XjWMi4I;C5GqY{Os`BQBnseY(f7Gp_ z%P6QQ)vI4j7j0E3Rrx12znd$pdFWSQQ7!GcITimX) zQk_Ygcd2|y2g=b-|8zq4wbSsf>E!t}rih^5(QH*G(Qh2x)!tc|?U_R={N*tTz?$Mb z#u9P3Z5mlx9djmY$K2O$e%E`vxF@C!2T0S?Krj;t>ryiH4=T(jb^<^#pjZnIT9~%r zGTHAv%~tN7Z*>UJUVayhkjH#dF7YzL?f7H=uHl1&G+y$P81`1j@m9+(+FS2TZ`1Nb z9~LeE`e3K#?>C1EOE*kOTOWALU#QoDEu1zM5%tDbcF)c#AJ2V|B)Qy7-FN9x8mTVsB?jiSX`2kJEI1k8=L=!{O}L+Tan68pWbPC99Pv0y{nzu!OU# zer5FZW^z+f#zEh>UE#d!qrce1Lgib|S3aa3r14^*@{Cc%Y&a}2e>tsb=(%ULv9{u7 zTk)@6@_W>mAq3K@yHpFtyHq;1yGwoVjJhAHoXgbJ7KZhT5kvC`BVYlsja?Iqls>oh zmVf;O$SE?Z z%eOsk5Yj2*bMd^*lFgQ`8`91NPP)P4%D#3utm*`Xn_Vh!GjgLuH z_*`sS(FN~FRL)1uRq8F`+5O327n5&Qchpb=xIrZ@3h4*a>(SAk`^EA93IZn)l;gI$ zhr`KDW}wuj4dT-{Ap^!ziX33RSLN=Z+FMor)Lk+<@{4+toJDz{dzBd{Fc!2^YGr7) zN-nZ$c`sTt(6!JVrv}WE^s7;~)Je-iba|q*ncr8gc1;icUePbxhi;1xLj0#ty8oe zSN!>CV{q8N_=qJ)u-{ulq7t5TgWo0uS$4bo>7nAboFTM^gfEeWutZx8Cj}hFym)q; z`8LFN>Yfj)i%>_sbQuEeFntK(c09pSgC&Stc3V}u`4w4FE_4Uwm#tQ@Nu2v%mC^1P zYPp=Z!c!r`N#mT%zMixqd{E0>-s{nc79Rb(TbBC;nK<4>UF*yJKDS`fc?Yxa*1R82 zEwp~Dy`?YaG|q18*MzA7ddSk?vfAvvVOjo%s6hhEYH0;z&})=**;ZnO`m)K zya94b6kOk=IV|iW$b!RJ^am}!j&%#}ed#A#)Uf)WtB(jL{I$?s)FQ=(o4~#_4b8}# zO6$UDCTCtUPN|rm@U~aH6_MV+(E{RU$$JhNhgQ09`N)g+^(R%pzC~_}we5%?z*#&K z-5$^ruG_{8D@b_ydGvbkdLWLk+5!7u_~X^~NtHu<)z+`FJsb(sLzcNd+KtGd>A_p{4xg}EIonpqZA z%;K{6)r5jdm#XJRRO2XPOELF+k8#g&hT&zw2TzB8!vBJgE0V-=1c+4 z3H_Ynpo|p`@w2JQPVfco-!EmWlz+XO4fqlA$QwLJ2JibS1}7A%2G6-D2KSdh8`WB# znNFUzzJryjoEGl^GkjW6*F&915e`Pzi$BeCLOp#(aDHndEnu#RaqgsGjQCQ8xWNI(%o~P($=_lJCrYqmdtV3mk5}#_& zNyVSf=QBMSikdwUtYORq{U~(W;xiPC-yTL!^P4Bon^tRyv7lv+y=afhl`W|ZS{LYg zD{vf;K~r(IZm&;jUYWARm2yo-FXD__^T#f=>kC&vD+{xsQCx$x;Fh+GYbGTW!~=)x+dMGMbvun1#^bzO)sB zGmUp$`_T_|fC?kOkgC@ukNg#`=#dA6y+O{lhETtT4L+}9Xtod)pwh-b!7)ZEAMXB* zSW>WhI~G&{W3*-&GD$Wcp3NMtp*{~UwR#IuE%OKzx#Q3W%H8&EUH&hP26!aZKpIW5 zVVq{(77Z*$X0v-XM3%_r!5JOtc6qDO?DxPKA3de3zjOCIWjk&|wP+xLCtkMEUFFMG z)&qOkS{+%Qa=iQRHb{XRIYfH!JLop?XLr(THtiylNRsI1Q4NCA|I*llxU zKYW!Dzm=R~SnHwS&BQC<{%|){^%vV3+W2bD{zU$_@myQqq75(YFy1TZaE29&$BB4V z=Ms}V+c0msTCmO|ps*Sk%$4(^hux+igSOiLFzUxkan?nV`xU=NiN&}zWh#6sILLN2 z?8k=qMqeTFg{RO?Adt`ADolWhZos8Q6cnxP8OU2f16bcal;IyQL~QaI(wN^u?##@CdwnQ_XqK#s zg%++8Wiw$}qnV4HK_$!ycM_O8kz`LgR=Ps?(E@w64^n+q<1y!D~&WU;kr_^`2=w1h=qPxbvM>>bH*IMGhI3dK^1Mi%5Pu zMNd3n-NxyQ$?>a~Z;>fV?h8~oU-Q6rE)LiGxZK!>wa4v=T@)Kd!`8aHixo-28QAGN z*h_tyU(P_~@CQNbo^)IDS(pjGwaqCXSRQt=t^5t7uOTZIP@FAChbv2|9Q9b1BrP-$ zk_xL9J?%-boQpqPbj|9Y{RgZ#;5Bn@Y?S!elXuCO$WJsl$qgmc_rD>B89uO8l@VcS z-8Pn`R>14XXCS!o{?&fnuIQ^VZX=o|k zax)Vb3KSRjfShZ&m#Q=emxspJA^+F$<=B_#0eZVVNM!N&De) zF>qstf&4@&6pkK->RI-bdl8qPb-BXnu4u;weT@$HNX%1h!dX_KD_;asfCo`e2%d0XLxyx=b7n9fl-o`P9)()4@* zZ5DH9#7ywtHf$b1C!v#(S&X^`;l5eS_?^yPxVj}TBOoPPffb{|_EMiS=!_FK69#4! zf*B+JVL{)`gOsP(CvXQ#rj;iFCNBdXibY`&zB^mx)fD>7$Hn*f5ozT_cdzveU2^o6< z=nIq`UJ9Q|{gIj}AViP2`qTEbnXZCiQT7XJ%4-WAIPtM&QZA<9po=v;@P!Yh&xqvt-$>r*% zg%w49jY2qJqc5ut8vbq<_8{&HNHK#8LmR3z-P0sF*`=~t%jNV+kch+EDF6fuSJ2d_ zGPrYedV*Y7BhuO90H44gH&Y57BapM6Dv}kujkzcqIZ5K!C8kw)&*GSggTF+;mtwZP z_1Ab$C(3hZpc2cuxq;`CMh?0Kyy6v(35l8QdncKKqHM8=9$J#$7ej}-^mlV2=vLUu zM9Z8Tr((E^UFQmsK?nqm&2aZb>Gpmm3D)w2zpX(WuRZv zPC0y{LM(u`1VH2FX`};LL+bUfQJlD#eP`QU8scup!tMg-Bx_MO0)&MI_0fRq zKNJ2<1D*pk-Vk%(0!k2GsxQ0UXRi}tLksej{d62!!Q#|`N85zB8^^u?SPSE0nBb@u zOn00lb<{t6RG85&kpR?b0*EW$N}KmlmV2@CPVvFwmyxv4_R>>Ce>O_H!HUc~j;IY6 zEA=B0OT$3*yVY|59P5BO!e#aI$H3ncy(ij0IFm1}%62cW=c-j*0m=K&Ogow}Ulq3$VQ1{)uOe z&wEnk5ad!??b7?Nf_A%u@)_&@U;uv9MvUl+Ar4MpPdT4Ev!hgF7Z=-X-v?g>1VJHy zN!kueGgX<{Lh-Avb#9|B5Y?3Un4iV;>&0}kpGk1B)}xO2zkZbDg+R#>8f&In7TVty tY?ot401=5Y+WPee!w{o`;KXn8jB6)T^E{e(0Vu|8#)jqw#d=qw{{v)}D2M<6 literal 0 HcmV?d00001 diff --git a/__init__.py b/__init__.py new file mode 100644 index 0000000..6b07bfa --- /dev/null +++ b/__init__.py @@ -0,0 +1,16 @@ +from .res_node import ResolutionDivider + +NODE_CLASS_MAPPINGS = { + "ResolutionDividerNode": ResolutionDivider +} + +NODE_DISPLAY_NAME_MAPPINGS = { + "ResolutionDividerNode": "Resolution Divider (VRAM Saver)" +} + +# Define web directory for JS files +WEB_DIRECTORY = "./js" + +__all__ = ['NODE_CLASS_MAPPINGS', 'NODE_DISPLAY_NAME_MAPPINGS', 'WEB_DIRECTORY'] + +print("\033[34m[Resolution Utils] \033[92mLoaded Successfully!\033[0m") \ No newline at end of file diff --git a/res_node.py b/res_node.py new file mode 100644 index 0000000..1dbfda9 --- /dev/null +++ b/res_node.py @@ -0,0 +1,84 @@ +import re +import os +import folder_paths + +class ResolutionDivider: + """ + Smart Resolution Divider Node. + Parses resolution strings or image files and divides them by a float value. + Useful for VRAM optimization in workflows like Wan 2.2 I2V. + """ + def __init__(self): + pass + + @classmethod + def INPUT_TYPES(s): + input_dir = folder_paths.get_input_directory() + # Get list of files in input directory + files = [f for f in os.listdir(input_dir) if os.path.isfile(os.path.join(input_dir, f))] + + return { + "required": { + # 1. Top Position: The resolution string + "res_string": ("STRING", { + "default": "", + "multiline": False, + "dynamicPrompts": False, + "tooltip": "Example format: 1920x1080 or 1024 1024" + }), + + # 2. Middle Position: The divisor value + "divider": ("FLOAT", { + "default": 1.5, + "min": 0.1, + "max": 10.0, # Increased max just in case + "step": 0.01, + "display": "number", + "tooltip": "The value to divide the resolution by (e.g., 1.5 or 2.0)" + }), + + # 3. Bottom Position (in Python list): Image selector & Upload button + "image": (sorted(files), {"image_upload": True}), + }, + } + + RETURN_TYPES = ("RESULT", "STRING") + RETURN_NAMES = ("result_display", "info_str") + FUNCTION = "calculate_smart" + + # NEW CATEGORY NAME + CATEGORY = "Resolution Utils" + + def calculate_smart(self, res_string, divider, image): + # Handle empty input + if not res_string.strip(): + return ("0 x 0", "Empty Input") + + # Regex to clean input: replace x, X, *, and commas with space + clean_str = re.sub(r'[xX*,]', ' ', res_string) + # Extract numbers + parts = [int(s) for s in clean_str.split() if s.isdigit()] + + if len(parts) < 2: + return ("Error", "Invalid Format") + + width = parts[0] + height = parts[1] + + # Prevent division by zero + if divider == 0: divider = 1.0 + + # Calculate new dimensions (integer) + new_w = int(width / divider) + new_h = int(height / divider) + + # Simple result for display + simple_result = f"{new_w} x {new_h}" + + # Detailed info for logging + full_info = f"File: {image} | Original: {width}x{height} | Div: {divider} | Result: {new_w}x{new_h}" + + # Console Log + print(f"[ResDivider] {full_info}") + + return (simple_result, full_info) \ No newline at end of file