From 1a80fb62133055aec39233974b2f827295c67e7d Mon Sep 17 00:00:00 2001 From: SimonShiki Date: Wed, 8 Apr 2026 16:46:48 +0800 Subject: [PATCH 01/36] :sparkles: feat: init desktop Signed-off-by: SimonShiki --- app/desktop/buildResources/.gitignore | 2 + app/desktop/buildResources/app.icns | Bin 0 -> 209525 bytes app/desktop/buildResources/app.ico | Bin 0 -> 190042 bytes .../buildResources/appx/Square150x150Logo.png | Bin 0 -> 6017 bytes .../buildResources/appx/Square44x44Logo.png | Bin 0 -> 1666 bytes app/desktop/buildResources/appx/StoreLogo.png | Bin 0 -> 1820 bytes .../buildResources/appx/Wide310x150Logo.png | Bin 0 -> 6666 bytes .../buildResources/entitlements.mac.plist | 24 + .../entitlements.mas.inherit.plist | 10 + .../buildResources/entitlements.mas.plist | 26 + app/desktop/buildResources/icon/cc3.ico | Bin 0 -> 204980 bytes app/desktop/buildResources/install.nsh | 41 + app/desktop/buildResources/make-icons.sh | 69 + app/desktop/eslint.config.mjs | 41 + app/desktop/package.json | 44 + .../scripts/fetchMediaLibraryAssets.js | 106 + app/desktop/scripts/lib/libraries.js | 13 + app/desktop/src/main/index.ts | 0 app/desktop/src/renderer/App.tsx | 24 + .../src/renderer/DesktopAppStateHOC.tsx | 46 + app/desktop/src/renderer/DesktopGUIHOC.tsx | 0 app/desktop/src/renderer/app.css | 0 app/desktop/src/renderer/index.html | 9 + app/desktop/src/renderer/index.ts | 35 + app/desktop/src/types.d.ts | 42 + app/desktop/tsconfig.json | 23 + app/desktop/webpack.config.mjs | 170 ++ package.json | 1 + packages/gui/src/lib/app-state-hoc.tsx | 2 +- pnpm-lock.yaml | 1902 +++++++++++++++-- pnpm-workspace.yaml | 3 + 31 files changed, 2501 insertions(+), 132 deletions(-) create mode 100644 app/desktop/buildResources/.gitignore create mode 100644 app/desktop/buildResources/app.icns create mode 100644 app/desktop/buildResources/app.ico create mode 100644 app/desktop/buildResources/appx/Square150x150Logo.png create mode 100644 app/desktop/buildResources/appx/Square44x44Logo.png create mode 100644 app/desktop/buildResources/appx/StoreLogo.png create mode 100644 app/desktop/buildResources/appx/Wide310x150Logo.png create mode 100644 app/desktop/buildResources/entitlements.mac.plist create mode 100644 app/desktop/buildResources/entitlements.mas.inherit.plist create mode 100644 app/desktop/buildResources/entitlements.mas.plist create mode 100644 app/desktop/buildResources/icon/cc3.ico create mode 100644 app/desktop/buildResources/install.nsh create mode 100644 app/desktop/buildResources/make-icons.sh create mode 100644 app/desktop/eslint.config.mjs create mode 100644 app/desktop/package.json create mode 100644 app/desktop/scripts/fetchMediaLibraryAssets.js create mode 100644 app/desktop/scripts/lib/libraries.js create mode 100644 app/desktop/src/main/index.ts create mode 100644 app/desktop/src/renderer/App.tsx create mode 100644 app/desktop/src/renderer/DesktopAppStateHOC.tsx create mode 100644 app/desktop/src/renderer/DesktopGUIHOC.tsx create mode 100644 app/desktop/src/renderer/app.css create mode 100644 app/desktop/src/renderer/index.html create mode 100644 app/desktop/src/renderer/index.ts create mode 100644 app/desktop/src/types.d.ts create mode 100644 app/desktop/tsconfig.json create mode 100644 app/desktop/webpack.config.mjs diff --git a/app/desktop/buildResources/.gitignore b/app/desktop/buildResources/.gitignore new file mode 100644 index 000000000..8acae482c --- /dev/null +++ b/app/desktop/buildResources/.gitignore @@ -0,0 +1,2 @@ +/ClipCC.iconset +/tmp diff --git a/app/desktop/buildResources/app.icns b/app/desktop/buildResources/app.icns new file mode 100644 index 0000000000000000000000000000000000000000..8bc1f24fd257e511c24507f19b0435eaeb7021b7 GIT binary patch literal 209525 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 $maPPpzdP&HV-$kz7a+r<2*1fppDz`@Fl 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

(v1X6W%dfm zh->&Dq^P=EQO_d?Hd9ZgG$;h9KKORx(9;P47by>WcL=yo-{HG3phB@;o4j5|{$c?I zk0PdMqWqd4FyU?JKTX0$4VpR^cs!`se0~3#*+ZVnpj+?Vm(r0FhWKX*WcZmptbjG( zL;Y%mq}q5J#3^TR20t`BpO}~XTFP}PW%Xtnx|p)R2YpExyi)o~Om+BQv>2z2XI&Qn z?Z(57R&NL==2lT1<+&ylhz^_E_;rwjS+B94hWEFWNk~oX!vv z|Na6leK-;Z8@klWDd!Mauf)m*5uy75`HL`6MFI{UXv?3f9y>hRwp3nLwd9S}tX%81 zFvKI2rTV&6z46=0riJvx>0I|dX)|=@cb`pfFw=A}R+EbsyXmxMs^-QFMMeZg5IUvhjbCG9e*VXU$n+sOOph+!W%_MY z!owPEw$A6VUl~zR+niM&?7?4wcmpnh?-h}n%YSW6ZK*d#{_~E7bPTfU^i1;T8vgYk zps~5bw~dVs*Ks#pBVY2f^|kQhw_yt`x0~1V>^rVbaWQ}|Sxw#wwK_VsD9P__T|o_sGa-WApaVV4|G-hQ+R{s=>ZS?H_x0lsB)2TPulBwI_+F3Mlyn32YgJ32 zt9p>Hcx^kU_bB~smdSv5iQL1qU~Cd_>j(D%>+t4b{d7<%6^2TKRgsddR-^p?`Oyw<6y?{-!DvfTLdqd_W-C(HX){2`NlhHHOoNqjrcp zy-t=+qy4`#tLl8=&uIe}Nrtcy{FQ}_gu}1HTX~8V{=O$rO9I%MNj#HSp_q(`XZ{aL zqS{XCsfCwYu+R%b3#@KqnU8LBSs+lo1>W?K~vbJsw1&GK{lTH0~+9aFpk2@sF* z_+hK|f0%j`XsFxwe|#{uvXgyZqKIrUi5b~KNXe4yi9!-(H-ob8LbfawNLqd@) z$-eJf_I=Fzf4@DS-}(N}c~0j!&(nD?_xrkE*Xw#+uj`)M{Mm|uzFF7Go`qRfLn<-H zd_3ak^;tW}Kw?Qia3l18w^YOQsX+~C?E2&P2?g;rXDmeaZenNLE`EO2%4)t@^W>`q zs^C=dT~y^^o0fb|QNnT?pAqqP)|TD-l{bMS-D|g<7FGABqk|6TJ&*dT(|uSm}dmTcPpy$o-DqJgvoFcKrKQ%DbJX9#2q+2nb9tpq$R=TxI-;1)ENy37arehgLkVI3n?AxyY!^LK14ogvS?ubnE z7k6+@YTQ!A=mNImh;nw6J0a)>6C3lNw-dkimdlqp4d5eM@FTl`~waeMHiBzRio@ zy7D2{*H|{r@li4IBDJrG2AY%`$BDs&U zRt2~5mFUl#*fB=N%SVdrP{rMKZsc{r^(ijz!;6E{&EG|=kKBm(yRCqv*^|~$OjVEg zt!47kA=aYL`5@s9oy@>64Z(HRR1C{I_d|B*NxpzLR5#-GLvPCr{(MwKGnvdA)KrdI zm`{POuICKj3qKU}Im2hww9CCJinaG;t{aN^3pnP0F4%~^2f5E+=;=Yt`HIdww-gFGjN-Th0MA-EP@j#c(kNgRN2L8t?VoK{L|+9-EGbT>sH%cBy8g0HmaCHRi)>X^jk& z?{ZkwYX5zQ6LLN>xe9&d5Ca8=LnB_N6a9_&RW)o4hs&p8(Y3GfzMXbzG=#ZYFSz(Y z7Q4nwFz)@ZP~cWD?lW=%apRd|_eJ>YJ`Onv^ZC8E4=_zhSOHAAIUupcps-8T9O^#@)Wq5>R^0zBPFc8vQ;1xtz)Ua>MJHt$3H z?@}hL&RB_T<0E}{5aT>qtwC4^_fB->Vd3xZLR7ExFviCzpMKsnlZ;7AmTnS~yRY~y zRgOnRjtj{R;sq!4%8dzryc>~#W?6kBKD9VVG2f=)f-=WGw6{Sh*%LG>l$Yw^WO$s| zP@_jaG*X-|YxLz{uoQJXO+XexkMxByd`(DS#ebD?+u>0}+-;6cJgFJBV9xNwE}0zK z{&i5yl-LbjeSi3&PHS*!?Kzo{$Jq73CHg(#Rl_Dj{t185NGmr;$DeC4`DM z2DyuGv0LcLTPBok&crp4O#HOb$Umvnr2|{D+Cll&Yq*LZ692oH>k*m*loF{HXuM-B zc*BZ3Tnog;slcPxZN0eXED!FUU1Mz2Kg$`*mqrKZHHhnTzZL1>xE8}q^z3jPHn-8Z zbS!Yqo!6xvq+9DHlL+_kv@ty}u|Abc&7aLeQvLc$jf$>8ZSGnnmQ;>~rrUvzis=Yt zc=9yo;JBG;429!nf|itN7yqwW;@DXunSUF6uP!A)8L|D)60GZW z$8A!igkYRb%0lD(X+Mj_iCo*B>Y|T%QY&vpHLnu7bn*Z>u6--$*}*jiTx>c!Dp02K>*jObqGJUZKpN;_6#Q#>Y^IJA|S_fN~Xqyu*Ye z%N7yj29Jjz^2B;_qElhm29{87Q)3$$m4aGqq%DN<#|hQ3@;zkL~a2@CX2L>qKwFLbtw>2N%6 z2YiPIw*Z zzY7QLTi$JL%pJN7eA%TZeaiGBX7KKude_S6!^-@PfcnTa;MGOY1D@(fbnjZOue6mR1 zh}w{v5Z=b$et(L1`w6j>{qHF@6-p8z>e^lXz<_6-2~(4ozJ<&2m(MSVMK1)qylcF{ zF{+LqFW%!#=jB#bL|joUSYQI{l#1l_zodr7i>i_F0%l?;vF@T)-&_>T4ms#WejdW| z8GrkgakwB)RW7`~IZS?7h0asF@Zs7qM=ql@T0`vuK5vCY)mR}@S^3()g!-Vs)g}xE z2p9-4B{@fScrD7cfN;@&C98-X;(J>g-+x{?MZU(k5CR3v7^C6kba!IT?)aErqanXF zXCSFl*hinUT`iEcV!UI7Uz~)SFfKMk%m0q0((d2|^=U1Ek)P$&QN$qJ8GxWAL4r#F zpb#V}R7UPZY`Mhh`y^~*>a_2UZQ?Zxvjg;eiRv^T3X;^rWUwMxL~q=)gFN@%EgEq3 zDpeSL%KYh^DpM^(JMW0|dKD&h?#@euuad*{nLeyKy}(cN!)tl&o*L`|u=P@DR>FYB!5YV_scJ($J_@V7uu+bJAJ)44hN z8dAmdTRPq|E$8h!-W$;ppk?jz87)|3EcP2 z>hV0%EtkLjXhz)eX0SWofq%fEgcTIGIm7LqL5-}{L@**OxeT`{L8hf5js4WsEoFRP zF~3g<1@#3c`qyX>iY?<|nYFbIt9;oDh>#enYn_lw;mz%Rr%abU(SV=;{nOXx+t0)| zu;-H(7`M>UTklv^sH*y6FtXs&J6^JOlmwwQh@7E#IvQzqI2b|Wl5GDZ_DtzfFKy*< zViFXKgi1EoO5?RWF%6s`+e>+i>FquGVOW?1X*#e_-qR3{>m?0o{-b?*V)f6$ccC|? z$F6dZz4(9@djZ^``~@{7tn}cH;5-uHPAtBgmS;5P+k$6cefsZarsL?6F*bLXz7f4Q zFL(z*dY&n6Ax8tN({n5}Q(*LvLGzDl(=Bf5xXC}bNk+6t?!QQ+K09OXXbxe#k!tD& z$Phjtyb83)*G}#dguFL9-rj-_bL$)41-d}$Q3#-3pZoZb5KBgyBNNpZeV}YwjV8U7 zFV-EvuC-t*)TZJ_63%T%imSh24mkDIW1gG#U{PF4BZpwc!+vE+9fAFFhU-F#q+Ns| z#vR5sj2r2Rs&8p=z(yFnoCEzoG6u5tMdF#PcaFSNU(_&2=ur*YzIwxIm`nS#muI$m zcwB51?KX-tWNmtRLV)kII}7Pb!H{&Ly9?Ey@a5jT)z{8q+=$oQ#vX7xK^(9H>`n-c z1-Pmu$hc|fc|im}JIjxPBB6}j+fqQyi;Mix8M;f1 zC~p0Ew|eR$H>*HInd-mi+A4yq*{Pu$)F>5AB#mX^qp&>@%U0o~E z@i%hhQ~#4zckp+|s3szQbD{mX;9cn~P_laBX7ykEL-&mXqI6xPNY1R3FZI9Iq6~EqQk^)bkz0x zjBZ`lmK6^!Vx4bX81U2oP1#MTW33kvmI`C(6 z1GOU9-Xvlq zKM%lirSbMS&te_XGZk;iowZAa_*);4aMLn;a;M~-R_G!)e{=vpzB}LQ%ReC)$ouEw zUFV8W16oE5J-uWN1yG75NvMyoQ!h@K=$I^Kz4$VdAN}>_&#|3$jd*v)U909Gm?aCq zJ8G}w;=}h6CUmYZCA3Iu`>k?|B$&i{X!`^|K-e;?FirZVBJU(>7%^4^ZnQ#(uFL1Y-bv|1!s6ggpj8z3x81!2?e z-5rB<8rI(20?+)>4(#6G%Q2ro%~lSxWHtz;QFv+YO5LW_>F;Y>y%}mkashIZQ6~}v zroj>*>p(kO1&j}f@n1~J)zao56oo6W96r^J%1`gStoOT~kyKR5%n(2aR_iNMToP8A zXmX_$1@Y1yjlZAgKC?6E-{kRYdqLlInjHQ@1A2hme5HO907CB#wGk4!G`nz$k~rAx#{}0G%0Tg@{DAYvncBWm);geNdrS#1UiLiuhiIPt zt(D(e0_+7KGW@NTL_u={l#|(6k~Tf~QLSm#k%6DFF~PWY=Q+Y*%$cgcvw}j42gADUDpK=UIGEIGL09q})>Cr{e zc_5Wqrt~VdICjh7`@%%{mz_&QEo*iJG1D$qx4DJeL;$quI{>@vPC02nxPmR?b`-j} zBK2edtzNX9`P~skHE<2E3oc{f#bT-Sq%8x9u*>#W<5U#norNrnXh|Q!fj8%M_=h{l z;tn}wgXFb!ivPjyPKd@yjoqbCnMb_kwZ-X9e#}XqQN^4 zGJf}KuuKN7Z9Pf4s1#mOcp= zd5?Z9B0gWU%-Di>J`$AV`yTV2yb@?030#DGm zdmb{Bq=OZR+`!xV|NW8yon!VA|1)TMP~{tw6L3t$Pl~CN4kiPCs73&N>q$DW8>>-rcsx`15I)o?fWzf43hY$oW$?|`1 zs(JzuvHx@u!&^=|#f>XAR7WO{EpxR&BP%dsVw^8A10;?|vsO=tcqO(L{HZMlmm7&E z*J1m=>qwKvexAshA?!JH+&M_ezyj6iArzr^4Inv-AXuu;edC;$i0vU@lWt%K2}q5r zKMqVBb#l)|Fk+B6Te5E*f&ce!T3nw*M8_kRuD6j9>5jHbf9&(ym_*M`5uo7;S?neJVbtY z2$@LA%g#ezj+?fVq&AJQfrozU|5aDt_pM4~G-7L=U;j@kTsepx^VCF~Lu76|nQ{aT z@$8X7)UP4AD%neloIuno@oAbc#?Da_5458o*Dkw8G&>aYOFjdM^bjg(+6Q3ztHwS) z13Eo#Q-~g&lNdS;rdMPEAUvB3Gy#zw!t8Y&3H|%oogC$j0(hC+ob!YODI!9c8l6De znm*~q=W$zjYo*;pl^GL{Rjfc_l_m=8JB<9%3RMNwBA~hpjdG*lH$PFpb2FSKs0i;h zA&^iV4Z{dpZis zNJz|p9#f$p9z9NO(D={30+#kApP(EAxC$NopgzG=#CNE9ymjljmqoG@d%apHa8r|K z89*q0oQRttNCk+g6<$hX+XdQiI9v~mWCSWIfOoI}RJ9~hVhKFDNsy zhAtS??;l#AGoJUvQsoWST{~4LBZff0mtiRvl&R$4?F9mSstuaixJcycI9&_K_yiAF zRxbyM9=OiBMD@{MMGalketjA$@c-rk_BaEfFjchLuc*Mx<(1vc+~UcV+OO?~D)t;UGx44Mv+ z??=MKsWG|CXQojq?l;0z>V4yc$R?=SgV?f2Y-XhT?53GD%d zEN~aLC#Z;X!^RE)KxnhZUe1<4_CFm})4sEB8h4+U;VrYunRf=)sTc)GhXlgxj6^_stSZ*&Rp$D2>nKY` z;9C%OV9B7bIvlvFsRq=*F7^GAYYes*In^u4eNO_3&0$+9^(iC^J56Xhza4%f`pWS- zJ%`T&-Q=#Z%t@=_!Qm(5H9PM~FIZS*FXMk}G4D~?7O(qcufN^|h5rdil_dU>tAMoa zYzX3LRUm#MfI|uROimjcfxZxc{5~$3Bmh6Rj`kASq46}(OQ+z31XnzpHd#h1CDk}e zA3L8>68ho5a)h>R-O&BgA;J;+Qe1 zP9&T+voN>UyS`^Y!Je_*v(AK88$y2;w-+0L1uC$i*rk6h2vfaM<4-!*iP&NgUeqVXrEBy6GP)8iwKXX?%(+8Uq)N`le25PjCW5WN)z z^uy4N;@{5d=72hk2m?_0pKYg|Dy;EoUv9uq`JmkNxPd$UebvH)rtqo{3ZH&_v1*zo z?x!!k_5J8ujEOB$aN^}u*pOR(9A8yZyI9XsWM6j*ys)G)wK$ZfX9jxRm47%# z!Yj;W^E^J{r!3;PgZ{H;@UEd7uC|@nrz0t46K~i@J|uOd3Ld*vu;2YqL9;3y4tN#- zZ#{9EUk6~zT^(0qY{6@9@%RJ4c8mpif7R`qA@~rdn1IRba~RC_+FA6u@Id!o8fdkmV9+bgjcn}5Tqb%@9{Zcs{J`Fw7oh=b>!*s zZSo$t;1KK$Nzb{e1~$M$>TCOZeO0@?EgkncOo2)TP??w#!f|e2bef1)oSN=Y=<6yq znA7zb&3y3e=AX{HfWaTZy(ME8mPT~h*$G~uZ`-5Qz`B}cuSf=BME}>Q9#QGWvB~8Ck~; zv8)T91im^%KFV2}!RfdjDeP_|<~>k2UG z*$~!V(Ru+D1VOq(ZLOWF!d44dPBuRY^}B$7vsWzqTQ9Y-{4z9QZp7cB1GZE>;5_Qs zFD5+qvp+n@Jia$@^<$6;{hEUIH=?UmQr=hbAS~eO2B{2r_~4DTW9=AT5GkftfySO} ztu6xY@{BodcuPj&e8w*oTnPf)wbe&Tl2wyD5(vO6bud6d76#`2#|3kb3{q zh7}{>s|$|T@3uis>qRXmb<$v6;#wJ9gSczDtmkm%wBjdE(ieg~F7$a(cMry$j9y79 zp;Sw$t~&W-X%~Rfs6m+Y8p*{6!NBcxVP729>{x2^iY5t(IJMCqBHy*1Hd@qX+27~dvlF9D z+nFf9BOd$$mqw5*!)b;`_YbgVSd#^c(C0h$l27aQh-BFGIbXZK%HgoXr*)@*NLJM^f9XDZ2$JOPy zH`_kv%#S;i6|c`@!^t5Uj}D;f%U97E854Int9gpfd_^0!qC~!u{6MoXEF=MT4$W`g z6FL9E*!1QzjnU+DJ?jPIW$t<)R+Oo2pt?>0zY{Te0@1(?djw)|Gsn>3Yq|NOeuE5F zJDm(f0$rRN@*rTD3W zX1&%EF1(5LETa`F=AI_h)pzM0v*__H8+dh0$~{=ghAFR4mKGd92*A|-yLSZcd70#q zQ<~*LN%cdYX6lATguSt87wgNVt6I_VNzjKAV7{#M1r`aG#r92jR>WKn*dFo^yrQCf z@MoQZ&se-ch)Pa?U*Av~>}nwEL}$L{c$TLvtkcZV_f{oSB~3=)`uOYUBy462jSI}N z;Zp5kEd3oy(iTRq^`CO12S&b2Yl1%VGQ8OxKLux(DNl=a7#N3ukp*L-o*eNO_h&y8 zh^{sibUB4V%SAn%Ag@;kHx$i&O}L>z9T${l(E)U} zge}+H4dAVZmOT%-AQ>t9ioSl~xkKhAZ=^eYU_*+STIU;z(ccR$w?h*E(};~!NB*OSKv zhU!$=XQ-TbcE7PsL)(jnhf5oCr-;X|qM@$}l__&Mo5CZ2Q7o>{! z{w=&$_@|E-&4KiO6U95UpObA@SuHtvXY{(X9{dpjg3V5QLizsBxrb2ZHl~vD`sSL! zjv(wSvf44cdIUC6EhansQ7KzZs0xsT3-l*?XuW;%$A|n0xwSIp=a0lEi_dS5ceOXm zg14E=uwl7)gT@jGecJa&E9X@YVV_EdPhkr*7Vz9k%M(;Kn;ZAJsKf6VmaKqMjIA>=QStFf zD-l2&Y+|hQGgJbg%1j!oobpB^Hg7*{iRV#buo6Lxcf-vnF!r9VgaQmOmoMlz@GvX< z1|$jn^8mYkyRPc6uv1{rMeuJ({AY8)Ypr_pc02e}bg_EWAj*SgwQIJj&x%7Ar0kt% z+RgUSo2E}G)@tJIH9Au zH+a!%yPw8hM7uBVck6pZf?E20p+C`rEf9xnuE!zU_x<9Lw68rh{hjCR{B|xJd#tsi zI#r)J(0u$ym`KKUI3>A3XJZfk*{zFKqR#o92Za(ozK`ho38-1SO7H#BpgGNza=6||K8~#?U8_*<47#K*uC^cRI|MEBkHxSf6 znv_fbbzrkNv8C`L5|{H3;{m zhtsSdwIzA5CKnbsCjNM*^C?}Qg&oqr(Sic;g|RjPCCo}2at&@dT%U;Ei!3MdI2gaM zf9hl;h*{fVY}q%W8VecIzebh}jEPW=Ey2O%wRY!isSs@81?c;uv`UAJ&a7re zz6;#sofX^;HJG2fEcvv<#D@ zM!5uoZJm`(@@oTVVjGhcp>@P&9x-KEeCcd9XWH3Gir+q$5Y!ptTKQACdF43 z^D*s0?MewTpykP{J(om9M%PysxBTYqbufpzCqOiK9&Gk)g&_|0NP`g$S0DhMku#)( zL(D@TL5J&1o#X<%(Sk{ALvNmsn33yAv1#$Q`?&wR7+2#W!uK#|u{(RRevRsyi$2m}Z)PzrDkvR%q(7B1Y z*NnGhbigF@oH0XnTIH1}lI?#oeAeJNM^k8GvQwvRN7+X#RnknNg8O=y25;~M6}z|{ zkR*20wFj#4yngX^dOS3qMK5?JoEk)XbNgjFb;oB^yt0g84WFYU0c8_ikm+$58Jxb z#2ZM%XQdq)KmOt^^}6TsSNabQ0~?C=SD)7_bBRMrVG}1k<}WZ=_53pZk>8p-@JeVp zao+!&PUPXsNRh@<1I-CpH@%lL5T7|OZQ-agpE`fLHjO{OzqfBb20r7t^C9|W7ka<1 z$Ny&mU7L!%lXwf@?2ay_<4;*LEq9{%q;}c;Q1$9^t_mY-Eli-S-%WyYI7OIS1g5Y6 z_jB5YP{m2ShnB3 zv5jEj7U{E~P0z|=6Vm=6&MkR?UUA-sjmx&}#*dq~kXlH+- zE)&EL{;@{FBmbMx8BnHq)s{FTIZGqnQs-%;Dx-O(;`!_2XnB1%{jXQy><(yKDBMBd zI9-lJUeTWDpg*;}GVCo9tuDPCqCqIXtxlr!i(@W@H$k*QI zw2B`sO6UC{5%xF4Hr17czE=6BJ&sm(VqY!G_ih1QKTsW6%EQCAe}07~f7pPOJMI5H zwfArw^;%Vi?|yFs_YA~^@CSX|BN^YbF)`hH2EbBn4_j@)n#Y4cJRfsv2uaEdx~x;V zS~5DtL=)*qv5ECp_}K`Pm$!=oJPxUboIJOJ@;_gBjjngW8Q0AzH=L zDGpZyNaPJq=WZE>?z9H7<N5wEcUyU|Em(aDnsu^^(Bn-QTxgV zv-NQm#yotc%j+p@gc)Hvnymcr0xMzJ=v=AAx+EW4?Bg+r!Sf3{kfHd1@rRdNPhU!W z4)itY0GZ?Oc*I8TTsiuV9ZJdgt!3l9(@%Ye8z>nF(oe8cLVjCOn#wB?hm0O0U?MK% z58b_dlSVD0$z)5zN`tC!sGPd#n@7*jrl_xtNw8CZ58Iv|gq5jhq+3q$Z+D8UO{)}j z-B9E*Kkj?dxOE7#lfz^e4?fp$v!%0c^#K(+wc?}i!$>!uy3JetwBFj~;>yzn;;yu@ zBNATuaxlJtd!{|92*^?;m9RH7FFG#vkmtNg)DGfQt-I=Lck5#nw7=*5msdlI9%*+% zeUTI<#9>Y^TKa_B9g3mEepc_N+W~HeomWogFltqR7>^HF#EC{j4`X$QGZ7mC{SD!7 znmlGx=TMr3ch`Xv9s#DLfZEj`ul7|Hqe}Yu&USY%YACJ8eFq<5REg(o)W;RA{Mye) zH95AaOx6@y^-b69ik;(zegT-R{|>AYv`1`e=tc@Xmoa>;!djeSrZ0CCwz%Vg(jmY# z*ERj$2@cz=;G`J6K&eF(Huc-^8~b~OXv3q>2`i=T$29Pp7ifT#RMA3KL_$(T?W~)$ z@F{=m4hVQkOr`J9jHsZT3%*-l({{(bSS7E_zGiCgczdESV{5JS@!XI!utpADI98D% z;=_uF4^fle{$PWRe-YGBDC+Q%T)_v#dYj;`#1BAOlgm?k`Yp!TXvIl*zMbJlCfH^l zVi`b{n8pw{0?k{A-@t~fF)82JFeElLamY?AUI%Ki&5kZp1YREpKJWt_AjC zD;c^j%jjoaezg}O`xe-wVu7THuV194)PG~cJdGV-fO`PJLs%hOFMKkn>tM_>Ix1du zsGA3A)b~jSosBXJJl+casRO;0?7jUQ&}2lCm?_s!hewG%Y4OxWE_7?F8bca@;Ab)E|Y10+Rkh!dH(eMdyPv(HVK2@9V;^u-Xq$V zST>&5^IOQtw%8WTsjJi43n4xCOMY@HHkLu^R-bF!{iX-0PeML#m7+zOib{b@DC-}m^pW}o6;RaZEUuh&xxSp z;Jo7yv?0|t>z}bFrH=y{r0#%w*EJ+dYs>20*AC#x$=6NLQN%;YEd6z~E{5wp3oyFoqu5-Eb4CBmkwBZ~PL5zJ3YJJ1%)d zxewr8T@j8^T(QpGNX!hKl-3-vh70MN;*?fCq43EA~H3oZBfb|Z9#M(g4 zEdRviKu@&9??S$Zp9o#alMZJ?7VPZmu&7^iZ5}(hBsF^?YhaW-R&A50u@9`kA13&o z5H0Y|V&gdAT4-aLC**gu9~dAP69!A$V1K}D{&~(5XtH2jC-S(On68TeNHj*?1HXU0 z_pZS7x9^VC=3N8ydHn!vA@B0BcSNroaifLg&N1t<{5n)?N$R{~vPnEJJn8nZLza9y zV@IO>70?%P?a05WRh#I*Xejc2^Me+W9|vpxXLBgvkh_rrLT)LB_6`N94zt(n>J^v6 z8}4ceDPQV$57S z^U5Co^d~K#@e13&n)cW1DJH+dA(l-^5<9-TBu(WgLbY(s+B`zcs@r!NuN)fcIE8dA zY}AJBLd5~PTSn1z0m9sWRBbAWv13yDZtae&8SrK4 zW-6)e<>KcT$J+zxga0VZnq0NHwXD8twf;kY*#u5?TFRcuv!MKtN;&&rLl$(Orl%zK zTg`2GRXBpMbYN=oWHR6`7&E~wtKlecI7_6AgqSBpQMdIIjkkJb>n!0@3Y=DZt}^YQ zO&8^MxXI`X;5O2IC`Kh5{I)!-L7d(CMiiNcHmjx6DnW26&9N?>U{oI*|A$mL{`}eO zfoK9sZ?U$15_)4xa!APe$TZ(52x^4-r#Rwa9_k?^6BVBwt3Oi$W<-4--yH51IXMI7 zx;(L18KobJS?>x-eR2K-8|Yzdkk$t=BBqM@4p|;#zjf6|wGy&6-m^z@{8OF2{!FCvp`Lh2^eeJdw7@_pU9aB zTxPJf?Em?&&NBZv6J|O34eBY6nyu}Bz)f7M5PZO4vO%1sugy?+2tARu?aX*xP;e|X zKkigEbV&S<+PPUm zZ1@XsNC^X>_kK-o4!nD;#X%+D+&p}HcFgGP@+tEAw@iT@!x7t?tW)bxlJ4{cm}_q7 zt+%##|2mxihu*P$O(Z54wG=t>R=H*nCym&lRfzPL^6!)0O~B);QF;F&ld$esk_8kP zML<+WFRPWflK~?`YUpzD=0R=!M&GAiHL?}qi*aY$94{-A)v6NuVCk6}|hn!^Bnb<^CmZgbqzpjONSg6|Wb-;7maheu&@6d0E*GZNz2m4hmhfJUm@K znZ#|;?EA{KW9h4qT7H>%%bGYiA!WzxB2mfSVQK@kB$M*y2%!rJgBOW<8G8$|U<9XO zZLg`)(D?=+^3Ir3&l+D+amw=80YVUSWbZYp)>N0m8pV?z$v7 zQR{1(Yxl;M*8HT28!3eygRcKLaFe?ifd~9f6V>wr}sN)`W8`6iIf5{etu?(omm0}^jU-qFM6PG!lh536C zz0ehDRg$%ziUZd=e|>1)$NLzfN5S4rraAo~5tbLS+z?S%SqHQaE$I^D1PfxUgiS+) zl${|-Gk7@YA_r^&6`+Q&fw$+hns=VNZIjp-6cO=+`|-TqLb`chdYkvNlu-Kp0cTq9 zukjcM^9yvJms9B2AHep48G=D;8@?=&&Ht|QunALgp8K7X5AdkDS%nQ^ohzW_xS&o54m?``SR+`*5d3u@SMXFaA(BoW+mH~MtI-J9EcgamFl9R#9(v2M#3WY50g*bk4k*>;arAX582kliGL^Dqvqf+nnjv(Aov61X8v1jJg; z>6a`~benuph7LYas&;DSBgY+h$fG;s#Px@99pNZ!typGtLt^^Jo7q%>V`|w-+_3&) zfgC!oOY1np$MScBp2!q-D>lkk(BUpC0qbcH@fYvfvXjHPi*0mfhn^Ag>WuSe;9@et z;aB?s9~&6jowoDX5BzbkH&m;Mh4sn?NdQ^{8kOxnrL@*56YKKkR6jlpZMn{(KPWBi z#XG-Oh`WW(bP|rV(IY-rkaPoG09Iu%aT zdSGtZri^!#oMe^iN7ggocJ`Y7XDX0gcZvKfVq1q{yea`xI`d|R!44~@MeVqISgZWUVwjhK3~S$~%s7AelGyGD7;}D3Ty-1zzDwu>t0j?rD>^ zjy;!wk)~B7$m6!gx>QsKbl6L_27mz|ryNjMG0cjO{E(D5u0L*_K1ks;LX$`Krzrw( zc|4f*`4+|y&5;9zY;cYL=tYmG@7Cs4gE1Fw&ivx8sSND*cYQ~wsX9*5{|IkSv{NlK zT(J0T_B|ERLPlJ_cQ<%q{Kh3OT0lk4lB|$skA0ai)-9C=e$G-7=`W}RPvWECB!_TB zSm^QBx0D6A_O8q1vMTyIN@7Ek!ZnfTY9Wmm2~}!P^FI37&5U|!wjk{4uhYG;z!;Mc z+FZ`T-r}%*w7CpOQ8GyAI>eI=!DsBiw{jF9Z5WjvL{+8@2U#FSco;JLDM<_urC7MQ zvfeN~%p>`Z(y;l<=(eh6$7iFl<$xX#X!v4xuXgL>Lju&BdXZQs`(bzIJAm&eMC{|M z8FWgB7QDYKjr>Ug!~uHx*#n9~r0|=RqnL>JXF`RY?THj3l@_P@lbrmn2Nw?=?uzck z+9A=wt=e6B%rj zYNGAkK$rl0ga6j69A*1VWrw1aEL$2;&B)W6|5rqqWxaRX|Ifo)c0ti-GvHvhTy^F4 z@7YiH@e}lf52dSeFWD?^4XYk*1D^E`gI8?3cqMQ?++)j+VDN5weAGLv47`qqUiQz? zd;L$RB9$31NDTe@%Kmw7#IqY3nVC#KHcyp5AFe!aICkGakmUEl-`2_x?Gat?E*!1B z+p9GF7Vxv?ZtucrantJCp|A=ve!xI*ccLo4>>BU+Ev|@o-3T1?1LdYlrv;W^i{>Oa zPvnme%-z`c*PnjlsiddF(FIOEHm9on`cD15^D@ERES^jFX-p?=_#Z`C#Z z57#TeK{TSRi&M9lSh@$aZ{a_M1F226EJyJJ!B!Oo)Zz!zxrw@YC>Gc-rbOAE&+?J0SV1fONg zIS5H{skL{Ir~{Fdu5Qmq-L(BND{K>lyAMf$qV zJ&|?h%Rdg0}1epcJi;JlVRiNkSX%9XX68&>YBrY%i% zQ6XjHnO81d9e;JY5$*7P+4~ZZI%>Rdk1U`l|3`Goz6 z?f}oj%T2`pkEgGWit_uuo*9Oel#&ifK|neLhAt^Z5Rq;v2|+}d0YSREqy#~bj*kd} zba!`mO2aVoKBM2?yVk6w{4?>~d(YixpR@P*)oI!-eETw`Y-Dd$=a;JZ30j6B0Nz8A z03o6mMq%!oR3OC?f20*$F(dnzyS^t60C@|n@4ub$E!rHNiJyWTaUyoo?{-mQ{anix zyOsY)(teuE1-kKCKhYf;Ts|4Nq@_Kr{aI&yhW6(iX}DgTS&m!c0+He9)$CE-8A7Ai zq5F^YM|B9F|9)R?3^WX41>f?|nwbosL+nBnk6a$Op`^vDh5>p40A0ZVe-IW)sR*K^ zBW+E4#%E+}t*mhFa);|BR_Bvt`jHpphdO|8^+u?JGU+4@lk*x!*1Sn`%L4b{*%MFOmc}H z0EVi76<)??{19fdxdH)1E2pwIF6cG`WI=j6%M{O0MRY`&j@_2X#Y9Jy%QMJW$_{4- z(T?DS^49xpgXVt@KLJ=0?XXdgg&mT=osqzs>tRe<9^9{JWXRDetYJ;Da8h<}kTbh2 zmKf-*`Nd!9)_9|uMHGN|YJ0=8HE~gLL%aB1Ry%!k-dDD#2y`CKBkE!lk;#`l5T!eo zlgXG?hm-Y99iub@fZg#Zpc3iUhZ|%CX273sa?Jb<*c^cG53FKXg#fc!s_u%>4*R{> zD_6D}(d?9F9&otc{t!*AaqqCmzkb_R8JZoTo03#}sl{|^>JZ(H0C zzymyV+rDhP_z&Am+R=^wv1iI+efmnJ^f1BMjPtsW(m>Vat!3)xVhTCf*JofW!ogdQ z1PihkqS7SUDm;MN7+}w6XwDa@@rT#l0erkOJgijr_bTUs{Aa&KknU?5fYmHhTSx<~ zW{K%b;L5C8%ud2XJfg~nJh?Y85Xh)MJWrcpYuckLIC;ARubH<%Ns{ivLQiEny-JPu4FJMhNLD%c061thDg@twtniIL!VpgS3N*LP zy$sq)Na^piqz0vf^RDZmZdZcVf9BV}Onxu#PQO0|CaqznTuR}7MDT_d;k+Is7M@UL z_p`nHV-ZNkvkrM%0@XvmO@BjNV}K!No+&$@iSd!;7Ha|R!D~n<;rTbT|4tesrjZKk zvDB}fi<@PW#)Rqr^8#S6!s6X=RL|yh*d`7d>(%#MWv9%x4}S?ST-|9pePEi9WOO2w zOut&FAQ?ig68K{5iEMw+gb=>Usd{!-2ZqJ1*L6b?8C?Oqp@vPn9j(h5P%t;Kz5DC0 z7@T#Q#N-d^*^^|OY!axJ*I%B0R6+V#u;DICo7L#I%RSRo+W)p@qMPr zyHBh*)zs1&Sb#Bz0O1j0nn_5RiGP(iG{T@mzsZ`5Ua<>2Sk8NweA7h|j$`+y^UNrc zuWD$8YQm_zUVzvL8*J%#rEod8qdVI4E9|(5O|4hdDgsa)XP}ufNb_1b6v!3OsS%98 znr%``p_xg^Ktr%>Qe0R?8*e2^NB<~KH? z@eYxF&uqE+gPczM^WZ7UR@Y0YY$Q$SIvS_-_1Y{D{af8cQCUKRmrP^~6v*^?{uWeZ z269Un^K0yYHWXm*lL9!CC8jx;Fvl%Rx-^#jvF%>73h zdt5BP(t;h!hgUN!k8Xv6XKBsNa7o7OnZT*7Vx>#vXigxt_X0Ta;1lLc+r>Tk{(l#^ zC&ot1x#euPt`kxS=L7n%`|*z)pRA`dS!{mw)n$s*^6=y)xcW|#S63B1ULSvzZ4E(; zOFA&Evg|$spRXsP1t!BG5c%vb*+vW<{ulHq2#5D101S+sO@<9UA`zb0iSP8c>`iK? z)y#6cwGr9;75I3*yG#Ea3wDpV4%aA0Sm46Ksz^t!&IxZCm9ZV~c-7qrPy|ujITt)X zdC_tC?Q?Zk&i$X1TC+S|D{xPC>M13G{e#M+} z5Hy2zXu2}}*>}Oq$4a`-ffj^TypUx{^Dohg!@n{G54*&#W*^sPUT26G$UgrE}b(gpz0ib=JIZN@Yf$xdUsZSmG8*-C-&GnNlKMTj#b8Dl_e7gcoY1TrhMv|K;3d2^Fcaj_R zSiSh_z~@gB{y?u`G!CbHv+%dmwuezNRa<^^pNkhv1B$(SU2)$`psMMN zwTy$jl_BG^1fZs0Y&J)8&|)f`cYik(-6+#4x4g5-9wx)w&2OR+&UH=)v2I&^zzRX@ z=SN{!*?{rXfF$Jl-uo5kROTqygU6*I`KyzYbEmDrB3q&be^f5>g1m0+JBR1*Ttf7N zm)!e-^@pz#5Z}OC8ZyxH|r9o*1~*KbQ-+J3GQo{S0I!)&9sAY~fRuTU748yVLmRIE;(_{H*KUy0k0g zw$oVc<$r0dD5Kzy@A798{eVv$?i2492l1dk)4uS)`McQwmG8Bheckv&z$X{;5SgLM zZMS38=g(?&3am$Sf3Nb49L!aoEx~Mt4GwPI zCMT06ioWJiM_;k(!jqCeI8dD`kqY$KgYBcBc6zUl42544EYyWy?5;@$Q@;LF|DqGr z0JnEL$(( zaY=!B!zO7xhr`Wvir3xKqJtP5|G6Kvds(382)TGUwpT*$-g{=lm?Ni8GVl z#9{sH&kwpgbc{qg8LhXsK=>%ewHB{yGW3I=iJMP%z6TqPW^k1ECfcgzkMl3<(qY8k zMz^Vj=Rn3Oass4&{Z>jCtsQX9&|~rl%feYHGDXnrYG58OTY31ht@(W6Yg}-a2u=+Y z782HU?|^kfta@!Kn5!7Qp9GrZ+{WTwU@foR+aWEyr5Jq9$=rd~0L*}3N@N=t&; zj;LLmTz$c`G-WPGjsLu40T<7W!*J#$9ov?N#W<=v3d7MDx@8gQEr~1^di=?TC>Iaq z>oQ?B)%0mv{#sKM5S#!X_L7tz?ss=(_Tzi%!Qas zj+s3t+~w;(#$V+NyZ4BU>~i%DTHlvSuE{yVGZhP8rc>X>=wZ4HSLJ;<69XI7GpEN7 zw6eSENznCHh=UIU4T*q_gZ3DTL{{M2C0C9&<~*7agQJ{9d&$559%=z+|7Ok!Wj5mk zcQYkxu6o4!_O5B1n!{r~=?pnh^IAI66Z`z@lHcUqkmO`c!Pkd6=Pr8wDce{yRJWGE zm(U1t2j?QGS*nabu^ABSZz$EBE&B|R-xCJ3#elS86OGH+2EZ%*S;c=nqnKT<3Syxl z8vgGD{1h~|?EJ^@wxMlr_tE2dHNSkfTi^XmM}^K!3rjy_`9!jjp#!xDdbngq)=&J9 zUZ?82X_dSB0$eH=-oFzw$kv|yKtIJwrB}nnu)#^L7-#9E^sge}XaB1!CNiM@3G}6y zqm8v$J^*%4!1^|mLcSlW5`q1lF{4$K&#$;C#x|eoY-HHXLwDNB(JNzIbd!G^H(6bR zrni_FPez?vv4oS{kxJ9DLmM#^;%h#1Whf(EMN*xChwOf>i($nNZ~(=Fc9>V6Bzy2-a$GG0%pkI2-^mVgQouU?u;4qADrg@z}1c@ z_m3;F8Vh&g?_;ksrMO)87E_{UiMv=V+5&#D(lkx%x)W3aggAqqs#n=f@R#{=nH zW#Pb#pHUK86<$Sz7z9(_Vk~tquU;U4nMpj=``a$_^X^dvwHaaXd2bIY`=F(?)8kqz zjuOodY2INqB6RLf*t&qLjZhZ^b9ZThDb4_uElJ)O|zXwh@%mvAd7F7g2R0$)HRyA8q_tt1#$b?Z?E1{2D zOYrL-xa~ESpk{x(wTyU19(Tn$k1`v!2qqKmN3BIpfeFR{ES1j9a1*1rnw)<-j1U!T{4<0ZB|J>6; z5H+g88bH?x)def3a#_L+bx;IFFp8R9u&dqvcx%_NXExz=_F%-by!?Oh+z!L*2f$ZX zSn7{1#TopvL+rmjVzm2fD}?~;+47&_pW8S*iDL8zyHbd0;Q%H@_fn7S-#*(v+4kDL zn{GWgEJFp_TX^4H$?`dF2p$|(t#=A4{b^b3Nk&b~;t2 z{TI^#7$$+%6j;8Gc|cW)j0*@3?7Cm?*4O!tWwk6GJ|O?f1RVa!UYrO@&H|MG4q?!0KXVJW3V$8}m&W5pRe+lF_4 zPNe^gKb;*1+Jyit*=XpR)?swJy^(#2>Qf~7w?{oNj_MY9$%9ob)C9mBB}8)4Sr5oe zen#ZKIBoRtqe^nvjZ^Xv+K*Zu9jx^`xsGc4hk={IVuwRIM$ccSalP&302IrC#1J4p zfF>$U_dDa5A}=ByGtq!;|9k)&7v_`kh63+h8Z5@3K*4{ZuF(B%oYC@8|`(}5v0hbRe%u$gX{L(2<@}LiT0dA2m_O+~4OfG`8TM4FaBX z5B@UxVrx30?ITC&w_mLQxU0=c!@PQsqP&}MMPbFszUa|0-&VXE7u(9Ed;dFZTLAzH zF@{y0@BnrKTJ?pq8qh!NhDt6j?8fGA#TTzyYBVpuji7y;GM}Q;Rp}%rbCj50M$sc&<&Q zax==;y>cNy&W1!!DdfIVu-ptfbwYSa>O7i3`2*8i_O*)`@s^6u@Kn`%;dAW)@aX?B z+d`JY7-oAsoepEq3b@R14qbjyIf>ey`2fgC86>Ldpu8Lc=HlsJXuF+ky=ktylTRt~ z>8N;4JQ0y-Mw=IRgufQbD%a-TtX3J$2qFYP#eM+*ZTQnJJ@#+(WUm4&mNP8=N;W_c zMmB_!Ryz(Q(ASIul_jm|Xib?2nMb#`u9Q4ooZ@;;j6;_j^wj6a>9-o+rpA^r>LUL7 z7dDmxMVB_rYEfGM*;L>`zA5WBovTW=^CuGzNz)s$3{b|00i}HJrx`YYpAwf8c~>~9 zGX^fj^w((!bLkH;_+NWv&yNSW7{WlbAS#$5r7_u1*D1OXp1$yKNH<@{+NUvkVQeY% z($GemXylNQ=I-z2^Tk@;V3dQ|3l}7_hL_A<-VZoAXC_klfhI}!l_}6k4S(0sfN_cf zAV%zoc1e+LDRSe`D1N0Y3#MebI`Gzh0aewd#bUaCAtJf))iAiDOWQguu;=uL{Ud@C zhF3qO!U}~ChpGN;8!zC>TH=FeFaUm2I;HnU>hT(g%3%vXXWxxiQ;hSt`K!EQ<>NSD zEcx;(!9m}*$`Q|slIWI6Qa68IV`6Q__Fq`pTK?K{1Q+~7jd1N z-H*UT?sqn0b~W&;X-@C(!83m9t?NXr>W7fM_)UZ zt+pRnMbjLajR>^XL}uF8ugCI*89wngr;u7d8Vqe|>bpV@qz=5jQR;5r$_y|5?XT@+aD}&-K>*;Xr!dxT$`Fa*sQWc zjqSZMmZm;0MJEfifzMAR{R2B$s&?Ao1W-F3m;zK0<27e}Lx3;P3@serZS`_+v z7qUA$;&HS1g6#eXp1c~w;vBxYn7Mm&$hjG0cdckEiFB~*8QO>M7sxh{FI+lb%L5_GJkK=W%`5^PvaD62GSxiHwZ z#CCw?6%9MTHOC@Z)q%=EpPFCT<=*jw^NKs6XzzmfhhU4OTDw9U>Vc!vDD;&(=lq3p z#->ermCN(0Uo+KKMNPZfu@dM3;hV+bw0wsH`>!~)Prtp55nBn4bgkbY$vhg=b-3&T z0)KW4;;rlmfrCZ7ug{0KGhZHkp)I0tJa-(+NGc91;r4BVp7@sZ{(1LszCDPOM)!7K z*3y?3s{~?N0vZr+lVKcIkfEMGe?={gl;>^w_2c=BT(n!*G+NtR<~)Ayc;5a#dgbV_ zpsLm5lI^5X`_yi?MOf*wX>UOPb=aiIlHU{DA;I6G7$hT}38DaT_&{Fq zQCC}WIFNHvsyJ3d{M-#+cO(B$iQXO#y48n&cSxU&yd5e%l_0CyvLrcwI_47n+|c?h zR#6YSaYShnRr)b)wq%+wvG!}d_J%1siQ&G?ZRklL+FXw5cCA4`Q>yv!MHO5K4;bkA z!O}hM^Lw6BPcjUYf@$KL(KM&6@bLhXW_wx!!(q)5P$c8$SZ7uh#COMqEY*uL>hRb`O?&vna1%Kzcnh1-`Yw^ zpZfFa+RtxR*2#aIx<`FHqG=o2Dr-xCc|g}e`=6qb4(U%43cVWW^Q;}>W?HBIwkM~N zHVYy|em^dJk`1~?!FS8wA&9sZQYOA7Pid&jk{3*!g|Yw*g5D=L?$wQv2Ds&gCG6Kp zmIasH{7=l^GE?64{TNyhR{n6C-c=g_kr-n0AY+tSq61DqdT3Z)Q}SZ;XtIk-KKrcI z*rNCKE7wb}lON`i5y{u?7E==mIpOe8^@oppoHt^+thPID>dmmtHk9S3Va=bQOIXbx zB43k~J=<7)=^7fRwo4#DX+SHM7KVtJo(PJdl$Y|}e{Fc~BEZtlR3|lq>mGbn${^ID z5U=cGZ?^X3=Q^{j)6T)+lh$Kl*fWmH6BMLxlJ+)Pb>~k< zB~*G~V0>ZOdy(~(#G|gK@Rj|=B6rlJ`>d&#sgy|it4o8yjhQ4iC+8=l3#&(0UsITY zZ8Ve&`T*MMt&1CryzMFb()J(VIS6=+n|MOEJn1Z>KCh6CPu$f&5$PR&m5nfZZ)Ny+ z3*EVyOJS2U%_lcU+ckoii5alj9$t5?KhDv*KF*R<&Dbzh@}v6Qlp~>ues^Daag&>< zta3c`SrGbIm*4m1G~2TAHv9;V#a~e;ZF3L{cUtUyvv~8)y{8iOwEFG8qmF=CL$e{J z5k?}1D}!oKQUPjz*ZYkW_+O^MrcSbs`9i`KV(RB z|7`_+3^+9qO|H|xtAsGOW38=>>C)AE&veKd*lsE5gXm=zGz_xH3S9FVNZK+ixPDv!4affFb!=!lvFQ@B?@EfKz0r+RoBC(LSl-0BJCSTOUN>lM$Cn*jUT0;4&Zk zrP~s6I(p~++UD-Mt%qu*ExN{NZ9BdIs%^<-f}7WC*o(9V{8a|c+eW*KGk-|KyQ>4vt&s+$0129^?6Y^#X&`Av$1*oG&t>VyZRsCaz983YG4-vQ3 z4?!IkX_=5@i$=fpirc*H43>$$Uj5|ZM~j$jX*F8T4j)LP%D!2s42HlMAEpwJn(uxZ z@cSV3W%`$&y+VeJk5Qa2?tfcf)WDJ}ApZ0e-1nLIuNj{ii?+AP_J@VpE`|=*?@PS5 zu@0EIoc8#Z3TLq*L&4ol1~bqt?pjmH`KY$prfCLL;_LA2NhN!OD4AFB*)+t@ml7;K zt^yeIniPSJka-mx_kaSVkn^>*@eQO9OOMTv4E(6ovx*y5`_u<1xAx!!mF}(go%Y)& z9FvU){ccs0^;IBM3IP@ElbK;BCUzJiQBch}c?~qE7ZJ?my$-8KH#%RRJQd@? zs^8-2{1jrX9ah7^1p zanxV#3>sO(9}fmKosZ%9UJUN-aP`hkx2=@mELbVD=07S5~F z;SQ*DmkDw-<0W00R?Jcn9$q_sNNbY|@0-$TG)^sVeJle?DkV*F274ocv;yc`Eou6CB$T zsG_Bn;PJz^qg&;{i4bY|Um3mY??Ssu3A=Z&Xci9WWHj>*CFo=GQKhm<^eAk4e1!~I z6L)PNKYWd1a15n*3zB?2U9>qqC<&()xVJnwvR4hh46xVP|Iq=bSDA19;YxJE z@48qi3dZd&&eJ&O`%JPxQ-(qZu}NV?%)$yzj=JWpdEa4M;|(gyZLr{a6vp9+gnE1u zt>d(RW|RT1K)Sg51gKn$vIoNH{Ks=12yUVa+*_{fsU_K5uG#)!onCx&t{okf$7Vn3 zP7r)lK?Mwaojv7j7`A=gj$xUM4k)Fhe`jasiz4QK#u+a&NJ%ccGjyc``fgm7htWIX zXp8cgJgLv-qX*!Pv|Zh@*Iy-gR|?{Z|D0ra`81ZcI>tQ?+`bv_h&T-+y+=h63};EJ zZE70CbBpbD@>1-3u5qMq6FFUc$dPAW0;YT{@~$V;zs&!9ew|xQa0c$_ zKJk4-_7@X08x$*=w$IpxD&;z!02uRn9KzJK$0(>iZOd0INXh;+Vs(pF!?9O-V^Q?=C-@fYC()Z-SMJ1TQ55)|G4x&VHX2F1WHdmwCSeG$eFXDO8=G`jGInUwQDs zX~F&~StHLN-pQP&&kv{LiiEr628r)y`+DeBSxxE>5=a?5V}ydx{S9~9i1v=ka%Ls# z-+B7VwN9_ezOecQU#{Xhbg%1`e9OZtd;Sl`d{PDxAaagJcbyqJmCharj@0n@-+%Xg z3r3k($8gNsJ%@f7*aVNsRs1IEy=|NYir(>k>&(?8oVVaT{^0gAnZ^_BLdrw8KR|a2 zoi@p6?6ZvRqq4~4`;C7{oRW^u`M*sMX~n}UzHxJ2Ubb*)lff{k#h;d}yfgSkq}ezt z9TK+?+jN<3>ge=j1>o0>OKI&;gkwRW~@ay2CLY>?R26eQ$%@jQ?FN&F`+ z@D9XTB`r0*fXtIhksdYw!8wK4GCzyFwYGrJ7@4mBTJ43U$Ey!^W5<Jr% z&ct)QCeOk$E*o+On9V35G`tlK^#uWtW-HCRcx$o^W>FVaH2o^X&+lJECp*S z{WoIH|LQU2U@)-nrbEg>0=7TJYxVMiy}9;^pZN2bVXr zwADdV>~fwH_f7kU=aG>`PXdF`Sw|V@ZSqWRq>FRkQ1aAr*7PP) z!yrZ%jaLQ{)EiF`pGDS8MP+snO zli*4N(&Ua0Qp^N-_;<_qN)|8UM!uj9@Cj&*cfDsv{RDnq`(?KY5@t?Q4KBQdf z2s|san`1UF`Iv`(2Ff~=0iDhfLOvt=Ye>`6DAI;4{bb>dR*C^m;hb8YJ*~a1+?rvy zzIofIcZX7gM=Q5n+HZ|piQ&bTPoIS6yNJ=WnvXY4KckU<{N`}K<>RGS1ZT+1BOTFLk&8A(fHg%9|uz8nL;2S%0LP)1KnDCT2!7 z-Aq-2XwHw@iE~2V|3s%vj~{wFD`uwqy*E$jm{rAR?oIE;GR$-JZwaFTF;@awu2%Ey_5(I7e%K4M1^6E#WWUsR_RNU z1X}Q7vCrJn;gigZctLkE9=_Q(=fg*>gG%-#nh79vu5Se}y+^O^EWThm9gZHnGweYH z$$Wk8VzX=-@vW`3=|zK{d&ELN!)8bP{V3y=;TB^mrN5GWV|*Zgg@vhSWy~wT-@+|{mWQ(=g3%hGxE_JO$w^<| z9973KWzgi>-`p^8Bg0#pcBws6+}2DJ9+~^qwo5hf`WyC>E>pD6awYD4k(t((wy*MrKD-)Ek9Hdt z(|-z`ZW>s$2|*lb6!DKn`6q@iC4IzkDBvJLPTHIg5P63I8F2mT;-}%|_za0Z{2I6O z&A?`SvUQ{lMVU9u1U+#dZcy)aS@J8TSVqT9o2LoQr>bZ94J`qKiV(+8$Ln?L$5X!( zfK36^$ZG&3?hO$-ztDa2RjApS@yw+r=7^t?)D+}Ws-cT(^l(a~%L9>R%BBw5y@8UN z>o?>Y_#}*#I`N-LzH>zUx(Jda5ESG5Bx(}0*7I}r$@ac%n|u@R;pX?2KYl?@JT_>9 zzQ`eDtH5Sc3=!r&j$moVQa-<(62#e#aSwu+b>YPVM>QG|ZQV1Cd(D;9H%yEgs$Eg7 ze*%7YTJs-!ugL*9HF5ox%I4&7+weIlPMco+OkVzaW%bBg+{izpaNnYV3X{b;5$mm$ z#p&3z$;?#N+QRob>e%l6epQ)zlmy?^&-ABbQx=B@qLmApVxP%#;Zl6{z15N5U?r}s zDpI?-0M-JOYudN=D)#{Gj8csB#{E^T+I)*W|e#qu6H@ zZiUlLcxW-+*I)PdR$F=H>Wvt9EUm^&%f@-F2GEr5dBP3^^r+PQd0mVTIjMjU*a428 zmbypU({U32U9wOz@a3w0G1<|PJScg9w~&`YNsZOb_H;t9U7XRtPc{=21NZ zJKSKCcG@4|9&OXz?`iFkl`Ma&eGh zc|^iI&5KJJMM>TU?7aKMVYFl6XA! zuYfxZ`c_?f-^69!lbqa^ti){RN%ciJ=ys>&y`)F3wEl-7nX+|f;BfLBycX*3YT}yR znKli&EE#ebGo9+nKo@VQY+cfvA06vD`>bNfrCze;=7R1tLIO~{NY}v1l+V*jiPStj zO469<*~Z{aUKi}4?vo%UA88XXcz2#v9bwm{RQG{JezX(!1uXXd#GR*(WR<)xkt|rr zo>JBp2-H!{`x&_QCILDf$R{=G>YlpK(ceeQea;mGHbH2fp7cjxVfaEufRkkq`<0XF z3!q9hV}xvb)W0y#rr=V}SMJOP6_VLmVL?3Em|G^X-CG|wjqjAj(Kr54i(4>BEiZZ2 z`dh~Ij7-dT6UjCIMxCLKX>haL?8vp^WVg_$d{2Sddbr=5Izj6^j^ensJ)s z@Q1;apP7TrekRqp1VQ%ZcDnE_0$%sWT8#@9JxOBp6;nD6bWa#r$=>VgmI1IiUjGaa z`aoBlmpojd8KIB?=~;0lSGnHaG%d`tB*s7Ds;aq}(_yS6BC@Y{)x{O@q-HRrRUi3S zZ}5^?c4zR}(>A&Mg@*vd;Y%mau`H0kWYSYuwg48Y74O|+#?22eXq3I*&?tZf#7)NQ zX&G`}vc*Pm<7G(n4&FDNpjVoJIPN?dcKN)QThglcW|ZV;xMow??l+q!t8K+|h~iR@ z6m~Ug^{X$%jbreOBPk#C7(aJ!>HWIkkHNR8eNhv<#_na}NFn{pOg3m=Nj&0zxFSIl2%VL>%kluQdkSqMFat-cPP3HQ1G9ECI|!(h-y{sLX=ve( z!cBEle4_Cxz5}pjV@F)+7Y${D7XC?Oq3)PdnEAY_C z^V8~@k1RKly>?A~XUXSCXl{JC*XmGRR-);7KTSf0cODk~0Z*-|lVxArTg^vbPYTTU_4Y&( z8hw?vCa#^=$GOLFKJ29(I>OIa`gOQq969z2PjFe`0Z zS+QA0cf{v;tWofu{o@=lh&KbE@)N5@*R@RIN~k{K*C#N9N~Sjhp{hUAj={g8X<{ej z>vq01x4LbHgi&Yj#%cV;@i2)DdCr}vkn(t#Lp6_4x4WUY;>3!}Ftb=Q5?}6mmGaDE zg^Yz(HyS>UAsDC;ByI38qE}P24ZW*R^`e1F`tzyC&!N$Iy}3n_I@ERC~m-OyVa`m`Jm?dw|D{ z!LEJJ3t4aLl=(Hez-m%-$vw!N*Tz2G7p6?gg2T$ZCcArisFA43u|=W_uY01KrY81p ze`n^QMD`#6qb?{V?>@D+xTF4%=UgQLgS{o8FG^h(8hUoJM;}r;5bkd2`;KyC2sm}? z2#{_CH#^^#7B>HqtnZ|K?w%;3RUty$cDsj_AQ&*Wr|4PGyyC^?5_Pul5X!ne+*|7@lf3W;jqkVqZK(rT5TAmOWj+WZQvp% zG}__cA}_wH-=_EKV~;aM6`E(`91oqCkNAl}h0XNPxNf!rV2g0S*I1q_n=yeF%;=aF z52Sx^{AL3)f56VH4>FZ_)TR%rLA@%iZo6GfR<+$uYVsJ4618NAIy3E=$w;&ZSDwzn zjVW@_kL#j3##4Q!o4I(vNDer$($OM3Fzeulhxojoz45|N*+8^*)~1stP5tG$zCs{8 zRf}~4rHd5^2l#ia!K*B3B4V_RFKsy>9y5Cm*@Kc&fjArIcD`r zH)DpZF#5mkrFpDst32tx&7XJe-ygS9WcnrqKNdB8?VSBpaZHlM(@)gflsBcAO2`D|pp*sfy}RD-%5R+c1!nl>wVB*uR7DFp|ItLyW7IRbQBS2TTB zXOB10^*6IcKRSrfe+K^>RFXr5%2!RuC0&!dpjD1C;NG8r93OayJJ7qKf!(M(Mwwef zy(HMpLp1u*L5`w#uwmmxtiNB9#Y9i=_mhlt!qs&RT3*SU=M$oSunr9T=jPGVN7`5A zC7)o8^_6KUuZaA^*i>4M!LrwZU~x|yE4NzXy=zTnA#9<&Dke4@D2MkDjyH8EL| z{QOfL$*b zD$)!`;)FZ|zc%<3E62Yt(WfD1N}2=WX;b9>G$acKc4E7+lZePovMyS(wvSXPR#$EV zX(}Qs-}xly$VHEi*%Y{lZt>by9X|z|J%9il-ZzQ&1g!y|q}e#gE0tnjtH7Y2pAjDq zx4O)3x;lq{-R6w;7$UM&QTxEaOu@YzHE-)O=Wnkvkh_8I#}p4*NM7rqx8KNhlRd;I71M6tfTlTFZY zBD^HC4sM@}*Oa&RgLFMnS1u4uN3FOWqDG2}e2ujRSR7>Y0|dzFx{=zB4oFX4bJJ%D zs$<)%`ild)mUlgL+i=?F#$V$x+X>!_D&@W13BBigJ4Q+rEssC6*vck9k+RH)BD-A* zcpp~5l)df{pV0H4{qU~qYs)I+i*KGXSjfFP=AQcCfwdt@QeM%KqwL^@QhMKma%RnY zoB1@j*Q!Y_LTE^X8&iU`7S&%(l?)_VGHiC4tRKdKuv8BZZxg-kieE_Wkta&Vw*xTe5p15z?7i_X@IZYg&b) zmOm{(BxdH)axW$??TFL&>T|HT?iAq}4acNMWsIyU$kAtpzHKhm8vf^ z^K4x;$#m>~NCf-BJp0)_9`Jk91}vKmR(=gTIVyUUKf=M-xVYjBxk6F+$F8hm(X0vx zI#P?_JEFp0wv|0ECtqN(=RE$%dKu2zW#?@~k203TwLvQ}5zqr}59O5LS`Zg{@%#7J z&I>&-u$kj*!Vakp=-w<}S7R9ToPITDeg~`idp~0@M8_APJkW{|@4XUPtgSVXV^qHE~Xx51+)HmBjoeSxD!X)|A+Q08_=)LX2$J3eB9c4iE9uM>OAJmiC+*JTCLi}% z$Vscv$gZZSmL_4#7oV9PU5KfrhrvU3wWCJ*y31*4|0o1v=o(&NdXsv0pA?jw3;}6Y zjLZpxU?W)lr?j9lQc|kDwO^dpNp)s8+v7G(7c`DW5Q-{V#4yCzaSo+isZI*{dK{9p zL=Hxe>dt^m_oJ+%nx32p%yehfD*es9N8wY;=<^5nP~|H5 zy!zoXnE{$F_E!bxEh7C_c2t;~nbxwT1iQ3G_bz7CYz3>gBH0>$K1j{_TFRvKg%C2q zUheJl$=PhVNscoZzS5Kv^<8pjS~qVx5Unva*-n3Xr{bVBJPv5N(0js66@C``HjGVw zKt##8HAfw9>QJNMF2Tl6Tp3W`BnOu+CEkK-eL+wDy7EbJr zvZhfcL*9S9*!1STYEb+48K;#a?G5DM=Z&(LX{x|fKoGPl}=(7F!$m&Zhi)iFby?gdNm&^ERFOGSg_In8P*bmp&3ui{*OgB zFuY7oRn(=r4#xJ*$07IY2DtXgENC!X%kNy*3rI2;AxgZUYEzXNC+1=@Fga?rM7Liv zO;a$HNn*^)m@R&Sq1_D!d|c_*CM_of zlc9jh^7+Betp<58YGoSGh%%?&raO(9(yB-x(?!}zzGf$RztqLFl{ey1=z_KqDMud0 z1MuED;M;HOTyU?$?3GG*rV#Nfa!myO$EsV-H>_Y>!k|yfSrA95>M9LjASfrM)vVg= zCJRb(AZ5bVm9)4^kD^@th>`9MumhW9!@&oDw`H1N6vt^qAKA|9JRsd-Us{d6;b&sX zjagi%?^2Z1xcD`!sa@gT?D%#q*W}X_2rNVz^ZYZF%)F9URgH!S0H5~^2KD7F{*Rc4{ ztN3jF7iwapjU8jtdlU!q`ZcFE_$xU(iP#S8c*!MItNw>+cYw2gE83-#TUwDQ8E?qq zfL{xRw8`8mv$qE@6V2e2tjz;@lzq9`Up4c4{4Y<7a`gursm<~>0Nhz9@yA~%kObjR zvrKS98bg8-iY6EyoBw!Tq!*gjh1{Ao-TIP+`oSZsUEgLcP6$b28CpopH)7oSBEk+T z0D)j2HAOi++=b|q%4CI`j*|+Op*NnSw1P!m=oV$5D9k6t7a@TTGAsWl>Nk6h0cIuM zl9G~cj@YC^h7~&Wq(g~_luHxwN$nhjuL1TD1o?$qZP9Q{ZvHq2|H+K-|0CRn= z|8X33P?1Q;PBu}g2**muDo61EB@JD4_@1?r$d$Q)kEc*cX$J62rA)oQHxPf9)sjey5}L4MZic``A5Z7g-#fI zTaa;D5Lf4B`-hL@WR>>5<*h`0W|;!+0iA<@^{Q+fCGYcU%9{IFe#&^}^%nhl;qcK+ zPud*q=4%8ibW@~P{_b&fq?NhH;KV?3wuoWq&|-0WFf}QVmK?hFw6q+l9e;b(JJMw^ zf+PVIvrYf{;{DBIktxFw>4*TYAVH+{d3&`iVPiR*WYZnSx_wO%tn zwfx~=t`JbNt-k&vx?4QQgGF}MXk5wOUQzS$tkIJ*v*+R;#O?3jPXPdsA6JHw)^yhU zJ~RLfasu)jJpML9lUmx^vWkj|0S#1R8&3hUg>VaRv`fl>U(fx96^;nw1F|oN@O@k{Yr*I{#qmTyx4Seg z(+2B}V!X|ZFuXt546}96QjUEp-d{IKr(kA$U4SlO#a}B#VRr-D^-`9nr~f9a;w{Pad_cMJQq_|`?y=NXf_Dh z&_GXuaC){Ntaoj954sSS6KI+8zIRyDZtLklB*R8#iujbo^kdq|ov?4C%3v;SZm?}~ zp^w*HrLlbqcmQDe5VL((urEKu8)Sg*({wv!CiD^y)k}GDMavXXR~-E@h#L}!i}!@X zmcsfzu&7vhLP-$1gM4@St3XZpb7o~NX2{ZkFD%(lS5b=Y zJH7jiekeopNQEVs>4%e}AF;T&cWZTlG0znopy>tF1@?^=RGVG^t3iI_9ziMS>8<@C zYWYr~tOzn;{wWnPAgJy#*DT<6wjn_Ds&G$y?@$ARkcWtm?$!|nLS_$qc3>wmRuW6<7MLc4vX2oqKoA1$*3`#4JDxZGPCV*-_Pa~OjMTP3CMsqDKO^9zse ze)1KY^{?b-aDo7o#oWdB+uYP|)`Sdm>hrj5vEU7TNym_W2IZk@fU5k#8)d=pNkDma zR+i!V9C?x=aHlghK-yg(i>`1A;s`F|S?%UPittZ$Uo&xMMh;(_12E~cn2dYQWwWK1 zrp~^*PV7Lr`n9p;uCxU=DH`d^ z^@K5GuCFif-LZFTBcuNx!PVx|Yc1jo_;W23fTozEymEw|VpyFV6ep72250;$E_W z&!(bP&-06_)5lk(faS1NwA4i_z5Z-^5iTeLd7=FW1g+ql{cV2s%gYkr@;^XcfWYiv zx&9(dN%O*^1H$By9)dhgNg#0{m%HYyY@g#$qyOkQu|_JzCW;F>9@bP69M*UMlt!+m zDOrUzQ@|!`Eg6mss(2+HpgCo(JvsfLo|w*jymV!UUss`OT*=%i))<-iKzvxj`s3Z$ z?T&IJFPHucw%_zxX0$exyc&Pe3#=a$EQ9;mZbv zDv(9Kq}o$3y>JT+c4gwN7gJoa%AZ1QBJR$SjF|_|txlhF`!zL>z z6d|b*KS|w;>!Et)wH`oOG{yHBGfz~e!CK}dD!u}E!N0Ltd|7gdEuA;}lRNald3|S3 zQFJU{WpncYDoaJbkk3KrRe`n{BHHNF5rGqV{veJc(~kL zLf6p=Spm}dn9$TAJQZ}OieUKLm#v$v6M|NY#x?^{B2b-3gvUeiy%LZsTiM}e*DXCT zjJV&3J9Kxv#qXLQ#)n_ zfoIk~g?K){mNBc@nlta2%W`hHx6==+sh<0T(eKYiK49L2Bvjx%oY5Omq>^-6!#DlMLY8;w8l zzD(LL#_H_yh?@{?NF9HbC+5X{{%g%fKhV_3X+>qe9yL>Kk_=1$WYgsBoF=>UYGPjE zf%sFGufK062~=SE)MH2c$SJd+yj*=yO)w%fC`pXs&x97;dUBR94Es=zpf&I#!S+Rh z9Ezy-8_p3|RPU{3BO6l?$_RwEIeQllq6t_UbN89E?5VlZrWv^tX$Hg3Y)f z$dMiVwv?C9{*w>jsvt-R*R3$z5AvGRJQ z{ZLyAHCt|qUjmL>n7m^okSL)3?&sFVm27t z7C&J>{bQNA(k#pCx%w`B1;qO`cMpp@o>*)`skcOC5~wST>F?Yz@Vs7L?=maw*OoJA zcZP8`7{2MOs&}&(?Z0-}N9OxVw*0H0@l8f&?8WT2-1smTCJwGI^ems;+Gbs(>?}>P z4xI{=ilab)Q`MZ#rr7D3W{KnZ3`m~IFt$G(c>$3oc3{y1-|Ws9t$sZCtY_LGRVY?A zwZqXkvgB-5*|mfU@##sBuSIX^9=_Vb{bQQn=S+4E7EK1@U={#W1mPBdhq5_ z5Ut2HG^^LqNs$fBTzaP|A?5C?)vmkgOJ?k^`LKX1HO|T0!;1cy6jo)UJd{pd$B}$6 z5ZeB5Z#`@?wrtpXmeb`h&pfI}p;(VRljfShiVM}*Cc|11H3Go zVMX6Y=`Fn$GazGKQt}UOTPn&2E@`M``n_&>)_0qZZf|HziKKs+*zX5w?ApD--$haq zbaUTRLdX&y=RbdAr)< zLk`SNj6p?%dMqe^@+We;^2>|IBN;D4vdRwU>O>`X7a4CI_(6QW+@vp!jLhERX03Wo z;^?yb#vr+>^YC&;z{53lW*}W|2BbgcXviO3Ka0t`$?H@3N$t^tES-tSt-|73hEgo# z$}B5vEQOkxkvmQfV>*JQ{QhVAr>LfU%>rFiqR-2`lv)U*VdxtP0ZPyX{}r2a-_xH1 zT71{TigbJcdU`WVW`pKDEE2xqCY7 z09;Smgn+EK*wtbS$uS3_jG~R1VXZavuN@)MxpwPVm!l#2Y3Ut)tH~@FU&1FUkR2`6 zL>}n-gAdS^^m|bPo{yq>!gfqVnMep9acP~3_H4{}YQ^)vWESUNIbduo3fF!_9`^S0 zMyM!h3KyRnC#9Q}5^Tb5-44jwPI0`!eH@Yv{H>}O{C{;PSg#J=D@SU&`a4RsU*}TeoMR%WP4m-3UtggGu3vSxUk< z?aAyLd5ppFKl{#g$`4XjMh0f;Jekm+8cJ2f0AEk`+8ifnpG*hy=IvQfVfaW@#`BTd z{o9Ezo^Nn{Vi7+okuRLy=Do?EEU__KWW6eixD5Q00rdOCQMqT&E@|WyRfGNSw){`DeX16?o6XhppJ+wxy*Ro$Z7Q#KLmegATAdg#7Q5tF9f|@#|Ibs4jTj z1WsbEAi)O;2B0`=;x4O8(+zQc<)EwWT&z!=m{bS|sOd$RrK=6~WrvOvs966*B7Z0W zHF*VXX`T{~%#1K3N-wJ8@teW6<$s_?&o=wWWBXFQ(&ZnQv=J~(;$X|Y5%V`|Wu5~J zvW}XH^dZ26V&!2;7)8dNjDkKAbwmP63h=Ojr{scvL_~yQ9%b=|^Sq|wmq{j6t2_Fo z8;&-?kU5A$FsQ(x&TEy_bdMm)tZ#`E3w^EVL4omnyAK!E&Fox$a(ggVUmTM(Ih>9I|gql|Pf)0{q7kZo?x*VpA2F|)9T4`PMh z6f#(&OlW1u4IbP%rrFNeDcwcRZj)oJ+vrhvjuGrWvCY)i($bom=g~a37d7s3XKE4v zv~mrQVve51#rI1GlLHp_sKeUg&oJ0L;a?#yf#IDoGqrq|@bldH{^-<5tmwQB0D@y64#ngC{UF7#wV_B{YG7@jabZN zh2;>f>s36*3twd5e_qPgRNWgoc>02X5Bh{7-1_p84LjKT%E3S%e_;;)=Nt1Q4>mRK z4in+GBS{v4NpLMPY|woqs9hEgR^=efTMP!gC7hM@Zxbslf%O1zv+b+|!wIz|v711f zfIGoWUsV~-j?G(KS~5XIzKJqsDtDRm=*V|H9=o(nabV^SRB0JprLtZH2+2_44_<0r z-FaoHX$J|kD2a8_%BT%tMvgb)WR1g8#lnHYDUn7#du=*fVZk@?+rY|X*xC1qKHWZv zAzMI|gW$~ctuvF#Q&{}Tqw4g0 z*eUW+zVtaa_|&P0YON9VJ%C@RHQ)3*RsP+>cKLXo_eUK|K~)rzP$pvvu-$fpclcia zi5PWOhoO9bcgih}_kjVhn0sWQFVw&i$7zo1%@SvuNlZkT#3!bMuOv%2GS{NAw>6n96>NYNYeZ8c)5~ULlzGX-}w?#78%nNM!eI}-vE}2Bs9`(AV z#&CzODD?jQrU)J$*(Mq9;ft$h>Z~rz{6)m`vrdosybb+1mDOjh8NFB=_FyQn-=;D3TizOtelzs_N)_wKG6qbv*G>^Cru4OOZDd@j8-z@U4l;pH$phg&zdX`KQn?_37e!sLKgfGN&9jRu$NWKwATJU3SGZjslEYVk!o6h_ zdwWjuG;eYJ@dDR1M6y+!zgD9Dd;tG>1CrX%Bdw;z#gPs$XA%&!7&UJqO)3s!B}!i& znc|ap-56*&IjKtlEr~&T0$0PEQx6YxqR~>P#caMyzuR@UQ_QjbFdEu%u)IXS-OpidU=g$W{wy z5qEP1(i}47)X!&oGJnbZmOa3V$*0!Tcv@;}C)~=9GuOE7 zbg3BvEaIKUt0W>)DObv0d<*0Wx?Vjg+H$&(4gsVufQ=~tR~LTR&);}6tHWq3yF>h` zs<*z@34pzCT)RPYJk-{4VKoXi(O$mZ@-6r4jUfr*GalE;cp#sXlngx7&i}yK<)xq|SsO9VN z&q>Tas+|jE8Dp)QFCt29Z_!J>4)s2EyZ@=v)!ltX$adneP&fq7&8mg8K1F$0v^Fkh{fkk)bDG)@k%P+{H;?|jbO`a3aRgM|z33=`>5kxmx0y?&UoZSBz zB&V;Bbnt`h#Z~i2mx2BETV`davlekeF1n8zY+9VYe+3!%)Tg*HZnc&9DS3lb@VqC0 zwFm>8>(SBC+uD>}f)l0_l)KFtS*qV`FNuthyM+{Lu)iP5XU#Qj*lReM35x^Cfm&aX zmk1LGq+pL%SP#ql#)cS<2pAN3lbBx~(WaxdZqJ#N$6=maSRFH>ZSS*8JibXfKijnx zQifL`2nNWv!gkAt9hw$H(e_15l#+UqRBww?>;?=899g8&D z3u1W3q~s34b3WUaZNu6)dLqBFM~d#EbQ!L;mR&C^8eMqwB`BwzAme*HTOw0Z37^Tc zF(69O9yFooHX)Na{faM9Jm|GjUXKBwr?erpc#vm>e+3+dza{U`)b3xMq+O%;k zRwidOnVH$}RDiF`xWC`Nm+^a(N+D^_->PL4f<>>0+uPXM@@jx`O@e&_0Nsw~43Q7g zEOpCGa)xq(g5TmcYh5>H-T~l>6q03;Jn6L#u!(PzbPN6KQ5>QAW|1RQ8+;KIM&27d|BYxgl*E457 z$zdf5sEWAr@(mR`Q!+8{X1)9;X|n@py!@3aGCQ}Ce{+_ zl$+V`4|M59Vxuzhbb^%1jnWGEvI9wd_xUiI44o zTAmUvef6EEy-(a_^)2Ed@)#RcqXKO(kk6|~UFT3^sVoZTydDNr zABVH~!{$^DDCyXMQo>v|0-93#o`|1(51A!#PLBunT{+K&3LJGOqth~Vh?o#CamZ^i zGWxPlK}w=LPtSL@)1E?K!^OWk0FD>lfw%;=M`Di8Q+)PAK4#>`84Xv-$sDugel;h9 zTgw5^4$z0>!v`0znM>Xlhn3y}4=MKN)?_vR3}E2WKpY_y?64*p02`R>86wQy+R5NN z_gcd!M^{unl7*i$NoXd9&{~hwXP% zrE_{n-p}S7{)qVIPx40?xhf4HZB-5XUEG#RjfrTMnyx*QwBbFIu>~C}d?}7hBGqj+ zGNezOrHH@H2?|ifzsAX$mWfEOYa~+H5du3eLcoX|Vc*=&uvpOr zVkIylaI^RMk^;q=viN;`EF^36oP14S&mGpFDudTtKvD}@QCTS};D`2@C^eO3{P|X1 z!{bMyB+HlqFz*u5E8pBQojKSLHu5U;uc)0r=6v>&iytTFrJGRVz_;(AWMgUsOK#rV zeV5VVa>kRcI7xW8x*?!jbzin;?^0=d>lJK)EfqBv zfsKl_wRW1yX@#3@;d3ub!lT8$2PV~qs1y!!9}&1;!~s&kwEc9aZm01Xd$P+Q#^=)S z;DL*U$&NsphKcmzT@j2MOoTkYLP^lcH0 zWIxBGE^e-^y!WFQl#0d=2Y6I25PZP(HFhdZ)w)`T@+)*Vyn?_x0;TscHRbg)7t^JW6x=%{11d)F+y!G|RuY@?DC4wuWB$?LEP zah}%En~(M#>+rjde-Hx@S~|KNvx1ifBA4m5xGtdr!dHnn(SF%Lo zYDKbSRT$QT4dKG_{xm9qC~1P7?IvFO{7Im@bAtSrJ8u7Ce{x{|`367R4Rd;I%Sx?< zSwPrC%=2}nPzs~-kNHfjQ-l2eXQ`2I{iu7!hh$Pd(D(9>X;ZtcvzHY4Tpo})}w_3Bv=_UYCe_u4yk#+p00QA=AQN{^dVdzSrC*^!YA(@0`28ObEbzs zbg8K=lQU^Z!;(%$Eg|I zrfbJ6QR4csxVLm-bqGuIO?qL0@7dT#`%Q(jA1{Zg{dOg!h)d>hg35}cy&Ky5VP{a4 zbIGSwe{G=(hX<`1^yNow&?frFZAS=)xN7hB;z(AQ*s^&L9riMvP<_*Z^e_3FzeWBM zD-$2M6^^hVi7%G#A9S@eG-#6IbmQ3_w0drtnq%>-vAq`yc{$Sv&tc*RW3jBh6@3k(QNWxFh9)24oJupxH{kqXk|<*ajFxD zLk^6hPzfcNdBXx@xbw(hIbKWRfP*55R?>xiHy+sy~zbcH#SepkI? zh=cQLDXelB$(c}jyIC5+4-7UH?#Lo>vg}3n^VE91$=VQ`?WZeokagXVo|UgN=ntH> zWMj1HttWSA2z){kGbA)bzUQRd$n%7W0Q6$71n|-#7I2l$YZmD}CMmK z6K#;Cu+%)>7$aX8mCr~!C1$JPq3dm(7g6xb$4So))F8GY?_POI`ZlslHzgP$vW|0c z>YWB}&d*@+d}bFz21>jP4#GYvp2!ZDS|ZzhkTBWQ{6N5){;dUUq+s#5N#B!c>U;O@ zzE1` z=a0guk2m0UFHci>EIAzGi+ilqJ+~V=l3Dqw5y_kC_vX^CGCxQbW{omJ!Lr!pH#>uU zeaEHhBKM9P-)TB}G%@}G$pGEJm5nE>Y)Q>f;#we!UvVZGI46eYm-rY-HsI+B2PHb| z<%CjJRU8Xbok<%B&qa%fV<}Ex?)fknB}A9aUrrE6A~atUOV&z_koQ@Y7Ko7iZ3gih zm`mlKVC09Yaorfrd+*EkDY!6wI^LJ~ts@Ys-hT&bzk5ka+_+tCZp7ra7=vy}%YrB|`VtK2xb*=8gK*mGkJtk?%?Hws(!LAwE4EA3P;2$*%s(bb~*`OMkLIAolY8o<^B5=!0%1Txw=`*wwxQ7!>N-`u(Q{f zt@tTV+MVr3p~yfWsnn!`u6y}KI9ND$3sz=O7-J@mJzdl39_%~nfPs{P!erSAx zd3&G7&VsnLNsG7jyK#(^ zY9xuT9H5-IwZEWk#VzqQ-+!30zy4~-F`aMO!@UjE)nh2oaR?&?E!C9@&rSizHF98n zknmK_*Hxyu5g8_Iht`W|q2g~JFsME_Hv2Zc%^w%G{_{eZCiLEe2jZ<6xVKKhn*}M+ z&oy{ZR@DV+S8fTq-~;XCGzQM6=I>KYDvN}5QceLFPHw;Krv1`R3*-M2Ckp=#MmV~; zy}eyb5X#QqA^l2K;0=~bV2qmvph2;S9J<8q77M=@+8#o^d=z1x;(Po+s_#1IKco3$ zhA=V!Ga2$3Qhac~uVLj!Q}pXEXRI3n)GgkisaF zeo{+B`qopKx9~>xSsDXAZM((xaEA*PjY2XZ|07^c(U8WIhMk61InW-q_~m<({Se{o zbsdhO+{NI_w}F8*U+z~vo>0oHVjH!ZaeLIuP4Lq1sK7{cK>6dt-$>1$PSbDK$?WRt z>Z%9!Xv|1?zfJB`yDV6XIW@x4ET(L*L#C1)2wAs2kO|4!%5qJ`N96c9@zq%jr1wg* zl-iVhnDhGY2J};SEPpWH=9tHb^Ly`B$_b>}#Vk&!d@U9YvL(dF2cSd2GM-V@r9^aW zprWf#Wy)BKXM>^FuQ+WxZdNk=-?#Mrdw4R$CHAGg_CAYrpFD_R?;i{YBcnw%3gc8` zFJ(kfDNh`O2=R4fCe}RTx-ErMy{}tN9CKB?f^Du(N3yZ29aW?5D%sJB+o?XK$jW^+C+IGwpJq ztyN_7U6NmbKTmQdr?sX?O1I29Ct&nmB^?ar>uIzp@C9!2Rz4m%<}2-3biB+chQ>TE zf0f)f_GfFBe-16|89woZ`e~kmF*Y?d{m4(zY-F-koG1u-4S$xtEW!+CeeDX(?PV*~ zBFq`-@7zQC$;-lSs2X=$eT#Tr0!4Y zQ0{XIjj8e=WHt+k6r_G%cAy3D4S0%K*PD&}td@+b)I}nx)Jb+Zp%`#83Bh&HvOQatggUJdXX(VK z)m*4u7*!J){Pf!effWI`rYcY~jt@xxepsPAhV`e*3b)l2vN>)aa(ha*J)xxW)Peyl zXDZm;x$8w#h%UqMvjQEU9KCU(x8wcO*2%#}bJ;8YV=-&?vdMl>0hx9tn zDFy(tq{kCdfR>UvTLsP(Vd;2GXIZKQLJoa(1*n5^-ZY^u)ZT_8YiKSW(M@ zDD?@pvXsN+Ob4_p;Lb$uFfulV6mwqw(WjTw#liWX1^oVkv0Jx80n^(>8vw2HVLhbSks9Uic|>IY@;B zeD$zW4iwa1CVL-1%ctEmCWLG+YS0Rg_{UZ8F_wEOALr$K4z(XInXeu#5|X>}JM8@< z_{D3q%ivA+%>*Feuls%}$u5m24FYF7l;@G?WVI53lf!=i?FK;3)ygl{GGm@`Y}&{X zr*0*^rGJ1#`eDv4S)&+we>sJG&fKN`UqNWHgm|dz;y!yW(=f2U3%iu23C^`GvSFT- zyP#S+6!kN`Q3a$^N29r-?)ZXTGubmi>9-~k*{MHB8T}$G_eVL!KcgfjptCa&{5w5GEP4PqRq^;>*z9AzvV>-idg*#BSNxR%;i8G&9eLT6D>yIV zOs+zzx>Mqkv+p1k0B{^HPxLx-aY+$0&UsiHwMGIrtqesQ?B zEE*+gM$}Jt5lryY@8B!oyc&HXulmneH)UZLa7rRu6+s?%O2&iXr33K$QMqs6=Ms)U z?>GYElndI)YL*8Yg%$2xTFDRVOgkce0Pf~YmGAj6a{MBp)ql(`U?2JY_QG&W1Mv5x zUS{AKEhotrg-gV2<`$;U43Dn@hl&Igc0V!uYyLM&k#sljRHfvde!v6z(9MrTUpaJ4+dMT}C_&cMHHo|OQ95-+qS?LA zct{wxDnRZ+pIqBa1U`!So{3z$t?*FM4oKDft@H3dN`8B3kIj3NaHpq>k#TEC4p3|- zyi})`n+>4`%GGK5F7%p+7+BNS;n|#J>mK=cueaw9#SiZO5~<=L^%#($_8lG_J+8lP z`(Lkg9MRPBmbCa4DX2)rh=b9Bicl^vN~e=rC>6m41^l(mlbg9p`CDJD^n`1xoC_jS zZ0+oN^&Ogt#7)BxnV6{5C;zkaa|+gxx5$8?u zy1FES!h1`|-MimBsNsaUk7+GP-l)us2y`4A**1`SG$_-7n!k z$oc>5Vc6AiAQ^#?z3JFG4OAqlW}qnwQWVbPY^e&YN#Y0q)lxWpk&7=IbV>TV@JbvQ z7N=8JtVzOAKo;^Vr}tO285fKz&WYYepQ0n+#LMTQYez=V!d6!aPj#^-_XraXUnc{!(0 z)hzZmXZdeGB1t|~VF<1Y3ci#Yclo6r_X7*&E=R~GauwEZLU~v6OJfjLV=V)IrKjXs zk!~`epL~^Eh@=CBkM}z3UUo*$UI6?1dj1V&{G~)*LI4`3*8z=r(jE)hf~D+f$hZujd5$m=^CdC3M$lebGl9K3YjS zcyxRbVV-?M^CplM_?N&0Kug-TuXQkZZw7o4vgNASreZeY-n4$}=UN0k?Ed!CbGW)+2tik4HM4Zihyl*}Hw6RsLU)wQ_0%lN6=@s@g{i6%^4h8#6Ydk5(P zd-P)q_Lh3u5$)H=*0wkBA}}m`pPB@>{#77O>Psy-`TUh;EJVY6v|VmedtHW^pY#aa ziDdHNe1FNC3UiU0@N>1e;4nbk{Fj^fLvilCECY&`f0Ewb%4*PWsKDMM3lfD9n?3eX z*dFM*IMF3}IyP7`P(^#WN;OU;4h+r@4+}pGBML@WC=vM97Xz)Gs?L5D6JH2m_#hJO+aVtlzf1UbUTOOGB&RL@|a+7!%_xClSTCw1_d0 z195bo(DuPWMXpCNDRIE4c^g$q*$oTK+9caDm~7Dz|DvY-}q1!s8MehEC$=c01HTW z&xA%(MY8c&jcvDEpt9&o%-6_WnO3fQp)mH6ghh6)i~UncTQ`DV7R$1;C5QKvH{SJO?K9x)FKQh}QM2 zRFk89m2-;jQnV4Q$1Oqt{}nx_!l#OxEg;H`jNn+kD}hkQZ`q2-9qZ| zZD9Vj|9F!5XW!$W8+Zo6$oROWy-0VR$}zkC`*l%<}SVofkIK5 z{qqWXU2b%N?U5vh2H3*rww0bijIE_*X9+)I=in?u?~qqa4aigd>p-qh019xDzkauc z$|R(la%s}QH>SY;utg_XyL2j}5ff*VYO?a$Ri`Hn-u^9Zk>U5 zxQ#UuWu}MGm^Wi=CIHBQ{RH9qDl)%Ti{~76tUyls1{vX`^o02v`lUKQMn*^D^=h1c z#h3%`@)}`Oo|5jg#E%)$bol@`k2Wr867%ZavDR$lvWt|>iChy!_4g$}d{{CmO3 zIe=zZ)*GZeXq?kfwjxVEce7DdB_PXa8RAsYob3TFP;5!@f}s5C?oCOMaEcG!sMB3!Yv4h^7kpCoM-j?kLJ_7k_3P@zs?jh!Is92}b$1@OFP|1pu`^ta&)cP&lHCc#+WIs%OMgT7A>c4DU8XMGJNXvgu~h<`mCOi`ULC-`eu({Zyi z4WOUT6FeDqoGB2Zuu1 zr!;2s&sMK*t)Pr%x>1MERvzzopB*CQ9}F2zHu~0)cp8Cnxz0@CdApJB*hP9=qPe+* zvmoiNIf(th-Q6OxNBk1{TZ{G;3?Umfs?)j8vJKEv403R)xiRapFAa_sIW1aH0EYqp z@kimZ|DiSZq8MgP88?}NL$6#MWXG-)H)DiFa20SQ!^zj`A#2ZHeu_I|r!DVlCV14J z8ke}kbI5yQy>j3LkN>Sy5gZ_==PTXuycZYXZH_*Kf zNk_~Q&)w*Vt(zV2wd3|WN;K*CEb2{r0!XBI}4n0L?Y2&^MHZ;^KM1W(ASCi>KtoE0x1rE0P$$6 zJKyWP?61;iP zvy?2Bb}&rd2OQy`1b!nw%Z!0JZPk32HQ9gGO#|$GvhB--vD&Oe;xId8+vBC*+K{C1 zj{4O;ev+@dC&!eynDys^USxr!pbT@7fs@UJhIL1eDb<4{?)Itk)r~P3#4LLG!MP#e zG+op#(sg}S3r!`X0C>@VPs(_ZWOJ(KU}qN9>y8D0z6T6)#X$!3b*t__!hCTgi1vfZ z{N0p_z{e%?#0~_;9)2;t*3^5bMGfSP9A$@T$~jfCH>0m_Ewlu%*JIez4sq=6LKuHz z?oXTE{aY-59w)qn$2>CzU@Edgozew8z!hDWLxNQ_(RJgI_NYF7=qd|LbDnW_oAIDi zy3>><5N4Qk*;Ly`_!-fHb8A~&`b^c1CUtbhdLP#FDCL62q-Row{-m;eir2*Bjl%MX zS|C$_^*(d<4^v|#{r5+o%+;)XKF8ucWN|f@`QlX(Yy@f&dk_ZN+eV&bu!w&V$~dit zl%~LVw$Cp2!&0@G#AK7Wt&WHgTFfaET*n4W1*`6RJF8-SYjw~P3|8<^#HBHA)V;pj}Kh7^4|@w2Am@q@G$WDIsPxS*V*Nr~#TID7`AK(lj4a;BkU{_M$ zVl$Q61Us5-4W!t_4za$YI$ML?jvJgD*o+IFs;T+p+)CNk{BMz`-0gK;F|5&=?HOxh zE5=?zs2z$BJk~BfQbGXHc_|8@@%f%5yU(CT@NUrIaNoZb#aAkPQpZjV0Pb*n7&&Wn zCY*YgYt>hKc7O<(ac+PX$^Sa$$ARtGa)+BFC6ay(ajZ)E<#9E*kB%A}(RhQL)azI2 zX{6_`i-g&>vNEDC;@VkYvYC_WTgOY&zbN)6b*H^c<#awn8POu|*h+YxE z21491oY-*bo7CXaC^~BP)@KSg{7hPNS98egudm>Wi`7 z;*>a3%;jWo#|C#vc9ZEZ=7dW)b3PRu2G)+`m+t;5igfVK)!&m#6sW(stIGw4EI*h={O=?`| zOiH>IZ-nOzEzsj{3!2MeDq;K(j3Q&fMLE3_hhVDMjkXTS#AH?+Blb@NO60|j0pek2 zKu(I^SppUhc~s9QJ)8t^gunLfj*h>^Ch`y<qM-!R_Mnh+=UyL?t zw;Vf8KWZ0eR4OAsD{;0V$#nwxn~Fh~W}`$8p{?%VOC!?aOY8BY0)u2fBLI3qjp@<) z2wj!!q#F*iA*r47x3uzy*z>z=k# z#ZPhi+P^yIlyUn($d)zHlXQy$QBZ)o9Ftf|?27dUAw~_!_t-Ps{)8XHh3L3%RCAIx z?(vOorawu<-R?kE{A@tnpw?xLUHyNwBr8{H9kv?qDvjWKVMYq}Pp8*K4*1aYrm8!y zjRs`kn+N*T*icFw>zRS6IUB(Yfr?t1{X_5`3*uPaRU4U)TpvgI-7nr-FDPE022Iz~ zrG|$4{XH%Jd1$5x<|N5|#9ADy{U28%yTK zIwLIQepy?EmooKN!SZsgyiISjs4$bKX!lZ8R&7t^frP%-6LI-;>#g~o`aB64=;Fxg!>izL)OLeRu!56sO z&vLe@-)F9kMKz0qqGy`7sEw#3;u;iE5~8%H5D(z(CtUcWo_0KTg7{ZYhvDj1KtXc5 z+N9sg(I8MW^{ww2sYr{mx+vBFdPQY!R6GYlb>P61mp=)Sl+>I5)tU;O%|}HKr&Z3N z`EbdEM!-H?n<%+tM^3#hdtw$XQ!`G0WNEkH`qkCsgyn6uC6fzcrEw}6Q~8J~lP^o* zzUf1Q)f=3k*xLeo)3sa9{QOw80$YFVAVA6DQy%^KFMKXZn3RJNO{@K$*M1sj#3nD1Ore5DgR@v4IHM3m} z!-W;f@o99XhRf^TM~?& zGZ~9!cj~x|ETccGCasc&23_ZoZjc}~9qn^tAfd-mFM#Pgm&36JwvY(M8IhwjcuTw1d>DiCHZm;$eBvL>`_)J0q1@dY|Nba^S< zRtGMpxG#=$MCk?ncO|hzpy{0njfc4Mvq#a3%!#ockgzx44hVg7w_p{bgn><`Qy$rz zDyofMU78satW=vst}jyHPuKqCOcdNTMWea?wy@PNDQauocVeDMZQxIjEEB}ZNih_I zryv2)N~vhjD*hp1b@!^xH(kOlQ_uS<_mJah4p!>8uG*666AH|Bgq@nSpjSN3V2~Dx z8*W@WyJi%NPml(k1i*mM#UEk7xSs&LC21_b{b|hB-f>4i(D86vMy^vR1UyMXk{lG3$~G@|bRQ~dt8Oeh+*_K6y^ zQgBB#a(ZACDu@gN{0@(DirHwb6!t6lJA#JXJqaU?_0w5qH-|ls2#%dr-X#q3M1<<@ zh&MfS-(>6oGF&f%eJI)t3u$5iYjZ-u>j%m zVzq&VW#v{kECk}7fyI2>6n>)S)&uupoS<^>%4~i7|}do^m8CaigBDb z28vxa25qsk4%DJ=V|A!v=|BtlX^i6{bN^_MMPpKQwF=-H1~$OeG*kyM)blGiP%Q7R zWO7k#(i@2JkuByx(h6r&r#^V7%c)$;#Sy}qemB~~61owFOCEK$D+ZohW$vileV9g0 z2raO>VX{MyN{R%gW$9k`fAxXJk@D-*tiyo5fSKM0M@0gf@OlHZ;{)ai1vZ4x64NoM z%=*KQM<_nikGC4dBfdx`KZ{LN0!$&@R6q)=cSP z2*NhOFMG?Cx{KGnT#8`86gXWT-=K9r+*fX9IGr`*7uBN-)F35RYO^B6rh@f(t@ly3 zt_gK(${uZ$X)_ar4G6$u^pGD%HIAZFfXV0tC zZ(&ftLO%Wc>Qxgm5buHcF&i(;Uw884$H46>9&h|}bwp}%2oME+*JL!yvWMr)dEV<> zI&FafW+5$M`4hn5dfd9yh3*fL;8*M=nHj31o45feEvj<{;6lfXOyM;$z1EhE{Z>0nPWYtOz{&7RN zbXws0MoR~Xla{b@>cNzS2|;v5L;xf4FO+Z*0T;9moDca$@;3me`vXCf&sC+vzFuYn zBSXF0CYct6JCzlxrr)}QKM>2wwnwk^e?pXzmfEfQ65?c*yKLirvI03Cah&IVg8;81 zSkZ#7wj)e(r_2AAM%*ziVqFw$S`!knUzD(%#l|8 z#?{XJO|hTlHEI^NPU2tF#%u9YP^ennhJeS~RIR|R)#~Q!`NK^Ks3KWv(lY5jRT>9c zXHpsUDujI4vDqX>@9aE(LNH{BZ>rgO>GQkzrZYR+vfl=AwchoKhQ={->5xWA*(AYh zqp_1rH;R*65@M{DG;=Z7FLP{D6}o58Git%)Jnq7`F=Z^L2REvhS@zR$hoYI$M)a?Z zbGMa(hSEZ@IdCqMUhiRDKi>6HDs=g1tCK~;FqlcZm!-y?#4;!s>zVaJIqpeQ0EFxl zyWH~UEdvLeopAz@Rpek`OLU5Oy^hc;9ffra6mK|~@%n^G0qxYBb17PU+QDx#F`&kO zMvb28$hS(3xkZ(hmHC?tus#vj5XFT7nFanVUI(}OVM7O-Gxh?|3sg#Ncy0mpV-`z9 zJg|^DAE1Ah87+;>bxI6l^bW%4>~J2cBf@5uJrPrVPcqqGSpE?3yd2|t+1&DXP-BDT zq8sSs%}Fkk@~SpJe8h63n(&!@sed9|%LEXo?5+E~A@pneOV|pLkQoYuot_3b!Fp0} z&PvNa{*JZgria=<1$+`LuzCSAUyvR&T!&#_lV_;tkiX}~C;EVTyR3S|BUKTLWkk|9 zLLh$0s?=)7{;>)qBGgJ(AmcWu>>1yG+z<0mqYH#)v5u0casX7E6U zs!nBthbqc_dG$NS+PsA5+@HPM2mqA5K*%59jv8=cgMsA}dbY;P{U7@3MHPHS{_Z?= zT{-cv)D3hak1o0yCJY0MUZUV@(Ff$$>Asb5VUscxL&j z*w#vmyj&6-m^X%-i=al0>KXGb;!Idrbd!nI&?RdI+#ola2KTlTD(Q%mw38 z1;2&PBAe$$Xbe{P(Yhl9i^vX-@#3=A->H;|l~V=7kXceR81PMelEve;9vgp$Ff);~ zQH@i-6lqg$3xOjxXKM&xUo?=okxBMkjEdG2tZMDCe+WE)o191d&WtTCBd-ksdQ~j$ zK@4_$9s$Ve=qYE-DOdlY)$n&?M?W?KqLdR<7;k=8H9*swYznYY=v5RRoa6Buqer}U z4M9|8yUrJzG|FDuOQ1!K!Kzv-Y8FTXpLm;iX)Oh88u4hN`J1||Bw+ls1;r;(C_84n zaVx2b01{e)1T$h5#;{#jYs(b>5ZdY$yKI$iI-TCVuZ&o%H&rhG$Rb0JOKq29(bf=&0h>7fnV0vL715pM$IQmq7}uIp}2pxN*mvckOPE z-%@jv!cq(g#Mk9O$;VBy3&}OqUgAJu3$bv3UD*$!{3(}qNkr4YRW_{ysO!jPU7aAM zBNkD~;MoBNNwalfX@tjx6nmet9>W|R%&onAIb>!2lgfZvT0%>;6sO+ z%|Gu07LDFF8KgURAS<0Jpi|<}0Wx92O_L$%HSn)NP%7ei@AH>2$M6u=TwmFC(qc+* zKtc5vRCf5VZ|4VaeZc6i*E5%|2gk6}$9@Os!K(lrUenC1P4EGj%ae9mPnu)Y_f!Qb<45=dT! zd#}mIJM>!IY&^$0VvtEy&;^3XO`kOG&wck}u-{DA*nc#h*WdE7pq{Ig9XVUXPz5mG z;|BrcxQ^xuPUPYNRveWN-B>(L@iw5+@phPj*Awmt$P}h1jev!qiP@BhQ2(a= zpdx7eGh&CH#3tQ4znl}HE4d9AiKF#8I&bLV#L}vz@WJ(X(}D2O;ABi`mGiMK1dR{* z_;qhzne6ef1o*~h)~C0HQ8T^yo$M}XuyZ22Hz9s?Q!&5Jc{hIRI3q7CZoHr4FD`vq zY3c7dyEUOHPISx3LX%oEm48_8A{f{tf;P|l8K zKosJeGog=%>R2qd#K=!xb|3QZz#M(8Q|crh&8?OOlTW2uI9zYJ1F_1jSj zmoJiDHj&Q!6+8^@I)|QzTUqd>ed$lZ-ROeluN>UBr(t)p7b%B zW){|Ptp-xy;i4c2u{M+zaWGTY5h{3pbL#Z|`&%CiRBCk2e$79jFc1EIf{Lk!jJ0m! z!E(sJ#|Z&xfvAXJuFkR_a=!*r9Rl(u8qHaN;z)F+<&MDqblo30aO3H2i(4F<_ySnD zF2Ams1B9ww)*;Tb>FMBKIxd2wt`#InlpOr}wl~r`vaor+LiN#7?OKOONf9>S?I)u{ zsu{qdv`vH6ICdZWkad0zTrz{6<>sNvyfw$+7(isQQhqgi$?kQ_*RD1y?NEj%D86L~@UvA`JU z9EN67<$JS{&8gDQje+T)c)QioAa#wq`wq1vi7*L}so~Vrw0hf+a(;*#qeNPw&h&mF zj|?&(-_1E6Ie0o!cp&lUAU$~pR`vmG`bJlVVM^F(Q(BdCLkYw~*=NBL8`<;tqq8+g z?lQpshvmPJ?~Bk|Fh^XZ8=j}>_qpnI`WEmn4r204ckpK{vMbge&nY%o6=#ml$TED+ zd0??!l_tkdIR^(+_Kn%E#PF(ow|~3(ZfhP3rDuGdWA^0gEiqk{eQg>Q>GQlnO%ey_ zDBsGy#ywoFf4xa(;Bw){uFE}24F1e@U;lG7-}Bw!ZO*+Q*i!wDnMT zVY0cT=V>NPgUaIyJc)K=)t5{5G(KL0isT-R98hN9^U1wwjIWdsH@hU7amgUH@%2K? zei4TYv7qM;v$W2efetww*8Y{FXc|V&Ye$g{va6ijBLU7bu4_XZvyk zE5ATiDi7T<1O@^$GCRnnC7j_DXp$k&z|4Qn(Ep1luFx6xCi0J+y*A~Ahjx!d8&x4n z_0Uj)Y7!q)8b0vajE?BCB06?cF!>=1`dy157l<5#eh?^-0=Rw+BBb%JMX{z0rZZ!A zdENj@M>#U%$M``MMP%?x^6MDtJqUH6)UEGEV@S11WeIz<;sh>-blh{W5Tf>heS5E^ zpNY9KjP@fzWUUhSK=VlPio>khD;+#E_^_W%1|!@l>`G|}17(K@A!!nLAJ_ouT03Mv zHCo}UL@&F}Ygl@Gejcv03?gPHq0;5D0m% zwF+rTs4r1u8!(9mrTaaSl2Ftlzj~9_G=E;)FzjqbG4d{-SmK`4%FgdkrM^gMdMrO~ zvGADxk==CX$ff1rRz6UrxR0)HpwyQu54g1|l;}4GQ{>l2@CH*=FI!0lWr?dsmB!V_ zr(l%mQl9)=>jcRjmJw*hdnvPt171s8w-rXbp@r)rLV`N-7s8!589){`ziMq_HooDt z4ql5&8xG2WQ5OyU$w;-q1^a-DOn&YvkbCI9Eu?doX6h{^A}^AUGa*ue0n2u(*O8wi zmT3->XIqyR*N1}Ulrx~MWP2uA@y%IIla^m$I;kKC|GO9ecqiS z8tA5ZCER`C{KEcWxrzsw%ex_^wnu;NRe@;e&%GKQr`2zm3kzHE2#nl~;h zbr`@OcCnkpUY$Vb5N7k~A~gygpT8_GWEb&Jv3RS59uYPPF>L9M5;P7n)X*%<;+ zMG`2}81tDV+Iyp{muqx9gzEOF7eqy;-vu_EksVK9sh6iEnktDnZ4`I|+Ay~J!fV*_ zATT>r?Zyh5%H$tcOB&PW#GXy1y&<4&qw9N5L{ZKH=NjK>o(4*p!3wW z@PG}=#Ln7}pOZ(K8wSx&uDXss{dHdH2sgqb83BwSr)-MEE-R3z#PBHL6MF>QGE_K{ zR0a6iadJRKrX|&Xmlo3$do94W#4z#|d5=?vnQBL7chimuPUthsUaRmjQ@x9*goF5_ zgF7h~HtWf-B9{Tfbc>#TkR^VT@zV_vlW;g!1+6}=!z%WV(k9q<^1Pu_S;gcb_&_-B zs2?26X@FN|rdHX(VV-{VI;}=7Zb{rveG`CNntWGCC&Kd9gG_bZ9Mgfu${~3B=48K6 zVTB}>^`@zwgHDEIv5g`(Fpa~PCn82mmHY!ocn7mVlqKvGf@s_wGcnTBM&K-3PC|&b zfVJja7(WLJUr@#6V4Nl~xB!YfEC~8^&B!^?2}^`ypn+7a&gC>}Sw9{C7Rbs`LJ~oR z*CuD`B_poB{cyefSY@zmc zSwh$LF(~&K_o;h)I@nh1VHKrzQq6Y5%}Ao@%TAwa#gcTF6HmF6@Q#CfXC~QH}2dhi3@L$1Z`{RHcQL2tz_oOvXGQ{gqWrZi+Z6OEV_C z#w@H*Fp$(=15%gl;UlHTnJ|ih$yA8Z%HY?%A5x=DRt*BhWDU$jNV33YoXQGuSETy+ zv`&gdA0CM)?Mn${;A0F>3(?wR*9Ty)rv{dz;G!+PhTAK)PyTp{kIcOcEd1zI`NS8T zmOyVXf2g$G(mSiMZ&8tne51rx280>OyM#U0@sEPV3gen2CAV={wa2pnr!3QX6hwn? z&3y{Xju!^;dNC0(s&gxuRF%#jEs0K^SK4ezVBDg;dlga@g_O{HO6{bbB=8}F5u@Pc zN<9iCR6B4I0u*5_B(%6(Um>y0 zOMv%Y;4LI1nj&xd_eN(y zR|P`aS?pNVu*6x555Hl{Q>1uXMDFEQu;RM!IKPO`*`J#;ZO%FPM|(J=-7d*mN$YUQ zt2Tv-ic#(0)@QWZUFfL>DC?P-IsDX(2u4O!*J@_eR2FYkXk$hV-Q<0ns_16!pMI}! zm(0O%S?P(8P;CvR>!;;*#_X)#=^_iScGVt6{jx_^Smt2qegQ2kY3B~T*#7jkqblRx zde!IeLsPY56$T}#$6@*h;;_dVN~5(Q-Exe@cyFRPAi<92N8NPip$(FiD4WL4f3 z(iFez-gKPUJ;pFEOYGx{w(ar08TEA60$k%2?q!bGS%s0edMUl%%rn(%g<^(z7f)Q& z1V_Xl`Sq)rpu*a<k=z@xzJLi^eNX7PDt!=W4_bzx{x{LoM?D@TSK50hBG`nDu zUc3v36*|6e@1kR9NQ$8@nzX&Lry0Mt{$G7<={M_zy4*S*JK?NR(I$Tzn+^xUHvTCx*Zany)U^T=rmK=? zpW?e_O>r6>T*FYhiNvweB~=?1S`v-^Fn@KiDAjibdyNg}A81S5fhL{`zTeW3(Kgzz zaP8prx?e9kv~_$av>fo+eZ{qDS9bfyRCH_eOS?MFIg$CHs|hW67f5A)1YB3nNPPV9 z_`tR|v0Y40=jd7Jq{{gCpdUZL0R!?6ayenRhyBpAyzCJ@a^$c9VdibDvxl=iQ-8~+ zQ7e-PXdQEF`8!dMH#1LE*Z0Jg4Uhc^cH;4dYtNNvjT0Qc)!w;ssPjZNtJwDD(A&|3 z+S)(oa*0kBpX9~!KV%HmbmXs|<{fSq&+EAO*wb^;r@-*n1%=;ast^96zveh!KWkY; zyEl*|u|t*mtnJ$VWaVuYsC9BrsHNehPqMdI9%8D&l2_%Ws=%FQpUpsfr(+D9KU->F zd)W3~drb7GO4>Oz<^x4CM#B3DIIKD7?Zl=0cqB(;*lFBs-vWtz@YYg#%okfCWo*kK z*LNB5`xK@v-aT(QFGoF+($}LUrDaU}BXaj%(d~!@R#F(u;3f62ZFu*t|G#aJB5UA z=fGuUY#gkvVy^yn`hOSoNN#lu4Gs>A6)u$C22$L!SJml25Go*`Z~G1z* z{#LXfVj{dk9`l`b`04UE{OsE&pe%cqCllHaY{wvSW&2%DMd0&OTmIgDiT&Uk56JT$ z_n&1v{&D}sfZmKoA`mDNB9}j3AuY@U^TKfk45frC94{g41!L-;0Q^r9fV=>$0Tu%s z1i17K;XRDA0tjh-s~t$E251Pd7T}8Z48qF+ra>A*fMBHm89+QEz#9N(0sdWpv@j1G za=!xzQ+o?D%>_S^ z<%7q5ECqajSp+bz5#$H1d;s49{0`WUX#7M53P1ZUkI;8!8}jkvkL>W%)yco(33>1V zv_T z8=ix4)e{fL+Nshg{8-8r!ng#-&ffs!HLyG#jw4frp@g|&EZGLXG&xN8kJDwb__5^6 zgmH5@{SWt$7n~cv!xDB1l)pEA_I*AWD{tV(Q=Raz3}9VMmjj*;uHqL*zkH|v;f6TR zu85w;yd{(y_CqnD4i*M6gml<$;Jh;N)aU#7xFX|M-B$cxV)|Tb6@E0~B7Uy5ni%zs z=K^8gnktUOId7xG9b1WJ`lH}Jujmn+(Mq?kL>YS(5@GUy704g*))7Q_ z5944OqyaPK-vdAk%V`I|IDo76VGzF@APuC2dHys{LR-faU>CrD3NR1MyXx!?;{iGV zoCf%B0p^7~ev$#=pzNP`6Xw#%AuzV~f;n|+H9H+-TLF-V>GIkDVF`epE2uzVp|6!N zw~of0$B)LD6Xu1PH<^UK`6KNQVaQ7Y$^chbF0lYt!2Fjc!rV1g5Q>N6JRC=6-{s;* zW6u%nfB0Yi0I?t)@|FeI5AZv{@oeJRb^OeW2l$2FW`bP+$9x!`@A*LZFOxX|fBGMg zC*%#=@CsNQ?jrDqbLjYENBm@tKfyL1jyOS>Q=tqv_b-mGP-_K`Zvn{r)sG3VY$gkC zgYs{|kK8lH!!U&T?gsqG9Rord93TG%K;Ez~u7HK1PN25~f&W;N6`_2H{JzTo>zyCw zg%v!$1&DoqMH-wxp)CN{ps-#?B2N;^gE+4eWPmuBj$4>pk@trHaXk4U8nn$XA3@m| z5!NR2-R}thVR7QG;bOiAv@c-COjjfT89&YEM1I7viWpvTo$ss#x}PSj+g2-!h29pz z98KsGV6C(Y!1DR2ewWh`WZVV+qcnQevY79F59}OoVCVEL&qln5ynkw+#6;p1mN)EI za2@w!dBc7-nG*==sgX#&{0e#h)W4P!5bp^xz&J5oc^}w(f7$hL%?Rys*yer!V*gro zeE5Nu5QH+uKtCqfKwxbS+rU&|*iSOQ<&6bb!Z-@9tB!Bq=vG_^;{_;hXje~U`2w3T z6~8nywt@x(zK?IjaTLU@IzIoH5r$zMERGKV`*`$68wV!;G(ImINB?W{%Q6}NmHBa5 zIgx<>_+Oddi88+Zm;Z=;vWQRs))E7-n<#ysv9( zs?n|CS_25_4(wOafz}vAD%f&QUVdPPKS#&sBgg1NT$Ufs zXnZM3SWl{RuO@W^6|$^GEV21QKOIt88+HcCRPDfaHmxNq1KCW7HK?kNLP= z+_}XQG|u@f^}LD-EmRlDa}c#iv4kRDlB7`f*}ZgCh>CsuSWV1MqoZT_jJs)ui_e{p z8C9#(@G?PPGm^*@u^*zgUfoU+r|!3ZO_6H}MINtQ zL#?V+F6ZWIH7hxJ@;34|os3L0JkLr<^GNd67F9_}xLA(WZTFx= z#Ue^b=|z$j^C%^c0B)on&93Aprld%ENh9;B8_&=pYe^K8xINi}^t9!x5GrSN_l{o1 z@R&=vt*@#K;pXF!Eu_IRU=AO|i0`OE98~0Ae2%to@7Sj{Sb;+AHX z_Ff@&7jB*{;yxI%KoTk{F9pgxraac;0Zgu0+6Y%VXC!vJ^?MG|pzR2hpDiK-DNkC+ z)jc4!MH<6|d5o?N(^;}%5WaMx1wq#85P>WSkVFjIguK*dr$EIb@l>)cuUdUY&m&0f z+@u|=O30&Mo0!YdlXR#$kr^1+=+|AQ*sEfO9962F-(oP%%TdLTrZKm|bcE^1*)Tka z$$nifCP1BCfIl!5Q>@?1z3;YiFTFEK(N^njUTryZY9zk^jXML9PwCt!CoS_6KCH~x zuB7+4Jjx>$cY#7#I0}qbJ>@m7qNwor?ZOERTQWmxK;xR;RfTI57~B=0~7ybJ#HVSy#z zE2mUj^cra_dGX^=E+hQ%nb?+%oktDW;>VP^rxa-b11;6!N z6G<$|=?2=^mvwbiWBg;i=yC~{1LBF50s`kTW*D*U+e+e#hsfmVoDD_70-VIdc9_uZ zy-`0)jp@Ea%Hw0dn|_gJtTOVh;%-4YAWB)yw8LHcsfAwzX+BG{p>WdaU?=gO9o;~U zR1$gLZ6%iCJJ-x2+)_hZIA-_0GOpr4@qe_VlhIo!%d0jK4=gvE(!cFwrfzM$PdA&6 z>wGa?bfRU2mAURV6@^4AnwVyvlujULgF6EPkGej^%@x~FUpqkQaV|IheBVZt-`P6V zJvh>K#U`UWB2#h5M#H1(bk%ZquA3hR)uKNo*%2GZeVKz+BFGhUZA!9JyUmj`#Ahcc zKp*<#MW#(@P2yRcWbzEoiXyu>W{ouOchc_V$0?BD7++M$@p{Iup(SxcwtX_+7Z>k= za&N^S2*lF8QDs{?=(fYYirdF$J3{d^Ua0Ppn{xXGKz+8pc1FnKT+w=SDkS5@2xpez z`Fp!c;`ON`a``MnMaw>dq7)yOpE?$MeTMsPH2qW-u6W;mHve5z9QS97d0Y}+y&smy zUQ1aor0>RfuEn~I0&~K4;Qq@oiEM#A?hGPHuAEJXGZKi>hs9QBE-%ofy)nZeZK4GN zH&QT0_2SpBSoq<+S|nAFB2s)82dM7v1zrrNoglk4tfEG7%a( zo%CLL+CD4a9--I}Tx(QeC4R87AAOGW&HJdk+$fA~M@rqHJ+u_%?+Yogx^dBWbsDN7 zOHX`hM?0NICszB+V-}Q3kxk6be2a%2tinlKJ?nQaIo%#gIMMPmEzMi2TSjM zvSfO`u3cj|@I-M)yv>*@$2KZC&$4tuUdjcz;HkNFBeVV7Y?sq9^ZWwB}UpQk7(1RA!ygpUvS?})h zvK&v#o^A4iFF7YK-qO_I@bK(QD>c+zC_7r>B=D4~Xr$y3 zy;PO9+DR>YSF4+QVqZS7iKyADsV?CnJ!s2Rnqzc2MOBj1MesuQc5@AbsDc;9OA{M3 zdRsmoYvA@+s2fMQG!~j49X)}W$2*MeNO!xt>6zzgW-d*3-H-_>xxz>V7CK1v!e;ABPntZdpV zvwugunMDf&0w<4$*Aa51hn5Xj+Tb@i)CF=#6;e=d38HDOE z=ni@uEjS{ugBvSptxOC47;^rKyh6*J?%+ex^FByBH!g`(KO=pA2Oj?%-RaA9O3HPS zIUh53ykxDpefHJy6R*WxNei_^8jl189G%=&M3W~UZgA#-3}uLu^YEwju45{}#Zhb{ zQxzHb_85XP75!$1l zdjwT+bMEV7KJ}0`9;jeqx)uDXRZHekcIX31V~_gh0nCLCmUri(4{`cC(%awD8K~?( zZQjBQMmrRPNks=sVP0*|=qT@5lduXgfsKc+-DeF>WA?3JcQzbTEjjz%LdI*3tfV=y zn~l=3D9`G==x%nbbzIT;?UsUD1-Mb8$jR>FEk6C@W%3ajZ4wp1%9ZESW|f(IIZ+4H zwx_h8IgqRBq<+(uB}d0zfW=>2ckJc!zMaNeuU?7VxkyWzdc4niGD-i-)t#pfVi>Kn zbOvz!C(oV$Go?(Ow_FF?Y`gfukPCi>wHQI_Jt=RW=s&6J%)WHbbn@bt9D|Q+GBK!6 zRg*69eaan~)|s^?ZW*;Tz5zoDBN8_zQ=SbnawX7c9vTbQkgzqq`<7}^C_m2JEs6b3 zI*I+B7DRTnix6#?#Hn%LGP{eF58EXpq9QQ~rqr7Ej=18A{ltgLO1tH2N3S?s)4GW) z;#D==yo1d6)%bkRflDW%H-(u$5-lUiCc!Euu|L3G@_TVId(iD_n_a24bOTcf6_rO4 zOG<6l^O-i5i0H_(m(;G(5BpISDVIrPuy8t#H&ixalAXiAhA@~Y?=^9Q^Q%q20?=bq^o0&W=v{FNS>k2giy3zR)k?Ci88 z=WRb7r_dWQOotV)&DAfoI~AVA_CA|-U(rh>-w}0}tXqcZeXVP6dZQWKYr1h$KCkYi zV@bkeyR2(^IFCh#qaT*{7bb{ZY&QJ-_T0pfOc%*ohqm}q$Hp$QQT>Q`!FJtol$v|) z=A@a3g@CY6-uF-eUAXrIE@3*U1~H!*44bM{Q-lTuToKheQ3W463z2u=T^eL%UhgH6ilmvl%>l)YMMKj*& zPV?8=nrj&p+8n)mg?$f|$_`TX{+*u>6`Y#c70W)>>b_6#$cWV33CyiLg@^I7cMmVF z&w9!xm8za~Hs{d$xsxPvp7L6wn=w*)TQO_1_X#r3wX)pQoEnM^UO2*)(D1s8L4RlK zm;A|wv$v1wpGIe8u=I0Y+>E@j&xs`Zuv>hT)zoF9Q*E(zjM2v!-CoRTtoyL_s=7(+ z8gel6G&{x(T$SuL<1xKht2TekGdO7!k>7>0^)b)Bg(X>=b7pCR{zIkAG|oONfY0dIzMFn^Yx%bde)8Imx)Bh$LCEN-6@K%O~^Tmmpc81mqiub;|Sna9&MdCoph)paCBVOv0r*?@$W5aj=hRyh6fk9)kp0THR1hwWw z%+yZ5{S?Qwj&y`XDofYnZeh<`j+ggg)pp*ZKKkL7v5zsyAks2+ie2a_$C1g5^?sXO z#TeZ<#uCY!7KPp^Y-JIQ8mFEld-`%1GpY(NOQVM>j}>b z@?1G_Y7rr)Ebr~-ySP=OKK#OkanBD^2W*PAYx(rCJkbz0Ejg34ZoD_ZWX}NC_~7em zWfz>E+D>59r7%cIpU14FZrF>|be1tQ_IIsPm!@<&$v3f0G~%-aYdN{GRtS4G!@c?5 z+reipO+I7b3(=_K60_+_k*7P(J1cAuR^OGob=O0zoM8dZ*fE0%PvyJdLO(rsvqEgI z(~0eSzQ|KvJtKXhd!y#X;iqf*f}KLs_6y^NOJ9$Yw;pG%d~zjStG z#ls?j%(w=D=!^3k5$2W|q>{dF+B*=XEk>-#{c7zFGprFMB~CXiDFYNe1NLH>IZz21 zM_iQGaf1nIM;9f*05o zl;0{^6rV+yAvL;rk4hYQh+X0zJ6GYhgH-leLr(`U=NY_BMz+e`iCMDnx6kySzlfYa zboX|W`I`t@v<_*2(F6G~e?t|$)T3(zam-8~vuk<`O1QfAmuRK)uj8KTuRY{SyE|%0 zOkv9br@>42t}!0O##77kFe6f_!~FTs%!=Y&3e@gkdcyU)E6&XNIN|bJt=#A*RO97L zZ)ye>b*ycx1@`z`!*}oIE?E+!?$Fevkvw?2->-u`dd=dOUHcYIs4DQ&loZV!-O<*D z(~*9KH0iy!4{UBZLe}VhwY)Apu=41ZBWF(tPTL8r%l=~H@j)?pPAx1l7+ZdIDCltz zwp#olc2_5U*2P$yl3dSRLuAK+b}G~M<^yk|I&R&>GwTZoh|s(MJ7Y(|ye^uQXA{PR z=MeC7+i8qsX<`m$psA*CetX9%%hloXD+yB3vbFq!aZSj86o>7~XxmCF1AlJ4lsSw~ zDwEs($SwxXVLDs8=0coD_VX0MtrRWmY%gF^^VAw>59%#`*+05lR~W}==#`#YDH>ra z?c`2?zNOQdK@Pdx$D=9XBTlK)v57_Te4J zcoS-~pF*@YG>-@0YM9)+iobpzrAnWP*k2`gH`1TUjqbrMY{yf{a=ORwHW(y+RC~U` zot#aa@-|YNY2V_mIRCB^o2z$qExydFm6Cip-j}23vtxT#2Fbp~X|r^15mFt=AVJso z^CwPljaMt?B5gGnc8ID7`jsg3W{sOhfL=`d**3XVpJv^MZ5nlvhhOLA1e0p{K3@X) z?>BIuc9@fmE95rya5K=3S7>ZQIw+X0A+;2#Y)PV)&x;SD(Y$(R`#z(oQeHuvW5Yw0 zvs;*_=%oV3?#XS7#p@S#xj9DEoEz=ytz1$qJC&9xLe+7{@%E;5>avkdX~8l<>j>OTze$>-CM0H__pZN z+$P^G;^ZWY>x}R$%#?B+w~`YVz>U}WAYxkdje0xJM2_mHsfeWnw({*cZ-Uqq@Ak15 zFT1;bYlhSXFc&?(-bnl4)Zj*O_wf z%Eh+fTed9T386=ApSE=63i$DPd8O4BvHJ(*k}=C#6WbGGf+ev|1zI97_h9`~S&LGE@a zGTh@x{>5WkFGdYrV(NUtLtbp(gm5CwEdf)yLwui>C0QWW!l!Y!)&WoPlZ-eEli>F1 zD#<$sKl;zmPSJVxQVWe_=^a_jZLhBlUpidL7p!GRt@+WvDK^&3^_iqg&gm|Woa)81|2G={gRMkEf;I6 zWNgrKV5kb{c&p8(Y)Q{(xn}Iv%W3 zxwnYCy(u>jo%Uq<23#y%X70H&~0(79`Js+EhcbUE`Q= zQrrdu7a6h#d@UE%DJk`~9USX?+;XSku-5pXTPxeywPRIa=w3`(;NoyEOmX5*X7;x` z9o`ciVRqt~ong@neYAC3qTjs)v9?*InDV6~b`he_;C1$lIfm@VSa{! z$JeynvMzr#70Bk+U%WZ#oNH3v+*(l_o7Jbo41pvF`?<_&X0iS-ZQa>D##=sR%e-kZ z4eL34bTdx8RqP(^D_<#h?0UbMJwW!|&gclv@uutRY5GE(SZuli;LM{&nJ^t55og-; zsA28NE0;{`XZrp4vI7>AcfAq98EmVaz)kBv1*1el2kCqluWHn~fk}tU=i;+-V%LzE zJq+rZ{z{_(glAbgZx8Swe%fbQo2DV^wt|j4p&ry-7X&AfSbH+)-xqTuQ#MzjSxa3 ztL4BjqX_oHj%{$Q(E$Umf5<753aba3)wX7nm}3T*o|))bZx%gKCJI)vse1|vN1jUS zVZV4P%NCcXWgZbPJb%@{qae9xJ(mI3xD=f#DbkusxI*r(;}PLC8SAEBY)adHb-GG0 za52{Hf=AMoSFMxyo+}Qn`O=gs24;b-S{kK?9yd5IJ{z_*4Z_kLO+u`DigMX2KT`kx z9xf`gq$yD_alcBP?WXuVd;MD~oR-O_rN4}4gwRUd$vC-)Uy>1YRX+3rxvtN$$|9} zvbyM9aA_?X1Yz%m7NO(FX-S;A zzGh8C;vQVrcOr?j(Tt(4i#!(fjNfrA0}RPv+rZgy{~jX|Z*hkkOkf>%WYJZSd@*NW za&h0{p_jZyFLcy<&TmJG-(aV>Y?6y#XRv+C#-5pS)zdPmO}Lz- z{W1spPWkl(%d>AiF!tne>z(!w{9PT#FxLceW@aHeoB8A|#Tt~JBZ@qgjHCRsn?q;F zjLsfoGdhqfmu@G{R68pAF1DdjR9E{+b<9|k_uIfO7rnFk?|9tYztmgcT=p%#QD;h< z(^17l_Z{D>Q5QQa5>qFoT$etdntF7z64SAE{g0-dAM1HPcY2JK6$=yxZdf|5e)C|| z5V=QhT(iGuP{au>dLHBNrFga^WM9^* z)y<Mj7D6j86=Nt#0rHW8i*P7TzRLq<+d zw8^}51ZxWoIwU{sTNJIm_SM$kohdz1-^i8ZXS*m>!TuuRraANy1gY=2dP)a-FB>H~Is3?E91(oshp+Ua0(!+M`j{lYkN_gtCv z`ux4@Z=UMcnKravst-GwvV)$0I02g>jE|UdV?GCPnmRXr< zqm%a{OOpB(Eeb2HQy59rO|`l=-}gV+nA_K%R`dYuEqiCB-m>d-l-Z-bsZaWjowsi; z+l3rjaWzM}#E)0>#nEH zW7DN5n{64n$k>+tr|0da@9mU&ck{I2)Y|LP%Oe-~Tjc=Oc+Q!RDb9^EEO3HX(V(vXfXWMN|zh4fNJd+YXL>S|2aUIy|q@`*CZO>61Zorn3_|m`=kb zvyhrxKCUi7y=RB^?6N<2$t|!8KfNu&E#J-W+)Uo*vb~QyE-F27Jb#P9^2O!ShvTsx z7nx=fpUL@*$7C0wkJyCdgx_CR8FkH~jKc_9T`V@$Gqo0zR9=s~YAF&x6TU&4DMgBB z>-&urCC;Oa)fAgMSiwe_TrGRvQt z+PVo3(%AaEsn=uy`^b?g0y|0VT^yJd9pjUnB5^Pc(UjzMGn zaX)i+TeY9FCClHE+efZYiG z9r}Z(YPy10<<;J#LKNHkHgJTtj*E?qk%H!jVk=baT(}*J#`5#jPH$m*^VD2xiz9{F(LTjm zoT}Dt`Ogt+?Lyxj^~&WHzWkE&<^HDJtx&4Ht(rRzW#Tj+nP}ia(qKC5;-H{%+uXt6 zD{L|+GdH{}q(2o^aZFs7F_?aSNOtInLvGEMYS{@@YI@FHIauY48l5${4?I(=5br~S zpb~j@r$ics1ZEp5DB=W7z~051CnSckIOTv2_IRt~FM`zDnChM8v_>!MXYFKqF8eW| zS<7)OMO5`oYm~c~ zO15R+(iC1B%#|yj82_j(BXod!RBRKCREO^f_s3As@W2zV)VMX7r)LK*lzKY2c!;rF z%=2-%7E%+#n~^%}@J9MTy0jGCgQqiS<{aKc*3^iwcQG%m6*<;)tralZ!kRkGZLpYM z>R+7F@0B3>aR2dniMNA(C2KD;U!h9tv56ddTY`|~ob9uC**_Vz-D#nG+Y}uQZnwoX z@^w6nyd9n4th5J(SVr@Az5)BSQ!gGM7B4C9dVh&qG3E0N{k%O6o1VYs zt`mGjQT%D*(o2tR_Y5*#TYn%Gy2V7*At#%6R)2HL%OpRn!2L%%CVQVRonsDANcD{i z-RAuv{GAa0(Hq8*hc=F-PG<;mmz z^74%Bn-a?0&owOx$m6c+9vuZaK@#jAZ_1JE%?Lx*>k0;aU|)Y*yRf&B)AgK7vbupw zx1XEt`p|<)LDFvP-ANp4RL_G(Z~TtLqKY@$N9gQkWG0V2|A^LMjki%&-5>o=-e8lB z)JQ8r*xNs@3HI!%Bt^V6=o-5|*dmR8Pj=XZbdBn(cwNN@I)eNO7EHFLTj9ETHp5Er z-lMa_asoIxAa5!))_UrM0;{g#n(CXh6>gJB%^wHW=TI?-tKN(~5Q~bl{HTR8z8flS z$<`|xTugBkU9T9jC+6jL-Ky=KW4U@;)yG~ou(=iDl_8xM zPq0?(;Ml{C0Ze$!4%0^Ibyt&a?!q4)z0Xn6r(eR-m!&qbUM&EBD#G+dl`g{*RSpW* zwdVFp2?t3^NL`s{Qy#L0C*=X-y4~`a*8swplt#9wrl(ZY+u!Un*qwI8w`}EWtE=j2 zmZ9jZ`Rs$vVQKc-Jk9E-w0kgRt^eR#t??$SLCmw>jh?}kJv(f&-E6%SqNW?JKbfO4 zsf^voeMK;o4I^bftobVRNUY8P%5RY)Z}*6n?w0U3&-4qnmbTaS2$~LyB+aIe+Hb0T z>OjAREu63Nl7>Eb4pTXoBC}|FB-l5XwU2X*sVs(6DC04Yfm)sKn!ti1B!W-K4X4;z zU#Zf=?ise_R<_>fiE`a8N^jPS{Yg=`nQy9h8Csa(WF}0K-n&0^6@DkRUf^+^hWkbv zw?`+Q3>)1PYu^P*T0v*islHs{6WvvsIGqWu2D8A7@@x z$5#2_Cjukq2FrOd6iM%sAG(S^BH2%3NFmQSEA*H(M$CD1+}Jf=gh8dIh2~tzbj@w> z=q)*wUa7m&u`FIb7R+O^3;s1Zp1fct_o49^q>j;^z+F*YKk74R37%PR?aw)W^@K-2 zc+&23@rRr)$dviMtjx&t)K};ajCH+O!N=V}CNJ4I&-d!18`I4}_fh028@K!uPco{z zHA<**as-ka{reKrGvvf7TgB32oCY0bwv3}~LgcDt9euBAWSu0DWxA!<)2U0!cC9%| zx+8we<464S?}YXoSd5=OtbQ|lT5>=osWA|1(!Co#cuf~pI2laRM~36UrsXLZi$0(A zmhEsfr^@A!voln&zF0X}t2LgytA9;yQ^NXqDz&AofzkCR76lK;&)0^%%W{>Gy&V^b z<-QS1GJ02d7Ox`UCQ(XW;<-)qefG&~X1AWztW9ijP|cTO@r=Xd^6@6Ssg4-s`K)a?cU{Tmww*VhTy%F1m|vT^`{}C`xvZSjdj$^W?A*~65-n866?9O) zCzaSN|QKH@Z00n zNex!HFo6js%qS{(TYrmGs>P68v9g`Uy;oF$l8AZv{+SNF^!?-E&(6QSb52i0$&km< z*LlQwQ|&A--x;fr5EJEh#}qvq%+-Q|u-v5V*gTzq$33_+NfdD#3lViG_+r-%M({ja z!=mdthb7|ugK{wsO}xtz`T2DH$TOGJp5+W|7VKS9;`$uzCLd|iz3r6qPUAr;H|d@V zP_I7zW^Q-(3G1uKqcrLLkBho}nRpj3&|z=w7eUV|w2QQx6NNe5KOmRWmFghb6cf?a zcupv?=~CFK!YmyX+ZoIir+~Jld$L-Ex^Y&=)#YfnJda^=Q@)`lwB!t)P{#z5+zHU6 z&6gS3qs@@BPI#i0f&S@&pHw{4ofil%FCX+1R`B%SVLI}_wmn;3zI!eisbZ=WwFc}d z(_=5T3{TX3AT4Pg1ka3;F1LqaLS$+)t}Fy$O+KHt?W(=0?&@$tE6T5sC;Hk)-q}+R zD8)v^CWd`|K04StYZ+}uGOpz!O)@(6p=;>Kx?{27n4m(SY`a?clNB4d%6g?)^ zJr^7>7^s|4R>e(st_OdL!uRUFOUAlDUKOPZIwwxh5}f+!3UrXv=#_arm@%~D>xO2f>js}JY2TEqc6Ow2nJ}SeJ-Tf%)BmtqRo54dhQjlQ zs#qrdV)^3e(0jq*h8Zbg0d6o-CR++z763c7#j{xP64z#)E6#Z*k>Yp74fm=9wCd!q z(cTolU+C&u%^mUkkFN>6WN>WEcH(X3md|VQLmle5A70#9|D@|O6O*(1T(snt77qx){qc>{tt#`U{>=U2;J(9rb1GIUzC>5`9>CqVkm%BEW+Th8^(1uZmtKkh_j!WRK?4qtEu{xq& zw7Z?==rDNx9ztSBmN5PH!dewCOG-JMMYs4pJ9g=JqiQ4MA0K!rzM4D5W~G0-^D6s& z^H{Sqq;jJ$B34`7yx>ex44wc&lYQAe6{GaN}BFns}rR!d*&(= zpN9?HU{$jF%`0!s_RFlaH?h=X@=3Z{yS5!`v^u7ePF75_)xWcdGxPwOtIwzmVo;O>nGU2lh(0OzrY5uV#VjZT|Q?EyL!fdy+ z9(*zseD3naPs2OzMCj-i9}cH5j;m+za=VcG=2`Ei=Z>cSbJ1pL9VmPBIaIB1l7C~q zd1HwwlRnuZxAoDbkwYds?lf`Q&&nENBK1y!5#q+pqQ%`Rk}|XWJ;Gq-e%=+eAwycI zvP}P2b6O?c)oyuAyZS?T*6L6(I1@*YWj9jfxpc7n_LZxR9cnqO_7_rWicf3h(xl8( z@kjM5*Bh(>dyJ_kLyg*-^XKcQ9#L=)pcOGi>JQ=BuV*_D^ke7HhIM5c?#$!Pogd?B z!O@52?AD&=MXL0(PPDA|b>A5TwbzLa(r{%Q+})Q}sIMQ;(A%6UBU%c!JGVw#PzK4s zBSj)(s1j0K{@rx9{cnn0;TcvMdzUwt-q2P}+rF!t@l?&>+5B{R?@h3KR-~-RIhKHt zm>@qiqZ*Vh{h2JxqqTu;au3V7H(J(TNbi9MV{Eo9XKw{D`--b{X=0YtA1Xh~vp*C| z1`Yx8FzikYAC+ieV!FJImemU!^>K1^aiow1OA@fd#`)qv9rxY{GRmb&?=w~!`mfLD z-sv!|4|{f}BdImUF6rt4v4S#BRWO)P7mc`OAG6Z7K*pgMNZe@7TFjk(XFMOCE*C5GTjuU_D!J%mCS zBIO^3a;5fgH>%zcc*+vJ(cV<0ht4ENvA)VK_ zw7fJj-$Fs-|rfZ(d9zs=8eI$KAd|Q<|FaOa)P*Srd&#t&MW0})Hv2U zzFB)(AFhTF*AFE;vI|ev762zJ>a3^?L@sjI8y88AGiMo>0^K&+e=$i}Pm4h5Z1&x@ z1?MnzK-e=rl0!+M)sQx3+9%E!CS9O%xjbeiz7Jg|OB)~CFGf~tUtV{k`iiGuMJySP z$~?eHmZE$ohf3|D;e+Y=PwM9TkqB_K7sHH>Mex{!R2w}&xlY~12Lwq@`tD36K``E= z9b=jbe>nut7l$e`$h6>(CcU?A^NjTKkwk#U&}5%{FZtK)5Pd->aaXzT%kGX#q2_p% zorNGP6SqB0OY{zMRobA}np01w@sefoc-_}jNJJ88VpE(Q^=lFVWx=PMJcY$VBeW$C zUUPscBT8U#-522}@lWz7vE92FW^|R5dq`B)=auFrEYR(ontxTdmZh$?D^23iqBv3x z#mE#H^l8)L?mAXbhN3TRY&kQ;HYb^VHqPO+Kp<2$(6!MnZrrrn{DIgWu(w&#vHxLF z&yGYoM5u@7U|p+M#(AIGv*zYx_KZbuX2%Xv&m2-|@Y`rEKaqki*xq06(<1J7dbHzM zNHWiK+<8#Ge%Z*}xGiaSHoC{(1;@H+ob^O@G0qx2Qa!?n5EiB0hQtY3i()F|HkAh^ zQ!TE=8lp`k+ItjkCQBgJ3+&*-nvb1e1d2-B^6XREWq4Sf$KOf(S=@O#zXwwXG&lqPY_H77c1|w;b=FezsV@`X$PR`io6_#xe?t+w4P)mXmS)dDYr=>j$MCtk z#XjV8343>o!7cMh=DJfCKeHW-c0bm`ICcuW0Pw*qU`#E3Bi&vOpA>1F2r`GS9fXr#L2=ht z2Q`tt%&Rtiu!bDd)E7RbKoOjiP@uqDg^1c~M5Re`NvTQTq~~@ri7?Vkrgp~>H8hFf z;u8*}I7uRHDP13OAG=97g@pIIu?^r|RW0$dSVj{>GQT+4mHOw%k|24pmJcI~BswsTI5(!9-1~Na@&w;XzOLrIvB(9ZP#TR^RMoM}jAjT{FeqsaDQ`T0@n? zpcfZGx%`!l_@)^JlG7J^h6~lVQy6ji`FU#!Aa=A%lFmRjs;;ozv{ z=i)svrG=a&&tON9WaVUR1N%NV4!f6Uxli};cm>pzDrY6_4qqp8XO>0g7M?Maj=Ao! z2%x!+=D1(K-Q(+k2i9&*74Zpetl79m+M=$$<3tkn!Bv^XGW3N z;?H44(Ua%^v~jk96mTs?B4 zbPMHFLix1!B4(ylQ%I}sXqGBw|EQik*?X-ClP>W5a}FS z7i@eq9=xc9IH0PjlCEUr0bi>Jp0W_Yn-zG8iy!;~H&no7);|UCiX16Get>5HrT~QR z07KtB#8+bBJ&c2CkOtC{{!=+bdXN{smL~|%1K1!A18HF%m>0gg_O}7h zQv);s*bMOB0?Z3}Q2!mlfQ}g;bTc#y@P7)B2js>4JJ~QDU;@BZ-w_7!{{|p0$a7WM zARfBfxCQW+GNF4X+`>G;MGL(D2LOp7@9(a8i2onN!Ma$rY~d^BSm@RYyly=9z?Sgp zJaj(--E2X3XMYnQZxfgxaxv#f`)JD;D>MPfY;#Tfga<)Jz6M! zC}1Cu{rK;eIg|xuo&osNyZW%*K=(+{-2vo3k?8@-_7uU@0(7x3=&L|*S3r~v-88NC zDm~!+BS2YDX7Y~-FbrQYpDKE0@EMMrVf!Kaw`d_mDmJ0=CLA)rGz ze$Ypr@OnDYP0kA0p#A;La)z>?%wKju_)7f9JwyByI*Q=ZX(HSAt8C~B5tahUD-SeK8eae-s#FVczQ#xKXo)p&lF z4f^xfdR%G#Kv~dT8tena{`LbO!Z`VDj9ztK_<{a=kSKd3^cZ36AiBPRb2FSj#vWWF zxC8s1VdV{BUic>Wm-FDtEPsWd4A{p;!j1!XDOU(?NMOA}nKL!%zba$cp1#k6-(>%C z-v3M5$~)L^p_@-wmvG*IZD|hk=2tRjLGBgv{x`XQv~yNU{VN39Ey4a->1OONg0HsI zEfDdOo%2oh|GHfV$2um#{GK)7Cj2=8GWOoKF#_8Uy(GYL zfd46gyugO)p8?P*0fcq=p9aWN>314{bojrU|I>n(@q@fqEe8z=751adXoISEo=GboT{aqC)q0&}A2#*Wo$|u7{yZ zyMF*s)@~>rT;YF*eRWlstpzstUBj>Id9cqg-}R2LHiE9p;o5T!xELG`JBA;LI`dC; zfHI-%%>X+9{sfRe!3`i>bAfVz?rvfE!*$Dm*B)S>UnIEGo$sn6ti?y7jQ@^nK%$%u za06w-@p9F14Z3L@Pjv)qfLh?*u#r&j(1wHM4_&+tg7yArtl2jm>c6%H;C}3H0+b15 zr~Qf^${kO40sOlO@`i3`0=J8Q)ibuKvL$w!Zr7B#BoBugRY@R6D+{~$6nx$xnPCPupEX0)xciZC4$S) z6^XwN{C1rVvk}T5{sN(&6I}O$eJ&^iy6=Z;WFo-wfG+k&?i%9ZUJ%i}Ju&?kS1A9N z{qIK^1Ra38$KhK?{-^_Vbw2*kj^GaZM?TBKP_`w&zbbNB;%c|h z-Q(DOYy1eu zz|A)NOvW#u1H?nwzny=6kr$LJD2F5){3vko3EkW-2f|(pa8Ej(?n>AjUY@q>o-qG> zn*)D2|1P8d>6TCzNtX%xva_!<2=fA*hoP%Z=pq$NrCZ#w+e{`#Fla6c5z70{hLVT=NE;BWS> zezL!ydu)@Y1dl@?+`ztp0@y#`1N#UJ7zBb6jQ|ch!PWsp#J>b$el*~P z0X!jZCwgA-2i!|N3a}dB0>FO@FfZf* zc~Sivtw285ufqXO1N=_`;O-tgXNE5Ip=}P=DDV?vL%|1uEw4{FTktDBzln#kzmHGg9*$Rw zzoLid7~u2f@pLzW+j#hV44x5zpRa-IW_V@-+gt|LH;2J~iY}@(lW2F?M` zf29kw8R4f4M&r+eeY_6Bvv>G;I9Nvmp3?Y1u$G3OVS;q<+{M>@H|;;JyH=40bs)}1 za9m#%2)6vgt6!gUgLO5bZoo5YxXzxgOu&yso8SlBcM+b=e%I-yHVEHbmEUh7p$>4q zbNdYqVNC-+DFpX`;Jzn3`vE^KLF`X(FJdg&8b5&grW4qkgKGhJhT&fT)CJDPzXZZ( zlfc;`f<8bFtPgk&W_dq?dlf5m0(JKv!1Y$$z?sHWS3(0{kok zeEvP?qd+(}MR*Pmbb{xm;8~v^0qO*wU&H+t_=&c^asGtJ0_yVH`XUm-Pf)^7$o-`g zmhc&{<)1tu(!wjOXSm)b=mbB3^7ALnmXj0jiS{lr{M+jaomTm@$d8!`I)P8N4TE_E zuKWK6bO4&)_V*uoeAmfa{#$#R`;lZt7@o<4Ysk<7Wt;TwJ}J;Aa`(Sx)$Aq2B;uKK(Yw|JL644G+R6 z3t>48-_QbQ8Xx|2HU;Vo=NI^i9(X?O7x3NQ_&fI4FL->9CYIAMc(zCQyel~S1?>W8 zf55YO@NFXNeCwu;zPXA}tJ5V18 zK>z%p%Y5p?=LvtC}N)BlIAQ#O~Liz|M&f<1(N-qjh zl_H`vO;9Ncil`I;0hJ<36)DmZK*2&21f+vfqz4cP5R(6HPVRr_&pWxh@BPYtKAZRQ z-tO$o?C$LD%-X<%BIhw5(>xvDGxHq@!hfEWxS zG!jA_RvTbim_2Re;2mtQKW%T& z?;rZjL0=xqngZw)zLrK&^u$mn@ecwl+x8FI9GpLP{26S>Bj{HK^?XoQJsPYA^wnCF zJt9z-HFo^~MK=NG*T41k`7@Y5cn5L#oxK74hdviStykz@GMQ*k!3p}|L7x_A=ZCsC zXzPc(91GP1Yq-N;uTIWC!4cx}t3Lv`mj&?)h<_NMFAmh(OvG4G_NPIeEY$r&y$$qz zf<7Qnzdipx{}=r~;Ol(t-^LN*BD+%0;2w@Ue;8n0!98^25k|l0CxIUs<@2Xdmj(PZ zpiKhqErK=x*ajdkDRv6De-Q5d0{Q<&2!{B9d{EZ?>82&PR-1Zqfzs~aCs^Sp>!E)a zY=7{R!thhbBmN2$pE`)!3Xagn4*Ix3zsSE4AWjgsBOw0iSPyL^c%X}iHY6C}=XD`& zUxAJg_E+c&2<=SJ2Xr*#0EK@P9NQ`>eE%cgGzzdk{((3_+~EA@PXn}b;ep->+Dc$u z!F_XMVLFt4v62x!hx>oN$8qKT-@LBO-~Kc^WxpzDUvLi_4A2h>+Ek!j?6=`xz!4Vk z>9=M4=>C__Z(Eb6!RNhUy+L2v5wr|>0{D}C@5lTf#u4K7r)>}73;P5<75H_D;|N-g;z#^_MreP8@{i(A z4tz-Am<`*m1D z5VxQ9kKdO2dmI5D0nR@Qzr_*S#o(B|$^dcuy^vT%#^2%yKkxkqpH%-HBnplVc@#fg z%0BOfpHAaoeu&#o<@4_f`t}Fn29Qv7lFPDB)#y8x4I==lu zUh*=unPmBs$F8YUa9s_K^Gz>+4c&c%)jud}pU>{l< z>7vYK;kf{K;NOi0vK{V4`bqfR{Qescf4V;U2~5gsX#0e=8p@umP%SWK10QHmpOX)q zDSUq`nEfARy*R9FOf%mTltndjFi`?lbo6*$KHWPJO> z_2oDG{?hvVPf(=1g1Epv_&>qvw_sqs{^9!k8;%?x&HqaM2E-2rfZzXG{m?HMQgDQP zg#2FBKnc?Qod99OGX7LAw1U(3SCH?2t$uO^SAZiD#BCr#I)6Ty0*QVSAPfi#!u&`2 z-4z_+6~Lka@qe9u{I@uM!;=c&3HuMU8LX^N|26vp8INElL;m0p)RZf{2NBp+5NHsA zodtmc5!hW20w6*=3^RzmAVTBw$`uFhp~49RBCNFUui(*tYrufgeuM`OJcoGpg7{nf zSLj-ybA|2|K0uyO;tHR>@eSITq(HO=@mD*O2>A0K4xlYSo1!9!t{^6XSPLSYr$8CA zvW|rJ@ELpu)4;Sa&tI}F{-;m}<-&Q>RuDZvECq1{#6R303f_GmU|N_5=7lgItY7t- z|0z7bhXcxheNY0#a1deN`%8;vkp4#j!ho}IS8$rAXA}s6Q3J^9dW8?R{ z`@8=EEI5uRfrtYU*89I5U>UG1Smr+(XFz^9wpfDrZ}J>~|6zb-!m?@p4(~xeS`g2I zI0fSWRDfke9BBUv4In+_JIn{y;{VeD;s9}3bv=NzRv`XQ@*Ncay8v;qT1_2*bjl$9 zrS?u)4}o(hpszjjt%qxL=xhEL)%|BGA&&m=)ymChF0omS37g+9s9x0m7{3H<*T z`GJ(DPCJTYv5!4N&-LfH+G2whq95I4=nQX-<#;`gHzcvjpuV z#uDJ2N;%)Rrq-S2-Nq_Ag;g8Gr&DuQ>}{k&=yCrT>{*H z*>?~07(l-V^*>+B?on(bGex&3bpW5kwhzxTfqOLIxh51Ez?ruHFhE>?-ERo);T-U% zfwC70_!p1gJqmD*rr5EeoPqrp?z0&McFy68lEAhjPB|YG>ZB=h2 z;LMzV7(8Gb0x;HtSh^Zm@Ej(%H;Hl%5s*7Dz-~gk#tAGvJGK3+zb*=NLo0pp1v|6Z)}GXaHxE|EO>N zOEk;_99K2pS)m2a4aUJfVd(z_&qt<=QSfZs6&fx{gFPs}(6*9iR`Vg z+|Tv*X@I!@Wd^{$JDnQ@#!}!{^g9{|z!xcla{e6L+xbTUwnK|4PGcSP!5c|M(oCKLQJJhcf7Ih5tgsD)vDBwxC~W_;x1JDs1Dw%?|HZ z^pW2`U-kdr(GZ9NeH!%1zraTd4S?>+L`Tr?ga2?Y{s#!H=u%fTfA|9!lrm@Xu2cE~ zoD0FT;$fd&ZGhhofWC2*J%vBF5wCz}obGR{J8y>q3&b$96 zmwuG?`)8Cfr1&nS4&WSXm0@N6w(9xw&)`BDz82l4*x`TK>-vjq{aHS^#(^>w&dcZD z7yK;w%KK7qL;11}xUOpbvXb%7uD_!J)CHU?|Ew)he8|9f4sH2=p$}8mFW=TMt6o3; z8SX3ZexU)hC2)p6JWGG>4LA$)Px=F#7s9pAD$W61DdPL}kOr_$fa_l9PXTd; z^9%Uh2zbs5MRtOH@o-=7DgxyF@AN0%@c&Ett5uXkNdjqr{vdFk0Q>Yf&~HIsJ=k6# z-cUyb*UU>JJ*xo;=Q|fc{4e^eZ!~a%cUTbrqXD*kc(w)n9?fKe19=jj`w8|5z%z0w z=L7%ozU}Yvz=8)q)E`3pVF2&{vi|n_LjLGKl#@_*2hS6LK2OkJ=P&4Zf2zOzg#ro< zRse_px)}T;#Qy!~5SLZy&%f2d|7rWhHyZxW+K+zIj$l1lg7}y08ULZ?1j~eFui9?3 zg7;Jaw|KvR= zgBnEWa{=eAa2^Zi;>#eeHo&wn56lZ;Kv@5}|HhAa0Lo|JZ+q44j835jYqL!24d{e*~{M;Ex2a5NYrO{f(gG74$!Xj#tnh2|8Y_ zT%n&5binF`SKz>egIB=Ol`97R2eX#%uki8zWWd0}e}ESbKK~8=z3@MvYlY4gx>v3% zd|BZWU>SvPzw)v78(%>N3ZFp&$oFgdhc%e!dFVlErbC+Q1_%V~K2(Uc(Bt5%*M~&} z!dUr``o5!H?c-e+;>-sw&XMacrku9Q@X1xbqe^w;#^V$oMhOfb?j!q_UDwK)=BuyW zQI@ziz6I6kMs1#bLwY?@Cr?*4<;w7}hn(y5TeUhaq;_IabvsQDnWfzKNRag?waU7- z_O(*ay{`MCz7yveg;*V1+G(ViqSxuriBa=)D2q{NsIoPfd&%7($gUH~_ZDH$3tw}# zL;0C1szLEneII%PxyN6(LwS$CCyvLuR9b9kv6L-5hr4x6@CRAvaa-%XQm(Ppr-`_P zbvkR5Tk|5fGM~n|(zYO;Vj?<}k8|1VvEbZpko5r(O!L~*8Bcu?nXTPd-&b8nFdCmt zr}N_Wa)0?bxguf54e1t7f1x}rCX6PBv9pS`hBdSGJPTT)N+2+*aTfW`{}fJEnB>>Y zb?1UboMvYla>KUpynLiF)tJ(!9L|PMMfrQ)Gbpc9R`@jaT-vU|^MsK5Lt0haO#z#U zuW^Tf@XDhcMPGGSgu=AGYzztn5n>+oD&uOb}jLYGOKDPNWD zVR1`y_XmV#y0LRAl>p7*R|)lcg_(y&OxL5kaAYbY9vg*13C$#9Cxpm!dY(8zZ7KD0 zR(ESenfejh!Zn4P3hTIO0pAWQTL6Fipo*cp9F;w>_a!g=QyQ zdiVD_@hOO$00lnCZmFwaUJj#fvS<}%-RJBdf?>EJ{nUa}I8ToWL-W?OSO9NA+)a8u z>Z5+rdTk*U!C!jtNb4)jagh0#eTFdp6qyg`e6p=(GGU$H zI^+H#{&1e@oo;*G?zODb%mc5kn>d^KdtmAxlr9PF^Pwi}b<2@XsrHm+b#+1{oeogK zUrfPAkAZA^8rPX4%oCN^v|a%2ze&%#GsQV~k#@X?)7??_k}#gyMkjUjq=+SW`JTR< z?A@!J*yX7rG#x3?8-$zxuvRnY1LE~ndJkd(by@IbE0MQFm`OxWD-ZHsFb{(J4(I^n z$K6>7S@Tw5p#x?NehlQteft1ya)4#y#?EYng1%)QsU85*AfJPPt&ZZcIhz?0?r?-! z&@88=jDaAL{nArh$Ut6?+DfXb^Hb4=YwP6^RG7T;>qz^AtBW%as8e~c;YDp~nlc$! z=9NLWH*0CX*U}#1UwwoS@}cOne|1J4rTk;K8y#9xl&&r048R88wbSdhbRIttP<%;?31G|gtR@aCsn@V78nhds=49H$Kx1e7UOMu&OlOwx7!MBoA)6Z0)&NaU2l~W=#?E@x zR{g1X&TzrF%UDhPIm!zf!NK&rT+sU1AbFmjeR|DpYPN${3m*_Kqx0t2iTH$(qKzzR zO1$`3%u{ntp@AdR8`N6b58=Z6Whr?kWrznZ#{vwJ!5i6@_D7f=#EdzBW{}NF@U^M2 z0yNv<)}7Lx3pVe$jG@179qi}Y4~aP z+J<_+@!Tx4_Xa{eE^m&pSDKw9#LB!x9mcV@Sfm2vIMUL7oTzqj?*G#_nt&Q>i%CHUrMSIqxdLh{Nns}~|A%##-#?-i z6iUx?bRO69??H-#?#+_+aAWURmUH8k>VoBOj#=M%oWRJgA-AR%16qFJ zhFu--`ORf|LLn6Sn`aL)slKK!m@M763kTn@ObNQ(mbS|q-9K`T2eZM%d7joq)qWu) z__VXA+hys&b*%v(7&4G+ujS3r^zs9?2tB$-*J(&dzq{cva;<;f+zg?TlmVIm%eCy| zz3mnDDKt8U2;{RCF?{_Dsu~s{?IBINNOLxmA?=tGg6d?(8QM%l_Yh=cbP>z0TCS#{ zqFbg(w1SA1_F)35&~#W*$lxBG|2(%%%L|F5mdD7)GS1@?I9(i7YhG~hhhR?s&o`tc z!K+9I7HbZGG2Mg)sAL0O2FwyeLXLr`6XMBBQ(qA`r9CZ1>LP2K{5u#D@(k91$2e18 zA-sKJEksK`or&PlCu_7li8gV6OM5Qfb)e%5#A;8&T5}7+SOh&N8Iw0>2&8k;sHwX8 zh$bsRw@=piEy$qL(k@Ab+OM=tUEN#?7e=4(%79iLaVopz(wbd8o_s<=6$=6Nw%fva zFsz^#()u;QXVa0c8~4U0)9{o@0LGc&utk|_>goq)&)9?>q`nTIYSN=w!j1LW^hI=$ z><^@#C*e6+u9cyi&#Ai0QAzn%d}6HyHS_WvmfNOmpeT5&A+^-aiaFMdIgl(>55fmJJw7;n;TA)}$==ujl=tH-c{jLp5!a}SUHWGrR2W46V)NfF^ z@CL-{nBTZL&%u($VbW`BQ!|^%aE(+ds|s)6Lzo|V zeYxmp0TTkx)_XBCWCII}eRoj88qYKd0AYN{-^09hGmw_|4PRd^GQ3cXNYC4XXf;T! z4GRuFy@k1?hs)#2=>CeMMod6vyY})YHpA*?-KK(53YFF?ln~kJ*#wHTr$$o`z5vo( zUC2??Em7Jo0%X$Xtn6)RrzM_11JM{9dWzre%w}09OA9#!F2JEUAvjoP3_+}U>@D8| zAfTAy#*5a2o^T_Vq3uYMlMg6xZf&o^IcF;tmTkHlcU5tDq>k>tY>*2v*^8Ij^Vv#W z{cZ00k3C$u6`q^-J$|zdu!N_O2NrhMb&s3pW<#gLx(Wy!GiKR>6A+nGfV!0OAucAC zD!V0qJ+TfpD+9wisVeh{qF|>dX|y;XjqrkCuD21$mTjdtWL5Mj(DNc=906N0aB4Uq z*oicCeKs09g$}!0Xv%+RxU zTO<(tYucf(74m$*`>~#D=Hcl6?JT39&{(PoH8Ya>Nc$jZQ&#$$oFazfXX>&aY|*Pv ze1MkHAm0+TQ8~MyyqiIR`3;STvL?5K7OyEU+j9kz^Y%WpgKq34XFTutn4>(+bgB5QPIpQmAOo&8!Vz&}1PH*n?jm-Xa@ z*v3GUJD0gD5}Lz%arbX;$~O~soTZxWJ!(^P4CFnK4)dNSJ|L&TF?%}WWAx|gr6q4d z1ml%^_{=$tC+EIkjdizGc3jYMubE)dacuVS=gCK+w_Ah0aGj%ow%4bZrqwf8(>vbk z{^x@E*_r-Plj#>FO{NFUW(7p*aeI}Lyz4EQ+7Ia$XDU|3^%n)7e3gQ1upp^_a(-2` z2~}Jiw8h9S$9rBtDLH*HOF^sr6R4Wz*!o$(PpQI*cMGC{zU=3?dvAHbNy}R9L`x> zKkCAi{hBKm%r|VVO}J87gNfI!YS52m$~bsEi1SQc=^wdnc$41ixX7PVcld%<2IcOa zX%I`1tA1q3-Sny|+QWiVI`Xvw=%rWueIJ=W3dZT`&CP@;EpgQxoHvrcfAt05HRFph za*AAg&*{r9)ilwUbLHY5R7EdYaLUAJlJ*!o-@!e?#luGMe&8(rzFE~#kW1V)LIqpJo_yA}QtgvuHR1I=>o+l-X?zv!%a+50 z#&ks46Z$f`7}X{ACTaS9vN!ElpD3s>Ev6>Lqw`9HSiTZRHjzCm?e_SZ8_DF@QVkxS z!|U|#9nn(AsKuvU$REKcdW}?~czfkr147wfB_vHg#B*LtqO;uesV8gX`T+v9&KYTW z77}8#SbV7GL*))LeIFy*8`M9P>D zW>uDz=SFUg8YIbuOyx?j3Qh5z%(%Z!nfW+4XR3XV%n!Tyc$7v9%RQ90-4hlWQA`X71rJbakM>NfHI%+5IOWTeGCTz#l?o!$%2 zZqUA?5Mk8sOVoli`K}uh6cu>}Jw-mAI(WHsP}F4Cj$?D5uz42V-Ct^EeC#8QT8F$I z$!c3Mb_b^1?Q5!5n91M9vo84BrtC23LC2^A>JN~G>vqA>=TnFe!FOF4pIBwLQpzsd z)`J`C8Ryzh3{)xWWpaILYc@H4y5@wiPw|zTc9onxO4pN=`WM@+|CBfj<4zLQN zb~$TuCHOSU03O|OG^}!?f*Ud3G39v?x6~L9CdiWK(*vU*uUy%oMe(+}lC(p6FPJkN znnk#~mq-uV8R<==gB~b`4N4ULl}m@6!9Mw`SL{n1uquo;s?~=MqbskW*jJU71b!yK1@V@}-iS zJ>@@-^1Sw#X;LGOzuFflbXK!xn|ACjKgIhj8`uQotB7x3u_?i!m5I;x7&H1l}*0doQY2F8CIyEzHrE+ zs$7~^D^1VY-y&4{LATwz1I~oqU|xUtfG9DlM7%t}UN`dvo^F@zz8JLkq{zly%85g+ zl1x+mZ-aO0+?uMv)mP~U>;YoyK2^!(n?w$GG5Wp)9pl3m?KQ)mXFV5(w$K$W++$oY zCls&Q6T?Pax|WfYw@GlM2*Y{yVwHou8x|@4Hl=AEz zdM#$!*e6-s{vqmfyT+0Qc8yHV`QDimdrvr^ZnU(&!99J9+~6)m--pVr{EQ`K-Y~iI zsk9->+_`w#+{>4l*QcUOtXEWd?}gKBN)AS<9|HE!Zx~#Qvj?m2T`U3k9>MuD1@aUz( zj%8=}?-*XJC1o%&mg~7p_T|m?@gwHnSDJpbr@KL=-f2fXg3;ZFI$|u0NH_pwWYN~E z?EG!e`)6>eOqWKtiwSAnujk@Jo7IO^=6G3PRt z(>YUe5P7oKBY=@frvc?|Pvt>GhJooj}X#QoG3MFHe+h* z40&AC<(-!5`5;lpK8D6kC4zCn;jI_U;xDOb&{X51=uLQn1vL%2GTL(o=1MWe&}7(zmnsd14P!xK9c`>&$RcweP$OBhg!7 zcEGqyOIMXK?)dALC-f(2df8NWX`37vxmAJPyXm=LZReYE$+do8n?pyVwzFw}ws$^u zEDyPLlc}4F@no=O=@CL})P+e7;#Qoj>l0+~HIJtkrS$Uv@w6#H^Ou4@FbANQ+ngkrOT}loYF{|q^nTOWO$=vCzd2TCTiuC(^o;9HHxUjKR!MK!NmSYAQmtE$ zWsSUjFPrFyiGFO_ay%JI1BCrhq22Po{qSQC}D^mU9{M6EmyDt<+{9^MA}?c`bi)K9~KlK zd-)8a`^$&5s-ZQn>U*CZYe#$;u}Y%aca?12(kL%Aw~3t3PMXSbJD$yeY@OfuUR>+$ z(YxiR6cGUzgSWi6G%MtOY#i|S3->f9L07I5rPC)MnQ=oZO|;MusW|IEBWQQ{Nxu$8 z>mcY%F&0>#@Lf;N6YM=A}AK)KJuk{SzksF$(ny*bZlWJB+te%$l+qeC<(YMp{ zn*1xxv8LgLk9`PH*{@uqE3oIE%hPor813ZOY)}j0c=keMfGAQbuy#(4KAh*sEMC$* zM*zUmwaL~%-hF;YT}aqJp;mNTDsorb><*4=S5zyoFGFMl(Bp@E%WooVpR)*NYSj(i zz68qR!@bY6O4j_aMtUp@&xxpKI3K(hs6h+&6y17%U`JkrGD`-DliTQ+(bAQ`##G@iAahjf=SZ{s8)EMxNt2LfGr* zCl_DqOL&2I+OZ#eb7$& zcT(@^u&T<*QT#}onD>5m$6fkk1)#@FtREX&Ja$d}P_yfBY{A#<#8XtfK36&(Pl}e{ z!gwNalz;fRCO#XKselM7z9cVnWP>_ko;f1F zORvugyBKI~Xys-!%ojt>;t1k==4<{c6tRh34kpZ8!$P_jcPjg8Y!(o99Wze@sg@U; zIy~2^-f*a@pK#}BLO2ktMl3h>gee)tc3b?gDHO1I3vo zUdSdKK+~gQ%tITb^Di!E^!ED(triR@;&7jLY&Lnh-(s^1?yvD zuQ($N4n;R*ieuz$d#+8a-}U~&QnnE3rlv0acB1SHWwm>sNSPH@fhwf-4GK6}jGeAl z?{HIDq!)pE?}Qas*m1J91xPv5(rDDbM+t$nH(e;gI3k}sFpRpG?xAUU}Xt|}Cjr8Om7-wcR*zl+r1A3J^m6_aB$d+KcDgU%LotLu7z z<5W<8-i)Lx8Zvr!MTPqCj!@ZNUmTx5k+{#*g4_O6`|8D%@ziq`3$(V_}M z6ok$RRGU%b*SAK5Tpj38Jm;}&Q+^eNvt}un@3ObNu1!j-oHg6bGSmNdC$G=t`{Y(U zT9?;jbFUW@ZeQlpjq554T)zzJ=^aOx_hdhayPut-Pk3icn$~ec#a7OBZys1YrR7#t zGkpXM(HY3dqD)f}hkc-h?zg)fq6qj5222x66M->2+M_+&E8ou7`D5e$6j%Fn7R)P* zm{4-c8a|TLR0Focs>A>95==y^T1hr&s#r^Yu<7&q z8WFG_mSF3aJN(J@gN_lkpy!rQeEnzFCEgGKf4om}pm;F+Qui0exrT%j8aqFDTHbGy z=x9c0>N3a@bG_d=aJm2_tD0PG7e=RrTscf0Y|99|c;N#ceIFRJW`%3;^FgEn@;prB z%zKtNb~FAhRzLh^yDlBM^}!UZ3A(X?BCT+(0B%yR>q2fvC}{^Vnag5%ciBZ7X4lg- zxn*1Q6dv;$us>JiUf-c>MD}#Z+Fyk|)xm{Vf>6ejtUjM1OJ6kn0a{Io#;vr?(n4Kc#GvW9%pR#R>3c=S8oaoO)fzpH% zg2=wQob?$zOOJa_*F7uSQeV}r{9^k!yx(8j9~bM2omAd6j?R_PR-pvwZ9)RV`!Rz%&zS^ot)Zlqr zQIxqUc4_ABGZX9K^^WIb9^{};xNjcy&(J^&BAr-770d%rr`u+-0QpCSi5er^+3DkT zO(?mkPngJql|ABT&Mt4%l#}~xuafOa4bLWVd#(lVozFD$vpB^Q!TAu``V9b?Y5mW#TSn*LmI< z58XqRNUJJT>q#)Po*GL6EuP(u5O%lLOyO&Po1FFT8EdBHcaMS1wxn=98YAiffJqzm zp&H+ZH13Rf^Z?D>{Fn(>m-&>HTbI28jpZ{iKX*O|%qxW?==-oVO_txgV~*uubw9F}%ssx2G+TNmvxoj#e#`zrtUML4} zxUNM&Po4vEM3TO*Cr-g{;9|z}FP12ooQ3RUWVBH^Cu`cC0PM>H>=md8Og(>VMM>Ja zR@b1HmCE|mf-Fh+sKVg=1YiC*Ut3w%o+H|%WCvjO_hBcoavoWW{#=gQ)c!KO*tye6 z>)A2tL}0RytFZb67N*Q@i~dX{7X@ldstG(v`1WM8EHX4t0m+y%n}!kcHza7AZzU#I z_4_}k(^2b_-2CkUtv61NnTf3Z`dh9OvMSFJ`uiaT`ULG8u@gwX%%`^&ftZ2+`J#bn z-2VVC&^5{{TT=GklS9Tp0<@u`hH&6|L8H@$ePvN^Uq~cfvNV=|If#61#(uoZY#qb=h5t?TV2uu9F@|B92lY@CoFCLOe zV~5t25##OFTP1B+8xpvjT<524h+yRkz)oru%(~UN?g;@c<5;YR9|`S4m=h?z-(o2V z+Gmj58o_cx3sV=-q^}-r*-sdTlkrh|T1JqyfC=qWAxge4M*1$L%Byb% zpT2B&$@DFm#tWPuzDQk?pF`M2b1%BWYQ#L3?u%Wc0SDGMF+qFMkl@Namla>0KET`R zsG^$Z@HAnqE|4Qn3O(BpDC{GF*b7E#8G+>NR3p1#zHc&ssEQkk;#D zG7skLHsXQ&#=A6M?`%EwW}p|9HECyvEq>)V%Ssv+5mBiua=CEhc-+7YKH{muOa)H? z!!`~Q>tBjT}3rSXNw%XO1itTet7ie zo$x+#3pO{h+uuzI5r9=cy5A6CaNA!eevTy%PBMRkgZ|wTmqHge$Dg)0pD6)@fLVOPc03}M1%x+|DHdi%g7b!W#qXp}L z+Qn*F6W_;tiQwB|J|-C-YkRPmb_~o2^fr+yX=N0$4@3Ya`Cr|uo3!r_|GvJ ziz#}E7&bc_gPP(zB*>5i{2Sh%FR!)ux;}E_;F%kN=H0i`dOIVwUPT*wka~j*ZG4u{ z=+4`6#r1~Ry^%V!hsg^EEiDumzka~$W#*B{cdk^Br!=VAd3UBIZN7)OTX3rNKpKz( z!fhg?EPvqq(!^KKG(sU*hm*>8JmUspqo!ZEd*sT2e8pRDW;$2{Nd*Jmm)P`2IGQb$ z)P;$aJacpon)}bjUL+OQA9gF}cIgS)`fg|k1G%7Vz0|IU)wTUQFRDfAUIhAwooa09 z8~`FCaK4$c@Y8U8rLio=mVBQj+u`u#gg6tcz65-tblyb*xqott(nW!XI}?JMB%UY} zgHFvnqPr+&Kg|97+}wihK9|@#R{^PpP6*r6^%-x@)-yCOOlhWG@8B=|{G5g}en8=C z#d@?&I(ER7CV)(M!Ur3|Exyme2xoC>?stQiwC6FRu|SBX4=584V1zne^w(KVFO2X- zH^wQ*rBu66rQ~fPOx?S4Xpi~m#`6SfIZ+j~nu~u0+HYR~Iom(hDHbDU9xX> zYZNc3da{yKZCF|3E3jM=73h!pEw}NE>mK2wVji&|+S)zCn6uMRaZ1VKQq7;01kM(8 z)gL2lQPEa2=(A#s0_0h*t=py9Cn=w*=Zvu3f%Z8mb$93xVu-Kf@Rdj5Xrn$?Ov-cA zG8l@i*ee8jpHs&WQiZ{!%wtg{vD%Y^m8n%_53Z`)ZSU!x(hJnSHJ%>AT1I`$B=_9- zBLqE>?S142)G-Sc#e6QhEb9*Iv3~3?qQ4dxn?S#Xy+>j9tG1vQ3;LeiB&I`TKW|X~ zK*9as%U8_d)?>lG%w=&WbTK=~LEiDz)i=+2cwK)71P`eK^(|dn{{t2TG84TsE?IEW zINCaFcVCZR<0*n~RbyOW*AU?0BRuE2W-(pl+N=wMUgtgWTlN>oi|rbEo!?-U@D5Ms zpyfRV2#cz)5;@0%+)y|XUhW>Ik`XyS8I>a4AA)Y}>xsTv+MR+I2&=Gqc}>@pT2T4x zh<xHkbn=Q+m75i(npOOh+j zf*=_);6A*Yo}2?5orG+dFg%z&5w(@qZ+N%Imb}G&CUy^wS$cH8xXUcJjc0{ z!QRW9G?i8tj~W5>91f;r+3lY4teN)RuchwRHoZSh<$JS|GX;NnRI+J&F=`g!pI zG()Pd`P88RvN6n)OP?=?*kNuY+~?yGfu6QfYix+iyrktDU%j;d<9x!q@`B7Bo%mj! zds92(Cfr}8vXg9pRYAQ`>tiD#{hY;(tD^%f0hkz-TU{&7@jt+H>FDuqU#ath-H3J3<3_^P@cBB3Uy1jmOfoPH(*|&o6B-JcTyV zQl;2wiI=RC`Dv@F4b{yyVS*Xy(&u)GXGm9@O*eoXqDP0n?s$T101TS`)IQFONjW;( zLbWsQzDW4mIeBHm*+Bc_0a&mMLG1-L%bn?%{nXZ>!!$nTMk0M)9y4EzY7L*t(YxX6 z$_0os?~0djfyKWj{>mQDl-$*Go;sh&tt45Q5xJN0Y|6UAn5_R(GD?Rxs=Nm%j8kt zrSko1^d%d75WkR`16CbRk&k6}DBSEpB(Vk_(j7=0;rF=X-_p}e7gjcyMO0KZ-1Bk0 zY9Fdh=OAc5vcOBSIVSVke2t!?w8+~{YmAFLvOCC`evcC#j74q>O`=P~q)-j&>VEO+ zaR-uZv7Un@BrWSijlVtmM8s>fXiK+36rR!0Ok1GJRg)*Oh6(t|eO@RZCs`O?f097G zE2G)1tvZFKEOv9|xdBO5GuKn42N5H$tv41eg>)#Q(%KrLw~HUQzd#ckxkF*l`(ovs zAy;!ey@L+VrE`Pq?Uzw+1tVcb=SMdY=`@SxMq=gOHa3m|ADgt5-(DDUEUyFS%Xv*k zlf@%2wh#B{;;PrX+7+~I?tHa1@OiJENXsIZJHE#(;cOKb!_Es9_i60U7&)d6%BL{i zi4DO%vD&rcBMU~uk{@+0=84o&_UM=h*-hOeF-tfTwB($El3TO57GVV9ow?DL^5LCl z3FxG>jKHJeFUs6}+=LNoCSIi;L_Ws&2mOvA;kV-loCO@1#^hgu1#Xhq>4>Qg1w?&e z=HbgtZDu~y){Hf$6AGy{MU~ITaCff7@x2Rry)j&6Smdq}n;TxjabqnbN$j9IkcVm9 zW~WLZn+9cEV>|9D=(zBs5Bq819u02uk&t?DZ|FIAsQ!Zj8*tTF|$7 zT8>q*eMRUMgBbL^>&8FZQWQ~4i9 zkSoD7-QZ6APFtec!6i9#jc0_xMHRIOFad}>7?vj9LH?-YxGodvHF)FGAh|&PeH)_1 zlrh^a@a7V43gC%J$Ejk_JKrnm-={?o7f5GZc{`6(cq5ZdbIJ${KoYU3w&o^Ht??UgX7oNxwEZKn#V5KiW~-w)6)j(-SoFSd(nGYqHkeog8FIc<@XHKK%2y45ST<~ z7u$rqeQmK53Cq|aDvw|;%sg%zGR=cI+9;JFzE9@F7ry6Ss)j{8R=c|)Jo^ti0#A{~ z>rbDz$T_Olz**Eb;v(}=t8vHjhQyYGl^-gmUaAOhWKj@ddc(2kh=c!-5W}~9( z8nk{4OC2tUn#hs}vl!aPo8vj%sPzK^d~6(bb^RjZwRlpVd+9jNcJEov@@-%)JtL}u zJ%acmP;)2kif$HY_eJu9F=bOcm|_bf@#Z_zmo3J-jk+C658V5pFc;>i)@Y*@0-WK* z?O73D*Wc*5E0@9)Z=b!9-{MFIA7%pdfmWb21=*J{)AiO7n%tAe%bFXM*v$)TJ`Ntf zvaTM?;G(++rIVXaa}W_%+LV{s;{3kk3`F7R*=7jizdh4IQduj$$LO~}`_ zkO>nuN0wm)vJQ#z+DlUh3 zE!*^ccOX3nB!zTt^#K`vb!gunZgaMVHcoTuhPc4|lxxnDe9uG$y!yG(bd}?QYG{?6SASXny`xvZt`T*#dw+FRQeRQElMNqOtsixJ85xTx$C<43+A6X&MT1$V6X`Qlz6x?AQitJCCOLidb#-2kXw{)ZAr*F9cv?D|ALUUTwWH8aD18& zeA=dB>^QZ)#vZE9bzq{Ao1<9R_Hg;U&K<4+sYm6Zr?Ry;C(yp$!HSBnT-j9_Nb0ui z#~cw8YpCM;BBXR2na*#)@$z0_NCX~c_n&z#dyfhb48^aQ5JWmHt*4ii&dB5D*6Z!i|1 zlwR}I+j)6kX_3;lD0+IU>$BFznFxFk>&*+x*OO#CQfXQd{nPk<-ra{SdCZqJB(-Kz ztCyQEfd-?t?0s);rXyon8U(p9Y+gcl_dDQSHEm~q^9*zHX`PCa;cbUM z?x+o7b~Q+CiO4auCkSG$JG{zdIa%sdRdcV1csyYuAbO1O!7keoZ5ybDcxy z&cXBdEK6rF#f#!s?qy_ES(zn>a=IP7=;dgbttYkLrV-!1xO2<$<2xFbXPee^PJczD zE_bhKiMY0$b=&m%|#TfLBU(*%oFS z+s0){8nn&*uuZI%T%sxtI{OrujrPjmrh3Nv2UD+DjJmZ^Uj%JnwsY}xN>T?e-Gk$m z=#Oeyjx?%H2M=*uII)^De<=_hJRf7(wrR1dn^;)Tb@BW$eDyGYq2Q}eyN97|gU4_% z<595USKEd8r^UO5>3A2GshgGLwkFKa=VFI^M_=>~S{7}xnpGPQLaCBBbbd|Br_~xe zg_kXI5Ot+5Xz8ZeG_)9@wQ&5*Tleye0VdzM^%a5f*HED-cO8aF;|-@(vDw?-rAkgd zS#-qMycrblqV7N$8D6R8&t=jLM9}>Tp8`>hr#aTJ-HCOoA%lJ-F}Ju z6#~S;i7VQ%gs(Xh%yO)0xZ0}d+v~@63>n~^z=oLiv70n!boslMlLK_c=y-iYmZV6d z&&qMUn1I|nn{v!`M8yE5qYa}t)2(U7(V|X?Z1%LvPqmi? z?lvLJ8O+yS&863-%4vE|qnEi8cz|zg@f-?S|8&S`=nMbV{6K4~>Yn)j+lb$>c!t05FA_g;dHy{VFFU{7YVzmvXouq7P z_Vl{6W*y(2JDT3OSa5A{xgg@58R@G!Ua{Fxry{kx&9ut)xHr)P*{2-EkS9P29DM%Z zj5<)pBwa2wOwq(mY`66|^maLoY(;@G)G2pO2)oop9oa3jF{x|Te3#mc#!fAF!ow>4 zcm{ey2`Ni_Q%fY8jQQ`(^&tzWQrd2IQo=o4oMv2pXD==9# znhfH7>|NuF6BsUO3*xYwdMeW2^wny~i!!}YAD2Vs@dNb&ig?Gy@6$Ne2Ip~1sQeAW zC~^k1^C?oQ>NLW|efdeUjBm*qqNrforu4}in~8bJssy!m%Ltu{Rz0WW-F)5pF52zZ z6*0bR^~Hm*(t$0s=#S|1$)g@>m#=UhpS-FQeyhvib^q;S(~jORMvcTH+B{sSTtgEO z&L=GNF4eqpdFA7&7Flh@Kr%<*>lF!|?ipT|yB>^jJ6vA~un`YJ%bWlvn;-7f{&U=a>O;5ori16h0KW#RD_J9OGTf3rF;dpMIEp;$`b1z4zkj9h0W4 zbq$$x&tEz?_Xe%k)DR**^&Oa;tZ_Ia$6l;3(_f%?mdI+ctet-BZh3?Pq5$Dqc!@5_ zFP=_&aA9AY;@bNc%QtBkoV<7wyO(#ud(_JBg3@HyjyN&F;d>c8X-P~ zJ8P39*rHm z3tw~E36eSUvHSmDdshJ-#nnYO39f&E;?g3eloodjP>K{S?v_GuC~hSQEmndTEfgpe zibH{tVhQeA2u>25=tkM-{^z{e3A@Q|vYLdJ_kA}znVBc|JejBGW?8wbXsP+0W8*8e z95i@R*;TiG{$t3IepPEtbpAW;xbn_|gzzO_O!t2^xZ}rdBAb8L5Rg7CR%*!8z*B41 zd4F?dfXlV;IkD#+Jg&Vaf7DRlWi7CGW!T9*731wcWK& zPo6IUz}ih~>OB4E(3c4vjwwgCjM)))Y3Lvfz-tb!UgglzAeU3y#}4iA=`+mWe7Nm$ ztJqqz{wg1{ru^)+Z8GPIJ%6HYoN8wUeBvGkjQo0*i>GV3(XGQ`$2}PSNnDG*krm^< zQm97OJXvacoo|NjdgL(q{=HtMyL|V&%=f*+JJfj)`J!ED9rX{vSr_b{a$x^e|Wxb3y)uNOb(df?DyozRF9z5O{VT> zkaOw&>yJk7vm3F0$ndZ_LqnQ38rOS#*T1?IO~`&NZ$jtHPnTgm@taA-obv4PF0^B! zgL1(5WgG6s`pk*>J8H=oZ+k^t_>wEd4}My-+ir&*s^@(gK1^t{WqaEWwc2;_eEh87 zqBp_IUsMknHZHW*f^B~)YuDJap=y_V4GUs&_EfvtXXB3d?6>oN?#4yCXTO{+w$BoO ztWF)hRQsQM#jawW>f+NKE zbEZOU`MMK^M%eFOs%&4NUB}O#H(q}OtDCcTWqwh_Y4-NW%sY-Zz0fl@x3A;L>D@NR zjOtbEe7Q-p4)q!Rb+4uBn8wvhT)8pKUeUMD`lt8LWtkjtFxQUy6@R%?@^a6ZuRU%o zty<+s!xJ~xb;LIBV&lpmnNhoWw;8HpMgO_p{bbeSn73=aAa-`u7dvjp&1_ObvETKM zYvD&FziJ-tvisGG$g9fWC$(LA&Kx~s!@6b>Q(X`3e06#3x&1{-PMfg!!+?=JPQ^I% zs2}{O;Dchh!nc;c=h9*kCTveXyl~@qzwiIXMrc*H_}h0s-Kbnyw05Sz{_Z{cT&Z02 ze93adgMRnwG2m#$d~3IM9UP6t&M&{e+VEw$=sRzk5AQpz!RU!SN=_N-y7JE8$=@&A zxWD|l7j~DtI{bPfbZU90^Mk?<9Gu){WYntqXPg$*ZME?JrqxBNUfehKq)-1L!(3;7 zHgZX4tn8|GRee$BcEWE>YARyw7G+9U(bD(0%ecIGk1fp}SvT*)a%Y@}J##p=zf_hi z$-mZF1R(qHptfNCLgK#;>IwS8(!@y+*sjt|9Zo0{Z#RT zr#8J`u+Hb7J#ZK_{`c7~HUEkl+1ju2gx|LJQa8^LwpbaGS#_{n*^#-GlVaz%lv!PW zWnSg{`lmd{ZDaz!2F7?Hry9c)QVta6|y}7yR&a+q4FSAn0ox*GomN#ajtT0P9^`(KZ|RKv2gz(!?D%8^Q*WG zCrjBMA3DXa|Av)re>Z8g=*Op9wr2f1;@2^wpC3VIv|z!jZNhy@jmQ%;_^Ut9>%6@4OOJa+5`rcK+>5XLttz%(yW$DkHV^2yY-20G${oM($y+V%W8V)HIN?`uul?Lt zMFw~LDY%L1iF(AABaUnP*qth)IJKr|gX5EX=bsZ)FyZ9sso^`0OjDg%7oTfEb^nkl zvtQKMyuG2f<4mkkcPL-Qr|>`dpDoK&&tB1CvR$D}@eT4V{40y24HzsR% z+?@r-dXIPB;8|!w$o`d+LjQSiE~kr&qsug?GrzM><|cC-f2?A!=)WsS(Kqu$pSV8T zpIn?1c1_DtdeIQt^YzA9Bne+-lZA z|E-7KjE$;X?_4hRwTHROahjf{RvNHA_A2 z%wX>cSr3)$e-x?7^Z1~f%aryN+uk@nx?S00H?pf=UR=5Isa>+!1k_AuHCMG+PH0xsOAgR37rb9 z9y=G@jI8>{WJXOmikRR0-~E7pVq1J=!v7Ex0GvuCDd&{e*AjF zRxC5F%Nglks_7_(rnZ}2Ch+C*{*U%eU%dX&?QUbcx8J-L^Me)dep#@V^0ia111-n= zSm@56y6Qy@8^kv+=uozSvVmh1|9niK_ow0`ssK^U*(fM`>(9>SHgm4 z-_|~KFsiy&-rfxkWeWH+YfSV%Pj3&m|7@gUcFo@#=6O)_gk#BjeY=&huUKz?T-d@! zC8w5~dLl2dnR%_KQ&XP`FSpwbQT&>f$6m5~mwOX2?!iB|huUwyt;p5-lm0#>I!;%4 z4PJ3{*Tg&79;%;wq>k<2c8rdhQ&wU9;Il$#K`z~eq$gV-2&%f*PL#BWy^Fxc|iNg_(XN;Pe9Y z*ue`6b$xmFR-qp*#f_YtB_Z_u;C7GtbxSCnxpon!$3cI(ep*A(TDjFe-|pc{eB+|$ zHL2vXVNvgS1A-6R-R;`COqAX z0;(TvAopuK3yRmrToMxz8F= zGG=yIg!2ZM>(y4d{kn1T(W@N~)|fIq^7~zZ`!|ic`BAl#IH~s1qf+V5a(lIj8|hZB zw8z*(Bg?x^Rk~ERvwDq^l1RCtTJ&yt=Sc&8M9%p$!{z;~t9aH`5zpd)5a<*v4oM{w*0(V1L^V zWfY;<#rK_0mPS(!M5*Sx59DFLEn#1F-2PFu+zK4vF6`U&&V-hegS$66{rj7!YE{lQ ztzAyD^><;{F|zwS<#NA8|qxZt)d3UCa32o8>VWgArVe(B-+SIMp; z@6YIirH;uwZKs~rvDp6lH4c`kHhaf{s#`rO4cz=`Ek%9BC2S)+*mCmDSw0URTpM{Q z%Y~PR${sK3I;8a{z7DZ9!>+aPA5&_{cM*0+z!NjB&-s>1hO;T@mnC66Vw&FG^H;y$ z>c`%_8?-3PA9izh7g?4|o$%|#g141zmp9w~te<;THIA!}{OX`xOZ!Fk(+=SXOz z2jgNM+Xc@U<$AEsFvV}5tahCgbo;#X<9jpbJu5%A<>m&N1D)OHJzUavNqpo%?~=J5 z7JFW_T=#2xE`(kwcDVcPBA%N@55IkK_0UF>rsvN&_|^7)o3jT* z(7SJ@I*wnodKeR3;uvb$NAX`4%`xWp-!D9k_@U^86`n1JR;qP&ZNTBV`L z3p-Vs)Tde1f&YlKIkX$!XHK(jlN@_bb;&!a(aHgx78P~dcX`#%zI~?EQu_Vgw&%n0 z9UI;$=G1O%pJw}>cq=ZSb?n@vlU=oqM}95ld$#=S$uA;v75U=B4HZV-9X?~tvZ#^Y zs!J@7Dc$8SySx7s-hXkz$7g=(B2t*yDHo70}ncVF;O6X$ZIvKnd)^(SI0&-t~IRu?c_nk^h z9;!Po95i}x_Xj1et;_VQTis6i0vkPedOdU7;zz4IKU{Xn)IamNymHwe(DdsMFNr!; zV@$8L{eEcH+S&2pn)+bB{fch2 zd-m>35X1)F{PM34snU!hdi!F-TA08jD)&Aq+_df&q z$|v((=KHM4GkZ^Thj1MJo|lj76u}zOvS;?Jtaf!*3X&&VuPddZTk?J9rU?9m@PM2Z}g zYzv)N|SgV-^O~Yu4=aw)qRHzC2v%jCK#R zfo){jxIS}pg2e<)%`a}AzXiFKE*<%ziSMUQZPo`g?Y%94#kqb7kG$Q57TM3t_xkwk zstLPuezz^S7)A%6x`}^vwn^#I2S>eSPywq+^G>QJlk;8=qUzb()K+4nPkV5&RDChP zw^@Hdq0(`JgV(%S*QPef?bX%2>LkV1jlHtXpL=WR=VN;MRqvbQmSV)I!s8k$zwttA z)~wlQgWVPtZ1iAIrkaXPRnEp0taDA2t9{`)*1!HUcTI&8ZWb<4z_PLJI|o(ms2leZKJ4hwp`7>q zGHwBGwFI-!AEV-W#XJVvQcrmK3Fl88Tbyf4)sbc&=I9zATV%dn>4okilNxc!~Ju?JMTCDaZP4 z9S4yO$^Es%IZoY3Cdc8iosu&uHytfoTf{&{97>6p?1iRDze05F~4*wDC zPP4Wsns!#5X!O6J|NZZSBCnhHHlF3;f!8k=-k+mRan*7%9F_L%=H)l*TJ!8niYl_Y zSN-AaszvrM{d{gUZMOOGx1k{~-k_JgAz+~Y5^qJF!MhsTd*mxo>hsc(P9?@{ulk}L zn4+rJRD6Jw;dy)K4h*46u37|E6}yJYUTqK`VXZ1$T|Ic46ns~!k; zv22Ym7npG(DpMs!lP$sd#;-Zlsv9^B+GBWoyGr)#EHv}KnuX+MU69-`^vLRhcg1%g z$Wso^ZTZN|=fcE}LKU&OH5Q;r-}fbS!~$Zyg4V1S8sNl2_dAm3#Wd!s9^TwfS(3%pHEnF@J19 zzdgCH|7};gW1jiyB7b)G>-S3y`wmZc9?bewoiF4y@@3uvFtbHJ3IVa)!sd!$z5NPJ zcJ%G%+6ZifEjLH{xpWQ0+2ikv+Wk?+`+f=65c~411f^dN^UZm7)gA0w_Uqu#Vb0Ej z=M;{a3i8p~UU}9!yZ?P4;P+S3p?{` z3=b+0*W9u&^;=b{_gjlA>{H1dEd#RZsU|&v%WaIyT#_& z$Lyw;^5{M;u44r}s_A{d#+Xl(<@zrHK*P@O_lou!ge6*V{EfuH6jCvIweot2W3=FL zbeiPg+3tLbSl#~g4xZ!L&bP)#L7-JET-biM*Lok9TNA2wJc4sLpMrVMwY_ht z&ufr9@q+_-JhG{_k@#)k<|siP>79LTuIa_w=AG;6c-iISF$Z6~Dc5G0;&hSWK_yjX z?437;XWD#xM3x!zT{?$Uhn_K;vov12AM^ElKB!Y{@*E`BetceKMc*7wZT29{;|R0m zKJQAWM`vm@^J;;`_mx@3R8UrQx||al9y{gi7=&M|cpj(?v!wDo3$-hH2UJBN0e8_o5c z|B>I}Pqq!O8`mXHowN5)_Z}gj;T(up?*8cw?~6QlDTmak_L1Lt#UY1o4tI)@SFYve z;y9r3NrB)tlS?ObK5@jg>z$gd+P*$f>ak}YkG_+9m*E@Gcvw5Xy&KE8zWK0Z{Uf_u z4SYSw_w321?MmD%bFleaqS7Nd^0cU*MW)^!jlTHVx&y$=gJ^(pj8zAiXP`*r8;E%s(|Iox0MmJoKH<66hK z$vwm0kW=xaj+woC=DnNUWqkidC)Xc&x~SxkJ58p3XKYUc2rNJ2Q8+tLVDCOv#F@Iypbw)(t5vy?e~?XG5XL`2N+d ze>2%V?q%1w*R!`Uj^=T@7R)>8^vv-GmoI-Qo>1%WCF%yQj=3D;UR92}=P=^42K5d_ zznq}j==m7m$@s_f&fiUN`RSus_s>)xa|Lw5idJ8>Yqq;-|Cuxn-vBZhA{&QqTnGQ8 zfdgrEPRJLKzL3R`!;pKBAV@SMK_k58JwD?*e3yRcH)k3o)$AyczO0a{kcp7LAsTmb`p}& z9n+X-Fk7E4sojHr=IgtltDF~1t6BLBf2^-8C-0hLnoX+Dc%SVs+kto0G3`dT+jw^{ z#O!vM26SUz-c!H1c?gC&H^7kmN_8X*0n->>%#)ii<{4&+Q8RNeXW9p+R$uuX?^S_3 zHYXAqg?w}CFpMfr6b1|ffBH%oYNx^8fVq%)&4l4|X@Q5Scpru$iL{RZ`L! z&smPycQM(;2KvIV^(+|vY$+LG6*_(?{tsN(S{MYSzCw3A3&gc@(@0^IFCoDcyGJG^ zjk*{t*LcQ0d8A1p;^mms(3K72Sn__BiFs zL^Y{fT$sN)HozAK7@z4FBc%~#8kh8k;qZXjj<(d9I>E@&TZjKSR^OSJP$Mr?-pACz zt9lB3LwC=BZqo2KAs)xf{jQ1n9K5=(Xrow%Lr`DYp3&$eUA!t%82vV}0n{ z!B+W9-4f>va9s^zlELK!7z+=BfnJv5;I#wPF}_z31UlHz_06^YsH2^vwh2bzU(cwb ze*JxANEPT+4@N?ls1u+oU82rzwbcG@wFNdbAZlet-KxnsjBC!DnB-yueAJ=4rmKU0 z>8GY)Y}ueU4gDszM?W=F2e0m6!`61xk-Bm&kn>|EIhI-FALB(H$G(0b{Kkd6gkj!q zMZbbZdE+BPbi$0JO_*{xKYMI_b;=Ntq*3 zZ2X^?XSc<7i1`_DY(-+(rIB-gmuk?tl4!GJEcAt(4mwj;vj!;~+psJLE@_869i)y8 z^b;yEkNKVAw>DAddxob-(pYEes=t!y%aA1ZBF}7sz8%zoOFIZdHv&&BTsKs^P57K zOlR~bIYu(%5_QHn*<afceeU5tt*8F*M}Q#QW6MY<(G*>W-J1ePjQbb;VdG^2}yE zI-@T+wW7##>Sf6B*_-PJ(FS%yJKtU%w5+o_^5lAJ>P%hDF3(JNLVT>6ItI*Xs$XZ+ zbB=if7qwOMo1L2DIGFus_Csx;Gj%nqz0yuM%W&lB-wf)^GRbjaLR_r2H-pzU)S0^8 zH5jo84^q?FgrLN$$#w3ejy(Ij(U=*CkGdM}6d3Si=yo!lF>VlTSgh2B8S-c7zP8Rm zKX*}wY#f$2?lj~lmHX7ytp22-aFgkbxeL+eSfDfK2spP#eZ&7=jPI1mQ*3f_scT<| z$>Rk%0DZrb&YLh!`VwQ_`s#pL4KWXmc2@JP(&s0odz=r6@LVnQRc;xJ{`#GiUN`hi z9xr@>7fc=x8VXdtPu-%Vq9#l&awWFF%OFI7|JyJ=w>(%_z`=4@N4pXj^#(KZnRA@VKPEump<-U!*!Z>H6Z1KmIUSSd>$Jj2^-@P? zqb=jOQlAdYSI+N-?)n~iI~?VCG}dYik1GwNg?)@<>nR$Y%~~%r5Rbvz$#h=WRvn7A zH|p|ktS$Y6wd4Eh=!fUTnz3^0IH79@)}=&$(!iXUfyfN5mud7hdp*=Zd));>a6$E3dqkM(&ugl%6& zaZC%-WYYe@q`DdUAK|jy<{oPwNP0UTB!Fo#xWCGf9;Vz!_;wKPrDxxT{k61qjFWLQ z4L04+uZ;`hVqSNE{HxDvXzR>t==+~IkE2KL|HOH#q4$TsHaSm+!Rdq zcu}c#n^Uxx=}g80pH8d;;#rsp-}pY`-(C0ub1?H75Udy`u~4Pf2G?Q z=Wo*V$^UyvNletoSNcCuUm1s__{g})ILf#t;w%CN?jk_sgPbpNKFRr(n2%Dv@*HVn zh$}=sM=EaM|Fm!@xBR~4gVccxfvkdfLb$0b7?QO7^B$jhLijHI&@aPCv+t87*f5=% z^tQzB0?0W?0K}Y)XY@nA41-~{fMiH4kS=@3Cy>dIixB;rsPVu8$1oW-<6vC&mgJQ+ z{2~p^?{bjY5FZHJa$7sb;R9iuj5}TG2IBnyG8)1OqvRqF%7VYTDXx`XrroT%0Do-jSeM>~GLK~H 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 ar4*0|MpIKY4T|vKD80j%G_SmEbN&xTcVZv_ literal 0 HcmV?d00001 diff --git a/app/desktop/buildResources/appx/Square150x150Logo.png b/app/desktop/buildResources/appx/Square150x150Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..dfa238029aa9a7f0483f22e3f3ee60a3a3962e31 GIT binary patch literal 6017 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 literal 0 HcmV?d00001 diff --git a/app/desktop/buildResources/appx/Square44x44Logo.png b/app/desktop/buildResources/appx/Square44x44Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..c68ce74e8f57cf7c0a7c930c036fe1a92ab23e02 GIT binary patch literal 1666 zcmcgrX;c#j5MGdgT()8nEZE{v1p!St48)^?q<{vCkRVMpaw(0VAct1Oq8ws4iV~1R ztbigUASyx;3KkS<33!x(;=v6?BZeD9k#-^`o$X4rxIe9cWh zH30y?+~3b9NQX}U_|hf1=)mB)>cAk{E5Hi??iZMv3zg}8wc^eQC%NtOf_=uj(Ajnvzw)n709!3OgBclpsDVWv#OAiPMH$Z`sG3q z*N~T!7${bszbi?+jlLJ)lpKgrA{rQ1J$a+dX_1B&!wvlkRwdFgtQ5&K7n>xzFF^;2 z;j%}vm?{L8Y0?_Sp6THJEAYq%{1g{WsTY4h)ITWzPjgXbnTW?%(2L*+ zA)Z`^1{6S$RD;MgN?iNXLn)mD?=OU1)4<0g%6Id4d=2{BYh~zF*!ip=u@-$hhaV~z zxupq`YSEMiabO|T^n77(8gn`;h^s*bV)dai(Uw%fksHV)gpY!FScNF|CK7QSIdKb} zN7YAfAp9}a_f^Q{HmPR@NH2z`VRhGtGNBf|GoaX>31&A-df%y%>d<<=;?XOmUmi4z zs7K~>yNEA7kjPb9X1VC=94Nn4+B&$vD1jFjwaqUVs09$`SE*Q`X&+MV%o1+P1YOev z#B%~~wve0&-t3i!6vOjk_45gg-6HwE5~=8xff6+(N4P6nxS-O$nZq%)me;57&xdxi zg=N3V#z4HNL)P)-QyjXZKiDlfE+eynm;W)V&|1)LPhiUq^{DhnO-4tj&9e*f==)59!}!y0 zlMip!mFq?9_4NTR5mx)@h*6S%0LAEofw2|Iv5Ip*rhA5;{e8S>9{rJFyY%v?15ORG zkgY8g+u$@n%`n(rDo17dE*X`?3;4t&0MOKg?R$ah;tuZQg%DT4X))a_H*X_mu}jm{*wWiKZ{@Hs%`K zW7LmqddPTvaOM`j>%s)>b=1%?2czL(()qUhfVyMFo|i32R?QxI!@vA;f%DB--)O5G zMrA~%>rngIlwusjHc}1hue+V$)0%BFX1ZB_MO#}xhi^vZ_rOl)6n%o@eaZ4ybx z$EsVBZ31D%>TRdbRM{JDSnp#odY!~-lzcYbi7P%w3A`OY%oBNiUF&m-l#vDVpUKIm z)IDrYZO5sKot%V~Ew8x$VfTT*g+ zfm2&b;F_Hwtn;UAW@UM@h7DMjAG7E-?BWfRpf#Y0^&A=>Z5q@a?-xmw(4?sFq$A|W zgd;itT!=0%&O|q7q9^T3ce1-X+0E6F=s_kDPnOiw{7Y~=E{b*Z%zq02{_0ga0pL&B K=hNsNmi{*Z$FTMQ literal 0 HcmV?d00001 diff --git a/app/desktop/buildResources/appx/StoreLogo.png b/app/desktop/buildResources/appx/StoreLogo.png new file mode 100644 index 0000000000000000000000000000000000000000..87b362ac8289833285cb7c3704439abddff85448 GIT binary patch literal 1820 zcmc&#SyWRA5`7Gt0&3eRVh zX9NJiI!_P$DJ^3DlWTOfb?;JQrWW)fT)bTXprycA6|ArAEkis`c>_T5ZU9Kj0sw`U zN?Qeh1T+9}f&c(l0svcL8P9zW1Hj*AP7;W2+JUeCr_gA=YBU;|LNoDM(fC?g^g>+O zE9sh&FL0C!mF5FmncXTR7D4W}K|($lQVvH|!wHT2nm)-YUp2O*2(N&B3ZSdCeA)|f zd5<`{mLFLSQ`&{gkSc@$2baN}lXAXPt=4D+QZ;KdSyjB1EZa9+o=ia_uuXZx0908bP`Wi0W9fAby7M53htBGdaKf zF72L?pD*PtfvVRZkRv(VLs=ZVbPoDwc0?5%TEWBIWP4JNeuK@n1_O&& zp+FcLzck6Rv20A&(bJd5MPA(Wt=Txs2%nYx1b2c+2-My4%@))CsqNd}RHqxpdU#cF z3-5iIVi`Ns*N>53U;0K5W0kx!6q^UMdPJMj`|7>?j7#@W*61Dpon~jorzh>vwys&} z=7e0vVSm)X?g!yt%8|t-^zUIg9yT$F>Y4*R2wulx{TP0eixxj&4Z@vFQ0%R~r5-rj*4Frx zMGL2J12gI$=CsnX;(|V#JgU_`*PSQK40KFT{kxLtJyfm24x`XR`sPyy5;pC4@9Te- ze&+F=omFpH`PH?%j~zX3?CE~>{Ew|h*9@jMm72_qkIhX{>uU9}H!)T6m+kB7c2sxQ zwrw7<;c$-4R`*b9>Z=-_{j#kwq_@wrs0a6eP#!*=QBmt_VV62Ea`wBQAk*;C$eh)Z zL%|Cv)C}EzrLo!mfWW7rY%pvM>aqF8-}5bA&ksj1$4H$~Yz{V&4Crp%`~BZ%n8xFz zSHa7>Q*dd%6k3p7%)95_AvZoB-liqi8tgsGTWy(dYPl?{u!Hv9ueW$Ks6@3zg|t&JPB&A(phkQCL+KIn{!7%hL5#>_Uv?zqrJ zM!ec)rZ1nKwfWT1G>(I5$YYExYLQ9}4E*pieuY_(Gv1Aqbz^x)96C21HLUA!-cNff zyLKdH)5OUK!Q{B1Wz!qz1ZSgNw3?U}Ns;O7%8%G2|7k}Fa{HfD%N(;*EB)s2;ULkO z_zRVZeky6XSBO^zzPs-F3GVuJ-}9ps zO%g2|TwHzHa+?P>$9X#diaXC^dIGw%4+hvpb|aBPgUMmIkbi|~0l=U!7;ChxHQJGQ v0E@$7akdA4Ks(^j=(ytg`u`GKjR}nmPx{{iU# literal 0 HcmV?d00001 diff --git a/app/desktop/buildResources/appx/Wide310x150Logo.png b/app/desktop/buildResources/appx/Wide310x150Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..6e1578275e0ac31128202b3d3f8cd8bee22ff179 GIT binary patch literal 6666 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 + + + +com.apple.security.cs.allow-dyld-environment-variables + +com.apple.security.cs.allow-jit + +com.apple.security.cs.allow-unsigned-executable-memory + +com.apple.security.device.audio-input + +com.apple.security.device.camera + +com.apple.security.device.microphone + +com.apple.security.files.user-selected.read-only + +com.apple.security.files.user-selected.read-write + +com.apple.security.network.client + + + diff --git a/app/desktop/buildResources/entitlements.mas.inherit.plist b/app/desktop/buildResources/entitlements.mas.inherit.plist new file mode 100644 index 000000000..8c3993fc0 --- /dev/null +++ b/app/desktop/buildResources/entitlements.mas.inherit.plist @@ -0,0 +1,10 @@ + + + + +com.apple.security.app-sandbox + +com.apple.security.inherit + + + diff --git a/app/desktop/buildResources/entitlements.mas.plist b/app/desktop/buildResources/entitlements.mas.plist new file mode 100644 index 000000000..58351e70a --- /dev/null +++ b/app/desktop/buildResources/entitlements.mas.plist @@ -0,0 +1,26 @@ + + + + +com.apple.security.app-sandbox + +com.apple.security.cs.allow-dyld-environment-variables + +com.apple.security.cs.allow-jit + +com.apple.security.cs.allow-unsigned-executable-memory + +com.apple.security.device.audio-input + +com.apple.security.device.camera + +com.apple.security.device.microphone + +com.apple.security.files.user-selected.read-only + +com.apple.security.files.user-selected.read-write + +com.apple.security.network.client + + + diff --git a/app/desktop/buildResources/icon/cc3.ico b/app/desktop/buildResources/icon/cc3.ico new file mode 100644 index 0000000000000000000000000000000000000000..98b4729e796c0afa9c3e092d41d6b3e40a185f1f GIT binary patch literal 204980 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 ZHst>s$Z/dev/null 2>&1; then + function optimize () { + pngcrush -new -brute -ow "$@" + } +else + echo "pngcrush is not available - skipping PNG optimization" + function optimize () { + echo "Not optimizing:" "$@" + } +fi + +# usage: resize newWidth newHeight input output [otherOptions...] +function resize () { + WIDTH=$1 + HEIGHT=$2 + SRC_T=$3 + DST=$4 + shift 4 + convert -background none -resize "${WIDTH}x${HEIGHT}" -extent "${WIDTH}x${HEIGHT}" -gravity center "$@" "${SRC_T}" "${DST}" + optimize "${DST}" +} + +if command -v convert >/dev/null 2>&1; then + # Mac + if command -v iconutil >/dev/null 2>&1; then + mkdir -p "${OUT_ICONSET}" + for SIZE in 16 32 128 256 512; do + SIZE2=`expr "${SIZE}" '*' 2` + resize "${SIZE}" "${SIZE}" "${SRC}" "${OUT_ICONSET}/icon_${SIZE}x${SIZE}.png" -density 72 -units PixelsPerInch + resize "${SIZE2}" "${SIZE2}" "${SRC}" "${OUT_ICONSET}/icon_${SIZE}x${SIZE}@2x.png" -density 144 -units PixelsPerInch + done + iconutil -c icns --output "${OUT_ICNS}" "${SRC_MAC}" + else + echo "iconutil is not available - skipping ICNS and ICONSET" + fi + + # Windows ICO + mkdir -p "${TMP_ICO}" + mkdir -p icon + for SIZE in ${ICO_BASIC_SIZES} ${ICO_EXTRA_SIZES}; do + resize "${SIZE}" "${SIZE}" "${SRC}" "${TMP_ICO}/icon_${SIZE}x${SIZE}.png" + resize "${SIZE}" "${SIZE}" "${SRC_CC3}" "${TMP_ICO}/cc3_${SIZE}x${SIZE}.png" + done + # Asking for "Zip" compression actually results in PNG compression + convert "${TMP_ICO}"/icon_*.png -colorspace sRGB -compress Zip "${OUT_ICO}" + convert "${TMP_ICO}"/cc3_*.png -colorspace sRGB -compress Zip "${OUT_CC3}" + + # Windows AppX + mkdir -p "appx" + resize 44 44 "${SRC}" 'appx/Square44x44Logo.png' + resize 50 50 "${SRC}" 'appx/StoreLogo.png' + resize 150 150 "${SRC}" 'appx/Square150x150Logo.png' + resize 310 150 "${SRC}" 'appx/Wide310x150Logo.png' +else + echo "ImageMagick is not available - cannot convert icons" +fi diff --git a/app/desktop/eslint.config.mjs b/app/desktop/eslint.config.mjs new file mode 100644 index 000000000..ce98401c7 --- /dev/null +++ b/app/desktop/eslint.config.mjs @@ -0,0 +1,41 @@ +import clipccConfig from 'eslint-config-clipcc'; +import clipccNode from 'eslint-config-clipcc/node.js'; +import clipccES6 from 'eslint-config-clipcc/es6.js'; +import clipccReact from 'eslint-config-clipcc/react.js'; +import clipccTS from 'eslint-config-clipcc/ts.js'; +import globals from 'globals'; + +export default [ + ...clipccConfig, + ...clipccNode, + ...clipccES6, + ...clipccReact.map(config => ({ + ...config, + files: ['src/**/*.{js,jsx}'] + })), + ...clipccTS.map(config => ({ + ...config, + files: ['src/**/*.{ts,tsx}'] + })), + { + files: ['scripts/**/*.{js,ts,mjs}'], + rules: { + 'no-console': 'off' + } + }, + { + files: ['src/renderer/**/*.{js,jsx,ts,tsx}'], + languageOptions: { + globals: { + ...globals.browser + } + } + }, + { + ignores: [ + 'node_modules/**', + 'dist/**', + 'static/**' + ] + } +]; diff --git a/app/desktop/package.json b/app/desktop/package.json new file mode 100644 index 000000000..ba5682fe7 --- /dev/null +++ b/app/desktop/package.json @@ -0,0 +1,44 @@ +{ + "name": "clipcc-desktop", + "displayName": "ClipCC", + "version": "3.2.0", + "description": "ClipCC as a self-contained desktop application.", + "author": { + "name": "Clip Team", + "email": "sinangentoo@gmail.com" + }, + "license": "AGPL-3.0", + "homepage": "https://github.com/Clipteam/clipcc", + "repository": { + "type": "git", + "url": "https://github.com/Clipteam/clipcc.git" + }, + "main": "dist/main/index.js", + "scripts": { + "lint": "eslint ." + }, + "devDependencies": { + "@types/node": "^22.15.30", + "@types/lodash.bindall": "^4.4.9", + "@types/react": "16.1.0", + "@types/react-dom": "16.0.11", + "clipcc-gui": "workspace:~", + "copy-webpack-plugin": "^14.0.0", + "electron": "^41.2.0", + "electron-builder": "^26.0.12", + "esbuild-loader": "^4.4.3", + "eslint": "^9.39.2", + "eslint-config-clipcc": "workspace:~", + "globals": "^16.5.0", + "lodash.bindall": "4.4.0", + "react": "catalog:", + "react-dom": "16.2.1", + "redux": "3.7.2", + "style-loader": "^4.0.0", + "ts-loader": "^9.5.4", + "typescript": "catalog:", + "webpack": "catalog:", + "webpack-cli": "^6.0.1", + "webpack-dev-server": "^5.2.3" + } +} diff --git a/app/desktop/scripts/fetchMediaLibraryAssets.js b/app/desktop/scripts/fetchMediaLibraryAssets.js new file mode 100644 index 000000000..89ef7fb12 --- /dev/null +++ b/app/desktop/scripts/fetchMediaLibraryAssets.js @@ -0,0 +1,106 @@ +const fs = require('fs'); +const https = require('https'); +const path = require('path'); +const util = require('util'); + +const async = require('async'); + +const libraries = require('./lib/libraries'); + +const ASSET_HOST = 'cdn.assets.scratch.mit.edu'; +const NUM_SIMULTANEOUS_DOWNLOADS = 5; +const OUT_PATH = path.resolve('static', 'assets'); + +const describe = function (object) { + return util.inspect(object, false, Infinity, true); +}; + +const collectSimple = function (library, dest, debugLabel = 'Item') { + library.forEach(item => { + let md5Count = 0; + if (item.md5) { + ++md5Count; + dest.add(item.md5); + } + if (item.baseLayerMD5) { // 2.0 library syntax for costumes + ++md5Count; + dest.add(item.baseLayerMD5); + } + if (item.md5ext) { // 3.0 library syntax for costumes + ++md5Count; + dest.add(item.md5ext); + } + if (md5Count < 1) { + console.warn(`${debugLabel} has no MD5 property:\n${describe(item)}`); + } else if (md5Count > 1) { + // is this actually bad? + console.warn(`${debugLabel} has multiple MD5 properties:\n${describe(item)}`); + } + }); + return dest; +}; + +const collectAssets = function (dest) { + collectSimple(libraries.backdrops, dest, 'Backdrop'); + collectSimple(libraries.costumes, dest, 'Costume'); + collectSimple(libraries.sounds, dest, 'Sound'); + libraries.sprites.forEach(sprite => { + if (sprite.costumes) { + collectSimple(sprite.costumes, dest, `Costume for sprite ${sprite.name}`); + } + if (sprite.sounds) { + collectSimple(sprite.sounds, dest, `Sound for sprite ${sprite.name}`); + } + }); + return dest; +}; + +const connectionPool = []; + +const fetchAsset = function (md5, callback) { + const myAgent = connectionPool.pop() || new https.Agent({keepAlive: true}); + const getOptions = { + host: ASSET_HOST, + path: `/internalapi/asset/${md5}/get/`, + agent: myAgent + }; + const urlHuman = `//${getOptions.host}${getOptions.path}`; + https.get(getOptions, response => { + if (response.statusCode !== 200) { + callback(new Error(`Request failed: status code ${response.statusCode} for ${urlHuman}`)); + return; + } + + const stream = fs.createWriteStream(path.resolve(OUT_PATH, md5), {encoding: 'binary'}); + stream.on('error', callback); + response.on('data', chunk => { + stream.write(chunk); + }); + response.on('end', () => { + connectionPool.push(myAgent); + stream.end(); + console.log(`Fetched ${urlHuman}`); + callback(); + }); + }); +}; + +const fetchAllAssets = function () { + const allAssets = collectAssets(new Set()); + console.log(`Total library assets: ${allAssets.size}`); + + async.forEachLimit(allAssets, NUM_SIMULTANEOUS_DOWNLOADS, fetchAsset, err => { + if (err) { + console.error(`Fetch failed:\n${describe(err)}`); + } else { + console.log('Fetch succeeded.'); + } + + console.log(`Shutting down ${connectionPool.length} agents.`); + while (connectionPool.length > 0) { + connectionPool.pop().destroy(); + } + }); +}; + +fetchAllAssets(); diff --git a/app/desktop/scripts/lib/libraries.js b/app/desktop/scripts/lib/libraries.js new file mode 100644 index 000000000..4bc60b4e2 --- /dev/null +++ b/app/desktop/scripts/lib/libraries.js @@ -0,0 +1,13 @@ +const backdrops = require('clipcc-gui/src/lib/libraries/backdrops.json'); +const costumes = require('clipcc-gui/src/lib/libraries/costumes.json'); +const sounds = require('clipcc-gui/src/lib/libraries/sounds.json'); +const sprites = require('clipcc-gui/src/lib/libraries/sprites.json'); + +const libraries = { + backdrops, + costumes, + sounds, + sprites +}; + +module.exports = libraries; diff --git a/app/desktop/src/main/index.ts b/app/desktop/src/main/index.ts new file mode 100644 index 000000000..e69de29bb diff --git a/app/desktop/src/renderer/App.tsx b/app/desktop/src/renderer/App.tsx new file mode 100644 index 000000000..1712a85e1 --- /dev/null +++ b/app/desktop/src/renderer/App.tsx @@ -0,0 +1,24 @@ +import {compose} from 'redux'; + +import GUI, {setAppElement} from 'clipcc-gui/src/index'; +import AppStateHOC from 'clipcc-gui/src/lib/app-state-hoc'; + +import ScratchDesktopAppStateHOC from './DesktopAppStateHOC'; +// import ScratchDesktopGUIHOC from './DesktopGUIHOC'; +import './app.css'; +import React from 'react'; + +const appTarget = document.getElementById('app'); + +setAppElement(appTarget); + +// note that redux's 'compose' function is just being used as a general utility to make +// the hierarchy of HOC constructor calls clearer here; it has nothing to do with redux's +// ability to compose reducers. +const WrappedGui = compose( + ScratchDesktopAppStateHOC, + AppStateHOC, + ScratchDesktopGUIHOC +)(GUI); + +export default ; diff --git a/app/desktop/src/renderer/DesktopAppStateHOC.tsx b/app/desktop/src/renderer/DesktopAppStateHOC.tsx new file mode 100644 index 000000000..a35016184 --- /dev/null +++ b/app/desktop/src/renderer/DesktopAppStateHOC.tsx @@ -0,0 +1,46 @@ +import bindAll from 'lodash.bindall'; +import React from 'react'; +import type {AppStateProps} from 'clipcc-gui/src/lib/app-state-hoc'; +/** + * Higher-order component to add desktop logic to AppStateHOC. + * @param WrappedComponent an AppStateHOC-like component to wrap. + * @returns a component similar to AppStateHOC with desktop-specific logic added. + */ +const ScratchDesktopAppStateHOC = function

(WrappedComponent: React.ComponentType

) { + class ScratchDesktopAppStateComponent extends React.Component { + constructor(props: P) { + super(props); + bindAll(this, [ + 'handleTelemetryModalOptIn', + 'handleTelemetryModalOptOut' + ]); + this.state = { + // use `sendSync` because this should be set before first render + telemetryDidOptIn: false + }; + } + handleTelemetryModalOptIn() { + } + handleTelemetryModalOptOut() { + } + render() { + const shouldShowTelemetryModal = false; + + return ( + + ); + } + } + + return ScratchDesktopAppStateComponent; +}; + +export default ScratchDesktopAppStateHOC; diff --git a/app/desktop/src/renderer/DesktopGUIHOC.tsx b/app/desktop/src/renderer/DesktopGUIHOC.tsx new file mode 100644 index 000000000..e69de29bb diff --git a/app/desktop/src/renderer/app.css b/app/desktop/src/renderer/app.css new file mode 100644 index 000000000..e69de29bb diff --git a/app/desktop/src/renderer/index.html b/app/desktop/src/renderer/index.html new file mode 100644 index 000000000..c873ba2df --- /dev/null +++ b/app/desktop/src/renderer/index.html @@ -0,0 +1,9 @@ + + + + + + +

+ + diff --git a/app/desktop/src/renderer/index.ts b/app/desktop/src/renderer/index.ts new file mode 100644 index 000000000..e4d60b538 --- /dev/null +++ b/app/desktop/src/renderer/index.ts @@ -0,0 +1,35 @@ +// This file does async imports of the heavy JSX, especially app.jsx, to avoid blocking the first render. +// The main index.html just contains a loading/splash screen which will display while this import loads. + +import { ipcRenderer } from 'electron'; + +import ReactDOM from 'react-dom'; + +ipcRenderer.on('ready-to-show', () => { + // Start without any element in focus, otherwise the first link starts with focus and shows an orange box. + // We shouldn't disable that box or the focus behavior in case someone wants or needs to navigate that way. + // This seems like a hack... maybe there's some better way to do avoid any element starting with focus? + (document.activeElement as HTMLElement).blur(); +}); + +const route = new URLSearchParams(window.location.search).get('route') || 'app'; +let routeModulePromise; +switch (route) { + case 'app': + routeModulePromise = import('./App'); + break; + /* + case 'about': + routeModulePromise = import('./about.jsx'); + break; + case 'privacy': + routeModulePromise = import('./privacy.jsx'); + break; + */ +} + +routeModulePromise?.then(routeModule => { + const appTarget = document.getElementById('app'); + const routeElement = routeModule.default; + ReactDOM.render(routeElement, appTarget); +}); diff --git a/app/desktop/src/types.d.ts b/app/desktop/src/types.d.ts new file mode 100644 index 000000000..59a4aa76e --- /dev/null +++ b/app/desktop/src/types.d.ts @@ -0,0 +1,42 @@ +declare module '*.svg' { + declare const value: string; + export default value; +} + +declare module '*.css' { + declare const value: { [className: string]: string }; + export default value; +} + +declare module 'react-intl' { + import type React from 'react'; + + interface InjectIntlOptions { + intlPropName?: string; + withRef?: boolean; + } + + export interface MessageDescriptor { + id: string; + defaultMessage?: string; + description?: string; + } + + export interface IntlShape { + formatMessage( + descriptor: MessageDescriptor, + values?: Record + ): string; + } + + export function addLocaleData(localeData: unknown): void; + export function defineMessages>(messages: T): T; + export const FormattedMessage: React.ComponentType< + MessageDescriptor & { values?: Record } + >; + export const intlShape: { isRequired: unknown }; + export function injectIntl

( + component: React.ComponentType

, + options?: InjectIntlOptions + ): React.ComponentType>; +} diff --git a/app/desktop/tsconfig.json b/app/desktop/tsconfig.json new file mode 100644 index 000000000..e278f3b22 --- /dev/null +++ b/app/desktop/tsconfig.json @@ -0,0 +1,23 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "ESNext", + "moduleResolution": "Bundler", + "strict": true, + "jsx": "react", + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "types": [ + "node", + "electron" + ], + "lib": [ + "ES2022", + "DOM" + ] + }, + "include": [ + "src/**/*" + ] +} \ No newline at end of file diff --git a/app/desktop/webpack.config.mjs b/app/desktop/webpack.config.mjs new file mode 100644 index 000000000..bac801b93 --- /dev/null +++ b/app/desktop/webpack.config.mjs @@ -0,0 +1,170 @@ +// @ts-check + +import CopyWebpackPlugin from 'copy-webpack-plugin'; +import path from 'path'; +import fs from 'fs'; +import {DefinePlugin} from 'webpack'; + +import {version} from '../../package.json'; + +/** + * Get module's root path from its name. + * @param {string} moduleName - the name of the module to get the path of + * @returns {string} the path to the module's root directory + */ +const getModulePath = moduleName => path.dirname(require.resolve(`${moduleName}/package.json`)); + +class CleanSourceMapWebpackPlugin { + /** + * @param {import('webpack').Compiler} compiler the compiler instance + */ + apply (compiler) { + compiler.hooks.done.tapAsync('CleanSourceMapWebpackPlugin', async ({compilation}) => { + // if (process.env.NODE_ENV !== 'production') return; + const outputPath = compilation.outputOptions.path; + if (!outputPath) return; + /** @type {Promise[]} */ + const threads = []; + Object.keys(compilation.assets) + .filter(filename => /[a-zA-Z0-9]\.(js|css)\.map$/.test(filename)) + .forEach(filename => { + const filePath = path.resolve(outputPath, filename); + threads.push(fs.promises.unlink(filePath)); + }); + await Promise.all(threads); + }); + } +} + +/** @type {import('webpack').Configuration} */ +export default { + mode: process.env.NODE_ENV === 'production' ? 'production' : 'development', + target: 'web', + entry: { + index: './src/main/index.ts' + }, + output: { + filename: '[name].js' + }, + resolve: { + extensions: ['.ts', '.tsx', '.js', '.jsx', '.json'] + }, + devtool: process.env.NODE_ENV === 'production' ? undefined : 'source-map', + devServer: { + static: [ + { + directory: path.join(__dirname, 'static'), + publicPath: '/static' + }, + { + directory: path.join(getModulePath('clipcc-gui'), 'static'), + publicPath: '/static' + }, + { + directory: path.join(getModulePath('clipcc-block'), 'media'), + publicPath: '/static/blocks-media/default' + }, + { + directory: path.join(getModulePath('clipcc-block'), 'media'), + publicPath: '/static/blocks-media/high-contrast' + }, + { + directory: path.join(getModulePath('clipcc-gui'), 'src/lib/themes/high-contrast/blocks-media'), + publicPath: '/static/blocks-media/high-contrast' + } + ], + compress: true + }, + module: { + rules: [ + { + test: /\.tsx?$/, + loader: 'esbuild-loader', + options: { + loader: 'tsx', + // eslint-disable-next-line global-require + tsconfigRaw: require('./tsconfig.json') + } + }, + { + test: /\.jsx?$/, + loader: 'esbuild-loader', + options: { + loader: 'jsx' + } + }, + { + test: /\.css$/, + use: [{ + loader: 'style-loader' + }, { + loader: 'css-loader', + options: { + modules: { + localIdentName: '[name]_[local]_[hash:base64:5]', + exportLocalsConvention: 'camelCase' + }, + importLoaders: 1 + } + }, { + loader: 'postcss-loader', + options: { + postcssOptions: { + plugins: [ + 'postcss-import' + ] + } + } + }] + }, + { + test: /\.(svg|png|wav|gif|jpg)$/, + type: 'asset/resource', + generator: { + filename: 'static/assets/[hash][ext][query]' + } + } + ] + }, + plugins: [ + new CopyWebpackPlugin({ + patterns: [ + { + from: path.resolve(__dirname, 'static'), + to: './static' + }, + { + from: path.resolve(getModulePath('clipcc-gui'), 'static'), + to: './static' + }, + { + from: path.resolve(__dirname, 'src', 'index.html'), + to: '.' + }, + { + from: path.resolve(__dirname, 'src', 'index.css'), + to: '.' + }, + { + from: path.resolve(getModulePath('clipcc-block'), 'media'), + to: 'static/blocks-media/default' + }, + { + from: path.resolve(getModulePath('clipcc-block'), 'media'), + to: 'static/blocks-media/high-contrast' + }, + { + from: path.resolve(getModulePath('clipcc-gui'), 'src/lib/themes/high-contrast/blocks-media'), + to: 'static/blocks-media/high-contrast', + force: true + }] + }), + new DefinePlugin({ + 'process.env.DEBUG': Boolean(process.env.DEBUG), + 'process.env.GA_ID': `"${process.env.GA_ID || 'UA-000000-01'}"`, + 'clipcc.VERSION': version, + 'clipcc.BUILD_TIME': Date.now() + }), + new CleanSourceMapWebpackPlugin() + ] +}; diff --git a/package.json b/package.json index 91e79372c..8bc392452 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,7 @@ "bump": "pnpm changeset version", "release-all": "pnpm changeset publish", "patch:convert": "node ./scripts/convert-patch.mjs", + "desktop": "pnpm --filter clipcc-desktop", "gui": "pnpm --filter clipcc-gui", "vm": "pnpm --filter clipcc-vm", "block": "pnpm --filter clipcc-block", diff --git a/packages/gui/src/lib/app-state-hoc.tsx b/packages/gui/src/lib/app-state-hoc.tsx index b30439b58..73ab9cb2e 100644 --- a/packages/gui/src/lib/app-state-hoc.tsx +++ b/packages/gui/src/lib/app-state-hoc.tsx @@ -23,7 +23,7 @@ declare global { const composeEnhancers: ComposeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose; -interface AppStateProps { +export interface AppStateProps { isFullScreen?: boolean; isPlayerOnly?: boolean; isTelemetryEnabled?: boolean; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 522357290..dcc4f2b76 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -56,6 +56,75 @@ importers: specifier: ^9.1.7 version: 9.1.7 + app/desktop: + devDependencies: + '@types/lodash.bindall': + specifier: ^4.4.9 + version: 4.4.9 + '@types/node': + specifier: ^22.15.30 + version: 22.19.17 + '@types/react': + specifier: 16.1.0 + version: 16.1.0 + '@types/react-dom': + specifier: 16.0.11 + version: 16.0.11 + clipcc-gui: + specifier: workspace:~ + version: link:../../packages/gui + copy-webpack-plugin: + specifier: ^14.0.0 + version: 14.0.0(webpack@5.105.4) + electron: + specifier: ^41.2.0 + version: 41.2.0 + electron-builder: + specifier: ^26.0.12 + version: 26.8.1(electron-builder-squirrel-windows@26.8.1) + esbuild-loader: + specifier: ^4.4.3 + version: 4.4.3(webpack@5.105.4) + eslint: + specifier: ^9.39.2 + version: 9.39.2(jiti@2.6.1) + eslint-config-clipcc: + specifier: workspace:~ + version: link:../../packages/lint-config + globals: + specifier: ^16.5.0 + version: 16.5.0 + lodash.bindall: + specifier: 4.4.0 + version: 4.4.0 + react: + specifier: 'catalog:' + version: 16.2.0 + react-dom: + specifier: 16.2.1 + version: 16.2.1(react@16.2.0) + redux: + specifier: 3.7.2 + version: 3.7.2 + style-loader: + specifier: ^4.0.0 + version: 4.0.0(webpack@5.105.4) + ts-loader: + specifier: ^9.5.4 + version: 9.5.4(typescript@5.9.3)(webpack@5.105.4) + typescript: + specifier: 'catalog:' + version: 5.9.3 + webpack: + specifier: 'catalog:' + version: 5.105.4(webpack-cli@6.0.1) + webpack-cli: + specifier: ^6.0.1 + version: 6.0.1(webpack-dev-server@5.2.3)(webpack@5.105.4) + webpack-dev-server: + specifier: ^5.2.3 + version: 5.2.3(tslib@2.8.1)(webpack-cli@6.0.1)(webpack@5.105.4) + packages/audio: dependencies: '@turbowarp/nanolog': @@ -474,7 +543,7 @@ importers: version: 5.6.6(webpack@5.105.4) jest: specifier: 'catalog:' - version: 30.3.0(@types/node@12.20.55) + version: 30.3.0(@types/node@25.5.2) jest-environment-jsdom: specifier: ^30.3.0 version: 30.3.0 @@ -1332,6 +1401,9 @@ importers: packages: + 7zip-bin@5.2.0: + resolution: {integrity: sha512-ukTPVhqG4jNzMro2qA9HSCSSVJN3aN7tlb+hfqYCt3ER0yWroeA2VR38MNrOHLQ/cVj+DaIMad0kFCtWWowh/A==} + '@acemir/cssom@0.9.31': resolution: {integrity: sha512-ZnR3GSaH+/vJ0YlHau21FjfLYjMpYVIzTD8M8vIEQvIGxeOXyXdzCI140rrCY862p/C/BbzWsjc1dgnM9mkoTA==} @@ -2251,10 +2323,54 @@ packages: resolution: {integrity: sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==} engines: {node: '>=20.19.0'} + '@develar/schema-utils@2.6.5': + resolution: {integrity: sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig==} + engines: {node: '>= 8.9.0'} + '@discoveryjs/json-ext@0.6.3': resolution: {integrity: sha512-4B4OijXeVNOPZlYA2oEwWOTkzyltLao+xbotHQeqN++Rv27Y6s818+n2Qkp8q+Fxhn0t/5lA5X1Mxktud8eayQ==} engines: {node: '>=14.17.0'} + '@electron/asar@3.4.1': + resolution: {integrity: sha512-i4/rNPRS84t0vSRa2HorerGRXWyF4vThfHesw0dmcWHp+cspK743UanA0suA5Q5y8kzY2y6YKrvbIUn69BCAiA==} + engines: {node: '>=10.12.0'} + hasBin: true + + '@electron/fuses@1.8.0': + resolution: {integrity: sha512-zx0EIq78WlY/lBb1uXlziZmDZI4ubcCXIMJ4uGjXzZW0nS19TjSPeXPAjzzTmKQlJUZm0SbmZhPKP7tuQ1SsEw==} + hasBin: true + + '@electron/get@2.0.3': + resolution: {integrity: sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ==} + engines: {node: '>=12'} + + '@electron/get@3.1.0': + resolution: {integrity: sha512-F+nKc0xW+kVbBRhFzaMgPy3KwmuNTYX1fx6+FxxoSnNgwYX6LD7AKBTWkU0MQ6IBoe7dz069CNkR673sPAgkCQ==} + engines: {node: '>=14'} + + '@electron/notarize@2.5.0': + resolution: {integrity: sha512-jNT8nwH1f9X5GEITXaQ8IF/KdskvIkOFfB2CvwumsveVidzpSc+mvhhTMdAGSYF3O+Nq49lJ7y+ssODRXu06+A==} + engines: {node: '>= 10.0.0'} + + '@electron/osx-sign@1.3.3': + resolution: {integrity: sha512-KZ8mhXvWv2rIEgMbWZ4y33bDHyUKMXnx4M0sTyPNK/vcB81ImdeY9Ggdqy0SWbMDgmbqyQ+phgejh6V3R2QuSg==} + engines: {node: '>=12.0.0'} + hasBin: true + + '@electron/rebuild@4.0.3': + resolution: {integrity: sha512-u9vpTHRMkOYCs/1FLiSVAFZ7FbjsXK+bQuzviJZa+lG7BHZl1nz52/IcGvwa3sk80/fc3llutBkbCq10Vh8WQA==} + engines: {node: '>=22.12.0'} + hasBin: true + + '@electron/universal@2.0.3': + resolution: {integrity: sha512-Wn9sPYIVFRFl5HmwMJkARCCf7rqK/EurkfQ/rJZ14mHP3iYTjZSIOSVonEAnhWeAXwtw7zOekGRlc6yTtZ0t+g==} + engines: {node: '>=16.4'} + + '@electron/windows-sign@1.2.2': + resolution: {integrity: sha512-dfZeox66AvdPtb2lD8OsIIQh12Tp0GNCRUDfBHIKGpbmopZto2/A8nSpYYLoedPIHpqkeblZ/k8OV0Gy7PYuyQ==} + engines: {node: '>=14.14'} + hasBin: true + '@emnapi/core@1.8.1': resolution: {integrity: sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==} @@ -2279,6 +2395,162 @@ packages: resolution: {integrity: sha512-Q9hjxWI5xBM+qW2enxfe8wDKdFWMfd0Z29k5ZJnuBqD/CasY5Zryj09aCA6owbGATWz+39p5uIdaHXpopOcG8g==} engines: {node: '>=10'} + '@esbuild/aix-ppc64@0.27.7': + resolution: {integrity: sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.27.7': + resolution: {integrity: sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.27.7': + resolution: {integrity: sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.27.7': + resolution: {integrity: sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.27.7': + resolution: {integrity: sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.27.7': + resolution: {integrity: sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.27.7': + resolution: {integrity: sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.27.7': + resolution: {integrity: sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.27.7': + resolution: {integrity: sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.27.7': + resolution: {integrity: sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.27.7': + resolution: {integrity: sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.27.7': + resolution: {integrity: sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.27.7': + resolution: {integrity: sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.27.7': + resolution: {integrity: sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.27.7': + resolution: {integrity: sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.27.7': + resolution: {integrity: sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.27.7': + resolution: {integrity: sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.27.7': + resolution: {integrity: sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.27.7': + resolution: {integrity: sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.27.7': + resolution: {integrity: sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.27.7': + resolution: {integrity: sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.27.7': + resolution: {integrity: sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.27.7': + resolution: {integrity: sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.27.7': + resolution: {integrity: sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.27.7': + resolution: {integrity: sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.27.7': + resolution: {integrity: sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@eslint-community/eslint-utils@4.9.1': resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -2662,6 +2934,14 @@ packages: '@leichtgewicht/ip-codec@2.0.5': resolution: {integrity: sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==} + '@malept/cross-spawn-promise@2.0.0': + resolution: {integrity: sha512-1DpKU0Z5ThltBwjNySMC14g0CkbyhCaz9FkhxqNsZI6uAPJXFS8cMXlBKo26FJ8ZuW6S9GCMcR9IO5k2X5/9Fg==} + engines: {node: '>= 12.13.0'} + + '@malept/flatpak-bundler@0.4.0': + resolution: {integrity: sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q==} + engines: {node: '>= 10.0.0'} + '@manypkg/find-root@1.1.0': resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} @@ -2703,10 +2983,18 @@ packages: resolution: {integrity: sha512-OrcNPXdpSl9UX7qPVRWbmWMCSXrcDa2M9DvrbOTj7ao1S4PlqVFYv9/yLKMkrJKZ/V5A/kDBC690or307i26Og==} engines: {node: ^16.14.0 || >=18.0.0} + '@npmcli/agent@3.0.0': + resolution: {integrity: sha512-S79NdEgDQd/NGCay6TCoVzXSj74skRZIKJcpJjC5lOq34SZzyI6MqtiiWoiVWoVrTcGjNeC4ipbh1VIHlpfF5Q==} + engines: {node: ^18.17.0 || >=20.5.0} + '@npmcli/fs@3.1.1': resolution: {integrity: sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + '@npmcli/fs@4.0.0': + resolution: {integrity: sha512-/xGlezI6xfGO9NwuJlnwz/K14qD1kCSAGtacBHnGzeAIuJGazcp45KP5NuyARXoKb7cwulAGWVsbeSxdG/cb0Q==} + engines: {node: ^18.17.0 || >=20.5.0} + '@npmcli/git@5.0.8': resolution: {integrity: sha512-liASfw5cqhjNW9UFd+ruwwdEf/lbOAQjLL2XY2dFW/bkJheXDYZgOyul/4gVvEV4BWkTXjYGmDqMw9uegdbJNQ==} engines: {node: ^16.14.0 || >=18.0.0} @@ -2827,12 +3115,20 @@ packages: resolution: {integrity: sha512-TeheYy0ILzBEI/CO55CP6zJCSdSWeRtGnHy8U8dWSUH4I68iqTsy7HkMktR4xakThc9jotkPQUXT4ITdbV7cHA==} engines: {node: '>=18'} + '@sindresorhus/is@4.6.0': + resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} + engines: {node: '>=10'} + '@sinonjs/commons@3.0.1': resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} '@sinonjs/fake-timers@15.1.1': resolution: {integrity: sha512-cO5W33JgAPbOh07tvZjUOJ7oWhtaqGHiZw+11DPbyqh2kHTBc3eF/CjJDeQ4205RLQsX6rxCuYOroFQwl7JDRw==} + '@szmarczak/http-timer@4.0.6': + resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} + engines: {node: '>=10'} + '@tapjs/after-each@4.0.0': resolution: {integrity: sha512-RrkYMB3SpXKFJAijbgNkOexiClX5aygkCIHKHPIfnfqsPozkwjYbtVQs6d1/tG8ytiJtH5rvybuNJMRRNDcfBQ==} engines: {node: 20 || >=22} @@ -3022,6 +3318,9 @@ packages: '@types/bonjour@3.5.13': resolution: {integrity: sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==} + '@types/cacheable-request@6.0.3': + resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} + '@types/connect-history-api-fallback@1.5.4': resolution: {integrity: sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==} @@ -3031,6 +3330,9 @@ packages: '@types/css-tree@2.3.11': resolution: {integrity: sha512-aEokibJOI77uIlqoBOkVbaQGC9zII0A+JH1kcTNKW2CwyYWD8KM6qdo+4c77wD3wZOQfJuNWAr9M4hdk+YhDIg==} + '@types/debug@4.1.13': + resolution: {integrity: sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==} + '@types/eslint-scope@3.7.7': resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} @@ -3049,9 +3351,15 @@ packages: '@types/fastestsmallesttextencoderdecoder@1.0.2': resolution: {integrity: sha512-0Md9qUxGnQ9uJ0NjsA70Y0NHIl3NwfBO1d8CGXK0zhczRL85CXJ3M0JZsmCNQ0WcAbt08FuT4U1G1mWQqgOsUg==} + '@types/fs-extra@9.0.13': + resolution: {integrity: sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==} + '@types/html-minifier-terser@6.1.0': resolution: {integrity: sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==} + '@types/http-cache-semantics@4.2.0': + resolution: {integrity: sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q==} + '@types/http-errors@2.0.5': resolution: {integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==} @@ -3088,6 +3396,9 @@ packages: '@types/json5@0.0.29': resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + '@types/keyv@3.1.4': + resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} + '@types/lodash.bindall@4.4.9': resolution: {integrity: sha512-sG6V5+T3JcB39nXfORM+kHRH6DiCB+95DfGrH2YpPMXRpt6q3rn7VrW3dItiOLasJYeHq1jxc+tOW1ijT+d1wg==} @@ -3097,18 +3408,30 @@ packages: '@types/mime@1.3.5': resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + '@types/node-hid@1.3.4': resolution: {integrity: sha512-0ootpsYetN9vjqkDSwm/cA4fk/9yGM/PO0X8SLPE/BzXlUaBelImMWMymtF9QEoEzxY0pnhcROIJM0CNSUqO8w==} '@types/node@12.20.55': resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} + '@types/node@22.19.17': + resolution: {integrity: sha512-wGdMcf+vPYM6jikpS/qhg6WiqSV/OhG+jeeHT/KlVqxYfD40iYJf9/AE1uQxVWFvU7MipKRkRv8NSHiCGgPr8Q==} + + '@types/node@24.12.2': + resolution: {integrity: sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g==} + '@types/node@25.5.2': resolution: {integrity: sha512-tO4ZIRKNC+MDWV4qKVZe3Ql/woTnmHDr5JD8UI5hn2pwBrHEwOEMZK7WlNb5RKB6EoJ02gwmQS9OrjuFnZYdpg==} '@types/parse-json@4.0.2': resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} + '@types/plist@3.0.5': + resolution: {integrity: sha512-E6OCaRmAe4WDmWNsL/9RMqdkkzDCY1etutkflWk4c+AcjDU07Pcz1fQwTX0TQz+Pxqn9i4L1TU3UFpjnrcDgxA==} + '@types/prop-types@15.5.9': resolution: {integrity: sha512-Nha5b+jmBI271jdTMwrHiNXM+DvThjHOfyZtMX9kj/c/LUj2xiLHsG/1L3tJ8DjAoQN48cHwUwtqBotjyXaSdQ==} @@ -3130,6 +3453,9 @@ packages: '@types/react@16.1.0': resolution: {integrity: sha512-gXrB20mWBLrYGtkdf5fA6wL3FEXpY2Nz8OOgVn1qonp66JE4mqFXUigKD8CVDofQu+EsSy8G4UFRJAshFWMOvA==} + '@types/responselike@1.0.3': + resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} + '@types/retry@0.12.2': resolution: {integrity: sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==} @@ -3167,6 +3493,9 @@ packages: '@types/usb@1.5.4': resolution: {integrity: sha512-NOUza/8yuswu6RoECQyPHEjA34qpDaeONQ72fm+bCnnN2DJjDePAY+NsmV17H88oIlq4JlJ2mD5Kh5d6R2MwTQ==} + '@types/verror@1.10.11': + resolution: {integrity: sha512-RlDm9K7+o5stv0Co8i8ZRGxDbrTxhJtgjqjFyVh/tXQyl/rYtTKlnTvZ88oSTeYREWurwx20Js4kTuKCsFkUtg==} + '@types/w3c-web-usb@1.0.13': resolution: {integrity: sha512-N2nSl3Xsx8mRHZBvMSdNGtzMyeleTvtlEw+ujujgXalPqOjIA6UtrqcB6OzyUjkTbDm3J7P1RNK1lgoO7jxtsw==} @@ -3554,6 +3883,10 @@ packages: resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + abbrev@3.0.1: + resolution: {integrity: sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==} + engines: {node: ^18.17.0 || >=20.5.0} + abort-controller@3.0.0: resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} engines: {node: '>=6.5'} @@ -3697,6 +4030,16 @@ packages: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} + app-builder-bin@5.0.0-alpha.12: + resolution: {integrity: sha512-j87o0j6LqPL3QRr8yid6c+Tt5gC7xNfYo6uQIQkorAC6MpeayVMZrEDzKmJJ/Hlv7EnOQpaRm53k6ktDYZyB6w==} + + app-builder-lib@26.8.1: + resolution: {integrity: sha512-p0Im/Dx5C4tmz8QEE1Yn4MkuPC8PrnlRneMhWJj7BBXQfNTJUshM/bp3lusdEsDbvvfJZpXWnYesgSLvwtM2Zw==} + engines: {node: '>=14.0.0'} + peerDependencies: + dmg-builder: 26.8.1 + electron-builder-squirrel-windows: 26.8.1 + are-docs-informative@0.0.2: resolution: {integrity: sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==} engines: {node: '>=14'} @@ -3794,6 +4137,10 @@ packages: resolution: {integrity: sha512-uLvq6KJu04qoQM6gvBfKFjlh6Gl0vOKQuR5cJMDHQkmwfMOQeN3F3SHCv9SNYSL+CRoHvOGFfllDlVz03GQjvQ==} engines: {node: '>=12.0.0'} + assert-plus@1.0.0: + resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} + engines: {node: '>=0.8'} + assert@2.1.0: resolution: {integrity: sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==} @@ -3805,6 +4152,14 @@ packages: resolution: {integrity: sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==} engines: {node: '>=4'} + astral-regex@2.0.0: + resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} + engines: {node: '>=8'} + + async-exit-hook@2.0.1: + resolution: {integrity: sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==} + engines: {node: '>=0.12.0'} + async-function@1.0.0: resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} engines: {node: '>= 0.4'} @@ -3816,9 +4171,16 @@ packages: async@3.2.3: resolution: {integrity: sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==} + async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + at-least-node@1.0.0: + resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} + engines: {node: '>= 4.0.0'} + atob@2.1.2: resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==} engines: {node: '>= 4.5.0'} @@ -4049,6 +4411,9 @@ packages: bl@1.2.3: resolution: {integrity: sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==} + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + blockly@12.4.1: resolution: {integrity: sha512-OEF0r8cFMGDkQbX+PWTjifWTe9xi2QzpZS4rO2lYeQhZDWW3/eInklLSdoxAyEQCdfJhQqMTpBct13oDoc0GVQ==} engines: {node: '>=18'} @@ -4069,6 +4434,10 @@ packages: boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + boolean@3.2.0: + resolution: {integrity: sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + bowser@1.9.4: resolution: {integrity: sha512-9IdMmj2KjigRq6oWhmwv1W36pDuA4STQZ8q6YO9um+x07xgYNCD3Oou+WP/3L1HNz7iqythGet3/p4wvc8AAwQ==} @@ -4147,9 +4516,19 @@ packages: buffer-xor@1.0.3: resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==} + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + builder-util-runtime@9.5.1: + resolution: {integrity: sha512-qt41tMfgHTllhResqM5DcnHyDIWNgzHvuY2jDcYP9iaGpkWxTUzV6GQjDeLnlR1/DtdlcsWQbA7sByMpmJFTLQ==} + engines: {node: '>=12.0.0'} + + builder-util@26.8.1: + resolution: {integrity: sha512-pm1lTYbGyc90DHgCDO7eo8Rl4EqKLciayNbZqGziqnH9jrlKe8ZANGdityLZU+pJh16dfzjAx2xQq9McuIPEtw==} + builtin-status-codes@3.0.0: resolution: {integrity: sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==} @@ -4179,6 +4558,18 @@ packages: resolution: {integrity: sha512-B+L5iIa9mgcjLbliir2th36yEwPftrzteHYujzsx3dFP/31GCHcIeS8f5MGd80odLOjaOvSpU3EEAmRQptkxLQ==} engines: {node: ^16.14.0 || >=18.0.0} + cacache@19.0.1: + resolution: {integrity: sha512-hdsUxulXCi5STId78vRVYEtDAjq99ICAUktLTeTYsLoTE6Z8dS0c8pWNCxwdrk9YfJeobDZc2Y186hD/5ZQgFQ==} + engines: {node: ^18.17.0 || >=20.5.0} + + cacheable-lookup@5.0.4: + resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} + engines: {node: '>=10.6.0'} + + cacheable-request@7.0.4: + resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==} + engines: {node: '>=8'} + call-bind-apply-helpers@1.0.2: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} @@ -4273,10 +4664,17 @@ packages: engines: {node: '>=20'} hasBin: true + chromium-pickle-js@0.2.0: + resolution: {integrity: sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==} + ci-info@3.9.0: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} + ci-info@4.3.1: + resolution: {integrity: sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==} + engines: {node: '>=8'} + ci-info@4.4.0: resolution: {integrity: sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==} engines: {node: '>=8'} @@ -4311,6 +4709,14 @@ packages: resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} + + cli-truncate@2.1.0: + resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==} + engines: {node: '>=8'} + cli-truncate@4.0.0: resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} engines: {node: '>=18'} @@ -4331,6 +4737,13 @@ packages: resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} engines: {node: '>=6'} + clone-response@1.0.3: + resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} + + clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + co@4.6.0: resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} @@ -4390,6 +4803,10 @@ packages: commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + commander@5.1.0: + resolution: {integrity: sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==} + engines: {node: '>= 6'} + commander@6.2.1: resolution: {integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==} engines: {node: '>= 6'} @@ -4398,6 +4815,10 @@ packages: resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} engines: {node: '>= 12'} + commander@9.5.0: + resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} + engines: {node: ^12.20.0 || >=14} + comment-parser@1.4.1: resolution: {integrity: sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==} engines: {node: '>= 12.0.0'} @@ -4414,6 +4835,10 @@ packages: compare-func@2.0.0: resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} + compare-version@0.1.2: + resolution: {integrity: sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==} + engines: {node: '>=0.10.0'} + compare-versions@6.1.1: resolution: {integrity: sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==} @@ -4506,6 +4931,9 @@ packages: core-js@3.48.0: resolution: {integrity: sha512-zpEHTy1fjTMZCKLHUZoVeylt9XrzaIN2rbPXEt0k+q7JE5CkCZdo6bNq55bn24a69CH7ErAVLKijxJja4fw+UQ==} + core-util-is@1.0.2: + resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} + core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} @@ -4535,6 +4963,9 @@ packages: engines: {node: '>= 0.4.0'} hasBin: true + crc@3.8.0: + resolution: {integrity: sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==} + create-ecdh@4.0.4: resolution: {integrity: sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==} @@ -4544,6 +4975,9 @@ packages: create-hmac@1.1.7: resolution: {integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==} + cross-dirname@0.1.0: + resolution: {integrity: sha512-+R08/oI0nl3vfPcqftZRpytksBXDzOUveBq/NBVx0sUp1axwzPQrKinNx5yd5sxPu8j1wIy8AfnVQ+5eFdha6Q==} + cross-env@10.1.0: resolution: {integrity: sha512-GsYosgnACZTADcmEyJctkJIoqAhHjttw7RsFrVoJNXbsWWqaq6Ym+7kZjq6mS45O0jij6vtiReppKQEtqWy6Dw==} engines: {node: '>=20'} @@ -4692,6 +5126,10 @@ packages: resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} engines: {node: '>=0.10'} + decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + dedent@1.7.2: resolution: {integrity: sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==} peerDependencies: @@ -4715,6 +5153,13 @@ packages: resolution: {integrity: sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==} engines: {node: '>=18'} + defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + + defer-to-connect@2.0.1: + resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} + engines: {node: '>=10'} + define-data-property@1.1.4: resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} engines: {node: '>= 0.4'} @@ -4758,6 +5203,10 @@ packages: resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} engines: {node: '>=8'} + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + detect-newline@3.1.0: resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} engines: {node: '>=8'} @@ -4783,6 +5232,9 @@ packages: diffie-hellman@5.0.3: resolution: {integrity: sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==} + dir-compare@4.2.0: + resolution: {integrity: sha512-2xMCmOoMrdQIPHdsTawECdNPwlVFB9zGcz3kuhmBO6U3oU+UQjsue0i8ayLKpgBcm+hcXPMVSGUN9d+pvJ6+VQ==} + dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -4790,6 +5242,15 @@ packages: discontinuous-range@1.0.0: resolution: {integrity: sha512-c68LpLbO+7kP/b1Hr1qs8/BJ09F5khZGTxqxZuhzxpmwJKOgRFHJWIb9/KmqnqHhLdO55aOxFH/EGBvUQbL/RQ==} + dmg-builder@26.8.1: + resolution: {integrity: sha512-glMJgnTreo8CFINujtAhCgN96QAqApDMZ8Vl1r8f0QT8QprvC1UCltV4CcWj20YoIyLZx6IUskaJZ0NV8fokcg==} + + dmg-license@1.0.11: + resolution: {integrity: sha512-ZdzmqwKmECOWJpqefloC5OJy1+WZBBse5+MR88z9g9Zn4VY+WYUkAyojmhzJckH5YbbZGcYIuGAkY5/Ys5OM2Q==} + engines: {node: '>=8'} + os: [darwin] + hasBin: true + dns-packet@5.6.1: resolution: {integrity: sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==} engines: {node: '>=6'} @@ -4867,6 +5328,14 @@ packages: resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} engines: {node: '>=8'} + dotenv-expand@11.0.7: + resolution: {integrity: sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==} + engines: {node: '>=12'} + + dotenv@16.6.1: + resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} + engines: {node: '>=12'} + dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} @@ -4880,9 +5349,34 @@ packages: ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - electron-to-chromium@1.5.307: - resolution: {integrity: sha512-5z3uFKBWjiNR44nFcYdkcXjKMbg5KXNdciu7mhTPo9tB7NbqSNP2sSnGR+fqknZSCwKkBN+oxiiajWs4dT6ORg==} - + ejs@3.1.10: + resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} + engines: {node: '>=0.10.0'} + hasBin: true + + electron-builder-squirrel-windows@26.8.1: + resolution: {integrity: sha512-o288fIdgPLHA76eDrFADHPoo7VyGkDCYbLV1GzndaMSAVBoZrGvM9m2IehdcVMzdAZJ2eV9bgyissQXHv5tGzA==} + + electron-builder@26.8.1: + resolution: {integrity: sha512-uWhx1r74NGpCagG0ULs/P9Nqv2nsoo+7eo4fLUOB8L8MdWltq9odW/uuLXMFCDGnPafknYLZgjNX0ZIFRzOQAw==} + engines: {node: '>=14.0.0'} + hasBin: true + + electron-publish@26.8.1: + resolution: {integrity: sha512-q+jrSTIh/Cv4eGZa7oVR+grEJo/FoLMYBAnSL5GCtqwUpr1T+VgKB/dn1pnzxIxqD8S/jP1yilT9VrwCqINR4w==} + + electron-to-chromium@1.5.307: + resolution: {integrity: sha512-5z3uFKBWjiNR44nFcYdkcXjKMbg5KXNdciu7mhTPo9tB7NbqSNP2sSnGR+fqknZSCwKkBN+oxiiajWs4dT6ORg==} + + electron-winstaller@5.4.0: + resolution: {integrity: sha512-bO3y10YikuUwUuDUQRM4KfwNkKhnpVO7IPdbsrejwN9/AABJzzTQ4GeHwyzNSrVO+tEH3/Np255a3sVZpZDjvg==} + engines: {node: '>=8.0.0'} + + electron@41.2.0: + resolution: {integrity: sha512-0OKLiymqfV0WK68RBXqAm3Myad2TpI5wwxLCBEUcH5Nugo3YfSk7p1Js/AL9266qTz5xZioUnxt9hG8FFwax0g==} + engines: {node: '>= 12.20.55'} + hasBin: true + elliptic@6.6.1: resolution: {integrity: sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==} @@ -5034,9 +5528,22 @@ packages: es-toolkit@1.45.1: resolution: {integrity: sha512-/jhoOj/Fx+A+IIyDNOvO3TItGmlMKhtX8ISAHKE90c4b/k1tqaqEZ+uUqfpU8DMnW5cgNJv606zS55jGvza0Xw==} + es6-error@4.1.1: + resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} + es6-object-assign@1.1.0: resolution: {integrity: sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==} + esbuild-loader@4.4.3: + resolution: {integrity: sha512-Wpui03EzqC151xFteKlgJQhbyZl5CgnBpUHXVuao02nItULlkaTeiLdEMPTmR2zdwpEBWkXVNoT5dDOYJluUzg==} + peerDependencies: + webpack: ^4.40.0 || ^5.0.0 + + esbuild@0.27.7: + resolution: {integrity: sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==} + engines: {node: '>=18'} + hasBin: true + escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} @@ -5353,6 +5860,10 @@ packages: engines: {node: '>= 10.17.0'} hasBin: true + extsprintf@1.4.1: + resolution: {integrity: sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==} + engines: {'0': node >=0.6.0} + falafel@2.2.5: resolution: {integrity: sha512-HuC1qF9iTnHDnML9YZAdCDQwT0yKl/U55K4XSUXqGAA2GLoafFgWRqdAbhWJxXaYD4pyoVxAJ8wH670jMpI9DQ==} engines: {node: '>=0.4.0'} @@ -5430,6 +5941,9 @@ packages: peerDependencies: webpack: ^4.0.0 || ^5.0.0 + filelist@1.0.6: + resolution: {integrity: sha512-5giy2PkLYY1cP39p17Ech+2xlpTRL9HLspOfEgm0L6CwBXBTgsK5ou0JtzYuepxkaQ/tvhCFIJ5uXo0OrM2DxA==} + filename-regex@2.0.1: resolution: {integrity: sha512-BTCqyBaWBTsauvnHiE8i562+EdJj+oUpkqWp2R1iCoR8f6oo8STRu3of7WJJ0TqWtxN50a5YFpzYK4Jj9esYfQ==} engines: {node: '>=0.10.0'} @@ -5581,6 +6095,14 @@ packages: fromentries@1.3.2: resolution: {integrity: sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==} + fs-extra@10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} + + fs-extra@11.3.4: + resolution: {integrity: sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA==} + engines: {node: '>=14.14'} + fs-extra@7.0.1: resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} engines: {node: '>=6 <7 || >=8'} @@ -5589,6 +6111,10 @@ packages: resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} engines: {node: '>=6 <7 || >=8'} + fs-extra@9.1.0: + resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} + engines: {node: '>=10'} + fs-minipass@2.1.0: resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} engines: {node: '>= 8'} @@ -5667,6 +6193,9 @@ packages: resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} engines: {node: '>= 0.4'} + get-tsconfig@4.13.7: + resolution: {integrity: sha512-7tN6rFgBlMgpBML5j8typ92BKFi2sFQvIdpAqLA2beia5avZDrMs0FLZiM5etShWq5irVyGcGMEA1jcDaK7A/Q==} + get-uri@6.0.5: resolution: {integrity: sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==} engines: {node: '>= 14'} @@ -5729,6 +6258,10 @@ packages: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + global-agent@3.0.0: + resolution: {integrity: sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==} + engines: {node: '>=10.0'} + global-directory@4.0.1: resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==} engines: {node: '>=18'} @@ -5764,6 +6297,10 @@ packages: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} + got@11.8.6: + resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==} + engines: {node: '>=10.19.0'} + graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} @@ -5851,6 +6388,10 @@ packages: hosted-git-info@2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + hosted-git-info@4.1.0: + resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} + engines: {node: '>=10'} + hosted-git-info@7.0.2: resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==} engines: {node: ^16.14.0 || >=18.0.0} @@ -5942,6 +6483,10 @@ packages: resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} engines: {node: '>=8.0.0'} + http2-wrapper@1.0.3: + resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} + engines: {node: '>=10.19.0'} + https-browserify@1.0.0: resolution: {integrity: sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==} @@ -5977,6 +6522,11 @@ packages: hyphenate-style-name@1.1.0: resolution: {integrity: sha512-WDC/ui2VVRrz3jOVi+XtjqkDjiVjTtFaAGiW37k6b+ohyQ5wYDOGkvCZa8+H0nx3gyvv0+BST9xuOgIyGQ00gw==} + iconv-corefoundation@1.1.7: + resolution: {integrity: sha512-T10qvkw0zz4wnm560lOEg0PovVqUXuOFhhHAkixw8/sycy7TJt7v/RrkEKEQnAw2viPSJu6iAkErxnzR0g8PpQ==} + engines: {node: ^8.11.2 || >=10} + os: [darwin] + iconv-lite@0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} @@ -6269,6 +6819,10 @@ packages: engines: {node: '>=14.16'} hasBin: true + is-interactive@1.0.0: + resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} + engines: {node: '>=8'} + is-lambda@1.0.1: resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==} @@ -6374,6 +6928,10 @@ packages: resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} engines: {node: '>= 0.4'} + is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + is-url@1.2.4: resolution: {integrity: sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==} @@ -6413,6 +6971,14 @@ packages: isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + isbinaryfile@4.0.10: + resolution: {integrity: sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==} + engines: {node: '>= 8.0.0'} + + isbinaryfile@5.0.7: + resolution: {integrity: sha512-gnWD14Jh3FzS3CPhF0AxNOJ8CxqeblPTADzI38r0wt8ZyQl5edpy75myt08EG2oKvpyiqSqsx+Wkz9vtkbTqYQ==} + engines: {node: '>= 18.0.0'} + isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} @@ -6472,6 +7038,11 @@ packages: resolution: {integrity: sha512-ykkVRwrYvFm1nb2AJfKKYPr0emF6IiXDYUaFx4Zn9ZuIH7MrzEZ3sD5RlqGXNRpHtvUHJyOnCEFxOlNDtGo7wg==} engines: {node: 20 || >=22} + jake@10.9.4: + resolution: {integrity: sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==} + engines: {node: '>=10'} + hasBin: true + jest-canvas-mock@2.3.1: resolution: {integrity: sha512-5FnSZPrX3Q2ZfsbYNE3wqKR3+XorN8qFzDzB5o0golWgt6EOX1+emBnpOc9IAQ+NXFj8Nzm3h7ZdE/9H0ylBcg==} @@ -6750,6 +7321,9 @@ packages: json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + json5@1.0.2: resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} hasBin: true @@ -6770,6 +7344,9 @@ packages: jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + jsonfile@6.2.0: + resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} + jsonparse@1.3.1: resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} engines: {'0': node >= 0.2.0} @@ -6802,6 +7379,9 @@ packages: launch-editor@2.13.1: resolution: {integrity: sha512-lPSddlAAluRKJ7/cjRFoXUFzaX7q/YKI7yPHuEvSJVqoXvFnJov1/Ud87Aa4zULIbA9Nja4mSPK8l0z/7eV2wA==} + lazy-val@1.0.5: + resolution: {integrity: sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==} + leven@3.1.0: resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} engines: {node: '>=6'} @@ -6926,6 +7506,10 @@ packages: lodash@4.17.23: resolution: {integrity: sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==} + log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + lookup-closest-locale@6.2.0: resolution: {integrity: sha512-/c2kL+Vnp1jnV6K6RpDTHK3dgg0Tu2VVp+elEiJpjfS1UyY7AjOYHohRug6wT0OpoX2qFgNORndE9RqesfVxWQ==} @@ -6936,6 +7520,10 @@ packages: lower-case@2.0.2: resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + lowercase-keys@2.0.0: + resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} + engines: {node: '>=8'} + lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} @@ -6946,6 +7534,10 @@ packages: lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + lru-cache@7.18.3: resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} engines: {node: '>=12'} @@ -6971,12 +7563,20 @@ packages: resolution: {integrity: sha512-cKTUFc/rbKUd/9meOvgrpJ2WrNzymt6jfRDdwg5UCnVzv9dTpEj9JS5m3wtziXVCjluIXyL8pcaukYqezIzZQA==} engines: {node: ^16.14.0 || >=18.0.0} + make-fetch-happen@14.0.3: + resolution: {integrity: sha512-QMjGbFTP0blj97EeidG5hk/QhKQ3T4ICckQGLgz38QF7Vgbk6e6FTARN8KhKxyBbWn8R0HU+bnw8aSoFPD4qtQ==} + engines: {node: ^18.17.0 || >=20.5.0} + makeerror@1.0.12: resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} map-limit@0.0.1: resolution: {integrity: sha512-pJpcfLPnIF/Sk3taPW21G/RQsEEirGaFpCW3oXRwH9dnFHPHNGjNyvh++rdmC2fNqEaTw2MhYJraoJWAHx8kEg==} + matcher@3.0.0: + resolution: {integrity: sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==} + engines: {node: '>=10'} + matchmediaquery@0.3.1: resolution: {integrity: sha512-Hlk20WQHRIm9EE9luN1kjRjYXAQToHOIAHPJn9buxBwuhfTHoKUcX+lXBbxc85DVQfXYbEQ4HcwQdd128E3qHQ==} @@ -7074,6 +7674,14 @@ packages: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} + mimic-response@1.0.1: + resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} + engines: {node: '>=4'} + + mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + min-document@2.19.2: resolution: {integrity: sha512-8S5I8db/uZN8r9HSLFVWPdJCvYOejMcEC82VIzNUc6Zkklf/d1gg2psfE79/vyhWOj4+J8MtwmoOz3TmvaGu5A==} @@ -7096,6 +7704,10 @@ packages: minimatch@3.1.5: resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} + minimatch@5.1.9: + resolution: {integrity: sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==} + engines: {node: '>=10'} + minimatch@9.0.9: resolution: {integrity: sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==} engines: {node: '>=16 || 14 >=14.17'} @@ -7111,6 +7723,10 @@ packages: resolution: {integrity: sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + minipass-fetch@4.0.1: + resolution: {integrity: sha512-j7U11C5HXigVuutxebFadoYBbd7VSdZWggSe64NVdvWNBqGAiXPL2QVCehjmw7lY1oF9gOllYbORh+hiNgfPgQ==} + engines: {node: ^18.17.0 || >=20.5.0} + minipass-flush@1.0.5: resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} engines: {node: '>= 8'} @@ -7211,6 +7827,10 @@ packages: resolution: {integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==} engines: {node: '>= 0.6'} + negotiator@1.0.0: + resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} + engines: {node: '>= 0.6'} + neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} @@ -7224,6 +7844,16 @@ packages: no-case@3.0.4: resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + node-abi@4.28.0: + resolution: {integrity: sha512-Qfp5XZL1cJDOabOT8H5gnqMTmM4NjvYzHp4I/Kt/Sl76OVkOBBHRFlPspGV0hYvMoqQsypFjT/Yp7Km0beXW9g==} + engines: {node: '>=22.12.0'} + + node-addon-api@1.7.2: + resolution: {integrity: sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==} + + node-api-version@0.2.1: + resolution: {integrity: sha512-2xP/IGGMmmSQpI1+O/k72jF/ykvZ89JeuKX3TLJAYPDVLUalrshrLHkeVcCCZqG/eEa635cr8IBYzgnDvM2O8Q==} + node-domexception@1.0.0: resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} engines: {node: '>=10.5.0'} @@ -7257,6 +7887,11 @@ packages: engines: {node: ^16.14.0 || >=18.0.0} hasBin: true + node-gyp@11.5.0: + resolution: {integrity: sha512-ra7Kvlhxn5V9Slyus0ygMa2h+UqExPqUIkfk7Pc8QTLT956JLSy51uWFwHtIYy0vI8cB4BDhc/S03+880My/LQ==} + engines: {node: ^18.17.0 || >=20.5.0} + hasBin: true + node-int64@0.4.0: resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} @@ -7277,6 +7912,11 @@ packages: engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} hasBin: true + nopt@8.1.0: + resolution: {integrity: sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==} + engines: {node: ^18.17.0 || >=20.5.0} + hasBin: true + normalize-package-data@2.5.0: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} @@ -7296,6 +7936,10 @@ packages: resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} engines: {node: '>=0.10.0'} + normalize-url@6.1.0: + resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} + engines: {node: '>=10'} + npm-bundled@3.0.1: resolution: {integrity: sha512-+AvaheE/ww1JEwRHOrn4WHNzOxGtVp+adrg2AeZS/7KuxGUYFuBta98wYpfHBbJp6Tg6j1NKSEVHNcfZzJHQwQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -7430,6 +8074,10 @@ packages: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} + ora@5.4.1: + resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} + engines: {node: '>=10'} + os-browserify@0.3.0: resolution: {integrity: sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==} @@ -7444,6 +8092,10 @@ packages: resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} engines: {node: '>= 0.4'} + p-cancelable@2.1.1: + resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} + engines: {node: '>=8'} + p-filter@2.1.0: resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} engines: {node: '>=8'} @@ -7488,6 +8140,10 @@ packages: resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} engines: {node: '>=10'} + p-map@7.0.4: + resolution: {integrity: sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==} + engines: {node: '>=18'} + p-queue@3.0.0: resolution: {integrity: sha512-2tv/MRmPXfmfnjLLJAHl+DdU8p2DhZafAnlpm/C/T5BpF5L9wKz5tMin4A4N2zVpJL2YMhPlRmtO7s5EtNrjfA==} engines: {node: '>=6'} @@ -7644,6 +8300,10 @@ packages: resolution: {integrity: sha512-Q3CG/cYvCO1ye4QKkuH7EXxs3VC/rI1/trd+qX2+PolbaKG0H+bgcZzrTt96mMyRtejk+JMCiLUn3y29W8qmFQ==} engines: {node: '>= 0.10'} + pe-library@0.4.1: + resolution: {integrity: sha512-eRWB5LBz7PpDu4PUlwT0PhnQfTQJlDDdPa35urV4Osrm0t0AqQFGn+UIkU3klZvwJ8KPO3VbBFsXquA6p6kqZw==} + engines: {node: '>=12', npm: '>=6'} + pend@1.2.0: resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} @@ -7704,6 +8364,10 @@ packages: engines: {node: '>=12'} hasBin: true + plist@3.1.0: + resolution: {integrity: sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==} + engines: {node: '>=10.4.0'} + pngjs@5.0.0: resolution: {integrity: sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==} engines: {node: '>=10.13.0'} @@ -7773,6 +8437,11 @@ packages: resolution: {integrity: sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==} engines: {node: ^10 || ^12 || >=14} + postject@1.0.0-alpha.6: + resolution: {integrity: sha512-b9Eb8h2eVqNE8edvKdwqkrY6O7kAwmI8kcnBv1NScolYJbo59XUF0noFq+lxbC1yN20bmC0WBEbDC5H/7ASb0A==} + engines: {node: '>=14.0.0'} + hasBin: true + prelude-ls@1.1.2: resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} engines: {node: '>= 0.8.0'} @@ -7817,6 +8486,10 @@ packages: resolution: {integrity: sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + proc-log@5.0.0: + resolution: {integrity: sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==} + engines: {node: ^18.17.0 || >=20.5.0} + process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} @@ -7920,6 +8593,10 @@ packages: queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + quick-lru@5.1.1: + resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} + engines: {node: '>=10'} + quote-stream@1.0.2: resolution: {integrity: sha512-kKr2uQ2AokadPjvTyKJQad9xELbZwYzWlNfI3Uz2j/ib5u6H9lDP7fUUR//rMycd0gv4Z5P1qXMfXR8YpIxrjQ==} hasBin: true @@ -8097,6 +8774,10 @@ packages: resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} engines: {node: '>=0.10.0'} + read-binary-file-arch@1.0.6: + resolution: {integrity: sha512-BNg9EN3DD3GsDXX7Aa8O4p92sryjkmzYYgmgTAc6CA4uGLEDzFfxOxugu21akOxpcXHiEgsYkC6nPsQvLLLmEg==} + hasBin: true + read-cache@1.0.0: resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} @@ -8242,10 +8923,17 @@ packages: requires-port@1.0.0: resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + resedit@1.7.2: + resolution: {integrity: sha512-vHjcY2MlAITJhC0eRD/Vv8Vlgmu9Sd3LX9zZvtGzU5ZImdTN3+d6e/4mnTyV8vEbyf1sgNIrWxhWlrys52OkEA==} + engines: {node: '>=12', npm: '>=6'} + reserved-identifiers@1.2.0: resolution: {integrity: sha512-yE7KUfFvaBFzGPs5H3Ops1RevfUEsDc5Iz65rOwWg4lE8HJSYtle77uul3+573457oHvBKuHYDl/xqUkKpEEdw==} engines: {node: '>=18'} + resolve-alpn@1.2.1: + resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} + resolve-cwd@3.0.0: resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} engines: {node: '>=8'} @@ -8262,6 +8950,9 @@ packages: resolution: {integrity: sha512-gLWKdA5tiv5j/D7ipR47u3ovbVfzFPrctTdw2Ulnpmr6PPVVSvPKGNWu09jXVNlOSLLAeD6CA13bjIelpWttSw==} engines: {node: 20 || >=22} + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + resolve@1.22.11: resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==} engines: {node: '>= 0.4'} @@ -8272,6 +8963,9 @@ packages: engines: {node: '>= 0.4'} hasBin: true + responselike@2.0.1: + resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} + restore-cursor@3.1.0: resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} engines: {node: '>=8'} @@ -8325,6 +9019,10 @@ packages: resolution: {integrity: sha512-5Di9UC0+8h1L6ZD2d7awM7E/T4uA1fJRlx6zk/NvdCCVEoAnFqvHmCuNeIKoCeIixBX/q8uM+6ycDvF8woqosA==} engines: {node: '>= 0.8'} + roarr@2.15.4: + resolution: {integrity: sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==} + engines: {node: '>=8.0'} + rrweb-cssom@0.8.0: resolution: {integrity: sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==} @@ -8367,6 +9065,9 @@ packages: safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + sanitize-filename@1.6.4: + resolution: {integrity: sha512-9ZyI08PsvdQl2r/bBIGubpVdR3RR9sY6RDiWFPreA21C/EFlQhmgo20UZlNjZMMZNubusLhAQozkA0Od5J21Eg==} + sanitize-html-react@1.13.0: resolution: {integrity: sha512-EDoOqPd2wrJEV6px8XvWEx7b+JNIoka3mI4fdBVa6S/de9b+UnmzKsVqBkj93s+FwIaBv1fBuXiXkoVxmAU3MQ==} @@ -8415,6 +9116,9 @@ packages: resolution: {integrity: sha512-ftnu3TW4+3eBfLRFnDEkzGxSF/10BJBkaLJuBHZX0kiPS7bRdlpZGu6YGt4KngMkdTwJE6MbjavFpqHvqVt+Ew==} engines: {node: '>=18'} + semver-compare@1.0.0: + resolution: {integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==} + semver@5.5.0: resolution: {integrity: sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==} hasBin: true @@ -8436,6 +9140,10 @@ packages: resolution: {integrity: sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==} engines: {node: '>= 0.8.0'} + serialize-error@7.0.1: + resolution: {integrity: sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==} + engines: {node: '>=10'} + serialize-javascript@7.0.4: resolution: {integrity: sha512-DuGdB+Po43Q5Jxwpzt1lhyFSYKryqoNjQSA9M92tyw0lyHIOur+XCalOUe0KTJpyqzT8+fQ5A0Jf7vCx/NKmIg==} engines: {node: '>=20.0.0'} @@ -8534,6 +9242,10 @@ packages: resolution: {integrity: sha512-8G+/XDU8wNsJOQS5ysDVO0Etg9/2uA5gR9l4ZwijjlwxBcrU6RPfwi2+jJmbP+Ap1Hlp/nVAaEO4Fj22/SL2gQ==} engines: {node: ^16.14.0 || >=18.0.0} + simple-update-notifier@2.0.0: + resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==} + engines: {node: '>=10'} + slash@2.0.0: resolution: {integrity: sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==} engines: {node: '>=6'} @@ -8546,6 +9258,10 @@ packages: resolution: {integrity: sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==} engines: {node: '>=6'} + slice-ansi@3.0.0: + resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==} + engines: {node: '>=8'} + slice-ansi@5.0.0: resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} engines: {node: '>=12'} @@ -8625,10 +9341,17 @@ packages: sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + sprintf-js@1.1.3: + resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} + ssri@10.0.6: resolution: {integrity: sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + ssri@12.0.0: + resolution: {integrity: sha512-S7iGNosepx9RadX82oimUkvr0Ct7IjJbEbs4mJcTxst8um95J3sDYU1RBEOvdu6oL1Wek2ODI5i4MAw+dZ6cAQ==} + engines: {node: ^18.17.0 || >=20.5.0} + stack-utils@2.0.6: resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} engines: {node: '>=10'} @@ -8636,6 +9359,10 @@ packages: startaudiocontext@1.2.1: resolution: {integrity: sha512-ooOQhOAoCwzMIRwWd9j7xF8kAMo1Wv7Zfw+q6dWDW5gxJUKx15HJXWDg89GMDqfdle9xsqPv+uioneX+bI643g==} + stat-mode@1.0.0: + resolution: {integrity: sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==} + engines: {node: '>= 6'} + static-eval@2.1.1: resolution: {integrity: sha512-MgWpQ/ZjGieSVB3eOJVs4OA2LT/q1vx98KPCTTQPzq/aLr0YUXTsgryTXr4SLfR0ZfUUCiedM9n/ABeDIyy4mA==} @@ -8770,6 +9497,10 @@ packages: peerDependencies: webpack: ^5.27.0 + sumchecker@3.0.1: + resolution: {integrity: sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==} + engines: {node: '>= 8.0'} + supports-color@2.0.0: resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==} engines: {node: '>=0.8.0'} @@ -8854,6 +9585,13 @@ packages: tcp-port-used@1.0.2: resolution: {integrity: sha512-l7ar8lLUD3XS1V2lfoJlCBaeoaWo/2xfYt81hM7VlvR4RrMVFqfmzfhLVk40hAb368uitje5gPtBRL1m/DGvLA==} + temp-file@3.4.0: + resolution: {integrity: sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg==} + + temp@0.9.4: + resolution: {integrity: sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA==} + engines: {node: '>=6.0.0'} + term-size@2.2.1: resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} engines: {node: '>=8'} @@ -8916,6 +9654,9 @@ packages: resolution: {integrity: sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==} engines: {node: '>=0.6.0'} + tiny-async-pool@1.3.0: + resolution: {integrity: sha512-01EAw5EDrcVrdgyCLgoSPvqznC0sVxDSVeiOz09FUpjh71G79VCqneOr+xvt7T1r76CF6ZZfPjHorN2+d+3mqA==} + tiny-inflate@1.0.3: resolution: {integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==} @@ -8944,6 +9685,9 @@ packages: resolution: {integrity: sha512-keinCnPbwXEUG3ilrWQZU+CqcTTzHq9m2HhoUP2l7Xmi8l1LuijAXLpAJ5zRW+ifKTNscs4NdCkfkDCBYm352w==} hasBin: true + tmp-promise@3.0.3: + resolution: {integrity: sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==} + tmp@0.0.30: resolution: {integrity: sha512-HXdTB7lvMwcb55XFfrTM8CPr/IYREk4hVBFaQ4b/6nInrluSL86hfHm7vu0luYKCfyBZp2trCjpc8caC3vVM3w==} engines: {node: '>=0.4.0'} @@ -8952,6 +9696,10 @@ packages: resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} engines: {node: '>=0.6.0'} + tmp@0.2.5: + resolution: {integrity: sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==} + engines: {node: '>=14.14'} + tmpl@1.0.5: resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} @@ -9019,6 +9767,9 @@ packages: resolution: {integrity: sha512-iGbM7X2slv9ORDVj2y2FFUq3cP/ypbtu2nQ8S38ufjL0glBABvmR9pTdsib1XtS2LUhhLMbelaBUaf/s5J3dSw==} engines: {node: '>= 8'} + truncate-utf8-bytes@1.0.2: + resolution: {integrity: sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==} + ts-api-utils@1.4.3: resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==} engines: {node: '>=16'} @@ -9116,6 +9867,10 @@ packages: resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} engines: {node: '>=4'} + type-fest@0.13.1: + resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} + engines: {node: '>=10'} + type-fest@0.21.3: resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} engines: {node: '>=10'} @@ -9186,6 +9941,12 @@ packages: resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} engines: {node: '>= 0.4'} + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + + undici-types@7.16.0: + resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} + undici-types@7.18.2: resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==} @@ -9219,14 +9980,26 @@ packages: resolution: {integrity: sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + unique-filename@4.0.0: + resolution: {integrity: sha512-XSnEewXmQ+veP7xX2dS5Q4yZAvO40cBN2MWkJ7D/6sW4Dg6wYBNwM1Vrnz1FhH5AdeLIlUXRI9e28z1YZi71NQ==} + engines: {node: ^18.17.0 || >=20.5.0} + unique-slug@4.0.0: resolution: {integrity: sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + unique-slug@5.0.0: + resolution: {integrity: sha512-9OdaqO5kwqR+1kVgHAhsp5vPNU0hnxRa26rBFNfNgM7M6pNtgzeBn3s/xbyCQL3dcjzOatcef6UUHpB/6MaETg==} + engines: {node: ^18.17.0 || >=20.5.0} + universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + unpipe@1.0.0: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} @@ -9247,6 +10020,9 @@ packages: resolution: {integrity: sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==} engines: {node: '>= 0.4'} + utf8-byte-length@1.0.5: + resolution: {integrity: sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==} + util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} @@ -9289,6 +10065,10 @@ packages: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} + verror@1.10.1: + resolution: {integrity: sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==} + engines: {node: '>=0.6.0'} + vlq@0.2.3: resolution: {integrity: sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow==} @@ -9319,6 +10099,9 @@ packages: wbuf@1.7.3: resolution: {integrity: sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==} + wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + web-audio-test-api@0.5.2: resolution: {integrity: sha512-RevLfVjp+wwe/dBPe361IpmNpeXXW6JVmlp8dk0YIxLwAh7evn6JpEQQalVgX4PH/jA8tpLpjD/8tFNUYTf88w==} @@ -9456,6 +10239,11 @@ packages: engines: {node: ^16.13.0 || >=18.0.0} hasBin: true + which@5.0.0: + resolution: {integrity: sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==} + engines: {node: ^18.17.0 || >=20.5.0} + hasBin: true + widest-line@5.0.0: resolution: {integrity: sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==} engines: {node: '>=18'} @@ -9539,6 +10327,10 @@ packages: resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} engines: {node: '>=4.0'} + xmlbuilder@15.1.1: + resolution: {integrity: sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==} + engines: {node: '>=8.0'} + xmlchars@2.2.0: resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} @@ -9602,6 +10394,8 @@ packages: snapshots: + 7zip-bin@5.2.0: {} + '@acemir/cssom@0.9.31': {} '@alcalzone/ansi-tokenize@0.1.3': @@ -10854,8 +11648,113 @@ snapshots: '@csstools/css-tokenizer@4.0.0': {} + '@develar/schema-utils@2.6.5': + dependencies: + ajv: 6.14.0 + ajv-keywords: 3.5.2(ajv@6.14.0) + '@discoveryjs/json-ext@0.6.3': {} + '@electron/asar@3.4.1': + dependencies: + commander: 5.1.0 + glob: 7.2.3 + minimatch: 3.1.5 + + '@electron/fuses@1.8.0': + dependencies: + chalk: 4.1.2 + fs-extra: 9.1.0 + minimist: 1.2.8 + + '@electron/get@2.0.3': + dependencies: + debug: 4.4.3 + env-paths: 2.2.1 + fs-extra: 8.1.0 + got: 11.8.6 + progress: 2.0.3 + semver: 6.3.1 + sumchecker: 3.0.1 + optionalDependencies: + global-agent: 3.0.0 + transitivePeerDependencies: + - supports-color + + '@electron/get@3.1.0': + dependencies: + debug: 4.4.3 + env-paths: 2.2.1 + fs-extra: 8.1.0 + got: 11.8.6 + progress: 2.0.3 + semver: 6.3.1 + sumchecker: 3.0.1 + optionalDependencies: + global-agent: 3.0.0 + transitivePeerDependencies: + - supports-color + + '@electron/notarize@2.5.0': + dependencies: + debug: 4.4.3 + fs-extra: 9.1.0 + promise-retry: 2.0.1 + transitivePeerDependencies: + - supports-color + + '@electron/osx-sign@1.3.3': + dependencies: + compare-version: 0.1.2 + debug: 4.4.3 + fs-extra: 10.1.0 + isbinaryfile: 4.0.10 + minimist: 1.2.8 + plist: 3.1.0 + transitivePeerDependencies: + - supports-color + + '@electron/rebuild@4.0.3': + dependencies: + '@malept/cross-spawn-promise': 2.0.0 + debug: 4.4.3 + detect-libc: 2.1.2 + got: 11.8.6 + graceful-fs: 4.2.11 + node-abi: 4.28.0 + node-api-version: 0.2.1 + node-gyp: 11.5.0 + ora: 5.4.1 + read-binary-file-arch: 1.0.6 + semver: 7.7.4 + tar: 7.5.10 + yargs: 17.7.2 + transitivePeerDependencies: + - supports-color + + '@electron/universal@2.0.3': + dependencies: + '@electron/asar': 3.4.1 + '@malept/cross-spawn-promise': 2.0.0 + debug: 4.4.3 + dir-compare: 4.2.0 + fs-extra: 11.3.4 + minimatch: 9.0.9 + plist: 3.1.0 + transitivePeerDependencies: + - supports-color + + '@electron/windows-sign@1.2.2': + dependencies: + cross-dirname: 0.1.0 + debug: 4.4.3 + fs-extra: 11.3.4 + minimist: 1.2.8 + postject: 1.0.0-alpha.6 + transitivePeerDependencies: + - supports-color + optional: true + '@emnapi/core@1.8.1': dependencies: '@emnapi/wasi-threads': 1.1.0 @@ -10892,53 +11791,131 @@ snapshots: '@es-joy/resolve.exports@1.2.0': {} - '@eslint-community/eslint-utils@4.9.1(eslint@9.39.2(jiti@2.6.1))': - dependencies: - eslint: 9.39.2(jiti@2.6.1) - eslint-visitor-keys: 3.4.3 + '@esbuild/aix-ppc64@0.27.7': + optional: true - '@eslint-community/regexpp@4.12.2': {} + '@esbuild/android-arm64@0.27.7': + optional: true - '@eslint/config-array@0.21.2': - dependencies: - '@eslint/object-schema': 2.1.7 - debug: 4.4.3 - minimatch: 3.1.5 - transitivePeerDependencies: - - supports-color + '@esbuild/android-arm@0.27.7': + optional: true - '@eslint/config-helpers@0.4.2': - dependencies: - '@eslint/core': 0.17.0 + '@esbuild/android-x64@0.27.7': + optional: true - '@eslint/core@0.17.0': - dependencies: - '@types/json-schema': 7.0.15 + '@esbuild/darwin-arm64@0.27.7': + optional: true - '@eslint/eslintrc@3.3.5': - dependencies: - ajv: 6.14.0 - debug: 4.4.3 - espree: 10.4.0 - globals: 14.0.0 - ignore: 5.3.2 - import-fresh: 3.3.1 - js-yaml: 4.1.1 - minimatch: 3.1.5 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color + '@esbuild/darwin-x64@0.27.7': + optional: true - '@eslint/js@9.39.2': {} + '@esbuild/freebsd-arm64@0.27.7': + optional: true - '@eslint/js@9.39.4': {} + '@esbuild/freebsd-x64@0.27.7': + optional: true - '@eslint/object-schema@2.1.7': {} + '@esbuild/linux-arm64@0.27.7': + optional: true - '@eslint/plugin-kit@0.4.1': - dependencies: - '@eslint/core': 0.17.0 - levn: 0.4.1 + '@esbuild/linux-arm@0.27.7': + optional: true + + '@esbuild/linux-ia32@0.27.7': + optional: true + + '@esbuild/linux-loong64@0.27.7': + optional: true + + '@esbuild/linux-mips64el@0.27.7': + optional: true + + '@esbuild/linux-ppc64@0.27.7': + optional: true + + '@esbuild/linux-riscv64@0.27.7': + optional: true + + '@esbuild/linux-s390x@0.27.7': + optional: true + + '@esbuild/linux-x64@0.27.7': + optional: true + + '@esbuild/netbsd-arm64@0.27.7': + optional: true + + '@esbuild/netbsd-x64@0.27.7': + optional: true + + '@esbuild/openbsd-arm64@0.27.7': + optional: true + + '@esbuild/openbsd-x64@0.27.7': + optional: true + + '@esbuild/openharmony-arm64@0.27.7': + optional: true + + '@esbuild/sunos-x64@0.27.7': + optional: true + + '@esbuild/win32-arm64@0.27.7': + optional: true + + '@esbuild/win32-ia32@0.27.7': + optional: true + + '@esbuild/win32-x64@0.27.7': + optional: true + + '@eslint-community/eslint-utils@4.9.1(eslint@9.39.2(jiti@2.6.1))': + dependencies: + eslint: 9.39.2(jiti@2.6.1) + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.2': {} + + '@eslint/config-array@0.21.2': + dependencies: + '@eslint/object-schema': 2.1.7 + debug: 4.4.3 + minimatch: 3.1.5 + transitivePeerDependencies: + - supports-color + + '@eslint/config-helpers@0.4.2': + dependencies: + '@eslint/core': 0.17.0 + + '@eslint/core@0.17.0': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/eslintrc@3.3.5': + dependencies: + ajv: 6.14.0 + debug: 4.4.3 + espree: 10.4.0 + globals: 14.0.0 + ignore: 5.3.2 + import-fresh: 3.3.1 + js-yaml: 4.1.1 + minimatch: 3.1.5 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@9.39.2': {} + + '@eslint/js@9.39.4': {} + + '@eslint/object-schema@2.1.7': {} + + '@eslint/plugin-kit@0.4.1': + dependencies: + '@eslint/core': 0.17.0 + levn: 0.4.1 '@exodus/bytes@1.15.0': {} @@ -11041,7 +12018,7 @@ snapshots: '@jest/console@30.3.0': dependencies: '@jest/types': 30.3.0 - '@types/node': 12.20.55 + '@types/node': 25.5.2 chalk: 4.1.2 jest-message-util: 30.3.0 jest-util: 30.3.0 @@ -11055,14 +12032,14 @@ snapshots: '@jest/test-result': 30.3.0 '@jest/transform': 30.3.0 '@jest/types': 30.3.0 - '@types/node': 12.20.55 + '@types/node': 25.5.2 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 4.4.0 exit-x: 0.2.2 graceful-fs: 4.2.11 jest-changed-files: 30.3.0 - jest-config: 30.3.0(@types/node@12.20.55) + jest-config: 30.3.0(@types/node@25.5.2) jest-haste-map: 30.3.0 jest-message-util: 30.3.0 jest-regex-util: 30.0.1 @@ -11090,7 +12067,7 @@ snapshots: '@jest/fake-timers': 30.3.0 '@jest/types': 30.3.0 '@types/jsdom': 21.1.7 - '@types/node': 12.20.55 + '@types/node': 25.5.2 jest-mock: 30.3.0 jest-util: 30.3.0 jsdom: 26.1.0(patch_hash=4725214219761e272bac827780047d8a6effa8b02b2c8516a14e1363bb08948b) @@ -11101,7 +12078,7 @@ snapshots: '@jest/fake-timers': 30.3.0 '@jest/types': 30.3.0 '@types/jsdom': 21.1.7 - '@types/node': 12.20.55 + '@types/node': 25.5.2 jest-mock: 30.3.0 jest-util: 30.3.0 jsdom: 28.1.0 @@ -11110,7 +12087,7 @@ snapshots: dependencies: '@jest/fake-timers': 30.3.0 '@jest/types': 30.3.0 - '@types/node': 12.20.55 + '@types/node': 25.5.2 jest-mock: 30.3.0 '@jest/expect-utils@29.7.0': @@ -11132,7 +12109,7 @@ snapshots: dependencies: '@jest/types': 30.3.0 '@sinonjs/fake-timers': 15.1.1 - '@types/node': 12.20.55 + '@types/node': 25.5.2 jest-message-util: 30.3.0 jest-mock: 30.3.0 jest-util: 30.3.0 @@ -11150,7 +12127,7 @@ snapshots: '@jest/pattern@30.0.1': dependencies: - '@types/node': 12.20.55 + '@types/node': 25.5.2 jest-regex-util: 30.0.1 '@jest/reporters@30.3.0': @@ -11161,7 +12138,7 @@ snapshots: '@jest/transform': 30.3.0 '@jest/types': 30.3.0 '@jridgewell/trace-mapping': 0.3.31 - '@types/node': 12.20.55 + '@types/node': 25.5.2 chalk: 4.1.2 collect-v8-coverage: 1.0.3 exit-x: 0.2.2 @@ -11246,7 +12223,7 @@ snapshots: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 12.20.55 + '@types/node': 25.5.2 '@types/yargs': 17.0.35 chalk: 4.1.2 @@ -11256,7 +12233,7 @@ snapshots: '@jest/schemas': 30.0.5 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 12.20.55 + '@types/node': 25.5.2 '@types/yargs': 17.0.35 chalk: 4.1.2 @@ -11418,6 +12395,19 @@ snapshots: '@leichtgewicht/ip-codec@2.0.5': {} + '@malept/cross-spawn-promise@2.0.0': + dependencies: + cross-spawn: 7.0.6 + + '@malept/flatpak-bundler@0.4.0': + dependencies: + debug: 4.4.3 + fs-extra: 9.1.0 + lodash: 4.17.23 + tmp-promise: 3.0.3 + transitivePeerDependencies: + - supports-color + '@manypkg/find-root@1.1.0': dependencies: '@babel/runtime': 7.28.6 @@ -11476,10 +12466,24 @@ snapshots: transitivePeerDependencies: - supports-color + '@npmcli/agent@3.0.0': + dependencies: + agent-base: 7.1.4 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + lru-cache: 10.4.3 + socks-proxy-agent: 8.0.5 + transitivePeerDependencies: + - supports-color + '@npmcli/fs@3.1.1': dependencies: semver: 7.7.4 + '@npmcli/fs@4.0.0': + dependencies: + semver: 7.7.4 + '@npmcli/git@5.0.8': dependencies: '@npmcli/promise-spawn': 7.0.2 @@ -11674,6 +12678,8 @@ snapshots: '@sindresorhus/base62@1.0.0': {} + '@sindresorhus/is@4.6.0': {} + '@sinonjs/commons@3.0.1': dependencies: type-detect: 4.0.8 @@ -11682,6 +12688,10 @@ snapshots: dependencies: '@sinonjs/commons': 3.0.1 + '@szmarczak/http-timer@4.0.6': + dependencies: + defer-to-connect: 2.0.1 + '@tapjs/after-each@4.0.0(@tapjs/core@4.0.0(@types/node@25.5.2)(react-dom@16.4.0(react@18.3.1))(react@18.3.1))': dependencies: '@tapjs/core': 4.0.0(@types/node@25.5.2)(react-dom@16.4.0(react@18.3.1))(react@18.3.1) @@ -11997,6 +13007,13 @@ snapshots: dependencies: '@types/node': 25.5.2 + '@types/cacheable-request@6.0.3': + dependencies: + '@types/http-cache-semantics': 4.2.0 + '@types/keyv': 3.1.4 + '@types/node': 22.19.17 + '@types/responselike': 1.0.3 + '@types/connect-history-api-fallback@1.5.4': dependencies: '@types/express-serve-static-core': 4.19.8 @@ -12008,6 +13025,10 @@ snapshots: '@types/css-tree@2.3.11': {} + '@types/debug@4.1.13': + dependencies: + '@types/ms': 2.1.0 + '@types/eslint-scope@3.7.7': dependencies: '@types/eslint': 9.6.1 @@ -12036,8 +13057,14 @@ snapshots: '@types/fastestsmallesttextencoderdecoder@1.0.2': {} + '@types/fs-extra@9.0.13': + dependencies: + '@types/node': 22.19.17 + '@types/html-minifier-terser@6.1.0': {} + '@types/http-cache-semantics@4.2.0': {} + '@types/http-errors@2.0.5': {} '@types/http-proxy@1.17.17': @@ -12068,13 +13095,13 @@ snapshots: '@types/jsdom@21.1.7': dependencies: - '@types/node': 12.20.55 + '@types/node': 25.5.2 '@types/tough-cookie': 4.0.5 parse5: 7.3.0 '@types/jsdom@28.0.0': dependencies: - '@types/node': 12.20.55 + '@types/node': 25.5.2 '@types/tough-cookie': 4.0.5 parse5: 7.3.0 undici-types: 7.22.0 @@ -12083,6 +13110,10 @@ snapshots: '@types/json5@0.0.29': {} + '@types/keyv@3.1.4': + dependencies: + '@types/node': 22.19.17 + '@types/lodash.bindall@4.4.9': dependencies: '@types/lodash': 4.17.24 @@ -12091,18 +13122,34 @@ snapshots: '@types/mime@1.3.5': {} + '@types/ms@2.1.0': {} + '@types/node-hid@1.3.4': dependencies: - '@types/node': 12.20.55 + '@types/node': 25.5.2 '@types/node@12.20.55': {} + '@types/node@22.19.17': + dependencies: + undici-types: 6.21.0 + + '@types/node@24.12.2': + dependencies: + undici-types: 7.16.0 + '@types/node@25.5.2': dependencies: undici-types: 7.18.2 '@types/parse-json@4.0.2': {} + '@types/plist@3.0.5': + dependencies: + '@types/node': 22.19.17 + xmlbuilder: 11.0.1 + optional: true + '@types/prop-types@15.5.9': {} '@types/qs@6.15.0': {} @@ -12124,6 +13171,10 @@ snapshots: '@types/react@16.1.0': {} + '@types/responselike@1.0.3': + dependencies: + '@types/node': 22.19.17 + '@types/retry@0.12.2': {} '@types/schema-utils@2.4.0': @@ -12164,7 +13215,10 @@ snapshots: '@types/usb@1.5.4': dependencies: - '@types/node': 12.20.55 + '@types/node': 25.5.2 + + '@types/verror@1.10.11': + optional: true '@types/w3c-web-usb@1.0.13': {} @@ -12184,7 +13238,7 @@ snapshots: '@types/yauzl@2.10.3': dependencies: - '@types/node': 12.20.55 + '@types/node': 25.5.2 optional: true '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@8.57.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': @@ -12599,6 +13653,8 @@ snapshots: abbrev@2.0.0: {} + abbrev@3.0.1: {} + abort-controller@3.0.0: dependencies: event-target-shim: 5.0.1 @@ -12730,6 +13786,51 @@ snapshots: normalize-path: 3.0.0 picomatch: 2.3.1 + app-builder-bin@5.0.0-alpha.12: {} + + app-builder-lib@26.8.1(dmg-builder@26.8.1)(electron-builder-squirrel-windows@26.8.1): + dependencies: + '@develar/schema-utils': 2.6.5 + '@electron/asar': 3.4.1 + '@electron/fuses': 1.8.0 + '@electron/get': 3.1.0 + '@electron/notarize': 2.5.0 + '@electron/osx-sign': 1.3.3 + '@electron/rebuild': 4.0.3 + '@electron/universal': 2.0.3 + '@malept/flatpak-bundler': 0.4.0 + '@types/fs-extra': 9.0.13 + async-exit-hook: 2.0.1 + builder-util: 26.8.1 + builder-util-runtime: 9.5.1 + chromium-pickle-js: 0.2.0 + ci-info: 4.3.1 + debug: 4.4.3 + dmg-builder: 26.8.1(electron-builder-squirrel-windows@26.8.1) + dotenv: 16.6.1 + dotenv-expand: 11.0.7 + ejs: 3.1.10 + electron-builder-squirrel-windows: 26.8.1(dmg-builder@26.8.1) + electron-publish: 26.8.1 + fs-extra: 10.1.0 + hosted-git-info: 4.1.0 + isbinaryfile: 5.0.7 + jiti: 2.6.1 + js-yaml: 4.1.1 + json5: 2.2.3 + lazy-val: 1.0.5 + minimatch: 10.2.4 + plist: 3.1.0 + proper-lockfile: 4.1.2 + resedit: 1.7.2 + semver: 7.7.4 + tar: 7.5.10 + temp-file: 3.4.0 + tiny-async-pool: 1.3.0 + which: 5.0.0 + transitivePeerDependencies: + - supports-color + are-docs-informative@0.0.2: {} arg@4.1.3: {} @@ -12869,6 +13970,9 @@ snapshots: pvutils: 1.1.5 tslib: 2.8.1 + assert-plus@1.0.0: + optional: true + assert@2.1.0: dependencies: call-bind: 1.0.8 @@ -12883,14 +13987,23 @@ snapshots: astral-regex@1.0.0: {} + astral-regex@2.0.0: + optional: true + + async-exit-hook@2.0.1: {} + async-function@1.0.0: {} async-hook-domain@4.0.1: {} async@3.2.3: {} + async@3.2.6: {} + asynckit@0.4.0: {} + at-least-node@1.0.0: {} + atob@2.1.2: {} audio-context@1.0.3: {} @@ -13234,6 +14347,12 @@ snapshots: readable-stream: 2.3.8 safe-buffer: 5.2.1 + bl@4.1.0: + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + blockly@12.4.1: dependencies: jsdom: 26.1.0(patch_hash=4725214219761e272bac827780047d8a6effa8b02b2c8516a14e1363bb08948b) @@ -13271,6 +14390,9 @@ snapshots: boolbase@1.0.0: {} + boolean@3.2.0: + optional: true + bowser@1.9.4: {} brace-expansion@1.1.12: @@ -13375,11 +14497,44 @@ snapshots: buffer-xor@1.0.3: {} + buffer@5.7.1: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + buffer@6.0.3: dependencies: base64-js: 1.5.1 ieee754: 1.2.1 + builder-util-runtime@9.5.1: + dependencies: + debug: 4.4.3 + sax: 1.5.0 + transitivePeerDependencies: + - supports-color + + builder-util@26.8.1: + dependencies: + 7zip-bin: 5.2.0 + '@types/debug': 4.1.13 + app-builder-bin: 5.0.0-alpha.12 + builder-util-runtime: 9.5.1 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.3 + fs-extra: 10.1.0 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + js-yaml: 4.1.1 + sanitize-filename: 1.6.4 + source-map-support: 0.5.21 + stat-mode: 1.0.0 + temp-file: 3.4.0 + tiny-async-pool: 1.3.0 + transitivePeerDependencies: + - supports-color + builtin-status-codes@3.0.0: {} bundle-name@4.1.0: @@ -13419,6 +14574,33 @@ snapshots: tar: 6.2.1 unique-filename: 3.0.0 + cacache@19.0.1: + dependencies: + '@npmcli/fs': 4.0.0 + fs-minipass: 3.0.3 + glob: 10.5.0 + lru-cache: 10.4.3 + minipass: 7.1.3 + minipass-collect: 2.0.1 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + p-map: 7.0.4 + ssri: 12.0.0 + tar: 7.5.10 + unique-filename: 4.0.0 + + cacheable-lookup@5.0.4: {} + + cacheable-request@7.0.4: + dependencies: + clone-response: 1.0.3 + get-stream: 5.2.0 + http-cache-semantics: 4.2.0 + keyv: 4.5.4 + lowercase-keys: 2.0.0 + normalize-url: 6.1.0 + responselike: 2.0.1 + call-bind-apply-helpers@1.0.2: dependencies: es-errors: 1.3.0 @@ -13534,8 +14716,12 @@ snapshots: - debug - supports-color + chromium-pickle-js@0.2.0: {} + ci-info@3.9.0: {} + ci-info@4.3.1: {} + ci-info@4.4.0: {} cipher-base@1.0.7: @@ -13564,6 +14750,14 @@ snapshots: dependencies: restore-cursor: 4.0.0 + cli-spinners@2.9.2: {} + + cli-truncate@2.1.0: + dependencies: + slice-ansi: 3.0.0 + string-width: 4.2.3 + optional: true + cli-truncate@4.0.0: dependencies: slice-ansi: 5.0.0 @@ -13588,6 +14782,12 @@ snapshots: kind-of: 6.0.3 shallow-clone: 3.0.1 + clone-response@1.0.3: + dependencies: + mimic-response: 1.0.1 + + clone@1.0.4: {} + co@4.6.0: {} code-excerpt@4.0.0: @@ -13632,10 +14832,15 @@ snapshots: commander@2.20.3: {} + commander@5.1.0: {} + commander@6.2.1: {} commander@8.3.0: {} + commander@9.5.0: + optional: true + comment-parser@1.4.1: {} commitlint-config-gitmoji@2.3.1: @@ -13658,6 +14863,8 @@ snapshots: array-ify: 1.0.0 dot-prop: 5.3.0 + compare-version@0.1.2: {} + compare-versions@6.1.1: {} compressible@2.0.18: @@ -13743,6 +14950,9 @@ snapshots: core-js@3.48.0: {} + core-util-is@1.0.2: + optional: true + core-util-is@1.0.3: {} cosmiconfig-typescript-loader@6.2.0(@types/node@25.5.2)(cosmiconfig@9.0.1(typescript@5.9.3))(typescript@5.9.3): @@ -13771,6 +14981,11 @@ snapshots: crc32@0.2.2: {} + crc@3.8.0: + dependencies: + buffer: 5.7.1 + optional: true + create-ecdh@4.0.4: dependencies: bn.js: 4.12.3 @@ -13793,6 +15008,9 @@ snapshots: safe-buffer: 5.2.1 sha.js: 2.4.12 + cross-dirname@0.1.0: + optional: true + cross-env@10.1.0: dependencies: '@epic-web/invariant': 1.0.0 @@ -13965,6 +15183,10 @@ snapshots: decode-uri-component@0.2.2: {} + decompress-response@6.0.0: + dependencies: + mimic-response: 3.1.0 + dedent@1.7.2: {} deep-is@0.1.4: {} @@ -13978,6 +15200,12 @@ snapshots: bundle-name: 4.1.0 default-browser-id: 5.0.1 + defaults@1.0.4: + dependencies: + clone: 1.0.4 + + defer-to-connect@2.0.1: {} + define-data-property@1.1.4: dependencies: es-define-property: 1.0.1 @@ -14017,6 +15245,8 @@ snapshots: detect-indent@6.1.0: {} + detect-libc@2.1.2: {} + detect-newline@3.1.0: {} detect-node@2.1.0: {} @@ -14035,12 +15265,42 @@ snapshots: miller-rabin: 4.0.1 randombytes: 2.1.0 + dir-compare@4.2.0: + dependencies: + minimatch: 3.1.5 + p-limit: 3.1.0 + dir-glob@3.0.1: dependencies: path-type: 4.0.0 discontinuous-range@1.0.0: {} + dmg-builder@26.8.1(electron-builder-squirrel-windows@26.8.1): + dependencies: + app-builder-lib: 26.8.1(dmg-builder@26.8.1)(electron-builder-squirrel-windows@26.8.1) + builder-util: 26.8.1 + fs-extra: 10.1.0 + iconv-lite: 0.6.3 + js-yaml: 4.1.1 + optionalDependencies: + dmg-license: 1.0.11 + transitivePeerDependencies: + - electron-builder-squirrel-windows + - supports-color + + dmg-license@1.0.11: + dependencies: + '@types/plist': 3.0.5 + '@types/verror': 1.10.11 + ajv: 6.14.0 + crc: 3.8.0 + iconv-corefoundation: 1.1.7 + plist: 3.1.0 + smart-buffer: 4.2.0 + verror: 1.10.1 + optional: true + dns-packet@5.6.1: dependencies: '@leichtgewicht/ip-codec': 2.0.5 @@ -14137,6 +15397,12 @@ snapshots: dependencies: is-obj: 2.0.0 + dotenv-expand@11.0.7: + dependencies: + dotenv: 16.6.1 + + dotenv@16.6.1: {} + dunder-proto@1.0.1: dependencies: call-bind-apply-helpers: 1.0.2 @@ -14151,8 +15417,70 @@ snapshots: ee-first@1.1.1: {} + ejs@3.1.10: + dependencies: + jake: 10.9.4 + + electron-builder-squirrel-windows@26.8.1(dmg-builder@26.8.1): + dependencies: + app-builder-lib: 26.8.1(dmg-builder@26.8.1)(electron-builder-squirrel-windows@26.8.1) + builder-util: 26.8.1 + electron-winstaller: 5.4.0 + transitivePeerDependencies: + - dmg-builder + - supports-color + + electron-builder@26.8.1(electron-builder-squirrel-windows@26.8.1): + dependencies: + app-builder-lib: 26.8.1(dmg-builder@26.8.1)(electron-builder-squirrel-windows@26.8.1) + builder-util: 26.8.1 + builder-util-runtime: 9.5.1 + chalk: 4.1.2 + ci-info: 4.4.0 + dmg-builder: 26.8.1(electron-builder-squirrel-windows@26.8.1) + fs-extra: 10.1.0 + lazy-val: 1.0.5 + simple-update-notifier: 2.0.0 + yargs: 17.7.2 + transitivePeerDependencies: + - electron-builder-squirrel-windows + - supports-color + + electron-publish@26.8.1: + dependencies: + '@types/fs-extra': 9.0.13 + builder-util: 26.8.1 + builder-util-runtime: 9.5.1 + chalk: 4.1.2 + form-data: 4.0.5 + fs-extra: 10.1.0 + lazy-val: 1.0.5 + mime: 2.6.0 + transitivePeerDependencies: + - supports-color + electron-to-chromium@1.5.307: {} + electron-winstaller@5.4.0: + dependencies: + '@electron/asar': 3.4.1 + debug: 4.4.3 + fs-extra: 7.0.1 + lodash: 4.17.23 + temp: 0.9.4 + optionalDependencies: + '@electron/windows-sign': 1.2.2 + transitivePeerDependencies: + - supports-color + + electron@41.2.0: + dependencies: + '@electron/get': 2.0.3 + '@types/node': 24.12.2 + extract-zip: 2.0.1 + transitivePeerDependencies: + - supports-color + elliptic@6.6.1: dependencies: bn.js: 4.12.3 @@ -14403,8 +15731,48 @@ snapshots: es-toolkit@1.45.1: {} + es6-error@4.1.1: + optional: true + es6-object-assign@1.1.0: {} + esbuild-loader@4.4.3(webpack@5.105.4): + dependencies: + esbuild: 0.27.7 + get-tsconfig: 4.13.7 + loader-utils: 2.0.4 + webpack: 5.105.4(webpack-cli@6.0.1) + webpack-sources: 3.3.4 + + esbuild@0.27.7: + optionalDependencies: + '@esbuild/aix-ppc64': 0.27.7 + '@esbuild/android-arm': 0.27.7 + '@esbuild/android-arm64': 0.27.7 + '@esbuild/android-x64': 0.27.7 + '@esbuild/darwin-arm64': 0.27.7 + '@esbuild/darwin-x64': 0.27.7 + '@esbuild/freebsd-arm64': 0.27.7 + '@esbuild/freebsd-x64': 0.27.7 + '@esbuild/linux-arm': 0.27.7 + '@esbuild/linux-arm64': 0.27.7 + '@esbuild/linux-ia32': 0.27.7 + '@esbuild/linux-loong64': 0.27.7 + '@esbuild/linux-mips64el': 0.27.7 + '@esbuild/linux-ppc64': 0.27.7 + '@esbuild/linux-riscv64': 0.27.7 + '@esbuild/linux-s390x': 0.27.7 + '@esbuild/linux-x64': 0.27.7 + '@esbuild/netbsd-arm64': 0.27.7 + '@esbuild/netbsd-x64': 0.27.7 + '@esbuild/openbsd-arm64': 0.27.7 + '@esbuild/openbsd-x64': 0.27.7 + '@esbuild/openharmony-arm64': 0.27.7 + '@esbuild/sunos-x64': 0.27.7 + '@esbuild/win32-arm64': 0.27.7 + '@esbuild/win32-ia32': 0.27.7 + '@esbuild/win32-x64': 0.27.7 + escalade@3.2.0: {} escape-html@1.0.3: {} @@ -14900,6 +16268,9 @@ snapshots: transitivePeerDependencies: - supports-color + extsprintf@1.4.1: + optional: true + falafel@2.2.5: dependencies: acorn: 7.4.1 @@ -14980,6 +16351,10 @@ snapshots: schema-utils: 3.3.0 webpack: 5.105.4(webpack-cli@6.0.1) + filelist@1.0.6: + dependencies: + minimatch: 5.1.9 + filename-regex@2.0.1: {} fill-range@2.2.4: @@ -15158,6 +16533,18 @@ snapshots: fromentries@1.3.2: {} + fs-extra@10.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.2.0 + universalify: 2.0.1 + + fs-extra@11.3.4: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.2.0 + universalify: 2.0.1 + fs-extra@7.0.1: dependencies: graceful-fs: 4.2.11 @@ -15170,6 +16557,13 @@ snapshots: jsonfile: 4.0.0 universalify: 0.1.2 + fs-extra@9.1.0: + dependencies: + at-least-node: 1.0.0 + graceful-fs: 4.2.11 + jsonfile: 6.2.0 + universalify: 2.0.1 + fs-minipass@2.1.0: dependencies: minipass: 3.3.6 @@ -15244,6 +16638,10 @@ snapshots: es-errors: 1.3.0 get-intrinsic: 1.3.0 + get-tsconfig@4.13.7: + dependencies: + resolve-pkg-maps: 1.0.0 + get-uri@6.0.5: dependencies: basic-ftp: 5.2.0 @@ -15328,6 +16726,16 @@ snapshots: once: 1.4.0 path-is-absolute: 1.0.1 + global-agent@3.0.0: + dependencies: + boolean: 3.2.0 + es6-error: 4.1.1 + matcher: 3.0.0 + roarr: 2.15.4 + semver: 7.7.4 + serialize-error: 7.0.1 + optional: true + global-directory@4.0.1: dependencies: ini: 4.1.1 @@ -15363,6 +16771,20 @@ snapshots: gopd@1.2.0: {} + got@11.8.6: + dependencies: + '@sindresorhus/is': 4.6.0 + '@szmarczak/http-timer': 4.0.6 + '@types/cacheable-request': 6.0.3 + '@types/responselike': 1.0.3 + cacheable-lookup: 5.0.4 + cacheable-request: 7.0.4 + decompress-response: 6.0.0 + http2-wrapper: 1.0.3 + lowercase-keys: 2.0.0 + p-cancelable: 2.1.1 + responselike: 2.0.1 + graceful-fs@4.2.11: {} grapheme-breaker@0.3.2: @@ -15450,6 +16872,10 @@ snapshots: hosted-git-info@2.8.9: {} + hosted-git-info@4.1.0: + dependencies: + lru-cache: 6.0.0 + hosted-git-info@7.0.2: dependencies: lru-cache: 10.4.3 @@ -15587,6 +17013,11 @@ snapshots: transitivePeerDependencies: - debug + http2-wrapper@1.0.3: + dependencies: + quick-lru: 5.1.1 + resolve-alpn: 1.2.1 + https-browserify@1.0.0: {} https-proxy-agent@5.0.1: @@ -15615,6 +17046,12 @@ snapshots: hyphenate-style-name@1.1.0: {} + iconv-corefoundation@1.1.7: + dependencies: + cli-truncate: 2.1.0 + node-addon-api: 1.7.2 + optional: true + iconv-lite@0.4.24: dependencies: safer-buffer: 2.1.2 @@ -15891,6 +17328,8 @@ snapshots: dependencies: is-docker: 3.0.0 + is-interactive@1.0.0: {} + is-lambda@1.0.1: {} is-map@2.0.3: {} @@ -15973,6 +17412,8 @@ snapshots: dependencies: which-typed-array: 1.1.20 + is-unicode-supported@0.1.0: {} + is-url@1.2.4: {} is-utf8@0.2.1: {} @@ -16006,6 +17447,10 @@ snapshots: isarray@2.0.5: {} + isbinaryfile@4.0.10: {} + + isbinaryfile@5.0.7: {} + isexe@2.0.0: {} isexe@3.1.5: {} @@ -16094,6 +17539,12 @@ snapshots: dependencies: '@isaacs/cliui': 9.0.0 + jake@10.9.4: + dependencies: + async: 3.2.6 + filelist: 1.0.6 + picocolors: 1.1.1 + jest-canvas-mock@2.3.1: dependencies: cssfontparser: 1.2.1 @@ -16116,7 +17567,7 @@ snapshots: '@jest/expect': 30.3.0 '@jest/test-result': 30.3.0 '@jest/types': 30.3.0 - '@types/node': 12.20.55 + '@types/node': 25.5.2 chalk: 4.1.2 co: 4.6.0 dedent: 1.7.2 @@ -16136,25 +17587,6 @@ snapshots: - babel-plugin-macros - supports-color - jest-cli@30.3.0(@types/node@12.20.55): - dependencies: - '@jest/core': 30.3.0 - '@jest/test-result': 30.3.0 - '@jest/types': 30.3.0 - chalk: 4.1.2 - exit-x: 0.2.2 - import-local: 3.2.0 - jest-config: 30.3.0(@types/node@12.20.55) - jest-util: 30.3.0 - jest-validate: 30.3.0 - yargs: 17.7.2 - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - esbuild-register - - supports-color - - ts-node - jest-cli@30.3.0(@types/node@25.5.2): dependencies: '@jest/core': 30.3.0 @@ -16174,37 +17606,6 @@ snapshots: - supports-color - ts-node - jest-config@30.3.0(@types/node@12.20.55): - dependencies: - '@babel/core': 7.29.0 - '@jest/get-type': 30.1.0 - '@jest/pattern': 30.0.1 - '@jest/test-sequencer': 30.3.0 - '@jest/types': 30.3.0 - babel-jest: 30.3.0(@babel/core@7.29.0) - chalk: 4.1.2 - ci-info: 4.4.0 - deepmerge: 4.3.1 - glob: 10.5.0 - graceful-fs: 4.2.11 - jest-circus: 30.3.0 - jest-docblock: 30.2.0 - jest-environment-node: 30.3.0 - jest-regex-util: 30.0.1 - jest-resolve: 30.3.0 - jest-runner: 30.3.0 - jest-util: 30.3.0 - jest-validate: 30.3.0 - parse-json: 5.2.0 - pretty-format: 30.3.0 - slash: 3.0.0 - strip-json-comments: 3.1.1 - optionalDependencies: - '@types/node': 12.20.55 - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - jest-config@30.3.0(@types/node@25.5.2): dependencies: '@babel/core': 7.29.0 @@ -16277,7 +17678,7 @@ snapshots: '@jest/environment': 30.3.0 '@jest/fake-timers': 30.3.0 '@jest/types': 30.3.0 - '@types/node': 12.20.55 + '@types/node': 25.5.2 jest-mock: 30.3.0 jest-util: 30.3.0 jest-validate: 30.3.0 @@ -16289,7 +17690,7 @@ snapshots: jest-haste-map@30.3.0: dependencies: '@jest/types': 30.3.0 - '@types/node': 12.20.55 + '@types/node': 25.5.2 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -16363,7 +17764,7 @@ snapshots: jest-mock@30.3.0: dependencies: '@jest/types': 30.3.0 - '@types/node': 12.20.55 + '@types/node': 25.5.2 jest-util: 30.3.0 jest-pnp-resolver@1.2.3(jest-resolve@30.3.0): @@ -16397,7 +17798,7 @@ snapshots: '@jest/test-result': 30.3.0 '@jest/transform': 30.3.0 '@jest/types': 30.3.0 - '@types/node': 12.20.55 + '@types/node': 25.5.2 chalk: 4.1.2 emittery: 0.13.1 exit-x: 0.2.2 @@ -16426,7 +17827,7 @@ snapshots: '@jest/test-result': 30.3.0 '@jest/transform': 30.3.0 '@jest/types': 30.3.0 - '@types/node': 12.20.55 + '@types/node': 25.5.2 chalk: 4.1.2 cjs-module-lexer: 2.2.0 collect-v8-coverage: 1.0.3 @@ -16473,7 +17874,7 @@ snapshots: jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 12.20.55 + '@types/node': 25.5.2 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -16482,7 +17883,7 @@ snapshots: jest-util@30.3.0: dependencies: '@jest/types': 30.3.0 - '@types/node': 12.20.55 + '@types/node': 25.5.2 chalk: 4.1.2 ci-info: 4.4.0 graceful-fs: 4.2.11 @@ -16510,7 +17911,7 @@ snapshots: dependencies: '@jest/test-result': 30.3.0 '@jest/types': 30.3.0 - '@types/node': 12.20.55 + '@types/node': 25.5.2 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -16525,25 +17926,12 @@ snapshots: jest-worker@30.3.0: dependencies: - '@types/node': 12.20.55 + '@types/node': 25.5.2 '@ungap/structured-clone': 1.3.0 jest-util: 30.3.0 merge-stream: 2.0.0 supports-color: 8.1.1 - jest@30.3.0(@types/node@12.20.55): - dependencies: - '@jest/core': 30.3.0 - '@jest/types': 30.3.0 - import-local: 3.2.0 - jest-cli: 30.3.0(@types/node@12.20.55) - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - esbuild-register - - supports-color - - ts-node - jest@30.3.0(@types/node@25.5.2): dependencies: '@jest/core': 30.3.0 @@ -16667,6 +18055,9 @@ snapshots: json-stable-stringify-without-jsonify@1.0.1: {} + json-stringify-safe@5.0.1: + optional: true + json5@1.0.2: dependencies: minimist: 1.2.8 @@ -16683,6 +18074,12 @@ snapshots: optionalDependencies: graceful-fs: 4.2.11 + jsonfile@6.2.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + jsonparse@1.3.1: {} jsx-ast-utils@3.3.5: @@ -16718,6 +18115,8 @@ snapshots: picocolors: 1.1.1 shell-quote: 1.8.3 + lazy-val@1.0.5: {} + leven@3.1.0: {} levn@0.3.0: @@ -16834,6 +18233,11 @@ snapshots: lodash@4.17.23: {} + log-symbols@4.1.0: + dependencies: + chalk: 4.1.2 + is-unicode-supported: 0.1.0 + lookup-closest-locale@6.2.0: {} loose-envify@1.4.0: @@ -16844,6 +18248,8 @@ snapshots: dependencies: tslib: 2.8.1 + lowercase-keys@2.0.0: {} + lru-cache@10.4.3: {} lru-cache@11.2.6: {} @@ -16852,6 +18258,10 @@ snapshots: dependencies: yallist: 3.1.1 + lru-cache@6.0.0: + dependencies: + yallist: 4.0.0 + lru-cache@7.18.3: {} lumen5-web-audio-test-api@0.5.2: {} @@ -16888,6 +18298,22 @@ snapshots: transitivePeerDependencies: - supports-color + make-fetch-happen@14.0.3: + dependencies: + '@npmcli/agent': 3.0.0 + cacache: 19.0.1 + http-cache-semantics: 4.2.0 + minipass: 7.1.3 + minipass-fetch: 4.0.1 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + negotiator: 1.0.0 + proc-log: 5.0.0 + promise-retry: 2.0.1 + ssri: 12.0.0 + transitivePeerDependencies: + - supports-color + makeerror@1.0.12: dependencies: tmpl: 1.0.5 @@ -16896,6 +18322,11 @@ snapshots: dependencies: once: 1.3.3 + matcher@3.0.0: + dependencies: + escape-string-regexp: 4.0.0 + optional: true + matchmediaquery@0.3.1: dependencies: css-mediaquery: 0.1.2 @@ -16995,6 +18426,10 @@ snapshots: mimic-fn@2.1.0: {} + mimic-response@1.0.1: {} + + mimic-response@3.1.0: {} + min-document@2.19.2: dependencies: dom-walk: 0.1.2 @@ -17019,6 +18454,10 @@ snapshots: dependencies: brace-expansion: 1.1.12 + minimatch@5.1.9: + dependencies: + brace-expansion: 2.0.2 + minimatch@9.0.9: dependencies: brace-expansion: 2.0.2 @@ -17037,6 +18476,14 @@ snapshots: optionalDependencies: encoding: 0.1.13 + minipass-fetch@4.0.1: + dependencies: + minipass: 7.1.3 + minipass-sized: 1.0.3 + minizlib: 3.1.0 + optionalDependencies: + encoding: 0.1.13 + minipass-flush@1.0.5: dependencies: minipass: 3.3.6 @@ -17116,6 +18563,8 @@ snapshots: negotiator@0.6.4: {} + negotiator@1.0.0: {} + neo-async@2.6.2: {} netmask@2.0.2: {} @@ -17127,6 +18576,17 @@ snapshots: lower-case: 2.0.2 tslib: 2.8.1 + node-abi@4.28.0: + dependencies: + semver: 7.7.4 + + node-addon-api@1.7.2: + optional: true + + node-api-version@0.2.1: + dependencies: + semver: 7.7.4 + node-domexception@1.0.0: {} node-environment-flags@1.0.6: @@ -17173,6 +18633,21 @@ snapshots: transitivePeerDependencies: - supports-color + node-gyp@11.5.0: + dependencies: + env-paths: 2.2.1 + exponential-backoff: 3.1.3 + graceful-fs: 4.2.11 + make-fetch-happen: 14.0.3 + nopt: 8.1.0 + proc-log: 5.0.0 + semver: 7.7.4 + tar: 7.5.10 + tinyglobby: 0.2.15 + which: 5.0.0 + transitivePeerDependencies: + - supports-color + node-int64@0.4.0: {} node-options-to-argv@1.0.0: {} @@ -17211,6 +18686,10 @@ snapshots: dependencies: abbrev: 2.0.0 + nopt@8.1.0: + dependencies: + abbrev: 3.0.1 + normalize-package-data@2.5.0: dependencies: hosted-git-info: 2.8.9 @@ -17232,6 +18711,8 @@ snapshots: normalize-range@0.1.2: {} + normalize-url@6.1.0: {} + npm-bundled@3.0.1: dependencies: npm-normalize-package-bin: 3.0.1 @@ -17402,6 +18883,18 @@ snapshots: type-check: 0.4.0 word-wrap: 1.2.5 + ora@5.4.1: + dependencies: + bl: 4.1.0 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-spinners: 2.9.2 + is-interactive: 1.0.0 + is-unicode-supported: 0.1.0 + log-symbols: 4.1.0 + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + os-browserify@0.3.0: {} os-tmpdir@1.0.2: {} @@ -17414,6 +18907,8 @@ snapshots: object-keys: 1.1.1 safe-push-apply: 1.0.0 + p-cancelable@2.1.1: {} + p-filter@2.1.0: dependencies: p-map: 2.1.0 @@ -17456,6 +18951,8 @@ snapshots: dependencies: aggregate-error: 3.1.0 + p-map@7.0.4: {} + p-queue@3.0.0: {} p-retry@6.2.1: @@ -17639,6 +19136,8 @@ snapshots: sha.js: 2.4.12 to-buffer: 1.2.2 + pe-library@0.4.1: {} + pend@1.2.0: {} performance-now@2.1.0: {} @@ -17703,6 +19202,12 @@ snapshots: - supports-color - utf-8-validate + plist@3.1.0: + dependencies: + '@xmldom/xmldom': 0.8.11 + base64-js: 1.5.1 + xmlbuilder: 15.1.1 + pngjs@5.0.0: {} pngjs@7.0.0: {} @@ -17767,6 +19272,11 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 + postject@1.0.0-alpha.6: + dependencies: + commander: 9.5.0 + optional: true + prelude-ls@1.1.2: {} prelude-ls@1.2.1: {} @@ -17809,6 +19319,8 @@ snapshots: proc-log@4.2.0: {} + proc-log@5.0.0: {} + process-nextick-args@2.0.1: {} process-on-spawn@1.1.0: @@ -17921,6 +19433,8 @@ snapshots: queue-microtask@1.2.3: {} + quick-lru@5.1.1: {} + quote-stream@1.0.2: dependencies: buffer-equal: 0.0.1 @@ -18162,6 +19676,12 @@ snapshots: dependencies: loose-envify: 1.4.0 + read-binary-file-arch@1.0.6: + dependencies: + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + read-cache@1.0.0: dependencies: pify: 2.3.0 @@ -18338,8 +19858,14 @@ snapshots: requires-port@1.0.0: {} + resedit@1.7.2: + dependencies: + pe-library: 0.4.1 + reserved-identifiers@1.2.0: {} + resolve-alpn@1.2.1: {} + resolve-cwd@3.0.0: dependencies: resolve-from: 5.0.0 @@ -18353,6 +19879,8 @@ snapshots: glob: 13.0.6 walk-up-path: 4.0.0 + resolve-pkg-maps@1.0.0: {} + resolve@1.22.11: dependencies: is-core-module: 2.16.1 @@ -18368,6 +19896,10 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 + responselike@2.0.1: + dependencies: + lowercase-keys: 2.0.0 + restore-cursor@3.1.0: dependencies: onetime: 5.1.2 @@ -18413,6 +19945,16 @@ snapshots: hash-base: 3.1.2 inherits: 2.0.4 + roarr@2.15.4: + dependencies: + boolean: 3.2.0 + detect-node: 2.1.0 + globalthis: 1.0.4 + json-stringify-safe: 5.0.1 + semver-compare: 1.0.0 + sprintf-js: 1.1.3 + optional: true + rrweb-cssom@0.8.0: {} rst-selector-parser@2.2.3: @@ -18457,6 +19999,10 @@ snapshots: safer-buffer@2.1.2: {} + sanitize-filename@1.6.4: + dependencies: + truncate-utf8-bytes: 1.0.2 + sanitize-html-react@1.13.0: dependencies: htmlparser2: 3.10.1 @@ -18520,6 +20066,9 @@ snapshots: '@peculiar/x509': 1.14.3 pkijs: 3.3.3 + semver-compare@1.0.0: + optional: true + semver@5.5.0: {} semver@5.7.2: {} @@ -18546,6 +20095,11 @@ snapshots: transitivePeerDependencies: - supports-color + serialize-error@7.0.1: + dependencies: + type-fest: 0.13.1 + optional: true + serialize-javascript@7.0.4: {} serve-index@1.9.2: @@ -18671,6 +20225,10 @@ snapshots: transitivePeerDependencies: - supports-color + simple-update-notifier@2.0.0: + dependencies: + semver: 7.7.4 + slash@2.0.0: {} slash@3.0.0: {} @@ -18681,6 +20239,13 @@ snapshots: astral-regex: 1.0.0 is-fullwidth-code-point: 2.0.0 + slice-ansi@3.0.0: + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + optional: true + slice-ansi@5.0.0: dependencies: ansi-styles: 6.2.3 @@ -18783,16 +20348,25 @@ snapshots: sprintf-js@1.0.3: {} + sprintf-js@1.1.3: + optional: true + ssri@10.0.6: dependencies: minipass: 7.1.3 + ssri@12.0.0: + dependencies: + minipass: 7.1.3 + stack-utils@2.0.6: dependencies: escape-string-regexp: 2.0.0 startaudiocontext@1.2.1: {} + stat-mode@1.0.0: {} + static-eval@2.1.1: dependencies: escodegen: 2.1.0 @@ -18964,6 +20538,12 @@ snapshots: dependencies: webpack: 5.105.4(webpack-cli@6.0.1) + sumchecker@3.0.1: + dependencies: + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + supports-color@2.0.0: {} supports-color@5.5.0: @@ -19090,6 +20670,16 @@ snapshots: transitivePeerDependencies: - supports-color + temp-file@3.4.0: + dependencies: + async-exit-hook: 2.0.1 + fs-extra: 10.1.0 + + temp@0.9.4: + dependencies: + mkdirp: 0.5.6 + rimraf: 2.6.3 + term-size@2.2.1: {} terser-webpack-plugin@5.3.17(webpack@5.105.4): @@ -19148,6 +20738,10 @@ snapshots: dependencies: setimmediate: 1.0.5 + tiny-async-pool@1.3.0: + dependencies: + semver: 5.7.2 + tiny-inflate@1.0.3: {} tiny-worker@2.3.0: @@ -19173,6 +20767,10 @@ snapshots: dependencies: tldts-core: 7.0.25 + tmp-promise@3.0.3: + dependencies: + tmp: 0.2.5 + tmp@0.0.30: dependencies: os-tmpdir: 1.0.2 @@ -19181,6 +20779,8 @@ snapshots: dependencies: os-tmpdir: 1.0.2 + tmp@0.2.5: {} + tmpl@1.0.5: {} to-buffer@1.2.2: @@ -19234,6 +20834,10 @@ snapshots: trivial-deferred@2.0.0: {} + truncate-utf8-bytes@1.0.2: + dependencies: + utf8-byte-length: 1.0.5 + ts-api-utils@1.4.3(typescript@5.9.3): dependencies: typescript: 5.9.3 @@ -19334,6 +20938,9 @@ snapshots: type-detect@4.0.8: {} + type-fest@0.13.1: + optional: true + type-fest@0.21.3: {} type-fest@0.8.1: {} @@ -19409,6 +21016,10 @@ snapshots: has-symbols: 1.1.0 which-boxed-primitive: 1.1.1 + undici-types@6.21.0: {} + + undici-types@7.16.0: {} + undici-types@7.18.2: {} undici-types@7.22.0: {} @@ -19435,12 +21046,22 @@ snapshots: dependencies: unique-slug: 4.0.0 + unique-filename@4.0.0: + dependencies: + unique-slug: 5.0.0 + unique-slug@4.0.0: dependencies: imurmurhash: 0.1.4 + unique-slug@5.0.0: + dependencies: + imurmurhash: 0.1.4 + universalify@0.1.2: {} + universalify@2.0.1: {} + unpipe@1.0.0: {} unrs-resolver@1.11.1: @@ -19482,6 +21103,8 @@ snapshots: punycode: 1.4.1 qs: 6.15.0 + utf8-byte-length@1.0.5: {} + util-deprecate@1.0.2: {} util@0.12.5: @@ -19521,6 +21144,13 @@ snapshots: vary@1.1.2: {} + verror@1.10.1: + dependencies: + assert-plus: 1.0.0 + core-util-is: 1.0.2 + extsprintf: 1.4.1 + optional: true + vlq@0.2.3: {} vm-browserify@1.1.2: {} @@ -19550,6 +21180,10 @@ snapshots: dependencies: minimalistic-assert: 1.0.1 + wcwidth@1.0.1: + dependencies: + defaults: 1.0.4 + web-audio-test-api@0.5.2: {} web-streams-polyfill@3.3.3: {} @@ -19780,6 +21414,10 @@ snapshots: dependencies: isexe: 3.1.5 + which@5.0.0: + dependencies: + isexe: 3.1.5 + widest-line@5.0.0: dependencies: string-width: 7.2.0 @@ -19845,6 +21483,8 @@ snapshots: xmlbuilder@11.0.1: {} + xmlbuilder@15.1.1: {} + xmlchars@2.2.0: {} xtend@4.0.2: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 0d0546ca0..950aede5e 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,5 +1,6 @@ packages: - packages/* + - app/* catalog: jest: ^30.3.0 @@ -10,6 +11,8 @@ catalog: onlyBuiltDependencies: - chromedriver - core-js + - electron + - electron-winstaller - playwright-chromium - unrs-resolver From d1e75d93850e4a983d255678dbde3acb1e53b211 Mon Sep 17 00:00:00 2001 From: SimonShiki Date: Wed, 8 Apr 2026 22:15:35 +0800 Subject: [PATCH 02/36] :wrench: chore: made desktop runnable Signed-off-by: SimonShiki --- app/desktop/package.json | 12 +- app/desktop/src/main/index.ts | 86 ++++++++ app/desktop/src/main/preload.ts | 9 + app/desktop/src/renderer/App.tsx | 10 +- app/desktop/src/renderer/app.css | 0 app/desktop/src/renderer/index.html | 1 + app/desktop/src/renderer/index.ts | 6 +- app/desktop/src/renderer/loading.html | 275 ++++++++++++++++++++++++++ app/desktop/src/types.d.ts | 8 + app/desktop/webpack.config.mjs | 134 ++++++++++--- packages/gui/package.json | 1 + packages/gui/webpack.config.js | 273 ++++++++++++------------- packages/storage/package.json | 1 + packages/svg-renderer/package.json | 5 +- pnpm-lock.yaml | 6 + pnpm-workspace.yaml | 1 + 16 files changed, 654 insertions(+), 174 deletions(-) create mode 100644 app/desktop/src/main/preload.ts delete mode 100644 app/desktop/src/renderer/app.css create mode 100644 app/desktop/src/renderer/loading.html diff --git a/app/desktop/package.json b/app/desktop/package.json index ba5682fe7..b67aeafa5 100644 --- a/app/desktop/package.json +++ b/app/desktop/package.json @@ -15,7 +15,15 @@ }, "main": "dist/main/index.js", "scripts": { - "lint": "eslint ." + "lint": "eslint .", + "build:main": "webpack --config webpack.config.mjs --env target=main", + "build:preload": "webpack --config webpack.config.mjs --env target=preload", + "build:renderer": "pnpm --filter clipcc-gui build:library && webpack --config webpack.config.mjs --env target=renderer", + "build:desktop": "pnpm run build:main && pnpm run build:preload && pnpm run build:renderer", + "build": "pnpm run build:desktop", + "start": "pnpm run build:desktop && electron .", + "start:renderer": "webpack serve --config webpack.config.mjs --env target=renderer", + "start:desktop": "electron ." }, "devDependencies": { "@types/node": "^22.15.30", @@ -25,7 +33,7 @@ "clipcc-gui": "workspace:~", "copy-webpack-plugin": "^14.0.0", "electron": "^41.2.0", - "electron-builder": "^26.0.12", + "electron-builder": "^26.8.1", "esbuild-loader": "^4.4.3", "eslint": "^9.39.2", "eslint-config-clipcc": "workspace:~", diff --git a/app/desktop/src/main/index.ts b/app/desktop/src/main/index.ts index e69de29bb..2fc228643 100644 --- a/app/desktop/src/main/index.ts +++ b/app/desktop/src/main/index.ts @@ -0,0 +1,86 @@ +import {app, BrowserWindow, shell} from 'electron'; +import path from 'path'; + +let mainWindow: BrowserWindow | null = null; + +const getRendererUrl = () => { + const rendererUrlFromEnv = process.env.CLIPCC_DESKTOP_RENDERER_URL; + if (!rendererUrlFromEnv) return null; + + const rendererUrl = new URL(rendererUrlFromEnv); + if (!rendererUrl.searchParams.has('route')) { + rendererUrl.searchParams.set('route', 'app'); + } + return rendererUrl.toString(); +}; + +const createMainWindow = () => { + const window = new BrowserWindow({ + title: 'ClipCC', + width: 1280, + height: 820, + minWidth: 960, + minHeight: 600, + show: false, + autoHideMenuBar: true, + webPreferences: { + preload: path.resolve(__dirname, 'preload.js'), + contextIsolation: true, + nodeIntegration: false, + sandbox: false + } + }); + + window.webContents.setWindowOpenHandler(({url}) => { + shell.openExternal(url); + return {action: 'deny'}; + }); + + const rendererUrl = getRendererUrl(); + if (rendererUrl) { + void window.loadURL(rendererUrl); + } else { + void window.loadFile(path.resolve(__dirname, '..', 'renderer', 'index.html'), { + query: { + route: 'app' + } + }); + } + + window.once('ready-to-show', () => { + window.show(); + window.webContents.send('ready-to-show'); + }); + + window.on('closed', () => { + if (mainWindow === window) { + mainWindow = null; + } + }); + + return window; +}; + +const ensureMainWindow = () => { + if (mainWindow?.isDestroyed()) { + mainWindow = null; + } + if (!mainWindow) { + mainWindow = createMainWindow(); + } + return mainWindow; +}; + +void app.whenReady().then(() => { + ensureMainWindow(); + + app.on('activate', () => { + ensureMainWindow(); + }); +}); + +app.on('window-all-closed', () => { + if (process.platform !== 'darwin') { + app.quit(); + } +}); diff --git a/app/desktop/src/main/preload.ts b/app/desktop/src/main/preload.ts new file mode 100644 index 000000000..1f91981cc --- /dev/null +++ b/app/desktop/src/main/preload.ts @@ -0,0 +1,9 @@ +import {contextBridge, ipcRenderer} from 'electron'; + +const desktopApi = { + onReadyToShow (listener: () => void) { + ipcRenderer.once('ready-to-show', listener); + } +}; + +contextBridge.exposeInMainWorld('desktop', desktopApi); diff --git a/app/desktop/src/renderer/App.tsx b/app/desktop/src/renderer/App.tsx index 1712a85e1..d41128ca7 100644 --- a/app/desktop/src/renderer/App.tsx +++ b/app/desktop/src/renderer/App.tsx @@ -1,14 +1,12 @@ import {compose} from 'redux'; -import GUI, {setAppElement} from 'clipcc-gui/src/index'; -import AppStateHOC from 'clipcc-gui/src/lib/app-state-hoc'; +import GUI, {AppStateHOC, setAppElement} from 'clipcc-gui'; import ScratchDesktopAppStateHOC from './DesktopAppStateHOC'; // import ScratchDesktopGUIHOC from './DesktopGUIHOC'; -import './app.css'; import React from 'react'; -const appTarget = document.getElementById('app'); +const appTarget = document.getElementById('app')!; setAppElement(appTarget); @@ -18,7 +16,7 @@ setAppElement(appTarget); const WrappedGui = compose( ScratchDesktopAppStateHOC, AppStateHOC, - ScratchDesktopGUIHOC -)(GUI); + // ScratchDesktopGUIHOC +)(GUI) as React.ComponentType; export default ; diff --git a/app/desktop/src/renderer/app.css b/app/desktop/src/renderer/app.css deleted file mode 100644 index e69de29bb..000000000 diff --git a/app/desktop/src/renderer/index.html b/app/desktop/src/renderer/index.html index c873ba2df..e709fc6b1 100644 --- a/app/desktop/src/renderer/index.html +++ b/app/desktop/src/renderer/index.html @@ -5,5 +5,6 @@

+ diff --git a/app/desktop/src/renderer/index.ts b/app/desktop/src/renderer/index.ts index e4d60b538..948771d20 100644 --- a/app/desktop/src/renderer/index.ts +++ b/app/desktop/src/renderer/index.ts @@ -1,15 +1,13 @@ // This file does async imports of the heavy JSX, especially app.jsx, to avoid blocking the first render. // The main index.html just contains a loading/splash screen which will display while this import loads. -import { ipcRenderer } from 'electron'; - import ReactDOM from 'react-dom'; -ipcRenderer.on('ready-to-show', () => { +window.desktop?.onReadyToShow(() => { // Start without any element in focus, otherwise the first link starts with focus and shows an orange box. // We shouldn't disable that box or the focus behavior in case someone wants or needs to navigate that way. // This seems like a hack... maybe there's some better way to do avoid any element starting with focus? - (document.activeElement as HTMLElement).blur(); + (document.activeElement as HTMLElement | null)?.blur(); }); const route = new URLSearchParams(window.location.search).get('route') || 'app'; diff --git a/app/desktop/src/renderer/loading.html b/app/desktop/src/renderer/loading.html new file mode 100644 index 000000000..b4dea393c --- /dev/null +++ b/app/desktop/src/renderer/loading.html @@ -0,0 +1,275 @@ + + + + + + + + + + +
+ + + +
+ + + +
+
+ + + + + diff --git a/app/desktop/src/types.d.ts b/app/desktop/src/types.d.ts index 59a4aa76e..480f0fdd5 100644 --- a/app/desktop/src/types.d.ts +++ b/app/desktop/src/types.d.ts @@ -40,3 +40,11 @@ declare module 'react-intl' { options?: InjectIntlOptions ): React.ComponentType>; } + +interface ClipCCDesktopApi { + onReadyToShow(listener: () => void): void; +} + +interface Window { + desktop?: ClipCCDesktopApi; +} diff --git a/app/desktop/webpack.config.mjs b/app/desktop/webpack.config.mjs index bac801b93..fd664c1e9 100644 --- a/app/desktop/webpack.config.mjs +++ b/app/desktop/webpack.config.mjs @@ -3,9 +3,15 @@ import CopyWebpackPlugin from 'copy-webpack-plugin'; import path from 'path'; import fs from 'fs'; -import {DefinePlugin} from 'webpack'; +import {createRequire} from 'module'; +import {fileURLToPath} from 'url'; +import webpack from 'webpack'; -import {version} from '../../package.json'; +const require = createRequire(import.meta.url); +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + +const {version} = require('../../package.json'); /** * Get module's root path from its name. @@ -36,20 +42,43 @@ class CleanSourceMapWebpackPlugin { } } +/** + * @returns {import('webpack').RuleSetRule[]} + */ +const getScriptLoaders = () => [ + { + test: /\.tsx?$/, + loader: 'esbuild-loader', + options: { + loader: 'tsx', + tsconfigRaw: require('./tsconfig.json') + } + }, + { + test: /\.jsx?$/, + loader: 'esbuild-loader', + options: { + loader: 'jsx' + } + } +]; + /** @type {import('webpack').Configuration} */ -export default { +const rendererConfig = { + name: 'renderer', mode: process.env.NODE_ENV === 'production' ? 'production' : 'development', target: 'web', entry: { - index: './src/main/index.ts' + index: './src/renderer/index.ts' }, output: { + path: path.resolve(__dirname, 'dist', 'renderer'), filename: '[name].js' }, resolve: { extensions: ['.ts', '.tsx', '.js', '.jsx', '.json'] }, - devtool: process.env.NODE_ENV === 'production' ? undefined : 'source-map', + devtool: process.env.NODE_ENV === 'production' ? false : 'cheap-module-source-map', devServer: { static: [ { @@ -77,22 +106,7 @@ export default { }, module: { rules: [ - { - test: /\.tsx?$/, - loader: 'esbuild-loader', - options: { - loader: 'tsx', - // eslint-disable-next-line global-require - tsconfigRaw: require('./tsconfig.json') - } - }, - { - test: /\.jsx?$/, - loader: 'esbuild-loader', - options: { - loader: 'jsx' - } - }, + ...getScriptLoaders(), { test: /\.css$/, use: [{ @@ -131,18 +145,19 @@ export default { patterns: [ { from: path.resolve(__dirname, 'static'), - to: './static' + to: './static', + noErrorOnMissing: true }, { from: path.resolve(getModulePath('clipcc-gui'), 'static'), to: './static' }, { - from: path.resolve(__dirname, 'src', 'index.html'), + from: path.resolve(__dirname, 'src', 'renderer', 'index.html'), to: '.' }, { - from: path.resolve(__dirname, 'src', 'index.css'), + from: path.resolve(__dirname, 'src', 'renderer', 'loading.html'), to: '.' }, { @@ -157,9 +172,10 @@ export default { from: path.resolve(getModulePath('clipcc-gui'), 'src/lib/themes/high-contrast/blocks-media'), to: 'static/blocks-media/high-contrast', force: true - }] + } + ] }), - new DefinePlugin({ + new webpack.DefinePlugin({ 'process.env.DEBUG': Boolean(process.env.DEBUG), 'process.env.GA_ID': `"${process.env.GA_ID || 'UA-000000-01'}"`, 'clipcc.VERSION': version, @@ -168,3 +184,69 @@ export default { new CleanSourceMapWebpackPlugin() ] }; + +/** @type {import('webpack').Configuration} */ +const mainConfig = { + name: 'main', + mode: process.env.NODE_ENV === 'production' ? 'production' : 'development', + target: 'electron-main', + entry: { + index: './src/main/index.ts' + }, + output: { + path: path.resolve(__dirname, 'dist', 'main'), + filename: '[name].js' + }, + resolve: { + extensions: ['.ts', '.js', '.json'] + }, + devtool: process.env.NODE_ENV === 'production' ? false : 'cheap-module-source-map', + module: { + rules: [ + ...getScriptLoaders() + ] + }, + plugins: [ + new CleanSourceMapWebpackPlugin() + ] +}; + +/** @type {import('webpack').Configuration} */ +const preloadConfig = { + name: 'preload', + mode: process.env.NODE_ENV === 'production' ? 'production' : 'development', + target: 'electron-preload', + entry: { + preload: './src/main/preload.ts' + }, + output: { + path: path.resolve(__dirname, 'dist', 'main'), + filename: '[name].js' + }, + resolve: { + extensions: ['.ts', '.js', '.json'] + }, + devtool: process.env.NODE_ENV === 'production' ? false : 'cheap-module-source-map', + module: { + rules: [ + ...getScriptLoaders() + ] + }, + plugins: [ + new CleanSourceMapWebpackPlugin() + ] +}; + +/** + * @param {{target?: string}} env + * @returns {import('webpack').Configuration | import('webpack').Configuration[]} + */ +export default env => { + const target = env?.target; + + if (target === 'main') return mainConfig; + if (target === 'preload') return preloadConfig; + if (target === 'renderer') return rendererConfig; + + return [mainConfig, preloadConfig, rendererConfig]; +}; diff --git a/packages/gui/package.json b/packages/gui/package.json index 8a477ed0c..3b1f5cbc4 100644 --- a/packages/gui/package.json +++ b/packages/gui/package.json @@ -13,6 +13,7 @@ "types": "./dist/types/index.d.ts", "scripts": { "build:types": "tsc --project ./tsconfig.dts.json", + "build:library": "pnpm run clean && pnpm run build:types && GUI_ONLY_LIBRARY=1 webpack --color --bail", "build": "pnpm run clean && pnpm run build:types && webpack --color --bail", "clean": "rimraf ./build && mkdirp build && rimraf ./dist && mkdirp dist", "i18n:src": "rimraf ./translations/messages/src && babel src > tmp.js && rimraf tmp.js && node ./scripts/build-i18n-src.js ./translations/messages/src ./translations/", diff --git a/packages/gui/webpack.config.js b/packages/gui/webpack.config.js index aee7a62c5..3d99ef0af 100644 --- a/packages/gui/webpack.config.js +++ b/packages/gui/webpack.config.js @@ -10,6 +10,7 @@ const TerserPlugin = require('terser-webpack-plugin'); const NodePolyfillPlugin = require('node-polyfill-webpack-plugin'); const STATIC_PATH = process.env.STATIC_PATH || '/static'; +const LIBRARY_ONLY = typeof process.env.GUI_ONLY_LIBRARY !== 'undefined'; const base = { mode: process.env.NODE_ENV === 'production' ? 'production' : 'development', @@ -169,142 +170,146 @@ if (base.mode === 'development') { }); } -module.exports = [ +const playgroundConfig = defaultsDeep({}, base, { // to run editor examples - defaultsDeep({}, base, { - entry: { - gui: './src/playground/index.jsx', - blocksonly: './src/playground/blocks-only.jsx', - lifecycle: './src/playground/lifecycle-test.jsx', - compatibilitytesting: './src/playground/compatibility-testing.jsx', - player: './src/playground/player.jsx' - }, - output: { - path: path.resolve(__dirname, 'build'), - filename: '[name].js' - }, - module: { - rules: base.module.rules.concat([ + entry: { + gui: './src/playground/index.jsx', + blocksonly: './src/playground/blocks-only.jsx', + lifecycle: './src/playground/lifecycle-test.jsx', + compatibilitytesting: './src/playground/compatibility-testing.jsx', + player: './src/playground/player.jsx' + }, + output: { + path: path.resolve(__dirname, 'build'), + filename: '[name].js' + }, + module: { + rules: base.module.rules.concat([ + { + test: /\.(svg|png|wav|gif|jpg)$/, + resourceQuery: {not: [/raw/]}, + type: 'asset/inline' + } + ]) + }, + optimization: { + splitChunks: { + chunks: 'all', + name: 'lib.min' + } + }, + plugins: base.plugins.concat([ + new webpack.DefinePlugin({ + 'process.env.DEBUG': Boolean(process.env.DEBUG), + 'process.env.GA_ID': `"${process.env.GA_ID || 'UA-000000-01'}"`, + 'clipcc.VERSION': version, + 'clipcc.BUILD_TIME': Date.now() + }), + new HtmlWebpackPlugin({ + chunks: ['lib.min', 'gui'], + template: 'src/playground/index.ejs', + title: 'ClipCC GUI' + }), + new HtmlWebpackPlugin({ + chunks: ['lib.min', 'blocksonly'], + template: 'src/playground/index.ejs', + filename: 'blocks-only.html', + title: 'ClipCC GUI: Blocks Only Example' + }), + new HtmlWebpackPlugin({ + chunks: ['lib.min', 'compatibilitytesting'], + template: 'src/playground/index.ejs', + filename: 'compatibility-testing.html', + title: 'ClipCC GUI: Compatibility Testing' + }), + new HtmlWebpackPlugin({ + chunks: ['lib.min', 'player'], + template: 'src/playground/index.ejs', + filename: 'player.html', + title: 'ClipCC GUI: Player Example' + }), + new HtmlWebpackPlugin({ + chunks: ['lib.min', 'lifecycle'], + template: 'src/playground/index.ejs', + filename: 'lifecycle.html', + title: 'ClipCC GUI: Lifecycle Test' + }), + new CopyWebpackPlugin({ + patterns: [ { - test: /\.(svg|png|wav|gif|jpg)$/, - resourceQuery: {not: [/raw/]}, - type: 'asset/inline' + from: 'static', + to: 'static' } - ]) - }, - optimization: { - splitChunks: { - chunks: 'all', - name: 'lib.min' + ] + }), + new CopyWebpackPlugin({ + patterns: [ + { + from: 'extensions/**', + to: 'static', + context: 'src/examples' + } + ] + }), + new CopyWebpackPlugin({ + patterns: [ + { + from: 'extension-worker.{js,js.map}', + context: '../vm/dist/web' + } + ] + }) + ]) +}); + +const libraryConfig = defaultsDeep({}, base, { + // export as library + target: 'web', + entry: { + 'scratch-gui': './src/index.js' + }, + output: { + libraryTarget: 'umd', + path: path.resolve('dist'), + publicPath: `${STATIC_PATH}/` + }, + externals: { + 'react': 'react', + 'react-dom': 'react-dom' + }, + module: { + rules: base.module.rules.concat([ + { + test: /\.(svg|png|wav|gif|jpg)$/, + resourceQuery: {not: [/raw/]}, + type: 'asset/inline' } - }, - plugins: base.plugins.concat([ - new webpack.DefinePlugin({ - 'process.env.DEBUG': Boolean(process.env.DEBUG), - 'process.env.GA_ID': `"${process.env.GA_ID || 'UA-000000-01'}"`, - 'clipcc.VERSION': version, - 'clipcc.BUILD_TIME': Date.now() - }), - new HtmlWebpackPlugin({ - chunks: ['lib.min', 'gui'], - template: 'src/playground/index.ejs', - title: 'ClipCC GUI' - }), - new HtmlWebpackPlugin({ - chunks: ['lib.min', 'blocksonly'], - template: 'src/playground/index.ejs', - filename: 'blocks-only.html', - title: 'ClipCC GUI: Blocks Only Example' - }), - new HtmlWebpackPlugin({ - chunks: ['lib.min', 'compatibilitytesting'], - template: 'src/playground/index.ejs', - filename: 'compatibility-testing.html', - title: 'ClipCC GUI: Compatibility Testing' - }), - new HtmlWebpackPlugin({ - chunks: ['lib.min', 'player'], - template: 'src/playground/index.ejs', - filename: 'player.html', - title: 'ClipCC GUI: Player Example' - }), - new HtmlWebpackPlugin({ - chunks: ['lib.min', 'lifecycle'], - template: 'src/playground/index.ejs', - filename: 'lifecycle.html', - title: 'ClipCC GUI: Lifecycle Test' - }), - new CopyWebpackPlugin({ - patterns: [ - { - from: 'static', - to: 'static' - } - ] - }), - new CopyWebpackPlugin({ - patterns: [ - { - from: 'extensions/**', - to: 'static', - context: 'src/examples' - } - ] - }), - new CopyWebpackPlugin({ - patterns: [ - { - from: 'extension-worker.{js,js.map}', - context: '../vm/dist/web' - } - ] - }) ]) - }) -].concat( - process.env.NODE_ENV === 'production' || process.env.BUILD_MODE === 'dist' ? ( - // export as library - defaultsDeep({}, base, { - target: 'web', - entry: { - 'scratch-gui': './src/index.js' - }, - output: { - libraryTarget: 'umd', - path: path.resolve('dist'), - publicPath: `${STATIC_PATH}/` - }, - externals: { - 'react': 'react', - 'react-dom': 'react-dom' - }, - module: { - rules: base.module.rules.concat([ - { - test: /\.(svg|png|wav|gif|jpg)$/, - resourceQuery: {not: [/raw/]}, - type: 'asset/inline' - } - ]) - }, - plugins: base.plugins.concat([ - new CopyWebpackPlugin({ - patterns: [ - { - from: 'extension-worker.{js,js.map}', - context: '../vm/dist/web' - } - ] - }), - // Include library JSON files for scratch-desktop to use for downloading - new CopyWebpackPlugin({ - patterns: [ - { - from: 'src/lib/libraries/*.json', - to: 'libraries/[name][ext]' - } - ] - }) - ]) - })) : [] -); + }, + plugins: base.plugins.concat([ + new CopyWebpackPlugin({ + patterns: [ + { + from: 'extension-worker.{js,js.map}', + context: '../vm/dist/web' + } + ] + }), + // Include library JSON files for scratch-desktop to use for downloading + new CopyWebpackPlugin({ + patterns: [ + { + from: 'src/lib/libraries/*.json', + to: 'libraries/[name][ext]' + } + ] + }) + ]) +}); + +const includeLibraryConfig = LIBRARY_ONLY || process.env.NODE_ENV === 'production' || process.env.BUILD_MODE === 'dist'; + +module.exports = [ + ...(LIBRARY_ONLY ? [] : [playgroundConfig]), + ...(includeLibraryConfig ? [libraryConfig] : []) +]; diff --git a/packages/storage/package.json b/packages/storage/package.json index 1ab425e52..3047e4c78 100644 --- a/packages/storage/package.json +++ b/packages/storage/package.json @@ -52,6 +52,7 @@ "json": "^9.0.6", "node-fetch": "^3.3.2", "rimraf": "6.0.1", + "terser-webpack-plugin": "^5.3.17", "ts-jest": "^29.4.5", "ts-jest-mock-import-meta": "1.2.1", "ts-loader": "9.5.4", diff --git a/packages/svg-renderer/package.json b/packages/svg-renderer/package.json index b32975951..b5e5da322 100644 --- a/packages/svg-renderer/package.json +++ b/packages/svg-renderer/package.json @@ -28,6 +28,7 @@ "css-tree": "^1.1.3", "fastestsmallesttextencoderdecoder": "^1.0.22", "isomorphic-dompurify": "^2.14.0", + "lodash.defaultsdeep": "^4.6.1", "transformation-matrix": "^2.16.1" }, "devDependencies": { @@ -37,6 +38,7 @@ "@babel/preset-env": "7.29.2", "@types/css-tree": "^2.3.8", "@types/jsdom": "^28.0.0", + "@xmldom/xmldom": "0.8.11", "babel-core": "7.0.0-bridge.0", "babel-loader": "^10.1.1", "copy-webpack-plugin": "^14.0.0", @@ -55,8 +57,7 @@ "typescript": "catalog:", "webpack": "catalog:", "webpack-cli": "6.0.1", - "webpack-dev-server": "5.2.3", - "@xmldom/xmldom": "0.8.11" + "webpack-dev-server": "5.2.3" }, "browserslist": [ "Chrome >= 63", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index dcc4f2b76..589df7ea0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1111,6 +1111,9 @@ importers: rimraf: specifier: 6.0.1 version: 6.0.1 + terser-webpack-plugin: + specifier: ^5.3.17 + version: 5.3.17(webpack@5.105.4) ts-jest: specifier: ^29.4.5 version: 29.4.6(@babel/core@7.29.0)(@jest/transform@30.3.0)(@jest/types@30.3.0)(babel-jest@30.3.0(@babel/core@7.29.0))(jest-util@30.3.0)(jest@30.3.0(@types/node@25.5.2))(typescript@5.9.3) @@ -1150,6 +1153,9 @@ importers: isomorphic-dompurify: specifier: ^2.14.0 version: 2.36.0 + lodash.defaultsdeep: + specifier: ^4.6.1 + version: 4.6.1 transformation-matrix: specifier: ^2.16.1 version: 2.16.1 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 950aede5e..0b596a61e 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -13,6 +13,7 @@ onlyBuiltDependencies: - core-js - electron - electron-winstaller + - esbuild - playwright-chromium - unrs-resolver From eaf43e3ec619faf0b81c69fd732637efabf4b490 Mon Sep 17 00:00:00 2001 From: SimonShiki Date: Thu, 9 Apr 2026 10:27:53 +0800 Subject: [PATCH 03/36] :wrench: chore(desktop): implement dev server by ourselves Signed-off-by: SimonShiki --- app/desktop/package.json | 8 +- app/desktop/scripts/dev.mjs | 269 ++++++++++++++++++ app/desktop/src/renderer/App.tsx | 2 +- .../src/renderer/DesktopAppStateHOC.tsx | 8 +- app/desktop/src/renderer/index.css | 19 ++ app/desktop/src/renderer/index.html | 1 + app/desktop/src/renderer/index.ts | 22 +- app/desktop/webpack.config.mjs | 46 ++- pnpm-lock.yaml | 20 +- 9 files changed, 353 insertions(+), 42 deletions(-) create mode 100644 app/desktop/scripts/dev.mjs create mode 100644 app/desktop/src/renderer/index.css diff --git a/app/desktop/package.json b/app/desktop/package.json index b67aeafa5..f5e1b9fb1 100644 --- a/app/desktop/package.json +++ b/app/desktop/package.json @@ -19,11 +19,9 @@ "build:main": "webpack --config webpack.config.mjs --env target=main", "build:preload": "webpack --config webpack.config.mjs --env target=preload", "build:renderer": "pnpm --filter clipcc-gui build:library && webpack --config webpack.config.mjs --env target=renderer", - "build:desktop": "pnpm run build:main && pnpm run build:preload && pnpm run build:renderer", - "build": "pnpm run build:desktop", - "start": "pnpm run build:desktop && electron .", - "start:renderer": "webpack serve --config webpack.config.mjs --env target=renderer", - "start:desktop": "electron ." + "build": "pnpm run build:main && pnpm run build:preload && pnpm run build:renderer", + "start": "node ./scripts/dev.mjs", + "start:renderer": "webpack serve --config webpack.config.mjs --env target=renderer" }, "devDependencies": { "@types/node": "^22.15.30", diff --git a/app/desktop/scripts/dev.mjs b/app/desktop/scripts/dev.mjs new file mode 100644 index 000000000..f531bc3d1 --- /dev/null +++ b/app/desktop/scripts/dev.mjs @@ -0,0 +1,269 @@ +import {spawn} from 'child_process'; +import path from 'path'; +import {fileURLToPath} from 'url'; +import webpack from 'webpack'; +import createWebpackConfig from '../webpack.config.mjs'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); +const desktopRoot = path.resolve(__dirname, '..'); + +const rendererUrl = `http://127.0.0.1:8386/`; + +const managedProcesses = new Set(); +const compilerWatchers = new Map(); + +/** @type {import('child_process').ChildProcessWithoutNullStreams | null} */ +let electronProcess = null; +let shutdownRequested = false; +let restartTimeout = null; +let restartPromise = null; + +const buildState = { + main: 0, + preload: 0, + rendererReady: false +}; + +const COMPILER_SUCCESS_PATTERN = /compiled successfully|compiled with (?:\d+ )?warnings?/i; + +const prefixLog = (prefix, message) => { + if (!message.length) return; + console.log(`[${prefix}] ${message}`); +}; + +const attachProcessOutput = (processLabel, child, onLine) => { + const bindStream = streamName => { + const stream = child[streamName]; + let buffer = ''; + stream.setEncoding('utf8'); + stream.on('data', chunk => { + buffer += chunk; + const lines = buffer.split(/\r?\n/u); + buffer = lines.pop() ?? ''; + for (const line of lines) { + prefixLog(processLabel, line); + onLine?.(line); + } + }); + stream.on('end', () => { + if (!buffer) return; + prefixLog(processLabel, buffer); + onLine?.(buffer); + }); + }; + + bindStream('stdout'); + bindStream('stderr'); +}; + +const spawnManagedPnpmProcess = (processLabel, args, { + onLine, + failOnExit = true, + env = process.env +} = {}) => { + const child = spawn('pnpm', args, { + cwd: desktopRoot, + env, + stdio: ['ignore', 'pipe', 'pipe'] + }); + + managedProcesses.add(child); + attachProcessOutput(processLabel, child, onLine); + + child.on('exit', (code, signal) => { + managedProcesses.delete(child); + if (shutdownRequested || !failOnExit) return; + const exitMessage = + `[dev] ${processLabel} exited unexpectedly ` + + `(code: ${code ?? 'null'}, signal: ${signal ?? 'null'}).`; + console.error(exitMessage); + shutdown(1); + }); + + return child; +}; + +const terminateChild = child => new Promise(resolve => { + if (child.exitCode !== null || child.killed) { + resolve(); + return; + } + + const timeout = setTimeout(() => { + if (child.exitCode === null) { + child.kill('SIGKILL'); + } + }, 5000); + + child.once('exit', () => { + clearTimeout(timeout); + resolve(); + }); + + child.kill('SIGTERM'); +}); + +const closeCompilerWatcher = watcher => new Promise(resolve => { + watcher.close(() => { + resolve(); + }); +}); + +const isReadyToLaunchElectron = () => ( + buildState.rendererReady && + buildState.main > 0 && + buildState.preload > 0 +); + +const stopElectron = async () => { + if (!electronProcess) return; + + const child = electronProcess; + electronProcess = null; + await terminateChild(child); +}; + +const startElectron = () => { + if (shutdownRequested || electronProcess || !isReadyToLaunchElectron()) return; + + console.log(`[dev] launching electron with renderer URL ${rendererUrl}`); + electronProcess = spawnManagedPnpmProcess('electron', ['exec', 'electron', '.'], { + failOnExit: false, + env: { + ...process.env, + CLIPCC_DESKTOP_RENDERER_URL: rendererUrl + } + }); + + electronProcess.on('exit', (code, signal) => { + electronProcess = null; + if (shutdownRequested) return; + console.log(`[dev] electron exited (code: ${code ?? 'null'}, signal: ${signal ?? 'null'}).`); + }); +}; + +const restartElectron = reason => { + if (shutdownRequested || !isReadyToLaunchElectron()) return; + if (restartPromise) return; + + console.log(`[dev] restarting electron after ${reason} rebuild.`); + restartPromise = stopElectron() + .then(() => { + startElectron(); + }) + .finally(() => { + restartPromise = null; + }); +}; + +const scheduleElectronRestart = reason => { + if (!isReadyToLaunchElectron()) return; + + if (!electronProcess) { + startElectron(); + return; + } + + if (restartTimeout) { + clearTimeout(restartTimeout); + } + + restartTimeout = setTimeout(() => { + restartElectron(reason); + }, 150); +}; + +const onCompilerBuilt = target => { + buildState[target] += 1; + + if (buildState[target] === 1) { + console.log(`[dev] ${target} first build finished.`); + startElectron(); + return; + } + + scheduleElectronRestart(target); +}; + +const startCompilerWatch = target => { + const compiler = webpack(createWebpackConfig({target})); + const watcher = compiler.watch({}, (error, stats) => { + if (shutdownRequested) return; + + if (error) { + console.error(`[${target}] webpack watcher failed:`, error); + shutdown(1); + return; + } + + if (!stats) return; + + const statsText = stats.toString({ + all: false, + errors: true, + warnings: true, + timings: true, + colors: true + }); + + if (statsText) { + for (const line of statsText.split(/\r?\n/u)) { + prefixLog(target, line); + } + } + + if (stats.hasErrors()) return; + onCompilerBuilt(target); + }); + + compilerWatchers.set(target, watcher); +}; + +const shutdown = async code => { + if (shutdownRequested) return; + shutdownRequested = true; + process.exitCode = code; + + if (restartTimeout) { + clearTimeout(restartTimeout); + restartTimeout = null; + } + + await stopElectron(); + await Promise.all(Array.from(compilerWatchers.values(), watcher => closeCompilerWatcher(watcher))); + compilerWatchers.clear(); + await Promise.all(Array.from(managedProcesses, child => terminateChild(child))); +}; + +process.on('SIGINT', () => { + shutdown(0); +}); + +process.on('SIGTERM', () => { + shutdown(0); +}); + +process.on('uncaughtException', error => { + console.error('[dev] uncaught exception', error); + shutdown(1); +}); + +process.on('unhandledRejection', reason => { + console.error('[dev] unhandled rejection', reason); + shutdown(1); +}); + +console.log('[dev] starting desktop development services...'); + +spawnManagedPnpmProcess('renderer', ['run', 'start:renderer'], { + onLine: line => { + if (!COMPILER_SUCCESS_PATTERN.test(line)) return; + if (buildState.rendererReady) return; + buildState.rendererReady = true; + console.log(`[dev] renderer compilation reported ready at ${rendererUrl}`); + startElectron(); + } +}); +startCompilerWatch('main'); +startCompilerWatch('preload'); diff --git a/app/desktop/src/renderer/App.tsx b/app/desktop/src/renderer/App.tsx index d41128ca7..0c262232d 100644 --- a/app/desktop/src/renderer/App.tsx +++ b/app/desktop/src/renderer/App.tsx @@ -15,7 +15,7 @@ setAppElement(appTarget); // ability to compose reducers. const WrappedGui = compose( ScratchDesktopAppStateHOC, - AppStateHOC, + AppStateHOC // ScratchDesktopGUIHOC )(GUI) as React.ComponentType; diff --git a/app/desktop/src/renderer/DesktopAppStateHOC.tsx b/app/desktop/src/renderer/DesktopAppStateHOC.tsx index a35016184..f3c07f646 100644 --- a/app/desktop/src/renderer/DesktopAppStateHOC.tsx +++ b/app/desktop/src/renderer/DesktopAppStateHOC.tsx @@ -8,7 +8,7 @@ import type {AppStateProps} from 'clipcc-gui/src/lib/app-state-hoc'; */ const ScratchDesktopAppStateHOC = function

(WrappedComponent: React.ComponentType

) { class ScratchDesktopAppStateComponent extends React.Component { - constructor(props: P) { + constructor (props: P) { super(props); bindAll(this, [ 'handleTelemetryModalOptIn', @@ -19,11 +19,11 @@ const ScratchDesktopAppStateHOC = function

(WrappedCom telemetryDidOptIn: false }; } - handleTelemetryModalOptIn() { + handleTelemetryModalOptIn () { } - handleTelemetryModalOptOut() { + handleTelemetryModalOptOut () { } - render() { + render () { const shouldShowTelemetryModal = false; return ( diff --git a/app/desktop/src/renderer/index.css b/app/desktop/src/renderer/index.css new file mode 100644 index 000000000..988dd56e2 --- /dev/null +++ b/app/desktop/src/renderer/index.css @@ -0,0 +1,19 @@ +html, +body, +#app { + /* probably unecessary, transitional until layout is refactored */ + width: 100%; + height: 100%; + margin: 0; + + /* Setting min height/width makes the UI scroll below those sizes */ + min-width: 1024px; + min-height: 640px; /* Min height to fit sprite/backdrop button */ +} + +/* @todo: move globally? Safe / side FX, for blocks particularly? */ +* { box-sizing: border-box; } + +[theme='dark'] body { + background-color: var(--clipcc-ui-white); +} diff --git a/app/desktop/src/renderer/index.html b/app/desktop/src/renderer/index.html index e709fc6b1..4a8bf2cb7 100644 --- a/app/desktop/src/renderer/index.html +++ b/app/desktop/src/renderer/index.html @@ -2,6 +2,7 @@ +

diff --git a/app/desktop/src/renderer/index.ts b/app/desktop/src/renderer/index.ts index 948771d20..6cea101ab 100644 --- a/app/desktop/src/renderer/index.ts +++ b/app/desktop/src/renderer/index.ts @@ -13,17 +13,17 @@ window.desktop?.onReadyToShow(() => { const route = new URLSearchParams(window.location.search).get('route') || 'app'; let routeModulePromise; switch (route) { - case 'app': - routeModulePromise = import('./App'); - break; - /* - case 'about': - routeModulePromise = import('./about.jsx'); - break; - case 'privacy': - routeModulePromise = import('./privacy.jsx'); - break; - */ +case 'app': + routeModulePromise = import('./App'); + break; +/* +case 'about': + routeModulePromise = import('./about.jsx'); + break; +case 'privacy': + routeModulePromise = import('./privacy.jsx'); + break; +*/ } routeModulePromise?.then(routeModule => { diff --git a/app/desktop/webpack.config.mjs b/app/desktop/webpack.config.mjs index fd664c1e9..e96cf436a 100644 --- a/app/desktop/webpack.config.mjs +++ b/app/desktop/webpack.config.mjs @@ -18,14 +18,28 @@ const {version} = require('../../package.json'); * @param {string} moduleName - the name of the module to get the path of * @returns {string} the path to the module's root directory */ -const getModulePath = moduleName => path.dirname(require.resolve(`${moduleName}/package.json`)); +const getModulePath = moduleName => { + try { + return path.dirname(require.resolve(`${moduleName}/package.json`)); + } catch { + const fallbackModuleName = moduleName.replace(/^clipcc-/, ''); + const fallbackPath = path.resolve(__dirname, '..', '..', 'packages', fallbackModuleName); + if (fs.existsSync(path.resolve(fallbackPath, 'package.json'))) { + return fallbackPath; + } + + throw new Error(`Unable to resolve module path for ${moduleName}`); + } +}; class CleanSourceMapWebpackPlugin { - /** - * @param {import('webpack').Compiler} compiler the compiler instance - */ +/** + * Apply plugin hook. + * @param {import('webpack').Compiler} compiler Webpack compiler instance. + */ apply (compiler) { - compiler.hooks.done.tapAsync('CleanSourceMapWebpackPlugin', async ({compilation}) => { + compiler.hooks.done.tapPromise('CleanSourceMapWebpackPlugin', async stats => { + const {compilation} = /** @type {{compilation: import('webpack').Compilation}} */ (stats); // if (process.env.NODE_ENV !== 'production') return; const outputPath = compilation.outputOptions.path; if (!outputPath) return; @@ -35,16 +49,17 @@ class CleanSourceMapWebpackPlugin { .filter(filename => /[a-zA-Z0-9]\.(js|css)\.map$/.test(filename)) .forEach(filename => { const filePath = path.resolve(outputPath, filename); - threads.push(fs.promises.unlink(filePath)); + threads.push(fs.promises.unlink(filePath).catch(error => { + if (error?.code !== 'ENOENT') { + throw error; + } + })); }); await Promise.all(threads); }); } } -/** - * @returns {import('webpack').RuleSetRule[]} - */ const getScriptLoaders = () => [ { test: /\.tsx?$/, @@ -80,6 +95,10 @@ const rendererConfig = { }, devtool: process.env.NODE_ENV === 'production' ? false : 'cheap-module-source-map', devServer: { + host: '127.0.0.1', + port: 8386, + hot: false, + liveReload: true, static: [ { directory: path.join(__dirname, 'static'), @@ -156,6 +175,10 @@ const rendererConfig = { from: path.resolve(__dirname, 'src', 'renderer', 'index.html'), to: '.' }, + { + from: path.resolve(__dirname, 'src', 'renderer', 'index.css'), + to: '.' + }, { from: path.resolve(__dirname, 'src', 'renderer', 'loading.html'), to: '.' @@ -238,8 +261,9 @@ const preloadConfig = { }; /** - * @param {{target?: string}} env - * @returns {import('webpack').Configuration | import('webpack').Configuration[]} + * Select configs by target. + * @param {{target?: string}} env Build environment flags. + * @returns {import('webpack').Configuration | import('webpack').Configuration[]} Target-specific config or all configs. */ export default env => { const target = env?.target; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 589df7ea0..e8d0ccd78 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -80,7 +80,7 @@ importers: specifier: ^41.2.0 version: 41.2.0 electron-builder: - specifier: ^26.0.12 + specifier: ^26.8.1 version: 26.8.1(electron-builder-squirrel-windows@26.8.1) esbuild-loader: specifier: ^4.4.3 @@ -13017,7 +13017,7 @@ snapshots: dependencies: '@types/http-cache-semantics': 4.2.0 '@types/keyv': 3.1.4 - '@types/node': 22.19.17 + '@types/node': 25.5.2 '@types/responselike': 1.0.3 '@types/connect-history-api-fallback@1.5.4': @@ -13065,7 +13065,7 @@ snapshots: '@types/fs-extra@9.0.13': dependencies: - '@types/node': 22.19.17 + '@types/node': 25.5.2 '@types/html-minifier-terser@6.1.0': {} @@ -13118,7 +13118,7 @@ snapshots: '@types/keyv@3.1.4': dependencies: - '@types/node': 22.19.17 + '@types/node': 25.5.2 '@types/lodash.bindall@4.4.9': dependencies: @@ -13152,8 +13152,8 @@ snapshots: '@types/plist@3.0.5': dependencies: - '@types/node': 22.19.17 - xmlbuilder: 11.0.1 + '@types/node': 25.5.2 + xmlbuilder: 15.1.1 optional: true '@types/prop-types@15.5.9': {} @@ -13179,7 +13179,7 @@ snapshots: '@types/responselike@1.0.3': dependencies: - '@types/node': 22.19.17 + '@types/node': 25.5.2 '@types/retry@0.12.2': {} @@ -13632,12 +13632,12 @@ snapshots: '@webpack-cli/configtest@3.0.1(webpack-cli@6.0.1)(webpack@5.105.4)': dependencies: webpack: 5.105.4(webpack-cli@6.0.1) - webpack-cli: 6.0.1(webpack-dev-server@5.2.3)(webpack@5.105.4) + webpack-cli: 6.0.1(webpack@5.105.4) '@webpack-cli/info@3.0.1(webpack-cli@6.0.1)(webpack@5.105.4)': dependencies: webpack: 5.105.4(webpack-cli@6.0.1) - webpack-cli: 6.0.1(webpack-dev-server@5.2.3)(webpack@5.105.4) + webpack-cli: 6.0.1(webpack@5.105.4) '@webpack-cli/serve@3.0.1(webpack-cli@6.0.1)(webpack-dev-server@5.2.3)(webpack@5.105.4)': dependencies: @@ -21325,7 +21325,7 @@ snapshots: watchpack: 2.5.1 webpack-sources: 3.3.4 optionalDependencies: - webpack-cli: 6.0.1(webpack-dev-server@5.2.3)(webpack@5.105.4) + webpack-cli: 6.0.1(webpack@5.105.4) transitivePeerDependencies: - '@swc/core' - esbuild From c13c75fa6aa30c0a760b13622a027c4d7ad5929b Mon Sep 17 00:00:00 2001 From: SimonShiki Date: Thu, 9 Apr 2026 14:34:44 +0800 Subject: [PATCH 04/36] :wrench: chore: redo electron dev server Signed-off-by: SimonShiki --- app/desktop/package.json | 9 +- app/desktop/scripts/dev.mjs | 498 ++++++++++++++++++++------------- app/desktop/src/main/index.ts | 6 +- packages/gui/package.json | 2 +- packages/gui/webpack.config.js | 2 +- 5 files changed, 315 insertions(+), 202 deletions(-) diff --git a/app/desktop/package.json b/app/desktop/package.json index f5e1b9fb1..43f3dca88 100644 --- a/app/desktop/package.json +++ b/app/desktop/package.json @@ -16,12 +16,11 @@ "main": "dist/main/index.js", "scripts": { "lint": "eslint .", - "build:main": "webpack --config webpack.config.mjs --env target=main", - "build:preload": "webpack --config webpack.config.mjs --env target=preload", - "build:renderer": "pnpm --filter clipcc-gui build:library && webpack --config webpack.config.mjs --env target=renderer", + "build:main": "webpack --env target=main", + "build:preload": "webpack --env target=preload", + "build:renderer": "pnpm --filter clipcc-gui build:library && webpack --env target=renderer", "build": "pnpm run build:main && pnpm run build:preload && pnpm run build:renderer", - "start": "node ./scripts/dev.mjs", - "start:renderer": "webpack serve --config webpack.config.mjs --env target=renderer" + "start": "node ./scripts/dev.mjs" }, "devDependencies": { "@types/node": "^22.15.30", diff --git a/app/desktop/scripts/dev.mjs b/app/desktop/scripts/dev.mjs index f531bc3d1..f1f667bd1 100644 --- a/app/desktop/scripts/dev.mjs +++ b/app/desktop/scripts/dev.mjs @@ -1,269 +1,383 @@ -import {spawn} from 'child_process'; -import path from 'path'; -import {fileURLToPath} from 'url'; +import {spawn} from 'node:child_process'; +import path from 'node:path'; +import process from 'node:process'; +import {fileURLToPath} from 'node:url'; +import electronPath from 'electron'; import webpack from 'webpack'; -import createWebpackConfig from '../webpack.config.mjs'; +import WebpackDevServer from 'webpack-dev-server'; +import configFactory from '../webpack.config.mjs'; + +/** @typedef {'main' | 'preload' | 'renderer'} Target */ +/** @typedef {'main' | 'preload'} NodeTarget */ +/** @typedef {import('node:child_process').ChildProcess} ChildProcess */ +/** @typedef {import('webpack').Compiler} Compiler */ +/** @typedef {import('webpack').Configuration} WebpackConfiguration */ +/** @typedef {import('webpack').Stats} Stats */ +/** @typedef {import('webpack').Watching} Watching */ +/** @typedef {import('webpack-dev-server').Configuration} DevServerConfiguration */ const __filename = fileURLToPath(import.meta.url); -const __dirname = path.dirname(__filename); -const desktopRoot = path.resolve(__dirname, '..'); +const scriptsDir = path.dirname(__filename); +const desktopDir = path.resolve(scriptsDir, '..'); +const rendererUrl = 'http://127.0.0.1:8386'; +const nodeTargets = /** @type {const} */ (['main', 'preload']); -const rendererUrl = `http://127.0.0.1:8386/`; - -const managedProcesses = new Set(); -const compilerWatchers = new Map(); - -/** @type {import('child_process').ChildProcessWithoutNullStreams | null} */ +/** @type {ChildProcess | null} */ let electronProcess = null; -let shutdownRequested = false; -let restartTimeout = null; -let restartPromise = null; - -const buildState = { - main: 0, - preload: 0, - rendererReady: false +/** @type {WebpackDevServer | null} */ +let rendererServer = null; +/** @type {Compiler | null} */ +let rendererCompiler = null; +/** @type {Watching[]} */ +const nodeWatchers = []; +/** @type {Compiler[]} */ +const nodeCompilers = []; +/** @type {Set} */ +const readyNodeTargets = new Set(); +/** @type {ReturnType | null} */ +let restartTimer = null; +let rendererReady = false; +let isRestartingElectron = false; +let isShuttingDown = false; + +if (process.cwd() !== desktopDir) { + process.chdir(desktopDir); +} + +/** + * Print a simple scoped log message. + * @param {string} scope - Short log prefix. + * @param {string} message - Message to print. + */ +const log = (scope, message) => { + console.log(`[${scope}] ${message}`); }; -const COMPILER_SUCCESS_PATTERN = /compiled successfully|compiled with (?:\d+ )?warnings?/i; - -const prefixLog = (prefix, message) => { - if (!message.length) return; - console.log(`[${prefix}] ${message}`); -}; +/** + * Normalize a config from the shared webpack factory. + * @param {Target} target - Requested webpack target. + * @returns {WebpackConfiguration} Normalized single-target config. + */ +const getConfig = target => { + const config = configFactory({target}); + if (!config || Array.isArray(config)) { + throw new Error(`Expected a single webpack config for ${target}`); + } -const attachProcessOutput = (processLabel, child, onLine) => { - const bindStream = streamName => { - const stream = child[streamName]; - let buffer = ''; - stream.setEncoding('utf8'); - stream.on('data', chunk => { - buffer += chunk; - const lines = buffer.split(/\r?\n/u); - buffer = lines.pop() ?? ''; - for (const line of lines) { - prefixLog(processLabel, line); - onLine?.(line); - } - }); - stream.on('end', () => { - if (!buffer) return; - prefixLog(processLabel, buffer); - onLine?.(buffer); - }); + return { + ...config, + context: config.context ?? desktopDir }; - - bindStream('stdout'); - bindStream('stderr'); }; -const spawnManagedPnpmProcess = (processLabel, args, { - onLine, - failOnExit = true, - env = process.env -} = {}) => { - const child = spawn('pnpm', args, { - cwd: desktopRoot, - env, - stdio: ['ignore', 'pipe', 'pipe'] +/** + * Print warnings and errors from a webpack build. + * @param {NodeTarget} target - Node-side target that finished building. + * @param {Stats} stats - Webpack stats for that build. + * @returns {boolean} True when the build succeeded. + */ +const handleNodeBuildResult = (target, stats) => { + const output = stats.toString({ + colors: true, + preset: 'errors-warnings', + timings: true }); - managedProcesses.add(child); - attachProcessOutput(processLabel, child, onLine); + if (output) { + console.log(output); + } - child.on('exit', (code, signal) => { - managedProcesses.delete(child); - if (shutdownRequested || !failOnExit) return; - const exitMessage = - `[dev] ${processLabel} exited unexpectedly ` + - `(code: ${code ?? 'null'}, signal: ${signal ?? 'null'}).`; - console.error(exitMessage); - shutdown(1); - }); + if (stats.hasErrors()) { + log(target, 'build failed; keeping the current Electron process running'); + return false; + } + + const buildTime = typeof stats.endTime === 'number' && typeof stats.startTime === 'number' ? + ` in ${stats.endTime - stats.startTime} ms` : + ''; - return child; + log(target, `built successfully${buildTime}`); + return true; }; -const terminateChild = child => new Promise(resolve => { - if (child.exitCode !== null || child.killed) { - resolve(); +/** + * Launch the Electron app against the renderer dev server. + * @param {string} reason - Why Electron is being launched. + */ +const startElectron = reason => { + if (electronProcess || isShuttingDown) { return; } - const timeout = setTimeout(() => { - if (child.exitCode === null) { - child.kill('SIGKILL'); - } - }, 5000); + log('electron', reason); + electronProcess = spawn(electronPath, [desktopDir], { + cwd: desktopDir, + env: { + ...process.env, + CLIPCC_DESKTOP_RENDERER_URL: rendererUrl + }, + stdio: 'inherit' + }); - child.once('exit', () => { - clearTimeout(timeout); - resolve(); + electronProcess.once('error', error => { + console.error(error); + electronProcess = null; + shutdown(1); }); - child.kill('SIGTERM'); -}); + electronProcess.once('exit', (code, signal) => { + const wasRestarting = isRestartingElectron; + electronProcess = null; -const closeCompilerWatcher = watcher => new Promise(resolve => { - watcher.close(() => { - resolve(); - }); -}); + if (isShuttingDown || wasRestarting) { + return; + } -const isReadyToLaunchElectron = () => ( - buildState.rendererReady && - buildState.main > 0 && - buildState.preload > 0 -); + const detail = signal ? `signal ${signal}` : `code ${code ?? 0}`; + log('electron', `exited with ${detail}`); + shutdown(code ?? 0); + }); +}; +/** + * Stop the running Electron process, if any. + * @returns {Promise} + */ const stopElectron = async () => { - if (!electronProcess) return; + if (!electronProcess) { + return; + } - const child = electronProcess; + const processToStop = electronProcess; electronProcess = null; - await terminateChild(child); -}; -const startElectron = () => { - if (shutdownRequested || electronProcess || !isReadyToLaunchElectron()) return; + await new Promise(resolve => { + const killTimer = setTimeout(() => { + if (processToStop.exitCode === null && processToStop.signalCode === null) { + processToStop.kill('SIGKILL'); + } + }, 5000); - console.log(`[dev] launching electron with renderer URL ${rendererUrl}`); - electronProcess = spawnManagedPnpmProcess('electron', ['exec', 'electron', '.'], { - failOnExit: false, - env: { - ...process.env, - CLIPCC_DESKTOP_RENDERER_URL: rendererUrl - } - }); + killTimer.unref(); - electronProcess.on('exit', (code, signal) => { - electronProcess = null; - if (shutdownRequested) return; - console.log(`[dev] electron exited (code: ${code ?? 'null'}, signal: ${signal ?? 'null'}).`); + processToStop.once('exit', () => { + clearTimeout(killTimer); + resolve(); + }); + + processToStop.kill(); }); }; -const restartElectron = reason => { - if (shutdownRequested || !isReadyToLaunchElectron()) return; - if (restartPromise) return; - - console.log(`[dev] restarting electron after ${reason} rebuild.`); - restartPromise = stopElectron() - .then(() => { - startElectron(); - }) - .finally(() => { - restartPromise = null; - }); -}; +/** + * Start Electron after the first successful main + preload builds. + */ +const maybeStartElectron = () => { + if (!rendererReady || electronProcess || isShuttingDown) { + return; + } -const scheduleElectronRestart = reason => { - if (!isReadyToLaunchElectron()) return; + if (readyNodeTargets.size !== nodeTargets.length) { + return; + } - if (!electronProcess) { - startElectron(); + startElectron('launching Electron'); +}; + +/** + * Debounce restarts so a main+preload change only restarts Electron once. + * @param {NodeTarget} target - Target that triggered the restart. + */ +const scheduleElectronRestart = target => { + if (!rendererReady || isShuttingDown) { return; } - if (restartTimeout) { - clearTimeout(restartTimeout); + if (restartTimer) { + clearTimeout(restartTimer); } - restartTimeout = setTimeout(() => { - restartElectron(reason); + restartTimer = setTimeout(() => { + restartTimer = null; + restartElectron(`${target} changed; restarting Electron`); }, 150); }; -const onCompilerBuilt = target => { - buildState[target] += 1; - - if (buildState[target] === 1) { - console.log(`[dev] ${target} first build finished.`); - startElectron(); +/** + * Restart Electron after a successful node-side rebuild. + * @param {string} reason - Why Electron is being restarted. + * @returns {Promise} Resolves after the restart completes. + */ +const restartElectron = async reason => { + if (isShuttingDown) { return; } - scheduleElectronRestart(target); + isRestartingElectron = true; + try { + await stopElectron(); + startElectron(reason); + } finally { + isRestartingElectron = false; + } }; -const startCompilerWatch = target => { - const compiler = webpack(createWebpackConfig({target})); - const watcher = compiler.watch({}, (error, stats) => { - if (shutdownRequested) return; +/** + * Watch one node-side webpack target and restart Electron after successful rebuilds. + * @param {NodeTarget} target - Node-side webpack target to watch. + */ +const watchNodeTarget = target => { + const compiler = webpack(getConfig(target)); + nodeCompilers.push(compiler); + const watching = compiler.watch({}, (error, stats) => { if (error) { - console.error(`[${target}] webpack watcher failed:`, error); - shutdown(1); + console.error(error); + log(target, 'build failed before stats were available'); return; } - if (!stats) return; + if (!stats) { + log(target, 'build finished without stats output'); + return; + } - const statsText = stats.toString({ - all: false, - errors: true, - warnings: true, - timings: true, - colors: true - }); + const succeeded = handleNodeBuildResult(target, stats); + if (!succeeded) { + return; + } - if (statsText) { - for (const line of statsText.split(/\r?\n/u)) { - prefixLog(target, line); - } + const isFirstSuccessfulBuild = !readyNodeTargets.has(target); + readyNodeTargets.add(target); + + if (isFirstSuccessfulBuild) { + maybeStartElectron(); + return; } - if (stats.hasErrors()) return; - onCompilerBuilt(target); + scheduleElectronRestart(target); }); - compilerWatchers.set(target, watcher); + nodeWatchers.push(watching); + log(target, 'watching for changes'); }; -const shutdown = async code => { - if (shutdownRequested) return; - shutdownRequested = true; - process.exitCode = code; - - if (restartTimeout) { - clearTimeout(restartTimeout); - restartTimeout = null; +/** + * Start the renderer dev server so BrowserWindow can use live reload. + * @returns {Promise} + */ +const startRendererServer = async () => { + const rendererConfig = getConfig('renderer'); + if (!rendererConfig.devServer) { + throw new Error('Renderer webpack config is missing devServer settings'); } - await stopElectron(); - await Promise.all(Array.from(compilerWatchers.values(), watcher => closeCompilerWatcher(watcher))); - compilerWatchers.clear(); - await Promise.all(Array.from(managedProcesses, child => terminateChild(child))); + rendererCompiler = webpack(rendererConfig); + rendererServer = new WebpackDevServer( + /** @type {DevServerConfiguration} */ (rendererConfig.devServer), + rendererCompiler + ); + + await rendererServer.start(); + rendererReady = true; + log('renderer', `dev server listening on ${rendererUrl}`); + maybeStartElectron(); }; -process.on('SIGINT', () => { - shutdown(0); +/** + * Close webpack's watch handle. + * @param {Watching} watching - Active webpack watch handle. + * @returns {Promise} Resolves once the watcher closes. + */ +const closeWatching = watching => new Promise((resolve, reject) => { + watching.close(error => { + if (error) { + reject(error); + return; + } + resolve(); + }); }); -process.on('SIGTERM', () => { - shutdown(0); +/** + * Close a webpack compiler after its watcher is stopped. + * @param {Compiler} compiler - Compiler to dispose. + * @returns {Promise} Resolves once the compiler closes. + */ +const closeCompiler = compiler => new Promise((resolve, reject) => { + compiler.close(error => { + if (error) { + reject(error); + return; + } + resolve(); + }); }); -process.on('uncaughtException', error => { - console.error('[dev] uncaught exception', error); +/** + * Shut the dev runner down in a controlled order. + * @param {number} exitCode - Process exit code to keep. + * @returns {Promise} Resolves after shutdown work finishes. + */ +const shutdown = async exitCode => { + if (isShuttingDown) { + process.exitCode = exitCode; + return; + } + + isShuttingDown = true; + process.exitCode = exitCode; + + if (restartTimer) { + clearTimeout(restartTimer); + restartTimer = null; + } + + await stopElectron(); + + const watcherResults = await Promise.allSettled(nodeWatchers.map(closeWatching)); + watcherResults.forEach(result => { + if (result.status === 'rejected') { + console.error(result.reason); + } + }); + + const compilerResults = await Promise.allSettled(nodeCompilers.map(closeCompiler)); + compilerResults.forEach(result => { + if (result.status === 'rejected') { + console.error(result.reason); + } + }); + + if (rendererServer) { + await rendererServer.stop(); + } + + if (rendererCompiler) { + await closeCompiler(rendererCompiler); + } +}; + +/** + * Surface fatal runner errors and stop everything. + * @param {unknown} error - Fatal error thrown by the dev runner. + */ +const handleFatalError = error => { + console.error(error); shutdown(1); +}; + +process.once('SIGINT', () => { + shutdown(0); }); -process.on('unhandledRejection', reason => { - console.error('[dev] unhandled rejection', reason); - shutdown(1); +process.once('SIGTERM', () => { + shutdown(0); }); -console.log('[dev] starting desktop development services...'); +process.once('uncaughtException', handleFatalError); +process.once('unhandledRejection', handleFatalError); -spawnManagedPnpmProcess('renderer', ['run', 'start:renderer'], { - onLine: line => { - if (!COMPILER_SUCCESS_PATTERN.test(line)) return; - if (buildState.rendererReady) return; - buildState.rendererReady = true; - console.log(`[dev] renderer compilation reported ready at ${rendererUrl}`); - startElectron(); - } -}); -startCompilerWatch('main'); -startCompilerWatch('preload'); +await startRendererServer(); +watchNodeTarget('main'); +watchNodeTarget('preload'); diff --git a/app/desktop/src/main/index.ts b/app/desktop/src/main/index.ts index 2fc228643..e9d0a0a1c 100644 --- a/app/desktop/src/main/index.ts +++ b/app/desktop/src/main/index.ts @@ -38,9 +38,9 @@ const createMainWindow = () => { const rendererUrl = getRendererUrl(); if (rendererUrl) { - void window.loadURL(rendererUrl); + window.loadURL(rendererUrl); } else { - void window.loadFile(path.resolve(__dirname, '..', 'renderer', 'index.html'), { + window.loadFile(path.resolve(__dirname, '..', 'renderer', 'index.html'), { query: { route: 'app' } @@ -71,7 +71,7 @@ const ensureMainWindow = () => { return mainWindow; }; -void app.whenReady().then(() => { +app.whenReady().then(() => { ensureMainWindow(); app.on('activate', () => { diff --git a/packages/gui/package.json b/packages/gui/package.json index 3b1f5cbc4..d666bc34a 100644 --- a/packages/gui/package.json +++ b/packages/gui/package.json @@ -13,7 +13,7 @@ "types": "./dist/types/index.d.ts", "scripts": { "build:types": "tsc --project ./tsconfig.dts.json", - "build:library": "pnpm run clean && pnpm run build:types && GUI_ONLY_LIBRARY=1 webpack --color --bail", + "build:library": "pnpm run clean && pnpm run build:types && cross-env GUI_LIBRARY_ONLY=1 webpack --color --bail", "build": "pnpm run clean && pnpm run build:types && webpack --color --bail", "clean": "rimraf ./build && mkdirp build && rimraf ./dist && mkdirp dist", "i18n:src": "rimraf ./translations/messages/src && babel src > tmp.js && rimraf tmp.js && node ./scripts/build-i18n-src.js ./translations/messages/src ./translations/", diff --git a/packages/gui/webpack.config.js b/packages/gui/webpack.config.js index 3d99ef0af..96d59c6bf 100644 --- a/packages/gui/webpack.config.js +++ b/packages/gui/webpack.config.js @@ -10,7 +10,7 @@ const TerserPlugin = require('terser-webpack-plugin'); const NodePolyfillPlugin = require('node-polyfill-webpack-plugin'); const STATIC_PATH = process.env.STATIC_PATH || '/static'; -const LIBRARY_ONLY = typeof process.env.GUI_ONLY_LIBRARY !== 'undefined'; +const LIBRARY_ONLY = typeof process.env.GUI_LIBRARY_ONLY !== 'undefined'; const base = { mode: process.env.NODE_ENV === 'production' ? 'production' : 'development', From 90fa069c1f1936fc258fa77b6311b4dc969d0848 Mon Sep 17 00:00:00 2001 From: SimonShiki Date: Thu, 9 Apr 2026 16:08:16 +0800 Subject: [PATCH 05/36] :wrench: chore: add desktop gui hoc Signed-off-by: SimonShiki --- app/desktop/.gitignore | 27 +++ app/desktop/package.json | 8 +- app/desktop/src/renderer/App.tsx | 6 +- app/desktop/src/renderer/DesktopGUIHOC.tsx | 229 ++++++++++++++++++ .../src/renderer/ElectronStorageHelper.ts | 41 ++++ package.json | 2 +- packages/gui/src/lib/desktop-gui-types.ts | 24 ++ pnpm-lock.yaml | 17 ++ 8 files changed, 348 insertions(+), 6 deletions(-) create mode 100644 app/desktop/.gitignore create mode 100644 app/desktop/src/renderer/ElectronStorageHelper.ts create mode 100644 packages/gui/src/lib/desktop-gui-types.ts diff --git a/app/desktop/.gitignore b/app/desktop/.gitignore new file mode 100644 index 000000000..e248d68f1 --- /dev/null +++ b/app/desktop/.gitignore @@ -0,0 +1,27 @@ +# Mac OS +.DS_Store + +# Windows +thumbs.db + +# NPM +/node_modules +npm-* + +# Testing +/.nyc_output +/coverage +.eslintcache + +# Build +/build +/dist +/.opt-in +/*.provisionprofile + +# don't store the assets downloaded with the `fetch` script +/static/assets/ + +# generated translation files +/translations +/locale diff --git a/app/desktop/package.json b/app/desktop/package.json index 43f3dca88..452dbbc59 100644 --- a/app/desktop/package.json +++ b/app/desktop/package.json @@ -15,19 +15,23 @@ }, "main": "dist/main/index.js", "scripts": { + "fetch-library": "rimraf ./static/assets/ && mkdirp ./static/assets/ && node ./scripts/fetchMediaLibraryAssets.js", "lint": "eslint .", "build:main": "webpack --env target=main", "build:preload": "webpack --env target=preload", - "build:renderer": "pnpm --filter clipcc-gui build:library && webpack --env target=renderer", + "build:renderer": "webpack --env target=renderer", "build": "pnpm run build:main && pnpm run build:preload && pnpm run build:renderer", "start": "node ./scripts/dev.mjs" }, "devDependencies": { - "@types/node": "^22.15.30", "@types/lodash.bindall": "^4.4.9", + "@types/lodash.omit": "^4.5.9", + "@types/node": "^22.15.30", "@types/react": "16.1.0", "@types/react-dom": "16.0.11", "clipcc-gui": "workspace:~", + "clipcc-vm": "workspace:~", + "clipcc-storage": "workspace:~", "copy-webpack-plugin": "^14.0.0", "electron": "^41.2.0", "electron-builder": "^26.8.1", diff --git a/app/desktop/src/renderer/App.tsx b/app/desktop/src/renderer/App.tsx index 0c262232d..2cfb7ab90 100644 --- a/app/desktop/src/renderer/App.tsx +++ b/app/desktop/src/renderer/App.tsx @@ -3,7 +3,7 @@ import {compose} from 'redux'; import GUI, {AppStateHOC, setAppElement} from 'clipcc-gui'; import ScratchDesktopAppStateHOC from './DesktopAppStateHOC'; -// import ScratchDesktopGUIHOC from './DesktopGUIHOC'; +import ScratchDesktopGUIHOC from './DesktopGUIHOC'; import React from 'react'; const appTarget = document.getElementById('app')!; @@ -15,8 +15,8 @@ setAppElement(appTarget); // ability to compose reducers. const WrappedGui = compose( ScratchDesktopAppStateHOC, - AppStateHOC - // ScratchDesktopGUIHOC + AppStateHOC, + ScratchDesktopGUIHOC )(GUI) as React.ComponentType; export default ; diff --git a/app/desktop/src/renderer/DesktopGUIHOC.tsx b/app/desktop/src/renderer/DesktopGUIHOC.tsx index e69de29bb..1cf85255d 100644 --- a/app/desktop/src/renderer/DesktopGUIHOC.tsx +++ b/app/desktop/src/renderer/DesktopGUIHOC.tsx @@ -0,0 +1,229 @@ +import omit from 'lodash.omit'; +import {connect} from 'react-redux'; +import type {AnyAction, Dispatch} from 'redux'; +import ElectronStorageHelper from './ElectronStorageHelper'; +import React from 'react'; +import type VM from 'clipcc-vm'; +import type {RootState} from 'clipcc-gui/src/containers/gui'; +import type {LoadingStateValue} from 'clipcc-gui/src/reducers/project-state'; +import type { + DesktopGuiInjectionProps, + DesktopProjectTelemetryHandler +} from 'clipcc-gui/src/lib/desktop-gui-types'; +import type {ScratchStorage} from 'clipcc-storage'; + +import { + onLoadedProject, + defaultProjectId, + requestNewProject, + requestProjectUpload, + setProjectId +} from 'clipcc-gui/src/reducers/project-state'; +import { + openLoadingProject, + closeLoadingProject, + openTelemetryModal +} from 'clipcc-gui/src/reducers/modals'; + +type InitialProjectData = Parameters[0]; + +const getInitialProjectData = (): Promise => Promise.resolve(null); +const showPrivacyPolicy = (): Promise => Promise.resolve(); + +const hasInitialProjectData = (projectData: InitialProjectData | null): projectData is InitialProjectData => { + if (projectData === null) { + return false; + } + if (typeof projectData === 'string') { + return projectData.length > 0; + } + if (ArrayBuffer.isView(projectData)) { + return projectData.byteLength > 0; + } + if (projectData instanceof ArrayBuffer) { + return projectData.byteLength > 0; + } + return true; +}; + +const getErrorMessage = (error: unknown): string => { + if (error instanceof Error) { + return error.message; + } + return String(error); +}; + +const mapStateToProps = (state: RootState) => { + const loadingState = state.scratchGui.projectState.loadingState; + return { + loadingState, + vm: state.scratchGui.vm + }; +}; + +const mapDispatchToProps = (dispatch: Dispatch) => ({ + onLoadingStarted: () => { + dispatch(openLoadingProject()); + }, + onLoadingCompleted: () => { + dispatch(closeLoadingProject()); + }, + onHasInitialProject: (hasInitialProject: boolean, loadingState: LoadingStateValue) => { + if (hasInitialProject) { + // emulate sb-file-uploader + const action = requestProjectUpload(loadingState); + if (action) { + dispatch(action); + } + return; + } + + // `createProject()` might seem more appropriate but it's not a valid state transition here + // setting the default project ID is a valid transition from NOT_LOADED and acts like "create new" + dispatch(setProjectId(defaultProjectId)); + }, + onLoadedProject: (loadingState: LoadingStateValue, loadSuccess: boolean) => { + const canSaveToServer = false; + const action = onLoadedProject(loadingState, canSaveToServer, loadSuccess); + if (action) { + dispatch(action); + } + }, + onRequestNewProject: () => { + dispatch(requestNewProject(false)); + }, + onTelemetrySettingsClicked: () => { + dispatch(openTelemetryModal()); + } +}); + +/** + * Higher-order component to add desktop logic to the GUI. + * @param WrappedComponent - a GUI-like component to wrap. + * @returns A component similar to GUI with desktop-specific logic added. + */ +type OuterProps = Record; +type WrappedComponentProps = OuterProps & DesktopGuiInjectionProps; + +const ScratchDesktopGUIHOC = function ( + WrappedComponent: React.ComponentType +): React.ComponentType { + const connector = connect(mapStateToProps, mapDispatchToProps); + + type ReduxProps = ReturnType & ReturnType; + type Props = OuterProps & ReduxProps; + type LocalState = { + projectTitle: string; + }; + + class ScratchDesktopGUIComponent extends React.Component { + constructor (props: Props) { + super(props); + this.state = { + projectTitle: '' + }; + } + + override componentDidMount () { + this.props.onLoadingStarted(); + getInitialProjectData().then(initialProjectData => { + const hasInitialProject = hasInitialProjectData(initialProjectData); + this.props.onHasInitialProject(hasInitialProject, this.props.loadingState); + if (!hasInitialProject) { + this.props.onLoadingCompleted(); + return; + } + this.props.vm.loadProject(initialProjectData).then( + () => { + this.props.onLoadingCompleted(); + this.props.onLoadedProject(this.props.loadingState, true); + }, + (e: unknown) => { + this.props.onLoadingCompleted(); + this.props.onLoadedProject(this.props.loadingState, false); + console.error( + `Failed to load project: Invalid or corrupt project file. ${getErrorMessage(e)}`, + e + ); + + // this effectively sets the default project ID + // TODO: maybe setting the default project ID should be implicit in `requestNewProject` + this.props.onHasInitialProject(false, this.props.loadingState); + + // restart as if we didn't have an initial project to load + this.props.onRequestNewProject(); + } + ); + }); + } + + handleClickAbout = () => { + // ipcRenderer.send('open-about-window'); + }; + + handleProjectTelemetryEvent: DesktopProjectTelemetryHandler = () => { + // ipcRenderer.send(event, metadata); + }; + + handleStorageInit = (storageInstance: ScratchStorage) => { + storageInstance.addHelper(new ElectronStorageHelper(storageInstance), 50); + }; + + handleUpdateProjectTitle = (newTitle: string) => { + this.setState({projectTitle: newTitle}); + }; + + override render () { + const childProps = omit( + this.props, + 'loadingState', + 'vm', + 'onLoadingStarted', + 'onLoadingCompleted', + 'onHasInitialProject', + 'onLoadedProject', + 'onRequestNewProject', + 'onTelemetrySettingsClicked' + ) as OuterProps; + + const desktopProps: DesktopGuiInjectionProps = { + canEditTitle: true, + canModifyCloudData: false, + canSave: false, + isStandalone: true, + isScratchDesktop: true, + onClickAbout: [ + { + title: 'About', + onClick: () => this.handleClickAbout() + }, + { + title: 'Privacy Policy', + onClick: () => showPrivacyPolicy() + }, + { + title: 'Data Settings', + onClick: () => this.props.onTelemetrySettingsClicked() + } + ], + onProjectTelemetryEvent: this.handleProjectTelemetryEvent, + onShowPrivacyPolicy: showPrivacyPolicy, + onStorageInit: this.handleStorageInit, + onUpdateProjectTitle: this.handleUpdateProjectTitle + }; + + const wrappedProps: WrappedComponentProps = { + ...childProps, + ...desktopProps + }; + + return (); + } + } + + return connector(ScratchDesktopGUIComponent); +}; + +export default ScratchDesktopGUIHOC; diff --git a/app/desktop/src/renderer/ElectronStorageHelper.ts b/app/desktop/src/renderer/ElectronStorageHelper.ts new file mode 100644 index 000000000..22f88bace --- /dev/null +++ b/app/desktop/src/renderer/ElectronStorageHelper.ts @@ -0,0 +1,41 @@ +import type {Asset, BuiltinAssetType, IDataFormat, ScratchStorage} from 'clipcc-storage'; + +const staticAssets = new URL('./static/assets/', window.location.href); + +const basename = (value: string): string => { + const normalized = value.replace(/\\/g, '/'); + return normalized.split('/').pop() || ''; +}; + +/** + * Allow the storage module to load files bundled in the Electron application. + */ +class ElectronStorageHelper { + constructor ( + public parent: ScratchStorage + ) {} + + /** + * Fetch an asset but don't process dependencies. + * @param assetType - The type of asset to fetch. + * @param assetId - The ID of the asset to fetch: a project ID, MD5, etc. + * @param dataFormat - The file format / file extension of the asset to fetch: PNG, JPG, etc. + * @returns A promise for the contents of the asset. + */ + load (assetType: BuiltinAssetType, assetId: string, dataFormat: IDataFormat): Promise { + assetId = basename(assetId); + dataFormat = basename(dataFormat) as IDataFormat; + + const assetUrl = new URL(`${assetId}.${dataFormat}`, staticAssets); + return fetch(assetUrl.toString()) + .then(response => { + if (!response.ok) { + throw new Error(`Failed to load asset ${assetId}.${dataFormat}: ${response.status}`); + } + return response.arrayBuffer(); + }) + .then(data => new this.parent.Asset(assetType, assetId, dataFormat, new Uint8Array(data))); + } +} + +export default ElectronStorageHelper; diff --git a/package.json b/package.json index 8bc392452..4f65bed38 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ "start": "pnpm run gui start", "prepare": "husky", "build:dist": "cross-env NODE_ENV=production pnpm run build:full", - "build:full": "pnpm l10n build && pnpm audio build && pnpm storage build && pnpm svg-renderer build && pnpm render build && pnpm block build && pnpm vm build && pnpm paint build && node packages/gui/scripts/prepublish.mjs && pnpm gui build", + "build:full": "pnpm l10n build && pnpm audio build && pnpm storage build && pnpm svg-renderer build && pnpm render build && pnpm block build && pnpm vm build && pnpm paint build && node packages/gui/scripts/prepublish.mjs && pnpm gui build && pnpm gui build:library", "build": "pnpm block build && pnpm gui build", "test": "pnpm gui test:unit && pnpm block test && pnpm vm test", "performance": "pnpm vm performance", diff --git a/packages/gui/src/lib/desktop-gui-types.ts b/packages/gui/src/lib/desktop-gui-types.ts new file mode 100644 index 000000000..e48d6a4e8 --- /dev/null +++ b/packages/gui/src/lib/desktop-gui-types.ts @@ -0,0 +1,24 @@ +import type {ScratchStorage} from 'clipcc-storage'; + +export type DesktopAboutMenuItem = { + title: string; + onClick: () => void; +}; + +export type DesktopAboutMenu = (() => void) | DesktopAboutMenuItem[]; + +export type DesktopProjectTelemetryHandler = (event: string, metadata?: unknown) => void; + +// @todo migrate src/component/gui.jsx to TypeScript and remove this file +export interface DesktopGuiInjectionProps { + canEditTitle?: boolean; + canModifyCloudData?: boolean; + canSave?: boolean; + isStandalone?: boolean; + isScratchDesktop?: boolean; + onClickAbout?: DesktopAboutMenu; + onProjectTelemetryEvent?: DesktopProjectTelemetryHandler; + onShowPrivacyPolicy?: () => Promise; + onStorageInit?: (storageInstance: ScratchStorage) => void; + onUpdateProjectTitle?: (newTitle: string) => void; +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e8d0ccd78..6966b7a16 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -61,6 +61,9 @@ importers: '@types/lodash.bindall': specifier: ^4.4.9 version: 4.4.9 + '@types/lodash.omit': + specifier: ^4.5.9 + version: 4.5.9 '@types/node': specifier: ^22.15.30 version: 22.19.17 @@ -73,6 +76,12 @@ importers: clipcc-gui: specifier: workspace:~ version: link:../../packages/gui + clipcc-storage: + specifier: workspace:~ + version: link:../../packages/storage + clipcc-vm: + specifier: workspace:~ + version: link:../../packages/vm copy-webpack-plugin: specifier: ^14.0.0 version: 14.0.0(webpack@5.105.4) @@ -3408,6 +3417,9 @@ packages: '@types/lodash.bindall@4.4.9': resolution: {integrity: sha512-sG6V5+T3JcB39nXfORM+kHRH6DiCB+95DfGrH2YpPMXRpt6q3rn7VrW3dItiOLasJYeHq1jxc+tOW1ijT+d1wg==} + '@types/lodash.omit@4.5.9': + resolution: {integrity: sha512-zuAVFLUPJMOzsw6yawshsYGgq2hWUHtsZgeXHZmSFhaQQFC6EQ021uDKHkSjOpNhSvtNSU9165/o3o/Q51GpTw==} + '@types/lodash@4.17.24': resolution: {integrity: sha512-gIW7lQLZbue7lRSWEFql49QJJWThrTFFeIMJdp3eH4tKoxm1OvEPg02rm4wCCSHS0cL3/Fizimb35b7k8atwsQ==} @@ -4393,6 +4405,7 @@ packages: basic-ftp@5.2.0: resolution: {integrity: sha512-VoMINM2rqJwJgfdHq6RiUudKt2BV+FY5ZFezP/ypmwayk68+NzzAQy4XXLlqsGD4MCzq3DrmNFD/uUmBJuGoXw==} engines: {node: '>=10.0.0'} + deprecated: Security vulnerability fixed in 5.2.1, please upgrade batch@0.6.1: resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==} @@ -13124,6 +13137,10 @@ snapshots: dependencies: '@types/lodash': 4.17.24 + '@types/lodash.omit@4.5.9': + dependencies: + '@types/lodash': 4.17.24 + '@types/lodash@4.17.24': {} '@types/mime@1.3.5': {} From 08194f5d53b4fffba61c4fdc2e5e645a96834328 Mon Sep 17 00:00:00 2001 From: SimonShiki Date: Thu, 9 Apr 2026 17:09:14 +0800 Subject: [PATCH 06/36] :sparkles: feat: re-add multiple windows Signed-off-by: SimonShiki --- app/desktop/package.json | 1 + app/desktop/src/common/icon/ClipCC.svg | 39 +++ app/desktop/src/common/icon/app.png | Bin 0 -> 24895 bytes app/desktop/src/common/icon/app.svg | 40 +++ app/desktop/src/common/icon/cc3.png | Bin 0 -> 11536 bytes app/desktop/src/main/index.ts | 200 +++++++++++++-- app/desktop/src/main/preload.ts | 15 ++ app/desktop/src/renderer/index.css | 10 +- app/desktop/src/renderer/index.ts | 8 +- .../{ => lib}/ElectronStorageHelper.ts | 0 .../src/renderer/routes/about/about.css | 39 +++ .../src/renderer/routes/about/about.tsx | 32 +++ .../{ => routes/app}/DesktopAppStateHOC.tsx | 0 .../{ => routes/app}/DesktopGUIHOC.tsx | 13 +- app/desktop/src/renderer/routes/app/app.css | 17 ++ .../renderer/{App.tsx => routes/app/app.tsx} | 2 + .../src/renderer/routes/privacy/privacy.css | 14 ++ .../src/renderer/routes/privacy/privacy.tsx | 235 ++++++++++++++++++ app/desktop/src/types.d.ts | 7 + packages/gui/src/lib/desktop-gui-types.ts | 2 +- 20 files changed, 630 insertions(+), 44 deletions(-) create mode 100644 app/desktop/src/common/icon/ClipCC.svg create mode 100644 app/desktop/src/common/icon/app.png create mode 100644 app/desktop/src/common/icon/app.svg create mode 100644 app/desktop/src/common/icon/cc3.png rename app/desktop/src/renderer/{ => lib}/ElectronStorageHelper.ts (100%) create mode 100644 app/desktop/src/renderer/routes/about/about.css create mode 100644 app/desktop/src/renderer/routes/about/about.tsx rename app/desktop/src/renderer/{ => routes/app}/DesktopAppStateHOC.tsx (100%) rename app/desktop/src/renderer/{ => routes/app}/DesktopGUIHOC.tsx (95%) create mode 100644 app/desktop/src/renderer/routes/app/app.css rename app/desktop/src/renderer/{App.tsx => routes/app/app.tsx} (90%) create mode 100644 app/desktop/src/renderer/routes/privacy/privacy.css create mode 100644 app/desktop/src/renderer/routes/privacy/privacy.tsx diff --git a/app/desktop/package.json b/app/desktop/package.json index 452dbbc59..599acbc8f 100644 --- a/app/desktop/package.json +++ b/app/desktop/package.json @@ -1,6 +1,7 @@ { "name": "clipcc-desktop", "displayName": "ClipCC", + "productName": "ClipCC", "version": "3.2.0", "description": "ClipCC as a self-contained desktop application.", "author": { diff --git a/app/desktop/src/common/icon/ClipCC.svg b/app/desktop/src/common/icon/ClipCC.svg new file mode 100644 index 000000000..0661480e1 --- /dev/null +++ b/app/desktop/src/common/icon/ClipCC.svg @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/desktop/src/common/icon/app.png b/app/desktop/src/common/icon/app.png new file mode 100644 index 0000000000000000000000000000000000000000..d625d42825412fc136b1bf2c13adbde8659dbb1c GIT binary patch literal 24895 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 literal 0 HcmV?d00001 diff --git a/app/desktop/src/common/icon/app.svg b/app/desktop/src/common/icon/app.svg new file mode 100644 index 000000000..5e6b4b525 --- /dev/null +++ b/app/desktop/src/common/icon/app.svg @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/desktop/src/common/icon/cc3.png b/app/desktop/src/common/icon/cc3.png new file mode 100644 index 0000000000000000000000000000000000000000..cbf705faf5b8e985bb1d3cdfc152c19b1c5ed6ce GIT binary patch literal 11536 zcmch7^;?u*(D%J`N=UbWfFK>xOP90~f|N)|OCzyMC|#mRN`oMcl*A&b)B@7oA-N#3 z?{jLutO=5g7h1-9!|&j2~5yl9C_$0gWgeVebuJ3u$dR zYYN0C7$SP2v&5O}B+fyd7(Fvzwhenr7EJJh${;%Z4SQQ!=q~zuWMq{e#pjKX1Eg^7 zx(=Sd%BoZ`qxdT6YWh&da6pb^x7K^5AYECT5!`6jW&xS2-e$+T4pC(_E^$33cA8j= zhkn9*^t>ps*QN&I{j{}r__7)$zkZZT06e#%!8wFKO!c}lg{%dn#s^Ex4FpZ8e8xm!K8^1T2?V8qFE@~p?EaCBbVRT(?*%P1c&DeeA+WUe!dHTR2ay!$rW0`*h zvH5p$v2O=EDX%is9UiW1-KsIOD{y$Qf3UwKx_=V_XR_jNW@=q*=;L0}(+`U3x?}|b*fl@8anLyL_wtAEx|C`)g$O0_ z-Y0SY;)ey)jtHz>h;0XWCe4o>KQG8xEExG9Zwwk)7M_Uy zNw!}f9X#*!f1@V1Aou(9a=~l3?d-V%IgaB0`4i#5@*WE57(Dhf)ug>oF<_-gvP@5L z<=VKwW$%&Nd^&0VY*690E9CR?*};O$R-mn|?F*6;%?e`<;EVBBuWngs=~+}8GH6rO zEDoeBCxY^!HMUI(jAb%z22Tp~7S{{YI@ld2c7H8>H7)h{YRSDPYDLSZHUf><{m#Uw z;zAIh#>T~l=h3^G_;%^R1v3@#;v7wMt5MZ&U!bGMQNo%1swW09!3H=swynEwUGjTo z5uei~K!B$|>{?9iWpStf5em?ddAi`uHMsu%-^tWE6MJ%)ciLQ2s0igL13gidu>zKe z33hAczO~47V)JdzBXee0rqGclJ~b9s=sh3>Ud!Cz5(%;HOt&d9oA`4n&~l(g8bptc zjcul_Kw|w&?b^TltU+fC_f%Rulkv-hlYU^fdWdsUXM;LQRhAANv0{T0Vve(fZL|D@ z{X&Q>m(_+Y>42C3=>H87|1i{F3tEHmqX+FtKGW(pbmV0_YwENTwM&#D zpadj@fK%S%=R{FmNzW}f2eI~?uBAq7f`<$Jp_Q}Ya)a#7|cK_Ts z;1jE2zrcC{l-$1=t*PxNLX189VqBWn*};vl(BEi>dv6=k;S~<`3>LxRo|{T!_u02; z5D9U~^;{Li-91UB&b&^M-ufmA6on7*09qEavcyrGhb@)YVT=v4p#mQq!dLyJ_70cG zWuM8rh)%&RY>B{%FxYXr!(;FG1x&zvb>l@OIMhl=Q#d;5-_N{{mhw)IQHbeD2c&&!p}=Nf47zSEic zehGg^`;EA$T5^G)e`96&=%@FsIaTvuOMXP}-hFALr8@D?-e|x$b*{n4w3>P^Pw6y9 zZfZK11ByGapxQs%UwA>t^RsB|HzNQa!iW<9b$F)OgC2ZFA9%5QABs6IWx7rE-fSG1 zK(Fv+1M``~!mx1L?PR`>uKL!D5%fRl`T;rn;!Eao=fC}9xjyNJ8b~_TGgOv+i0OCk z;GM3XHSRLZw3MGlTwlmNWeQ@XARVxKZI9OxP2qS_k0;#4Z(>k(XZXCPdcjFo_TPCU z@@mcB{})VgI^ZTZ z%L9S$cc^7Ei9QJm*TS>A`SsTzz({!${?iYQ33pFv3_8zSho&E9Z<4gx$xMD9SUN)VfIvbs zh*^6JH9%W&AjCC3f}XY?c09*#)b;`?E`o%m##`&IOgu(%@+wv%>Jb zJm#@B6Kw@;>v%O_tkDW=DHsBZw+|8pa&Ry?_J0$012~|nA;RD*Yn@Cu9lTmrs3U^f z>)&{(j&-kPY-C~-gkT`=+KY>FTQ-POI`k*(;M*UG(1ay->h%A}$txW1MzxUovB-}( zJi_DNJL$vUbG!Rf4MGVa=nVRfj6Z*%g>S4OpX4gV!YWUhso>Qw@KOixH#+wEDohQs zk=ldzLNtmbv;fJcA!59Fl-!_$+o*}_o=P-P>)iOqu4Oc>TF@=4%4v?Jv82Q*Ba;YZ zNl9-8sQ9@Gzui}hD$F#vxyNA*s&5T{c+Tp~m8QD%u^u$q+v`r-6y(VsHf4PNYz&^x z-)0R#QEdplLbRT;#G^;?Ghw!qe0o5GEvePN?{n$`umR#AZtwZ9L$oWhHq)m?e5`sk zpY4cu+^If+&R)C_@&f1-Nr#LXam+`>S^n5NpbF_WsxHWNPCe zhJTlYv{;{M#WR1gs0-q;5u~G_0t8%M7%FuL4)Z(5;kc^prCfdH;Gzbsx0JaSpS-7O zvn3{+$dBeL?~K0y!jd*I7OxbTaD{*{tOvMN^4L}KZJw$tP1u0`cpc~wHgx)Q=&zoS za`{avsvjBv-=eYdwb+ue(tdQa;STC1Do4s|U32V6hkkqkXc| z7r5{6LOXudTHD1bDLbp#I+4Ve3QOYB_P=KD(wL+|iL^C%|L}C!XBQWqyq8?nloutu z({+}^?$QV^2KD@q377L@h}v^i3sO$hy3NAzu z-J{nU_hy8%($qeo1769Nb`h;!6V?1(lOyHN-9T%n_N3a0@JU9>@t}feva% zoYS&h=ZT_`vMRuA$Q_b^WurKt4@GCMO!+O4kwA%Y*unb^H; zHm8?P4ZB?@EP}P7-}dF?nwJyc^=U;7nzC1monHq?>JsE{w8uHF=|oagkK^BpuX~l1 zu8y>(NtaOyfu|Tii3XmmAoiq!{Ral{s&~T-_4L-J zBP?h?fNjc~v$O4}1VdogV+^L_JKs_4x3Hco0l7JZi5F)7z86#P#HC99P^AdVxIm?}{zkl=7kUQF#z0 zQ5R+ro0zsC_kln`(iX+2cz^YgYKMl00lz|WZxzCxxf1rHqqdc)kE`|4X!of66!!{6 ztJ_QYXh<HwJl?IUt6j}MxLIm>g>C6eglY_m zuR5q$Yj5+pTF#ApQ+L9dQ~TB999N)n(V(|p<|~i%iNmL%==(&s+Els9qJXMf&1tQjxy?4^qU-I0Ze)Hpo!n?@Pjn3{i;M8LGw}C@U)rOV z@7AHG5eaLwRVcBIV{U9Yq;XIw$&Eq+xb6oSIbC^BNQ${IQsL z;#gQd%W}3K>yMmZ6lXC5gML5LdLB?axMAz|Bq&p8W*mJY7{8Y7$K3mC_Nwh$$eQ@B z&~q-)%Un@L3Lirba!_reG*I;??y=;UA1SVT&1*s|(#w#3rUOFih2ktSYGyP&^AQF8 zk1l*O^hbnzL_x~_{MMHynwv``3AZR!R6N_FzP5$~)=M=o?2)uU^*wQKi^XL7vHU>o z2vLesS*sSvCgU2?Xr#}*bW;w!s~nYhc8@8C2=!TyrAJ$IFu2lWuWb3shEMKJoM?7< ziX1*W2rw&q(U?jOx*YL7A3HT4L*sAdv@g|yW8}Y_$O{#dXLck<12A-=-j)?S=BSsJ zEUlhkhjRU8-uoykkcq%m#5p+FeVcRM!4}IUCgcNk;3kJKPEs>MOB+tugsH)6Zx+Pp z$2=e32gHvJ#+S1326uFLq9EYCNAF5S?VJ7hA|x>G7q{|yN<1AnJrK-qu13UcBkv%At$9zMM4=n;aN?#Q8ckpJ_{!c^ zSLBbw@bIo>>YUHGMBlrlHbgVBru6EqVtBAI<(>nJHfY5t!B6PE-8T@_6ZcgpwWibH8CRa04+Nhe`^!D&>_zpyJ%zY&$ z_Ly{eC7k8GIChi?&HHr_A=z(4E$3ho-DI3f>Oqv`qPc6shz>?8Spu070=kGe_iKNN z;EO$_+;yKMZ(K@H;+z8_#QD}aQvWI)qm~_9|E#+JvfWK3K{f|M*9l|7P2bHkZDeOT zdtnow>31yCh+Cnou2L7H-|05~;o3d<&HQGR0V7HU>wAVh>a1;^sE*m>S)OEklyALd z<(6~(FRqle@RFSUH~Rx122u_|`NicgxVGw6rT6*EEskXhOx-V(In583dZpQulf{xH zb~3^y6msdqSZy1ddFi3Y`w4~@Mb$AG$P$Kc~l^p1|X zj#R-HAtxA(w$Y`P|A_9h$GS=c!N*?*JLdgNv}1=!dU1isMJ%LTo>s%$BAr51KA%{_ z{Y>B{oX$OB=lz`Nw?X^!iU0v6lTQm-98E2k`}`?r_x4?a1nobSYV5Bc*NEXIjbirL zR6FXj&KzimI8Qdyi|R(71(&4#VRTMUw(@gK6H&fNr63lZu~hr*Fpo)#%=o0nW{@1e zl~65J(Uki9>aNYKcv`vG5qF)2rW#BbKEZT>d?ps|y*O{kz5YVwO9XAn^EX{VvTzK?5aln2W? z%dFx+m7HuM&NB?Iy1jViqM(Bm8l1yZ2bHU-yXrEN^JE|STh|=$1`RE|iy+xh1k)-^ z-S|r5>-Fp1*9U*@^Q_Whn`Y-hOAHihT_?4(+xEHfQGfU@0;ynI?4SKl=bbCRtTt9! zEeZGc$p$`wpnMlNf7^eSITjUcMkneUw>j)l${>30i0=qO{nmQjX*;WD=U^Y;2E zt9E-wiq)Kfue9V)fax#oWNU}6iXv!L_K=^Sy*^Q`m=-*> z4qEO#t$upb!&>A1Du0ew!O%`BY{{`R-d zp*5OLFDPjDCa z&k1hrZ4azmVp_AAydQ`}`3ITWA70|REZ|^~zZ}vmlslH* z(Y(r$Pr(0tG0H*cN<}PhC5P96(Vo5THreyq z(x|0?>tYtQ8+%THBJC$h&26VrbrjK}L$WGY;0b0}4ADgA9CR=~lSXHOevnAbO@W|;3r$faJzdyjyk?b} z?sj36T7j-@SxJi_l||jITh{!S)k%NrOqDmPHxLWaP(ia3(A?nx(syFPqa#B5Q;y3G zYx)n|-DBDt*{t=O?8I-uwiM>-C+Zl?j95A;Gp-TVz{|9Zzg4<`1oE_%V_d>Gn~9?ZTt?n$RBc-l1eg zqxdKEv6!DPg&Kc37LW2M`~HiD5J)KoW#Ezg-C#`)cHvDEy}<5J-96D84?aRkXSmAy zTu>Y;#Wk|+_QWjp4f!$uSkZ(=3)H?+lO1y~Pefi56TASNXR!>m-d-Id8@vzB)OpW$ z>qCO_#bFmV!_#YnT%2$YlrnctASEVS-Q(r_qhwsWvA8`h%YOe!b|fSDXW^Ikmqj~* zWH4AmvEN~HTe>;Xi5vavH?O6WvLvWVAadS^%$X=uf()6u6x2@rf@y^q%sKreU1>oD z$?3gJ!uXE23Y}dt;_q{QOFTpO*~n#*=hP2By%2|!=Ps(<_yw(!C+On5dQ_JsAC^6& z_WF-~K^R@f>^~f(g@H$KA0xg;ZzW|9wiYp}b9|*}f^5Fa>8z2=9ci53QR~4ak~Q3v zn3XTfj~oh-<5b@*9UM>wf5Q_~XC2hXnfFw#S|uCQUYu`OX=$W+eJSYP zO?$HyfL?o4)%BKxC~GG`CE&k_ohR_dGVP@V^1V>U)4>K-T)G;s@H;*spxHSRe`T7k z_i2}(F%sF6Po@W7kE+k$${!cUx5Yv)8AJli_G$oeNX7km0>ONkmkml}sEW5UJ`vQ^zM4gOJ%vbhGezMbFy)%2vJQHJg)E$Z1iL z_aEVNLg7#^NIKqg&;33NztRGNjt{>07s!&}ta4malkCea#6b*1_RW`>dX6MviMz`Q zfqJVJRc1Mt-%{CIoz4Ku`ao*~LB9la3-2{auMzUWnzGbt;%nyhj8ry?jtuVo5JuJs zW>uUsc{5}ihEL$IPk*MLf@M5w_Wy_4?K%mZ+=U*{~d9$Z?1~6BvH`7 zwfO_gh_PKXIB`K%+UPzXK^AoJC49Kx6YG7r}nn{s@k}^b3#^B?8A}IZT4jrd)wF609`DANJ5cf z`P?fJlc9$OJWjm^n)ZuNbop-%Cv=E~MB>%8h3MV!H?tfylBle8iXqGf@K>{t-}=fF zAwivea#lH6XEv5+o%dQXq?y)y!{a#qq2IAb?ntU%og`l1^djXEtgJz6ovWCiP`P;6 zjiuZ^zJfiqweMdC`fCu)1yHISeh&O>u6aIF!B0SSZMG&J#SGvd)nL9;XX0fK?sWvI zDM+y{yHdOtN#A}av^|U$*>tIAYv-$JquMJqitVWN=#<+V6tC0LvbII$&0#bOn*xn%} z?CG5T?Y%tj6Azp8y`NE$KHg!85~A2dk{%-6RY9u+H|U{E4^;1JSfZ&nRprb~qO-4B z%azg)T@|k5H?eQ_A7Y3&r~?;83APF*Nl-V)tPa@TnRfmE3po_2$fbaq7zXd87;QEw zgkTI#uRUGh%>~cmX}`_9huvXj;6qhYgu?m=aU#p{Q40(smZ0~x6fLSAa(|Wkz6}@% zcu1EjwDLv`fr;b%5ry5CPD4`+uw&#Jy0Omzb+9|R(rV-I%xcl)@!G*9H);o#qxO?X z=;Ug2S5f_k-fi5I)j-(s6l?X3LKY1hC9`u13!vYDfbOh7Z~l;n9Q0tL&p+My`vD>N z&bI@7tSow)!HJual(LLl4OboYS?Jw^nm#@hrdMNEf?M2B_4DjBT845`S<1UmmD3PRVV0wQPkKtc3fOqzJ%q6bY0s7 zA{X9vnJzMVE3_rH721uNG18^gJCN{`yHAZ*Z0zZEL;Cvxhhq9wQ~|&2-w%<8d+w`| zk>)#DZ7~fG{1Psbf396YpRIFjU4ya4V@Iswk2J5nKRgOgnL`DH;1I)gzY~RmntXND z<@X02>8?(y6ob3mnum2^p=4#CNHO9f`o}fiHU(mzVY3#Z%= z%xJUm;-^(frL(Ue{8YGS_Nc?ftls*7{*#9t?~^*XiqFSI5lI}uN}o6 zo^Y_p9t0+Z9v0zv6@+dJ^o!B{`n!mfV2t)#F;F*69+dW&#PR&cm9}1RQuA^g3@L|w zwMLjpRZc=*tB`9N-sga(i$X*<0=z$~!^L7Bb?TaZNKQ`@a~&YOo!92=1m62xHesyc zcbnbW;Wt=`1HGJ*(b6JY=NqS|cTuqr0=^!C)gtAY!zU&8$dC0l^1h+fH4l=goBCmH zir~K6lqy;}vUYhT9_k)wTUhxm>8aeB6t-GYR9ocb!%Y+p$UTz;j-n)KAx9D$_%}ot z2n+;Z#*qySM8f{Rb|mF-9agbTjm(MyUza_PiOpyR>>g&NN{USB{>z}mmh59I>c+uo zwx7&^@C?wb5POnVP-A;UzVloxfA_qn^VQfkis3G{e=j{V^H8fWx3vte8fk9vkd`L1 zf@z`9ho13o^x`U0l)8gn715A#rgq{FT1LJxs=eJf<&r_pSR~&zYH8kthDv0Nx(?LR z-@WS*qbl&REbdT?sJb(N5)iVJDKCF!oZ3@3t6lD}J_gd7B9olzY9E62D|$0`9IE(* z;naijz}u9a5Ak+0dk=cbyRbc95zDCp(z44BdW?$!Q^}p<_KCDV<;7OTW($MhKPiw7 z-x!yfJA4DSMJ{UFat}W>jNHvTt2UGXdj@=`ePc)fkm~EikRi_V=6QU8hi1Tq`Z-vV z!&oO_zOR5^w{|x0k^irfkW2_-;*PiNq&+x_x9R!ARH?vtP)s(rwo~K98e9CtgoN4_ zSX6=1GSyTj|3201>;o#F{XoB<_;l{|V;UL~OggvIQp=jNZr+z{CG-DiN}8UQ-40S$ zR}bh*U=G@?Xso5{h^fGqjqcR^v?i8o6A))zJ5*7s*MDE&p(6k`*wb7diLAgrV4%&s zuq7i0;59RwE_TdNt*==nSO@cY<}A?+o6?Hx{Hivk+|!yW-M6BB@@yvGlhh@>_OLIeO-fpo za>2K|MGXQ|vKGAALMs@{TY0xE0$%`pxp$J{vF`Y)K=>_4yiExPR@TECgDo2w&wg$Q zyd2%{l}jO8{CBQodM7sYPVA7e$OY>j!?nrd8wBqY_|LqHQ2mn4`?d=}Ia_)Lg-yx@&m$wi!@&+01vj2;JpzQk>OicVR=-A%o zad3vXP5eH!f81ghu@B_!PF&SoE;g#OLli+);ug-@Y{`$M&4 zu?yH331Oc-a~MwGHu9^lur_#3qJ>wv_q5w@Bk1NYMCn^na}#hWKrL&j1dYL^R`ZQBe+O%=WqaP7Z>~qC-q-*5}LH* zyW?VNBbHmqOALk6B!IQh5n)#s!Bs;Xddu+jzyl#JF7ihwQL2YjB~2b8X3I}_vzNo8 zj~<&6>iy_@ zDkto1afY92IKZ-NCMOU@0)Y$T zCQmo3mp-*y*4$GbAH)XojeKeKVu0DMKw6W*N2gb@&PF+FL1U1 z&D{fSY~-HC690wlN)Z(*KS%>`(5k1Tw literal 0 HcmV?d00001 diff --git a/app/desktop/src/main/index.ts b/app/desktop/src/main/index.ts index e9d0a0a1c..981fb87ba 100644 --- a/app/desktop/src/main/index.ts +++ b/app/desktop/src/main/index.ts @@ -1,19 +1,29 @@ -import {app, BrowserWindow, shell} from 'electron'; +import {app, BrowserWindow, ipcMain, shell} from 'electron'; import path from 'path'; -let mainWindow: BrowserWindow | null = null; +const windows: Partial> = {}; -const getRendererUrl = () => { +const getRendererUrl = (route = 'app') => { const rendererUrlFromEnv = process.env.CLIPCC_DESKTOP_RENDERER_URL; if (!rendererUrlFromEnv) return null; const rendererUrl = new URL(rendererUrlFromEnv); - if (!rendererUrl.searchParams.has('route')) { - rendererUrl.searchParams.set('route', 'app'); - } + rendererUrl.searchParams.set('route', route); return rendererUrl.toString(); }; +const loadRendererRoute = (window: BrowserWindow, route = 'app') => { + const rendererUrl = getRendererUrl(route); + if (rendererUrl) { + return window.loadURL(rendererUrl); + } + return window.loadFile(path.resolve(__dirname, '..', 'renderer', 'index.html'), { + query: { + route + } + }); +}; + const createMainWindow = () => { const window = new BrowserWindow({ title: 'ClipCC', @@ -36,25 +46,126 @@ const createMainWindow = () => { return {action: 'deny'}; }); - const rendererUrl = getRendererUrl(); - if (rendererUrl) { - window.loadURL(rendererUrl); - } else { - window.loadFile(path.resolve(__dirname, '..', 'renderer', 'index.html'), { - query: { - route: 'app' - } - }); - } + loadRendererRoute(window, 'app'); window.once('ready-to-show', () => { - window.show(); + windows.loading?.show(); window.webContents.send('ready-to-show'); }); + window.webContents.once('did-finish-load', () => { + windows.loading?.hide(); + window.show(); + }); + + window.on('closed', () => { + if (windows.main === window) { + windows.main = undefined; + } + }); + + return window; +}; + +const createAboutWindow = () => { + const window = new BrowserWindow({ + title: 'About ClipCC', + width: 400, + height: 400, + parent: windows.main, + show: false, + autoHideMenuBar: true, + useContentSize: true, + webPreferences: { + preload: path.resolve(__dirname, 'preload.js'), + contextIsolation: true, + nodeIntegration: false, + sandbox: false + } + }); + + window.webContents.setWindowOpenHandler(({url}) => { + shell.openExternal(url); + return {action: 'deny'}; + }); + + loadRendererRoute(window, 'about'); + + window.on('close', event => { + event.preventDefault(); + window.hide(); + }); + + window.on('closed', () => { + if (windows.about === window) { + windows.about = undefined; + } + }); + + return window; +}; + +const createPrivacyWindow = () => { + const window = new BrowserWindow({ + title: 'ClipCC Privacy Policy', + width: 600, + height: 800, + parent: windows.main, + show: false, + autoHideMenuBar: true, + useContentSize: true, + webPreferences: { + preload: path.resolve(__dirname, 'preload.js'), + contextIsolation: true, + nodeIntegration: false, + sandbox: false + } + }); + + window.webContents.setWindowOpenHandler(({url}) => { + shell.openExternal(url); + return {action: 'deny'}; + }); + + loadRendererRoute(window, 'privacy'); + + window.on('close', event => { + event.preventDefault(); + window.hide(); + }); + + window.on('closed', () => { + if (windows.about === window) { + windows.about = undefined; + } + }); + + return window; +}; + +const createLoadingWindow = () => { + const window = new BrowserWindow({ + width: 300, + height: 300, + frame: false, + resizable: false, + show: false, + titleBarStyle: 'hiddenInset', + autoHideMenuBar: true, + webPreferences: { + preload: path.resolve(__dirname, 'preload.js'), + contextIsolation: true, + nodeIntegration: false, + sandbox: false + } + }); + + const loadingFilePath = path.resolve(__dirname, '..', 'renderer', 'loading.html'); + window.loadFile(loadingFilePath); + window.on('closed', () => { - if (mainWindow === window) { - mainWindow = null; + if (windows.loading === window) { + windows.loading = undefined; } }); @@ -62,23 +173,64 @@ const createMainWindow = () => { }; const ensureMainWindow = () => { - if (mainWindow?.isDestroyed()) { - mainWindow = null; + if (windows.main?.isDestroyed()) { + windows.main = undefined; + } + if (!windows.main) { + windows.main = createMainWindow(); + } + return windows.main; +}; + +const ensureAboutWindow = () => { + if (windows.about?.isDestroyed()) { + windows.about = undefined; } - if (!mainWindow) { - mainWindow = createMainWindow(); + if (!windows.about) { + windows.about = createAboutWindow(); } - return mainWindow; + return windows.about; +}; + +const ensurePrivacyWindow = () => { + if (windows.privacy?.isDestroyed()) { + windows.privacy = undefined; + } + if (!windows.privacy) { + windows.privacy = createPrivacyWindow(); + } + return windows.privacy; +}; + +const ensureLoadingWindow = () => { + if (windows.loading?.isDestroyed()) { + windows.loading = undefined; + } + if (!windows.loading) { + windows.loading = createLoadingWindow(); + } + return windows.loading; }; app.whenReady().then(() => { + ensureLoadingWindow(); ensureMainWindow(); + ensureAboutWindow(); + ensurePrivacyWindow(); app.on('activate', () => { ensureMainWindow(); }); }); +ipcMain.on('open-about-window', () => { + ensureAboutWindow().show(); +}); + +ipcMain.on('open-privacy-window', () => { + ensurePrivacyWindow().show(); +}); + app.on('window-all-closed', () => { if (process.platform !== 'darwin') { app.quit(); diff --git a/app/desktop/src/main/preload.ts b/app/desktop/src/main/preload.ts index 1f91981cc..7e6817122 100644 --- a/app/desktop/src/main/preload.ts +++ b/app/desktop/src/main/preload.ts @@ -1,8 +1,23 @@ import {contextBridge, ipcRenderer} from 'electron'; +const runtimeVersions = { + electron: process.versions.electron, + chrome: process.versions.chrome, + node: process.versions.node +}; + const desktopApi = { onReadyToShow (listener: () => void) { ipcRenderer.once('ready-to-show', listener); + }, + openAboutWindow () { + ipcRenderer.send('open-about-window'); + }, + openPrivacyWindow () { + ipcRenderer.send('open-privacy-window'); + }, + getRuntimeVersions () { + return runtimeVersions; } }; diff --git a/app/desktop/src/renderer/index.css b/app/desktop/src/renderer/index.css index 988dd56e2..8424bb5ca 100644 --- a/app/desktop/src/renderer/index.css +++ b/app/desktop/src/renderer/index.css @@ -1,19 +1,11 @@ html, -body, -#app { +body { /* probably unecessary, transitional until layout is refactored */ width: 100%; height: 100%; margin: 0; - - /* Setting min height/width makes the UI scroll below those sizes */ - min-width: 1024px; - min-height: 640px; /* Min height to fit sprite/backdrop button */ } /* @todo: move globally? Safe / side FX, for blocks particularly? */ * { box-sizing: border-box; } -[theme='dark'] body { - background-color: var(--clipcc-ui-white); -} diff --git a/app/desktop/src/renderer/index.ts b/app/desktop/src/renderer/index.ts index 6cea101ab..65170d812 100644 --- a/app/desktop/src/renderer/index.ts +++ b/app/desktop/src/renderer/index.ts @@ -14,16 +14,14 @@ const route = new URLSearchParams(window.location.search).get('route') || 'app'; let routeModulePromise; switch (route) { case 'app': - routeModulePromise = import('./App'); + routeModulePromise = import('./routes/app/app'); break; -/* case 'about': - routeModulePromise = import('./about.jsx'); + routeModulePromise = import('./routes/about/about'); break; case 'privacy': - routeModulePromise = import('./privacy.jsx'); + routeModulePromise = import('./routes/privacy/privacy'); break; -*/ } routeModulePromise?.then(routeModule => { diff --git a/app/desktop/src/renderer/ElectronStorageHelper.ts b/app/desktop/src/renderer/lib/ElectronStorageHelper.ts similarity index 100% rename from app/desktop/src/renderer/ElectronStorageHelper.ts rename to app/desktop/src/renderer/lib/ElectronStorageHelper.ts diff --git a/app/desktop/src/renderer/routes/about/about.css b/app/desktop/src/renderer/routes/about/about.css new file mode 100644 index 000000000..43f9ce7b3 --- /dev/null +++ b/app/desktop/src/renderer/routes/about/about.css @@ -0,0 +1,39 @@ +html, body { + background-color: #4D97FF; + color: white; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-weight: bolder; +} + +a:active, a:hover, a:link, a:visited { + color: currentColor; +} + +a:active, a:hover { + filter: brightness(0.9); +} + +.aboutBox { + margin: 0; + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); +} + +.aboutLogo { + max-width: 10rem; + max-height: 10rem; +} + +.aboutText { + margin: 1.5rem; +} + +.aboutDetails { + font-size: x-small; +} + +.aboutFooter { + font-size: small; +} diff --git a/app/desktop/src/renderer/routes/about/about.tsx b/app/desktop/src/renderer/routes/about/about.tsx new file mode 100644 index 000000000..823dff753 --- /dev/null +++ b/app/desktop/src/renderer/routes/about/about.tsx @@ -0,0 +1,32 @@ +import React from 'react'; +import packageJSON from '../../../../package.json'; + +import logo from '../../../common/icon/app.svg'; +import styles from './about.css'; + +const runtimeVersions = window.desktop?.getRuntimeVersions() ?? {}; + +const AboutElement = () => ( +

+
{`${packageJSON.productName}
+
+

{packageJSON.productName}

+ Version {packageJSON.version} + + { + ['Electron', 'Chrome', 'Node'].map(component => { + const versionKey = component.toLowerCase() as keyof typeof runtimeVersions; + const componentVersion = runtimeVersions[versionKey] ?? 'Unknown'; + return ; + }) + } +
{component}{componentVersion}
+
+
+); + +export default ; diff --git a/app/desktop/src/renderer/DesktopAppStateHOC.tsx b/app/desktop/src/renderer/routes/app/DesktopAppStateHOC.tsx similarity index 100% rename from app/desktop/src/renderer/DesktopAppStateHOC.tsx rename to app/desktop/src/renderer/routes/app/DesktopAppStateHOC.tsx diff --git a/app/desktop/src/renderer/DesktopGUIHOC.tsx b/app/desktop/src/renderer/routes/app/DesktopGUIHOC.tsx similarity index 95% rename from app/desktop/src/renderer/DesktopGUIHOC.tsx rename to app/desktop/src/renderer/routes/app/DesktopGUIHOC.tsx index 1cf85255d..dbed45234 100644 --- a/app/desktop/src/renderer/DesktopGUIHOC.tsx +++ b/app/desktop/src/renderer/routes/app/DesktopGUIHOC.tsx @@ -1,7 +1,7 @@ import omit from 'lodash.omit'; import {connect} from 'react-redux'; import type {AnyAction, Dispatch} from 'redux'; -import ElectronStorageHelper from './ElectronStorageHelper'; +import ElectronStorageHelper from '../../lib/ElectronStorageHelper'; import React from 'react'; import type VM from 'clipcc-vm'; import type {RootState} from 'clipcc-gui/src/containers/gui'; @@ -28,7 +28,6 @@ import { type InitialProjectData = Parameters[0]; const getInitialProjectData = (): Promise => Promise.resolve(null); -const showPrivacyPolicy = (): Promise => Promise.resolve(); const hasInitialProjectData = (projectData: InitialProjectData | null): projectData is InitialProjectData => { if (projectData === null) { @@ -158,9 +157,13 @@ const ScratchDesktopGUIHOC = function ( } handleClickAbout = () => { - // ipcRenderer.send('open-about-window'); + window.desktop?.openAboutWindow(); }; + handleShowPrivacyPolicy = () => { + window.desktop?.openPrivacyWindow(); + } + handleProjectTelemetryEvent: DesktopProjectTelemetryHandler = () => { // ipcRenderer.send(event, metadata); }; @@ -199,7 +202,7 @@ const ScratchDesktopGUIHOC = function ( }, { title: 'Privacy Policy', - onClick: () => showPrivacyPolicy() + onClick: () => this.handleShowPrivacyPolicy() }, { title: 'Data Settings', @@ -207,7 +210,7 @@ const ScratchDesktopGUIHOC = function ( } ], onProjectTelemetryEvent: this.handleProjectTelemetryEvent, - onShowPrivacyPolicy: showPrivacyPolicy, + onShowPrivacyPolicy: this.handleShowPrivacyPolicy, onStorageInit: this.handleStorageInit, onUpdateProjectTitle: this.handleUpdateProjectTitle }; diff --git a/app/desktop/src/renderer/routes/app/app.css b/app/desktop/src/renderer/routes/app/app.css new file mode 100644 index 000000000..d551673e4 --- /dev/null +++ b/app/desktop/src/renderer/routes/app/app.css @@ -0,0 +1,17 @@ +.app { + /* probably unecessary, transitional until layout is refactored */ + width: 100%; + height: 100%; + margin: 0; +} + +html, +body { + /* Setting min height/width makes the UI scroll below those sizes */ + min-width: 1024px; + min-height: 640px; /* Min height to fit sprite/backdrop button */ +} + +[theme='dark'] body { + background-color: var(--clipcc-ui-white); +} diff --git a/app/desktop/src/renderer/App.tsx b/app/desktop/src/renderer/routes/app/app.tsx similarity index 90% rename from app/desktop/src/renderer/App.tsx rename to app/desktop/src/renderer/routes/app/app.tsx index 2cfb7ab90..0baa2ae2d 100644 --- a/app/desktop/src/renderer/App.tsx +++ b/app/desktop/src/renderer/routes/app/app.tsx @@ -5,8 +5,10 @@ import GUI, {AppStateHOC, setAppElement} from 'clipcc-gui'; import ScratchDesktopAppStateHOC from './DesktopAppStateHOC'; import ScratchDesktopGUIHOC from './DesktopGUIHOC'; import React from 'react'; +import styles from './app.css'; const appTarget = document.getElementById('app')!; +appTarget.classList.add(styles.app); setAppElement(appTarget); diff --git a/app/desktop/src/renderer/routes/privacy/privacy.css b/app/desktop/src/renderer/routes/privacy/privacy.css new file mode 100644 index 000000000..a40fb4fc9 --- /dev/null +++ b/app/desktop/src/renderer/routes/privacy/privacy.css @@ -0,0 +1,14 @@ +html, body { + background-color: #4D97FF; + color: white; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-weight: normal; + line-height: 150%; +} + +.privacyBox { + background-color: white; + color: #575e75; + margin: 3rem; + padding: 2rem 3rem; +} diff --git a/app/desktop/src/renderer/routes/privacy/privacy.tsx b/app/desktop/src/renderer/routes/privacy/privacy.tsx new file mode 100644 index 000000000..ac7aaf05e --- /dev/null +++ b/app/desktop/src/renderer/routes/privacy/privacy.tsx @@ -0,0 +1,235 @@ +import React from 'react'; + +import styles from './privacy.css'; + +const PrivacyElement = () => ( +
+

Privacy Policy

+ The Scratch Privacy Policy was last updated: October 5, 2020 +

+ The Scratch Foundation (“Scratch”, “we” or “us”) understands how + important privacy is to our community. We wrote this Privacy Policy to explain what Personal Information + (“Information”) we collect through our offline editor (the “Scratch App”), how we use, process, and share it, and what we're doing to keep it safe. It + also tells you about your rights and choices with respect to your Personal Information, and how you can contact us if you have any questions or concerns. +

+

What Information Does Scratch Collect About Me?

+

+ For the purpose of this Privacy Policy, “Information” means any information relating to an + identified or identifiable individual. The Scratch App automatically collects and stores locally the + following Information through its telemetry system: the title of your project in text form, language + setting, time zone and events related to your use of the Scratch App (namely when the Scratch App was + opened and closed, if a project file has been loaded or saved, or if a new project is created). If you + choose to turn on the telemetry sharing feature, the Scratch App will transmit this information to Scratch. + Projects created in the Scratch App are not transmitted to or accessible by Scratch. +

+

How Does Scratch Use My Information?

+

We use this Information for the following purposes:

+
    +
  • + Analytics and Improving the Scratch App - We use the Information to analyze use of the Scratch + App and to enhance your learning experience on the Scratch App. +
  • +
  • + Academic and Scientific Research - We de-identify and aggregate Information for statistical + analysis in the context of scientific and academic research. For example, to help us understand how + people learn through the Scratch App and how we can enhance learning tools for young people. The + results of such research are shared with educators and researchers through conferences, journals, and + other academic or scientific publications. You can find out more on our Research page. +
  • +
  • + Legal - We may use your Information to enforce our Terms of Use, to defend our legal rights, and to comply with our legal obligations and internal + policies. We may do this by analyzing your use of the Scratch App. +
  • +
+

What Are The Legal Grounds For Processing Your Information?

+

+ If you are located in the European Economic Area, the United Kingdom or Switzerland, we only process your + Information based on a valid legal ground. A “legal ground” is a reason that justifies our use + of your Information. In this case, we or a third party have a legitimate interest in using your Information + (if you choose to allow the Scratch App to send the Scratch team your Information) to create, analyze and + share your aggregated or de-identified Information for research purposes, to analyze and enhance your + learning experience on the Scratch App and otherwise ensure and improve the safety, security, and + performance of the Scratch App. We only rely on our or a third party’s legitimate interests to process your + Information when these interests are not overridden by your rights and interests. +

+

How Does Scratch Share My Information?

+

+ We disclose information that we collect through the Scratch App to third parties in the following + circumstances: +

+
    +
  • + Service Providers - To third parties who provide services such as website hosting, data + analysis, Information technology and related infrastructure provisions, customer service, email + delivery, and other services. +
  • +
  • + Academic and Scientific Research - To research institutions, such as the Massachusetts Institute + of Technology (MIT), to learn about how our users learn through the Scratch App and develop new + learning tools. The results of this research or the statistical analysis may be shared through + conferences, journals, and other publications. +
  • +
  • + Merger - To a potential or actual acquirer, successor, or assignee as part of any + reorganization, merger, sale, joint venture, assignment, transfer, or other disposition of all or any + portion of our organization or assets. You will have the opportunity to opt out of any such transfer if + the new entity's planned processing of your Information differs materially from that set forth in + this Privacy Policy. +
  • +
  • + Legal - If required to do so by law or in the good faith belief that such action is appropriate: + (a) under applicable law, including laws outside your country of residence; (b) to comply with legal + process; (c) to respond to requests from public and government authorities, such as school, school + districts, and law enforcement, including public and government authorities outside your country of + residence; (d) to enforce our terms and conditions; (e) to protect our operations or those of any of + our affiliates; (f) to protect our rights, privacy, safety, or property, and/or that of our affiliates, + you, or others; and (g) to allow us to pursue available remedies or limit the damages that we may + sustain. +
  • +
+

Children and Student Privacy

+

+ The Scratch Foundation is a 501(c)(3) nonprofit organization. As such, the Children's Online Privacy + Protection Act (COPPA) does not apply to Scratch. Nevertheless, Scratch takes children's privacy + seriously. Scratch collects only minimal information from its users, and only uses and discloses + information to provide the services and for limited other purposes, such as research, as described in this + Privacy Policy. +

+

+ Scratch does not collect information from a student's education record, as defined by the Family + Educational Rights and Privacy Act (FERPA). Scratch does not disclose information of students to any third + parties except as described in this Privacy Policy. +

+

Your Data Protection Rights (EEA)

+

+ If you are located in the European Economic Area, the United Kingdom or Switzerland, you have certain + rights in relation to your Information: +

+
    +
  • + Access, Correction and Data Portability - You may ask for an overview of the Information we + process about you and to receive a copy of your Information. You also have the right to request to + correct incomplete, inaccurate or outdated Information. To the extent required by applicable law, you + may request us to provide your Information to another company. +
  • +
  • + Objection – You may object to (this means “ask us to stop”) any use of your + Information that is not (i) processed to comply with a legal obligation, (ii) necessary to do what is + provided in a contract between Scratch and you, or (iii) if we have a compelling reason to do so (such + as, to ensure safety and security in our online community). If you do object, we will work with you to + find a reasonable solution. +
  • +
  • + Deletion - You may also request the deletion of your Information, as permitted under applicable + law. This applies, for instance, where your Information is outdated or the processing is not necessary + or is unlawful; where you withdraw your consent to our processing based on such consent; or where you + have objected to our processing. In some situations, we may need to retain your Information due to + legal obligations or for litigation purposes. If you want to have all of your Information removed from + our servers, please contact help@scratch.mit.edu for assistance. +
  • +
  • + Restriction Of Processing - You may request that we restrict processing of your Information + while we are processing a request relating to (i) the accuracy of your Information, (ii) the lawfulness + of the processing of your Information, or (iii) our legitimate interests to process this Information. + You may also request that we restrict processing of your Information if you wish to use the Information + for litigation purposes. +
  • +
  • + Withdrawal Of Consent – Where we rely on consent for the processing of your Information, you + have the right to withdraw it at any time and free of charge. When you do so, this will not affect the + lawfulness of the processing before your consent withdrawal. +
  • +
+

+ In addition to the above-mentioned rights, you also have the right to lodge a complaint with a competent + supervisory authority subject to applicable law. However, there are exceptions and limitations to each of + these rights. We may, for example, refuse to act on a request if the request is manifestly unfounded or + excessive, or if the request is likely to adversely affect the rights and freedoms of others, prejudice the + execution or enforcement of the law, interfere with pending or future litigation, or infringe applicable + law. To submit a request to exercise your rights, please contact help@scratch.mit.edu for assistance. +

+

Data Retention

+

+ We take measures to delete your Information or keep it in a form that does not allow you to be identified + when this Information is no longer necessary for the purposes for which we process it, unless we are + required by law to keep this Information for a longer period. When determining the retention period, we + take into account various criteria, such as the type of services requested by or provided to you, the + nature and length of our relationship with you, possible re-enrollment with our services, the impact on the + services we provide to you if we delete some Information from or about you, mandatory retention periods + provided by law and the statute of limitations. +

+

How Does Scratch Protect My Information?

+

+ Scratch has in place administrative, physical, and technical procedures that are intended to protect the + Information we collect on the Scratch App against accidental or unlawful destruction, accidental loss, + unauthorized alteration, unauthorized disclosure or access, misuse, and any other unlawful form of + processing of the Information. However, as effective as these measures are, no security system is + impenetrable. We cannot completely guarantee the security of our databases, nor can we guarantee that the + Information you supply will not be intercepted while being transmitted to us over the Internet. +

+

International Data Transfer

+

+ We may transfer your Information to countries other than the country where you are located, including to + the U.S. (where our Scratch servers are located) or any other country in which we or our service providers + maintain facilities. If you are located in the European Economic Area, the United Kingdom or Switzerland, + or other regions with laws governing data collection and use that may differ from U.S. law, please note + that we may transfer your Information to a country and jurisdiction that does not have the same data + protection laws as your jurisdiction. We apply appropriate safeguards to the Information processed and + transferred on our behalf. Please contact us for more information on the safeguards used. +

+

Notifications Of Changes To The Privacy Policy

+

+ We review our Privacy Policy on a periodic basis, and we may modify our policies as appropriate. We will + notify you of any material changes. We encourage you to review our Privacy Policy on a regular basis. The + “Last Updated” date at the top of this page indicates when this Privacy Policy was last + revised. Your continued use of the Scratch App following these changes means that you accept the revised + Privacy Policy. +

+

Contact Us

+

+ The Scratch Foundation is the entity responsible for the processing of your Information. If you have any + questions about this Privacy Policy, or if you would like to exercise your rights to your Information, you + may contact us at help@scratch.mit.edu or via mail at: +

+
+
Scratch Foundation
+
ATTN: Privacy Policy
+
+
201 South Street
+ Boston, MA 02111 +
+
+
+); + +export default ; diff --git a/app/desktop/src/types.d.ts b/app/desktop/src/types.d.ts index 480f0fdd5..4d30f17b6 100644 --- a/app/desktop/src/types.d.ts +++ b/app/desktop/src/types.d.ts @@ -43,6 +43,13 @@ declare module 'react-intl' { interface ClipCCDesktopApi { onReadyToShow(listener: () => void): void; + openAboutWindow(): void; + openPrivacyWindow(): void; + getRuntimeVersions(): { + electron?: string; + chrome?: string; + node?: string; + }; } interface Window { diff --git a/packages/gui/src/lib/desktop-gui-types.ts b/packages/gui/src/lib/desktop-gui-types.ts index e48d6a4e8..54ed5ef66 100644 --- a/packages/gui/src/lib/desktop-gui-types.ts +++ b/packages/gui/src/lib/desktop-gui-types.ts @@ -18,7 +18,7 @@ export interface DesktopGuiInjectionProps { isScratchDesktop?: boolean; onClickAbout?: DesktopAboutMenu; onProjectTelemetryEvent?: DesktopProjectTelemetryHandler; - onShowPrivacyPolicy?: () => Promise; + onShowPrivacyPolicy?: () => void; onStorageInit?: (storageInstance: ScratchStorage) => void; onUpdateProjectTitle?: (newTitle: string) => void; } From 6742868fcbad12192ab2df595cb9a1248f5681ba Mon Sep 17 00:00:00 2001 From: SimonShiki Date: Fri, 10 Apr 2026 20:35:48 +0800 Subject: [PATCH 07/36] :sparkles: feat(desktop): add bundle workflow Signed-off-by: SimonShiki --- app/desktop/.env | 15 ++ app/desktop/electron-builder.yaml | 63 +++++ app/desktop/package.json | 3 + .../scripts/electron-builder-wrapper.mjs | 176 ++++++++++++++ app/desktop/src/main/index.ts | 229 +----------------- app/desktop/src/main/ipc.ts | 16 ++ app/desktop/src/main/window-manager.ts | 225 +++++++++++++++++ 7 files changed, 505 insertions(+), 222 deletions(-) create mode 100644 app/desktop/.env create mode 100644 app/desktop/electron-builder.yaml create mode 100644 app/desktop/scripts/electron-builder-wrapper.mjs create mode 100644 app/desktop/src/main/ipc.ts create mode 100644 app/desktop/src/main/window-manager.ts diff --git a/app/desktop/.env b/app/desktop/.env new file mode 100644 index 000000000..5e0ff27a0 --- /dev/null +++ b/app/desktop/.env @@ -0,0 +1,15 @@ +# electron-builder signing placeholders for distribution builds (`--mode=dist`) +# Fill these in CI/local secret store as needed. + +# Windows/macOS code signing certificate +CSC_LINK= +CSC_KEY_PASSWORD= + +# Optional Windows-specific override certificate (when different from CSC_*) +WIN_CSC_LINK= +WIN_CSC_KEY_PASSWORD= + +# Optional macOS notarization (recommended App Store Connect API key method) +APPLE_API_KEY= +APPLE_API_KEY_ID= +APPLE_API_ISSUER= diff --git a/app/desktop/electron-builder.yaml b/app/desktop/electron-builder.yaml new file mode 100644 index 000000000..b0f00e90a --- /dev/null +++ b/app/desktop/electron-builder.yaml @@ -0,0 +1,63 @@ +appId: com.codingclip.clipcc3 +productName: ClipCC +electronVersion: 41.2.0 +artifactName: clipcc-${version}-${os}-${arch}.${ext} +copyright: Copyright © 2019-2026 Clip Team. +compression: maximum +publish: null + +directories: + buildResources: buildResources + output: dist + +files: + - dist/**/* + - package.json + +extraResources: + - from: buildResources/icon + to: icon + +mac: + category: public.app-category.education + icon: buildResources/app.icns + entitlements: buildResources/entitlements.mac.plist + entitlementsInherit: buildResources/entitlements.mas.inherit.plist + hardenedRuntime: true + target: + - target: dmg + extendInfo: + NSCameraUsageDescription: >- + This app requires camera access when using the video sensing blocks. + NSMicrophoneUsageDescription: >- + This app requires microphone access when recording sounds or detecting loudness. + +dmg: + title: ClipCC ${version} + +win: + icon: buildResources/app.ico + target: + - target: nsis + arch: + - x64 + - ia32 + - target: zip + arch: + - x64 + +nsis: + oneClick: false + allowElevation: true + allowToChangeInstallationDirectory: true + createDesktopShortcut: true + createStartMenuShortcut: true + license: ../../LICENSE + include: buildResources/install.nsh + +linux: + category: Education + target: + - target: AppImage + - target: deb + - target: rpm diff --git a/app/desktop/package.json b/app/desktop/package.json index 599acbc8f..6a9dc5532 100644 --- a/app/desktop/package.json +++ b/app/desktop/package.json @@ -22,6 +22,9 @@ "build:preload": "webpack --env target=preload", "build:renderer": "webpack --env target=renderer", "build": "pnpm run build:main && pnpm run build:preload && pnpm run build:renderer", + "bundle:dir": "pnpm run build && node ./scripts/electron-builder-wrapper.mjs --mode=dir", + "bundle:dev": "pnpm run build && node ./scripts/electron-builder-wrapper.mjs --mode=dev", + "bundle:dist": "pnpm run build && node ./scripts/electron-builder-wrapper.mjs --mode=dist", "start": "node ./scripts/dev.mjs" }, "devDependencies": { diff --git a/app/desktop/scripts/electron-builder-wrapper.mjs b/app/desktop/scripts/electron-builder-wrapper.mjs new file mode 100644 index 000000000..40d951b06 --- /dev/null +++ b/app/desktop/scripts/electron-builder-wrapper.mjs @@ -0,0 +1,176 @@ +// @ts-check + +import {spawnSync} from 'node:child_process'; +import path from 'node:path'; +import fs from 'node:fs'; +import {createRequire} from 'node:module'; +import {fileURLToPath} from 'node:url'; + +const require = createRequire(import.meta.url); +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); +const projectDir = path.resolve(__dirname, '..'); +const configPath = path.resolve(projectDir, 'electron-builder.yaml'); + +/** + * @typedef {'dir' | 'dev' | 'dist'} BuildMode + */ + +/** + * @typedef ParsedArgs + * @property {BuildMode} mode Selected build mode for packaging. + * @property {string[]} passthroughArgs Forwarded electron-builder CLI arguments. + */ + +/** + * Parse wrapper arguments and extract mode. + * + * Supported forms: + * --mode=dir + * --mode dir + * + * Unknown args are forwarded to electron-builder. + * @param {string[]} argv Wrapper script command-line arguments. + * @returns {ParsedArgs} Parsed mode and forwarded argument list. + */ +const parseArgs = argv => { + /** @type {BuildMode} */ + let mode = 'dev'; + /** @type {string[]} */ + const passthroughArgs = []; + + for (let i = 0; i < argv.length; i++) { + const arg = argv[i]; + if (arg.startsWith('--mode=')) { + const value = arg.slice('--mode='.length); + if (value === 'dir' || value === 'dev' || value === 'dist') { + mode = value; + continue; + } + throw new Error(`Invalid --mode value: ${value}`); + } + + if (arg === '--mode') { + const value = argv[i + 1]; + if (value === 'dir' || value === 'dev' || value === 'dist') { + mode = value; + i++; + continue; + } + throw new Error(`Invalid --mode value: ${String(value)}`); + } + + passthroughArgs.push(arg); + } + + return {mode, passthroughArgs}; +}; + +/** + * Resolve platform selector for electron-builder CLI. + * @returns {'--win' | '--mac' | '--linux'} Platform flag matching current OS. + */ +const getCurrentPlatformFlag = () => { + switch (process.platform) { + case 'win32': + return '--win'; + case 'darwin': + return '--mac'; + case 'linux': + return '--linux'; + default: + throw new Error(`Unsupported platform: ${process.platform}`); + } +}; + +/** + * Check if rpmbuild is available in PATH. + * @returns {boolean} True when rpm toolchain is available or platform is non-Linux. + */ +const hasRpmBuild = () => { + if (process.platform !== 'linux') return true; + const check = spawnSync('rpmbuild', ['--version'], { + stdio: 'ignore' + }); + return check.status === 0; +}; + +/** + * Build argument list for electron-builder. + * @param {BuildMode} mode Requested build mode. + * @param {string[]} passthroughArgs Additional CLI arguments to pass through. + * @returns {string[]} Fully expanded electron-builder arguments. + */ +const createBuilderArgs = (mode, passthroughArgs) => { + /** @type {string[]} */ + const args = [ + 'build', + '--config', + configPath, + '--projectDir', + projectDir, + getCurrentPlatformFlag() + ]; + + if (mode === 'dir') { + args.push('--dir', '--config.compression=store'); + } + + if (mode === 'dist') { + // Distribution artifacts should fail if signing is expected but missing. + args.push('--config.forceCodeSigning=true'); + } else { + // Keep local and CI dev/dir builds unsigned by default. + args.push('--config.forceCodeSigning=false'); + + if (process.platform === 'darwin') { + // Explicitly disable mac signing when producing unsigned artifacts. + args.push('--config.mac.identity=null'); + } + } + + if (process.platform === 'linux' && !hasRpmBuild()) { + // rpm target requires rpmbuild/fpm toolchain. + args.push('--linux', 'AppImage', 'deb'); + console.warn('[electron-builder-wrapper] rpmbuild not found; skipping rpm target.'); + } + + return args.concat(passthroughArgs); +}; + +/** + * Run electron-builder CLI with the given arguments. + * @param {string[]} args Final argument list for electron-builder. + */ +const runElectronBuilder = args => { + const cliPath = require.resolve('electron-builder/out/cli/cli.js'); + console.log(`[electron-builder-wrapper] mode args: ${args.join(' ')}`); + + const result = spawnSync(process.execPath, [cliPath, ...args], { + cwd: projectDir, + stdio: 'inherit', + env: process.env + }); + + if (result.error) { + throw result.error; + } + if (result.signal) { + throw new Error(`electron-builder terminated by signal: ${result.signal}`); + } + if (typeof result.status === 'number' && result.status !== 0) { + throw new Error(`electron-builder exited with code ${result.status}`); + } +}; + +const main = () => { + if (!fs.existsSync(configPath)) { + throw new Error(`Missing config: ${configPath}`); + } + + const {mode, passthroughArgs} = parseArgs(process.argv.slice(2)); + const args = createBuilderArgs(mode, passthroughArgs); + runElectronBuilder(args); +}; + +main(); diff --git a/app/desktop/src/main/index.ts b/app/desktop/src/main/index.ts index 981fb87ba..1050fc2d6 100644 --- a/app/desktop/src/main/index.ts +++ b/app/desktop/src/main/index.ts @@ -1,234 +1,19 @@ -import {app, BrowserWindow, ipcMain, shell} from 'electron'; -import path from 'path'; +import {app} from 'electron'; -const windows: Partial> = {}; - -const getRendererUrl = (route = 'app') => { - const rendererUrlFromEnv = process.env.CLIPCC_DESKTOP_RENDERER_URL; - if (!rendererUrlFromEnv) return null; - - const rendererUrl = new URL(rendererUrlFromEnv); - rendererUrl.searchParams.set('route', route); - return rendererUrl.toString(); -}; - -const loadRendererRoute = (window: BrowserWindow, route = 'app') => { - const rendererUrl = getRendererUrl(route); - if (rendererUrl) { - return window.loadURL(rendererUrl); - } - return window.loadFile(path.resolve(__dirname, '..', 'renderer', 'index.html'), { - query: { - route - } - }); -}; - -const createMainWindow = () => { - const window = new BrowserWindow({ - title: 'ClipCC', - width: 1280, - height: 820, - minWidth: 960, - minHeight: 600, - show: false, - autoHideMenuBar: true, - webPreferences: { - preload: path.resolve(__dirname, 'preload.js'), - contextIsolation: true, - nodeIntegration: false, - sandbox: false - } - }); - - window.webContents.setWindowOpenHandler(({url}) => { - shell.openExternal(url); - return {action: 'deny'}; - }); - - loadRendererRoute(window, 'app'); - - window.once('ready-to-show', () => { - windows.loading?.show(); - window.webContents.send('ready-to-show'); - }); - - window.webContents.once('did-finish-load', () => { - windows.loading?.hide(); - window.show(); - }); - - window.on('closed', () => { - if (windows.main === window) { - windows.main = undefined; - } - }); - - return window; -}; - -const createAboutWindow = () => { - const window = new BrowserWindow({ - title: 'About ClipCC', - width: 400, - height: 400, - parent: windows.main, - show: false, - autoHideMenuBar: true, - useContentSize: true, - webPreferences: { - preload: path.resolve(__dirname, 'preload.js'), - contextIsolation: true, - nodeIntegration: false, - sandbox: false - } - }); - - window.webContents.setWindowOpenHandler(({url}) => { - shell.openExternal(url); - return {action: 'deny'}; - }); - - loadRendererRoute(window, 'about'); - - window.on('close', event => { - event.preventDefault(); - window.hide(); - }); - - window.on('closed', () => { - if (windows.about === window) { - windows.about = undefined; - } - }); - - return window; -}; - -const createPrivacyWindow = () => { - const window = new BrowserWindow({ - title: 'ClipCC Privacy Policy', - width: 600, - height: 800, - parent: windows.main, - show: false, - autoHideMenuBar: true, - useContentSize: true, - webPreferences: { - preload: path.resolve(__dirname, 'preload.js'), - contextIsolation: true, - nodeIntegration: false, - sandbox: false - } - }); - - window.webContents.setWindowOpenHandler(({url}) => { - shell.openExternal(url); - return {action: 'deny'}; - }); - - loadRendererRoute(window, 'privacy'); - - window.on('close', event => { - event.preventDefault(); - window.hide(); - }); - - window.on('closed', () => { - if (windows.about === window) { - windows.about = undefined; - } - }); - - return window; -}; - -const createLoadingWindow = () => { - const window = new BrowserWindow({ - width: 300, - height: 300, - frame: false, - resizable: false, - show: false, - titleBarStyle: 'hiddenInset', - autoHideMenuBar: true, - webPreferences: { - preload: path.resolve(__dirname, 'preload.js'), - contextIsolation: true, - nodeIntegration: false, - sandbox: false - } - }); - - const loadingFilePath = path.resolve(__dirname, '..', 'renderer', 'loading.html'); - window.loadFile(loadingFilePath); - - window.on('closed', () => { - if (windows.loading === window) { - windows.loading = undefined; - } - }); - - return window; -}; - -const ensureMainWindow = () => { - if (windows.main?.isDestroyed()) { - windows.main = undefined; - } - if (!windows.main) { - windows.main = createMainWindow(); - } - return windows.main; -}; - -const ensureAboutWindow = () => { - if (windows.about?.isDestroyed()) { - windows.about = undefined; - } - if (!windows.about) { - windows.about = createAboutWindow(); - } - return windows.about; -}; - -const ensurePrivacyWindow = () => { - if (windows.privacy?.isDestroyed()) { - windows.privacy = undefined; - } - if (!windows.privacy) { - windows.privacy = createPrivacyWindow(); - } - return windows.privacy; -}; - -const ensureLoadingWindow = () => { - if (windows.loading?.isDestroyed()) { - windows.loading = undefined; - } - if (!windows.loading) { - windows.loading = createLoadingWindow(); - } - return windows.loading; -}; +import {registerIpcListeners} from './ipc'; +import {ensureMainWindow, initializeWindows, setAppQuitting} from './window-manager'; app.whenReady().then(() => { - ensureLoadingWindow(); - ensureMainWindow(); - ensureAboutWindow(); - ensurePrivacyWindow(); + initializeWindows(); + registerIpcListeners(); app.on('activate', () => { ensureMainWindow(); }); }); -ipcMain.on('open-about-window', () => { - ensureAboutWindow().show(); -}); - -ipcMain.on('open-privacy-window', () => { - ensurePrivacyWindow().show(); +app.on('before-quit', () => { + setAppQuitting(); }); app.on('window-all-closed', () => { diff --git a/app/desktop/src/main/ipc.ts b/app/desktop/src/main/ipc.ts new file mode 100644 index 000000000..b779d4d8c --- /dev/null +++ b/app/desktop/src/main/ipc.ts @@ -0,0 +1,16 @@ +import {ipcMain} from 'electron'; + +import {openAboutWindow, openPrivacyWindow} from './window-manager'; + +export const registerIpcListeners = () => { + const onOpenAboutWindow = () => { + openAboutWindow(); + }; + + const onOpenPrivacyWindow = () => { + openPrivacyWindow(); + }; + + ipcMain.on('open-about-window', onOpenAboutWindow); + ipcMain.on('open-privacy-window', onOpenPrivacyWindow); +}; diff --git a/app/desktop/src/main/window-manager.ts b/app/desktop/src/main/window-manager.ts new file mode 100644 index 000000000..b5e2b69ae --- /dev/null +++ b/app/desktop/src/main/window-manager.ts @@ -0,0 +1,225 @@ +import {BrowserWindow, type BrowserWindowConstructorOptions, shell} from 'electron'; +import path from 'path'; + +interface CreateWindowOptions extends BrowserWindowConstructorOptions { + openExternalLinks?: boolean; +}; + +const defaultWebPreferences: BrowserWindowConstructorOptions['webPreferences'] = { + preload: path.resolve(__dirname, 'preload.js'), + contextIsolation: true, + nodeIntegration: false, + sandbox: false +}; + +export const createWindow = ({ + openExternalLinks = true, + webPreferences, + ...options +}: CreateWindowOptions) => { + const window = new BrowserWindow({ + autoHideMenuBar: true, + ...options, + webPreferences: { + ...defaultWebPreferences, + ...webPreferences + } + }); + + if (openExternalLinks) { + window.webContents.setWindowOpenHandler(({url}) => { + shell.openExternal(url); + return {action: 'deny'}; + }); + } + + return window; +}; + +type WindowName = 'main' | 'about' | 'privacy' | 'loading'; + +const windows: Partial> = {}; +let isQuitting = false; + +const getRendererUrl = (route = 'app') => { + const rendererUrlFromEnv = process.env.CLIPCC_DESKTOP_RENDERER_URL; + if (!rendererUrlFromEnv) return null; + + const rendererUrl = new URL(rendererUrlFromEnv); + rendererUrl.searchParams.set('route', route); + return rendererUrl.toString(); +}; + +const loadRendererRoute = (window: BrowserWindow, route = 'app') => { + const rendererUrl = getRendererUrl(route); + if (rendererUrl) { + return window.loadURL(rendererUrl); + } + + return window.loadFile(path.resolve(__dirname, '..', 'renderer', 'index.html'), { + query: { + route + } + }); +}; + +const createMainWindow = () => { + const window = createWindow({ + title: 'ClipCC', + width: 1280, + height: 820, + minWidth: 960, + minHeight: 600, + show: false + }); + + loadRendererRoute(window, 'app'); + + window.once('ready-to-show', () => { + windows.loading?.show(); + window.webContents.send('ready-to-show'); + }); + + window.webContents.once('did-finish-load', () => { + windows.loading?.close(); + window.show(); + }); + + window.on('closed', () => { + if (windows.main === window) { + windows.main = undefined; + } + + if (!isQuitting) { + windows.about?.close(); + windows.privacy?.close(); + windows.loading?.close(); + } + }); + + return window; +}; + +const createAboutWindow = () => { + const window = createWindow({ + title: 'About ClipCC', + width: 400, + height: 400, + parent: windows.main, + show: false, + useContentSize: true + }); + + loadRendererRoute(window, 'about'); + + window.on('close', event => { + if (!isQuitting) { + event.preventDefault(); + window.hide(); + } + }); + + window.on('closed', () => { + if (windows.about === window) { + windows.about = undefined; + } + }); + + return window; +}; + +const createPrivacyWindow = () => { + const window = createWindow({ + title: 'ClipCC Privacy Policy', + width: 600, + height: 800, + parent: windows.main, + show: false, + useContentSize: true + }); + + loadRendererRoute(window, 'privacy'); + + window.on('close', event => { + if (!isQuitting) { + event.preventDefault(); + window.hide(); + } + }); + + window.on('closed', () => { + if (windows.privacy === window) { + windows.privacy = undefined; + } + }); + + return window; +}; + +const createLoadingWindow = () => { + const window = createWindow({ + width: 300, + height: 300, + frame: false, + resizable: false, + show: false, + titleBarStyle: 'hiddenInset', + openExternalLinks: false + }); + + const loadingFilePath = path.resolve(__dirname, '..', 'renderer', 'loading.html'); + window.loadFile(loadingFilePath); + + window.on('closed', () => { + if (windows.loading === window) { + windows.loading = undefined; + } + }); + + return window; +}; + +const ensureWindow = (name: WindowName) => { + const currentWindow = windows[name]; + if (currentWindow?.isDestroyed()) { + windows[name] = undefined; + } + + if (!windows[name]) { + switch (name) { + case 'main': + windows.main = createMainWindow(); + break; + case 'about': + windows.about = createAboutWindow(); + break; + case 'privacy': + windows.privacy = createPrivacyWindow(); + break; + case 'loading': + windows.loading = createLoadingWindow(); + break; + } + } + + return windows[name]!; +}; + +export const initializeWindows = () => { + ensureWindow('loading'); + ensureWindow('main'); +}; + +export const ensureMainWindow = () => ensureWindow('main'); + +export const openAboutWindow = () => { + ensureWindow('about').show(); +}; + +export const openPrivacyWindow = () => { + ensureWindow('privacy').show(); +}; + +export const setAppQuitting = () => { + isQuitting = true; +}; From 575f8e6e95519e4d78d929db3a2364cac46c7587 Mon Sep 17 00:00:00 2001 From: SimonShiki Date: Fri, 10 Apr 2026 20:55:28 +0800 Subject: [PATCH 08/36] :wrench: chore(desktop): reduce complexity Signed-off-by: SimonShiki --- app/desktop/src/main/index.ts | 6 +----- app/desktop/src/main/ipc.ts | 12 ++---------- app/desktop/src/main/window-manager.ts | 27 +++----------------------- 3 files changed, 6 insertions(+), 39 deletions(-) diff --git a/app/desktop/src/main/index.ts b/app/desktop/src/main/index.ts index 1050fc2d6..92cdfab20 100644 --- a/app/desktop/src/main/index.ts +++ b/app/desktop/src/main/index.ts @@ -1,7 +1,7 @@ import {app} from 'electron'; import {registerIpcListeners} from './ipc'; -import {ensureMainWindow, initializeWindows, setAppQuitting} from './window-manager'; +import {ensureMainWindow, initializeWindows} from './window-manager'; app.whenReady().then(() => { initializeWindows(); @@ -12,10 +12,6 @@ app.whenReady().then(() => { }); }); -app.on('before-quit', () => { - setAppQuitting(); -}); - app.on('window-all-closed', () => { if (process.platform !== 'darwin') { app.quit(); diff --git a/app/desktop/src/main/ipc.ts b/app/desktop/src/main/ipc.ts index b779d4d8c..85b2ec266 100644 --- a/app/desktop/src/main/ipc.ts +++ b/app/desktop/src/main/ipc.ts @@ -3,14 +3,6 @@ import {ipcMain} from 'electron'; import {openAboutWindow, openPrivacyWindow} from './window-manager'; export const registerIpcListeners = () => { - const onOpenAboutWindow = () => { - openAboutWindow(); - }; - - const onOpenPrivacyWindow = () => { - openPrivacyWindow(); - }; - - ipcMain.on('open-about-window', onOpenAboutWindow); - ipcMain.on('open-privacy-window', onOpenPrivacyWindow); + ipcMain.on('open-about-window', openAboutWindow); + ipcMain.on('open-privacy-window', openPrivacyWindow); }; diff --git a/app/desktop/src/main/window-manager.ts b/app/desktop/src/main/window-manager.ts index b5e2b69ae..8dffe3c9a 100644 --- a/app/desktop/src/main/window-manager.ts +++ b/app/desktop/src/main/window-manager.ts @@ -39,7 +39,6 @@ export const createWindow = ({ type WindowName = 'main' | 'about' | 'privacy' | 'loading'; const windows: Partial> = {}; -let isQuitting = false; const getRendererUrl = (route = 'app') => { const rendererUrlFromEnv = process.env.CLIPCC_DESKTOP_RENDERER_URL; @@ -90,11 +89,9 @@ const createMainWindow = () => { windows.main = undefined; } - if (!isQuitting) { - windows.about?.close(); - windows.privacy?.close(); - windows.loading?.close(); - } + windows.about?.close(); + windows.privacy?.close(); + windows.loading?.close(); }); return window; @@ -112,13 +109,6 @@ const createAboutWindow = () => { loadRendererRoute(window, 'about'); - window.on('close', event => { - if (!isQuitting) { - event.preventDefault(); - window.hide(); - } - }); - window.on('closed', () => { if (windows.about === window) { windows.about = undefined; @@ -140,13 +130,6 @@ const createPrivacyWindow = () => { loadRendererRoute(window, 'privacy'); - window.on('close', event => { - if (!isQuitting) { - event.preventDefault(); - window.hide(); - } - }); - window.on('closed', () => { if (windows.privacy === window) { windows.privacy = undefined; @@ -219,7 +202,3 @@ export const openAboutWindow = () => { export const openPrivacyWindow = () => { ensureWindow('privacy').show(); }; - -export const setAppQuitting = () => { - isQuitting = true; -}; From 48e3eaf2858e426f0ad1fa4f1f6c04146e1cca45 Mon Sep 17 00:00:00 2001 From: SimonShiki Date: Fri, 10 Apr 2026 21:24:05 +0800 Subject: [PATCH 09/36] :bug: fix(desktop): add back save before exit dialog Signed-off-by: SimonShiki --- app/desktop/src/main/index.ts | 6 +- app/desktop/src/main/window-manager.ts | 32 +- .../src/{main/preload.ts => preload/index.ts} | 0 app/desktop/webpack.config.mjs | 277 +----------------- app/desktop/webpack.main.mjs | 46 +++ app/desktop/webpack.preload.mjs | 46 +++ app/desktop/webpack.renderer.mjs | 161 ++++++++++ 7 files changed, 287 insertions(+), 281 deletions(-) rename app/desktop/src/{main/preload.ts => preload/index.ts} (100%) create mode 100644 app/desktop/webpack.main.mjs create mode 100644 app/desktop/webpack.preload.mjs create mode 100644 app/desktop/webpack.renderer.mjs diff --git a/app/desktop/src/main/index.ts b/app/desktop/src/main/index.ts index 92cdfab20..7b6d87acc 100644 --- a/app/desktop/src/main/index.ts +++ b/app/desktop/src/main/index.ts @@ -1,15 +1,11 @@ import {app} from 'electron'; import {registerIpcListeners} from './ipc'; -import {ensureMainWindow, initializeWindows} from './window-manager'; +import {initializeWindows} from './window-manager'; app.whenReady().then(() => { initializeWindows(); registerIpcListeners(); - - app.on('activate', () => { - ensureMainWindow(); - }); }); app.on('window-all-closed', () => { diff --git a/app/desktop/src/main/window-manager.ts b/app/desktop/src/main/window-manager.ts index 8dffe3c9a..814433f03 100644 --- a/app/desktop/src/main/window-manager.ts +++ b/app/desktop/src/main/window-manager.ts @@ -1,4 +1,4 @@ -import {BrowserWindow, type BrowserWindowConstructorOptions, shell} from 'electron'; +import {BrowserWindow, type BrowserWindowConstructorOptions, dialog, shell} from 'electron'; import path from 'path'; interface CreateWindowOptions extends BrowserWindowConstructorOptions { @@ -84,9 +84,24 @@ const createMainWindow = () => { window.show(); }); + window.webContents.on('will-prevent-unload', ev => { + const choice = dialog.showMessageBoxSync(window, { + type: 'question', + message: 'Leave ClipCC?', + detail: 'Any unsaved changes will be lost.', + buttons: ['Stay', 'Leave'], + cancelId: 0, // closing the dialog means "stay" + defaultId: 0 // pressing enter or space without explicitly selecting something means "stay" + }); + const shouldQuit = (choice === 1); + if (shouldQuit) { + ev.preventDefault(); + } + }); + window.on('closed', () => { if (windows.main === window) { - windows.main = undefined; + delete windows.main; } windows.about?.close(); @@ -111,7 +126,7 @@ const createAboutWindow = () => { window.on('closed', () => { if (windows.about === window) { - windows.about = undefined; + delete windows.about; } }); @@ -132,7 +147,7 @@ const createPrivacyWindow = () => { window.on('closed', () => { if (windows.privacy === window) { - windows.privacy = undefined; + delete windows.privacy; } }); @@ -155,7 +170,7 @@ const createLoadingWindow = () => { window.on('closed', () => { if (windows.loading === window) { - windows.loading = undefined; + delete windows.loading; } }); @@ -163,11 +178,6 @@ const createLoadingWindow = () => { }; const ensureWindow = (name: WindowName) => { - const currentWindow = windows[name]; - if (currentWindow?.isDestroyed()) { - windows[name] = undefined; - } - if (!windows[name]) { switch (name) { case 'main': @@ -193,8 +203,6 @@ export const initializeWindows = () => { ensureWindow('main'); }; -export const ensureMainWindow = () => ensureWindow('main'); - export const openAboutWindow = () => { ensureWindow('about').show(); }; diff --git a/app/desktop/src/main/preload.ts b/app/desktop/src/preload/index.ts similarity index 100% rename from app/desktop/src/main/preload.ts rename to app/desktop/src/preload/index.ts diff --git a/app/desktop/webpack.config.mjs b/app/desktop/webpack.config.mjs index e96cf436a..930945391 100644 --- a/app/desktop/webpack.config.mjs +++ b/app/desktop/webpack.config.mjs @@ -1,264 +1,8 @@ // @ts-check -import CopyWebpackPlugin from 'copy-webpack-plugin'; -import path from 'path'; -import fs from 'fs'; -import {createRequire} from 'module'; -import {fileURLToPath} from 'url'; -import webpack from 'webpack'; - -const require = createRequire(import.meta.url); -const __filename = fileURLToPath(import.meta.url); -const __dirname = path.dirname(__filename); - -const {version} = require('../../package.json'); - -/** - * Get module's root path from its name. - * @param {string} moduleName - the name of the module to get the path of - * @returns {string} the path to the module's root directory - */ -const getModulePath = moduleName => { - try { - return path.dirname(require.resolve(`${moduleName}/package.json`)); - } catch { - const fallbackModuleName = moduleName.replace(/^clipcc-/, ''); - const fallbackPath = path.resolve(__dirname, '..', '..', 'packages', fallbackModuleName); - if (fs.existsSync(path.resolve(fallbackPath, 'package.json'))) { - return fallbackPath; - } - - throw new Error(`Unable to resolve module path for ${moduleName}`); - } -}; - -class CleanSourceMapWebpackPlugin { -/** - * Apply plugin hook. - * @param {import('webpack').Compiler} compiler Webpack compiler instance. - */ - apply (compiler) { - compiler.hooks.done.tapPromise('CleanSourceMapWebpackPlugin', async stats => { - const {compilation} = /** @type {{compilation: import('webpack').Compilation}} */ (stats); - // if (process.env.NODE_ENV !== 'production') return; - const outputPath = compilation.outputOptions.path; - if (!outputPath) return; - /** @type {Promise[]} */ - const threads = []; - Object.keys(compilation.assets) - .filter(filename => /[a-zA-Z0-9]\.(js|css)\.map$/.test(filename)) - .forEach(filename => { - const filePath = path.resolve(outputPath, filename); - threads.push(fs.promises.unlink(filePath).catch(error => { - if (error?.code !== 'ENOENT') { - throw error; - } - })); - }); - await Promise.all(threads); - }); - } -} - -const getScriptLoaders = () => [ - { - test: /\.tsx?$/, - loader: 'esbuild-loader', - options: { - loader: 'tsx', - tsconfigRaw: require('./tsconfig.json') - } - }, - { - test: /\.jsx?$/, - loader: 'esbuild-loader', - options: { - loader: 'jsx' - } - } -]; - -/** @type {import('webpack').Configuration} */ -const rendererConfig = { - name: 'renderer', - mode: process.env.NODE_ENV === 'production' ? 'production' : 'development', - target: 'web', - entry: { - index: './src/renderer/index.ts' - }, - output: { - path: path.resolve(__dirname, 'dist', 'renderer'), - filename: '[name].js' - }, - resolve: { - extensions: ['.ts', '.tsx', '.js', '.jsx', '.json'] - }, - devtool: process.env.NODE_ENV === 'production' ? false : 'cheap-module-source-map', - devServer: { - host: '127.0.0.1', - port: 8386, - hot: false, - liveReload: true, - static: [ - { - directory: path.join(__dirname, 'static'), - publicPath: '/static' - }, - { - directory: path.join(getModulePath('clipcc-gui'), 'static'), - publicPath: '/static' - }, - { - directory: path.join(getModulePath('clipcc-block'), 'media'), - publicPath: '/static/blocks-media/default' - }, - { - directory: path.join(getModulePath('clipcc-block'), 'media'), - publicPath: '/static/blocks-media/high-contrast' - }, - { - directory: path.join(getModulePath('clipcc-gui'), 'src/lib/themes/high-contrast/blocks-media'), - publicPath: '/static/blocks-media/high-contrast' - } - ], - compress: true - }, - module: { - rules: [ - ...getScriptLoaders(), - { - test: /\.css$/, - use: [{ - loader: 'style-loader' - }, { - loader: 'css-loader', - options: { - modules: { - localIdentName: '[name]_[local]_[hash:base64:5]', - exportLocalsConvention: 'camelCase' - }, - importLoaders: 1 - } - }, { - loader: 'postcss-loader', - options: { - postcssOptions: { - plugins: [ - 'postcss-import' - ] - } - } - }] - }, - { - test: /\.(svg|png|wav|gif|jpg)$/, - type: 'asset/resource', - generator: { - filename: 'static/assets/[hash][ext][query]' - } - } - ] - }, - plugins: [ - new CopyWebpackPlugin({ - patterns: [ - { - from: path.resolve(__dirname, 'static'), - to: './static', - noErrorOnMissing: true - }, - { - from: path.resolve(getModulePath('clipcc-gui'), 'static'), - to: './static' - }, - { - from: path.resolve(__dirname, 'src', 'renderer', 'index.html'), - to: '.' - }, - { - from: path.resolve(__dirname, 'src', 'renderer', 'index.css'), - to: '.' - }, - { - from: path.resolve(__dirname, 'src', 'renderer', 'loading.html'), - to: '.' - }, - { - from: path.resolve(getModulePath('clipcc-block'), 'media'), - to: 'static/blocks-media/default' - }, - { - from: path.resolve(getModulePath('clipcc-block'), 'media'), - to: 'static/blocks-media/high-contrast' - }, - { - from: path.resolve(getModulePath('clipcc-gui'), 'src/lib/themes/high-contrast/blocks-media'), - to: 'static/blocks-media/high-contrast', - force: true - } - ] - }), - new webpack.DefinePlugin({ - 'process.env.DEBUG': Boolean(process.env.DEBUG), - 'process.env.GA_ID': `"${process.env.GA_ID || 'UA-000000-01'}"`, - 'clipcc.VERSION': version, - 'clipcc.BUILD_TIME': Date.now() - }), - new CleanSourceMapWebpackPlugin() - ] -}; - -/** @type {import('webpack').Configuration} */ -const mainConfig = { - name: 'main', - mode: process.env.NODE_ENV === 'production' ? 'production' : 'development', - target: 'electron-main', - entry: { - index: './src/main/index.ts' - }, - output: { - path: path.resolve(__dirname, 'dist', 'main'), - filename: '[name].js' - }, - resolve: { - extensions: ['.ts', '.js', '.json'] - }, - devtool: process.env.NODE_ENV === 'production' ? false : 'cheap-module-source-map', - module: { - rules: [ - ...getScriptLoaders() - ] - }, - plugins: [ - new CleanSourceMapWebpackPlugin() - ] -}; - -/** @type {import('webpack').Configuration} */ -const preloadConfig = { - name: 'preload', - mode: process.env.NODE_ENV === 'production' ? 'production' : 'development', - target: 'electron-preload', - entry: { - preload: './src/main/preload.ts' - }, - output: { - path: path.resolve(__dirname, 'dist', 'main'), - filename: '[name].js' - }, - resolve: { - extensions: ['.ts', '.js', '.json'] - }, - devtool: process.env.NODE_ENV === 'production' ? false : 'cheap-module-source-map', - module: { - rules: [ - ...getScriptLoaders() - ] - }, - plugins: [ - new CleanSourceMapWebpackPlugin() - ] -}; +import mainConfig from './webpack.main.mjs'; +import preloadConfig from './webpack.preload.mjs'; +import rendererConfig from './webpack.renderer.mjs'; /** * Select configs by target. @@ -268,9 +12,14 @@ const preloadConfig = { export default env => { const target = env?.target; - if (target === 'main') return mainConfig; - if (target === 'preload') return preloadConfig; - if (target === 'renderer') return rendererConfig; - - return [mainConfig, preloadConfig, rendererConfig]; + switch (target) { + case 'main': + return mainConfig; + case 'preload': + return preloadConfig; + case 'renderer': + return rendererConfig; + default: + return [mainConfig, preloadConfig, rendererConfig]; + } }; diff --git a/app/desktop/webpack.main.mjs b/app/desktop/webpack.main.mjs new file mode 100644 index 000000000..1150dc6bd --- /dev/null +++ b/app/desktop/webpack.main.mjs @@ -0,0 +1,46 @@ +// @ts-check + +import path from 'path'; +import {createRequire} from 'module'; +import {fileURLToPath} from 'url'; + +const require = createRequire(import.meta.url); +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + +/** @type {import('webpack').Configuration} */ +export default { + name: 'main', + mode: process.env.NODE_ENV === 'production' ? 'production' : 'development', + target: 'electron-main', + entry: { + index: './src/main/index.ts' + }, + output: { + path: path.resolve(__dirname, 'dist', 'main'), + filename: '[name].js' + }, + resolve: { + extensions: ['.ts', '.js', '.json'] + }, + devtool: process.env.NODE_ENV === 'production' ? false : 'cheap-module-source-map', + module: { + rules: [ + { + test: /\.tsx?$/, + loader: 'esbuild-loader', + options: { + loader: 'tsx', + tsconfigRaw: require('./tsconfig.json') + } + }, + { + test: /\.jsx?$/, + loader: 'esbuild-loader', + options: { + loader: 'jsx' + } + } + ] + } +}; diff --git a/app/desktop/webpack.preload.mjs b/app/desktop/webpack.preload.mjs new file mode 100644 index 000000000..9ab6246aa --- /dev/null +++ b/app/desktop/webpack.preload.mjs @@ -0,0 +1,46 @@ +// @ts-check + +import path from 'path'; +import {createRequire} from 'module'; +import {fileURLToPath} from 'url'; + +const require = createRequire(import.meta.url); +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + +/** @type {import('webpack').Configuration} */ +export default { + name: 'preload', + mode: process.env.NODE_ENV === 'production' ? 'production' : 'development', + target: 'electron-preload', + entry: { + preload: './src/preload/index.ts' + }, + output: { + path: path.resolve(__dirname, 'dist', 'main'), + filename: '[name].js' + }, + resolve: { + extensions: ['.ts', '.js', '.json'] + }, + devtool: process.env.NODE_ENV === 'production' ? false : 'cheap-module-source-map', + module: { + rules: [ + { + test: /\.tsx?$/, + loader: 'esbuild-loader', + options: { + loader: 'tsx', + tsconfigRaw: require('./tsconfig.json') + } + }, + { + test: /\.jsx?$/, + loader: 'esbuild-loader', + options: { + loader: 'jsx' + } + } + ] + } +}; diff --git a/app/desktop/webpack.renderer.mjs b/app/desktop/webpack.renderer.mjs new file mode 100644 index 000000000..68302f3af --- /dev/null +++ b/app/desktop/webpack.renderer.mjs @@ -0,0 +1,161 @@ +// @ts-check + +import path from 'path'; + +import CopyWebpackPlugin from 'copy-webpack-plugin'; +import {createRequire} from 'module'; +import {fileURLToPath} from 'url'; +import webpack from 'webpack'; +const require = createRequire(import.meta.url); +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + +const {version} = require('../../package.json'); + +/** + * @typedef {import('webpack-dev-server').Configuration} ConfigurationWithDevServer + */ + + +/** @type {webpack.Configuration} */ +export default { + name: 'renderer', + mode: process.env.NODE_ENV === 'production' ? 'production' : 'development', + target: 'web', + entry: { + index: './src/renderer/index.ts' + }, + output: { + path: path.resolve(__dirname, 'dist', 'renderer'), + filename: '[name].js' + }, + resolve: { + extensions: ['.ts', '.tsx', '.js', '.jsx', '.json'] + }, + devtool: process.env.NODE_ENV === 'production' ? false : 'cheap-module-source-map', + devServer: { + host: '127.0.0.1', + port: 8386, + hot: false, + liveReload: true, + static: [ + { + directory: path.resolve(__dirname, 'static'), + publicPath: '/static' + }, + { + directory: path.resolve(__dirname, '../../packages/gui/static'), + publicPath: '/static' + }, + { + directory: path.resolve(__dirname, '../../packages/block/media'), + publicPath: '/static/blocks-media/default' + }, + { + directory: path.resolve(__dirname, '../../packages/block/media'), + publicPath: '/static/blocks-media/high-contrast' + }, + { + directory: path.resolve(__dirname, '../../packages/gui/src/lib/themes/high-contrast/blocks-media'), + publicPath: '/static/blocks-media/high-contrast' + } + ], + compress: true + }, + module: { + rules: [ + { + test: /\.tsx?$/, + loader: 'esbuild-loader', + options: { + loader: 'tsx', + tsconfigRaw: require('./tsconfig.json') + } + }, + { + test: /\.jsx?$/, + loader: 'esbuild-loader', + options: { + loader: 'jsx' + } + }, + { + test: /\.css$/, + use: [{ + loader: 'style-loader' + }, { + loader: 'css-loader', + options: { + modules: { + localIdentName: '[name]_[local]_[hash:base64:5]', + exportLocalsConvention: 'camelCase' + }, + importLoaders: 1 + } + }, { + loader: 'postcss-loader', + options: { + postcssOptions: { + plugins: [ + 'postcss-import' + ] + } + } + }] + }, + { + test: /\.(svg|png|wav|gif|jpg)$/, + type: 'asset/resource', + generator: { + filename: 'static/assets/[hash][ext][query]' + } + } + ] + }, + plugins: [ + new CopyWebpackPlugin({ + patterns: [ + { + from: path.resolve(__dirname, 'static'), + to: './static', + noErrorOnMissing: true + }, + { + from: path.resolve(__dirname, '../../packages/gui/static'), + to: './static' + }, + { + from: path.resolve(__dirname, 'src', 'renderer', 'index.html'), + to: '.' + }, + { + from: path.resolve(__dirname, 'src', 'renderer', 'index.css'), + to: '.' + }, + { + from: path.resolve(__dirname, 'src', 'renderer', 'loading.html'), + to: '.' + }, + { + from: path.resolve(__dirname, '../../packages/block/media'), + to: 'static/blocks-media/default' + }, + { + from: path.resolve(__dirname, '../../packages/block/media'), + to: 'static/blocks-media/high-contrast' + }, + { + from: path.resolve(__dirname, '../../packages/gui/src/lib/themes/high-contrast/blocks-media'), + to: 'static/blocks-media/high-contrast', + force: true + } + ] + }), + new webpack.DefinePlugin({ + 'process.env.DEBUG': Boolean(process.env.DEBUG), + 'process.env.GA_ID': `"${process.env.GA_ID || 'UA-000000-01'}"`, + 'clipcc.VERSION': version, + 'clipcc.BUILD_TIME': Date.now() + }) + ] +}; From 3e0e92ce3d63f306f6d215121d20fc1ed0e15e70 Mon Sep 17 00:00:00 2001 From: SimonShiki Date: Fri, 10 Apr 2026 22:25:19 +0800 Subject: [PATCH 10/36] :bug: fix(desktop): add macos menu and custom ua Signed-off-by: SimonShiki --- app/desktop/scripts/dev.mjs | 10 +- app/desktop/src/main/index.ts | 22 ++- app/desktop/src/main/macos-menu.ts | 52 ++++++ app/desktop/src/main/window-manager.ts | 212 +++++++++++++++++++++---- 4 files changed, 257 insertions(+), 39 deletions(-) create mode 100644 app/desktop/src/main/macos-menu.ts diff --git a/app/desktop/scripts/dev.mjs b/app/desktop/scripts/dev.mjs index f1f667bd1..f5c9f0905 100644 --- a/app/desktop/scripts/dev.mjs +++ b/app/desktop/scripts/dev.mjs @@ -19,7 +19,6 @@ import configFactory from '../webpack.config.mjs'; const __filename = fileURLToPath(import.meta.url); const scriptsDir = path.dirname(__filename); const desktopDir = path.resolve(scriptsDir, '..'); -const rendererUrl = 'http://127.0.0.1:8386'; const nodeTargets = /** @type {const} */ (['main', 'preload']); /** @type {ChildProcess | null} */ @@ -109,12 +108,17 @@ const startElectron = reason => { return; } + const port = getConfig('renderer').devServer?.port; + if (!port) { + throw new Error('Renderer webpack config is missing devServer.port setting'); + } + log('electron', reason); electronProcess = spawn(electronPath, [desktopDir], { cwd: desktopDir, env: { ...process.env, - CLIPCC_DESKTOP_RENDERER_URL: rendererUrl + WEBPACK_WDS_PORT: port }, stdio: 'inherit' }); @@ -280,7 +284,7 @@ const startRendererServer = async () => { await rendererServer.start(); rendererReady = true; - log('renderer', `dev server listening on ${rendererUrl}`); + log('renderer', `dev server listening on http://localhost:${rendererConfig.devServer.port}`); maybeStartElectron(); }; diff --git a/app/desktop/src/main/index.ts b/app/desktop/src/main/index.ts index 7b6d87acc..025aac113 100644 --- a/app/desktop/src/main/index.ts +++ b/app/desktop/src/main/index.ts @@ -1,13 +1,33 @@ -import {app} from 'electron'; +import {app, Menu, session} from 'electron'; import {registerIpcListeners} from './ipc'; +import MacOSMenu from './macos-menu'; import {initializeWindows} from './window-manager'; +app.commandLine.appendSwitch('enable-features', 'FluentScrollbar,OverlayScrollbar'); app.whenReady().then(() => { + session.defaultSession.webRequest.onBeforeSendHeaders((details, callback) => { + const existingHeader = details.requestHeaders['User-Agent']; + const baseUserAgent = (typeof existingHeader === 'string' && existingHeader.trim()) ? + existingHeader : + app.userAgentFallback; + + details.requestHeaders['User-Agent'] = `${baseUserAgent} ClipCCDesktop/${app.getVersion()}`; + callback({requestHeaders: details.requestHeaders}); + }); + initializeWindows(); registerIpcListeners(); }); +if (process.platform === 'darwin') { + const osxMenu = Menu.buildFromTemplate(MacOSMenu(app)); + Menu.setApplicationMenu(osxMenu); +} else { + // disable menu for other platforms + Menu.setApplicationMenu(null); +} + app.on('window-all-closed', () => { if (process.platform !== 'darwin') { app.quit(); diff --git a/app/desktop/src/main/macos-menu.ts b/app/desktop/src/main/macos-menu.ts new file mode 100644 index 000000000..0b2706003 --- /dev/null +++ b/app/desktop/src/main/macos-menu.ts @@ -0,0 +1,52 @@ +import type {App, MenuItemConstructorOptions} from 'electron'; + +// Include the standard keyboard shortcuts in the edit menu +// so they can be used within the app. Only needed on Mac. +export default (app: App): MenuItemConstructorOptions[] => ([ + { + label: 'App', // Always overridden by app name + submenu: [{ + label: 'Quit', + accelerator: 'CmdOrCtrl+Q', + click: () => app.quit() + }] + }, + { + label: 'Edit', + submenu: [ + { + label: 'Undo', + accelerator: 'CmdOrCtrl+Z', + role: 'undo' + }, + { + label: 'Redo', + accelerator: 'Shift+CmdOrCtrl+Z', + role: 'redo' + }, + { + type: 'separator' + }, + { + label: 'Cut', + accelerator: 'CmdOrCtrl+X', + role: 'cut' + }, + { + label: 'Copy', + accelerator: 'CmdOrCtrl+C', + role: 'copy' + }, + { + label: 'Paste', + accelerator: 'CmdOrCtrl+V', + role: 'paste' + }, + { + label: 'Select All', + accelerator: 'CmdOrCtrl+A', + role: 'selectAll' + } + ] + } +]); diff --git a/app/desktop/src/main/window-manager.ts b/app/desktop/src/main/window-manager.ts index 814433f03..1a1b65c0c 100644 --- a/app/desktop/src/main/window-manager.ts +++ b/app/desktop/src/main/window-manager.ts @@ -1,9 +1,16 @@ -import {BrowserWindow, type BrowserWindowConstructorOptions, dialog, shell} from 'electron'; +import { + BrowserWindow, + type BrowserWindowConstructorOptions, + dialog, + shell, + systemPreferences +} from 'electron'; import path from 'path'; +import {pathToFileURL} from 'url'; -interface CreateWindowOptions extends BrowserWindowConstructorOptions { - openExternalLinks?: boolean; -}; +type WindowName = 'main' | 'about' | 'privacy' | 'loading'; + +const windows: Partial> = {}; const defaultWebPreferences: BrowserWindowConstructorOptions['webPreferences'] = { preload: path.resolve(__dirname, 'preload.js'), @@ -12,11 +19,140 @@ const defaultWebPreferences: BrowserWindowConstructorOptions['webPreferences'] = sandbox: false }; +const devToolKey = ((process.platform === 'darwin') ? + { // macOS: command+option+i + alt: true, // option + control: false, + meta: true, // command + shift: false, + code: 'KeyI' + } : { // Windows: control+shift+i + alt: false, + control: true, + meta: false, // Windows key + shift: true, + code: 'KeyI' + } +); + +const displayPermissionDeniedWarning = (window: BrowserWindow, permissionType: 'camera' | 'microphone') => { + let title = 'Permission Denied'; + let message = 'A permission has been denied.'; + + if (permissionType === 'camera') { + title = 'Camera Permission Denied'; + message = 'Permission to use the camera has been denied. ClipCC will not be able to use video sensing.'; + } else if (permissionType === 'microphone') { + title = 'Microphone Permission Denied'; + message = ( + 'Permission to use the microphone has been denied. ClipCC will not be able to record sounds ' + + 'or detect loudness.' + ); + } + + const instructions = (process.platform === 'darwin') ? + 'To change ClipCC permissions, please check "Privacy & Security" in System Settings.' : + 'To change ClipCC permissions, please check your system settings and restart ClipCC.'; + + void dialog.showMessageBox(window, { + type: 'warning', + title, + message: `${message}\n\n${instructions}` + }); +}; + +const askForMediaAccess = (mediaType: 'microphone' | 'camera') => { + if (systemPreferences.askForMediaAccess) { + return systemPreferences.askForMediaAccess(mediaType); + } + return true; +}; + +const getAllowedRequestingUrlBase = () => { + if (process.env.ELECTRON_WEBPACK_WDS_PORT) { + return `http://localhost:${process.env.ELECTRON_WEBPACK_WDS_PORT}/`; + } + + const rendererDirPath = `${path.resolve(__dirname, '..', 'renderer')}${path.sep}`; + return pathToFileURL(rendererDirPath).toString(); +}; + +const handlePermissionRequest = async ( + webContents: Electron.WebContents, + permission: string, + callback: (isAllowed: boolean) => void, + details: Electron.PermissionRequest +) => { + if (webContents !== windows.main?.webContents) { + callback(false); + return; + } + + if (!details.isMainFrame) { + callback(false); + return; + } + + if (permission !== 'media') { + callback(false); + return; + } + + const requiredBase = getAllowedRequestingUrlBase(); + if (!details.requestingUrl.startsWith(requiredBase)) { + callback(false); + return; + } + + let askForMicrophone = false; + let askForCamera = false; + const mediaTypes = (details as Electron.PermissionRequest & {mediaTypes?: string[]}).mediaTypes ?? []; + + for (const mediaType of mediaTypes) { + if (mediaType === 'audio') { + askForMicrophone = true; + continue; + } + if (mediaType === 'video') { + askForCamera = true; + continue; + } + + callback(false); + return; + } + + const parentWindow = windows.main; + + if (askForMicrophone) { + const microphoneResult = await askForMediaAccess('microphone'); + if (!microphoneResult) { + if (parentWindow) { + displayPermissionDeniedWarning(parentWindow, 'microphone'); + } + callback(false); + return; + } + } + + if (askForCamera) { + const cameraResult = await askForMediaAccess('camera'); + if (!cameraResult) { + if (parentWindow) { + displayPermissionDeniedWarning(parentWindow, 'camera'); + } + callback(false); + return; + } + } + + callback(true); +}; + export const createWindow = ({ - openExternalLinks = true, webPreferences, ...options -}: CreateWindowOptions) => { +}: BrowserWindowConstructorOptions) => { const window = new BrowserWindow({ autoHideMenuBar: true, ...options, @@ -26,40 +162,48 @@ export const createWindow = ({ } }); - if (openExternalLinks) { - window.webContents.setWindowOpenHandler(({url}) => { - shell.openExternal(url); - return {action: 'deny'}; - }); - } - - return window; -}; - -type WindowName = 'main' | 'about' | 'privacy' | 'loading'; + window.webContents.setWindowOpenHandler(({url}) => { + shell.openExternal(url); + return {action: 'deny'}; + }); -const windows: Partial> = {}; + window.webContents.session.setPermissionRequestHandler(handlePermissionRequest); + + window.webContents.on('before-input-event', (event, input) => { + if (input.code === devToolKey.code && + input.alt === devToolKey.alt && + input.control === devToolKey.control && + input.meta === devToolKey.meta && + input.shift === devToolKey.shift && + input.type === 'keyDown' && + !input.isAutoRepeat && + !input.isComposing) { + event.preventDefault(); + window.webContents.openDevTools({mode: 'detach', activate: true}); + } + }); -const getRendererUrl = (route = 'app') => { - const rendererUrlFromEnv = process.env.CLIPCC_DESKTOP_RENDERER_URL; - if (!rendererUrlFromEnv) return null; + window.once('ready-to-show', () => { + window.webContents.send('ready-to-show'); + }); - const rendererUrl = new URL(rendererUrlFromEnv); - rendererUrl.searchParams.set('route', route); - return rendererUrl.toString(); + return window; }; const loadRendererRoute = (window: BrowserWindow, route = 'app') => { - const rendererUrl = getRendererUrl(route); - if (rendererUrl) { - return window.loadURL(rendererUrl); + if (!process.env.ELECTRON_WEBPACK_WDS_PORT) { + return window.loadFile(path.resolve(__dirname, '..', 'renderer', 'index.html'), { + query: { + route + } + }); } + const devServerUrl = `http://localhost:${process.env.ELECTRON_WEBPACK_WDS_PORT}/`; - return window.loadFile(path.resolve(__dirname, '..', 'renderer', 'index.html'), { - query: { - route - } - }); + const rendererUrl = new URL(devServerUrl); + rendererUrl.searchParams.set('route', route); + + return window.loadURL(rendererUrl.toString()); }; const createMainWindow = () => { @@ -76,7 +220,6 @@ const createMainWindow = () => { window.once('ready-to-show', () => { windows.loading?.show(); - window.webContents.send('ready-to-show'); }); window.webContents.once('did-finish-load', () => { @@ -161,8 +304,7 @@ const createLoadingWindow = () => { frame: false, resizable: false, show: false, - titleBarStyle: 'hiddenInset', - openExternalLinks: false + titleBarStyle: 'hiddenInset' }); const loadingFilePath = path.resolve(__dirname, '..', 'renderer', 'loading.html'); From f027ade05bdf27aba3fb0e3ea60fe8132effa9b9 Mon Sep 17 00:00:00 2001 From: SimonShiki Date: Thu, 16 Apr 2026 15:27:03 +0800 Subject: [PATCH 11/36] :wrench: chore: add hot reload support for desktop Signed-off-by: SimonShiki --- app/desktop/package.json | 2 ++ app/desktop/scripts/dev.mjs | 48 +++++++++++++++++++++++--- app/desktop/src/main/window-manager.ts | 9 +++-- app/desktop/webpack.main.mjs | 2 ++ app/desktop/webpack.preload.mjs | 2 ++ app/desktop/webpack.renderer.mjs | 40 ++++++++++++++++++--- packages/block/webpack.config.js | 3 +- packages/gui/package.json | 1 + packages/gui/webpack.config.js | 5 +-- pnpm-lock.yaml | 6 ++++ 10 files changed, 103 insertions(+), 15 deletions(-) diff --git a/app/desktop/package.json b/app/desktop/package.json index 972590238..43846f931 100644 --- a/app/desktop/package.json +++ b/app/desktop/package.json @@ -45,9 +45,11 @@ "eslint-config-clipcc": "workspace:~", "globals": "^16.5.0", "lodash.bindall": "4.4.0", + "node-polyfill-webpack-plugin": "^3.0.0", "react": "catalog:", "react-dom": "16.2.1", "redux": "3.7.2", + "rule-inheritance-webpack-plugin": "^0.4.0", "style-loader": "^4.0.0", "ts-loader": "^9.5.4", "typescript": "catalog:", diff --git a/app/desktop/scripts/dev.mjs b/app/desktop/scripts/dev.mjs index f5c9f0905..19ac9ac21 100644 --- a/app/desktop/scripts/dev.mjs +++ b/app/desktop/scripts/dev.mjs @@ -99,6 +99,35 @@ const handleNodeBuildResult = (target, stats) => { return true; }; +/** + * Print warnings and errors from renderer builds. + * @param {Stats} stats - Webpack stats for the renderer build. + * @returns {boolean} True when the build succeeded. + */ +const handleRendererBuildResult = stats => { + const output = stats.toString({ + colors: true, + preset: 'errors-warnings', + timings: true + }); + + if (output) { + console.log(output); + } + + if (stats.hasErrors()) { + log('renderer', 'build failed; waiting for a successful rebuild before launching Electron'); + return false; + } + + const buildTime = typeof stats.endTime === 'number' && typeof stats.startTime === 'number' ? + ` in ${stats.endTime - stats.startTime} ms` : + ''; + + log('renderer', `built successfully${buildTime}`); + return true; +}; + /** * Launch the Electron app against the renderer dev server. * @param {string} reason - Why Electron is being launched. @@ -118,7 +147,7 @@ const startElectron = reason => { cwd: desktopDir, env: { ...process.env, - WEBPACK_WDS_PORT: port + ELECTRON_WEBPACK_WDS_PORT: port }, stdio: 'inherit' }); @@ -277,15 +306,26 @@ const startRendererServer = async () => { } rendererCompiler = webpack(rendererConfig); + rendererCompiler.hooks.done.tap('clipcc-desktop-dev-runner-renderer', stats => { + const succeeded = handleRendererBuildResult(stats); + if (!succeeded) { + return; + } + + const isFirstSuccessfulBuild = !rendererReady; + rendererReady = true; + + if (isFirstSuccessfulBuild) { + maybeStartElectron(); + } + }); + rendererServer = new WebpackDevServer( /** @type {DevServerConfiguration} */ (rendererConfig.devServer), rendererCompiler ); await rendererServer.start(); - rendererReady = true; - log('renderer', `dev server listening on http://localhost:${rendererConfig.devServer.port}`); - maybeStartElectron(); }; /** diff --git a/app/desktop/src/main/window-manager.ts b/app/desktop/src/main/window-manager.ts index 1a1b65c0c..74ef55699 100644 --- a/app/desktop/src/main/window-manager.ts +++ b/app/desktop/src/main/window-manager.ts @@ -307,8 +307,13 @@ const createLoadingWindow = () => { titleBarStyle: 'hiddenInset' }); - const loadingFilePath = path.resolve(__dirname, '..', 'renderer', 'loading.html'); - window.loadFile(loadingFilePath); + if (process.env.ELECTRON_WEBPACK_WDS_PORT) { + const loadingUrl = new URL(`http://localhost:${process.env.ELECTRON_WEBPACK_WDS_PORT}/loading.html`); + window.loadURL(loadingUrl.toString()); + } else { + const loadingFilePath = path.resolve(__dirname, '..', 'renderer', 'loading.html'); + window.loadFile(loadingFilePath); + } window.on('closed', () => { if (windows.loading === window) { diff --git a/app/desktop/webpack.main.mjs b/app/desktop/webpack.main.mjs index 1150dc6bd..d9165f54d 100644 --- a/app/desktop/webpack.main.mjs +++ b/app/desktop/webpack.main.mjs @@ -29,6 +29,7 @@ export default { { test: /\.tsx?$/, loader: 'esbuild-loader', + include: path.resolve(__dirname, 'src', 'main'), options: { loader: 'tsx', tsconfigRaw: require('./tsconfig.json') @@ -37,6 +38,7 @@ export default { { test: /\.jsx?$/, loader: 'esbuild-loader', + include: path.resolve(__dirname, 'src', 'main'), options: { loader: 'jsx' } diff --git a/app/desktop/webpack.preload.mjs b/app/desktop/webpack.preload.mjs index 9ab6246aa..7bf030ca4 100644 --- a/app/desktop/webpack.preload.mjs +++ b/app/desktop/webpack.preload.mjs @@ -29,6 +29,7 @@ export default { { test: /\.tsx?$/, loader: 'esbuild-loader', + include: path.resolve(__dirname, 'src', 'preload'), options: { loader: 'tsx', tsconfigRaw: require('./tsconfig.json') @@ -37,6 +38,7 @@ export default { { test: /\.jsx?$/, loader: 'esbuild-loader', + include: path.resolve(__dirname, 'src', 'preload'), options: { loader: 'jsx' } diff --git a/app/desktop/webpack.renderer.mjs b/app/desktop/webpack.renderer.mjs index 68302f3af..a18872891 100644 --- a/app/desktop/webpack.renderer.mjs +++ b/app/desktop/webpack.renderer.mjs @@ -3,13 +3,16 @@ import path from 'path'; import CopyWebpackPlugin from 'copy-webpack-plugin'; +import NodePolyfillPlugin from 'node-polyfill-webpack-plugin'; import {createRequire} from 'module'; import {fileURLToPath} from 'url'; +import RuleInheritancePlugin from 'rule-inheritance-webpack-plugin'; import webpack from 'webpack'; const require = createRequire(import.meta.url); const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); +const IS_PRODUCTION = process.env.NODE_ENV === 'production'; const {version} = require('../../package.json'); /** @@ -17,10 +20,10 @@ const {version} = require('../../package.json'); */ -/** @type {webpack.Configuration} */ -export default { +/** @satisfies {webpack.Configuration} */ +const rendererConfig = { name: 'renderer', - mode: process.env.NODE_ENV === 'production' ? 'production' : 'development', + mode: IS_PRODUCTION ? 'production' : 'development', target: 'web', entry: { index: './src/renderer/index.ts' @@ -32,7 +35,7 @@ export default { resolve: { extensions: ['.ts', '.tsx', '.js', '.jsx', '.json'] }, - devtool: process.env.NODE_ENV === 'production' ? false : 'cheap-module-source-map', + devtool: IS_PRODUCTION ? false : 'cheap-module-source-map', devServer: { host: '127.0.0.1', port: 8386, @@ -67,6 +70,7 @@ export default { { test: /\.tsx?$/, loader: 'esbuild-loader', + include: path.resolve(__dirname, 'src', 'renderer'), options: { loader: 'tsx', tsconfigRaw: require('./tsconfig.json') @@ -75,12 +79,17 @@ export default { { test: /\.jsx?$/, loader: 'esbuild-loader', + include: path.resolve(__dirname, 'src', 'renderer'), options: { loader: 'jsx' } }, { test: /\.css$/, + include: [ + path.resolve(__dirname, 'src', 'renderer'), + require.resolve('react-tabs/style/react-tabs.css') + ], use: [{ loader: 'style-loader' }, { @@ -105,6 +114,7 @@ export default { }, { test: /\.(svg|png|wav|gif|jpg)$/, + include: path.resolve(__dirname, 'src'), type: 'asset/resource', generator: { filename: 'static/assets/[hash][ext][query]' @@ -113,6 +123,11 @@ export default { ] }, plugins: [ + new RuleInheritancePlugin({ + packages: [ + path.resolve(__dirname, '../../packages/gui') + ] + }), new CopyWebpackPlugin({ patterns: [ { @@ -156,6 +171,23 @@ export default { 'process.env.GA_ID': `"${process.env.GA_ID || 'UA-000000-01'}"`, 'clipcc.VERSION': version, 'clipcc.BUILD_TIME': Date.now() + }), + new NodePolyfillPlugin({ + includeAliases: ['Buffer'] }) ] }; + +if (!IS_PRODUCTION) { + rendererConfig.module.rules.push({ + test: /blocks-msgs\.js$/, + include: [ + path.resolve(__dirname, '../../packages/l10n/locales') + ], + use: [{ + loader: path.resolve(__dirname, '../../packages/gui/scripts/block-message-loader.js') + }] + }); +} + +export default rendererConfig; diff --git a/packages/block/webpack.config.js b/packages/block/webpack.config.js index 9e3fa9ef9..6f8086c6a 100644 --- a/packages/block/webpack.config.js +++ b/packages/block/webpack.config.js @@ -21,7 +21,8 @@ const baseConfig = { }, { test: /\.ts$/, exclude: /node_modules/, - use: 'ts-loader' + use: 'ts-loader', + include: path.resolve(__dirname, 'src') }, { test: /_compressed\.js$/, enforce: 'pre', diff --git a/packages/gui/package.json b/packages/gui/package.json index 71347a144..833050302 100644 --- a/packages/gui/package.json +++ b/packages/gui/package.json @@ -12,6 +12,7 @@ "exports": { ".": { "types": "./dist/types/index.d.ts", + "webpack": "./src/index.js", "default": "./dist/scratch-gui.js" }, "./libraries/backdrops.json": "./dist/libraries/backdrops.json", diff --git a/packages/gui/webpack.config.js b/packages/gui/webpack.config.js index a1f4163f4..93ade37b9 100644 --- a/packages/gui/webpack.config.js +++ b/packages/gui/webpack.config.js @@ -80,10 +80,7 @@ const base = { }] }, { test: /\.hex$/, - type: 'asset/inline', - generator: { - dataUrl: content => `data:text/plain;base64,${content.toString('base64')}` - } + type: 'asset' }, { resourceQuery: '?arrayBuffer', type: 'javascript/auto', diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fc1bc1d7d..f1de96d46 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -109,6 +109,9 @@ importers: lodash.bindall: specifier: 4.4.0 version: 4.4.0 + node-polyfill-webpack-plugin: + specifier: ^3.0.0 + version: 3.0.0(webpack@5.105.4) react: specifier: 'catalog:' version: 16.2.0 @@ -118,6 +121,9 @@ importers: redux: specifier: 3.7.2 version: 3.7.2 + rule-inheritance-webpack-plugin: + specifier: ^0.4.0 + version: 0.4.0(webpack@5.105.4) style-loader: specifier: ^4.0.0 version: 4.0.0(webpack@5.105.4) From b139c91f606ebee0c8e89b33d59221c9b713d42a Mon Sep 17 00:00:00 2001 From: SimonShiki Date: Thu, 16 Apr 2026 15:36:39 +0800 Subject: [PATCH 12/36] :bug: fix(render): include missing node polyfills Signed-off-by: SimonShiki --- packages/render/webpack.config.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/render/webpack.config.js b/packages/render/webpack.config.js index 55246f8f8..125ea7d01 100644 --- a/packages/render/webpack.config.js +++ b/packages/render/webpack.config.js @@ -45,7 +45,7 @@ const base = { ] }), new NodePolyfillPlugin({ - includeAliases: ['Buffer'] + includeAliases: ['Buffer', 'events'] }) ] }; From 94e164c1c5685a592e85689b516ecbaff4bf4109 Mon Sep 17 00:00:00 2001 From: SimonShiki Date: Thu, 16 Apr 2026 15:52:30 +0800 Subject: [PATCH 13/36] :bug: fix(desktop): wrong host Signed-off-by: SimonShiki --- app/desktop/src/renderer/routes/app/DesktopGUIHOC.tsx | 1 - app/desktop/src/renderer/routes/app/app.tsx | 1 - app/desktop/webpack.renderer.mjs | 4 ++-- 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/app/desktop/src/renderer/routes/app/DesktopGUIHOC.tsx b/app/desktop/src/renderer/routes/app/DesktopGUIHOC.tsx index 6acffdde4..ea3932135 100644 --- a/app/desktop/src/renderer/routes/app/DesktopGUIHOC.tsx +++ b/app/desktop/src/renderer/routes/app/DesktopGUIHOC.tsx @@ -190,7 +190,6 @@ const ScratchDesktopGUIHOC = function ( canEditTitle: true, canModifyCloudData: false, canSave: false, - isStandalone: true, isScratchDesktop: true, onClickAbout: [ { diff --git a/app/desktop/src/renderer/routes/app/app.tsx b/app/desktop/src/renderer/routes/app/app.tsx index d5e9bd620..040bdc3dc 100644 --- a/app/desktop/src/renderer/routes/app/app.tsx +++ b/app/desktop/src/renderer/routes/app/app.tsx @@ -14,7 +14,6 @@ setAppElement(appTarget); type PropsOf = C extends React.ComponentType ? P : never; - // note that redux's 'compose' function is just being used as a general utility to make // the hierarchy of HOC constructor calls clearer here; it has nothing to do with redux's // ability to compose reducers. diff --git a/app/desktop/webpack.renderer.mjs b/app/desktop/webpack.renderer.mjs index a18872891..f186d403d 100644 --- a/app/desktop/webpack.renderer.mjs +++ b/app/desktop/webpack.renderer.mjs @@ -37,7 +37,7 @@ const rendererConfig = { }, devtool: IS_PRODUCTION ? false : 'cheap-module-source-map', devServer: { - host: '127.0.0.1', + host: 'localhost', port: 8386, hot: false, liveReload: true, @@ -173,7 +173,7 @@ const rendererConfig = { 'clipcc.BUILD_TIME': Date.now() }), new NodePolyfillPlugin({ - includeAliases: ['Buffer'] + includeAliases: ['Buffer', 'events'] }) ] }; From aabbfc84e92ea00cf3efb0d10f22cae59df8a24e Mon Sep 17 00:00:00 2001 From: SimonShiki Date: Thu, 16 Apr 2026 17:26:20 +0800 Subject: [PATCH 14/36] :wrench: chore: add desktop build workflow Signed-off-by: SimonShiki --- .github/workflows/desktop.yml | 64 +++++++++++++++++++++++++++++++++++ app/desktop/package.json | 2 +- 2 files changed, 65 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/desktop.yml diff --git a/.github/workflows/desktop.yml b/.github/workflows/desktop.yml new file mode 100644 index 000000000..d83f84bd0 --- /dev/null +++ b/.github/workflows/desktop.yml @@ -0,0 +1,64 @@ +name: Build Desktop App + +on: + workflow_dispatch: + release: + types: [published] + +jobs: + build: + name: Build on ${{ matrix.os }} + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest, windows-latest, macos-latest] + + steps: + - name: Checkout Code + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: 22 + + - name: Setup pnpm + uses: pnpm/action-setup@v4 + with: + version: 9 + + - name: Install Dependencies + run: pnpm install --frozen-lockfile + + - name: Build and Bundle + run: | + pnpm --filter clipcc-desktop run fetch-library + pnpm --filter clipcc-desktop run bundle:dist + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Upload to Release + uses: softprops/action-gh-release@v2 + if: github.event_name == 'release' + with: + files: | + app/desktop/dist/*.exe + app/desktop/dist/*.zip + app/desktop/dist/*.dmg + app/desktop/dist/*.AppImage + app/desktop/dist/*.deb + app/desktop/dist/*.rpm + + - name: Upload to Aurora Release + uses: softprops/action-gh-release@v2 + if: github.event_name == 'workflow_dispatch' + with: + tag_name: aurora + files: | + app/desktop/dist/*.exe + app/desktop/dist/*.zip + app/desktop/dist/*.dmg + app/desktop/dist/*.AppImage + app/desktop/dist/*.deb + app/desktop/dist/*.rpm diff --git a/app/desktop/package.json b/app/desktop/package.json index 43846f931..fbbc01261 100644 --- a/app/desktop/package.json +++ b/app/desktop/package.json @@ -24,7 +24,7 @@ "build": "pnpm run build:main && pnpm run build:preload && pnpm run build:renderer", "bundle:dir": "pnpm run build && node ./scripts/electron-builder-wrapper.mjs --mode=dir", "bundle:dev": "pnpm run build && node ./scripts/electron-builder-wrapper.mjs --mode=dev", - "bundle:dist": "pnpm run build && node ./scripts/electron-builder-wrapper.mjs --mode=dist", + "bundle:dist": "cross-env NODE_ENV=production pnpm run build && node ./scripts/electron-builder-wrapper.mjs --mode=dist", "start": "node ./scripts/dev.mjs" }, "devDependencies": { From 7fcecb46bca5503ea1a340d6b38da413b5383340 Mon Sep 17 00:00:00 2001 From: SimonShiki Date: Thu, 16 Apr 2026 20:09:32 +0800 Subject: [PATCH 15/36] :wrench: chore(desktop): generate icons from svg Signed-off-by: SimonShiki --- app/desktop/buildResources/.gitignore | 3 + app/desktop/buildResources/app.icns | Bin 209525 -> 0 bytes app/desktop/buildResources/app.ico | Bin 190042 -> 0 bytes .../buildResources/appx/Square150x150Logo.png | Bin 6017 -> 0 bytes .../buildResources/appx/Square44x44Logo.png | Bin 1666 -> 0 bytes app/desktop/buildResources/appx/StoreLogo.png | Bin 1820 -> 0 bytes .../buildResources/appx/Wide310x150Logo.png | Bin 6666 -> 0 bytes app/desktop/package.json | 5 +- .../scripts/generate-build-resources.mjs | 82 +++++ pnpm-lock.yaml | 286 +++++++++++++++++- 10 files changed, 372 insertions(+), 4 deletions(-) delete mode 100644 app/desktop/buildResources/app.icns delete mode 100644 app/desktop/buildResources/app.ico delete mode 100644 app/desktop/buildResources/appx/Square150x150Logo.png delete mode 100644 app/desktop/buildResources/appx/Square44x44Logo.png delete mode 100644 app/desktop/buildResources/appx/StoreLogo.png delete mode 100644 app/desktop/buildResources/appx/Wide310x150Logo.png create mode 100644 app/desktop/scripts/generate-build-resources.mjs diff --git a/app/desktop/buildResources/.gitignore b/app/desktop/buildResources/.gitignore index 8acae482c..c02f2755a 100644 --- a/app/desktop/buildResources/.gitignore +++ b/app/desktop/buildResources/.gitignore @@ -1,2 +1,5 @@ /ClipCC.iconset /tmp +/app.icns +/app.ico +/appx/*.png diff --git a/app/desktop/buildResources/app.icns b/app/desktop/buildResources/app.icns deleted file mode 100644 index 8bc1f24fd257e511c24507f19b0435eaeb7021b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 209525 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 $maPPpzdP&HV-$kz7a+r<2*1fppDz`@Fl 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

(v1X6W%dfm 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%0Do-jSeM>~GLK~H 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 ar4*0|MpIKY4T|vKD80j%G_SmEbN&xTcVZv_ diff --git a/app/desktop/buildResources/appx/Square150x150Logo.png b/app/desktop/buildResources/appx/Square150x150Logo.png deleted file mode 100644 index dfa238029aa9a7f0483f22e3f3ee60a3a3962e31..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6017 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 diff --git a/app/desktop/buildResources/appx/Square44x44Logo.png b/app/desktop/buildResources/appx/Square44x44Logo.png deleted file mode 100644 index c68ce74e8f57cf7c0a7c930c036fe1a92ab23e02..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1666 zcmcgrX;c#j5MGdgT()8nEZE{v1p!St48)^?q<{vCkRVMpaw(0VAct1Oq8ws4iV~1R ztbigUASyx;3KkS<33!x(;=v6?BZeD9k#-^`o$X4rxIe9cWh zH30y?+~3b9NQX}U_|hf1=)mB)>cAk{E5Hi??iZMv3zg}8wc^eQC%NtOf_=uj(Ajnvzw)n709!3OgBclpsDVWv#OAiPMH$Z`sG3q z*N~T!7${bszbi?+jlLJ)lpKgrA{rQ1J$a+dX_1B&!wvlkRwdFgtQ5&K7n>xzFF^;2 z;j%}vm?{L8Y0?_Sp6THJEAYq%{1g{WsTY4h)ITWzPjgXbnTW?%(2L*+ zA)Z`^1{6S$RD;MgN?iNXLn)mD?=OU1)4<0g%6Id4d=2{BYh~zF*!ip=u@-$hhaV~z zxupq`YSEMiabO|T^n77(8gn`;h^s*bV)dai(Uw%fksHV)gpY!FScNF|CK7QSIdKb} zN7YAfAp9}a_f^Q{HmPR@NH2z`VRhGtGNBf|GoaX>31&A-df%y%>d<<=;?XOmUmi4z zs7K~>yNEA7kjPb9X1VC=94Nn4+B&$vD1jFjwaqUVs09$`SE*Q`X&+MV%o1+P1YOev z#B%~~wve0&-t3i!6vOjk_45gg-6HwE5~=8xff6+(N4P6nxS-O$nZq%)me;57&xdxi zg=N3V#z4HNL)P)-QyjXZKiDlfE+eynm;W)V&|1)LPhiUq^{DhnO-4tj&9e*f==)59!}!y0 zlMip!mFq?9_4NTR5mx)@h*6S%0LAEofw2|Iv5Ip*rhA5;{e8S>9{rJFyY%v?15ORG zkgY8g+u$@n%`n(rDo17dE*X`?3;4t&0MOKg?R$ah;tuZQg%DT4X))a_H*X_mu}jm{*wWiKZ{@Hs%`K zW7LmqddPTvaOM`j>%s)>b=1%?2czL(()qUhfVyMFo|i32R?QxI!@vA;f%DB--)O5G zMrA~%>rngIlwusjHc}1hue+V$)0%BFX1ZB_MO#}xhi^vZ_rOl)6n%o@eaZ4ybx z$EsVBZ31D%>TRdbRM{JDSnp#odY!~-lzcYbi7P%w3A`OY%oBNiUF&m-l#vDVpUKIm z)IDrYZO5sKot%V~Ew8x$VfTT*g+ zfm2&b;F_Hwtn;UAW@UM@h7DMjAG7E-?BWfRpf#Y0^&A=>Z5q@a?-xmw(4?sFq$A|W zgd;itT!=0%&O|q7q9^T3ce1-X+0E6F=s_kDPnOiw{7Y~=E{b*Z%zq02{_0ga0pL&B K=hNsNmi{*Z$FTMQ diff --git a/app/desktop/buildResources/appx/StoreLogo.png b/app/desktop/buildResources/appx/StoreLogo.png deleted file mode 100644 index 87b362ac8289833285cb7c3704439abddff85448..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1820 zcmc&#SyWRA5`7Gt0&3eRVh zX9NJiI!_P$DJ^3DlWTOfb?;JQrWW)fT)bTXprycA6|ArAEkis`c>_T5ZU9Kj0sw`U zN?Qeh1T+9}f&c(l0svcL8P9zW1Hj*AP7;W2+JUeCr_gA=YBU;|LNoDM(fC?g^g>+O zE9sh&FL0C!mF5FmncXTR7D4W}K|($lQVvH|!wHT2nm)-YUp2O*2(N&B3ZSdCeA)|f zd5<`{mLFLSQ`&{gkSc@$2baN}lXAXPt=4D+QZ;KdSyjB1EZa9+o=ia_uuXZx0908bP`Wi0W9fAby7M53htBGdaKf zF72L?pD*PtfvVRZkRv(VLs=ZVbPoDwc0?5%TEWBIWP4JNeuK@n1_O&& zp+FcLzck6Rv20A&(bJd5MPA(Wt=Txs2%nYx1b2c+2-My4%@))CsqNd}RHqxpdU#cF z3-5iIVi`Ns*N>53U;0K5W0kx!6q^UMdPJMj`|7>?j7#@W*61Dpon~jorzh>vwys&} z=7e0vVSm)X?g!yt%8|t-^zUIg9yT$F>Y4*R2wulx{TP0eixxj&4Z@vFQ0%R~r5-rj*4Frx zMGL2J12gI$=CsnX;(|V#JgU_`*PSQK40KFT{kxLtJyfm24x`XR`sPyy5;pC4@9Te- ze&+F=omFpH`PH?%j~zX3?CE~>{Ew|h*9@jMm72_qkIhX{>uU9}H!)T6m+kB7c2sxQ zwrw7<;c$-4R`*b9>Z=-_{j#kwq_@wrs0a6eP#!*=QBmt_VV62Ea`wBQAk*;C$eh)Z zL%|Cv)C}EzrLo!mfWW7rY%pvM>aqF8-}5bA&ksj1$4H$~Yz{V&4Crp%`~BZ%n8xFz zSHa7>Q*dd%6k3p7%)95_AvZoB-liqi8tgsGTWy(dYPl?{u!Hv9ueW$Ks6@3zg|t&JPB&A(phkQCL+KIn{!7%hL5#>_Uv?zqrJ zM!ec)rZ1nKwfWT1G>(I5$YYExYLQ9}4E*pieuY_(Gv1Aqbz^x)96C21HLUA!-cNff zyLKdH)5OUK!Q{B1Wz!qz1ZSgNw3?U}Ns;O7%8%G2|7k}Fa{HfD%N(;*EB)s2;ULkO z_zRVZeky6XSBO^zzPs-F3GVuJ-}9ps zO%g2|TwHzHa+?P>$9X#diaXC^dIGw%4+hvpb|aBPgUMmIkbi|~0l=U!7;ChxHQJGQ v0E@$7akdA4Ks(^j=(ytg`u`GKjR}nmPx{{iU# diff --git a/app/desktop/buildResources/appx/Wide310x150Logo.png b/app/desktop/buildResources/appx/Wide310x150Logo.png deleted file mode 100644 index 6e1578275e0ac31128202b3d3f8cd8bee22ff179..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6666 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 PNG bytes. + */ +const renderPng = (sourcePath, width, height) => sharp(sourcePath) + .resize(width, height, { + fit: 'contain', + background: {r: 0, g: 0, b: 0, alpha: 0} + }) + .png() + .toBuffer(); + +/** + * Assert non-empty icon data from png2icons. + * @param {Uint8Array | Buffer | false} iconBuffer Output buffer from png2icons. + * @param {string} label Icon label for error text. + * @returns {Buffer} Normalized Node buffer. + */ +const requireIconBuffer = (iconBuffer, label) => { + if (!iconBuffer || iconBuffer.length === 0) { + throw new Error(`Failed to generate ${label}`); + } + return Buffer.from(iconBuffer); +}; + +const generate = async () => { + await mkdir(path.resolve(buildResourcesDir, 'appx'), {recursive: true}); + await mkdir(path.resolve(buildResourcesDir, 'icon'), {recursive: true}); + + const appMasterPng = await renderPng(appSourceSvg, 1024, 1024); + + const appIcoData = requireIconBuffer( + png2icons.createICO(appMasterPng, png2icons.BILINEAR, 0, true), + 'app.ico' + ); + const appIcnsData = requireIconBuffer( + png2icons.createICNS(appMasterPng, png2icons.BILINEAR, 0), + 'app.icns' + ); + + await Promise.all([ + writeFile(appIcoPath, appIcoData), + writeFile(appIcnsPath, appIcnsData) + ]); + + await Promise.all(appxLogoSizes.map(async logo => { + const outputPath = path.resolve(buildResourcesDir, 'appx', logo.name); + const png = await renderPng(appSourceSvg, logo.width, logo.height); + await writeFile(outputPath, png); + })); +}; + +generate(); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f1de96d46..f92e545a6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -112,6 +112,9 @@ importers: node-polyfill-webpack-plugin: specifier: ^3.0.0 version: 3.0.0(webpack@5.105.4) + png2icons: + specifier: ^2.0.1 + version: 2.0.1 react: specifier: 'catalog:' version: 16.2.0 @@ -124,6 +127,9 @@ importers: rule-inheritance-webpack-plugin: specifier: ^0.4.0 version: 0.4.0(webpack@5.105.4) + sharp: + specifier: ^0.34.4 + version: 0.34.5 style-loader: specifier: ^4.0.0 version: 4.0.0(webpack@5.105.4) @@ -2668,6 +2674,143 @@ packages: resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} + '@img/colour@1.1.0': + resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==} + engines: {node: '>=18'} + + '@img/sharp-darwin-arm64@0.34.5': + resolution: {integrity: sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [darwin] + + '@img/sharp-darwin-x64@0.34.5': + resolution: {integrity: sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-darwin-arm64@1.2.4': + resolution: {integrity: sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==} + cpu: [arm64] + os: [darwin] + + '@img/sharp-libvips-darwin-x64@1.2.4': + resolution: {integrity: sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-linux-arm64@1.2.4': + resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linux-arm@1.2.4': + resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} + cpu: [arm] + os: [linux] + + '@img/sharp-libvips-linux-ppc64@1.2.4': + resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==} + cpu: [ppc64] + os: [linux] + + '@img/sharp-libvips-linux-riscv64@1.2.4': + resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==} + cpu: [riscv64] + os: [linux] + + '@img/sharp-libvips-linux-s390x@1.2.4': + resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==} + cpu: [s390x] + os: [linux] + + '@img/sharp-libvips-linux-x64@1.2.4': + resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} + cpu: [x64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': + resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-x64@1.2.4': + resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} + cpu: [x64] + os: [linux] + + '@img/sharp-linux-arm64@0.34.5': + resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + + '@img/sharp-linux-arm@0.34.5': + resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm] + os: [linux] + + '@img/sharp-linux-ppc64@0.34.5': + resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ppc64] + os: [linux] + + '@img/sharp-linux-riscv64@0.34.5': + resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [riscv64] + os: [linux] + + '@img/sharp-linux-s390x@0.34.5': + resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [s390x] + os: [linux] + + '@img/sharp-linux-x64@0.34.5': + resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + + '@img/sharp-linuxmusl-arm64@0.34.5': + resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + + '@img/sharp-linuxmusl-x64@0.34.5': + resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + + '@img/sharp-wasm32@0.34.5': + resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [wasm32] + + '@img/sharp-win32-arm64@0.34.5': + resolution: {integrity: sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [win32] + + '@img/sharp-win32-ia32@0.34.5': + resolution: {integrity: sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ia32] + os: [win32] + + '@img/sharp-win32-x64@0.34.5': + resolution: {integrity: sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [win32] + '@inquirer/external-editor@1.0.3': resolution: {integrity: sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==} engines: {node: '>=18'} @@ -8402,6 +8545,10 @@ packages: resolution: {integrity: sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==} engines: {node: '>=10.4.0'} + png2icons@2.0.1: + resolution: {integrity: sha512-GDEQJr8OG4e6JMp7mABtXFSEpgJa1CCpbQiAR+EjhkHJHnUL9zPPtbOrjsMD8gUbikgv3j7x404b0YJsV3aVFA==} + hasBin: true + pngjs@5.0.0: resolution: {integrity: sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==} engines: {node: '>=10.13.0'} @@ -9219,6 +9366,10 @@ packages: shallow-copy@0.0.1: resolution: {integrity: sha512-b6i4ZpVuUxB9h5gfCxPiusKYkqTMOjEbBs4wMaFbkfia4yFv92UKZ6Df8WXcKbn08JNL/abvg3FnMAOfakDvUw==} + sharp@0.34.5: + resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + shebang-command@1.2.0: resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} engines: {node: '>=0.10.0'} @@ -11978,6 +12129,102 @@ snapshots: '@humanwhocodes/retry@0.4.3': {} + '@img/colour@1.1.0': {} + + '@img/sharp-darwin-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.2.4 + optional: true + + '@img/sharp-darwin-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.2.4 + optional: true + + '@img/sharp-libvips-darwin-arm64@1.2.4': + optional: true + + '@img/sharp-libvips-darwin-x64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-arm64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-arm@1.2.4': + optional: true + + '@img/sharp-libvips-linux-ppc64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-riscv64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-s390x@1.2.4': + optional: true + + '@img/sharp-libvips-linux-x64@1.2.4': + optional: true + + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': + optional: true + + '@img/sharp-libvips-linuxmusl-x64@1.2.4': + optional: true + + '@img/sharp-linux-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.2.4 + optional: true + + '@img/sharp-linux-arm@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.2.4 + optional: true + + '@img/sharp-linux-ppc64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-ppc64': 1.2.4 + optional: true + + '@img/sharp-linux-riscv64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-riscv64': 1.2.4 + optional: true + + '@img/sharp-linux-s390x@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.2.4 + optional: true + + '@img/sharp-linux-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.2.4 + optional: true + + '@img/sharp-linuxmusl-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 + optional: true + + '@img/sharp-linuxmusl-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.2.4 + optional: true + + '@img/sharp-wasm32@0.34.5': + dependencies: + '@emnapi/runtime': 1.8.1 + optional: true + + '@img/sharp-win32-arm64@0.34.5': + optional: true + + '@img/sharp-win32-ia32@0.34.5': + optional: true + + '@img/sharp-win32-x64@0.34.5': + optional: true + '@inquirer/external-editor@1.0.3(@types/node@25.5.2)': dependencies: chardet: 2.1.1 @@ -13663,12 +13910,12 @@ snapshots: '@webpack-cli/configtest@3.0.1(webpack-cli@6.0.1)(webpack@5.105.4)': dependencies: webpack: 5.105.4(webpack-cli@6.0.1) - webpack-cli: 6.0.1(webpack-dev-server@5.2.3)(webpack@5.105.4) + webpack-cli: 6.0.1(webpack@5.105.4) '@webpack-cli/info@3.0.1(webpack-cli@6.0.1)(webpack@5.105.4)': dependencies: webpack: 5.105.4(webpack-cli@6.0.1) - webpack-cli: 6.0.1(webpack-dev-server@5.2.3)(webpack@5.105.4) + webpack-cli: 6.0.1(webpack@5.105.4) '@webpack-cli/serve@3.0.1(webpack-cli@6.0.1)(webpack-dev-server@5.2.3)(webpack@5.105.4)': dependencies: @@ -19302,6 +19549,8 @@ snapshots: base64-js: 1.5.1 xmlbuilder: 15.1.1 + png2icons@2.0.1: {} + pngjs@5.0.0: {} pngjs@7.0.0: {} @@ -20253,6 +20502,37 @@ snapshots: shallow-copy@0.0.1: {} + sharp@0.34.5: + dependencies: + '@img/colour': 1.1.0 + detect-libc: 2.1.2 + semver: 7.7.4 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.34.5 + '@img/sharp-darwin-x64': 0.34.5 + '@img/sharp-libvips-darwin-arm64': 1.2.4 + '@img/sharp-libvips-darwin-x64': 1.2.4 + '@img/sharp-libvips-linux-arm': 1.2.4 + '@img/sharp-libvips-linux-arm64': 1.2.4 + '@img/sharp-libvips-linux-ppc64': 1.2.4 + '@img/sharp-libvips-linux-riscv64': 1.2.4 + '@img/sharp-libvips-linux-s390x': 1.2.4 + '@img/sharp-libvips-linux-x64': 1.2.4 + '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 + '@img/sharp-libvips-linuxmusl-x64': 1.2.4 + '@img/sharp-linux-arm': 0.34.5 + '@img/sharp-linux-arm64': 0.34.5 + '@img/sharp-linux-ppc64': 0.34.5 + '@img/sharp-linux-riscv64': 0.34.5 + '@img/sharp-linux-s390x': 0.34.5 + '@img/sharp-linux-x64': 0.34.5 + '@img/sharp-linuxmusl-arm64': 0.34.5 + '@img/sharp-linuxmusl-x64': 0.34.5 + '@img/sharp-wasm32': 0.34.5 + '@img/sharp-win32-arm64': 0.34.5 + '@img/sharp-win32-ia32': 0.34.5 + '@img/sharp-win32-x64': 0.34.5 + shebang-command@1.2.0: dependencies: shebang-regex: 1.0.0 @@ -21426,7 +21706,7 @@ snapshots: watchpack: 2.5.1 webpack-sources: 3.3.4 optionalDependencies: - webpack-cli: 6.0.1(webpack-dev-server@5.2.3)(webpack@5.105.4) + webpack-cli: 6.0.1(webpack@5.105.4) transitivePeerDependencies: - '@swc/core' - esbuild From 397a29632e4f3ce84e476edb2f3820b4f5261b2c Mon Sep 17 00:00:00 2001 From: SimonShiki Date: Thu, 16 Apr 2026 22:53:13 +0800 Subject: [PATCH 16/36] :bug: fix(desktop): bundle dist recursively Signed-off-by: SimonShiki --- app/desktop/LICENSE | 21 +++++ app/desktop/electron-builder.yaml | 3 +- app/desktop/package.json | 125 +++++++++++++++--------------- pnpm-lock.yaml | 9 ++- 4 files changed, 93 insertions(+), 65 deletions(-) create mode 100644 app/desktop/LICENSE diff --git a/app/desktop/LICENSE b/app/desktop/LICENSE new file mode 100644 index 000000000..8af18b59d --- /dev/null +++ b/app/desktop/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 Clipteam + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/app/desktop/electron-builder.yaml b/app/desktop/electron-builder.yaml index b0f00e90a..e78c6104c 100644 --- a/app/desktop/electron-builder.yaml +++ b/app/desktop/electron-builder.yaml @@ -11,7 +11,8 @@ directories: output: dist files: - - dist/**/* + - dist/main/**/* + - dist/renderer/**/* - package.json extraResources: diff --git a/app/desktop/package.json b/app/desktop/package.json index 70f863d99..896fcce0a 100644 --- a/app/desktop/package.json +++ b/app/desktop/package.json @@ -1,63 +1,66 @@ { - "name": "clipcc-desktop", - "displayName": "ClipCC", - "productName": "ClipCC", - "version": "3.2.0", - "description": "ClipCC as a self-contained desktop application.", - "author": { - "name": "Clip Team", - "email": "sinangentoo@gmail.com" - }, - "license": "AGPL-3.0", - "homepage": "https://github.com/Clipteam/clipcc", - "repository": { - "type": "git", - "url": "https://github.com/Clipteam/clipcc.git" - }, - "main": "dist/main/index.js", - "scripts": { - "fetch-library": "rimraf ./static/assets/ && mkdirp ./static/assets/ && node ./scripts/fetchMediaLibraryAssets.js", - "build:resources": "node ./scripts/generate-build-resources.mjs", - "lint": "eslint .", - "build:main": "webpack --env target=main", - "build:preload": "webpack --env target=preload", - "build:renderer": "webpack --env target=renderer", - "build": "pnpm run build:resources && pnpm run build:main && pnpm run build:preload && pnpm run build:renderer", - "bundle:dir": "pnpm run build && node ./scripts/electron-builder-wrapper.mjs --mode=dir", - "bundle:dev": "pnpm run build && node ./scripts/electron-builder-wrapper.mjs --mode=dev", - "bundle:dist": "cross-env NODE_ENV=production pnpm run build && node ./scripts/electron-builder-wrapper.mjs --mode=dist", - "start": "node ./scripts/dev.mjs" - }, - "devDependencies": { - "@types/lodash.bindall": "^4.4.9", - "@types/lodash.omit": "^4.5.9", - "@types/node": "^22.15.30", - "@types/react": "16.1.0", - "@types/react-dom": "16.0.11", - "clipcc-gui": "workspace:~", - "clipcc-storage": "workspace:~", - "clipcc-vm": "workspace:~", - "copy-webpack-plugin": "^14.0.0", - "cross-env": "^10.1.0", - "electron": "^41.2.0", - "electron-builder": "^26.8.1", - "esbuild-loader": "^4.4.3", - "eslint": "^9.39.2", - "eslint-config-clipcc": "workspace:~", - "globals": "^16.5.0", - "lodash.bindall": "4.4.0", - "node-polyfill-webpack-plugin": "^3.0.0", - "png2icons": "^2.0.1", - "react": "catalog:", - "react-dom": "16.2.1", - "redux": "3.7.2", - "rule-inheritance-webpack-plugin": "^0.4.0", - "sharp": "^0.34.4", - "style-loader": "^4.0.0", - "ts-loader": "^9.5.4", - "typescript": "catalog:", - "webpack": "catalog:", - "webpack-cli": "^6.0.1", - "webpack-dev-server": "^5.2.3" - } + "name": "clipcc-desktop", + "displayName": "ClipCC", + "private": true, + "productName": "ClipCC", + "version": "3.2.0", + "description": "ClipCC as a self-contained desktop application.", + "author": { + "name": "Clip Team", + "email": "dev@codingclip.com" + }, + "license": "MIT", + "homepage": "https://github.com/Clipteam/clipcc", + "repository": { + "type": "git", + "url": "https://github.com/Clipteam/clipcc.git" + }, + "main": "dist/main/index.js", + "scripts": { + "fetch-library": "rimraf ./static/assets/ && mkdirp ./static/assets/ && node ./scripts/fetchMediaLibraryAssets.js", + "build:resources": "node ./scripts/generate-build-resources.mjs", + "lint": "eslint .", + "clean": "rimraf dist", + "build:main": "webpack --env target=main", + "build:preload": "webpack --env target=preload", + "build:renderer": "webpack --env target=renderer", + "build": "pnpm run build:resources && pnpm run build:main && pnpm run build:preload && pnpm run build:renderer", + "bundle:dir": "pnpm run clean && pnpm run build && node ./scripts/electron-builder-wrapper.mjs --mode=dir", + "bundle:dev": "pnpm run clean && pnpm run build && node ./scripts/electron-builder-wrapper.mjs --mode=dev", + "bundle:dist": "pnpm run clean && cross-env NODE_ENV=production pnpm run build && node ./scripts/electron-builder-wrapper.mjs --mode=dist", + "start": "node ./scripts/dev.mjs" + }, + "devDependencies": { + "@types/lodash.bindall": "^4.4.9", + "@types/lodash.omit": "^4.5.9", + "@types/node": "^22.15.30", + "@types/react": "16.1.0", + "@types/react-dom": "16.0.11", + "clipcc-gui": "workspace:~", + "clipcc-storage": "workspace:~", + "clipcc-vm": "workspace:~", + "copy-webpack-plugin": "^14.0.0", + "cross-env": "^10.1.0", + "electron": "^41.2.0", + "electron-builder": "^26.8.1", + "esbuild-loader": "^4.4.3", + "eslint": "^9.39.2", + "eslint-config-clipcc": "workspace:~", + "globals": "^16.5.0", + "lodash.bindall": "4.4.0", + "node-polyfill-webpack-plugin": "^3.0.0", + "png2icons": "^2.0.1", + "react": "catalog:", + "react-dom": "16.2.1", + "redux": "3.7.2", + "rimraf": "^6.1.3", + "rule-inheritance-webpack-plugin": "^0.4.0", + "sharp": "^0.34.4", + "style-loader": "^4.0.0", + "ts-loader": "^9.5.4", + "typescript": "catalog:", + "webpack": "catalog:", + "webpack-cli": "^6.0.1", + "webpack-dev-server": "^5.2.3" + } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f92e545a6..ec24334df 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -124,6 +124,9 @@ importers: redux: specifier: 3.7.2 version: 3.7.2 + rimraf: + specifier: ^6.1.3 + version: 6.1.3 rule-inheritance-webpack-plugin: specifier: ^0.4.0 version: 0.4.0(webpack@5.105.4) @@ -13910,12 +13913,12 @@ snapshots: '@webpack-cli/configtest@3.0.1(webpack-cli@6.0.1)(webpack@5.105.4)': dependencies: webpack: 5.105.4(webpack-cli@6.0.1) - webpack-cli: 6.0.1(webpack@5.105.4) + webpack-cli: 6.0.1(webpack-dev-server@5.2.3)(webpack@5.105.4) '@webpack-cli/info@3.0.1(webpack-cli@6.0.1)(webpack@5.105.4)': dependencies: webpack: 5.105.4(webpack-cli@6.0.1) - webpack-cli: 6.0.1(webpack@5.105.4) + webpack-cli: 6.0.1(webpack-dev-server@5.2.3)(webpack@5.105.4) '@webpack-cli/serve@3.0.1(webpack-cli@6.0.1)(webpack-dev-server@5.2.3)(webpack@5.105.4)': dependencies: @@ -21706,7 +21709,7 @@ snapshots: watchpack: 2.5.1 webpack-sources: 3.3.4 optionalDependencies: - webpack-cli: 6.0.1(webpack@5.105.4) + webpack-cli: 6.0.1(webpack-dev-server@5.2.3)(webpack@5.105.4) transitivePeerDependencies: - '@swc/core' - esbuild From eafed9773f8264e9614a55840175a402bee1e3ee Mon Sep 17 00:00:00 2001 From: SimonShiki Date: Thu, 16 Apr 2026 22:55:25 +0800 Subject: [PATCH 17/36] :wrench: chore(desktop): change email [ci skip] Signed-off-by: SimonShiki --- app/desktop/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/desktop/package.json b/app/desktop/package.json index 896fcce0a..dddb0320d 100644 --- a/app/desktop/package.json +++ b/app/desktop/package.json @@ -7,7 +7,7 @@ "description": "ClipCC as a self-contained desktop application.", "author": { "name": "Clip Team", - "email": "dev@codingclip.com" + "email": "support@codingclip.com" }, "license": "MIT", "homepage": "https://github.com/Clipteam/clipcc", From 78dc4892c53af74617f9fd97ec647da8196af808 Mon Sep 17 00:00:00 2001 From: SimonShiki Date: Thu, 16 Apr 2026 23:14:25 +0800 Subject: [PATCH 18/36] :wrench: chore(desktop): remove unneeded dirname alias Signed-off-by: SimonShiki --- app/desktop/webpack.main.mjs | 9 ++---- app/desktop/webpack.preload.mjs | 9 ++---- app/desktop/webpack.renderer.mjs | 51 +++++++++++++++++--------------- 3 files changed, 33 insertions(+), 36 deletions(-) diff --git a/app/desktop/webpack.main.mjs b/app/desktop/webpack.main.mjs index d9165f54d..879c78590 100644 --- a/app/desktop/webpack.main.mjs +++ b/app/desktop/webpack.main.mjs @@ -2,11 +2,8 @@ import path from 'path'; import {createRequire} from 'module'; -import {fileURLToPath} from 'url'; const require = createRequire(import.meta.url); -const __filename = fileURLToPath(import.meta.url); -const __dirname = path.dirname(__filename); /** @type {import('webpack').Configuration} */ export default { @@ -17,7 +14,7 @@ export default { index: './src/main/index.ts' }, output: { - path: path.resolve(__dirname, 'dist', 'main'), + path: path.resolve(import.meta.dirname, 'dist', 'main'), filename: '[name].js' }, resolve: { @@ -29,7 +26,7 @@ export default { { test: /\.tsx?$/, loader: 'esbuild-loader', - include: path.resolve(__dirname, 'src', 'main'), + include: path.resolve(import.meta.dirname, 'src', 'main'), options: { loader: 'tsx', tsconfigRaw: require('./tsconfig.json') @@ -38,7 +35,7 @@ export default { { test: /\.jsx?$/, loader: 'esbuild-loader', - include: path.resolve(__dirname, 'src', 'main'), + include: path.resolve(import.meta.dirname, 'src', 'main'), options: { loader: 'jsx' } diff --git a/app/desktop/webpack.preload.mjs b/app/desktop/webpack.preload.mjs index 7bf030ca4..a0da96235 100644 --- a/app/desktop/webpack.preload.mjs +++ b/app/desktop/webpack.preload.mjs @@ -2,11 +2,8 @@ import path from 'path'; import {createRequire} from 'module'; -import {fileURLToPath} from 'url'; const require = createRequire(import.meta.url); -const __filename = fileURLToPath(import.meta.url); -const __dirname = path.dirname(__filename); /** @type {import('webpack').Configuration} */ export default { @@ -17,7 +14,7 @@ export default { preload: './src/preload/index.ts' }, output: { - path: path.resolve(__dirname, 'dist', 'main'), + path: path.resolve(import.meta.dirname, 'dist', 'main'), filename: '[name].js' }, resolve: { @@ -29,7 +26,7 @@ export default { { test: /\.tsx?$/, loader: 'esbuild-loader', - include: path.resolve(__dirname, 'src', 'preload'), + include: path.resolve(import.meta.dirname, 'src', 'preload'), options: { loader: 'tsx', tsconfigRaw: require('./tsconfig.json') @@ -38,7 +35,7 @@ export default { { test: /\.jsx?$/, loader: 'esbuild-loader', - include: path.resolve(__dirname, 'src', 'preload'), + include: path.resolve(import.meta.dirname, 'src', 'preload'), options: { loader: 'jsx' } diff --git a/app/desktop/webpack.renderer.mjs b/app/desktop/webpack.renderer.mjs index f186d403d..861960e65 100644 --- a/app/desktop/webpack.renderer.mjs +++ b/app/desktop/webpack.renderer.mjs @@ -5,12 +5,9 @@ import path from 'path'; import CopyWebpackPlugin from 'copy-webpack-plugin'; import NodePolyfillPlugin from 'node-polyfill-webpack-plugin'; import {createRequire} from 'module'; -import {fileURLToPath} from 'url'; import RuleInheritancePlugin from 'rule-inheritance-webpack-plugin'; import webpack from 'webpack'; const require = createRequire(import.meta.url); -const __filename = fileURLToPath(import.meta.url); -const __dirname = path.dirname(__filename); const IS_PRODUCTION = process.env.NODE_ENV === 'production'; const {version} = require('../../package.json'); @@ -29,7 +26,7 @@ const rendererConfig = { index: './src/renderer/index.ts' }, output: { - path: path.resolve(__dirname, 'dist', 'renderer'), + path: path.resolve(import.meta.dirname, 'dist', 'renderer'), filename: '[name].js' }, resolve: { @@ -43,23 +40,26 @@ const rendererConfig = { liveReload: true, static: [ { - directory: path.resolve(__dirname, 'static'), + directory: path.resolve(import.meta.dirname, 'static'), publicPath: '/static' }, { - directory: path.resolve(__dirname, '../../packages/gui/static'), + directory: path.resolve(import.meta.dirname, '../../packages/gui/static'), publicPath: '/static' }, { - directory: path.resolve(__dirname, '../../packages/block/media'), + directory: path.resolve(import.meta.dirname, '../../packages/block/media'), publicPath: '/static/blocks-media/default' }, { - directory: path.resolve(__dirname, '../../packages/block/media'), + directory: path.resolve(import.meta.dirname, '../../packages/block/media'), publicPath: '/static/blocks-media/high-contrast' }, { - directory: path.resolve(__dirname, '../../packages/gui/src/lib/themes/high-contrast/blocks-media'), + directory: path.resolve( + import.meta.dirname, + '../../packages/gui/src/lib/themes/high-contrast/blocks-media' + ), publicPath: '/static/blocks-media/high-contrast' } ], @@ -70,7 +70,7 @@ const rendererConfig = { { test: /\.tsx?$/, loader: 'esbuild-loader', - include: path.resolve(__dirname, 'src', 'renderer'), + include: path.resolve(import.meta.dirname, 'src', 'renderer'), options: { loader: 'tsx', tsconfigRaw: require('./tsconfig.json') @@ -79,7 +79,7 @@ const rendererConfig = { { test: /\.jsx?$/, loader: 'esbuild-loader', - include: path.resolve(__dirname, 'src', 'renderer'), + include: path.resolve(import.meta.dirname, 'src', 'renderer'), options: { loader: 'jsx' } @@ -87,7 +87,7 @@ const rendererConfig = { { test: /\.css$/, include: [ - path.resolve(__dirname, 'src', 'renderer'), + path.resolve(import.meta.dirname, 'src', 'renderer'), require.resolve('react-tabs/style/react-tabs.css') ], use: [{ @@ -114,7 +114,7 @@ const rendererConfig = { }, { test: /\.(svg|png|wav|gif|jpg)$/, - include: path.resolve(__dirname, 'src'), + include: path.resolve(import.meta.dirname, 'src'), type: 'asset/resource', generator: { filename: 'static/assets/[hash][ext][query]' @@ -125,42 +125,45 @@ const rendererConfig = { plugins: [ new RuleInheritancePlugin({ packages: [ - path.resolve(__dirname, '../../packages/gui') + path.resolve(import.meta.dirname, '../../packages/gui') ] }), new CopyWebpackPlugin({ patterns: [ { - from: path.resolve(__dirname, 'static'), + from: path.resolve(import.meta.dirname, 'static'), to: './static', noErrorOnMissing: true }, { - from: path.resolve(__dirname, '../../packages/gui/static'), + from: path.resolve(import.meta.dirname, '../../packages/gui/static'), to: './static' }, { - from: path.resolve(__dirname, 'src', 'renderer', 'index.html'), + from: path.resolve(import.meta.dirname, 'src', 'renderer', 'index.html'), to: '.' }, { - from: path.resolve(__dirname, 'src', 'renderer', 'index.css'), + from: path.resolve(import.meta.dirname, 'src', 'renderer', 'index.css'), to: '.' }, { - from: path.resolve(__dirname, 'src', 'renderer', 'loading.html'), + from: path.resolve(import.meta.dirname, 'src', 'renderer', 'loading.html'), to: '.' }, { - from: path.resolve(__dirname, '../../packages/block/media'), + from: path.resolve(import.meta.dirname, '../../packages/block/media'), to: 'static/blocks-media/default' }, { - from: path.resolve(__dirname, '../../packages/block/media'), + from: path.resolve(import.meta.dirname, '../../packages/block/media'), to: 'static/blocks-media/high-contrast' }, { - from: path.resolve(__dirname, '../../packages/gui/src/lib/themes/high-contrast/blocks-media'), + from: path.resolve( + import.meta.dirname, + '../../packages/gui/src/lib/themes/high-contrast/blocks-media' + ), to: 'static/blocks-media/high-contrast', force: true } @@ -182,10 +185,10 @@ if (!IS_PRODUCTION) { rendererConfig.module.rules.push({ test: /blocks-msgs\.js$/, include: [ - path.resolve(__dirname, '../../packages/l10n/locales') + path.resolve(import.meta.dirname, '../../packages/l10n/locales') ], use: [{ - loader: path.resolve(__dirname, '../../packages/gui/scripts/block-message-loader.js') + loader: path.resolve(import.meta.dirname, '../../packages/gui/scripts/block-message-loader.js') }] }); } From 0ab5b2f3684241f425edd8e1056922844b3be7bc Mon Sep 17 00:00:00 2001 From: SimonShiki Date: Thu, 16 Apr 2026 23:17:32 +0800 Subject: [PATCH 19/36] :wrench: chore: remove left esbuild onlyBuiltDependencies Signed-off-by: SimonShiki --- pnpm-workspace.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 0b596a61e..950aede5e 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -13,7 +13,6 @@ onlyBuiltDependencies: - core-js - electron - electron-winstaller - - esbuild - playwright-chromium - unrs-resolver From 41ff9eafc2faa2759b1756894a25c670e12cd537 Mon Sep 17 00:00:00 2001 From: SimonShiki Date: Sat, 18 Apr 2026 08:38:15 +0800 Subject: [PATCH 20/36] :wrench: chore(desktop): rename dotenv file Signed-off-by: SimonShiki --- app/desktop/{.env => .env.example} | 0 app/desktop/.gitignore | 3 +++ 2 files changed, 3 insertions(+) rename app/desktop/{.env => .env.example} (100%) diff --git a/app/desktop/.env b/app/desktop/.env.example similarity index 100% rename from app/desktop/.env rename to app/desktop/.env.example diff --git a/app/desktop/.gitignore b/app/desktop/.gitignore index e248d68f1..501cf4858 100644 --- a/app/desktop/.gitignore +++ b/app/desktop/.gitignore @@ -25,3 +25,6 @@ npm-* # generated translation files /translations /locale + +# Environment +.env From 7543bee5218142780e9761d6811a36a5146e9846 Mon Sep 17 00:00:00 2001 From: SimonShiki Date: Sat, 18 Apr 2026 08:38:45 +0800 Subject: [PATCH 21/36] :fire: chore(desktop): remove unused make icons since we already write another Signed-off-by: SimonShiki --- app/desktop/buildResources/make-icons.sh | 69 ------------------------ 1 file changed, 69 deletions(-) delete mode 100644 app/desktop/buildResources/make-icons.sh diff --git a/app/desktop/buildResources/make-icons.sh b/app/desktop/buildResources/make-icons.sh deleted file mode 100644 index f843e89e8..000000000 --- a/app/desktop/buildResources/make-icons.sh +++ /dev/null @@ -1,69 +0,0 @@ -#!/bin/bash -SRC=../src/icon/app.png -SRC_MAC=../src/icon/app.png -SRC_CC3=../src/icon/cc3.png -OUT_ICONSET=app.iconset -OUT_ICNS=app.icns -OUT_ICO=app.ico -OUT_CC3=./icon/cc3.ico -TMP_ICO=tmp - -ICO_BASIC_SIZES="16 24 32 48 256" -ICO_EXTRA_SIZES="20 30 36 40 60 64 72 80 96 512" - -if command -v pngcrush >/dev/null 2>&1; then - function optimize () { - pngcrush -new -brute -ow "$@" - } -else - echo "pngcrush is not available - skipping PNG optimization" - function optimize () { - echo "Not optimizing:" "$@" - } -fi - -# usage: resize newWidth newHeight input output [otherOptions...] -function resize () { - WIDTH=$1 - HEIGHT=$2 - SRC_T=$3 - DST=$4 - shift 4 - convert -background none -resize "${WIDTH}x${HEIGHT}" -extent "${WIDTH}x${HEIGHT}" -gravity center "$@" "${SRC_T}" "${DST}" - optimize "${DST}" -} - -if command -v convert >/dev/null 2>&1; then - # Mac - if command -v iconutil >/dev/null 2>&1; then - mkdir -p "${OUT_ICONSET}" - for SIZE in 16 32 128 256 512; do - SIZE2=`expr "${SIZE}" '*' 2` - resize "${SIZE}" "${SIZE}" "${SRC}" "${OUT_ICONSET}/icon_${SIZE}x${SIZE}.png" -density 72 -units PixelsPerInch - resize "${SIZE2}" "${SIZE2}" "${SRC}" "${OUT_ICONSET}/icon_${SIZE}x${SIZE}@2x.png" -density 144 -units PixelsPerInch - done - iconutil -c icns --output "${OUT_ICNS}" "${SRC_MAC}" - else - echo "iconutil is not available - skipping ICNS and ICONSET" - fi - - # Windows ICO - mkdir -p "${TMP_ICO}" - mkdir -p icon - for SIZE in ${ICO_BASIC_SIZES} ${ICO_EXTRA_SIZES}; do - resize "${SIZE}" "${SIZE}" "${SRC}" "${TMP_ICO}/icon_${SIZE}x${SIZE}.png" - resize "${SIZE}" "${SIZE}" "${SRC_CC3}" "${TMP_ICO}/cc3_${SIZE}x${SIZE}.png" - done - # Asking for "Zip" compression actually results in PNG compression - convert "${TMP_ICO}"/icon_*.png -colorspace sRGB -compress Zip "${OUT_ICO}" - convert "${TMP_ICO}"/cc3_*.png -colorspace sRGB -compress Zip "${OUT_CC3}" - - # Windows AppX - mkdir -p "appx" - resize 44 44 "${SRC}" 'appx/Square44x44Logo.png' - resize 50 50 "${SRC}" 'appx/StoreLogo.png' - resize 150 150 "${SRC}" 'appx/Square150x150Logo.png' - resize 310 150 "${SRC}" 'appx/Wide310x150Logo.png' -else - echo "ImageMagick is not available - cannot convert icons" -fi From cf5d530805f63316b82ad00eccc5377050a6e055 Mon Sep 17 00:00:00 2001 From: SimonShiki Date: Sat, 18 Apr 2026 08:39:09 +0800 Subject: [PATCH 22/36] :wrench: chore(desktop): remove rebundant type inferrence Signed-off-by: SimonShiki --- app/desktop/src/renderer/routes/app/app.tsx | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/app/desktop/src/renderer/routes/app/app.tsx b/app/desktop/src/renderer/routes/app/app.tsx index 040bdc3dc..2ad11b9aa 100644 --- a/app/desktop/src/renderer/routes/app/app.tsx +++ b/app/desktop/src/renderer/routes/app/app.tsx @@ -12,12 +12,10 @@ appTarget.classList.add(styles.app); setAppElement(appTarget); -type PropsOf = C extends React.ComponentType ? P : never; - // note that redux's 'compose' function is just being used as a general utility to make // the hierarchy of HOC constructor calls clearer here; it has nothing to do with redux's // ability to compose reducers. -const WrappedGui = compose>>( +const WrappedGui = compose( ScratchDesktopAppStateHOC, AppStateHOC, ScratchDesktopGUIHOC From 9b8eb67dad572523ca1d6fbe3c03a8526f6ceea9 Mon Sep 17 00:00:00 2001 From: SimonShiki Date: Sat, 18 Apr 2026 08:40:18 +0800 Subject: [PATCH 23/36] :wrench: chore(desktop): hide privacy for now Signed-off-by: SimonShiki --- app/desktop/src/renderer/index.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/desktop/src/renderer/index.ts b/app/desktop/src/renderer/index.ts index 65170d812..b3f569d18 100644 --- a/app/desktop/src/renderer/index.ts +++ b/app/desktop/src/renderer/index.ts @@ -19,9 +19,12 @@ case 'app': case 'about': routeModulePromise = import('./routes/about/about'); break; +/* +// Disable privacy for now since we don't collect any data. case 'privacy': routeModulePromise = import('./routes/privacy/privacy'); break; +*/ } routeModulePromise?.then(routeModule => { From 783bbefb0bfce35462b146eb64b186d915d90f61 Mon Sep 17 00:00:00 2001 From: SimonShiki Date: Sat, 18 Apr 2026 08:41:29 +0800 Subject: [PATCH 24/36] :package: chore(desktop): fix ghost dependency Signed-off-by: SimonShiki --- app/desktop/package.json | 1 + pnpm-lock.yaml | 3 +++ 2 files changed, 4 insertions(+) diff --git a/app/desktop/package.json b/app/desktop/package.json index dddb0320d..9646b6ab1 100644 --- a/app/desktop/package.json +++ b/app/desktop/package.json @@ -52,6 +52,7 @@ "png2icons": "^2.0.1", "react": "catalog:", "react-dom": "16.2.1", + "react-redux": "5.0.7", "redux": "3.7.2", "rimraf": "^6.1.3", "rule-inheritance-webpack-plugin": "^0.4.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ec24334df..e11570ac3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -121,6 +121,9 @@ importers: react-dom: specifier: 16.2.1 version: 16.2.1(react@16.2.0) + react-redux: + specifier: 5.0.7 + version: 5.0.7(react@16.2.0)(redux@3.7.2) redux: specifier: 3.7.2 version: 3.7.2 From b3d20655b5d877c5b608f0b09cb918a98d0a412c Mon Sep 17 00:00:00 2001 From: SimonShiki Date: Sat, 18 Apr 2026 08:56:58 +0800 Subject: [PATCH 25/36] :memo: docs(desktop): add readme Signed-off-by: SimonShiki --- app/desktop/README.md | 61 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 app/desktop/README.md diff --git a/app/desktop/README.md b/app/desktop/README.md new file mode 100644 index 000000000..1932038ea --- /dev/null +++ b/app/desktop/README.md @@ -0,0 +1,61 @@ +# clipcc-desktop +ClipCC as a standalone desktop application. + +## Installation + +### From GitHub + +See [Releases](https://github.com/Clipteam/clipcc/releases). +We always release the latest version on GitHub, please download it from there if you want to be up-to-date. + +### From Package Managers + +### WinGet (Windows users) + +> The WinGet package is maintained by the community and may not be up-to-date. + +On Windows, you can use winget to install ClipCC. + +```powershell +winget install ClipTeam.ClipCC +``` +### AUR (Arch Linux users) + +> The WinGet package is maintained by the community and may not be up-to-date. + +For Arch Linux users, you can install the AUR package [clipcc](https://aur.archlinux.org/packages/clipcc) or [clipcc-beta-bin](https://aur.archlinux.org/packages/clipcc-beta-bin): +```bash +yay -S clipcc +``` +Or +```bash +yay -S clipcc-beta-bin +``` +_Note that these two packages conflict with each other._ + +## Development + +> Since desktop is placed in the monorepo, you need to set up the monorepo first. Please refer to the [contributing guide](/CONTRIBUTING.md) for instructions. +> All commands below are run in the root directory. + +You need to fetch library assets from server for the first time and need to update them: +```bash +pnpm desktop fetch-library +``` +If you need to start the development server, run: +```bash +pnpm desktop start +``` +It will use webpack-dev-server to serve the renderer process and use regular webpack to build and electron to serve the main process. The renderer process will automatically reload when you make changes, and restart the electron process when you make changes to the main or preload part. + +To build the application for development purposes, run: +```bash +pnpm desktop bundle:dev # or pnpm desktop bundle:dir +``` +The build artifacts will be placed in `dist/win32-unpacked`. +For production build, run: +```bash +pnpm desktop bundle:dist +``` + +You may need a code signing certificate and modify `.env` to build the application for production. Please refer to the [code signing guide](https://www.electron.build/code-signing) for more details. From c846aefb2751251380a5081c400381067aa88f86 Mon Sep 17 00:00:00 2001 From: SimonShiki Date: Sat, 18 Apr 2026 09:01:51 +0800 Subject: [PATCH 26/36] :construction_worker: chore: build desktop when prereleased Signed-off-by: SimonShiki --- .github/workflows/desktop.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/desktop.yml b/.github/workflows/desktop.yml index d83f84bd0..b9378bc18 100644 --- a/.github/workflows/desktop.yml +++ b/.github/workflows/desktop.yml @@ -3,7 +3,7 @@ name: Build Desktop App on: workflow_dispatch: release: - types: [published] + types: [published, prereleased] jobs: build: From a02ed4854a8e96759ec2079425121226ebe6c83c Mon Sep 17 00:00:00 2001 From: SimonShiki Date: Sat, 18 Apr 2026 19:16:45 +0800 Subject: [PATCH 27/36] :fire: chore(desktop): remove all import.meta.* alias Signed-off-by: SimonShiki --- app/desktop/scripts/dev.mjs | 4 +--- app/desktop/scripts/electron-builder-wrapper.mjs | 5 +---- app/desktop/scripts/generate-build-resources.mjs | 6 +----- 3 files changed, 3 insertions(+), 12 deletions(-) diff --git a/app/desktop/scripts/dev.mjs b/app/desktop/scripts/dev.mjs index 19ac9ac21..e63e0d269 100644 --- a/app/desktop/scripts/dev.mjs +++ b/app/desktop/scripts/dev.mjs @@ -1,7 +1,6 @@ import {spawn} from 'node:child_process'; import path from 'node:path'; import process from 'node:process'; -import {fileURLToPath} from 'node:url'; import electronPath from 'electron'; import webpack from 'webpack'; import WebpackDevServer from 'webpack-dev-server'; @@ -16,8 +15,7 @@ import configFactory from '../webpack.config.mjs'; /** @typedef {import('webpack').Watching} Watching */ /** @typedef {import('webpack-dev-server').Configuration} DevServerConfiguration */ -const __filename = fileURLToPath(import.meta.url); -const scriptsDir = path.dirname(__filename); +const scriptsDir = path.dirname(import.meta.filename); const desktopDir = path.resolve(scriptsDir, '..'); const nodeTargets = /** @type {const} */ (['main', 'preload']); diff --git a/app/desktop/scripts/electron-builder-wrapper.mjs b/app/desktop/scripts/electron-builder-wrapper.mjs index 40d951b06..f45abe6a6 100644 --- a/app/desktop/scripts/electron-builder-wrapper.mjs +++ b/app/desktop/scripts/electron-builder-wrapper.mjs @@ -4,12 +4,9 @@ import {spawnSync} from 'node:child_process'; import path from 'node:path'; import fs from 'node:fs'; import {createRequire} from 'node:module'; -import {fileURLToPath} from 'node:url'; const require = createRequire(import.meta.url); -const __filename = fileURLToPath(import.meta.url); -const __dirname = path.dirname(__filename); -const projectDir = path.resolve(__dirname, '..'); +const projectDir = path.resolve(import.meta.filename, '..'); const configPath = path.resolve(projectDir, 'electron-builder.yaml'); /** diff --git a/app/desktop/scripts/generate-build-resources.mjs b/app/desktop/scripts/generate-build-resources.mjs index 7b14894b6..f47693002 100644 --- a/app/desktop/scripts/generate-build-resources.mjs +++ b/app/desktop/scripts/generate-build-resources.mjs @@ -1,14 +1,10 @@ import {mkdir, writeFile} from 'node:fs/promises'; import path from 'node:path'; -import {fileURLToPath} from 'node:url'; import png2icons from 'png2icons'; import sharp from 'sharp'; -const __filename = fileURLToPath(import.meta.url); -const __dirname = path.dirname(__filename); - -const desktopRoot = path.resolve(__dirname, '..'); +const desktopRoot = path.resolve(import.meta.filename, '..'); const sourceIconDir = path.resolve(desktopRoot, 'src/common/icon'); const buildResourcesDir = path.resolve(desktopRoot, 'buildResources'); From 8d4c0d921c2efcd0eb42f0965109b67f4342a113 Mon Sep 17 00:00:00 2001 From: SimonShiki Date: Sun, 19 Apr 2026 14:08:01 +0800 Subject: [PATCH 28/36] :fire: chore(desktop): remove unused assets Signed-off-by: SimonShiki --- app/desktop/src/common/icon/ClipCC.svg | 39 ------------------------- app/desktop/src/common/icon/app.png | Bin 24895 -> 0 bytes app/desktop/src/common/icon/cc3.png | Bin 11536 -> 0 bytes 3 files changed, 39 deletions(-) delete mode 100644 app/desktop/src/common/icon/ClipCC.svg delete mode 100644 app/desktop/src/common/icon/app.png delete mode 100644 app/desktop/src/common/icon/cc3.png diff --git a/app/desktop/src/common/icon/ClipCC.svg b/app/desktop/src/common/icon/ClipCC.svg deleted file mode 100644 index 0661480e1..000000000 --- a/app/desktop/src/common/icon/ClipCC.svg +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/desktop/src/common/icon/app.png b/app/desktop/src/common/icon/app.png deleted file mode 100644 index d625d42825412fc136b1bf2c13adbde8659dbb1c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24895 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 diff --git a/app/desktop/src/common/icon/cc3.png b/app/desktop/src/common/icon/cc3.png deleted file mode 100644 index cbf705faf5b8e985bb1d3cdfc152c19b1c5ed6ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11536 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 From 409875beb95f1bb2bb1b809abb1099600a9b2285 Mon Sep 17 00:00:00 2001 From: SimonShiki Date: Mon, 20 Apr 2026 17:59:36 +0800 Subject: [PATCH 29/36] :wrench: chore(desktop): generate cc3 icon from svg file Signed-off-by: SimonShiki --- app/desktop/buildResources/.gitignore | 1 + app/desktop/buildResources/icon/cc3.ico | Bin 204980 -> 0 bytes .../scripts/generate-build-resources.mjs | 12 ++++- app/desktop/src/common/icon/cc3.svg | 45 ++++++++++++++++++ 4 files changed, 56 insertions(+), 2 deletions(-) delete mode 100644 app/desktop/buildResources/icon/cc3.ico create mode 100644 app/desktop/src/common/icon/cc3.svg diff --git a/app/desktop/buildResources/.gitignore b/app/desktop/buildResources/.gitignore index c02f2755a..028990ccc 100644 --- a/app/desktop/buildResources/.gitignore +++ b/app/desktop/buildResources/.gitignore @@ -2,4 +2,5 @@ /tmp /app.icns /app.ico +/icon/cc3.ico /appx/*.png diff --git a/app/desktop/buildResources/icon/cc3.ico b/app/desktop/buildResources/icon/cc3.ico deleted file mode 100644 index 98b4729e796c0afa9c3e092d41d6b3e40a185f1f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 204980 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 ZHst>s$Z { await mkdir(path.resolve(buildResourcesDir, 'icon'), {recursive: true}); const appMasterPng = await renderPng(appSourceSvg, 1024, 1024); + const cc3MasterPng = await renderPng(cc3SourceSvg, 1024, 1024); const appIcoData = requireIconBuffer( png2icons.createICO(appMasterPng, png2icons.BILINEAR, 0, true), @@ -62,10 +65,15 @@ const generate = async () => { png2icons.createICNS(appMasterPng, png2icons.BILINEAR, 0), 'app.icns' ); + const cc3IcoData = requireIconBuffer( + png2icons.createICO(cc3MasterPng, png2icons.BILINEAR, 0, true), + 'icon/cc3.ico' + ); await Promise.all([ writeFile(appIcoPath, appIcoData), - writeFile(appIcnsPath, appIcnsData) + writeFile(appIcnsPath, appIcnsData), + writeFile(cc3IcoPath, cc3IcoData) ]); await Promise.all(appxLogoSizes.map(async logo => { diff --git a/app/desktop/src/common/icon/cc3.svg b/app/desktop/src/common/icon/cc3.svg new file mode 100644 index 000000000..8696c0eb3 --- /dev/null +++ b/app/desktop/src/common/icon/cc3.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 52a719ee12c20e89a1a7039930506cfbb7a9281f Mon Sep 17 00:00:00 2001 From: SimonShiki Date: Mon, 20 Apr 2026 18:04:10 +0800 Subject: [PATCH 30/36] :fire: chore(desktop): remove all privacy usage Signed-off-by: SimonShiki --- app/desktop/src/main/ipc.ts | 3 +- app/desktop/src/main/window-manager.ts | 31 +-- app/desktop/src/preload/index.ts | 3 - app/desktop/src/renderer/index.ts | 6 - .../src/renderer/routes/app/DesktopGUIHOC.tsx | 9 - .../src/renderer/routes/privacy/privacy.css | 14 -- .../src/renderer/routes/privacy/privacy.tsx | 235 ------------------ app/desktop/src/types.d.ts | 1 - 8 files changed, 2 insertions(+), 300 deletions(-) delete mode 100644 app/desktop/src/renderer/routes/privacy/privacy.css delete mode 100644 app/desktop/src/renderer/routes/privacy/privacy.tsx diff --git a/app/desktop/src/main/ipc.ts b/app/desktop/src/main/ipc.ts index 85b2ec266..bd1b345eb 100644 --- a/app/desktop/src/main/ipc.ts +++ b/app/desktop/src/main/ipc.ts @@ -1,8 +1,7 @@ import {ipcMain} from 'electron'; -import {openAboutWindow, openPrivacyWindow} from './window-manager'; +import {openAboutWindow} from './window-manager'; export const registerIpcListeners = () => { ipcMain.on('open-about-window', openAboutWindow); - ipcMain.on('open-privacy-window', openPrivacyWindow); }; diff --git a/app/desktop/src/main/window-manager.ts b/app/desktop/src/main/window-manager.ts index 74ef55699..206b1c172 100644 --- a/app/desktop/src/main/window-manager.ts +++ b/app/desktop/src/main/window-manager.ts @@ -8,7 +8,7 @@ import { import path from 'path'; import {pathToFileURL} from 'url'; -type WindowName = 'main' | 'about' | 'privacy' | 'loading'; +type WindowName = 'main' | 'about' | 'loading'; const windows: Partial> = {}; @@ -248,7 +248,6 @@ const createMainWindow = () => { } windows.about?.close(); - windows.privacy?.close(); windows.loading?.close(); }); @@ -276,27 +275,6 @@ const createAboutWindow = () => { return window; }; -const createPrivacyWindow = () => { - const window = createWindow({ - title: 'ClipCC Privacy Policy', - width: 600, - height: 800, - parent: windows.main, - show: false, - useContentSize: true - }); - - loadRendererRoute(window, 'privacy'); - - window.on('closed', () => { - if (windows.privacy === window) { - delete windows.privacy; - } - }); - - return window; -}; - const createLoadingWindow = () => { const window = createWindow({ width: 300, @@ -333,9 +311,6 @@ const ensureWindow = (name: WindowName) => { case 'about': windows.about = createAboutWindow(); break; - case 'privacy': - windows.privacy = createPrivacyWindow(); - break; case 'loading': windows.loading = createLoadingWindow(); break; @@ -353,7 +328,3 @@ export const initializeWindows = () => { export const openAboutWindow = () => { ensureWindow('about').show(); }; - -export const openPrivacyWindow = () => { - ensureWindow('privacy').show(); -}; diff --git a/app/desktop/src/preload/index.ts b/app/desktop/src/preload/index.ts index 7e6817122..8bdde3f89 100644 --- a/app/desktop/src/preload/index.ts +++ b/app/desktop/src/preload/index.ts @@ -13,9 +13,6 @@ const desktopApi = { openAboutWindow () { ipcRenderer.send('open-about-window'); }, - openPrivacyWindow () { - ipcRenderer.send('open-privacy-window'); - }, getRuntimeVersions () { return runtimeVersions; } diff --git a/app/desktop/src/renderer/index.ts b/app/desktop/src/renderer/index.ts index b3f569d18..221892229 100644 --- a/app/desktop/src/renderer/index.ts +++ b/app/desktop/src/renderer/index.ts @@ -19,12 +19,6 @@ case 'app': case 'about': routeModulePromise = import('./routes/about/about'); break; -/* -// Disable privacy for now since we don't collect any data. -case 'privacy': - routeModulePromise = import('./routes/privacy/privacy'); - break; -*/ } routeModulePromise?.then(routeModule => { diff --git a/app/desktop/src/renderer/routes/app/DesktopGUIHOC.tsx b/app/desktop/src/renderer/routes/app/DesktopGUIHOC.tsx index ea3932135..c500d81bc 100644 --- a/app/desktop/src/renderer/routes/app/DesktopGUIHOC.tsx +++ b/app/desktop/src/renderer/routes/app/DesktopGUIHOC.tsx @@ -155,10 +155,6 @@ const ScratchDesktopGUIHOC = function ( window.desktop?.openAboutWindow(); }; - handleShowPrivacyPolicy = () => { - window.desktop?.openPrivacyWindow(); - }; - handleProjectTelemetryEvent = () => { // ipcRenderer.send(event, metadata); }; @@ -196,17 +192,12 @@ const ScratchDesktopGUIHOC = function ( title: 'About', onClick: () => this.handleClickAbout() }, - { - title: 'Privacy Policy', - onClick: () => this.handleShowPrivacyPolicy() - }, { title: 'Data Settings', onClick: () => this.props.onTelemetrySettingsClicked() } ], onProjectTelemetryEvent: this.handleProjectTelemetryEvent, - onShowPrivacyPolicy: this.handleShowPrivacyPolicy, onStorageInit: this.handleStorageInit, onUpdateProjectTitle: this.handleUpdateProjectTitle }; diff --git a/app/desktop/src/renderer/routes/privacy/privacy.css b/app/desktop/src/renderer/routes/privacy/privacy.css deleted file mode 100644 index a40fb4fc9..000000000 --- a/app/desktop/src/renderer/routes/privacy/privacy.css +++ /dev/null @@ -1,14 +0,0 @@ -html, body { - background-color: #4D97FF; - color: white; - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-weight: normal; - line-height: 150%; -} - -.privacyBox { - background-color: white; - color: #575e75; - margin: 3rem; - padding: 2rem 3rem; -} diff --git a/app/desktop/src/renderer/routes/privacy/privacy.tsx b/app/desktop/src/renderer/routes/privacy/privacy.tsx deleted file mode 100644 index ac7aaf05e..000000000 --- a/app/desktop/src/renderer/routes/privacy/privacy.tsx +++ /dev/null @@ -1,235 +0,0 @@ -import React from 'react'; - -import styles from './privacy.css'; - -const PrivacyElement = () => ( -

-

Privacy Policy

- The Scratch Privacy Policy was last updated: October 5, 2020 -

- The Scratch Foundation (“Scratch”, “we” or “us”) understands how - important privacy is to our community. We wrote this Privacy Policy to explain what Personal Information - (“Information”) we collect through our offline editor (the “Scratch App”), how we use, process, and share it, and what we're doing to keep it safe. It - also tells you about your rights and choices with respect to your Personal Information, and how you can contact us if you have any questions or concerns. -

-

What Information Does Scratch Collect About Me?

-

- For the purpose of this Privacy Policy, “Information” means any information relating to an - identified or identifiable individual. The Scratch App automatically collects and stores locally the - following Information through its telemetry system: the title of your project in text form, language - setting, time zone and events related to your use of the Scratch App (namely when the Scratch App was - opened and closed, if a project file has been loaded or saved, or if a new project is created). If you - choose to turn on the telemetry sharing feature, the Scratch App will transmit this information to Scratch. - Projects created in the Scratch App are not transmitted to or accessible by Scratch. -

-

How Does Scratch Use My Information?

-

We use this Information for the following purposes:

-
    -
  • - Analytics and Improving the Scratch App - We use the Information to analyze use of the Scratch - App and to enhance your learning experience on the Scratch App. -
  • -
  • - Academic and Scientific Research - We de-identify and aggregate Information for statistical - analysis in the context of scientific and academic research. For example, to help us understand how - people learn through the Scratch App and how we can enhance learning tools for young people. The - results of such research are shared with educators and researchers through conferences, journals, and - other academic or scientific publications. You can find out more on our Research page. -
  • -
  • - Legal - We may use your Information to enforce our Terms of Use, to defend our legal rights, and to comply with our legal obligations and internal - policies. We may do this by analyzing your use of the Scratch App. -
  • -
-

What Are The Legal Grounds For Processing Your Information?

-

- If you are located in the European Economic Area, the United Kingdom or Switzerland, we only process your - Information based on a valid legal ground. A “legal ground” is a reason that justifies our use - of your Information. In this case, we or a third party have a legitimate interest in using your Information - (if you choose to allow the Scratch App to send the Scratch team your Information) to create, analyze and - share your aggregated or de-identified Information for research purposes, to analyze and enhance your - learning experience on the Scratch App and otherwise ensure and improve the safety, security, and - performance of the Scratch App. We only rely on our or a third party’s legitimate interests to process your - Information when these interests are not overridden by your rights and interests. -

-

How Does Scratch Share My Information?

-

- We disclose information that we collect through the Scratch App to third parties in the following - circumstances: -

-
    -
  • - Service Providers - To third parties who provide services such as website hosting, data - analysis, Information technology and related infrastructure provisions, customer service, email - delivery, and other services. -
  • -
  • - Academic and Scientific Research - To research institutions, such as the Massachusetts Institute - of Technology (MIT), to learn about how our users learn through the Scratch App and develop new - learning tools. The results of this research or the statistical analysis may be shared through - conferences, journals, and other publications. -
  • -
  • - Merger - To a potential or actual acquirer, successor, or assignee as part of any - reorganization, merger, sale, joint venture, assignment, transfer, or other disposition of all or any - portion of our organization or assets. You will have the opportunity to opt out of any such transfer if - the new entity's planned processing of your Information differs materially from that set forth in - this Privacy Policy. -
  • -
  • - Legal - If required to do so by law or in the good faith belief that such action is appropriate: - (a) under applicable law, including laws outside your country of residence; (b) to comply with legal - process; (c) to respond to requests from public and government authorities, such as school, school - districts, and law enforcement, including public and government authorities outside your country of - residence; (d) to enforce our terms and conditions; (e) to protect our operations or those of any of - our affiliates; (f) to protect our rights, privacy, safety, or property, and/or that of our affiliates, - you, or others; and (g) to allow us to pursue available remedies or limit the damages that we may - sustain. -
  • -
-

Children and Student Privacy

-

- The Scratch Foundation is a 501(c)(3) nonprofit organization. As such, the Children's Online Privacy - Protection Act (COPPA) does not apply to Scratch. Nevertheless, Scratch takes children's privacy - seriously. Scratch collects only minimal information from its users, and only uses and discloses - information to provide the services and for limited other purposes, such as research, as described in this - Privacy Policy. -

-

- Scratch does not collect information from a student's education record, as defined by the Family - Educational Rights and Privacy Act (FERPA). Scratch does not disclose information of students to any third - parties except as described in this Privacy Policy. -

-

Your Data Protection Rights (EEA)

-

- If you are located in the European Economic Area, the United Kingdom or Switzerland, you have certain - rights in relation to your Information: -

-
    -
  • - Access, Correction and Data Portability - You may ask for an overview of the Information we - process about you and to receive a copy of your Information. You also have the right to request to - correct incomplete, inaccurate or outdated Information. To the extent required by applicable law, you - may request us to provide your Information to another company. -
  • -
  • - Objection – You may object to (this means “ask us to stop”) any use of your - Information that is not (i) processed to comply with a legal obligation, (ii) necessary to do what is - provided in a contract between Scratch and you, or (iii) if we have a compelling reason to do so (such - as, to ensure safety and security in our online community). If you do object, we will work with you to - find a reasonable solution. -
  • -
  • - Deletion - You may also request the deletion of your Information, as permitted under applicable - law. This applies, for instance, where your Information is outdated or the processing is not necessary - or is unlawful; where you withdraw your consent to our processing based on such consent; or where you - have objected to our processing. In some situations, we may need to retain your Information due to - legal obligations or for litigation purposes. If you want to have all of your Information removed from - our servers, please contact help@scratch.mit.edu for assistance. -
  • -
  • - Restriction Of Processing - You may request that we restrict processing of your Information - while we are processing a request relating to (i) the accuracy of your Information, (ii) the lawfulness - of the processing of your Information, or (iii) our legitimate interests to process this Information. - You may also request that we restrict processing of your Information if you wish to use the Information - for litigation purposes. -
  • -
  • - Withdrawal Of Consent – Where we rely on consent for the processing of your Information, you - have the right to withdraw it at any time and free of charge. When you do so, this will not affect the - lawfulness of the processing before your consent withdrawal. -
  • -
-

- In addition to the above-mentioned rights, you also have the right to lodge a complaint with a competent - supervisory authority subject to applicable law. However, there are exceptions and limitations to each of - these rights. We may, for example, refuse to act on a request if the request is manifestly unfounded or - excessive, or if the request is likely to adversely affect the rights and freedoms of others, prejudice the - execution or enforcement of the law, interfere with pending or future litigation, or infringe applicable - law. To submit a request to exercise your rights, please contact help@scratch.mit.edu for assistance. -

-

Data Retention

-

- We take measures to delete your Information or keep it in a form that does not allow you to be identified - when this Information is no longer necessary for the purposes for which we process it, unless we are - required by law to keep this Information for a longer period. When determining the retention period, we - take into account various criteria, such as the type of services requested by or provided to you, the - nature and length of our relationship with you, possible re-enrollment with our services, the impact on the - services we provide to you if we delete some Information from or about you, mandatory retention periods - provided by law and the statute of limitations. -

-

How Does Scratch Protect My Information?

-

- Scratch has in place administrative, physical, and technical procedures that are intended to protect the - Information we collect on the Scratch App against accidental or unlawful destruction, accidental loss, - unauthorized alteration, unauthorized disclosure or access, misuse, and any other unlawful form of - processing of the Information. However, as effective as these measures are, no security system is - impenetrable. We cannot completely guarantee the security of our databases, nor can we guarantee that the - Information you supply will not be intercepted while being transmitted to us over the Internet. -

-

International Data Transfer

-

- We may transfer your Information to countries other than the country where you are located, including to - the U.S. (where our Scratch servers are located) or any other country in which we or our service providers - maintain facilities. If you are located in the European Economic Area, the United Kingdom or Switzerland, - or other regions with laws governing data collection and use that may differ from U.S. law, please note - that we may transfer your Information to a country and jurisdiction that does not have the same data - protection laws as your jurisdiction. We apply appropriate safeguards to the Information processed and - transferred on our behalf. Please contact us for more information on the safeguards used. -

-

Notifications Of Changes To The Privacy Policy

-

- We review our Privacy Policy on a periodic basis, and we may modify our policies as appropriate. We will - notify you of any material changes. We encourage you to review our Privacy Policy on a regular basis. The - “Last Updated” date at the top of this page indicates when this Privacy Policy was last - revised. Your continued use of the Scratch App following these changes means that you accept the revised - Privacy Policy. -

-

Contact Us

-

- The Scratch Foundation is the entity responsible for the processing of your Information. If you have any - questions about this Privacy Policy, or if you would like to exercise your rights to your Information, you - may contact us at help@scratch.mit.edu or via mail at: -

-
-
Scratch Foundation
-
ATTN: Privacy Policy
-
-
201 South Street
- Boston, MA 02111 -
-
-
-); - -export default ; diff --git a/app/desktop/src/types.d.ts b/app/desktop/src/types.d.ts index 4d30f17b6..656902d9d 100644 --- a/app/desktop/src/types.d.ts +++ b/app/desktop/src/types.d.ts @@ -44,7 +44,6 @@ declare module 'react-intl' { interface ClipCCDesktopApi { onReadyToShow(listener: () => void): void; openAboutWindow(): void; - openPrivacyWindow(): void; getRuntimeVersions(): { electron?: string; chrome?: string; From 71e413b586da5ac5bd01a67ab9ad20f4b8cafbfb Mon Sep 17 00:00:00 2001 From: SimonShiki Date: Tue, 21 Apr 2026 14:50:36 +0800 Subject: [PATCH 31/36] :wrench: chore(desktop): use soil version cc3 icon Co-authored-by: Soil Signed-off-by: SimonShiki --- app/desktop/src/common/icon/cc3.svg | 46 +---------------------------- 1 file changed, 1 insertion(+), 45 deletions(-) diff --git a/app/desktop/src/common/icon/cc3.svg b/app/desktop/src/common/icon/cc3.svg index 8696c0eb3..cfb7a99a9 100644 --- a/app/desktop/src/common/icon/cc3.svg +++ b/app/desktop/src/common/icon/cc3.svg @@ -1,45 +1 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +clipcc file soil \ No newline at end of file From bdd5880ebaee9dcb3d5746e908b860431193dee1 Mon Sep 17 00:00:00 2001 From: SimonShiki Date: Tue, 21 Apr 2026 22:57:12 +0800 Subject: [PATCH 32/36] :wrench: chore: import react tabs from gui Signed-off-by: SimonShiki --- app/desktop/webpack.renderer.mjs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/desktop/webpack.renderer.mjs b/app/desktop/webpack.renderer.mjs index 861960e65..ec790940d 100644 --- a/app/desktop/webpack.renderer.mjs +++ b/app/desktop/webpack.renderer.mjs @@ -88,7 +88,9 @@ const rendererConfig = { test: /\.css$/, include: [ path.resolve(import.meta.dirname, 'src', 'renderer'), - require.resolve('react-tabs/style/react-tabs.css') + require.resolve('react-tabs/style/react-tabs.css', { + paths: [path.resolve(import.meta.dirname, '../../packages/gui')] + }) ], use: [{ loader: 'style-loader' From 841a9d2f49b9fa3abca07129c8a8c3502eb2eecf Mon Sep 17 00:00:00 2001 From: SimonShiki Date: Tue, 21 Apr 2026 23:14:28 +0800 Subject: [PATCH 33/36] :bento: chore(desktop): add ccx icon Co-authored-by: Soil Signed-off-by: SimonShiki --- app/desktop/buildResources/install.nsh | 3 +-- app/desktop/scripts/generate-build-resources.mjs | 11 ++++++++++- app/desktop/src/common/icon/ccx.svg | 1 + 3 files changed, 12 insertions(+), 3 deletions(-) create mode 100644 app/desktop/src/common/icon/ccx.svg diff --git a/app/desktop/buildResources/install.nsh b/app/desktop/buildResources/install.nsh index 91538ad5a..159a1f4d6 100644 --- a/app/desktop/buildResources/install.nsh +++ b/app/desktop/buildResources/install.nsh @@ -36,6 +36,5 @@ WriteRegStr HKCR "clipcc.cc3\shell\open\command" "" '"$INSTDIR\ClipCC 3.exe" "%1"' WriteRegStr HKCR "clipcc.ccx" "" "ClipCC 3 Extension" - WriteRegStr HKCR "clipcc.ccx\DefaultIcon" "" '"$INSTDIR\resources\icon\cc3.ico"' - WriteRegStr HKCR "clipcc.ccx\shell\open\command" "" '"$INSTDIR\ClipCC 3.exe" "%1"' + WriteRegStr HKCR "clipcc.ccx\DefaultIcon" "" '"$INSTDIR\resources\icon\ccx.ico"' !macroend diff --git a/app/desktop/scripts/generate-build-resources.mjs b/app/desktop/scripts/generate-build-resources.mjs index 96aa56a50..c1253651e 100644 --- a/app/desktop/scripts/generate-build-resources.mjs +++ b/app/desktop/scripts/generate-build-resources.mjs @@ -10,10 +10,12 @@ const buildResourcesDir = path.resolve(desktopRoot, 'buildResources'); const appSourceSvg = path.resolve(sourceIconDir, 'app.svg'); const cc3SourceSvg = path.resolve(sourceIconDir, 'cc3.svg'); +const ccxSourceSvg = path.resolve(sourceIconDir, 'ccx.svg'); const appIcoPath = path.resolve(buildResourcesDir, 'app.ico'); const appIcnsPath = path.resolve(buildResourcesDir, 'app.icns'); const cc3IcoPath = path.resolve(buildResourcesDir, 'icon/cc3.ico'); +const ccxIcoPath = path.resolve(buildResourcesDir, 'icon/ccx.ico'); const appxLogoSizes = [ {name: 'Square44x44Logo.png', width: 44, height: 44}, @@ -56,6 +58,7 @@ const generate = async () => { const appMasterPng = await renderPng(appSourceSvg, 1024, 1024); const cc3MasterPng = await renderPng(cc3SourceSvg, 1024, 1024); + const ccxMasterPng = await renderPng(ccxSourceSvg, 1024, 1024); const appIcoData = requireIconBuffer( png2icons.createICO(appMasterPng, png2icons.BILINEAR, 0, true), @@ -70,10 +73,16 @@ const generate = async () => { 'icon/cc3.ico' ); + const ccxIcoData = requireIconBuffer( + png2icons.createICO(ccxMasterPng, png2icons.BILINEAR, 0, true), + 'icon/ccx.ico' + ); + await Promise.all([ writeFile(appIcoPath, appIcoData), writeFile(appIcnsPath, appIcnsData), - writeFile(cc3IcoPath, cc3IcoData) + writeFile(cc3IcoPath, cc3IcoData), + writeFile(ccxIcoPath, ccxIcoData) ]); await Promise.all(appxLogoSizes.map(async logo => { diff --git a/app/desktop/src/common/icon/ccx.svg b/app/desktop/src/common/icon/ccx.svg new file mode 100644 index 000000000..c54b10ccc --- /dev/null +++ b/app/desktop/src/common/icon/ccx.svg @@ -0,0 +1 @@ +clipcc extension soil \ No newline at end of file From 2f7dcc2752517d5af67837bf7e54fd4b67210669 Mon Sep 17 00:00:00 2001 From: SimonShiki Date: Thu, 23 Apr 2026 08:56:05 +0800 Subject: [PATCH 34/36] :wrench: chore(desktop): redirect babel-loader cwd Signed-off-by: SimonShiki --- app/desktop/webpack.renderer.mjs | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/app/desktop/webpack.renderer.mjs b/app/desktop/webpack.renderer.mjs index ec790940d..f294def20 100644 --- a/app/desktop/webpack.renderer.mjs +++ b/app/desktop/webpack.renderer.mjs @@ -128,7 +128,29 @@ const rendererConfig = { new RuleInheritancePlugin({ packages: [ path.resolve(import.meta.dirname, '../../packages/gui') - ] + ], + callbacks: { + 'babel-loader': (rule, loader, packagePath) => { + if (!rule.options) { + rule.options = {}; + } else if (typeof rule.options === 'string') { + console.warn(`We don't support string options for babel-loader in ${packagePath}. Ignoring.`); + return; + } + + if (typeof rule.use === 'string') { + rule.use = { + loader: rule.use, + options: {} + }; + } + + // See https://babeljs.io/docs/options#cwd + if (!rule.options.cwd) { + rule.options.cwd = packagePath; + } + } + } }), new CopyWebpackPlugin({ patterns: [ From bd52bc1f28cd3d0a0a09c807f280ab0a46de9807 Mon Sep 17 00:00:00 2001 From: SimonShiki Date: Fri, 24 Apr 2026 12:14:19 +0800 Subject: [PATCH 35/36] :wrench: chore: add missing gitignore & node polyfills plugin Signed-off-by: SimonShiki --- app/desktop/buildResources/.gitignore | 2 +- packages/storage/package.json | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/app/desktop/buildResources/.gitignore b/app/desktop/buildResources/.gitignore index 028990ccc..75adfab86 100644 --- a/app/desktop/buildResources/.gitignore +++ b/app/desktop/buildResources/.gitignore @@ -2,5 +2,5 @@ /tmp /app.icns /app.ico -/icon/cc3.ico +/icon/ /appx/*.png diff --git a/packages/storage/package.json b/packages/storage/package.json index 5ace8feb9..4fd553e97 100644 --- a/packages/storage/package.json +++ b/packages/storage/package.json @@ -56,6 +56,7 @@ "jest": "catalog:", "json": "^9.0.6", "node-fetch": "^3.3.2", + "node-polyfill-webpack-plugin": "^3.0.0", "rimraf": "6.0.1", "terser-webpack-plugin": "^5.3.17", "ts-jest": "^29.4.5", From 8c3f98fbec525d193c616dccd31b89f173ccb20d Mon Sep 17 00:00:00 2001 From: SimonShiki Date: Fri, 24 Apr 2026 17:21:38 +0800 Subject: [PATCH 36/36] :wrench: chore(desktop): add missing dependencies Signed-off-by: SimonShiki --- app/desktop/package.json | 3 +++ app/desktop/webpack.renderer.mjs | 2 +- pnpm-lock.yaml | 18 +++++++++++++++--- 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/app/desktop/package.json b/app/desktop/package.json index 9646b6ab1..f213d0b7f 100644 --- a/app/desktop/package.json +++ b/app/desktop/package.json @@ -41,6 +41,7 @@ "clipcc-vm": "workspace:~", "copy-webpack-plugin": "^14.0.0", "cross-env": "^10.1.0", + "css-loader": "6.7.3", "electron": "^41.2.0", "electron-builder": "^26.8.1", "esbuild-loader": "^4.4.3", @@ -50,6 +51,8 @@ "lodash.bindall": "4.4.0", "node-polyfill-webpack-plugin": "^3.0.0", "png2icons": "^2.0.1", + "postcss-import": "^12.0.0", + "postcss-loader": "7.0.2", "react": "catalog:", "react-dom": "16.2.1", "react-redux": "5.0.7", diff --git a/app/desktop/webpack.renderer.mjs b/app/desktop/webpack.renderer.mjs index f294def20..47af28020 100644 --- a/app/desktop/webpack.renderer.mjs +++ b/app/desktop/webpack.renderer.mjs @@ -200,7 +200,7 @@ const rendererConfig = { 'clipcc.BUILD_TIME': Date.now() }), new NodePolyfillPlugin({ - includeAliases: ['Buffer', 'events'] + includeAliases: ['buffer', 'Buffer', 'events'] }) ] }; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9c04925a1..cb65d462c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -88,6 +88,9 @@ importers: cross-env: specifier: ^10.1.0 version: 10.1.0 + css-loader: + specifier: 6.7.3 + version: 6.7.3(webpack@5.105.4) electron: specifier: ^41.2.0 version: 41.2.0 @@ -115,6 +118,12 @@ importers: png2icons: specifier: ^2.0.1 version: 2.0.1 + postcss-import: + specifier: ^12.0.0 + version: 12.0.1 + postcss-loader: + specifier: 7.0.2 + version: 7.0.2(postcss@8.5.8)(webpack@5.105.4) react: specifier: 'catalog:' version: 16.2.0 @@ -1144,6 +1153,9 @@ importers: node-fetch: specifier: ^3.3.2 version: 3.3.2 + node-polyfill-webpack-plugin: + specifier: ^3.0.0 + version: 3.0.0(webpack@5.105.4) rimraf: specifier: 6.0.1 version: 6.0.1 @@ -13916,12 +13928,12 @@ snapshots: '@webpack-cli/configtest@3.0.1(webpack-cli@6.0.1)(webpack@5.105.4)': dependencies: webpack: 5.105.4(webpack-cli@6.0.1) - webpack-cli: 6.0.1(webpack@5.105.4) + webpack-cli: 6.0.1(webpack-dev-server@5.2.3)(webpack@5.105.4) '@webpack-cli/info@3.0.1(webpack-cli@6.0.1)(webpack@5.105.4)': dependencies: webpack: 5.105.4(webpack-cli@6.0.1) - webpack-cli: 6.0.1(webpack@5.105.4) + webpack-cli: 6.0.1(webpack-dev-server@5.2.3)(webpack@5.105.4) '@webpack-cli/serve@3.0.1(webpack-cli@6.0.1)(webpack-dev-server@5.2.3)(webpack@5.105.4)': dependencies: @@ -21712,7 +21724,7 @@ snapshots: watchpack: 2.5.1 webpack-sources: 3.3.4 optionalDependencies: - webpack-cli: 6.0.1(webpack@5.105.4) + webpack-cli: 6.0.1(webpack-dev-server@5.2.3)(webpack@5.105.4) transitivePeerDependencies: - '@swc/core' - esbuild