From 6a7c69bad13a3124f2255030e7547b8ae1907c04 Mon Sep 17 00:00:00 2001 From: Juergen Kunz Date: Fri, 26 Dec 2025 18:04:55 +0000 Subject: [PATCH] feat(elements): add upladmin-option-card component and migrate option/status UIs to use it; refactor monitor form multitoggle subscriptions and event handling; improve theme color handling and dark-mode styles; add demos, Playwright snapshots, and migration plan --- .nogit/theme-test.html | 67 +++ .playwright-mcp/dark-mode-emulated.png | Bin 0 -> 30818 bytes .playwright-mcp/dark-mode-option-cards.png | Bin 0 -> 30289 bytes .playwright-mcp/light-mode-option-cards.png | Bin 0 -> 33090 bytes changelog.md | 9 + readme.plan.md | 396 ++++++++++++++++++ ts_web/00_commitinfo_data.ts | 2 +- ts_web/elements/index.ts | 3 + .../upladmin-incident-form.ts | 87 +--- .../upladmin-incident-list.ts | 4 +- .../upladmin-incident-update.ts | 68 +-- .../upladmin-monitor-form.ts | 66 ++- .../upladmin-monitor-list.ts | 22 +- ts_web/elements/upladmin-option-card/index.ts | 1 + .../upladmin-option-card.demo.ts | 118 ++++++ .../upladmin-option-card.ts | 178 ++++++++ 16 files changed, 869 insertions(+), 152 deletions(-) create mode 100644 .nogit/theme-test.html create mode 100644 .playwright-mcp/dark-mode-emulated.png create mode 100644 .playwright-mcp/dark-mode-option-cards.png create mode 100644 .playwright-mcp/light-mode-option-cards.png create mode 100644 readme.plan.md create mode 100644 ts_web/elements/upladmin-option-card/index.ts create mode 100644 ts_web/elements/upladmin-option-card/upladmin-option-card.demo.ts create mode 100644 ts_web/elements/upladmin-option-card/upladmin-option-card.ts diff --git a/.nogit/theme-test.html b/.nogit/theme-test.html new file mode 100644 index 0000000..9ace80e --- /dev/null +++ b/.nogit/theme-test.html @@ -0,0 +1,67 @@ + + + + Theme Test + + + + + + +
+
Severity Variants
+
+ + + + +
+
+ +
+
Status Variants
+
+ + + + + +
+
+ + + + diff --git a/.playwright-mcp/dark-mode-emulated.png b/.playwright-mcp/dark-mode-emulated.png new file mode 100644 index 0000000000000000000000000000000000000000..900c13b0a0d2da2590a9d808a3d29d6aec09ec1e GIT binary patch literal 30818 zcmcG$1yCH{*Cxy_Km-X4t^o#jhv0z>Zb1hpxVw8G0S0&1puvOdKyY^p?iQTE8DJ;> z|GV$jeqVk2y<4^0HC4BJs{7n?&%J&6oYT+KVV{(wG0{lSkdTltWo1CBNJz*SNJ#%2 zzkY%EM=0GMh-m(CQI(cJsvILbKtiHKk_CyYduAT31nA*{+r^%4OkZ&S4F1L(Yl)ht z@j>6(`j}Ru?7OvWVUpI0gqv>uF|_w&&tPlyLEGtcue$ICc1N)McqAdVRME7=)KK5s zplMkaQp&3n@NHHzvGhaz%j)c_+ ze*NMfgj&C5X^{2*?tJNdP4x!Ren64H`Fr^K8x5jC0=$;}+W@iS|27~>n!o2lKFItX z8FpYS3ZkKW@n63%_N^-_;*u|#RR$|FGwK=|yc77%=(KcnQXo*dUUN<3E3P2Q@p%kE%%{JgwZ*9?CZ z{_;O)>38(xKS6~jzCOZQiJ{K9_K*%m|w3G+A1 zjQVt6!5xFuEN6B66f zks@oLQdWulkw&okzfLXN^l?$=k2Z#8f-S(ys#J)6CYT>@8<$3cgLjnT3oEO*h!a7e z%5dQdbB(*nJPDU*DGwWg@6w)j?qSzMRdeyi5g9yCR%*54-#p!Ng&S_dz&*r(^70MofG{E2X+@uMmBBe}9&W*Lxcp1@UZdqkemCZ6Z6HR-~z` zA}!&pg;whtCMPgHtYPh!JtzfYb4d<2B5H1La@jBPOO_)~<#W-%C%v*x%G~oR)UjYG zL5q}cmg7QLw;pxZ_^ZxXS!8nMwB6hbOfl=;cl^yaETp|>En?5I!`v7No@Vd+R0_~- ztMwj*7yIKgcX3?$ky1z1RX6Amb^!z8MiWy?WYsT($C+{6v?Y(PsC2(4BWB6alyQcB zNXTZ=tYuV1C9zPAc}EzbVfskhSlYlZ`P{Jvb$rtLFz4(Pdg~}!O`tR0;VooOE(;_L z7V9}nf58k`7(osBRY1oMEYT7&ED?L4ByPHLB)T%6VJ!mRk6Ly<^jP4NC z--hR>q(Kyh`$qj?x2$s}*!vx^J@nQyWO058;u&fBTE->LO%QOYdRE$?MqKeUo38Gz z+{g&$pQMH<4R8I1-d-CnHz#m#e6)h`1U-&+#O31NDnmWvRUg^cMI(QcY_{QTN?`V$ z7qGG7{gS0Kt@R98*=lh1GtL0ze}Lud$dWw4`T~F5PmV&HYE% zJc%nBu(i2o%5DCGl(TkC{k=v8lT4P`$kbqknN7-mWMDW%CoC=3yPBS8vUJC zF_5cU(=bvrMH-bBR(YXVcA0jp78v-^&fLUYDOfdMZ8&SzXO+VgUnfj?WJFGR9U_yQ zSuH%Ao2;f0XwYc<5w&V?L?^otEHHxT0i)N$euofoOQ12L;)^}qZpDZ_Sq`T4h@{)R zfvY|(CJMPez3EsXeZLddShsv@=tq3J6Uy6y_*W>GVxET99DjTC6ShE%y$;lNHGd1Z zEmzN0_RG|c;*N6%Ke1J|x@kf^H4ALYrc>@n!8*e1q?ZwIo0UcrH=r7;W=^kdZ6K>+ z;BF-Ar1@f&U=QC=+g#mFV^>36dxTcXZGLE=UfU}zj0{jbG{VTh@gwP;1-dCG=bS1( zqO=*0>3vl{{?#)|oI+ZCDLbCbT+KoXST_58&cbvXFBxweA8+r#3{+3s8_3fO18s|1 z%d?c0{!ER)1S`ijm)f@RQE%-8ZRWMLGZ%PzSdkyd1enS1$_JX1LtsbbTqW^5n9RS<^}H^a-D00%lw*osBU!~ zbTBwwtgM{S#BIO)Wzx&ID2!l0!dVeXWsI|6c*Xzq|r>%IxHfw82AaIXAK=;}; zx2ZS<>P7jf7I|T?wsy_WWg!n$8PPNJDBs~Ne6-23b9y?VnBDKDDFQN}Vd3pIdGyN( zy+&SnrCGV{Nv~{W{T5Rd5>)Phw%E0D^o{_Fi#AeH?ybWwtl?A<(o?obZ4;7~;6bW#5 zLTpAw;SfFN!uZzfPf8gjU>v}?wW4vOw9tS?m>h7A?yHUk$1Z-F9*IfAWNvRfE#ldh zw-un1?8oG`k`48_Np|oJTlL?WT~TsQZqK$Oxm!%x@$qPb!JBVH1<7xn{o%@e%Pt3p zEIU48V;P^l$B*bXTkv)SV{4DDTAB~rms>qfQ&3~x=~Zv8yz8gAIaqm>AMkLudXZq* z4x)HGKi&cvS>mfEEf$%euWVZDlD1cK8%!Dq#K9b1 z%-n=WhH+WAErjrEvU*)istomvj0LM8Avr1wwfo#0$c~E&h0p`TW&N&I8k>*alZ$!A zs%Fnh;>I0q7(y>CDbZ&AV8;hx>qmDJCt*E=PWlLaf{| zKr=2u75l!R0gbXc;A(g13CS&)s`;~I@Syq;*OF|q{e+w z>GB5OS?#;%&+tVf#_Hb?nG)6Wg1J(B2lXX8wr0)ZoiH+dS~}(`3_Xl_0K#>L+q!S6 zF70K>6izafw9ReA+qen}#FY)Ht4at~C6m$$M-5apQ@4K5YKPp`X(3gO z&h%IKb*m5HMLLA50yKj{ zrKO#)ggfl}9q9F-kLKK-lhoba_0J~bEtf)$%-?OUmRw1zh6m*}Vq3kt+f?K<@^mVc z)R`#s^-t&|t)o>w_8itk4U)}Pj?S2qL}`0hxUagT_2Edb%fc2F{K%Sz<>hUv%15by zQJg{=QrC(vD@2D=lS*bq@0Q!j^WLpor-O&QfF53fRNTx}et~tWIfW@Ic6O|cm9?%v z68O|8q{l8U@=wMhL2Yt{K%j+eG?kE$d@(ankqi;ferBmz-e&SmlB1<|2IH9%!y?lJ z^EG(ms7sj!huNAJYU7x9K)O+gF-g$2@L3UOYaLj=v8qojz0!{7vBD42%&R`r3MN@iWVY zY%3j`)I*G?(^Kl5ZDcq8%%Vz~OB+j_xVv85v}u(k(w^!NnCM%cD;wqKjz&EvwqQRwD{JJLry zh}e{ghP$TK=$1=jgr%^*3AvVvck295V`p}uD;HKx3av&&kVJTw-jBKtP`6N}-9@{Z zHYOj7QyVP9`sNb{WiccF)tYnd1-BToMFX#$r1!pBnQm?wEVt5$wLU8arv>aiv^%K}x)rEo1`JWe~hLHTTH{%^iDP6cKu74a1g;KLb zJ|6GBXQQKKf4<{H)}QR$G03n-MvTGrWZ!iOiZ*SB$gGeak^ie1Gse%Jo}R$Uu9d3) zNNIl|ML;0G+q_^O<~QvdykNT!2xRqLaE2@*A;)N&EdwKRVGRupOjpShiLkIR006)Y zt~@#p{EsyLU#atdEn}B?fc8vHjk}*LyIt;2hJ^I_vy<5~2?|72kZ{XQ^cGE#&ZD-f)I=C>m+iA!23Z;uo* z=Pw9x_si~O9$sZfT`08N+}Ro-+*IO?&3TkXvmYDeyP~bvWLr6uI^pK#&&svGKK1Nw zZ(qubQv|>VA5I-??d+^lbqDVcaKTi05eU4zhWBvN%X-ukeWp+dgjkfF_Sz$o<;X0-^TTzgC!aU(3A0ojgMMmfs2Fjib$T_yb4Q z2N2=iv(k_YsEUK$DeDH{ziu4ZI>(+o-|F|N;ZAq>DGtNbhg!F)5uyN9Lrf-&e?nSf zsDOvcsXt%-8IN_nyD$TG$w4|lV#7f*-DQ~w{W1UQud!6`4S~F8`9jPi@ih$M7)6D$ zt|R?-q5dDP{`}8nBMHF?d?Gx!f5+M>?9Ml6oe(7uLKI>|^k%pQ=M8flrQC~UwtYVj z+>~LBnmg+0hVju>kC(4rm8s`HAI?5=Q=9F6m`BfzIk}3Zc^%Y0y$kbdbs$8^Sv#c$ zCMUf_Mdile{^0g4`;V<$36BgDCdvMvUy8XmD`xFgB?fJdPlLGqLXA9pJn*F&!Wa$h zS9JzRejdsJ^0+7+ODiOvG3G>J>Lhq%Bj>)a$3szGxu{xwTCZ5xgSD(w1g%r--*-iM z3fouBQ@@s2&!6A2BHbtHjQT6yJ<%?J#cLBGo+9i1_x+7njjxZf#MD=e?qxA9^W3tR z6CO7wGVzqJ?Hidn+Srp`$`?*mu4!s(cGb`%z4U@+|B|j+I^Jx;_RS~Hg!|{rAJXQn zf6kV%v~lr)zDrIrt}%C%IBgw%pPrulIE-%J_^<|skFPy?RE}ysyOv&$U=^EesR!ua zJbjpdn|pdP8G|j3y|}0sM9G2C?L;LmE}nPVfzgeEiu!6bO9+b?a^Izh(ic@QMVV}- ztvOUP_3QT(!muF3Sp1%DAD&M)gVDDFvJ+tenuhlFbA<{5u17SE2=LN)3qUb1Mf4jejxtNPx`zgA89xpA$ zMb-m2!0y<&-jj=SyKYKEhmf69!@`WIFpVxF(RoUl=S6l7BW^7>MK4pjQ@-yV%F&<`K&j<>eDK8YUEi{1}ZQ zb|f-B8I8qjs?+kN?YTlsPmOq1X!qv{Gp!)>I&+J@V={#cZ_ZR6$a2$-liut8VAr+i zRsK{|RMZlwD7w6Rm>5o+0vkIwh41GPt-~~mv8*yuv5mbYcVCgsr#KMaE#c?a&4g9< z=)Mp+8fd#J-C09)S=_6bU!V+7m%D$;akyC_PT2hEjhC=pXXo+-^!XqtKVm4Jjx)hX#{i>bF(?_xhH$zD#Z*S0h-} zPNf#y0SnFgbO}3;Yy2-1lVKg2?X6FCK&~h6oiCaMx$|e$POM=d=SO9=HgPOqR?6cV z<)dq*U*|DW$hX6a*EABRq>=tDo}40f=5Dith^6U~%BnIsNyx6paJ%&f`QaL8a%VUN z>u4$Cx+jwV>Cz{}=xI&YL0QJzF}Dl@v0yi4R6mPUt)1fP3o_la^5wcz58G8zF6-S4 zKOwigD$31W|1~C>(+G|T-f(YnI&J;uvc0qDpg3oD%nRP*k@O~PORmumzv2^$R8nb~ zl0og>{;NK`w!8U$^8$=divQf77{Et96NORUBAnfC!DP|{&y2paB_v$vkyx%zA7=Ub zTljaJuy4J^N52qvwh+(brJDER$W~H+pYpBOK|>WVKaY)vZ_JOYu;ovIsz6)e4n+!^ ze!MgY?sAc@ygx<2{s=C)G=P@}w*G?NQlywI{Blkn>%f|wz0#C?9fYm*4|R(a(Mf>~ z+d~H_lAm#-*z`5AM`;_y(b=C;ulZfB`W!BwhlRM(c3;cR|y025CfdbPBl=| zFC^h@IVwY*MC<)956BHzjxZd4kyD-pj=A}?7j?v8#{IL!@Omw2f916kVxG7Die!E< z`S22}csfmV?;LkcgHBQ1Vd>nBl1ij-dQKf26{Y+^BB*r)N)%5N@`lCq01kVtAGTUj z2vY{S=Bxz@9rdL=8e$F0(cNcDt4w@>3ZXM98MT6gwKEn#^gxaGc!%6nhUR>7t z@X&B#;F68tat2X0tyIiEpc@9FcG-J87_wl!-949d$Hu<*?jTdB!$jNn`#7IGngQ8Q zP*u~?N}WEKDIOIx@Uq?fn9z`X9ClkAK(fF1&t-?tO$Ko{hw%8T)gY*W^7_4F7zh~m zGl=qakeK77=lXGm5e*rA&5M^O!X-QdhgT?4g!f4KfUo~}uf@7I%z1aPn~S$pZVvEc zDL?Hgcl-vtdnY=P^rDINv#9{ zjD;Dx+b+lP31L}acLe+1GnL1EJ{GFK;+(==(+nN~0pG;cizfY(gV-6)i}AZhasQ6- zJ=mL|j;&$lZVnv8!y>u2Li=S#ZZ4(XU;yEVQ&MODo5jQK5Xnlv!)IQ8!+XiTyl4MM zEa7o1*Fq%wd>;`SR1`MhJ|g5_S)r@^b?`rH0gq(?&sQJjU#!3FY~=aB7jZZ>hS1pC zE}rt82Ks?uJnQN>Hf7+qN_wIPhA1>p^ zv&QI(r(4d`&aM@gGu`SHl`Ilq5ww%@LM(Glus)$*(67FG!qYaAY=3UwhjC+pxc)9OZq98j*R-_Hobgt4la^-Hx zPM>}b|U@CKhn z`}#X9HVe{Zr7gfrp!rVsQM|DA(47dybUHh|&#z@vv1ioVJRNS{y41MKRy|DeR_IjW zc)jmkCa=p;0N7s{WHO!o=K{Y=zt(;>!qCNnc?DU!wUvxohPacN14Ls4=YP-{xqU2` zrxb4zN5Lt;3BZT>nb5BvG3AcWtu8qpT%5q~g zHVcdkyJvT<<)bL8T6s@zo$mCQ?%_OzR})OZZ>vut4Ocs~t3Rx?MU?Wg5?Y(v`c}8= zbg}IGMOc#|kUWcBS6kr*7(06ZX6xDUR(VPFaIpw?1U1lJXOSluTGTgrXQ`lbvKMN7 zm^F64Xp*y6)Qb&ZoYJfau<^U*(f%Bo8G|)DBb23hoqjRe>|z`SX|mwc$r^*+^)+HG z9Cm2o_&?TmSCo{LJJF6RlgfkegkU8!r6mWqrCq)3qka~C{+c-RlbliG+x|{7C*@Tl z*VRtWxynu^giq%YA2r-95}?=n^Q2MJd6T}-bzGS)6kyCRE}GZdrx%p{-V%k`Io0nB zHWRP`Z*an5Ec{fZC@;=cm4EcmCwWR}DKi{y5CslUjCc!#K+Z#DM8rX$r_Xb^Lk1c$ z{f_EBcU0vuc4GNrGMjIVM8r%)sLH`|F94j8Hx{Z`iaRq$0IsB7} z)$VZkySo`yZ;lIa4BiCk7OPS8)A9-G!`N6>^@azb~s1euX@XUcUqoG zTQ;J7rf@ClZEEEIBr$TdEXw=vb_sua%G{|((ce0~%YWZ-5AyjazHtu96}5DASZARL z9x8%f%$0%1R~!>u_$qZdqlD_b2fGMenD4Z!+G;uX_CVY2xRbvv2pF$-+8a(dLb&Wn z!8_kc!ULFClNr3tb#R^^zkdWG`yP|Sl4#+(^O|iMvQD*{J1k+e@uTqRU0!*L@A?Ar z1QoaI<(nm7{z_e(h}}cRK6dQxTWugvY&iCL2s=(J^-4bM{8lUFLwOGc3*W1L4*%re zd}7qtvb3VfL@|b&xDb@S;{7%3d=GS<<850bkoxaf0Ep<3J0Q-*aCJ&!X&F=#Ouj_gUM75q zcpFpg_t5S!{O;g)_T@5M+EcL3d^TNqd}{2}rXeb6Va3&IKD<9(v-#M9beRmCmOw!G z0P~DyI-O8!yCJ*3oZz;qohlm4bTRJ}xY;?{DynbHe4HkvSm+fvc2n}W-5ml`_^|lf z+CE6L0Ra47liadxHWsVQs5ydRZzaX9{7$H?(CPQu2t47APkHzhdM&F~-^G46o|Nj< z*(&KAy{asxgZ0nZ+NIY2crdUh1T1*$njs>oT?V@iYUN(~UT3|_sk-+y4r6y$=@s_( zm$vZoDzNai9^%r##K_%N#tzDJc{mI8?Z7x%q;78RwKP$T@*gT32o(-|J0|n*f>@oCckwBd_D5C4Bwo5MC=N5svW&gp*^q zxQUe+2MshcRWl>8jzW9c8{QIeWr@EGx%dO7QynN&* zX3>-JCeeTvUsohSps|;&Ul{~-CPf!#9IshkQrWlGW_Y~Qt!808Ccfc$`u%sh%MXta z%B>u60Rma}Kwz{fT3Y15>ZF2&%`xaa{I}%^%lA8Psn5PIWD$d)3M8UX={F^irD^{x z73+!;d5AfH5)y(ki833PBB3P);KYcdlo50puirt#=_6zT&?rdD>MJcYqcQ!AdXwmG z*4jglt@1EKMSUK^HRCUZlX?h#w@$DUHEqY+`gR^iUV;;V9UdT%!QQcEY@Mv+X z^{uof5j~8zl`mi|<71Y4ae@p1DXC0-^*I`_Cdcl>!xh;UF2o3~3hd|@jwIRIqIp66 zlXW#W;P$?yPWtnUuOHZQW_A)9ybCKt=X_S6kDWMyw0*~z_n|3Qt1R=c1Ci!LGj>zB zL>UnP8EWi1xNQoz!HufO7hMnj5Sp8(<;>A~yjEA(ykYr+iT#ry-|2GPO=_2)`}6l& ze!($Gd!Xn+Nw8IdNu_NC-1U%?P^5;%V6VbNw zX*ohMRv|HF#QHF4KLVMiJxi4H>y|hkd+S(~wfA)(>PLn3J%h-B*DPBpu|3S#AN?7r zIU>a%R}F-2D=nWsXCPLS|9B17`W0G!~(UUS0MgR=t3&)1PY&PoIld@cEyw z;NbX{o~%>nlqc(z`ARDRQn3N~d_S9HHl`oK4^}6-p+_}!K~VuZ`%GHtwc~6#NeLZ} z+s6UcH*9-zqoMlSf^}{-^Slge6@!oKsUq%^=}}&_?ZetFyQv>J#crcC>R>scDIn1b@Obv+%*j_^QW1Y(-*|mh>Rb47LTryGDh?5q%%;WPrwdk``sNm` z{~KB1C(`o#WKVcx4vNxdLVVA$1)SWbu}aNu?$`vry{Bb}&1pb!NI(RfJ5ITkd2R03 z2BH+->KJ~WK+ zvxeT@KYm|dwQK)gwP)A3jf@4@8Aoq9$ad^6|Gi0-cZEL5;FuCk(<#F0eZehn5l!pd ztgoevg@oi65{u$N%J$Tpi9hZ6@ZHV9uJ_&m32DE!^^5??F~;TeA?B6YGv`D-0#ikW zMg4yi1oj_gK+YZs93d7)v(>IhRCGd9;T%q7et#mLjB$SNxx59=#{6}obEZ2x29Hml zyWh#AwXWZxq7$$Uc>0T%3JRt|B>Km-Q-#YdP$OjqWuma?(4u7rwJzbA1#!^#4XvMd zkU5R=c5Z~4nV#IAQ^*)N8QDkW(T-cpv@U9061pk_Kq)8F&^I6uorQ4ONz1&QO;Kyh zjoYkmX}P7{Q_lR;-FU#@Gpw&Bec1Sc%>MyPH(=i@?W*+x{f0M8L=`qj5z+3pQXuuP zHn`?pxo3epZ^}5rF62{Ih;;eQHJ5pU*+_PpzE+ygzNP`7BGaX2l|b=cO>^4&L23WN zXs^$pE#Pwb=eI$Vv781$-^Tp2e+bB)f6tu#iCHVNM^yY$6H(K@Esir~DA_*b7Sm>~ zK@WrhlRs1A?E2*!H2BoaVq%U%G-yN$N`>|3m!a?{0s`2?`yA-*rX8F@0HVk8ykARt zIyvbFO3$UY2Xn8?LaWdnM(3uu^9ia_0kWX%+Sb(tO@BUr^P>-7^v^QHI#jYlZg=Uc zI*+~dvj{kzub$k{N26^s?VGy`@>gs zA$n9SR>GXd%umjn;T@GJwWUT)y;x;0QQEp|U~uTSV3)TMRySA`RQVJc6)Has(31JU z_G?~wgVNtQ)v^`dbppIH$~qRUVsf&v@d@&kuagqzSKLl#%GHN(mY&4QD(r7wxq(1N zvam~|hc%%IlAQQ-;gR{NO-ox+zKgCgEG7vH_Vgo>)e%OCuAR)|Uvp5m@CA07tcNC` z@%;}+0g<#tO@C1%@83^1Z+Y|{xik$vODm-DO7`Bhu^ful-$aDJT>H5lJpHkP@b}ro z&j2(V(Kfd#kBh`t+j=vZyHyPuzZY$YxF3QGTzbt;5=RP>)mWE*LX7lGdf(hYQW@?z z#-7{;17UhoZK#}t<#x;C5<45LNlPA@{HPv6gs9B3weKi!va zwYggTa48a-5TfYi?=3%={8G^eHkjX)&dkKlV1l>N-Ni<}+Op-U3(u6yXO6H@&r);@ zidQY7{}vxpn5^dG0sg(%CHO1`-=?nd5E0K!YnY7|KRqO^nwJN?%cIQ8{hg+*4Fb*h zS|1kai`C(v4$>En=Xg^9^hLE>&da=|)oive4b5q!y+}J)SK8LZ#SO5kk0gBk=sIPp11Cn z!Pa-^BkKeIvF({ks`trq33d35y5U4*m{EnMq2tJ{%){VH`)#7>K^!Z^Oufn(vht&` zobQSfJL)rTmiJA9AO$J+L$wiaj-PW)(r*AGy8?y7it556vxBE4EROY6diM-EcVBHr zLn>kqwo8Xu_WPJRK9tYy(bj=k65(Y;1nxtfH_7@%pBEPusAOFN;)L@SUHyAz4&o3( zRToB9b28KM)Sx$Kcdu|uPp5A7=d6e0JXeBJ`j*DCsvb5HuUtREl8OZ+MBKDi_Hq&p zKj#;-r^*xhg0{_eGP_MnElo5^*R$^O!i_am91=#)wXjGczVMIE61tj=o{BcDxcu~MWbYZ zz$7h=WN*x6a+XaN;NW%@fd5f!#*02m5Ip_f*>|M5YE_to_j#vIt7PwJj-UTD#*i~^ zKZyEbCqO<$Eg=~4V?n2-L>Nf^=8b(B)pbW%z5Qvj2kQl(6u{|(HI^-S1y9L2DFk$P z?WpaIQv>5)P8a@MZ{VJdO6PPcztU5XNQ8R(=x%R?PsABnjVsXsHwOsc$%z3TU9a0> zAluZ5MsX@FUa}w%OZACk-U(I7P7pK=vRv_O>Bhr{t0Etf5w!`?fskFhRDeK=?yqh> zgB+Lck|$nK>{;k6P`=(m+kOe!~`_9~Iw?VXgFCdD1_m zdLreuIiPpHitJ_sLnU_Nj(WQZAp`TDT-r5=fB$iTTRKn!4do-0hn!~U4D1_I;v{sS zShR<@zV;M^y)}p+29nOcs1pX!Nne?oAg#i_;9VpSgtd@g(^14#RRjkiXXW*-P9VIG zZRSfLDoa!C1VkxAFY{H9JlSX^`irYCVw;~@^;jzD7zEacG zb@^If)2X9vl?7!Gpek<>p{)kZoTIMp9e-TV4`?>zw(%XFQxsyqx9mA0jQ252KNS=+ z^pRt~v%k~xsLkdtcz_3v3RPije4`U_-Qm1WUW=M|sNA%2Q+Z9n>8sFl#+hI)+{PO) z-FU@RBIBa}&?RqD#K!mIqhNqTgR9qs&+$gKeXqV>)1KB<($^{huZe;4?%{SZ6T7^o zI+dGQviIPdudJraGuWj#J`$={7K-db1?SWm&j$YPs@Ap>R|ZI5bomP^?a^iBhBK>9 zntU0wDlzPAtn6)sPa&$k-*5oIkxJQIg5My%^~FajZ_=GEU`cy^AVO>QZ@pz*5J-@; zLUug%Wc|!8ENU4t*{uaM4vkVi=*D+(?j67e8s|$5Ja1TDxRCJ*=|C84721Mm8Res4 zVou?4MxdTmF|$fGs^v#nEd{~`3`#Rg+{ecwEZ=Ria=p7a zg-gE0r`RBsqW6wKfN4nM=Id98uvj8gUvJWHLfFz%Pu=h8W)uV(rFXXzaZ2k-j58IQ zmI2LpUM!no0nTq^_1_W#RMeoOPTk#K^MI!|?Ghnjrt*UB}`pX*%nwj%7?g#Jr*L^&yiMbttWkjiZu!GQZ6U&=V1Pf{#I4O|ljAIYfWD*0s$N>VT^zObb2@o=meo!kIAZ z_zqKqc4CyX8fjA7Kr_4Vn|&MJZD|c{x$MzCXgTLBcGN~KzCCp-_`@xwXKioq`o7I?00Ett2Na~khD!aPRxaac-GzRwAmr_w8g1n!2W^XK1BLPKebdmR?xyFvh?3nH&= zUK3fW{CBxiB5`WKu!8(h!>5a$)c$;k%-trZu>We7b_1?ZdfQrWKdB%xXe>%J8?|q^< z_m=O$L0f7807HFvup0+k&T$h#l@TQ~=j#lIpTu?0|B(`RXHHVq7)OLc=GZ~`za~gz zgT7Z)D3S=-Jbm1zOC}5Tz!>_5pfY`UE&I5>8F;2EhC;c~c0W4+0p41L&r7!z2i7fP{x14USp1 zcfK6ucfBe-HWdb_$S>Jd;a`5rWqon{V#49HbgM6lIxjaj_b;YMC6|>>A$1}lYw|xq zKD|;LpczN)rpK$GcW>%~t%s0wXEVQRf*xIU6avzvanM z2-ziNc`@2(sluL)1$Bts*O<@X457^6LV}NvPd37dVSM{5R)(gtQ%_x8T}EbLBrQfcgRg>K8a17r24$50SEW^Z|GPs; z*!LUE@^&|9s7Y$U#>ktDvw38LL*<}hp9f|%Xf)jq+uygW_ueem=H46gYrzW5zk5l5 z5Yy7zAmrHhteEv28WEI##i#z(Uh16$7KkfBO0Fof3l-Z@@;US`XYNZY5|I0E`+tW* z_rI}*{tuD%{#QLho-k#j!#9rp`4Bgi6LS!_#F z*&oPyy#=bqD)+^;=OkFiZO|(oH5x&FMd{R~ylE}jD`p5fTNqx80_$4FR3d^d=iQ>o z+EFjpJfbZpm1cI*S&8VwG4#qrhKrCOSx7dyrG3bnGecn)t&EmGjrs<`ma9b&SpLO( z6JZ+GQMEl-$QCI?D=4r|C@FQx7}hg(zow#&6D(^gC@2_+^_16ePK%H`YE=JAfL!K# zB>W!~ImfgAPLYd?_V|Bs%LJIhYh0}h5rnvAxr8*r)U;Xx%Uc!Z>!v}d#R5afJid@^ zuuis73kFLX=1}FdKA%e<6~|ydf?=nxsS=#;^QeBWfGMr6Vf=?IyCyO97|a#lt@?R_ zj>#)~FDXpt#8M#)MQ@h}W_Fr76fYO*+|27(#t zsQl;ugWnc7(nD`M!~ z0RX+DT5ZD2+~;)p!WyXFE8&>uLtLlyyek!aPydH;vOu6@nB5axJb=;20GP)BBGa6g!B? zT-}O9ISL1Gl|d(^K?)z^4EVcFhmVleM#vNn52Z37UMCyhU+lchino$vlbOcGe}?at#_Jly+G#&ZfpEd^ z-W)-N_^GK8lrOCD*Flt-BUv(_-=EGelC)PyK8vExtrJEI7_ird|7NuMj6M(QyE+|Q|vrVX5;B8$O{!lSW0oA1!5dqyF4jcdYUe> z!L7sTb{PWfYWeZp7~LFHTbfB8Wl?(mS!cVYOhZ$&OvvNZrmJ*&yfH5NnpWosdf)Bw zOPr|Q;D`kL%0D6*bCo)Lr;{pjNo?c5^kRfv*BcHSW4CKGQW5mNa6z$IuR_6E%5iLI z5MNn^E}LUoc`^?MvliW5=Kv-Ojt!R0G-hj9Y(;HFBFA5_hKT6!Cnf-a5^p?AaF zbVHf588tQGpwoA`GZxnGYck{&%oBPQ(V$eZaki2#A4?T?*sg|HTe02=H|^|%t(1P4 z*CsI=oMT7alt~tq3;t*8onP-tYDl39{9W`U;VgXpY1B(%dbQ3@HC_6;4NS~c^!y44 zt-tus2T;r6qlWAyR}63w$(NHG_5CLu2XxHX4HyvAz{ht7vT^;Wn4C1eVR&()R8$Ba3LN85y{{s|4#6PMVRRhey;V2skg5_ON59{lV0U zwjT8gCgATq;6{dhRyQkg#Bs9z*kDjL`9qJ7*-g=m|8v=opEz-HDM^LXmNTZc0zRIm zdkGlA@)?CcD3`P>sgiV3(vrZYL-IS2az4HFzbtXedpkv(zYG~(R>rbb4hMBvy&$=< zR$Gl(cm6maZ~qS}U_63^GPan<0{xhBXHzdHC7p#ItStr3tLQORQ{1+W(M;MlvvIy~ zl@n0jW?|pv`hjQK*eDIqm0kVA1+MNbpJ(t&nbp%f zDSBUFz-pje$fh=&l$4Z$+Y4Qei<2o-+8#LJBQ!MwGnOgPg$f2XvMJh*_jylD(YR z=$!x^Fhyw9noX}j0vE#Is|fLC7Rmg$>e4|IvcINpOd2;LIj8)Aw% zbcvKKi?+6>fzIWy<)p)|^tY8>0&d2ck<^=};opdfoAt*Q^dIllqah3@J1gL8YmsJu zC+Ez+vbYTl0&1>CLW$pSZQ>0!OTPd&4staZGH#ZZE&cJRQc(QlNLHMhn%&ykey~1d zii%K;z@gedbqwG%*i4?%TW>ht(DdltaDP0UfLtYgG4wTP!uz6o=U~u@D;n}%ThICa z0?Wyc6ye4`7@>$0?Pnqu0TRdl<<0EBm=_+X|5rY1@V|Z z&~RH7m=67D_q_wnlWKYHkxkiG-`RfwpnUHbvbJqI%Xz-bxVX6Z&uIAR#w#u^PGp&4 zl>f(N!(AquPV1V_)T+Y@@x5(O{M|g`lw*7GL;fKq(_dNMOTPTGIaCM1gct$O58vnJ zlI2q}?d-DsS%|%(jZ)XwbI%;LWn?U!oi9Q#54}Ap(;YbWU0@ZfI~6tPh{$@xQip`RQ8DINMb75@@&?g`nyJ>U9I0ZRJV5E)|shcZ+VY&VLJpt&4xp5vfO{@?!^ zu?Fl4)Dc{Oz_8*1icDT%iJ#%BV6oSKfMN1Mt=l!R004UE-S*q%f4+BuKq76wu=O2& zb_(sq&Xw&RzFDS61YrNapXTU%UR!iac$@VYfv$|I*ni2wG-*inCvjYC>Hg+tc&T)`I>`I>Tua0QSpJ9)p;7St_QT*b6wja?Qej%!(%ta$nm z6G60CR?L84$IFNe$*F!o098*Mw#kaS&)tI5@On>gWK}=!yGq8HYD?I>Y7)nje1ifH z{1Py6`QO@m>!3EDuYI`v)RE$DC3vyo4lM*LR$Ph{cY+59($WIK3lz5!+>1+);vU=~ z!QCOa{POwE`_DV`op+x1`TLjTo=kRjce3Z4`|R1>b6s~!6#w6M5vuvq+h?oQ-+m8a zYR0;wy(g9iPU*Kq@_iJ>95yRC`YMTEUQUumHCvcz5bF~+`^m`f)DskM7&L&L+3>}O z*1Z`z-kkgsfvcb3*Yai8Tv(Nix<;E=Hevn!-*VPU)ZwZyO~<=17!;Oh3f+|HhRo-S z3eZ#F$PHz+WMs4!dK9sSv7WzSQQ7{<|0jLd-N)m$fSa+;&MTI&@5>TT4*zI@pOeWV zg}dnD--JOIj-D9Rd|h_+bc#|xGg0vQU@>HXCSOwY;ke;+bC_T>P2_X~k(ycmW%-Fd zDoMinzzg&Shj}2D)h84R9o@yH?!k4?$B3Du7z09L`-_qIyC(?ikr-8C-B$AcQ@NUc zV1;#9rm5=U&m7jUl%IMDeB_txcom{i4C$(yr=fN~+mAh@Urk}g^!$5_r9QebRn#8{ z+)*sW2olqMzNYp0RnznD1ZZKGrq8E{fJ3kQhvv_GHrJsS4_+&GQiSTG(T=wEQ!=_wmvUn`RMp=`%5P_Fc}@mI=T&t+ z(l#gaBB0WIv*V%CvPp=7b;ga5M^{bZtp_WNn_gw{$-cz|`01Xy`SCB@dQE;tj1eRE z?cW(PT$AH8P0!Q3e0ub!`)L+ZP7dhPoW)Hay0aByT&^1uG}$9$p?`vr(UV~p(R2j< z%gc$I!4b`9c=`i+1rLjs1-1a%yqlk5QRcJ4x!n)rE;TsL)sFVvtvEk#C6+R|92*Av z3mx*P6W95&1l$TzuwHUd5m4Yv`;-6k%9dB-P)_4e8B0TcD?g9TCrdr{cE{#OV7}Bx z4dzq#Ff=DxPgw()=)ohAJ-+hY;j|P7S?H@azmTSRGqLRsTsyrYmL1*p${_B*G!-D4QyV~enYQ<1)CWkKdr+Ud#G8o=(FK}@OWiqVma8So7^}Rno~dfJ$o4; zh91R<8t21dP<#vsvea)z{${NlW;s7|zc_Qh@rA*9Mbp1o>H}n(zx`T0YwI#?Qiwfk zE=4iJN>LEr2l%s{&hIbItpm{atA{jjj+cqgmM2-Jot(=!F`|}Uy!UT7a zd-H;p4#!_&h1tXGOOX-79*sWrLI>B6ek{K3IL7D#XTke~Sxc{U1IEoTmld@nNJ zwjR$vo1VJhVz+vq=(q*BlK-lpt{Hi^J#7l64A=j%hE#<#9wYDBREA`@Z>xdjhjfv`ZX5grjyKDEU=HO*b5o5rybNYQ$f}m} z^Nh`alW{`8TmKg4G(qYKaP`}^)5yo;lZgpv*06;OnRoPPTC?YJOkWi(!jSbtl_l4Y zCIre$@I*V?fAF?*33-J<%I`Cgd3kb`x0V$f4t^7AzLYU$To7NgO%FIb8u#F8biayZKm1)1xw zCh`Hn-Lp&BaT8h0LqBqiH>}7>aq*cG*?gApB>#90Et|-y|MTs=GXXhRhP(RNKa%LI zh!(M9im35zwC|DSW8L5!w#H#K{C{t*cvsBwTJs*(x2_3{GT zaz7^t@VO18dun~zH6Vp?7ulHVtB#7R?3ZDYS>uyw{0roSssb!|OA?AQ4`0X?1!Tec zXpg}*-5%p0j0+}4D=9fmO|?xHC@SFA+quSD&K{D5l7DX_Cv^R+pippq&5ov7u=|VK zf_lacr!=ANxhvRu2Jkt7c)vJrEmJjwJKeG0Aa6q~P0|D%4LZ-Z!2vv$AZ>I?%|%hG z#GeNbbo^sksVinpWfi(chRC%7Iso=WGh%MTRtUNPJ)~}pi4mKa*vLS z%j;T?rgk64>*lpGyh(K#0KBLY7wywOKpUgT-TULX6hy|mDhdFAHVPm zuOSp4d2UTAd#HeH!xQ>;{iXGKsD?U!RXDwE?%yB@Nm(k1;YAq zJ;S$0n9F%f+^1P`mkKoqX?jEN(&pvBV6!BgF3KeqtJ$-}0K)k`B}A~?oo%181L5p= zw?o#Yr1AR@e*iOW(|(#{-|{mFj!5HIFUbD7bF&MqkRPg)X>HJv2-5EPIU)NAO!QHD zC2*1Z?j%G_>ZaJFX-ybCdKEpKE){@@=|$W&hLXiVZ8VCgUT+LR+{`gjxju02*F+rv zR&orq<&$CNXYaF7qKQo@Df^}QI@1+%{i!eSu6<#1OqCq@Y?q}4;-F5>d7?;0MFwx2e?ZJK3Y0M|X=^lxxZnJ7I!=6{*N%*B`F9~>+wP(? zPQj1Jm8g3tBAZLq5|}d8Za(!_rWu3YOQ(Dij*4Sc^vhi6C2NTJ%%4Ti82Rh^>#i5* znc+86^6%dgEt{|FBVoO5%F#j+l3cDmj!Si3DI@@!GP(ayM?^p;S~F~F-1I8 zt;8(4AN?;v;QvAF+|l`3(YL=WkL!b%KzM6bv10EZiFiwT0M@XNHh$yI389?H%gi*i zR))YgC@X!r>K5Vo=8x#RJfuNzDXP9H1=H?SRI=@8BCUO)njEka7oOVqBO$Q_vwg*M zF`1Wu9q62OlEsai=0BvO%q7nCa%i1G$dfFMkvIyC$~#4MKXY%hjUa}dVt!ERTb@1p zD3|^qsH%Z&O`$j(QS|d$cn7O~MiEitk9#Syw5ZkiAc|M!)%gLzE!B7r=#N=S1&|#+ zVxESswI-3@fsJXL0cC7MiY*zdA0K#}lox-Sv5+pl+-T@JE{vW#soGN+)}E2g@|RaV zpv`I%+0kepuO;5d*P-Jqlw_#YnRiWFE|WXNoi(lxONt1zu1os(_M@E&B$MgIS4^v{A?5D)RP(8VO9BYFT6SLb+e1aI5wWW^fEtZ>6 zc!!6}RH6?5OJHYeY$?U|XU_yt8g@_LcgWOdcMG^AmS|Pj(U0mubTYTjPq*!jC+#*L z$-N?|I&k41x>WgzAdI$e1~fgSb(OBN_2E&%X-0^I)m#zqF^|Yix{>racHhpdnzV8H z$a;x4|2J0V{lfl6P1US{ZDHe#R9G;m3SHPAj44oZ78KeGn6k?|D$zBXOkM4(Z`m_b z+HTyMXsV1&bkrdtP**lszL%_dus4;*<+n=M+KHlA2y29(A%g>)F$>t7Z!p>$+LyF%y{x;>^zj7W&A z#Zc$AAV}@c>kIoPC^33=Lov~E70mKz2SR#JCRuRO*~5`iA}t9#@YZEv!uU{qOCD8xM@;an4*7t zc1&tSyZ%0vcE88hnY!dw(J#f&W?DO7KJ&B#3p)FZ<||m(YMm?=#0OHyl|7C5>^Z&5 z9}#9AFy}V)>1py%wO$|7fDX3&k#&bFHzRLjyTQLCFTeeyB+S4$2~a}UzN`sq?!*_Sjm>WQ1or^2I*t^&VE<}xZ~X@?QMjonIl)e%}5 ztjtX1w@^{h0~@a@;a#qpfu;=}Cmlp;ptEV~{w{n+RV1A(?#jp3=wEGVB~L>b zbA^ldC!hB``>^FI8l_8G#z#busj)D@#J@ktE;+U$u8|ZVTX8!ny3@39vdW3T=2U4# zsHh&?H7rkymiwB%Aq~j{e=(5epyNVm0;tMA>B^N*$O^ zrbs~jTqPIia!^W*&1M1#Pgy^U(7fHyEX6UGy8J=_RJaXs44eBf^+CC7b48I zbdbBig-FD{*3tp#XZ4;9rT~1U->^YBKNU+!?=R~#ng9>x_Qg`_<>cx&1V(l>d{#@R{v#NdDvSiX~@hm#J!kI!Z(Qc;=VVhv9QEsS2#E{qcKU!(OAPDpyZ8B zAh6f3*ScTYiZ0iJNGWo$A~P~rCy2$_o#GOAS&{ zX>qDiRI_fesau^g1>)u&q8PFA#a$QRv`|JUW3vDxIr#+A4D8r<*lG%z7{x}lkN*f1 zZz->A#EvyRg(a1cg$r@7@8@29&al@@X(6^|eex<0lMgJHLFlS9kZDXeZcr=0zPau5 z5oxGl{Hr^9jeL_Hz{@q%>l`m`WS4(Q(y+cxfrxd?#WnN2CYt9phhAEI_O|tZi#jq? zo$3hkG`~(r9B>4qoxb-q&YE%8?icu;hM7g`?iRFW%pIkbR!)+GYP1iO9le}BuTz-A zCTksCBe0cgRXfye=WFwe_O^|1fdm_}R=OUR&54AX(trIqmlUMf?2S{YC;SkezICD>?<7@z+JjPu3Q=@;iZ+yt*w&}eI}i*l%mor*wA zU5jvQNuym)!pe2aOScBWfS|5Q-r}6vT3Gu5bM{pk(5_0%5I`U@JRy`p!HfTPiVVbA zSoD^o%!!_th4G|=RMMj>C!bRwHv7c(^W-Yk3#{8 zsTQKiHnEO%K3qECPz8sYY5$QqsYe{Of`W}t0fc*K`F)xvIz)%c}XcBEM-c+*)VCYpyS_9C6pE7hXl-VVOvz5O)A^Gksd=_Y&-(0!0 z%&Bc1tgq?iB^7`sSF94QMas;q@FKj~@0LYH%{biHq11L>5J!7AoQCn&6@CKAGX$j>{ zvf(fLo`1w*V9PPLppn7iAyhxC;gmCl5;G;qk_VO5cPONnu_~jY=g8$uS%u$s6(sgN zPvBd4#+M6n{D=Y!ehnC#oE8?PL>wB;6GSu`CJlFkfQnC3 zhSrLz9aV5q84cbyVM9P;YoqO{p?OM`!arTBO$0WAzbUAXp||c z@+U93x1#vAK!E~NP0n6%Hz*eAAxy?3hrKKZ)5+Il1lW0C3HvdI4f{7p!Y`~rN**8l zgT`-Rp}o6WaHW&Rw0~myh-FqX2xwP-kR~bs1K$G!2iORYr4K`f;@G+;0=xii>+VEd zokUics#N8p>TsyS5f+fKx|T5Jx3N$%_1%sIwxZ0d$#``8^_jYK>o>W&j3J1ch;R&Qn3eU8pNwt@X4A!owwo)<0b<&R zHk<+61YH&+q?TMBIu=agI-C~2#4yKQMpUInm&6-&HcADd?R*$|#iymA@}!@Z&aeXARgq6T>oG1`+! z_U^)Colw@4SR)AuorFa0U7x7D<9xjkx>jPRVPs) z^p3qkS4+sTPpxLd8*>&~P+-Hjk{y$(`T4w?tnUI!dkzJJsyXGZmC@Q9E`ek$HQ#5O#IyA4{So~&) zk$G(&)G(rTWmA+4v@X_sL-_OqBX=lJZs3~3-qkRm&`d_<`}^*R+m*D4h^7_JzUI=& zUaCl7_fb-3bqP#9kutP>D4~`LVp1=Ay@f=hmXoEr2~H@@d0^h) zQ1bDFR!fg6(9GOYgC+1+Lps>J$k^vBbNRen}kt~JRIdBz{X*!bJyv0fg zJFi?R;&acN(9zoe$jVwOsb!@8#YLNRjZ}azy|ARf#b=c-lM`vibC&4SU^kyI_Pj0a z%AtaDUD*Sb&Q_`&1gA_}o}yXjw(qj5&7c=LHuPJ!j#ZGc^1aZ$oY+Q?7rh zWfj1M(%D~%J5@3sTrYl01%(O)$9<|1fIw=-Pk{Q9Eim`&?4|;k%Vm#BS4!AhxR{x( z)A4yV!P)bHzRt?nm^gj2 z+e(B`y9Eq6-`V?I#|lcqG^G|66(3R3j?eIM`a+OVE>@&f8i)O~1i+3%>p+ztM1M5> z=n>iFzt0Gm(X%Laj}?Izyh(oe?R;vUi@Q7p^V7~v<&^ewaq%ejs-Dr&SXHUfrYLwyjj47!XV+!HE_R~z;QPx> zALW&&%8H88^*5$cR$>jl8L-!G=+5=Ues0p;JC`N&VItG$hYMGPIC(tsBf zfu*IK<{ERIe?wBuy{uD}7$sMyqj-z$r^9mRyLWH_Le)pcR&L@1>7wXmfz2k8V$c|s zH+o&`GPJ-e`##TMdJTq8AQK@CRDSbIlURS60d+)>dpms#)JpK!r~ELU`gO!j)sCUO zB_`?if^m`6*Y23ENT^4+zm8N3y8T&$p`fP7rykzKqP6_!w}ze|etRs3n`Dr%jw$q? zdbU@ORP2tMs<)v*4h9G<) zzPpmvSSXSgG?12uYptDt91N+a9zae`KIbX*qX~rYoo_Xv&r4CxF`-oqWi_}1Esbr2 zazKJAB8G<1GRVnG{ifrX9@>6HpU#8$&jxWPVzj_(I#mTTA5X-SZR`%YcZZWMr&ChD zXalgPOY^F3umW!Bf~5TJuaHu$_v86=tu3e1D#!{G?P&-+9IuuzGRJp#G%>tbisHtx zeiFzr&~MCRzBhm?SiB4$Du#YW_clJuHrgV^ui5(+0I~SaWWhgxBiV?%c^&1G`7E*i zAPZ7GZIi^qeNc5#FZA81N$5+O0^Rhl0P&sNIlM#1>3fy6z_qLWO$=m6JK;e5K2-<` zZC^>?_>~rg$WSj27&{WN>&GjkBO$ADU6o+BPHbKDtr=#v5tmFWXs9qcY}Po9Ib<$7 zCFL_m*U_m`%&hw@S2PH@`nes#E7m)#r%@%6lx6cj+RQjkJp#}`t~5HUI!Jfp(XQCe zB6(V0rA6(X;e65qOAoRXKek?BpeR1!9hP(2g#T@+x#OZmQiZS|+E?<8i|FwlT!4k^ z`DWywg-lw=$(P7#0Ho|L5d`KQFrb+84aMX|pEtZyGxvzhX5ny|oU@G40N24g$V7HE zRJvY)QDZLlw3WUm{ofLuOzqshdrSK{+(hx+C+GzW2kM|aihm;^T)T4d&W|2)0tUT3I}i|rsIgo7@T z&RGHIvK_65NTjieK1>f8_f~DyG;akGVC$9|5XwD{BASn;6P=n`{M=}I5N25=-2pq) zXQGkx@kah`q%v?F-q~CG8$ydD=H(1*^(whmNR1BHZ}Ok~r=`d3N<(c+i%M>6W9Fj0 zq9Izs`KE30Foo9l>|iTHvwTmI_F_pYA9yh|>ar5wzeA2`)a38EWR?R#QpUhTm|d>)#|5?ee#4QH0z1ytMldBylj+NorJ-f;_FE-9UA>?3+$&v0%1e)@-ra#IeGV7&CywI>KEd_l&vL*t&&LdZq{bzd**IbBN{#|mb-PIte*ld zw>&bycxjCLMmFvB&!jc<#`-PnI08zC zqDsIV?9^svKSV>vB%L>_x{)3r?B%x4&EE>z>)WusUstA4h%UAmN6>+oe`vUVgY6Te zG1`YD(oshgxFj49D^ywoJdl{1X|ZYBM$v-e%o6a7(Z>k(guUuku>a^{x+ViX1}tx= zQ8MAum|9;SU#z@oJP&S{37*}aWsgfS5fihQ{kYYq%dUFysW-XVtXyUvFjH$?6tu`SJ&hYOI!u^0V&t+j9&^lM zL>SlP+-xB!6M?4TLJkU{e(Rq=PtN@e!Qw7a>#I8*QN8OZazilXL)Ig*HaN=v=0|jD zvtSP)xVltg`#^T=Sl54ikFPUVs(Pv0KP~Q~!is_Y_=7fGW^>a%IFl>jw-h~rw>VP7 z1aUvNFkhH`-x}c35Zca+v(3$t!WMXOn#>j;dStYL<_EwSo?4Nq!BEPW1X%?Wt zTtvxDKK?hUH+!_O0?X8c{lkOj{OoL88BoUQQHFiI96ean343-5$~#*#%uv#6w)@X7 z3*hEz9c2`!*9;)18iU0E9yIiio4{*1ykFr(jNc7J$N)p)S?PE zGDswLyM>154QHqg3DCF9;lS97<%5LtU z_CEU?8XhxHRSnL1WquOE$R#ScQf@uTv3K98=w>c0KoC-x zX-;v$E=)v5*$8ljQ5WvUd-Q;vb7~fzg<}LR$oyt&aqGWq9v-$=Di8Z|N;Uft02;nklrdK4)9eMe^zRktywNSE8m`c{pa9I_8(Dw%WOV6gkv4ddGDzv5RoD;6=mAy|&B)*8 z1Bhq3UqgF09d>`G`V0lY>MsutGHG}3^b@^M=Gc$`L1u&T6we0}OTD@5)UtZ(VRFx# z-0$(N!e$dOH{*YC(C2`~L2o`Z&?1cj43SSw-LO%n*a}>YQyYdqfG!T9P#=Y9bYUh} zL-t|BIML|7+XiqnUuZobz`ox3+;^)Vch?+|VecgAH^&*{Zpi@43gw$17LedLKt`U1 zLWNbQDZ14+of9XSrjNntR6>gk0y?cOiemY6hO_M(cD>^;r zqU#l1=ZAL>RKg?-rpsJPw)ZF&9-p6U(Do>*ZKPME6+@8Js6NU%U_Li8J+?vcV0FVS zUri7K)g0Dfoc_K2;k(%UNDe&2J(LzO+@(ZF-~k4M8zwV>F?>f8DjL=xlvkg(2#2T7 zp=m-m?cCk@>wrinGD^BQDaJ@Wn*y)%u@YIu@!|BX#(sx1(H0;OsPScHHuwP-{|Z5a zgcPK+S|G0@#Kh7J#G1QvmZioY!wXH3Cju4w5R)nhRLSsWM0)?(0t?csi-3ZPPAI^# zJ67#=vr9}4HcOF-lwZf`4zb;*CqsI7TO=2ZA}QDYSiaY66dn?RJ!<3VHdMfM{xqKF zT}NF@!f6G}_D-PGN*jgO5Xb@C^toinvyykUu-hJLZ>e+~beAl$jMX_#&RcAMo z!4xumqW)s3ft_m9-m^5f^V~dMz>z_$$VFTY)~SNGFY)@dvEbN*6uZ!RipI=s4u#=N zH7*_pGa#M*mr{yHNwc{^t5^K%KR361QC*71F^L;t`4c0mtU6_l5B{}Vzw_qC6!0SUff1=&{EZy2E)`&&M?^ptM@}Y~65LM^ zb6%8RlHqnJ_&lMcQkew+hJ+ya*(0F6_*7y;i^va&29512=F(88wArf6VrG2^smpd; z*`Lc9d;ssDF?y23MSM7}XHf-cdP<~1y)6t-|8+U?2>>gYQOJO{Z*Z!G5sS@Bin^@X zh)MB6ox^KATvy*YOaJhPn-Qp>iMvsIjK{vL z^1$FEeS$_Lvw4ctzh%>f&Vl)93oBj7jKGB{NyDn5@sng^HsB-?5)~Y)yXe3yCT-(HsPVttEAjf zxn<{WEIUydqzqE1i-=?A@et42l>$8Lm}BNA1TN|o`$K8iLJ4&Ltu(rpW0Ktj~Oacc!)l$lO&3J$hP&T#cfL;nqF>ma}~CfoHVRE_r=wvwYWEk4Kno#!3r%-aL@(?hNo zh6kSDxTxKhwb0M;@r+#*z@m%p(cZgp5Tm!rqW$QO%rvphV2v7*U?m}jo zK%=1d?UnJPFYsFYciKd9QfdDjat2&z*7YQv2!zK-Qu40%4_MQOPa(ngXp@JF5Ffv< zFb!HLGt6?TvpHT0;_agcGz1cN$I2n5*Ize-_w(RPY=6~tSC?De-7?{o1RicGoQeay z(_Hln`vi-RSD=QGAt^eg$UiR0qH04&J)b)ECI@8pU#LRF&kp*Y?dl?spZP5GO-><^ z*at&1)g$AJqaKR88W*MP%(jog=cV_@#KV1YiLqpZuWV_>%`dL<+Gv&zzthE^C64dk zQr~9_(h+#TB}TWYs(Q(mg!^VM6H=`TnQ)Sk*3Q=K4e2tCoyDz)E*hwjw~59~^}B70 zMO(blK}>?s$iejNSo-aH#=*Z3-YQ@GZU&(Y43Ab0FoiXs^ zku?C%@q8fC9kK(G(PB88Df*K%fqMV`y;LBO2p z-JYWNmk|?<^`{6id0xIE5R5__ot)1HT)Wn4_&3!tPp5NF!3xvswhI522uqE+HcBBv zU*UR3SBOB}>$1AyExu&-(UCL2=cuhDW-wwW)n;O6070vc_Oq3g2MXlpQnea6V;D4I zp{$%Pz-IOoB#^HtF9cIh&SQxxlm}bUek!M2FNTtkkdlVR@!b&)AFPU%+>K*^635rw z-CaRJ!C-D@VqzkOBWNe}&2w#37zsmBOKY?_2VXKC_uB_Ij*(m4E~@%tDlD1XA^D*I z?fXr=C5HTyApHo-4XBSUfAg!A>lE4|P+)z_6O_WcFkUN}Ga8!2mWyT<|A(84Zj1;x z61X2$PKTw)C@4hQuhjjB`fZBUj>aCSvD2EM>`tqP2#Ud0j%gLDSqViOA0k{IgrZ~h zBv{3qB3293bi5&UNNs0l=h`6JU28!env|5(75=~_A>r5&9MBlmrS7-7%cp~?I6a}8 zUyBwa0T1KO2-g=u@l(jUd`(H=z6f;0NcMIl_gPxpoOMY{G5O7ZvgVz!|9%hu*P8zK zsrCQWZvNK>_kSDyhYauks^k9)&GCOt?mvK?{~!Ch|Icl;{P5%PJ-EBObT<+l0t9z=cbDGIKQm`` z&+h!Yb9UyPKIip&Rb5r@*1fmt-uHbSrmQH1j!J?G006p-w74n&AiMzpxMO5^*d4w! zJ8IYo&RJDT6sQ^{+XnzjKt^0d{d>mIvY&pUMxM~w*pojoUItuX?f{%>AI0JqVw2=G zgOqVyk;Qy+^g8$OpZ^-Q^Cb|ZF(ok2`fX0Ab zGZ*KA(1V4Zy?f%TSFbSSlVE+9NS#33eQj(a^_eM-!u2z^oIET_*x1-E&eppj3vrXS z;^N|gjEsyfHRTT1hu!IaVqrJf2k=mPzi6!=%!Y8K{!a}0fs0mxmU;0DBd@ZpHQrB2 zz3Z>_mXm3TtaZKulI|f!@gI<*0`6UHvm=xX%(S>rMe{9te^p@)<8URSMg^R0FBsxi z`jkpr;Qh=Tp7N=}!p6o%kM?~dQ`ghz(dQa*b&joAK5x@Bmou^VW}oN&Fkb3jPWA)UL1s^3!f?>l`<>wbR0yLn()2F9Z%4{LA#{$?!9>_7Mh&gp7RtV}d=A)b)*;n0fQHPKSdx+Rov*A?u8D;Tuak!dw znFSSu;)%hZsw;_$y98ZtO2?mSCM)JDIy}6^x~cg5M|Mimnqb%M=g-hBd>uZyawXK? zgHFzdlDZjhVhe4`2uKk1R^mr<)1!6DSZ3b?{?uOw`<_^aZKDDz%cdH>hRtv>ztc12 z|A-tVVZFmRDEI{z!(KkwHPsH}5!G7DZGcAkl7u5N;I%&svK7r&ZfkeumW0?8D_G#k za%FG{)8OqqsH)2D0@@jZItV%7&hJ>Uy@e1vMqd48m28D!99~Yf>N!~JqAv-93>QPT zQ9F$&yGqRx@Q!3S|;CCr}$(hkV*tIowg?F#t6f^F|^7yzYVjOW6#!; z+LY`pT#v!c{!zXC-8&W`r*d`ALmHOq4EIg58588a4z0BY?TWwFcn^{M`6s7+-fE8L zBIVa>t+|BrSB;2z$<|vpswSFM{8UV4`#Y6b@e>NIL2iK}sj+1gjXcFD!uoZBZ-qU+ zjtUAt7L2!O7UKDhlykN2?l3KNAv-pav=; zdRdD6D7>Sf;3&(nye2hDXB+#WS0>n%r)K}{82;K>Qodmwv%z+aZiQz5?QoP{auS4D z<|_-!z-SOBlSIeUvdwNq0S6LXF#>=WX1$^y(%Pz>Tr%6k;>%F)o$Xs+ND0!0aI=y` zJE>L8*Np}L2fBTx0cpb3q+(DP)= zGbtxtW?No=^-}xG>>?cHU398Uk)URn>+(@4>0w zR#zZLflsT9TJe}YU0(Dht)ENJ6eT+T_x8b^sn1ecAihH_%*}i%P$3(qR7n@NG#es&ql-Ko-t@Y zH6oXaUH%H_ml=*;%EV`iHFQ4&2i1R|U$3EHnLqvYKyyFJ<;2MBadh-J>0(k4P2jan zn3U_h5p6$LQ(tJUDU_@Sgi!t z2t(V2cAY7 zWfa(TML;NA?KdJfy}KWH`KdA=iDM7x*~2wm`3Wp2XgThjDw$BYaN@6zUHQ4denq2Z z;~TLlN|^3Dz}mw=TpxD)Y+OPeXdDbu=5-X)Z4X#F~ zvaY42h1)f=_W)o=+1*JYdvtQ5XCC13Wyjz8Wh3n3l&1JPNbsEqMk0afy`CxUFDJBP ze|lC8hCphSY)T}?puRwWF*Szt%`LI!sl$LN8!{)H|B;s;+n8pCn(}V-U-EMFTjDn{ z_D!&|DIHsYGG?!>eEydn9H8*69^YS|wQo$9Iepp+Ve26>FLR#M$mm-vezlkH$RZzi zBy0`zXLq~#&9k0#3Vn&Xwy%H=6aHNmQX-99)7$+MX1&z9-pDlr?Iq)tAVp0~sa(R0@ZB%l-&S|vPxd^)?fYLQ=Jg;`tzC^9=zNPqVzD}N!@$;}CGQyVe zZj-bca?@YUdM@SOCz}iAIDXMnxk$M_ob5R8&t$@#e8XF4zqmGcsAvb>3|_UL)1lzw zQ7rJhy^+j$n>Y`pRc78^-h-ev>x}FK3xKP!RR*=AVjd112Qd>sIVsq}3KedwtgWhQ8cl;}yRP#on_p(n zQ^#xBe54oph}`Jv+L-LxhQ{f@ok?!poG}{F@qRaYH`(l08To~U!NG>vA=~9`62+$~ z>9y6E_tezVG>wj3jgK97GjN@*2Zz-R*nEzW-ttRC>b|zM2o|MxQiILM0ARNCYfY{2 zT@ps8hBY(2wI$S7r*?tca+?s;;R-mY`_@9IT+bb6uN&S+hx?^jllvd4Z_9-6a}!-? z+g6lsWVhFrB-gPF>DoocTpA>A@!HkS!Eqnm5M6JU>+ZZ073US*~0MHd{GAgHF38> zTW@aLn5D}YAp^FZNbkx~l$ZHi?h2cMyIWL1Q3MOf;q|*FF-ch`&IQBoT|+`Lyy~2o zl4E{UYsUhhClAC-J~%q=PGch$A-%BWtVkZp~PH(Vfsy*aac zMjqBOU6IW^X|OF!C0g9@_|n9^!s5DvOyD+KtNOv7_uuh}BY2=xpE;y^oE5ZVW#_Wy z)r|a8pBX(o^Y*HYr`@PfRZGqy6i*=C(YbXrTDEl!-hXW^$3J%NQL8W0poP{oGae~> zdF~eKmV$O{?q_)&l!(>JPkAAwRGBuel7Z)-UnHZ^o63DTEFxt0qjY_!V+><&aQcmME+*!O8;(~qfi!n2?9M&uq>53 z!S2osT=>rh_Na6fA#>I3?B!bpCmPS z-?RXK(Q*w0hhOz810NlR8YXEHfi1SwBkJ*z1V-jTu0`$GxYq7~(1t>6fHGmw%kz>Z zRsJ==X1h=)F_~Z4I%Y<&ql@bN*&TVuV3-4&r16bFnj0;3Ub%LC_m9KCZGV=>fo;{4 z?sb<|ebxJUQz}f1xIAKqRx%9fZ70~;LxSV!d*#4QR*AnjyPJ6JLay4ZtE;<6+A+%0 z3|^EX@h#PwnwWSwChYK=^$wb$a-FuHv=!}YbCrP4Q5<2cO{Vyij+v-MFFceyQ*_I6qtiwt0o;3TRyRJx4f({ZkkAXhF`$C97-O~J_AX8glB zPdVEog;3bq9{DN+=5Hxyt9`j>Ow>f0;0ob^?)x z#QAOb5dBe{njanmlKNh%_C(bNW*fev0;UYZZ_jm@w?s|LHR<$BJVD($ArpuCIR*3cQ zT?-+_)q7jN8er|}HXf9+E6C~0pZgLo9Kfk4{~cg(DajRfy9^I7fK{5-DQ&wFAoHSv zh2m?e=9>DgfijH|nj?UOF^RH)=vr%N;K@OR#~%G8X@(ci&I6uuvTPzUyCdKzs{H3maCh$S@m}QGFzo2^m4Z;cr?00s&CW2e#o}S ze6;hJl*U72-@-&m>jYRyrTksd_uA>vy157l4y3?vGq6D3AA6(?3JIw;g3ge;FO3@^ zPHfXLGrvq%`+6KqmAFv_yXRd6^ zkJr9vg}*lHU|MQ_JOKeef4;ia`r(o)8HEb>$?N7Q%jVAxsntKJR4*{Qh@t{|gTX(l z39qFM244fR3PWGCeg^;aMU!b>@nir>)hA#=HH()m1l}vOwSFLdOk<(Uff8P*tzPBc z&pif*8a6Hu(2@JksBI${u^eEVi@o!woZjlHLWVsqLAs&E{T!y0u1!AaBN__kx99re(T+(|i|$lP^!{UB%u>v6Z( zeiw-eT?95#+(OaXb4+5`wx#1G_Wr=HDk4(d7P=RhZfsIkIrAag)3e4}3O3{uY1Q3X zwbj{~2-}^<0IwBh_NlwRDDTn%F2?bD%KvC8)qKLwcX@9-1cTi0^5Bq)sw;cT&qd8f zzIWV2NKt{$_i3@_?_VMF=h~Y^6HG?^Pjeja4l=FTXP(_Z*Q9FtY$ zP!-m5@DWzu`JQ<~3})dcvAR~=uTzCs@H_2S9|Zj0#Rz(DMyW^*F{tj4SXtX*W3TgF zIPVsYqP%(IeYM^jXrPw2(kdyYx_hyLmhIH4@7q!Tz`3*5gSFMn;nU%C_Z8Xr6f`to zT1RRh34d1YM}D!b3mC>AQLC61lzjoI;Bt*NZ{M9e1{&zV8X^!=oo&n`6!fZH52<31 zsg~v_mEukBo=wZluFH%Xz9CUnYk4a?lMQ`1Zsx#!9|?8oZ_4Bo zeCwrVUGvpI{<+VD!+cuu>BNT~&cKPgZ zVOsf8H8nj}<>JL}|8!Hivy*JpQG?pawVH@wr4Z(Mtouer&__^V63cPL4C*UWIB|31 zwu14cq*Yt*u1NNolP=xfqRsAV?|4x#G%BpBNmpp@L1lMSL1Coa57KvgIm}Y!yOoOs z2Yy~9eO+B7?&HX$*z9_0+>OINc z@VZ*LXwOXw8Tsy#HzN@7IQ3+@FJ(c`XNvvWmkzIAjC-pw$a(qaG~UA`>P|ZdQ*v~% zjjULXQTM)ULU@?``22xkZRH+AF=)t z6)KNK!3=iG-|O8{syoC-0a#_~J3deA-xc)DG_IFFULGDQp}UcXJ@hwz@7w1eyEzzE z*zJR_D2b;Vw<&)J^)iLZ95q_iImJ9UZX2s-EelXW3_c0b)sM2pslnM7HMM$CR;x!Til;RsTugG_3^x0&(#c{ZP=NUJ z(SpFf%k$yJvbTdLe^!-W?UU?uG;=QIEbsY6Np2v-{#Tp(i#~8GaHcFboT`#9D!A}) zOY!t&+N_wk)j|sYUk1An-t$fw2CU%LTO1^h5tFVDWr(dckPxPjime}T!s7bJ9A4;X@lO9IL z+dtQ>vNRgk{)(Uq#t0Lq#tD09Y6w-}DS#;*pWn-HvbpAy_pOlN_49+-px|oB#FyC! ziyZw!s=?dbL(uA)2ZM}{kuA^Jr&qNGRU}6~-NSzEFW*T`U7Ce%Al@9om1oefv)f9jAi}7M4k~ zS`MR8W@9kW$;rKjV<_&ItE@t@N60*4f}@FiW{a!<;pBt5OeQdta|$G9_FcGVOrJ2=woJpeA9O3^2@Rs% zPAa8z6?-ox^HLR^Xu6oG72q6Iocg#UwfJ(O{Y0sGda!$wr66M%^Ei<%x3vMJN>7at z7*;RtyWZx|<*lEVy^(o$XvD5-)}|$Ne-sGyy-w-yzO07cjtL1Qvm4sg^Lo?Z=AS~l zlcns!!k<0jy1~BdPe_JKX3kpzB%b|x+lpU@pVq2k5QJ^VPv55UtUrwB&aSc_$6bSb zRE7;NkX8e8xt5*A>OIK#Nrc1izBk&=&fp*ciCg&d?C0mZ8!@)Gr*D68Qqi-!xEwVg z`8I>{2MzVUpZ=Z=KWayRIotD-4@E^M_j&%A8uOGpFze5k-C`-e7i09aI5}BG;R6kM z2_`NT8tCiq&)@2fu4=G8gr&x2GZbXDJ;qk}pyTdxj!h9vS^tjWXMMBT8t_!$%}s?Tgh zymIsTpNjZ2J>4`#{|4DD?OX}$xi+`KG^e@TWRo+bm}c4oVpj~>?9z;RJj%~%s-J#| zM$l#dTh$kV z&h~xq?M=;uWB2W2OtRH7MDd>h8%&qc8eGj6A5jQG&I-N%cwqG#ho<(xgdGX(Q zfUMxWRD4m2-rsvQ^YQMSaw20w&Wj1-m93t7>-CQP^S9=`2--Dh<$NxmZT$>NOIPZQ z*Kzf%=e-5q;e_>`wX7k6nX3u0+_Ns14O1o$@gv{^dT_A$702$KZK#2>1`lk?hcj-S-}s0GCmx^lsc||a^>J!7!Qj!S$56s`>4WJE5wegfGtk@l~Q{DF&x-1rTg$a zyg2Zk7J`4HLe`(SsR!+h49QXBIBiizk-$m!j0D z$T)Iq3}-{&Bp2Iw*v|g7|MGioxS$KjJ2CP9h6SKjGh+k7TgRaLDKY?=hdG62bPNSc z3LO2&)Zn;7VwMk>7uvlXVAH2&FUT(!R&c(l7Bi>8Hee3E@9kLqsal%YoqA<+1Dctz zVkGi2GhE}ausUGeP6mVHSLwptG|In0Qn&uB?s-Y_+-BC{#xf*1ai2sOC3Td8m!gSx zZy1;B29MN<4DYJ@&4+({*E3v605xw>-0Mi`y@Q039xNa2?W1G7g3fmgU9BdYJPt=8O(zz(I;QnZ8`L!I*8|b-B zGoKZja;_GJy>kG84Ozf;!qhksU~*hDW0g*1Y*@I79NT&PqaSS$5flM0u3CzW6IZ-^ zc>bLV2NrO2qOtZE$2E^^B8tON*NVT28#uo3T!5URrfM_7FWD*af!_+F?jy4T zani3s^_i<@Q%b}EN)$XfT0q>cneZ*(0D_B?CZWR-qs8%n7{d0^Xh6>o<65FTpe56= z8EFIUP+>}_sxOYVP?ie8hI3J(IaVS@>$ZViuWa;)4ZR9c zGlqGE;8DNX*A8Gm;XxN?^N%(X_a2~&7`lWVH)0+KvOzz$^_cg;(HQ7ap46)-z-X1% zf(@r|q3ZpOa+$g;_wh_Ulv91&%C`rjWv{jL{L}975Y!>X|4q1sirA3V@%QlcOL*brtknM`8T zIC2ukD*f2YtF4(#C!8Mu2fDD=6VpWTc?sVlLtsW*6hFG9`rQ2ZLE$c@__<=KomQhk z^mWL{Hzc4xE>n;5*;cF3=djwh){&3^Y~;~)zU77K=y5BYz+le!tB}9$x>2EUNC)j( zhF+{XWP852Igu{w0bEpjK9{Y^qCZ-xS_-6(>^wGqX`VldEuAvgt9aaAol?qEJB@J1 ztMn@$z!q{p>HQo}F=UYhuecZ&&EYrANlK|!iq~!ga{^T73g0~-dnEDTEY6rk^jdvJ zwB%Q>u4-+J>aYiUe$b4*5QauDJ=`>T=^y*6lMykZB)T`VKk3h#)4-(Y*zCo>5=|o; zFiOrU>^Ybh`fz0RMkdtg{=kGpduH|X)bpwimWn+la;fh)o?ezy9wMF!TXJ5tIl;70Ly0jokz9p+%fR;V1hnk_N{ zH!ha`I{)-RvbttZ$9a={d;8`NvEDN&&c8H<4RXLHtKi2iHUpgSqr}%A@F_K&|c}anK(JA*OH;M1a;@(g(vu|4RVYT16oW+>f{pN zx@lYFlZ;^IeM1`{j`|%^#aZ3I?Z^YJYO1eBJZtcR7=B;iKh{qWM>vFS4wOemOYN9N~J%37xv*vryZ$fO}j#mN1BKJ9d*{fyk~r5Q0d}#M)!ET z*U%RGl!3>T)S%p$TOx98=hbq3`pt-C)6q3}I$Kd4(E$CYnWNH>7EyMrgZ zd@4~qJoY*x)Upz8R7(1Aqx0a{v@~77(Q%Wxb$fcoyD|MFttHQNCYwP>`;)hja`o~K z>5J!zo0{e<0{5Bb5q>G*^}v=nJ=~EIsUR$Y*wz0=QH%T$W|IojiUZrI%!lu&^8`(# z^U4)nZ{%2Z7N;JPgyf82$<{nU5XotR_-xBy^@**wYYl^lxOn$lssBAFuwWf&CoZx@ z$Yz4A2j69rPn~W53Jv-RoM6`VXA_wbVZ5a;ji?C9C$Vb;^c@fErwL$i=3VPkBDpTBC?Op-Xuh=bwx>Sx@S)rAlCm&HczId>a(AAE`+rxuTRdjGT`B#O^S$JeqRY+u^z-x#F~U5HL+)jl&yA2W~qdKhJl;lFew!XB$RCY;z zmRWfrZZ3iM2@t0BuMQ1OS(a+@zgP{(myDO|9~}^AEu4{*GI&kEs_-GMrz;58whlDf z&Wn*XX%MM&J*)6P@w5h08tz4I&5f-BC(&^Dt)34y96$z7Lw<>j`)vc|Vb&PNwA@w~ zs@WGYgT2W4g&CYpxSrR|Xq6bb3Z;{)1R5Q;fpr6|TwJLPV-3=OvSr?vmSM2(pJWld zJU2T|Sh$aHWgk~N%l+L+j>+UyAbmSmvTYy|0^46+{pB!brkKW~L_AkSCuVbk#v-{ku&yXPuf-))6$y zpKW*URBQ>!&}>~F-Th2#5h=9}i+b6A4U-)G$WD4SnnB`)zE$9P`Qe+#M8=sPF(xJF z+$80kUZ8y%k(H2RS!=G@mg#fDTqk`(t>$OHKVhTqi7ebZB4>ftQljZdDh1A?PE z9y?xB_MLg_PV(6wAMhU`f5rFxTU4y*UHwj)G*)^_SSprRhe zlG8L&+*j@+SxPr=!!kbaKUITqGAzkc*`>HtYmWXf*k=owdpgM7M=O;dH0Hna|64S* z%E5{3cG)C=bU3Z{SMXqGe{z~;-1BG>+|99BBr)x4LSWZoUG;v>!1|@4?AsC(m(&Z$ z>PW*g8Y4WF?WN}ge7wDm9mlowNs=6&*!#q6=55WC6wEj!_N$=ur)odpfu(@mw$#bu zS8WVJ40QEY`2m114smsaz}L4twmYm7Du5YMb6EWofHSa_{Sl9+VyP4bBmN?p}!YO>?i=4{f|T$%{c}+P{B1b9|lLQBr9m#qe`G`}wV}prlT0)_@eHl))WM z{lQXAx&AS*S}{@~HCJNfBp`66Nqd!6@r$}S?o_%EkMDA(b7Ma6_yUF?<(<4$`(_!M zCg>NA^Lrf(p7b3yhiPbvS%37R-^K8%{Ns&9FO{5SY2lw4)csd5u);*M-=jyMOWykV z;)kRoK(Z8u!;QQ(P_bkYOe4DN-K~wlO?R5LuX3Y03h8*72ZvRggHE#CH`k%}3Wn&^ zSLNBqzHN+*`%lY4vjx42f_Gyb|5DPQ=&! za?EF7(qMImdZrzZSqqgp$@B}H9U(YlKz9uZ?cUTw9u{v&u{d!7(f2FRgo5DPU$GX# z=+&`5DX(pvr*(6ins$1^E|x=XLJoK2-Loz36hHYHVge_e19}VaCjIo7>eFr0>l_+4 zHMMP>!S*D&N)(^)-@aP23)un@MEcW;;}atb*KjnjvwJsf5&;dlOlNN#*1`V#j5f6X zIXRueL2N|A%3pFo%jnX8#N8exfUNRyVVGnAK7Z>NX(T&20%4rF0kHutV1yYZ9qWxS zPU)l+{K*glbj5(@N1U4Pcj$<@m9@1JS@nX~TKd|@!H4tqVlwmqK7L6QVVt+P#8c-S;`C%t@E2m3KMUM!` ze2JyK<1Ksz`_b=Z3?MdS`4cJ-kn}a4K34+A_obHX`r7tuLJ~mx75C~hFm=7C$6X;E zAQd753?Lv#MWZGF$Zt?x+`&->JO_tk4GpR8WJrK}y56``k%$9>aUzg|jEPxixP^S= zm{(i z7bf}qkzPLOCPEuPMi!mi%ZUXvgpXfHfD%64c^5r*B#6T;)^rqAlaB^7FcN~vu?O-s zfCX>UdzP#dVqaM+-(}Ai^)1ucX5qO${FM@^eek!3HV+|oYPb#%uzjW<2)dcn&_FlG z%%6a6#inn34}=OGRn*#AOv6$}!!peB6w+bH``jm13Bb3lRzo0VYngvo#tJc42Sy|^wU+Kd za>eo|OB+v^WLgrbwl6R=OLe300m$g+Cn{e> zV4=&~w{PbhHX2BUyVsQzwgXO;Awm<4ojy0@<<({O2>wO+UUJq8lJt03Hg14LN$Kh2 zFTiV6LVEMWsL`|b<_O>RD_2=SnvFtJxV=S zEn1`j!Mdc>n|S~wy`UQ&(9pIJ_*)WASo=@ZSGeWlle%fn5_VQq;Opl5(ow#JaWMtf z`l6_Zrn=n53%d8q0w~iVB!BgFrad=%h%Ed6s*7oictE*HFj7~>h6D>*{nmS|ZQRnU zYQA#B3!D~ z;M0ev{PZpDv$&29E3S6|UFq4!$h>GIDq-XZtJzegMMpqe6Cb z12>k(@E-@B_mat}?#FbbxuL{f&Rbkax9Sq3V6%mDNVaXgtpAr0TeSe%N-jFm8^V*W ztNmICc*}eMEfQiYIjpq<4&V$EhnL3VlFu%}_<4%zATzZ^k?5z{aC|2%p{=c5Q$Q#t z?N58~Xm8>m{kJ6?!iO4z7y}l$L~uRsxFHMAaO*M@S^p}6)V}bwU7nGoz?31`Z8G?r65j5zyS-}X| zq{H4q!zSi1AlZ4=ZrYbR#roZHat|o#PrgqF$;3a9Gsyh@G??oh59E9)%u})_fhj-> zz2L*;=;Nd&*wlX*v4JZQl5*{b&P)V-+p!h4YwrwKd<%v;erDcdLzkH6GbRv%cs{tt zwhal*FTF|hsqVa|u>@JF!k zHH`CAiIMj$!s&cz3|xR(S`cZ{$gn>lzHZ8%d%PEM_wPaPHC>LCmxf_|zDOS+t+#=8 z-?)(nC#?Mcq%sqy}R_gMg#ecvcE!6)d&&cE_PAIqFj&1BQm_J2mdR8`Ku7N%Ci@P?E~dE1W9==1#t7-&^gRcD?GfW2Yw zKrI;FvW^ggIbc&0&Q;~^9nyBsX}4%zG(cxg;Xm*$MtThk7;oGpETs3EW3Rf9PT?%< z?DnhS_t`i&I1ug*VaTL}sCjR(C`xvOxw@bcuBWTA!)d=uE&y9C1^r*o>dnwM!p~Yd zfd<$lIJ9tZKb}?p)|x+S9Bc-kJCELOU8 z@ZwyJ{r&Ih7u_b}%6_$yO7_0=|92!6le>?W(0@fz#g7TxE`5dpjRq6!VF}b{J+^Cc zTifFw2uNK?v|JVVz5^@7kz01MR97ZVk zd?XmY+;gtER0YugP?K>D|63Ut=InnVP40g$xaj{ksW0D8OjUfN4!tiAVY*3D#G*li zf-{}7Qiho3aMt81%55Yi;4fXGz3jcAEp_sCHr~&^gCit-2%UU#vX3ej$uQS@%%BuW zn4ux$Qi#PfI@)GAE>rt>|D3eqOlN|vM!aI4iZ5+jD(y_v$y@V35s1SCLJ9sGLGGd4 ziNHjJ2S`$^K6G-Cs5AV4^wZen$KUjc1N!iY@bD3WE)Sg~lB9Tpck047&Q-!%P|)b6{G<9IIIKSX`h;E zjre?PpqYgCAQ1*3?u5;J9zzL*R6HIkB2cXC?&d8qS3mlRL4~wZCxhYt#vuc!i&%yi zbaeko;=gjxhJht;-;#Dl6(SZ?HjHwMDT1i}_Y|EAv37i+Z7Bgs&;@$?KC{kJ2FE;z zZ>Uu8%aA7<>&EW`a&`h;zyfF2g7&QLJiK`aZR5VIxmU3 zYOMK;iUUaz?%25Grg8mubAtM`e12^TxdwHt&|xRNe9DXp&RsLcw)xu@&t63l3%rYz zo_8Il>{|0b6Q*}CXKAJG3}0#9JML@ zZ|3-k!|V^+r{AjEiA(+w)nLm~3W2FPp*AyXaZ=6u-Q}w(Zf(@MdS`jf)X^GFKI_3C zT-Rh9wU7RHJ*KP9bv=pV_>_303h<^V)^*MkY8&`70Tmg>BG}mvPMR|~uujPpf$*N` zYErzW38%w*TxV=c(kOc-MOD5(JUWsQY6&gupS=w7-uQR#zXGn~GydS|c+~d3E|kp9 zy7vr!Q$w)xYls{mo5?#O%O5<5^kVz4YZj=f`E_V;l({0dzp%)D(9qf0uMralWw@3V zil+TXH)CIfYnAM{+Wxad9nlCQJX$Kih>`v^A3h5d|Axz{;@(W%wsxEPxG|+zKWM67 zf0etvA5*xi4d>xqCy4QnImW6B*J4l-gcQ2Yy{X5m%qJ>6YwD>2OoH5i-h zd`lP^OUCzOVMNTCKI{i#_jhQ^cy|}5*-`as2NN4T&nK>m2`ZUu;A9PS>)`znFaXp> znhz3QUaAvA0jD9HsgmdsgNe{Sr*5@rRw zoh&{r_4&X9Av~X-OQ&1$*$nD5F|=27+U`oXhhden=37`NwNaV1Vb(x`H{r`DN9Suu zk)2Ry5hs%UD;A5eQeFJ;&3^iI*uhj{GiH|1TiPRS+c`KOcF?q>egWXv!iE?YnAGdq z{w=*Cmf%whzr`mc{52!cG4EGZHo&PnvDwHA5u|pmm(3>fv8y`%uJ{0BeOS{pPowzD zGON*zz9#Q9UILG;{z|UDJMQhZcR%`wd+-X0GKHZH9DT5nvGE?DV`-X8u}nnmV42V{ z{2FAKuV+S|W~dMDH)S)cxc6G#u6*<1Un=}Rp&va*hKSQv {Ws$y9k9#}CQy7=(t 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

-Wrx#Eay-tyJw*?6%qWWBQet8q#xX zwiJN-D7)s`?}YKkQv}8~vZ$Uq^x)|2p}n#Ymyq%LymN-=F)854tF)!^%Os z-`q@LQh*XdiWr;We+r0F_hUXztGrSkC%3jsE7-{M+Alnug%@D$TYIl=g9ycZY4;cJ zphHLJ>zw>=Ll+C@{asBjSSw6E%!R=?x^*=}*w>bq$LiSiu7+QW0S!5sfR?9;6OkY} zbDcA+qy&>5TM+_F2{=NSP~E{1n=l_ZY(^c8FQp3oXX!|bF5bAT-X#iW03*dfYcpZJ zPR(wz2#q*sO(Xh!b1$~Lj=-}%zOhAEc|_7nwu^=I*^id*B;j$OiNLE}K{$+M<(qI* z%Xe7stz-Ik7)Ofz?)Qijy9AcG=hAq&9&5g)|hNcF>EAPR;l! zsI+L+xG@jg%Sf#Dp7F)0pT@Nwp56#GToH2YQ`qd&oiAMZo3f9a1IB6wl`uMbg7f-4 zZ2MHBqgGA_4*zuI#q5nu&HSc~I~p8sXi(qSki1eICdset`_D(hD3ah;1izV#&pd`b zeSHnI>rWd%&PgPkJ_*RQIj5O6mtR;ZIw+X zaPPAtPJZFgmC58%#Kz$Au&=kTYB%xAV&Va|5$e)qAIbMX0XY@WOQqHRVOp_nSMjIn zX=!Bzb@D)9ynJ2(WsFWnOHlU~?W;{7QQ&Wv#@pU$h9tXMgEq7zyI-^>rov9_Lg{IK zzNg=glgvILQa7t;si3fnRX+r+CEuM7b`aGKpkE2=1BCVIv8nH(HiY3MQi@bk@%3@V zeVmqslD11ea6A>Yh{X8Gi>{Z^V6a`WuxoQP16bq(r&(U&^ps8tZ7EfDB<)4)`3W~$ zS`EdjSp$wTW{@-%rx}s~(|f!oynediaJYMCd4M}S4fiK;@6Sx8Wb-3@@ zbCWzMtP05Fzu$d@?h_3WH!NQH^}1U&^L$lxvr=fpq}5o@t=L6+_!8sqqx4hF?tXsT zIhpHT?(4R}K*M-e>ap8K7r8)OF6aAg7IwIHscd=Xf_L5b0NHnP+REY~jCoPIhd8Y> zE+Z??u}IRr#MR;#P_gd_L;{bchPa;p+&|D<$p?f{NW^4&bu_rsnDed5v%P1nJE~Te z^^r%K=f@qrj7nmO=4U0zO|-lEm8NRvc$pTX+HwW>B4<%{Js|(RcK-T_?;0b9fT!<7 zMA*rrY|1r_j+~VV*dTgoFk890nJ3-pzWlOJ*^X3stF9%&*?NGr7B}*)V(&>a;&1A5 z%Cc9R2)INAJQ+PDS9|OC(a!av^&5MYJH@Gits&1M-V4_UNq+bKe;4>~kF(BdkOEYD zrmMAXRaD?@6m3d68F4-F*A^QmL88&%m#cp06L>MoFYIA5y{c2Nps(A<=Nz4P*QWOl0y6>gRO< zyVef4$I(Qz^}N5rGQieBq%XXciX!mHQHTHE&H9jG;y6_auRoAK7H!av;_m+kxr>jp zks#D3H)C+V*PjyxegsWdAaRb{T~f-8n!uog79=JsQzPJOw^;)i)YTQJW3sz>6K3Pl zum1c`Dbgm$VMXgf=hxMIX~wuBj?4am9OL`nFMa!#cc=Nud{r+jEDQi3!~qa-+f-x` zazKsN#Mc2hd@Kz?;jI6VRdq@--2VoPyc2mfN&e2im`j9_3WVC%7r{@ppx zIn=xwnvTT3?Q7?(U;4dtNC&cT)a+Ij5~Ah{I1iOl$liVm6SIdFp&q$fKgp5;;Yj{B zrDcbQhX@EVKR^Er_jiOO?@q_{j9HtZXC+xTxz~Rwo0O{aY7%Ewi!p9gK9=O(Lf2Ld z^KZkw1E+U3?`@!upGs`TPEGIZ>I8){w(ZSU<37YhL;{p*56Q3Zc_^cBMBDs)7OCs4 zTrpwlNum1vs_O~DA&o9ciR1fX>D-zpE?zET=erMnxmRWDE0uNJ1n9P98|ZgDT)ti@ zlipN!bn!T$dbI!e63+PN;92nh1piY7|04zeH+6*22SWDG3!lRbGcNyhaV0r0s9fgD GxBms(9rQK; literal 0 HcmV?d00001 diff --git a/.playwright-mcp/light-mode-option-cards.png b/.playwright-mcp/light-mode-option-cards.png new file mode 100644 index 0000000000000000000000000000000000000000..02a670d07c41a61c8eaa55ac4fc3632b88ba760a GIT binary patch literal 33090 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 ML}a1mLi*qS3yh)CW&i*H literal 0 HcmV?d00001 diff --git a/changelog.md b/changelog.md index 42684e0..6f94fd8 100644 --- a/changelog.md +++ b/changelog.md @@ -1,5 +1,14 @@ # Changelog +## 2025-12-26 - 1.2.0 - feat(elements) +add upladmin-option-card component and migrate option/status UIs to use it; refactor monitor form multitoggle subscriptions and event handling; improve theme color handling and dark-mode styles; add demos, Playwright snapshots, and migration plan + +- Add new upladmin-option-card web component (implementation, index export, and demo). +- Replace inline option/status card markup with in incident-form and incident-update. +- Refactor upladmin-monitor-form: subscribe/unsubscribe multitoggle change subjects, handle lifecycle (firstUpdated/disconnected), and adjust event handlers (@newValue/@change usage). +- Swap hardcoded color tokens for cssManager.bdTheme for better light/dark theming; add dark-mode media tweak for filter select. +- Add Playwright snapshot images (.playwright-mcp) and a detailed readme.plan.md describing interface migration tasks. + ## 2025-12-24 - 1.1.0 - feat(monitor) add extended monitor statuses, check configuration, status overrides/paused indicators, and incident update templates diff --git a/readme.plan.md b/readme.plan.md new file mode 100644 index 0000000..852127d --- /dev/null +++ b/readme.plan.md @@ -0,0 +1,396 @@ +# Plan: Migrate Shared Interfaces to @uptime.link/interfaces + +## Overview + +Move shared type definitions from `catalog_admin/ts_web/interfaces/` to the canonical `../interfaces` package (`@uptime.link/interfaces`) to ensure consistency across all uptime.link packages. + +## Decisions (Resolved) + +1. **Check Config**: Use base type + discriminated union variants (elegant, type-safe) +2. **Incident Status**: Create unified type in shared package, migrate both packages +3. **Form Interfaces**: Keep local in catalog_admin (UI-specific) +4. **Versioning**: Manual releases - will notify when ready to publish + +--- + +## Task 1: Add Base Types to Shared Package + +**File: `../interfaces/ts/data/types.ts`** (new) + +```typescript +// Status types for monitors/services +export type TStatusType = + | 'operational' + | 'degraded' + | 'partial_outage' + | 'major_outage' + | 'maintenance' + | 'initializing' + | 'error' + | 'paused'; + +// Check types (discriminant values) +export type TCheckType = 'assumption' | 'function' | 'pwa' | 'pagerank'; + +// Status mode for monitors +export type TStatusMode = 'auto' | 'manual'; + +// Incident severity +export type TIncidentSeverity = 'critical' | 'major' | 'minor' | 'maintenance'; + +// Incident status (unified) +export type TIncidentStatus = + | 'investigating' + | 'identified' + | 'monitoring' + | 'resolved' + | 'postmortem'; +``` + +--- + +## Task 2: Refactor Check Interfaces with Base + Variants + +**File: `../interfaces/ts/data/checks/index.ts`** (refactor) + +```typescript +import { TStatusType, TCheckType } from '../types.js'; + +// ============================================ +// Base Interface +// ============================================ + +export interface ICheckBase { + id: string; + name: string; + description?: string; + enabled: boolean; + intervalMs?: number; + lastRun?: number; + lastResult?: 'success' | 'failure' | 'pending'; +} + +// ============================================ +// Discriminated Variants +// ============================================ + +export interface IAssumptionCheck extends ICheckBase { + checkType: 'assumption'; + assumedStatus: TStatusType; +} + +export interface IFunctionCheck extends ICheckBase { + checkType: 'function'; + functionUrl: string; + expectedStatusCode?: number; + timeoutMs?: number; + headers?: Record; +} + +export interface IPwaCheck extends ICheckBase { + checkType: 'pwa'; + targetUrl: string; + lighthouseThreshold?: number; + categories?: ('performance' | 'accessibility' | 'best-practices' | 'seo')[]; +} + +export interface IPageRankCheck extends ICheckBase { + checkType: 'pagerank'; + targetUrl: string; + minimumRank?: number; + searchEngine?: 'google' | 'bing'; +} + +// ============================================ +// Union Type (for UI and generic handling) +// ============================================ + +export type TCheck = + | IAssumptionCheck + | IFunctionCheck + | IPwaCheck + | IPageRankCheck; + +// ============================================ +// Check Collection +// ============================================ + +export interface ICheckCollection { + id: string; + name: string; + checks: TCheck[]; +} +``` + +--- + +## Task 3: Create Unified Incident Interface + +**File: `../interfaces/ts/data/incident.ts`** (refactor) + +```typescript +import { TIncidentSeverity, TIncidentStatus } from './types.js'; + +export interface IIncidentUpdate { + id: string; + incidentId: string; + status: TIncidentStatus; + message: string; + createdAt: number; + createdBy?: string; +} + +export interface IIncident { + id: string; + title: string; + description: string; + severity: TIncidentSeverity; + status: TIncidentStatus; + + // Affected services + affectedServiceIds: string[]; + + // Timeline + createdAt: number; + updatedAt: number; + resolvedAt?: number; + + // Updates history + updates: IIncidentUpdate[]; + + // Metadata + createdBy?: string; + isScheduled?: boolean; + scheduledStartTime?: number; + scheduledEndTime?: number; +} +``` + +--- + +## Task 4: Add Service Status Interface + +**File: `../interfaces/ts/data/servicestatus.ts`** (new) + +```typescript +import { TStatusType, TStatusMode, TCheckType } from './types.js'; + +export interface IServiceStatus { + id: string; + name: string; + displayName: string; + description?: string; + + // Current state + currentStatus: TStatusType; + lastChecked: number; + responseTime: number; + + // Uptime metrics + uptime30d: number; + uptime90d: number; + + // Organization + category?: string; + dependencies?: string[]; + + // Status management + statusMode: TStatusMode; + manualStatus?: TStatusType; + paused: boolean; + + // Check configuration (references check collection) + checkType?: TCheckType; + checkCollectionId?: string; + intervalMs?: number; +} + +export interface IStatusHistoryPoint { + timestamp: number; + status: TStatusType; + responseTime?: number; +} + +export interface IOverallStatus { + status: TStatusType; + message?: string; + lastUpdated: number; +} +``` + +--- + +## Task 5: Add Status Page Config + +**File: `../interfaces/ts/data/statuspageconfig.ts`** (new) + +```typescript +import { IOverallStatus } from './servicestatus.js'; + +export interface IStatusPageConfig { + id: string; + name: string; + slug: string; + + // Branding + logoUrl?: string; + faviconUrl?: string; + primaryColor?: string; + + // Content + headerTitle: string; + headerDescription?: string; + + // Features + showHistoricalUptime: boolean; + showResponseTime: boolean; + showSubscribeButton: boolean; + + // Service grouping + serviceGroups: IServiceGroup[]; + + // Overall status override + overallStatus?: IOverallStatus; +} + +export interface IServiceGroup { + id: string; + name: string; + description?: string; + serviceIds: string[]; + expanded: boolean; +} +``` + +--- + +## Task 6: Update Shared Package Exports + +**File: `../interfaces/ts/data/index.ts`** (update) + +```typescript +export * from './types.js'; +export * from './checks/index.js'; +export * from './incident.js'; +export * from './servicestatus.js'; +export * from './statuspageconfig.js'; +// ... existing exports +``` + +--- + +## Task 7: Update catalog_admin Interfaces + +**File: `catalog_admin/ts_web/interfaces/index.ts`** (refactor) + +```typescript +// Re-export shared types from @uptime.link/interfaces +export { + // Types + TStatusType, + TCheckType, + TStatusMode, + TIncidentSeverity, + TIncidentStatus, + + // Check interfaces + ICheckBase, + IAssumptionCheck, + IFunctionCheck, + IPwaCheck, + IPageRankCheck, + TCheck, + ICheckCollection, + + // Incident interfaces + IIncident, + IIncidentUpdate, + + // Service/Status interfaces + IServiceStatus, + IStatusHistoryPoint, + IOverallStatus, + IStatusPageConfig, + IServiceGroup, +} from '@uptime.link/interfaces'; + +// ============================================ +// Form Interfaces (UI-specific, kept local) +// ============================================ + +import type { TStatusType, TCheckType, TStatusMode, TIncidentSeverity } from '@uptime.link/interfaces'; + +export interface IMonitorFormData { + name: string; + displayName: string; + description?: string; + category?: string; + checkType: TCheckType; + intervalMs: number; + statusMode: TStatusMode; + paused: boolean; + // Check-specific fields (form flattens the discriminated union) + assumedStatus?: TStatusType; + functionUrl?: string; + expectedStatusCode?: number; + targetUrl?: string; + lighthouseThreshold?: number; + minimumRank?: number; +} + +export interface IIncidentFormData { + title: string; + description: string; + severity: TIncidentSeverity; + affectedServiceIds: string[]; + isScheduled: boolean; + scheduledStartTime?: number; + scheduledEndTime?: number; +} + +export interface IIncidentUpdateFormData { + status: string; + message: string; +} +``` + +--- + +## Task 8: Update Component Imports + +Scan and update all components that import from local interfaces to ensure they work with the new types. Key files: + +- `ts_web/elements/upladmin-monitor-form/upladmin-monitor-form.ts` +- `ts_web/elements/upladmin-monitor-list/upladmin-monitor-list.ts` +- `ts_web/elements/upladmin-incident-form/upladmin-incident-form.ts` +- `ts_web/elements/upladmin-incident-list/upladmin-incident-list.ts` +- `ts_web/elements/upladmin-incident-update/upladmin-incident-update.ts` + +--- + +## Task 9: Build and Test + +1. Build `../interfaces`: `cd ../interfaces && pnpm build` +2. **Notify for release** of `@uptime.link/interfaces` +3. Update dependency: `pnpm update @uptime.link/interfaces` +4. Build catalog_admin: `pnpm build` +5. Verify no type errors +6. Test UI components manually + +--- + +## Files Summary + +### New files in `../interfaces`: +- `ts/data/types.ts` +- `ts/data/servicestatus.ts` +- `ts/data/statuspageconfig.ts` + +### Modified files in `../interfaces`: +- `ts/data/checks/index.ts` (refactor to base + variants) +- `ts/data/incident.ts` (unified interface) +- `ts/data/index.ts` (add exports) + +### Modified files in `catalog_admin`: +- `ts_web/interfaces/index.ts` (re-export from shared + local form types) +- Component files (if import paths change) diff --git a/ts_web/00_commitinfo_data.ts b/ts_web/00_commitinfo_data.ts index 12e3bb8..e9b3e06 100644 --- a/ts_web/00_commitinfo_data.ts +++ b/ts_web/00_commitinfo_data.ts @@ -3,6 +3,6 @@ */ export const commitinfo = { name: '@uptime.link/statuspage-admin', - version: '1.1.0', + version: '1.2.0', description: 'Admin components for managing UptimeLink status pages, monitors, and incidents.' } diff --git a/ts_web/elements/index.ts b/ts_web/elements/index.ts index 7f71459..5321278 100644 --- a/ts_web/elements/index.ts +++ b/ts_web/elements/index.ts @@ -1,3 +1,6 @@ +// Shared components +export * from './upladmin-option-card/index.js'; + // Monitor components export * from './upladmin-monitor-form/index.js'; export * from './upladmin-monitor-list/index.js'; diff --git a/ts_web/elements/upladmin-incident-form/upladmin-incident-form.ts b/ts_web/elements/upladmin-incident-form/upladmin-incident-form.ts index 4110743..53ef18c 100644 --- a/ts_web/elements/upladmin-incident-form/upladmin-incident-form.ts +++ b/ts_web/elements/upladmin-incident-form/upladmin-incident-form.ts @@ -168,51 +168,6 @@ export class UpladminIncidentForm extends DeesElement { gap: ${unsafeCSS(sharedStyles.spacing.sm)}; } - .option-card { - display: flex; - flex-direction: column; - align-items: center; - gap: 10px; - padding: 18px 14px; - background: ${sharedStyles.colors.background.primary}; - border: 2px solid ${sharedStyles.colors.border.default}; - border-radius: ${unsafeCSS(sharedStyles.borderRadius.base)}; - cursor: pointer; - transition: all ${unsafeCSS(sharedStyles.durations.fast)} ${unsafeCSS(sharedStyles.easings.default)}; - text-align: center; - } - - .option-card:hover { - border-color: ${sharedStyles.colors.border.strong}; - background: ${sharedStyles.colors.background.muted}; - } - - .option-card.selected { - border-color: ${sharedStyles.colors.accent.primary}; - background: ${cssManager.bdTheme('rgba(59, 130, 246, 0.05)', 'rgba(96, 165, 250, 0.1)')}; - } - - .option-card input { - display: none; - } - - .option-label { - font-size: 13px; - font-weight: 600; - color: ${sharedStyles.colors.text.primary}; - } - - .option-desc { - font-size: 11px; - color: ${sharedStyles.colors.text.muted}; - line-height: 1.3; - } - - .severity-critical dees-icon { --icon-color: ${sharedStyles.colors.status.majorOutage}; } - .severity-major dees-icon { --icon-color: ${sharedStyles.colors.status.partialOutage}; } - .severity-minor dees-icon { --icon-color: ${sharedStyles.colors.status.degraded}; } - .severity-maintenance dees-icon { --icon-color: ${sharedStyles.colors.status.maintenance}; } - .field-label { display: block; font-size: 13px; @@ -363,20 +318,14 @@ export class UpladminIncidentForm extends DeesElement {

${severityOptions.map(opt => html` - + this.handleSeverityChange(opt.value)} + > `)}
@@ -385,19 +334,13 @@ export class UpladminIncidentForm extends DeesElement {
${statusOptions.map(opt => html` - + this.handleStatusChange(opt.value)} + > `)}
diff --git a/ts_web/elements/upladmin-incident-list/upladmin-incident-list.ts b/ts_web/elements/upladmin-incident-list/upladmin-incident-list.ts index 31b5642..4d61314 100644 --- a/ts_web/elements/upladmin-incident-list/upladmin-incident-list.ts +++ b/ts_web/elements/upladmin-incident-list/upladmin-incident-list.ts @@ -260,8 +260,8 @@ export class UpladminIncidentList extends DeesElement { .incident-status.postmortem { background: ${cssManager.bdTheme('rgba(168, 85, 247, 0.1)', 'rgba(168, 85, 247, 0.2)')}; - color: #a855f7; - --icon-color: #a855f7; + color: ${cssManager.bdTheme('#9333ea', '#a855f7')}; + --icon-color: ${cssManager.bdTheme('#9333ea', '#a855f7')}; } .incident-meta { diff --git a/ts_web/elements/upladmin-incident-update/upladmin-incident-update.ts b/ts_web/elements/upladmin-incident-update/upladmin-incident-update.ts index c8b93ff..ba6856f 100644 --- a/ts_web/elements/upladmin-incident-update/upladmin-incident-update.ts +++ b/ts_web/elements/upladmin-incident-update/upladmin-incident-update.ts @@ -157,52 +157,6 @@ export class UpladminIncidentUpdate extends DeesElement { gap: ${unsafeCSS(sharedStyles.spacing.sm)}; } - .status-option { - display: flex; - flex-direction: column; - align-items: center; - gap: 10px; - padding: 18px 14px; - background: ${sharedStyles.colors.background.primary}; - border: 2px solid ${sharedStyles.colors.border.default}; - border-radius: ${unsafeCSS(sharedStyles.borderRadius.base)}; - cursor: pointer; - transition: all ${unsafeCSS(sharedStyles.durations.fast)} ${unsafeCSS(sharedStyles.easings.default)}; - text-align: center; - } - - .status-option:hover { - border-color: ${sharedStyles.colors.border.strong}; - background: ${sharedStyles.colors.background.muted}; - } - - .status-option.selected { - border-color: ${sharedStyles.colors.accent.primary}; - background: ${cssManager.bdTheme('rgba(59, 130, 246, 0.05)', 'rgba(96, 165, 250, 0.1)')}; - } - - .status-option input { - display: none; - } - - .status-option.investigating dees-icon { --icon-color: ${sharedStyles.colors.status.partialOutage}; } - .status-option.identified dees-icon { --icon-color: ${sharedStyles.colors.status.degraded}; } - .status-option.monitoring dees-icon { --icon-color: ${sharedStyles.colors.status.maintenance}; } - .status-option.resolved dees-icon { --icon-color: ${sharedStyles.colors.status.operational}; } - .status-option.postmortem dees-icon { --icon-color: #a855f7; } - - .status-label { - font-size: 13px; - font-weight: 600; - color: ${sharedStyles.colors.text.primary}; - } - - .status-desc { - font-size: 11px; - color: ${sharedStyles.colors.text.muted}; - line-height: 1.3; - } - .field-label { display: block; font-size: 13px; @@ -358,20 +312,14 @@ export class UpladminIncidentUpdate extends DeesElement {
${statusOptions.map(opt => html` - + this.handleStatusChange(opt.value)} + > `)}
diff --git a/ts_web/elements/upladmin-monitor-form/upladmin-monitor-form.ts b/ts_web/elements/upladmin-monitor-form/upladmin-monitor-form.ts index 7ed088b..fb87b6f 100644 --- a/ts_web/elements/upladmin-monitor-form/upladmin-monitor-form.ts +++ b/ts_web/elements/upladmin-monitor-form/upladmin-monitor-form.ts @@ -10,6 +10,7 @@ import { unsafeCSS, state, } from '@design.estate/dees-element'; +import type { DeesInputMultitoggle } from '@design.estate/dees-catalog'; import * as sharedStyles from '../../styles/shared.styles.js'; import type { IMonitorFormData, IServiceStatus, ICheckConfig, TStatusType, TCheckType, TStatusMode } from '../../interfaces/index.js'; import { demoFunc } from './upladmin-monitor-form.demo.js'; @@ -60,6 +61,14 @@ export class UpladminMonitorForm extends DeesElement { pagerank: 'PageRank', }; + private getCheckTypeLabel(): string { + return this.checkTypeLabels[this.formData.checkType] || 'Assumption'; + } + + private getStatusModeLabel(): string { + return this.formData.statusMode === 'auto' ? 'Auto' : 'Manual'; + } + private intervalOptions = [ { value: 60000, label: '1 min' }, { value: 300000, label: '5 min' }, @@ -183,6 +192,8 @@ export class UpladminMonitorForm extends DeesElement { ` ]; + private subscriptions: Array<{ unsubscribe: () => void }> = []; + async connectedCallback() { await super.connectedCallback(); if (this.monitor) { @@ -190,10 +201,47 @@ export class UpladminMonitorForm extends DeesElement { } } + async disconnectedCallback() { + await super.disconnectedCallback(); + this.subscriptions.forEach(sub => sub.unsubscribe()); + this.subscriptions = []; + } + + async firstUpdated() { + await this.updateComplete; + this.setupMultitoggleSubscriptions(); + } + updated(changedProperties: Map) { if (changedProperties.has('monitor') && this.monitor) { this.formData = { ...this.monitor }; } + // Re-setup subscriptions after each render in case elements changed + this.setupMultitoggleSubscriptions(); + } + + private subscribedElements = new WeakSet(); + + private setupMultitoggleSubscriptions() { + // Subscribe to check type toggle (only if not already subscribed) + const checkTypeToggle = this.shadowRoot?.querySelector('#checkTypeToggle') as DeesInputMultitoggle; + if (checkTypeToggle && !this.subscribedElements.has(checkTypeToggle)) { + this.subscribedElements.add(checkTypeToggle); + const sub = checkTypeToggle.changeSubject.subscribe(() => { + this.handleCheckTypeChange(checkTypeToggle.selectedOption); + }); + this.subscriptions.push(sub); + } + + // Subscribe to status mode toggle (only if not already subscribed) + const statusModeToggle = this.shadowRoot?.querySelector('#statusModeToggle') as DeesInputMultitoggle; + if (statusModeToggle && !this.subscribedElements.has(statusModeToggle)) { + this.subscribedElements.add(statusModeToggle); + const sub = statusModeToggle.changeSubject.subscribe(() => { + this.handleStatusModeChange(statusModeToggle.selectedOption); + }); + this.subscriptions.push(sub); + } } public render(): TemplateResult { @@ -266,10 +314,10 @@ export class UpladminMonitorForm extends DeesElement {
this.handleCheckTypeChange(e.detail.selectedOption)} + .options=${['Assumption', 'Function', 'PWA', 'PageRank']} + .selectedOption=${this.getCheckTypeLabel()} >
@@ -293,18 +341,18 @@ export class UpladminMonitorForm extends DeesElement { .label=${'Pause Monitor'} .description=${'When paused, status will show as "paused" and checks won\'t run'} .value=${this.formData.paused} - @changeSubject=${(e: CustomEvent) => this.updateField('paused', e.detail.value)} + @newValue=${(e: CustomEvent) => this.updateField('paused', e.detail)} > ${isEdit ? html`
this.handleStatusModeChange(e.detail.selectedOption)} + .selectedOption=${this.getStatusModeLabel()} > ${this.formData.statusMode === 'manual' ? html` @@ -319,7 +367,7 @@ export class UpladminMonitorForm extends DeesElement { ]} .selectedOption=${this.formData.manualStatus || 'operational'} .direction=${'horizontal'} - @changeSubject=${(e: CustomEvent) => this.updateField('manualStatus', e.detail.selectedOption)} + @change=${(e: CustomEvent) => this.updateField('manualStatus', e.detail.value)} > ` : ''}
@@ -435,12 +483,12 @@ export class UpladminMonitorForm extends DeesElement { this.updateCheckConfig('checkGoogle', e.detail.value)} + @newValue=${(e: CustomEvent) => this.updateCheckConfig('checkGoogle', e.detail)} > this.updateCheckConfig('checkBing', e.detail.value)} + @newValue=${(e: CustomEvent) => this.updateCheckConfig('checkBing', e.detail)} >
diff --git a/ts_web/elements/upladmin-monitor-list/upladmin-monitor-list.ts b/ts_web/elements/upladmin-monitor-list/upladmin-monitor-list.ts index 9ebf029..1892924 100644 --- a/ts_web/elements/upladmin-monitor-list/upladmin-monitor-list.ts +++ b/ts_web/elements/upladmin-monitor-list/upladmin-monitor-list.ts @@ -128,6 +128,12 @@ export class UpladminMonitorList extends DeesElement { box-shadow: 0 0 0 3px ${cssManager.bdTheme('rgba(59, 130, 246, 0.1)', 'rgba(96, 165, 250, 0.15)')}; } + @media (prefers-color-scheme: dark) { + .filter-select { + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%23a1a1aa' d='M2.5 4.5L6 8l3.5-3.5'/%3E%3C/svg%3E"); + } + } + .table-container { padding: 0; } @@ -189,20 +195,20 @@ export class UpladminMonitorList extends DeesElement { .status-badge.initializing { background: ${cssManager.bdTheme('rgba(107, 114, 128, 0.1)', 'rgba(107, 114, 128, 0.15)')}; - color: #6b7280; - --icon-color: #6b7280; + color: ${cssManager.bdTheme('#6b7280', '#9ca3af')}; + --icon-color: ${cssManager.bdTheme('#6b7280', '#9ca3af')}; } .status-badge.error { background: ${cssManager.bdTheme('rgba(220, 38, 38, 0.1)', 'rgba(220, 38, 38, 0.15)')}; - color: #dc2626; - --icon-color: #dc2626; + color: ${cssManager.bdTheme('#dc2626', '#f87171')}; + --icon-color: ${cssManager.bdTheme('#dc2626', '#f87171')}; } .status-badge.paused { background: ${cssManager.bdTheme('rgba(139, 92, 246, 0.1)', 'rgba(139, 92, 246, 0.15)')}; - color: #8b5cf6; - --icon-color: #8b5cf6; + color: ${cssManager.bdTheme('#8b5cf6', '#a78bfa')}; + --icon-color: ${cssManager.bdTheme('#8b5cf6', '#a78bfa')}; } /* Status indicators for override and pause */ @@ -224,12 +230,12 @@ export class UpladminMonitorList extends DeesElement { .status-indicator.override { background: ${cssManager.bdTheme('rgba(234, 179, 8, 0.15)', 'rgba(234, 179, 8, 0.2)')}; - --icon-color: #eab308; + --icon-color: ${cssManager.bdTheme('#d97706', '#fbbf24')}; } .status-indicator.paused { background: ${cssManager.bdTheme('rgba(139, 92, 246, 0.15)', 'rgba(139, 92, 246, 0.2)')}; - --icon-color: #8b5cf6; + --icon-color: ${cssManager.bdTheme('#8b5cf6', '#a78bfa')}; } .monitor-info { diff --git a/ts_web/elements/upladmin-option-card/index.ts b/ts_web/elements/upladmin-option-card/index.ts new file mode 100644 index 0000000..9fe5a37 --- /dev/null +++ b/ts_web/elements/upladmin-option-card/index.ts @@ -0,0 +1 @@ +export * from './upladmin-option-card.js'; diff --git a/ts_web/elements/upladmin-option-card/upladmin-option-card.demo.ts b/ts_web/elements/upladmin-option-card/upladmin-option-card.demo.ts new file mode 100644 index 0000000..63056d4 --- /dev/null +++ b/ts_web/elements/upladmin-option-card/upladmin-option-card.demo.ts @@ -0,0 +1,118 @@ +import { html, css, cssManager } from '@design.estate/dees-element'; +import type { UpladminOptionCard } from './upladmin-option-card.js'; + +export const demoFunc = () => html` + +
+
+
Severity Variants
+
+ + + + +
+
+ +
+
Status Variants
+
+ + + + + +
+
+ +
+
States
+
+ + + +
+
+
+`; diff --git a/ts_web/elements/upladmin-option-card/upladmin-option-card.ts b/ts_web/elements/upladmin-option-card/upladmin-option-card.ts new file mode 100644 index 0000000..11920bb --- /dev/null +++ b/ts_web/elements/upladmin-option-card/upladmin-option-card.ts @@ -0,0 +1,178 @@ +import { + DeesElement, + property, + html, + customElement, + type TemplateResult, + css, + cssManager, + unsafeCSS, +} from '@design.estate/dees-element'; +import * as sharedStyles from '../../styles/shared.styles.js'; +import { demoFunc } from './upladmin-option-card.demo.js'; + +declare global { + interface HTMLElementTagNameMap { + 'upladmin-option-card': UpladminOptionCard; + } +} + +export type TOptionVariant = + // Severity variants + | 'critical' | 'major' | 'minor' | 'maintenance' + // Status variants + | 'investigating' | 'identified' | 'monitoring' | 'resolved' | 'postmortem' + // Generic variants + | 'default' | 'primary' | 'success' | 'warning' | 'danger' | 'info'; + +@customElement('upladmin-option-card') +export class UpladminOptionCard extends DeesElement { + public static demo = demoFunc; + + @property({ type: String }) + accessor icon: string = ''; + + @property({ type: String }) + accessor label: string = ''; + + @property({ type: String }) + accessor description: string = ''; + + @property({ type: String, reflect: true }) + accessor variant: TOptionVariant = 'default'; + + @property({ type: Boolean, reflect: true }) + accessor selected: boolean = false; + + @property({ type: Boolean, reflect: true }) + accessor disabled: boolean = false; + + public static styles = [ + cssManager.defaultStyles, + css` + :host { + display: block; + font-family: ${unsafeCSS(sharedStyles.fonts.base)}; + } + + .option-card { + display: flex; + flex-direction: column; + align-items: center; + gap: 10px; + padding: 18px 14px; + background: ${cssManager.bdTheme('#ffffff', '#09090b')}; + border: 2px solid ${cssManager.bdTheme('#e4e4e7', '#27272a')}; + border-radius: 6px; + cursor: pointer; + transition: all 0.1s ease; + text-align: center; + user-select: none; + } + + .option-card:hover:not(.disabled) { + border-color: ${cssManager.bdTheme('#d4d4d8', '#3f3f46')}; + background: ${cssManager.bdTheme('#f4f4f5', '#18181b')}; + } + + :host([selected]) .option-card { + border-color: ${cssManager.bdTheme('#3b82f6', '#60a5fa')}; + background: ${cssManager.bdTheme('rgba(59, 130, 246, 0.05)', 'rgba(96, 165, 250, 0.1)')}; + } + + :host([disabled]) .option-card { + opacity: 0.5; + cursor: not-allowed; + } + + .option-label { + font-size: 13px; + font-weight: 600; + color: ${cssManager.bdTheme('#09090b', '#fafafa')}; + } + + .option-desc { + font-size: 11px; + color: ${cssManager.bdTheme('#a1a1aa', '#71717a')}; + line-height: 1.3; + } + + /* Variant icon colors - all using bdTheme for proper light/dark support */ + + /* Severity variants */ + :host([variant="critical"]) dees-icon { + --icon-color: ${cssManager.bdTheme('#dc2626', '#f87171')}; + } + :host([variant="major"]) dees-icon { + --icon-color: ${cssManager.bdTheme('#ea580c', '#fb923c')}; + } + :host([variant="minor"]) dees-icon { + --icon-color: ${cssManager.bdTheme('#ca8a04', '#fbbf24')}; + } + :host([variant="maintenance"]) dees-icon { + --icon-color: ${cssManager.bdTheme('#2563eb', '#60a5fa')}; + } + + /* Status variants */ + :host([variant="investigating"]) dees-icon { + --icon-color: ${cssManager.bdTheme('#ea580c', '#fb923c')}; + } + :host([variant="identified"]) dees-icon { + --icon-color: ${cssManager.bdTheme('#ca8a04', '#fbbf24')}; + } + :host([variant="monitoring"]) dees-icon { + --icon-color: ${cssManager.bdTheme('#2563eb', '#60a5fa')}; + } + :host([variant="resolved"]) dees-icon { + --icon-color: ${cssManager.bdTheme('#16a34a', '#22c55e')}; + } + :host([variant="postmortem"]) dees-icon { + --icon-color: ${cssManager.bdTheme('#9333ea', '#a855f7')}; + } + + /* Generic variants */ + :host([variant="default"]) dees-icon { + --icon-color: ${cssManager.bdTheme('#71717a', '#a1a1aa')}; + } + :host([variant="primary"]) dees-icon { + --icon-color: ${cssManager.bdTheme('#3b82f6', '#60a5fa')}; + } + :host([variant="success"]) dees-icon { + --icon-color: ${cssManager.bdTheme('#16a34a', '#22c55e')}; + } + :host([variant="warning"]) dees-icon { + --icon-color: ${cssManager.bdTheme('#ca8a04', '#fbbf24')}; + } + :host([variant="danger"]) dees-icon { + --icon-color: ${cssManager.bdTheme('#dc2626', '#f87171')}; + } + :host([variant="info"]) dees-icon { + --icon-color: ${cssManager.bdTheme('#2563eb', '#60a5fa')}; + } + + dees-icon { + color: var(--icon-color); + } + `, + ]; + + public render(): TemplateResult { + return html` +
+ ${this.icon ? html`` : ''} + ${this.label ? html`${this.label}` : ''} + ${this.description ? html`${this.description}` : ''} +
+ `; + } + + private handleClick() { + if (this.disabled) return; + + this.dispatchEvent(new CustomEvent('select', { + detail: { selected: !this.selected }, + bubbles: true, + composed: true, + })); + } +}