From 1ed9775c45eed76665c450e4f4844766d0ac8b03 Mon Sep 17 00:00:00 2001 From: forehalo Date: Mon, 21 Oct 2024 05:58:05 +0000 Subject: [PATCH] fix(core): global error handler should be registered outside webpack runtime (#8556) --- .../frontend/core/src/bootstrap/browser.ts | 1 - .../frontend/core/src/bootstrap/error.png | Bin 38073 -> 0 bytes .../src/bootstrap/global-error-handler.ts | 81 ------------------ tools/cli/src/webpack/cache-group.ts | 5 -- tools/cli/src/webpack/config.ts | 5 -- tools/cli/src/webpack/error-handler.js | 73 ++++++++++++++++ tools/cli/src/webpack/webpack.config.ts | 26 ++++++ 7 files changed, 99 insertions(+), 92 deletions(-) delete mode 100644 packages/frontend/core/src/bootstrap/error.png delete mode 100644 packages/frontend/core/src/bootstrap/global-error-handler.ts create mode 100644 tools/cli/src/webpack/error-handler.js diff --git a/packages/frontend/core/src/bootstrap/browser.ts b/packages/frontend/core/src/bootstrap/browser.ts index cac814e59a..35073fbc88 100644 --- a/packages/frontend/core/src/bootstrap/browser.ts +++ b/packages/frontend/core/src/bootstrap/browser.ts @@ -1,5 +1,4 @@ // ORDER MATTERS -import './global-error-handler'; import './env'; import './public-path'; import './polyfill/browser'; diff --git a/packages/frontend/core/src/bootstrap/error.png b/packages/frontend/core/src/bootstrap/error.png deleted file mode 100644 index 03327d40ea14bff41dabc2e5110ab1e620321b9f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38073 zcmdRW_dC~b{O=1TNk~Ewk}{H=y+X*&-pY6z*?W&qW;P)^2_b}#t?ZSo?7jEi<9(jK z=Q{tvIX|4Pt7Kg7alc;ok03X0U;f2F5|hc`i?>Z4CN&k!^2sQFj{JDxt z@>-4i2P1XOL$v2XPDc)(<7UC~^75a*cSnpYq(YaeeO;DGb*`Jz9`&V`ic8+Spop7( zF-b3>NiCRffP@9%6kR&uq7&BOUM@P>HhLdzmLnhsyEx2fL>k ze}t6BD_Hv+A2-mRmi+s+T(DBoEtD-U=)P$p+`W61^In)lMvv+LS07w|i7lR`hmo7E+YUYLY|`1kL@%FOs) zqonWb>MH%uVmBu{RVyJS#nH{u#@w9I;p}MJS1qr}`?TD<3is0@S4&Gv!{njoWPG;~ z`;Xe%S^*A@S?r#L4!wh7-7K^A2(P`2Cx}s@W$nd&VMOg-Cd)bpUc>p+HQ}GQKJJ#g z3rW`DrK9WL%o4+mHQ&OU52*+&7M5RFNGI24G43)O)}%MOdev4)!E3jRJ4u|_7!}op zig{jYMkYb*Lmw->Og-XpIyy+mnF2k__KK?Pb8ut zZ6;0=WdWbJ7oJIDiwtqf&93AXZV-I#dUuWBAdl;CeYE^Z5SKzSPf-V_+{0LDf3Iy) zZ(HghF8zbz_;u+_r3Va|Z#30};0xRD)z{eN`f&V3)6-5X(mJm8EKE(kPW#YnT0R=Z zU9&9bD0{h^sRaK`0N`21TU zVX*j_`$s8S%w;-`({5LxG=ez}1Jqqye;nlBzkisnLfZLp^(@tW!&d*WapV*a50I%S zNlLTL$+}5P&U^X%8$S&n25~JeENF>|iLpmX{Sdm?j<_~}+J!6Kys&`U-MrY?#5CI_ zpF9evv7QuSEjf4gK6LgS>qZ}^p>yC4Ajni|yBJ#(QiqoyN$L8f41UVO%4#I-bZn6k zc4IvjLBE8AL@O)aY2n36p*ehMztFozh@JgEt$a1~<)xz5iTHUq;lAF%Qb$p+`tM?g z1FIxMiv{90?Hqgb+fqCv3CaA=bT=!> z>OEad+t($+ppW}!XC5>Z_>yq@1~nP@{y1*tu4RM0-H@&*^({YtACRE2Q9L||rbvT{ z_0}%DTitxMCp3Pn1vLjFzo{6*bA@-}v+Q=zx1CU1);4eHo;r7F_X8Weqe#YBR2 zOS|skWcAw3211x=4(p|Z*fgAJ9rGt*>5+gf)2jtl%;e%p1*-@C4R3G*8+zK>+KdP- zaUa-;;zY?l&fp$*P^LCmMS1~h^3^&nSAzQY(!QJEeDLq2)UXv;%V_+-2BX9*-e=G5 zNG0*lSKsq&u{GkMc#Pl#Hu&N^at=vvF(?wb612KsIm?5O@#}gxDel#}6sM~DL7#Se zd!xN;E;074b@}K;=LBb$h+p;K;9!!7WMlP!`PI*)D?H(K(f~xhONm_f!pc@F`%O8i z{cyzlO2@6rGe2BGU^yaBFF~f8FIM_$FN!gCC++2E8P;*AA7O!|GszElwUH)z(hL~X z6!^-A&UK_(`6PK>%*@Q#y(n5DTkU+3fmKIppF8p_$?9+RPB-f&&wZ(mFzDhtD#B-p z-w{cm)2U9szJ0-gD4 zdFO}T=tJKht~+yWD87`qbj7ddO)OqTgyKnb^2w%;VqQ8?WFOD7c)LCg;!;;vCkJ#f zE!FCB->l(|^kQaW>Sw8#BVr`R-OrGWz_t^PkBiHNAFcxb2Hn4&$7F-^9oJb#a}Uk0p_YTc0R`ym3kxZUm3Q?8jw9O8EAi>06%9?%#gg=OG(MHk*^j}>aIr&MUCU!(fEG(v z-TNGXN9RnDgLl!+sErHvFbR8KyNSBSx_#}s0c$b|T9S~fk3+q-rha(<-D6^5vG$n0 zp^x)fZrfh?(B8Gh_H#%`i2vzEl{Hc@|)qUnDrANXOszFg4g!V?Z&-r$6U zyXg9y9EQ}?)QyX8E_Qa&h{Z8KGBZ%x_gRj40j19nRU?mD}%o!fm%%tt_SeqQG^G3gbowvKYtAK$c8qTuU z8(-_t=%{P*=FRjKA8MlwQBqxp9vRubIcx9J(Hl4t3(OwNneq6N8LtF(S|2Jr@bL-{ z50~Ib=p^LemyDnk^hMNA4<9~UXl-rXu;Cdy*@>^K4n+z)?d;gq@&=rMe;kZEPu`bG z0;=~uzGJ@Dt!APURzUq$eJPcI%ine*c1@(~a(=#j{^N4XUyC$@8&})9<{6=Jd5WE0 zSZ%gZq4=-)(@FG&a!r}**3|PSBq944KC?W3=!CX|Q%94NlV$xHriB1zQ z7fGv>46OU@Dt`BjmP6-`vsyAa*|ZBv!h1+$vkP&xj#& z7bY&nOYJan^4bY_78z(z>5LZ8GgfN0e?zPR@@3jFe< zE)+dc@TVTrD?5*j7vLw@lDZxT(G#8zxYcaLU?l{ zCCR#$x4E;&fln897ycZIg3p0|!n~BmdBWA?E(SxlzJ1rTHr*~g~BO{}q+jYhEDJo)vN5pn!s^gmr-RyW2 zuhXl~7~9z1-fpgVUNaXhbMm(IUYdX_`}g@>pyJ-_3615o`}rc`)7`2`hK7a}5*gE! z{7&D96=U|qg!jZMlydsrW`gN3Z)sl>8Ps*wEz`;`L(d9dJp9geDa`oFD=LPQQ&RG= zd#2{*zQ6@k#=^o1qedMgtgww3W2J**=oGk2P$*0@d!P>)Xc`|xF>j!9MwH{ERBOHb zU~>}f4FsNriHQ{fB#J!tNNs6uCPT8av+wHO64PA@q6(AP{rs6~QhlPfIgjanFd4o*1wY|jhVdLdB+gfg=bPISpXv#S$maLw35fbcFCD(rF zl0L-~uA!;<>cJ;F7nhGn>-M&-COxq!02{nK5%I=O?X$D7U=^h&h~Vm=X|3d63AC$- zzq+2O6vK5N5L0k#{&Lji6%b&u7)2o;Q&RS0D*FQpb~dd?msAG}!|EjLQ+wJp7x5D!R}wWW}L978CIgTQSpiZlJEyBiA$3kw6G^mlEI>91=0^9r}inL+86-!DdV6wm?fc zJ)1)j5F3B6RmEB~w6)!vTyHcCKe%z@#^#ks1zI9kL=#!|5K2P`sVFEyBLHc8+Wxzl zQDV+ny}EvJC|mj;JiV)E_g)%ZWyu*cadnu^t9-S)h%x(JJ6&}=JiN#^WNSS5@S2ak zh1uBBQAgbaYge7AI1@>UMzXy(woHDcvQ?*3?GmB|6$MeRtDSCSgBlV8DaO;qOOqZgi zVT^tMUM(8dhLfK^1nwY8a`J}hhCmDlyaD)dej@1NWH>DNQ6T^Icu946N_Gue_8mc5 zg;jkVR(a{}4@_77IkUmO``DxB7bP_lv&VH$MzQ%FYfVlmQuA0$PE!72Y5C|xa{Rr4 zGvB}k8n9q#b+yVn`{uZ9%YEVf1@5|Iwm!~^9@BbGx%yM~uUfCi3tj7!GkTUTen&cg zLq7^@GO!rs`aA3$ix5V%WLl0=M6|eCT83f#Y%@|)W4uFo_iog@ohI%B7fZ{o`xF#@ zZ^$Tc{dp)OWRQcc0VWmr4~9pU zYP~jpKJ~t!uoTGn*?BM-%b)j_+WntXT8=_@uZfbS^M1K|=B`B^rB}d#+q1-O2Xs!J z{%Dwx_382OT4&#e;h@P1!3lPhY_W2MSnkWSMqQvk)`Vm^|w);JKNx} zt;|x?#GVwqhVc9Rk3k{QG&eUdwMIQ$8O{KP@`!$yGm4Bx$^FX3+nAV`xr(sHxw*MM zt`Jpncz=xlNm+i)n>}+va2z+*7soFW2jhmE1OQ*mtgQYBFWem&JxLd=vAA0Kr`#B8 z%s%b9V*wBswCCpHM(xq!WLfd(^5c^O!?ROXpfn&Po-VGRByG4emX(&yZ&nFwTN5r{ z$ogg&1~7XP-JSZEk3S4TXrP^vlj_rNY59rudEyQhkr2UeVVA=exr~{F7dj zo|LY0Q4ZeT=ne3ZKm&VrCewT#Ujg-`_R+PcY~8L#kL6;d@O&g^U_iC*{aR0kWKVu6 z42ws;eNQ4wYz&XjN6UJZun4;T{5d(npPii@a#HB=^sedlqoboc7jK$viC6@WOs|hq zGRX9DEUFa^TL?YK)Hw~QI||8OSXdZY;dqtjb6@8jihN`#jlVx$7a@H6_O0OEa|N%R z7-7eyzv;X*O3xa2DI-c4gFoq&SdwqMRF57dZxG&+VYo>X-G059{WyF5WMpL=Q8*Y93m4So92bw6H?yjzvs0mxo0}%0Pte}&O%Y!-r+3$oj zbwsz#wfGUL3k_~NPkK79+~0JO z4;Kox^3S+^woBG;BguS@<{qY|OG&e{DGjl#-MY@>jxUAM>bh7%2L%VW{Y9tSL8Z4i zt&coXMOR_tFYnu)ev!1tUJ4sq#9(pFp&MD}awRB7sL8_uglCH^lMIW_2ly)6;JZy}a~*|DP~_N!jVL_EKhIW`?CDF0)H~y zfX85grdCdS#e2&v)zEZA*XOeX51qlZ`xz|$`;O?(QY|^$2V1#(0dB#y;ATIc6KzFNPrW5R$&YVH8?v| zWcYix!O+d^-o(VU%Ck*QKmj+lgYhwdwdS$0g>@c!v`arQOV^<6Y`@?pY7x>(@J!zigQDvYuJ{Vl&D!ad<)Soemk2l4M&u3Rk` zwIq}9ONigBSWM-Js!&ey`1tXoNY!{1Uovj&Th2@Wzjj(*TU$(k@)}3TuV25OGh~9% z6d&9w5wD=x^&c=RxZdvM?-3ty8Vs7~Cr_RrJ}QilV%lgc3ZB?ii~)QHeAoe|E&U{> z?XQg9PV{|kY}DgEPL})u^VY>(I`2J6@4YujTZx4PtTGJ^B^lXLn{;NM*(*lJE7?{x z`~M_^O^+L^Ue(3U_B_XfUP>Tf(;iCo2@`&!qJACk4fc*E0)E{v(`e z2PhgxUwUNalYj)9UX!O2>e%%liSMMU74PBI)wL@>;t=2_*7Z7`FH+091AxrGB9^JN zT~ac6{Kt91lB_u*xoaCJ#88s*(Dco@yk>?)N_x3!S31Rv3EUBwmQuw5&p19BH zw`{nJQjlR*!NBxJ|Lg$yfY=}KwQ zz>_YNa@U426UlDa&&7~M*~c-&qM*eHGnI0LHa$1&20tm~9C_xc zP2NayTmVpou2vEUiyK_7wFRA}g^7y`&uS$zSR6xL+>;dl+p9dkO(*|z+U6r*a#Gga zpg7BPMH`Dz30k5D-I4p9Gc%tj<#{M3UJ1MB7c*pjG38u2Ewmg(p-8q}D3I@O2bqn3 zPV?YD5%wt6+Bext9c`xKftw$(;h}JZg8dA3@B;)GOX@T!TtJl^m9L8Q zgnw^oM@VF>BzN!Wr0yRU448wvU@=;jNVXqpme|XR$0c|BGNZ89^Y7`->#18zbx#~H zcO17(*5XUigWGp_co^Gf->yQ(wM|BkC}`=x^KjgRG^D8%;;#zumEya%zCYba0V^sd zeNAtHodb+{WXi2ZUc50cFYiZ1g=UeZdrgn2%D=%u(!7D(k)T*GLTevDIA@_5r})Iz zph!xuS}0qI;cM&t&2t(bxzVzYA`J_0%h{0~?9ls$WD?u&sLrM~H|I21v^9Pfyp>{j zap+Te+n`8esi11(1%r?VS5maXJ8H)YI%ja}&#fBogx$~{b5~YwyvUA$SC0y|NP@ioGO-zUoo?;1sDW-}H+^1-N{?oZS z78679!sC?^@y(_B6nWNJdUA{??67GsA&Bn zJ7qg%GnHPl?@APD7_}@9`9wwC`XHTopInP(=1F07aYFZ^eo@S94ND0^t*X)^e~Jl` z`(Ba8+BbCy+y++QuY^j{k7*`A!ds4R-WJvAk*WJ{p}2$j^n~i{7nROVfpg7UP3g8$ zt(#zF;??Ww>Si)O;)L7N9-^CV>56eH@;2_!fQtXq1u)t%adPu08UCV_V+3MnnJ0YO z-|}Q$78tiH3Kam(z&tEeC11f?duMmGt>Jnq^id19)5xKTfs@le$fL*cin~%iXE^`4 z-yIiO^02>Q%#@Sp^91S4)PJ-HEzxzb6Qmx;NHE5J zwyOvQ-*&!&P_)&8>qfW#F95dM8>V!u9QT33B&JXjAaTaGIBuXw+Kh^`-Otp$_toQX z_k`EoDAfwf9bjZD0R-HGjav7QvrDXIZ&_zMukIvI-}QV|pK5o^(ZI$g5->2#t%eyC z8qTF{aozgrcSEPm2|;39|37Zt;?tD{?Q8q$)JoD?8XAP*vyqmgV1Z(kioSBW`#Y5R zwD2)2e_bLe$)aZ#+JHKU=e)-KaKrVmYEm~$oTlIn8I#`>0DEVrC{DOU1_i{zu$(qL zOuB=aHawxA=ttMNeowRFH4GViRjn|IZF-VvH0Zc&;(cHe@r#_e8YAF+6HVS-FXs4| zeK*e*iL{{4>bi~tbnX>Y6ZQX6_A3poeohB?ug@R3)fBW-1-&h(cwFp_zUbZ?$+q_= zG}yc*wB?Jo2YVB33vgJSeB(N@@1`3X9$u`@pF>yhbLPFmpoW98~)IZGm#^`Do%Pyl<3vV$1$F;>MSYpCXx~o z?86pZDL})J-qVA1850oEZ}m?{YIg^O8H{h#QzBS##_MHFZ>K!={S%HI3*EbSw&^kFO(D$XwsD1Gt=7z&c|PBIJXQf{TZTfPjz?r377l`spM`@R8}KasI_< zEA-OU{d!vy5;-O5qKb-_kUKYae&|9K6%{>iGKi}F+r29xKq)CeNqTAd{aIb>%4-ti zp7gM1rob0gKMvvm+m`Zl(feXCt!;7FaM|HxAVGFP5;TzNpq~5sg;LHQ@0IWR`&ryI zW_(dnK`M-QK*C;5wq5xKqzv_jsbTbaiX&(HG~+dN0?WKKrmybEwB3({`3tUbAlLeRO$0>faHa zb8<^{5x8h}u36QsLyy*-kA{dh4qK3bSqv=$BcZg-aFQGM25plwovLay@&;-jW?Cd= zB|tR!PBch`o>=;BK+h&mIODbd9QeB0mk#&$qX>Ub{)L?)z{LfqCwnLPUH0syD;(>S zMKiz&mZr|kX`*%I^5czXM!Uxn(syZSxKrfq`BE;){)?7RwnZ9q_N;w{EG#VObr88{ zfkRq3L`%f+F}Xj-o|cbAt8cn$);uRaUlvMGGD`&hY?1ibnuGFeWU!X& z0K)!p*W(U-%A5Y84{MSgEG^gjSYTN4l?EuNNAI2g1q|;f-b(29K&?*)Qq{USIUUg7 zTIX>(sQ1OH+de3-J9n1OjK=U`PYCUtw|k9>Q-T>TdSwC6=2G46myKGvce{f&R7Sq$ zsr<}cl8!U3P}g%c=A^*S6T!M8LftXX{*;A9nTGiP~nFKT}Us&7i&J=0*q9xVeeZzoUx+&sU>^d}@l=q(bO5!>jGAMAG9pA-sw^D4Kj zs@7SibnQ}yh@?pGk9)&S?zO9*?0A+yUjhNjf>1b{ z$;AIdu}8<#avkqJIc`A=>j2BdEL>qV-kTuOEB!sD?%>Qh@ICEY<|GYy!OD@JpZ^@^ zSGIi0@77ivtd!~~Af8A)v@BGbhE;eL=jQ&6xQhE(-V!A3KP*w#Qz1PS=(}(JuS92N z_oV>k!3@K79vL#63FF z9Q&&gndjhp_C0BBaK*Ls^fq`i+$U>2PobAIaBxCH9)^t(S)|d)EwO~tDTRP*|L&0Q zB|{p`=lc~hnIB4Ffv7;2J67NE*GJ<_IQE$_$m9;Lc6LJ1tr0>ybftRr%pIy0{JIWc zpw58()iOBKZtsF+#C4eCfvI>ugIxZ@YbOYK&ex#ja->)?{6SYK?ZPoM|1?fn?ukW5}O0C~8e53>`yl@g~StE*U*| zqRNta`|oX_C*^5;j_sCQNwwAbfYBSVfp*I-!X?I<7MdhbX}OqxpK{LwaXFd}L@QQA zf9M&p+5$e!n7018W1fSJZM(3udN%aHL&)1FAxta(u|Rq1Ym{_$AHQX<31HF&xpnpS z0|#-J*NIuVMWszsSX(zP9B9WwhUTD6oP@o@G)*7{YZ{)M~H$R0f4&*90C_X+uN{W^h#+vUR34KBx#{pGuY=`$< z&ywWoM`eakJ|C=W_=^JyD_3&S+41(?TfqN|4<9;8uG7DR&e_nDoOEjI%!k22qw5E~ z^4)Uc+mJ4F@v>x)r^DN1PU7L1+D# z#Pj$LV;eeN!h+TJU@3tSZ}$2%f_$Ro^9`3M$u|4$Z#5}&s|OTqTOQ-df81N$eq1Nr zSl}yO;LT#b`^)B#tAdrO!~mqT=j~qjYGqQ7DKW?#=&C*IGf`D1x*dGw_N_&`idA=B^uq`N z17*pd6Z$WjW^E^_Rr3a(_B?Jg>KzmmF^QN?bK^xrd!hHIM3jOhD9f2~!)lc)M&;|L;3rxX9s8Utx{Q{M~dE;J)F?p>=0Ng7N(fXr3|4 z4^F>fF4kOH7r8mZ7L4leqrFvXEw5%MZ&KASo2RcV>YXStk!)h|y{N4|_`*HAL6RHQ z9$)KzXl15JqNb+yVf0PQo0!fqkX~<*3+Zb`8h9|6H*eTficlhYT3QB3u~t6&t+o~_ z@3Xi3wJyl9hY%J^NNmE3e6`yH=B4V-iVZIlc5Ts@~O^FU`Ic-@};{S zuPMw#^)3GpUcJU=RVTwzLoEGI8Ryr#cke(@joEEzFg1hj`mB@_i95YE(V3E(x?q`9 zfqXxA9y!>&`VQVZA*y+Aj}v8L!tymzu5>yp?hKLg@5T^ePxvxk<$UN6zQ4bJRe`FW zV3I@b_OL}9a>U{JX|`Nl-|JDIMvlr6EK}{26HC8&sr9d^swq zIAezA_xjDB$T9gsLtEGy-!QE|z|R0lD@k5v~Hr5}(7C-{$iZ(dFiLSCDiN~z_k zj=_MN6eq|_5p+Mm%N1%gV7nF3^71Ahe^c4|?c8p?D{((8$@kq-`c3l2oFHG(y?yiM z&24BIRj<;bvbwtDh(x6jz#=*X@fXDaU81G6qbrcE7$lftc#oXiJ${`+S4u&n9Zzxq*8< z!Rm&!^Czs0lrAg?(#l^Llm%}97Ofw*A>yO&qPF@w_&nXb^u0LE^BAzvQ1Ip;kXhEtZk4fd-J%+2l+Ph#KqI(`B}EmJADWSGg?!s1h1-K6)z&T+WU z_|z1&&mVgMVPS=CMb>a!e@uvPp`i5q_@HXvw@SEnz0O%*3^|-}$F$t*zV8)02&PHu z3zga}aM9=Ew5?t#*dL0uBI0=iGg7oOX&D3N5AKCYJLu4Doh@APc^HKQ*(|!e$Fx7< z(<{-XCWBYa25jLivw#ubKPZ8x58XI%@V7x89uT+WW9Ohsf??hjH@qwzW?| zqwTw0l^fQ9naRbUmdzUhyH~deBI{ zF7_mJoxg-84&qlo$3QfW|IKdmSX9}s77wrKA#;@*!A9)E;9v<#ZbED9P&4is<`n-@ z<3ipX#ZGjQI5Y*T-Ov}M@zRg<=Q4Ge55G-aJvxm0+(XZuB=<3k0Vv9F*;7z&ILO^F ziHO4d{A2QVy;fRP#@N&iG4-1dF-1TjvdSsLOK*|kTP>LW(If)HLOxSzXlN+tK#BcV z%nWgs8KeWYOeC|=_$wP--;($5@%=*?e5ljrBJd}C_T#WcnQ)X8=MDeg#e~1*Xo$$i9D{DR2^WT{|?vatT-g@N@J=?aJoiEV$!2Yzd)e3HUFxcBK zKb3T6eO@U`ZcLho4jAi3rIj!Tx6p1v_cv@d!plYub7trD2YO?_mo7DHXYn_Us_`r- zTB47vZcHQ`&{!u5-h&=1`NUR$xBz7YS-=CDsMZ9Mik-Sn7>I&{6R%qGBFiCq5#;s@ zmB@$=0-=x?Buwx>U0&G>)mW7kyKqw-!*-&$c( znr4K(;Si5HDXXHJH59rS=}uLGFaXZv1n+cDta=iPk}YXf7LiU!c z!U#Mtr>@SM+wJGI&M^r(9k>*@C@!Xsk?{~#KE%bH3pC!3qM`@IP`2v82wtD4;m0^4 z?{B|fG4HYLkO)#Ks$+ht!ufky*@E>PK0f}=#&}hUD9%G-+!qIH!?&r($qgO;BWx|R zRC;vx!>?;+tSjq>d80Ceq`~4r35F2f){#jfI1h>^zA$m|@*dCJk#MGHK~v*3;D|R; z=)I7-tlskfJ6g+9q~{UEu`1OX8(&<6Vo+a<+v@c}#~$-ipYT^o0g2#UT$w^5mD(TQ zDq5{nk{-6=N^1WrLlX^5nJM8Ya*g|s)GK2?yG18eo z!FQ|&Oxxav-olT7FJkF`C18+Dx-O>p z2IWse41JKJoc#|7+PbWNPgT4hBn>8q;U=_qQ*UIwRcjZgh2{QXSp|InZt^gRQnkFN zfL;l0Mn+5|G3}q62O?j+3GU@MO758dFsa%+YYX-7bRA}EOnT@&OXsNY%~z=W9Q^Xt zlyd~;&z%R244;$(GoO&FVgfeY5}{i-0mcBf{n?CmYPb41Wotmj;s{3d+UwD>H1qP& zCLjRjrCNDgp(@;|3T`d>GmyByV|>qWFYLWU#`6ga4Hy+lS{UYKlb++?6So-=ZMsjM z;s|=gtE;KS{dJ9tl+T7A2BM+8VNA1-pE_0g)p4t&6QjY!w>1$m z&knn4^~3OJag{oE=KFOxWPBwIV506r5A=~iV1lYj5Tjc2md7I8Q(zWBpTst!XKF*# z{QUeJ{N2*hQb$J}#@HG2QbzZ%i8fTp0IH;7qp7(AfE8*sm`p{b=rm6_Y-nix*>+v%fSb5RFGK9}!(QUW>h9-qOrQfe#IgWU%>q z0uJxGvHlH~1^56f-ewS0pidW&usrg%FlA`@7~}GYO~;ZzUa<;eRC#t!-%3&ftaWbp zi^Qy#VG?3+2RyTW2AO2feOy_@2rBLk_El+bO0^~^Gs~b5)-e5jC+ZXor|~NY6hV;7 z#C)ZoWj0nv?U}1jA2VfYLW1UQ!K_(Q4gVWAw-Jo*7rN*zSCN+GH2$(qCbyJjXUpW= zlSf|ex&Nxv`*D5r!#_^HNORGryc^Q=MV+;?@ZZqj;9?aM0=y;-YHSsim5dl7mX#1r zwRJkI^yg5g-iOw##8_?t2^_j!?~TZ0JspFKgcBRp2OxLuXZ{Y{AkLV ziw9Xq7brStI}io?=^s3ZlA=zKywEj|P%j!9_B+risl@&M#?FpNPmXf`IM0-6Qt(tXbfHHA zJvJ?z3>5|yiyisp_Y<#5UP%rl9io=oBdf|R?SZzCha8{2AoBTPIZ9x!A~8{BIc&-~ z297vxP?62yWg8K_xqd;T7m@uo4b zc4Y|;a({~d?-3ab(h4LEqAkXRuP|t2)Up`8viz#xU|-!($8llRM&&IQi`x^_Qd|A0 z{Srlqx1Jb6mtb5eM;tcpw9V0cO)?tH!UBgE4pC-_zQhB&W04nn*O86Y)rZzGBit+F zX_gf_6GWM1MMb{gH6$c_VA03iDJJMonYHMrTaVQ(Bc|a?3K5#fUM~gzC zG_HSh*nj2UdBU=DL)QEi`MG^i;!_v9VBgYJPt7ZQ&B;A%XA|0uxqqq>+xnJ?n!LJV z3Y_XYKXflbK>sd*0UV3e8%+^c)wf3{nD`^b?>y@`eE%~AKV@n49XHN#(}aq?OePUB z1#T2@Lx%W{HiM#}RmNO?x4^0VEQqiwO;UfUzPryb>wUB}T_;Y^frb-Blqgh>1(zqf z%vlId)0JZ!sPmDNlVc(iAnvju-mv|kRjPIV4~szH@7@aat!lxHl(Out-y%KpGZ=`L zzW(BdiQ=PwIo&)d@(*L$j=E9IgV*DfiyifX`p{&;T z&f<(~&LC))$qm!7=1^CyA<@{}axvS-02BqYzs zp%;8Fr?|rf^>Cvu>+IY|IO>K`uYD~z=wrXc{h%80tYhh}HTJ=e`L8Dl)qHIGZufNq z##%-rRhp`Y^0L16e?7amo{CO<+Cc;xRHUW*CBOw(5InXsS8|9tYGz)v;iz`?cKr9K zqnO%nC>k$wj0d8g7;yhrS66?4ACaw&mC046s>93ir0yh6=?Wt)A!4n77o(KAmPt@P z>2>;4gsyBn>Hd=pg$Z2Qub+T>GALP$ySdL5z1+5gzT2^VmHi+X==V23=VyX){$opH%2!?2z1TEIZseg3UF zzHgbmzMO!328r!b8}C1FPj0qTW*V_yr-@FrsXkj# zuRD3W^y@WH&Wp9n6B@6cZ6PVY=tx2sd2g$r$ywhqpYeRQI#I!E>-WLAe`aRp)7WRKT`3!N z!+PG5T{|_oN#T=ILW8y3T|p< z^_M$fVcc(d)4)m?CXu=7^m!GpL9waTb$(E!9;iX0tgx*Abq!Tp9O`t>3vufaq$w@+s3h=xP~NI|vgHE_Y?AIB&bJnkr7 zf{}e55KmzuwAhyVP9MFmk6wiIcChxaW>Z(Br5*<*;jE%e69p3ao`TTv993Y$bccJz zMxp2W+f5QG6$9dUJoSjvteSF5nwLpFWGOhE^AFJzCYdfo_jxPOK8(=pcZ%sEy zn{`kv4QxNZ`F=6vhFfDL@(H@XiK(e1(Crj@xug zd3b1tk8*+%N2U6GUb`>SDMXaD?twvH%n~*9^lD+9^~z!nxVgA$xp;V7TC1$3-PK>x zRHm->lrnV;HfPG;dG%-Bu7EVFE%%>1J#n=8LuVJ4A@0idnhcMll^v&@-Lgc1?t^kt z0Wj#TrUA)zem61mXywN#7WL~nTm|wk^7~kT+n-SMM@^T^@(c5?tq&hLOa~^!Nk0PX zoSH_+X^m{^Si^mtfJ3=tcn&yEbPVFqC|jA~h`c`B825^^05=ef4(VQN2ZudNz&~L* zekR**P`Nw$3vsXaXALGVM_1QlG&Jv;beNsNjr-e89?&x>Gx|P|%IoMH&O7J80cnW% zq0Rx8f!oz1siuKVVj87bJz$VTw_cSD6K}hWsak5s&A+`01`W6fOTDiTZhECFPWk#` zXaNJ^wkr=rIoV1ySGs2v>baA=L;ojsy4U>_YKC`${=5I9$qTs+nXa@+7LM77rit!fY z^yuF#XTMEqRwrgEmy}pn2WsA#a<=O}!PzM`0t>UPN{m~mE-h}PRbJbL2^U&6Bd0F|!XjfV&3W+UW_PJOTYj0s?{<_A^Fv6X^It&jxDG4bThj>h5-y+!XP5mY0?N z>T?B2p-+QeFAnlCG0`otbkT%Fwc=9`$GLqVRgHZ*P39K}5utV4zPM|oNkSBSB_JT+ z%PfzeAU{;>=*w|9V$2eO& zs2HHJ%2rv-vp5d@Lreq8pF_ROZa;NRCG zPZ5@Bx%^My2fazm+S+;9`aiknV`CNQ)PjYecH0-i)6GGqr%!v@+i~HQfCSuwBd6va z$58zE6cbie!!qvZ0u25;oNTVR6suqN`7wLKs2 z_)XoxDxfdL5S$RE!z{UlGE|a=gG=c~ciex4^aU~!!(q1I{eAi83eQ?y1~{)HA7sqz z?QcVukSX(vK~a!io`utKS-SZMFv#l;wPQeM`fFMc1TqDHMksW7>?Tb%g4b@Gqw-lg z6MoadV**M69`sU1#07h;B%XJvmZyh>#acaNP}=#@0_EXMvC>{ewGh+Ltz5N{4;QBa zi!ERf>=bR|yCv~vYw@WN%j{*cCL{m@^5h-?;|CiXTk6G@c*ZLyioh~DV@H_)H&r7| z<9W>chw|#Wp0aXsMJLyM;NY-qAOY1u%=gRxrEX6e%(2XUm%DW0N!P@RZjKBMQFpg& zpuOQYo1}W4=*f-L%XA7>p%j4~5g`1w6?s=PB{eA0B-e+KaEzOo{SqAk~s+@aG3JD1< z>_nCwWR_!4li@Kk#~!P_T>89N>BNEQ>w`7B&5(Qo@x)7-=&UbkQnaQ{PHMnz+gzQY zk?J?Ns!H)uHD4_yncu2hE(4SNHpW926Jz5S-wFzf73wtf^;=F(_^K?5&s!^OEG;d2 zs{~^AvK`+0RoJA8yIhlKenGQy<=yk)<^R>(clcA?zyBX2qmY%39fe5to+VjXp+Yv1 zP4?b<-9|Dy$x4clmA#X3WMuC+*<@#Zuk(34e*eSoest4aH_my##&uoK>-l_MuD2+n zzz(Fk(%p5FG2f6)yi!2WX|Pk%SE7Adg@3(oo9%%DLM-Hi z9xf%r3PYR%6s9?6`>#{9u3f(5G?RUH=2ve2+@eCydF|I-Vgv|Js7WIpJTB5<;AIk| z^RTtO0=1+`|e>#5tq;Tbw8n>xTiRUCYK3jd}(fDtqRAzS#RNe#DU>&y&IUm@{f`cguHTeygF|8%Ud$+ryHf@&#gnk0rL3K zwS5p8)V>sw7@M4&Bo31^1GcDZAMQ673>j-;WNg>su${WxaDxk_X!s+q5SBFo-djLK~>xgnUY zN`ml`VuA=VG|)W|yRhOI^-|}99DYa(2?F>@cPg)-28kCD2sxs<5gX@LQ9{QNON#*BzHrKnC1HqgGOn1HW*P5;h)wT z@O;qbBSIK(Q6OGI%z>;7Fp5`8+;CANL!1LCtf2Q7b?7baDaCZbA$#0S-X_U2+9xV3 z;@>0-Y)C-vi5rg=Vzz8d_dK2qVpta^YIb!=jC_22+$FLL;GK;{e+Jn*%jl|(KDRHj zOb5u4PK%v!9F#LZwO(%=o`h+sfKY#8a#9iu0M!l6KwM^2|GUa zQs*fQd>ll|f)D-P6fKhtgd>&lYpucV?kIRx>g?Jqp_(eB2+#1goYljVu55KeIU=~F zoW@%{r5x7!ntzpqLzb13k_0Mmf)E@KwcW!gXo)&Z)zsD3pX%kO>|?bo0iNfl#~0J( zpY&qW7N4``>lBWzja+~dex4pnDsS|0a&pRJ^TJhda~nUg24*yIw7~l~VuWWKX+&H5 z*79?!r1+*5+GdK6i!(7j z{Uo7H0~M)rgZv9YNYHN97EQxiXCxY&x%?BlsGxX>04OIRY^Q0v^@^Z>)9hg-9DPJW z_q%^ss%Ijkj~8zOj^BvpW<){L9-aaV&O80j`fc-?aE8%NVqb$>OoZSef}I$%Fdzd1 zdW3iFhh6`ET-$0sThD0zZh7P6OlFiWAEYxfDBjiGV_!*0NgoIeh+MmfGk<3IC4)-% zch
    `N{uCf-XsJF+23u6TpI8SGW;#27xp#VA2RY$)+_#{mbCpR(>=$4XA53)nmX zE)LHgsr~gYh(Nqxa4z6RFfcQ3fi&nr1m+Ink9(bszyD05#}?DcN^*)8=o`N3-!1vW zCe9qAr9u+%peRL!A`vdQxO+ED+$0#m1M6K%`B&;YmA3EmQP-Rbn{L~ri3mT35nnrdItbsLoCDZy7K3PX$vQGTk(M_F*Q3|Eo5{zN~yoU z-!ea?4U9YnAAkIH2sp*X?m|b*MOSaH>SLn$>vEo9paiyDf5M4Svc~Up+ z0Cqb^Xa3`B``n~u%JF8uthw{Z<$!!sL^YVGzEA*(!spS9*DCpDuujzt4SparNO_^> z4xUa>>04TU$oI?d()@!TSf!-`8Ep}$)9?`FMEJu_V$@B4?=%UBB1yb~j22GC-XCrd zzdJ`)r&{1BLm}Q90CI1@Xn(_wY3jI2MivjH|3rzn6J;6g;t`x;6$lxisI@KKZ`{q^ za%J}K;EkVgE4Ywhx3U9qDI3Dh&QAB(*9Zi{-?OtB?|?RZvg$6~lS0ZOogb{Mka$>> zj)Ls%%|uKqtKrLx^n!kUqPR@CQBk%TqF&b3=E!jcRti|%9Al-37QFuyDsQzaF)H#Q zb$TNc5)vXN`pC3YMmF4|a&@DW3Wls9OeaNhA2k1@sA7ell)pFJZ#qCp$T;T1dqr7n z&47Yj7M>^={Cpw}EPI6j>W~g_&2f>+AsO>AmKDVLDOu_16e^t7lU4A2FHz_<7+w8l zQs3pNF2Yq__P8v@IQOR}(wZ5XVJ3Psi^uA81f2PUnK!Ho@*qz-;G#4j3N8tH zme;lE9c^KRLSkp@*5UJ@dkC;usjn5Z8`ElYWyX7w37&{LlYxOBF1pi3aSsf*e^u<{!2eR(@n6Y^RbIgaK^YG+{=EeNs$?MrIj*W)*xIu_ZA@`pP5>d)&@*z{E z9j-%)s!R;aN$Sfi>8kICR{l%Tvi49*vqr*QkX4P^@^N*|L(Cm)OuCC?R_3RG zL4cx`O6AwDLNy*+Z#Q<22|)H1O1}F0x5bBieYQ}|jFoY^zjS66R+@G$e-2Oj$5w=M zK(BOs=KtIg0a1dF1RwXoLB>1=-rwmIDBNHD<5sA|y$!f4L<)#d{~atn^M1PlY_9#3 zCl%wa0#*beEv7ffO|}^F&(1a={*n-cw86%6c`H5_m)^MI^)O2_A!is;56q#yeagT{ zIk%ZIYFa3LUND`Q47$z?x)I8RFYXhuh+V>K`m*4E;}<7oE`FeS1bg-uE#+_nVU63vpHG)Sv|~f8PSv{P#eC7On||86 z2e^!~iZXC2pw{3#xTU3{ocb{+(Fcg_sc?HciR~$ILS3{QF2`~iAD0pVO?BXuJ8L3A zO1RReST^~xbhH9oaz2gNxbwULo!LV(ozdo?F76&J$Xdu^o4ddYM6-1C(xY?vTL7f; zBS}6%e<1FqRa7GTE!chFkv5(f-koPz0w;Ij&!0#*k;7U|xtCVT!unAmnzt=>vmm?A zv1QvOu$7Y*5){OP{W1>`pA9c4u;a-Xh)E@~$vAST>Y3v9MXOHtg;m-l%YVKcn|B)P z{BS#V)m5VYv84IOm=Br)>8^bKhW->JTYLrR4cjzTDA@)n8zFVh(cyX+KCo0{LMOgA zZ6u!jefToUQ#s(rUcgQ}h2Ma6>I>L2$ZGpZGckrApo_AyvI3D8iBA~c;#UP`3up4j zd`Nr><(q*D5MQtKePv{rz6BKr$amW7xg;)+wC~}ZQU1MBygMa13NeU2Q2WUvqWdbG zMW(n1`ET?ek;B8%D&%6{xJouH=vDsyH}ozta0j*`bs zeIZV+(O~33>8;EO8P`*=FT_Y%i}kkrVNLbnP+R_!&D7Y|TM$2pvE8__Mb+77sr3Y8DPTi-fq> z-GxLNmNhlJDHP}a<@}UkKR4TZ!)yDI+E3P!vgAfNonpI}EpO%nGb9=k>xa-vd{xWv zr1%M0KV_{!yx481b|?h>MCM)v3(tgdP^*gfTpG%&NNYIB;)pKT?&p2W5JF*f1R2xs z-Qy4XpOfG!{YLg-kS}<8#nrB-JY0?_T;apy#spkt?oiOc;$#jae2(!W5w^5h+xEt2 zTwg%`b@r21=Cr^2r0iRNP3h;gmBI6K8MivaKjnUqAbqW?D-NWHudk>G0SQ~qv;*vM zajneMxnbybBx!wg5|dir_il3%`xKv$umLx0-Q>ncqtZeEw5S)C4Zh^TSB%^J07`Dh zfT_waIik+#M3wyi`YgK_cg9|;JjBt|QhA}5nyqvzC1ntj&8n`&vbyOK*tI04Vtn23 zL^k|w<+EiP+#86-@|n;vPL364FSmN3cgF8FvTA?r4gIgqj}hJm64gbSRpru?CRBQH&AW9xqH|akA_4zrpVlE>#XBw`QjuwL+Xn-DJ z@93B;xq%xnJ2ln5yv&YsGuOUIhm|McgS5vK!xV9Wg)U7eyNQ5rbtWcRL0kEP@dnib zcwvoDN$DuCJuQH1G?4k~7G)X42A>t8m&RVCC^3rotZQ2I z)1l}12#{f$)jTB1IXFDbPn_!IM1m`AKD_H9@bRTwM1SLruDB_%2^#m6{%lG7drtw2AKPCl!JvrP$77{-ZYp zKnxQg>5=1P(<-7SCBOp_C)A?dAt89+clrr+`kUkOP35Pn7|PF2uiPAUPGYY>TUHnp zXmI8OkCrv{z-wxHfD8exwU5wcz_!;A18e(vU5gO%mX%HlFp2h)NrLzPNeGa*KZ6{qFBI957V8 zC7B(cdlym~oO^J+=L?I#<0-4IRz%2iz1Fhh+j6hNHu4LHSd4f9%3+DS(3WEAnxALU zOU*AI=PvyF6x`>+Ug+t3ehTm+mwL(5A|2|J<-#HBj{eKbzD_?boss>WlGe&`N$%DV zyNH^^DM&h(ln4HUjk$Rn!M$gtMo%UhlH5H!Uc*}h5;QPV;CWpSe+r%$zrr;oX=27f z{I(KI$pszW)M!0@u)VF)Gy4zE(YxVoNZ~@`#|>m`7`ffOP7~86NW5 z9VoP0`uoWQUzBq{vX07PQ{#y?wKabS*TV45&W`4r&Ii?#Pd41?q0-{Ep3q;oNt!#R zr2=pftK~mJ!rbUcpqN$JKk6w@8C|P%oNc@dqyz1=7mkhzz&M8Ec%=BzRYIC1 zq756ovu06WEqWC6foi8>OB~PfR6zV=-QbFAs5=oi%m_OvScYCxT3P66* zB=vFJP7AIcqf(C#`M1I-V&6+-#{+>2d&xo$3KtC*1DPc63)rP`3g+aO!~Q^?cstZ2 zmwTsn-5GEyUD9f(Na6WCZ=)t7ffo-gh~XY+)RO(`C&?RH8IvOdf^-|K7*+KXx<=<) z(heFYO_FIs7}bQX#mmTAo7I=9ii6AVvZ3DuJqB>vctpsShW^zznBBPfP`UbGmQY?765jAdWse zxkuhWp%tNaaJu}0NB?Vid2n1Dsne!!&3~kVZso+7nmPKa#|@6rMXIp4^4>u|0e8F> z^H6brxc2_s?lJgG70Kn?1JDri^h_!>a5mEfA_4zjs%o&%PSWB^&AXWx2~N4RZ&~iv zPR2gY1JW>d7(b~-PZ@EPRyc>+* z&+X$z@5GfA!(UxX=-L2cHrTG1jpdEof!aPb22~8w3TQDa=aYzeou}g?p!`39-3`bA z^gaGS1@g+lK^<{VB$KUawiFthu!L@&o=PA&*z2Ts{Etb|4b#sk`9Jzgu2HGzZ<8-j z+xC>(#WxG@ZaCF@Jbv~6xB%?xtdx+A*}xqE$7E6CZO_uXlRFUV5P^^0@D%BPE~q!+ z1w0D29x%wpZz_ZSX>idJF69o@v<-3qu2Qwg;=G>1nLL$++k22NeK2hK8vRH9@@HZ$ zpJf@@ZT-uqSy5=JH@V=W@^RYX4hn7M;<}YB=@D5;V7Uqq#d6<|fy)e};22vj`9To9 zuJ`Mu5JP{4Dm%ZZD92l`Wm>3(f3EF+0zNy0{k-{xn_xM>BblXNXgo*SY@Kk&9K7fy z(}lAiTJX6#Puz7e`&-L#Z89Lh&Tz|5;)M_{LWFxI>xP+^7cH>R1W@Rhd8gZurIwF> z0+Qc)^zFc(F*zZCx&YWf5vQOhd|iSlMo{ju$#3mam#kQ2U8w8uTvW5hf}D|SOCM&T zULXnCZcB4Wfy?&X9&%E^eK}=1XM`-7!Ey@jS}`dp;N@FcYwS2qm1wB|0t-%auuc%d z)60PGdvnhJrOfr=FZR#DIulOG0xT{BX&R1o@OO#O0^$%c09h+Lo;r{mfM%n$eeIYw zKP7saHt0myf7~4r`wG`tdK9u5*HvRc_ZLo&cgJRCXaEd`_6LBnd*_|w)}v2 z_v>zpftR3xG6-(clbgo#(W5o59e$m3D?VsW6l4KmKqm=tl08j!F6AX25?&j+H`*iD-;qS$GEAUCRFb?P-X`aF#E7a#?``YvV z3wO-dva67SIuOvubhIBFhzLp)5;#DD01XWAkOrUtjuhE2|CGp+9L*c{r|zx0>Bo4v zqzL4-p7WNg{x`5~H}#P_P-nt@2c3`CkkmvTH6C&dj1i@A;vndqKud+)vJ>Ou^IvgP zPDV1dI0>nhf8ipWHl9W7R5(H>?H*7xK=Fh1%*c&4^nM#wgHm{qMo&$Tt{DF$aCwZ1 z?{5u64w8{~<8~5BQhd=)pg^O#&YvK9cm-R_*3{?JviE5qOz`;QC^12zMAId&{3sLd zP((E}NOw%oU6-GonQ;%UfDM=K|1Zmy5UJ6`*J3<7HJs%-(Rq;^KA(c)w_wr`VSRb4 zUQm9ZANO=xY*S~)6g<`2V_VC)fy<@NuAF0d4KTkyb8~_DH@gC)-t^oz{~CW^6O%fR zd*db=SpK*jrQ+IZq_%+H2%xH2x5uFt-rCxFP*)&9 zneASzlQAzrPLuF}H4)rGbb!ZDTl@Ickp5=^Luq0t^tAk8zxR%*g`*p%QePyJ%@QKk zx3;i0#EZR9Zbd3^UW?3EXL8hbDT7@|M@pGngRl5QgFP84+-N(IN9+2a^OJ{;O9eBu zo#bUu9)ozhzIe@GjD*cmzyebA+Aq&686{5THq+HVe~2VBRcQmjH$vG*FYdFT;eX+x zdR7fkxO9_bXe)gQO2@>Cil5c@U%;L*s2WsN#1SL@tArVKwiC8=%IsRCWv3)2RDb0o zS4M~ip{`hh3}z7Xo)bK+?CkA>Xk~5to0VcZ$A1%KUq@Hc(R5jP3)Q8M}EeF#^sFB-QaPP{RyD#u2J+9O&P~3%wYi z%)rEmp%NV~m>=>NhS+EorGPUIP^-WfW_@O*`4J%@VG`T^OChe@pSSmX!OiL6Y16OX zc7SME4Si4HC!`GuW3DVY$FaP6v$x7-0 z$6Zuey(Cq?&-=8Cl$EBCJX(~O5@JrkKKSgA)IbYyPX_g-`FkeYo1S@YDI~IJa>`wb z$)olB*c$B{@2_`eQMv^+Sydb+puO>>@vYtPp=^reJ!k$?PfE z7HPT(GKMnC%uXDImduET zu{~Yp<^&r#6cvH4{cHWh&zAsDztg-8A7ej@8)-D(p3fBTgchVnQV+l;3;cKr8A+0) z4~j>yd}VVzpT2K3&1WQ;R{Z~nH2 zNJci}rg-3-A_DI`DQP#(o1NG zyXW>=R=7GjArh?i^ntI_a)4(z_aKeLn9wK+k}Sl#r^P_O>H;R4DhLQY!E#<6_*Foo z1#R1tGTpqMH@u6Z{u`si9!)2PE4#o^F3?kXf9No&-- zXmqju=WxITfFl6eiBXMH%dZ2%)(;35oTC|t#^izp)Y8%m4%Ro9I7oL9xqDaS zg;a8SX@w29esc=2dH?F2#?*;^<_IcCJC}T9?qKN~YuHs{)bPXl(#sbw!k`=anCA^+ zEXpOvwzCufSLpVr2(n4M?b|3|=T5&)JHH{GORP zO9CK~lameDT_Eztq7<)c*K6+b@bbbNR)CujAnxx_IH|HfU`kK~T>yYH0Cs(V`?rHh z9D+Sr!6!q7FreH3#0NmajOQY$LG7zcka2-x2T<}Ak*U98&eOx1xAPok>Z4#I*f~1h zM4|7fkJf$tnpa{_`yP2%%^gESLj%Zi_u4)eCmVkrm}R~rjfSKia6k!4t4jSBrIc_v z^jm^aThZmPU?PGL*WG0`UvSi=j9nze#UbmziHOJVp}c^`Fg$?xK70gZN#?Vr^z9HO zK_2)KTa!Vf0{(RIaR;V6C@VeXAe>Sv0&af58yU=3;a(Ex(!$8S5|N7?G!*kI9$m9g z+PxL}&a4bxMXDjsn@f|bVr|@A@12Z2&w~;(@1n(hOqX`Oa0BIX5SB;1e*gg=2&N3A zSaht^Z~YW^CzKqT%_c7iYf!{*VyQ_^tv&Z*mj*Cvo(4OiKjAvvb+t+Sb4?!pr-jv# z;^>>iwSh{t24D>;2lGXs=U-;=T~%F08K{4djY6gji`2n;ja~<$4nXn{AY9=MArmlL z6M^jMK~A%9#6k51=6%nA=Blol5^h5MXrZ+J?`2pwczQ6UDNvh)Pa96$9+0rd!L>!i zdD~88t-d#Q`frb;9*tLn5r)Z^1lc0Fez}{DeDMS=bHXisvR=_1-YA!Y4P79>uBxuK z_VIbnpW6tRv^QA%j{r7v2^XiMBoJ!Ov4&*QPWTK+g){>hBk4^f32enlIW#d&^DbKU zDgsD{v22o^6L50DH$GUK$cd@I3gwp?-SK{?6zmCIXAyyb8$VFZD(-ex99A72pM%^E zU@GV~Gcqz3!Op87K$PW-m2*Qgu@u=h%E_vlKp#_icZPxXxmDlyEc$6jMRG*o^t54D zOlLWF<(DsWcGTY59wOJZV<7*;QT(`@g~(M)YC1ge1K!lq-@gJ-$zeQiQG!9G9NZW> zrK26It6YTg0`XUoy;&E0uk0@|k6KKy9)06b|0cR(*tOSm)WO>ieYshfyhNX%>vU>* z3oE0)1-|uCV4Igf#tai)WX~66)gN(6x6M0k@$YLJ)w$mtTHCK*dgXhKVON z7S-jiYI~1Wn@h6bCj*_FK#>X5I;KZ^+GVh~pPUw-4x5?Ml)%_jJe{=;gu;RM8vAKCL9@x#>c&rKMc&}Fw{T&J; z*h!C!^VnRz0Z0HWC4p>p%-8Gcl|w5e_LDTQZEAcDdEgS6n3*Bi`v*IvRVbE@KFFJ$6hFs|=)wIJi8L-v?9PPHT|M80skk1^5 zysFKDOwJ31j%YFYVlRO5l}Rw+Q<6Pf(J)=sFpC5MCFk3lu_h9Lnn_)p?!F(fG2Hf) zvhne$`(Ygf18Lg(GDWkURSSo-5`rpfpA|m=<9~3=U4e2x3Bv+CdKfwq4D+AP&(GK3 z0RY5$e`9?;wssvDfk>njyy2a1nkvM=oq-%{+q+?S>+o#H(-#zUPl|Lt_O7E*vRh-? zy`;Fv7SsP776Dq8{5(%79?0^C`}^ZzO@OU)eZVa>Lez1lzAF}$qf!Nox?$}D0Jzk`~1B8LrPZ=yp2a@ zFq`34QHlh13e#h&q5#~f-S4p%;O<2NjH&kd`T3pM^NrcY2K`*ex2ktU$|1(vw9%dMiK|R}ggKf3&XBRYU-Za(2&B zR`7M$&8tx7u5)2c=%9E4%R|om6e4_FQ0WOWB}546Jd_xffcqaiWB_6XU^)AHLmGGd zpC)uYz$Rv}+u~iH-KOr}d6b66pz&^6c9X~=Ne1D#PB;2xVhLhEP2l7;Zj6Pfl22Rh zw=p5S4@SjBU=FJO`O~Ml*03uvLH7cI*7T4y(MtpwA;$vkVs(EE7ny~+tq(2uZa zK0cXntp!rlcaQ{ld8GrE^2)!7S&j%08IB+dA!i6Q293V7Ehhf~Z3nRb-#eavfX}LZ zdUlLKRYRuped|!05BasWf16PDsO4+dA_ZdZ@C1XjnU_uO_GvJBZhIL<8exIr$a$gs z6wjsC&on^I>5pY>`&f-hrDaubdI}t0q{B9 zHm7PKMJ0q$XL|bjmmhH|qxpew=Z#kZo*-ChjLTy&hAOq(yMz`1+kNxgF*D#~1Gduk z-=&@w0Cf#WP{;+&*D86%mN*Je)shpiCIwg)mz&d||K8ifEPum|SJMQMCU$Vy-&_V+7F*gLt?CDN^7d>6Kf3CI$I8e(Vo*6;5o91mw^;QYj<}z~3}* z8i0BO@6JjV!l^5O!?3-9EtAq1Q9=CWSF!{iHONj5%)_IFoIq|28)&eFHE( zK=vs()!UBlH^^@^q}rM2Bu2A2fIdv=fhIN|#%Bh-dwXJ+)J5|dzKhn6AV|p@8twv) z2Qit0m=RHxnZ=db>e9UE?dsaDc`Z9D>vn$$$f`l}h9ZxQ-o6B&VsY%!U8 z`C7uhds0C@^7~I6*P=m>xKAFt%e)PHNoR1f_Q6jDO3X~42YOD5jmOc8hQmqS8`wG= zGCu7vW{^6Kju^s@+MIVh`{h^!$MOWr9%PQOIS64seb@B$tHmSE4eSId9|ju##ZFS3 zd#C?OFC;)E1~%Q7;S=P555*W1B(mLokBq&Ru7P?HlG5PFZLr|m1Aw{QezN3g@jf)n zG5KZOG4Af}N*w#p;f}%fZvZOP)z{amc9@m}`T}6Z&=Ugj)1pwfAL11sG7IRg(CxWg zlF;*C%;;J^cDNKE;~h|{1z!y~YMc8rR*3S~KiiIwrG^XY+cb|dC)iA?1Cb2y&=6n` zW87f(LbO%?JOYgDa_%eH>JfI6G<44h10dLdMlKpO2J);eJfDDs;z&vmVveYT*h|K3 zrbokLP;lH+>d4xDfjVc9d)-De zA3Ql%t}Ec!^vXaZKgFa)Zt?Fb%x-OkDE=Jsi>EMR2#k?v_yqic2@Pc`@s!mc!~ke6 zALv4A2&vblwxmxjki57<0reRK9l39eyo)l?81b9jfhR3`r{JFiqo0CXY$GE>{V(tl zr=tO9&oJO2{-qF{Xc~|E95c4JpD$}*U*Gugi1FDI4QONfL#g1+0Dn>7!8n8(^c#%P z0Nabic~icp3u=Xt*T900J3AWqUWA8)3Qj?(3J<}cn^gy!93VRY5%+{dx2(Ke4mMX3 z_lvSj2711rpD|ubKd#m9bkajjxW2xwDTCtZY!EjI5BYv1vmQ<~g-&c;+E;aJnB9tr zxz3A4qgTO;v;>9>TF^-bCF=AI0tNND{sIlMc2iv8FY%i$M|c6^Zsc@0F=ewDcnZf1NtGz16sbQ%Ag9d%*TltImi`oFzjZ1 zEsS{cOc8K+L7HU-!4VR;;av^8t2lg?vvcO(RCA|hW(qK<04D5S@Px(v(V^baJs!PPIbvJYFsXCQL2}jw%*>fvmHRWdR$bvo60m!Hor9*(hV54dH*A9!+;} z<{)fe?;SgKw6yFDy6>t_j6ewbntY|LLGrEKazFZ2-53USK$a;5@`=9L_lU`t|8Cb@hv311~E%bVC_W9nsV<-P1iuz`yAJ@Zw+APF? z-%7q@^bWvj{V`T5=DoeeBV15|0ik@SQsMV)q~nt9ct~VA>7y4}L4~m}NmwmI~5e6q$#d00M8uLpchykE?40I1>S$KT=P*sr*utI{D z`i=(zt2ik@1WN04{xea~U9*kaZE$pO2p0VhdXlD0gn>|1a40icnF>z|puB8tAC;7p z48jHC3`wb}!Yx!*mXat9+U5If5XI)EjDrKy`fH2+;-a{+aLXj|CMljzXE0F%+{hTB z-j2cm0kExMad{w`>o9GPqbcRyTtm~57sgijl*b_U^gbujV6WW~p^PW(^FJv4~ zp;Nt|w!arHW4$z0P$&@Re$5(sS0v-;=r{yXstuPcT}%8hB)#?42x=0}NFg#b6Nhie zUGS1gmUSlYw@LevO5#|4OYQPsUDOB;6Gij(c4vz9jTSU<1Am%%Pj49QR%qNyyAVAi zBO3NyLIu?*?Xy=h$j#9_d{ao4)n#jV>E1Af?DuE5u-jX)#G1%LS#R!Q?Qp(aZ_7?1 z{fx|g=gsybHK^dh+Zc|aGW;(7`TLU&G-fxL&DX_cu1b%RneRV~SZ z|If4hSG8E@S^k@&gH>&+;QR}QRtNg5i1A2t3JkIi=@hRI%nV zY05|vl&bPz4F^A!S$Jc8eJs4BhuK{9^n#AQ-sUubp2K{LJ67Oz0Ja^X$&3;f3Uj#T z+x;iezQ@=;lzreh6~1~o-1o>gHCAmAwW9Enz-Q+ncRG+D=EH4zUuwPa-uf+K zRa63(KOpR1xk^<#^G@z3=ebaI@=*>@wB0SqbIptMh`-fOQe{*cQ~a#-BfY3YEU_5L zTFu31QWGa5?u2f?{ogIi?JW8q{L?n1_Q66!6yA;Bx%14k)_MzTcebUE>rTF5?|UYC z6KdTE!S7iQ&SyVg${5HpVn!&a`ckf2(iPYKM=bbqa};z%e6*FdGzSe*+dgf}shyl`N>($x59i^@IDk z6GOLpH!zX9C-!^$nVQr@HjEHLBV8qMOzB3EC{f3L8;MaKzyE%0T2l6sAet>^RC%QQ zW7(DGzcCV4W6WXxN_w3S9$$L6*JrPIuinro)wE8F1&8nrvkxS0KOv{gBgUz{66{1i z3$JZXt(%mTf5>eTr?+oxFEIE(>6POj1v$Y8P7MY-)$q|N5u(v!{JSYNrRf%sz&V&q z1+_@eNIBFO{q?l&Ljtt+JGxwY>9gRRdfzpqLC?JKka z*sSsM(??EDl#j;#g_*kx2+C(6znUv-4L%EUv#HPyyrhS4)KIwV6Xw-=JG#OY~ zOLECx^mBQG>YQCCmoy{Z+filY)cP&D>GUy$!S5=PS}2 zNda0_&=4U;h22rPTaQRMUmhu?VRp`rX4osNc<;I-!<2c~;EozcxC-)41Uk1tGQep5 z<@l7uug0Y()203K^uIJJS0HG?ewM5a(fudFcBbwpsYZyaso+L_M+tqk9be;WAGi02Hu zawf5}7M7~O{E43^HRjpPf3>)X4Y$Z*;dD_!T#-S3L66#N@%&dh7pGSog_CcQ$+(zS zAUfHsEuAum%YRF;uh^atObwPXG0#vFBkV!cLMc5d4i6!%Oya*ciC?bN<50&u6kzkP z?2WAz99k9;zZB>t+nFl9A6_NgEFHj3h8AJG+tF%ArSSUzj(hf+UeDyj1Zx}30&?&e zaHl`Lyw%Tm-guFTzZpm)eNY_(mlcSj7C?m+g;$Y21ICQeVr%)eWM1cLW9aR7bRj?X z6t;RRipC))GIiLL@^Jczf1kJpwLGQT$bJ+s>ZKv2w!6~QwZbxke|odHxHs*n;~L#l zL>mK%7oW(ggB64VkciAfIjD7^L9l!^R)nZa;a$3TQ`)C!Ni74|0iaBA;C|D+7d<{P zp#{-Tj-!jt+&{Jt?`F4J7Z->^DA!*H{S4-+6@nxdwFLq$B7Mw?jJ+UZ-iQg0EGIV0o>-9ehh`S~P9*T7^)IW@-6w+}vsXKydL>>hGCPm5)}_vfI9U zT#dyo#JBYgSHp7{JQOgM1f|2RL$SJL)YUk98)T{eA)mLg(!Z^k>@`32h1hlf!e!`F z5;KM_)Ocj@;wt{lD2XmOVRbU*5;9UTRWY!tCCU)$HnB3w?Y5waKe^?EBHoSaRdNfL z&leSSPE}}&9ST)-egB!?(lM!J>RJNI>+Yk40s0tvQISc3t+jIi#@3>9OK`+$r>D`j zdp*iC4n|$EvrZ>cm9^Vx8K?qFi;2g8z&p{ar`Kj;_zfGpUw5siSS8n1P4RpnNcIq6 z^I+zn9UuSTx4-(NgQo=BDVh(v-uaGiPA1m_jmI|;IBvL0k`cO?*(ALq6y`B=(oTE! zy>Hv_OTtazjPp}?-sY<9zD3AzlQdl9d@-E7c$Tp}@mV1Iv&Whv=NLwnDrTEK9b7g< zlu3AZqOgY}px!$0ms3|7bwgDZd*n-!)>jRCAZR_4tkr)0r;GyObo}>4PQIt2xl;mT z8|MIlhKn}8>3dit07tG^Hhy}+N0J-2MMi}odb~^PYQ|SqRYf2&2EnfVa7kQro~hcf zoiuFc)cU%%(;n{ye>#Etd7blOI9}h%EQ9AGS37B_2yZu7bXJ)V-9D=@5M&RTU*AfC+qEy5GgGfz8Xu@ z_*}xRjs^E{8bKO$l^{j1Q(krJ9pqpys@f6@3xuvtjq>!)9yd0pQ(oxiXziw}{^=lT zbQbhUHq9K((5eu3K-TJi6D5hr$vkwc?&Ashra`tV@;2yexckSe|IQ0H`_Nspq%~Hb z91FsK|2-0C3)9GWbm&p-?wNXK8XPXp?j=}8|9P^l+y1tPEzT$Bozt{k6C2BKyoDk` zf~yPa!*30{X0J~LaIMI)>;?XiQH?$Od&qA+5qd|JpoRCnB;pUWPd@5$Q__!!-Ltl~ zR^Ab3momp^j=Mz5FUZfrmRy_3dj#Rn?2Y7Zhj9Kgsv-6V_<~KPrKJ_F-2G-p1w#E{ zE2N)W8FKjxdU{hM;mkcq&%_F%`D5Rm%qbm88T+E4Oz|gh8errz`>!C?vdUh-d%6Gw zeE(g#FyeZxy0JM-$G6U6o+OTr5*J-Qt#E(&)q{qLnxKtPXs8~RZMZf8ym4vj`(yK7 zjty6a_Q_T)Z5QSwrlWuNCO)bYwin37<1zN#m3nq8f2gqCNS-u%{p!vmrRDlsHVUhq z4EI3gF@7gmAx7lY?N{`VgHA|Vda2slNv5ZWj;6GVe%F|1B&9iDXj9g83#GB}$(#G* z_CJ!c>~cc&9E!$$VxN&A#&`_no%{{|(%4u6LT@2diyvdaD9Yg7BXUZ5~a> zw>^WaxBj%;Jw^#1NHsREjFI`-_0E`0h(La@89vha^#hflKM7?)wqosG+VnW}w ztqX@Rx>#ALKCKg!a7ZqAif9&h5Wve8FyW4j&9^zL{VGEChK_xEk)b-xB66P+V}SjvV-GED8uPl&};I4q9>P6 zYES&m{<-CE5V~SNp`Jrh$7I_%=>_B^<*{(dJSxnbyT=P8*h&nI>p}$@);-qe%#SwR zXx9y?C&)UlGohb1Vou)V4^n;EMS2n&S0`Sw#o-+w-N!4MowP0NoEXVpH0sNuD?q^4 zDUVR3T-@z6KyoOX7d(rR=}PGoJ8Mq+z3flk*)sa;SEzN08^2KM`ZdIgfTsjK>!S__ z^mP|s66@?rvIx#hwtZEf%T$hB$?L>ZCB!|*(d|zA37e^{#q^~7x~o*3gnX>kwah%9 z3IBO%oLMRmWxjnhwV8(y6?I4JzxI+9{Lowf7Bk84KwHv{@N1cLsHn^+d)L8d?SX!L zG^2np=OHLuo}RT2)%EXT?WEkQMr@9O_n-N{L3p}cKTffKC;%-Ln5c7=!51{He%u|u zu)QvJX{H3gh{%|j1x8+VKA4u}Qx`8s+TsGx4(iIokv+>5M5 zzH3wj&Vt;{rUWnnu-&6^mvIg2yeSAW1gN6*%XArV7ste!#(IbK8muhm4~(1Opg_Ap zOjJ^`cy<4uVX6T1PTJ~w~ zgbl^p{i99iZULpEyLceYjFpNPf%oo62#gs*1jtSIoWCA}d6qae34t_VcHjdbm1?&3 zzhU5b%|M}c+FkCetsbI@hzK~}MJ0f!{0@?20h$cf=Y~x}{g1#NxbsW=3f`vCfSI2k zBi8ZsJ%};~7k46SYioyr2n?S&!j0LX7gu~h@*iBnH1oQfU&?X2F;tI z@VJ0X8w@i&V)K9(KK_ZMKqb%i^6rl8X`5`XQ_g=_)4*C~-l9xS+1RvsJaA*updXb; zJHHjabuP38q>W`i85GD3-)i`+YP*O%*oHQ#nERD^u058}d!L{7fWC`7aUV<^q#Oh^ z>~FcZJ^myvZrk$Wb^*M|6#GeFY5{<4(wNy!PT@4m_}BD5Bm!pQ=^+5FglsA-&h2|F zgIS7E=*hw-LMD$PTYH%Co78PV0+V+ev7<6gumA3Lzhu<_ZrVG6$JY^a``(M7a|Ocj z1x!#RU?!}mB8#x{lVQfr!EFLd34&So5XX?2k;o}vieP;y5YV_x$kzqO@Apc#f*q=_ zKr_zzeAxuh$4<4R{U2c4W+_m9uYzzS}Jb{|lS!E(0^>tIUNkfdt{ zo7pA4taCx;LL2pO7?dX7cYEIF=H>>;JWEp@KbvA#3+@1I(}@fUU3y2IwBPLazp-?M z`@5&uIlOJU+{=yJtt<&y3aYUqfCU%k^*4U_$?S0tS` z`mHOp%%c&u+%b0Y(&j{^Z4Tk|VP9`Rkxr8FQS0?(>_zd;c72u%3<-pu!#pj=itK8& z1UJ#lL7xouzDmx!Z{22Sk1%P!#pfC3ZFYMPm;y`H^CGex&;3*737gNRtfYI=2TyJq z`23QdCD}RC*f&qIG~0`KU9Cu$P|>--a!9#+C@Ps?wU6mDz?^5fG6ia{^@$xkUA~AC zT~<#&=Ov80YlFDzt*45wEmgTtTfWnn4hf25O$Jd8QAO#6W+nyYxs>}j#=8@*Gz z6|fv;CAgqyx_Q;UXS#rX8JFoOHaV>+1fhPk@tN|0dg}KcH`mQ^37mBGj`4&zHOlFOx^LM=|V^~TyauC(_H1V-| z8+t;|Xe>yqD6=RdG_N;B60m;Wd2D4P<*PAzT=-9@NbPW$bPD~`B9;>!H>s;qa?pFg zai6x;q`vU2v(_y0i_O|;LVic15Gwl2sYAhl0Lk41V%uHie9oZ@ws*>692B4zu$>Ke?zANmo9TX6sO|aW^x{P(E}v-a2=9D;Q)dIipds!x9&l zz~~}%D2O@Wgwc!hirtLi(<4d z)H0g1&HXwF9$d|Meh8lTVnx$}%P8S^L6#m)wUq|d0{PV$B8K-v3T?^(h5eaM)9Hs< z&3T>vl50nyRp`^)A%c5d|!im$(~h zZPw2>#`3aLiyS8R6s`7N#4_=TBKk!dWk0APchUBBBIcWQK7F;K)`yOTn=VfYXSReo zu*OYH;XSxF6}AL?(|Ld26g*W%mXDXLF*$g)iOb+{&HKb<7uzGu!+Vv{hh#%F`KNXX zAB~3_H0-&qR_r7AFtdGj%;RCZ_jesjaL$Q&#=d_QRn^C%jAHlgIrEr%^tZqGq}4`z~r1Bby| zW2@OUg>8Y%UuxCqE|hoo286e7kjx6daj*=ytl+J5G39rbU&sj^EWN$kwr##qOdVok z2lNQ-k4(v~v+wb}F8BBeW(F0T zN4|BGrEaaF0Txp$nP+XZ7aBHKo2{QU2u_{O=v*-W40B3C9X+p|UA*DkdFYYN^p&hX zV~F?ywUoToNH{b}7gDhtpfVJcHuyYOIcb{n8e=mja!Jjk)WJG{E59K|h!~A>r8BUd zlYZZzYOSK}9qXDJ>Ruoe(24Tu%lq_N+k0yujoL39UpBiMcDJ8W!uur2-jn+zzQJ|V zI(GxM1~Y?93wA~GIo05+GX_%%g#Q2f?cRC81vA%m?ok!#6J-Saqx?`^zC_L>`2PSg CDD0j9 diff --git a/packages/frontend/core/src/bootstrap/global-error-handler.ts b/packages/frontend/core/src/bootstrap/global-error-handler.ts deleted file mode 100644 index 597769e852..0000000000 --- a/packages/frontend/core/src/bootstrap/global-error-handler.ts +++ /dev/null @@ -1,81 +0,0 @@ -/* eslint-disable no-var */ -import errorImg from './error.png'; - -var errorEl: HTMLDivElement | null = null; -function showGlobalErrorPage() { - if (errorEl) { - return; - } - - errorEl = document.createElement('div'); - errorEl.innerHTML = [ - '', - '
    ', - '', - '
    ', - '

    Unsupported Environment

    ', - '

    ', - 'It looks like AFFiNE cannot run in this environment.', - "Please ensure you are using a supported browser or update your device's operating system to the latest version.", - 'If the issue persists, visit our support page for further assistance.', - '

    ', - '
    ', - '
    ', - ].join(''); - errorEl.setAttribute( - 'style', - 'position:absolute;top:0;left:0;height:100vh;width:100vw;display:flex;flex-direction:column;align-items:center;justify-content:center;background:white;z-index:999;' - ); - document.body.append(errorEl); -} - -function registerGlobalErrorHandler() { - function handleGlobalUnrecoverableError( - e: ErrorEvent | PromiseRejectionEvent - ) { - var error = - 'error' in e ? e.error : e.reason instanceof Error ? e.reason : null; - console.error('unhandled unrecoverable error', error); - - const shouldCache = - // syntax error - error && error instanceof SyntaxError; - - if (!shouldCache) { - return; - } - - e.stopImmediatePropagation(); - showGlobalErrorPage(); - } - if (typeof document !== 'undefined') { - globalThis.addEventListener( - 'unhandledrejection', - handleGlobalUnrecoverableError - ); - globalThis.addEventListener('error', handleGlobalUnrecoverableError); - } -} - -function ensureBasicEnvironment() { - var globals = ['Promise', 'Map', 'fetch', 'customElements']; - - // eslint-disable-next-line @typescript-eslint/prefer-for-of - for (var i = 0; i < globals.length; i++) { - if (!(globals[i] in globalThis)) { - showGlobalErrorPage(); - return; - } - } -} - -registerGlobalErrorHandler(); -ensureBasicEnvironment(); diff --git a/tools/cli/src/webpack/cache-group.ts b/tools/cli/src/webpack/cache-group.ts index 0329009711..1ec621cf74 100644 --- a/tools/cli/src/webpack/cache-group.ts +++ b/tools/cli/src/webpack/cache-group.ts @@ -5,11 +5,6 @@ function testPackageName(regexp: RegExp): (module: any) => boolean { // https://hackernoon.com/the-100-correct-way-to-split-your-chunks-with-webpack-f8a9df5b7758 export const productionCacheGroups = { - errorHandler: { - test: /global-error-handler/, - priority: 1000, - enforce: true, - }, asyncVendor: { test: /[\\/]node_modules[\\/]/, name(module: any) { diff --git a/tools/cli/src/webpack/config.ts b/tools/cli/src/webpack/config.ts index 6b5b001fb3..b6abab4958 100644 --- a/tools/cli/src/webpack/config.ts +++ b/tools/cli/src/webpack/config.ts @@ -400,11 +400,6 @@ export const createConfiguration: ( maxInitialRequests: Infinity, chunks: 'all', cacheGroups: { - errorHandler: { - test: /global-error-handler/, - priority: 1000, - enforce: true, - }, defaultVendors: { test: `[\\/]node_modules[\\/](?!.*vanilla-extract)`, priority: -10, diff --git a/tools/cli/src/webpack/error-handler.js b/tools/cli/src/webpack/error-handler.js new file mode 100644 index 0000000000..2acd7a46d1 --- /dev/null +++ b/tools/cli/src/webpack/error-handler.js @@ -0,0 +1,73 @@ +(function () { + var errorEl = null; + function showGlobalErrorPage() { + if (errorEl) { + return; + } + + errorEl = document.createElement('div'); + errorEl.innerHTML = [ + '', + '
    ', + '', + '
    ', + '

    Unsupported Environment

    ', + '

    ', + 'It looks like AFFiNE cannot run in this environment.', + "Please ensure you are using a supported browser or update your device's operating system to the latest version.", + 'If the issue persists, visit our support page for further assistance.', + '

    ', + '
    ', + '
    ', + ].join(''); + errorEl.setAttribute( + 'style', + 'position:absolute;top:0;left:0;height:100vh;width:100vw;display:flex;flex-direction:column;align-items:center;justify-content:center;background:white;z-index:999;' + ); + document.body.append(errorEl); + } + + function registerGlobalErrorHandler() { + function handler(e) { + var error = + 'error' in e ? e.error : e.reason instanceof Error ? e.reason : null; + console.error('unhandled unrecoverable error', error); + + const shouldCache = + // syntax error + error && error instanceof SyntaxError; + + if (!shouldCache) { + return; + } + + e.stopImmediatePropagation(); + showGlobalErrorPage(); + } + if (typeof document !== 'undefined') { + globalThis.addEventListener('unhandledrejection', handler); + globalThis.addEventListener('error', handler); + } + } + + function ensureBasicEnvironment() { + var globals = ['Promise', 'Map', 'fetch', 'customElements']; + + // eslint-disable-next-line @typescript-eslint/prefer-for-of + for (var i = 0; i < globals.length; i++) { + if (!(globals[i] in globalThis)) { + showGlobalErrorPage(); + return; + } + } + } + + registerGlobalErrorHandler(); + ensureBasicEnvironment(); +})(); diff --git a/tools/cli/src/webpack/webpack.config.ts b/tools/cli/src/webpack/webpack.config.ts index dbeb696fb4..290ce1fc38 100644 --- a/tools/cli/src/webpack/webpack.config.ts +++ b/tools/cli/src/webpack/webpack.config.ts @@ -1,4 +1,5 @@ import { execSync } from 'node:child_process'; +import { readFileSync } from 'node:fs'; import { join, resolve } from 'node:path'; import type { BuildFlags } from '@affine/cli/config'; @@ -52,6 +53,14 @@ export function createWebpackConfig(cwd: string, flags: BuildFlags) { ? undefined : new URL(publicPath).origin; + const globalErrorHandler = [ + 'js/global-error-handler.js', + readFileSync( + join(workspaceRoot, 'tools/cli/src/webpack/error-handler.js'), + 'utf-8' + ), + ]; + const templateParams = { GIT_SHORT_SHA: gitShortHash(), DESCRIPTION, @@ -86,7 +95,24 @@ export function createWebpackConfig(cwd: string, flags: BuildFlags) { HTMLPlugin.getHooks(compilation).beforeAssetTagGeneration.tap( 'assets-manifest-plugin', arg => { + if ( + flags.distribution !== 'desktop' && + !compilation.getAsset(globalErrorHandler[0]) + ) { + compilation.emitAsset( + globalErrorHandler[0], + new webpack.sources.RawSource(globalErrorHandler[1]) + ); + arg.assets.js.unshift( + arg.assets.publicPath + globalErrorHandler[0] + ); + } + if (!compilation.getAsset('assets-manifest.json')) { + compilation.emitAsset( + globalErrorHandler[0], + new webpack.sources.RawSource(globalErrorHandler[1]) + ); compilation.emitAsset( `assets-manifest.json`, new webpack.sources.RawSource(