From 0947517746eefce43f64b4f64bab40d14d91e3dd Mon Sep 17 00:00:00 2001 From: Andy Balaam Date: Mon, 26 Jan 2026 10:46:40 +0000 Subject: [PATCH] Allow dismissing 'Key storage out of sync' temporarily (#31455) --- .../key-storage-out-of-sync-toast-linux.png | Bin 18189 -> 18875 bytes res/css/structures/_ToastContainer.pcss | 12 ++++++-- src/components/structures/ToastContainer.tsx | 29 +++++++++++++----- src/stores/ToastStore.ts | 9 ++++++ src/toasts/SetupEncryptionToast.tsx | 17 ++++++++++ .../toasts/SetupEncryptionToast-test.tsx | 11 +++++++ 6 files changed, 69 insertions(+), 9 deletions(-) diff --git a/playwright/snapshots/crypto/toasts.spec.ts/key-storage-out-of-sync-toast-linux.png b/playwright/snapshots/crypto/toasts.spec.ts/key-storage-out-of-sync-toast-linux.png index f5514af8cf1cf09adb2f64e2ca495f9192709691..09db9d3b5c00711574aad30a09d7ffc0fce81b77 100644 GIT binary patch literal 18875 zcmb5WbC6`u7q>YxZQGi*ZBJ|3wr$(CZTGZo+qTVW+ur*AHs1d>Hg=;TZdBdK%zG+t z-aMc4oKqDpCnE|6jScw-xoms0vQ&tETH6;b&(D6 z2UQd&B-BHUQ!Yb7p3_PXB-#&-CJby2v@SrtZ?H6+bZ!Tm6`PT4E^QSV2E8``6D;Z% zdhai6Fq~Bm9KD~y9A|SMI~~FIodKdyMAIk^SJPM1(-+g-_fza0%;m<$#)SzhHM%H_ zn?vspK;{87;Hq1f&uY60F;bM1>K`%5w>=OyinlO(?q1!Gh+a6a^+x zei7G{NJQOK3YwJ>DaxcWDu%bDO1_jyfBP&6gYMY&e^DW+1@B7GFvFBzFRFtDtKoXg zP$VH>Qgs-NDrwFYmxHOUFIKJQH#RB}DTIUh*xSq42gH8e7E~>P`f_PxNJXIn?bF}I zNc}^upSIsp*_l;UwKT6bOHL{44pvW1*feQtuKs#?IAUcz)oeWp87!DDhkCFbn6&xv ztD?C|DJeNz%wi}>wXAU7{C9O5;|v)aNvBUP*u)0c3VelF7^7wrSQf( zrh4k?wwrA-60+yZwdDUFHFT|QBXRtM9t6A`MN^(5 z#B>)#8S<}4UE}aP(^GXTJnJ*fJUNOajd`iqs-iW}0xH6W@dDmj1tqP?32L*A;iUf! zz1-NqaBy^lfsq>4^YlJE_T%mjIyo8blO+AWaj!wYHa9;6P1HjY343bAL?sjd*D1!Y z6o7$>1VtWb2DZ`Il<~hWvWUdBp79zSyboSo{sQO>5VW{dpg@(tE2t_0&L|1~T}onp zVPTTbyCiU6XGlrys+Y?dVx!oW|2`9-6&W8DDf>q-mEk2E zTq^Vx0o%|Hkrs)3Ae&>MhS{#2*VjAv*i)h^1{M`p7fV<`5O*gGWGPahj*AM4o2w)B zw03@Mok0ZC&`<#|Qq6je^U4J+f<||hQ#i9Yf%DE{lh+0o>?OjY3hFXUcq1HlMqJ(K zd|^aEPeCE$BbJn`p0z9?ebQkDTrq_GW^`ppufbkZWR)3fowl4<7UJfAO;U9AY+lU2 zE3-y#rX0ljW zk9X<009kHs5)u}ckx!62M=hZrrZifOs3kAjx`2-M|ao}LB?-&Jf+z~la$ownYon=p&L?GufOh)I4z z_G0$L7sPZt9o-qJy*On(np`WL`5W7GYNP5b(I1oB`;~H8S)<+4m-Rf;;{uDvhfG*a z%qQ|MxvXwj`ljFJ+~-T#Nl#ur-dK|wba+@hA&hx%{ju(#i|=#|C)^c_%iy~E2dIg$ zvA$_qyV{q{mmtl*( zr!LQDBoHn30z8{7i4O|^yLP+xUAT7cm}1FRtG(h|MsG{6oB!SYeO(0E=o!HZlWF7i z(v0c4s@dX1XBumV<;XWDrG);D4@kVjkl}D$*dV_ie@e?|8{Pze)w{^Pn)_*}EXeyn zHc|I|S{({f>+Q4jq{zu)(ffdCtQ~2``hyb=tH*Km);>Bc?l`rt+SZDFo^pu|1!1dh z(EJZSZ>oi9VfSv#XZjwskf^)Yq18cDHz-6jB9f&NfGv~JHNQeiHZh*f+q-NS;vxkQz$Y|#hwWp&$`XSoH&^yHJe)Ju-3 zGk!rk(P9r@|7`}qpGN!_5nK0SJEC0kg?LOyM`khb`Zzag$`2#61`}oH(66r%bPDYK z>-jcC35&C_n=o$ID|`fQXx*R}8`f^isSMVkw zTjj}R>EY?==>eyqLLddcuRGK=I$ai2Je25Z4q?)hbw@|W4JK1#Uaty5foKG|e*8(% zWr}>{{o`X>h98OKlo=TrQ<*r#pDzR6&$m7;xzTsI3K}YO%shJ@`*jE8HCtj2={)jY zenI>D3E7^%2>5&gj&z=K#R$|wAklDS3Ey5q0yhwbZXm3-jy3P;SasA|FW|<b=2ZW*s17jyGp4Y)J z7~uxJaUXXu1dT~3)jA0+GYciMUEbY6b6k$YPAhvtNWU6TGdAjk-Xo9y6-*0XY}Q2& zDeSzw6Wrjmx5EdjlAJ!_J-jo9iVElS*JNf^j3y5tB75M@%ZRgs^9&Ic z7IciCw$^0d>heA~#p)793w!bRIXqp21+H}T=MM54=5tYv;1 z2*gv5!>fVRVwp2PREDLc?;98zNq(p5tnzQ>PT86qymbvh9oI`Znlcu>{5Ca_-)v)x zT5@FMg61jo>sapGsr0ojFRZRis9NoU<>CSt#$eA6SsdH*35h9BEL;HG&9Hlb*FX?+ zbkkU3*NvNA-|{kGLEc8q&$&`>l8lTt|MW&)!qz|uIVXBdvB&L}2rqW(8(j&rRx~zv z-?i%6f|iVD031e_xueQtjK zY;g?xjV|K&;}r%`-N{5IlMStyAnANWnL4aCTc$i{Z0>Zy6iZ;O!_?I8+lIO#hILeO zs?>N=xzKlYmhgqw`3<(gH0UO$AOelw>*Iy-MOjgCz3I>H3EX(h0A7K<7VHb~U)+ zFRzQurNahG+%e80Y+M8hh1>*e`L~N;qKzj9$K(8-qHh-CK ztu4FXFu3jMJFU>rv;IqARE__d;X@mBm3rV*8nDY?wq=QN({zc3g-Ztm(VrSIV}I@g zY0YF+tDMfR6!DC~V$Lw1lG~3F&v3Hakku6%@{{81Ek zZ317%WS~#@`4*nxLzhqDdX-zC*&?ppnY(wm7^{A=QWHxNXHG1}%{V?`ao47^RQWZB zA?;w&)~Li_v%!)}2^1{*?@m`FZflld6M7FY`LeM1y`zf1-cJ_fiHnGZkL=$T$AFTm zBkQsf-dmmxUqZz<@~6eU&2oFUoopEtCy1Z+lcsS6(;Pb5&v;(j+Foyt35w5d=B z7n^N~6T1S)bLA?pl+zcsCXXj`c$@*bZ%^4BFWf-+w$m57n_n%hgIe;x2}+^WG(hQO zk)LDq;v<;;)PaA3^fJw=q1MbEA7{0dP}qh!v#?O?8ope`v%CHRscbekhM!VatjM$- zU!?))`Tzn$S)=5q3WGbPV@KR4_+v_&8OWM`Sbw}fC+^i4MPVb-KWG=UMe8~{J1dww zF%+5_#aaBy-HkYs6pg`-zA78&^Nn@+M)d~(036r7KS7MTgM#o$8fWJS9rpw;)*9p? zv6RjZK1YADj)yLS`Hn=1t_j5Qp(+-i@{~ZDMY`v(V@jX~!ruVLN zqtDcW?bT?C+DN+NifI5S%*$9TsT>nkbRiVDF&(W^ckqk9&(2vj=1u=qKTeYieYEGd&omQ!}Wtf*UAAedO5S*A23qo9#Tp5yk$aFhX z$8)CKG6#j=iIU^svkmuA`CqT+R&hDM8!o62Jrp=y+em@}3aK2o$@&RterHD4yyIqk^hKh|L{+@+0fB(d?pmkA<+Hw)-C?zs zQ26Jr(f1)rU!)BV+ton@CR zBY$b}e}kL|S*|Sq@(sXm_I{Tv_Y#p3FKe%#Fu=iH)N*ka9k2e_2m)>9#Qyz`*pgr9 zB9;3E28;V3@pyJ{$mA4s9wsYaFF($Y;$sMToQp(C{yR+Rh;C`fsS zrFv^xheG-ObmZjr4u%L}$w-B6%UIRTOwLkse0Q{|-Q=)&H;%Yv*#jy$5d~IXg!yPS z8c*iBxD}3=7SYxOh-R`o{LcApE-=G+Ege_nDy@T3E-uz~o~|}}G#FK55AYj{9T#5`sknQT|ScvnZ;dF5DEwOYopu!O(1`DV=){0H zwfFK81k{&YPv-|6CQAw9IRiDO-e5b7(_xCeU*%jS^RU<~dXMF39v&VH8Vx#KZ|5^p z*_As^r++$Ku2#VbSW>PxyC4QGLz8zR3BHan`1q?nktCwa!Jtl7^FO=0I)WZ zYD4{hvU~XM>b#8K-`(wY^q$$C`{uAZay2;5lgMTjAo&8eTg^SrVq!?BLCIbnK5{XtlqcD2hnRp8xxq!D}sk zVEh@fvtqjn`H$)4=I8vbKZ@fGqACc;r{!%#_tGyHs}wkJh&BqVY=(0pe;8uGP4swzVVQ}qGn0; zcCJERNs&D+pDwl;y;kGu>+fJN4CF65OJrhT`M0ArIviT*aG@Z#Y&u*%pk&$eS%@-N z2!{nIC2FyAZc4_8wYOZj6umdoKUTrF`wVV=lGd`Xv~mou+VL9yoFEmr9T@QSh6VU%AI6XTKs>aUi4zQ3SU zLYAqh%gRe3b$sN?Bu9QEYXhktVL8=!IhFHGNTA>`(SLlgO!U9rs1jX*#;HK7&d{hj zfTtB|ihAUc6PAMsW543;J#@8;)VO$gfywL2)-U`Yy%IP#kx8W;% zzYYSaIc0OZ!a5Rq%@-m%ZO_UZy-s+f+)d^;|FCoj2jT!eROYwfGF`E8uqM9&6KxG% zuobXAyJp)9|nck&g`7$^yu(cC|^HLTX%jd`Qm2-A$*9*gAK8LjCW^_%_k#@t5 zV|u15GX9h8Do1zs*V`Lre}NIbUZS{#^{gRe*u|$Ic9o>d&+k1$*DF%jOCvDu z=aJlR3QEc@ALi5bXyFmQCk_coNt7nKa^0(e5mBK5;^{1$lSP~g&d$w)y%GchUL6gM z;^Ojl>(uYQ-Pw+30;khO0qx7FphAI_e$;qm!D;c2L; zGdoTo5>uw+VImSd2(O@J{HfLD4b{ce!{vk-~v zw0#5w$f#TvITFgV*`>~1t<@d>Ib6Gco5~j`9Miee=L_QiCNuKc7dmx-u@Jg z2?-{)7DIEuaJ+S3dPcGVt#?1&2?~u>bh+eqVV$2*_nOes`A3M0q)Xc#4_I&o}m-jF93*PhQrtW9;*2dT{O6t=^aH++s z^~7{iqv1hXaBO6Yag=>Z3lV(G*TbrXdiC5b4=8StQ zHe~tuXI7+!+gd*MjQFZCBGk|ELSPsIR3`4Jk$tmySPuTd&K2mfj;@L6FsF%vM5*){ z2b@oeV&uX$ zocc+21d!Sj7r0Eadwf-#8B?y`L4{XrIW1v?S9S4!$?}9lyrOvxo>O zoJE_7Q>EQ@5=n_NJ)$$5j6@0&{5?^IA}_Ls)Ju6Y`e%gS5wHF#bf{FtK3jx6I6qZ8 zRx;TYS9$lcV@$>y7ZtdEj7*FP>o+R1@FaLRnE@$&Cto^K9Ki(^y}Fe!wnJ?c_qMnnZGR2yELm98N?~hZnW2YKiMbH-D02)m*p`G+ z_9}vX#BpOXEjOxA*rM@SahIqp%);@uu|Up9gnw=Lj{YtQl~o{Z7L3Q3OpkduJ~}#Q zUyzjce46ekuC5Nb>pa;=&s}v9fr{nB2z9~VUzwZ3=d@zDa1vHlQ2514(vQqx8p3{1 z@>dd`jd+}@x;J)*-ft9{^G{Pc=pE$4W0bU#r&T7TCKUmoCS(?K)ys!v>6XVK`;7L^v(O7a-<;OznC#EM$$X_hd?&^1>Vg?4{Ssy#@5vQr(<`jH$uS; zp8NTJY55pz&HenH|F0r%X8jIz$39w9qvy3qsXHBi!XG;*Iqvo?G2eYXdp`n51CYTx zLQb7RFkqKU{e2V_Vpm<8z?sF}3FHu2Uf4{t`XJ zG0Elybvw|KUQ#+T z9*I!Hz2#MtYzlwQNtnHeUC-9EWS5CMav;tLh9Ztes=qmm3F*+GLd4zyle%-T>?rNO z!6LGF?&XMno~F}J`C93j{2vxj_yI73wO;Rr_?&4~H={>> zbp>Vf6t@@YqpQ{`%>b@g0t&hHkaseWE8eX00GWmdSQd7foQS`07hF!i6E=EsLD=#E z!f>~)C*myNdr{<%kQcumF7ltDp!`0=;@GODvKc6ovw$|J3CFRm{FH`7c_vh!dux_t$9}}(}^~x8x5IFMdi@3%| zlP08a1y&bbAQkVyYS46nrnsvo%q52VoJ1f5=9K0Os4?HzD2x%vlya*7=hq#~AMC>+ z8t=A2|D&){w@xjxvO9vB|c%)r#N~icVfk@-JRoqtg?fF55e{dVvtRo+bpg?aU2up5@XeX!q z{TukM6=3g%2NUUcSMb}V`HI0c1wrvU*1=g|cl}Xw_geJ$F{`FnMRNKKRBZK4ntOH@ zCHw81z66)g<70!gVvb1!VK_{G8uDUU{bqZmyERA)R~&lc!`VYmN8-@rigQ-aBVGUokD z811pV@6HM7kLvEbTd4`{fYq~-O0p}ZeT&ey`;$ZF7B%P`sD}p$pUr3sm0~Yjhk!op z1&FxX@qUlp)jvI-Z3vadxJ~LUZM<5&>KLlv<->zFM1d0erH3&P&0xFCLiQ7R)z{!% zc5uzMSXN(UPb;YvI`6NV>%5sH~r|A5YftR#N|u#4aGLF&%8u;ETy#@7Sap&>Qx z;@BTx9QaL(ECc?37hC-Q3LnQIZjv?Z#m9i*hKR`bZiU0OMO0Sd8;Tzoj_OAO{>FG;T=3VC z_P34Z6c*mT4gmwGSNqpreW?2RK_&sll+FZ_yIhBjC)l&6?ySK<}ju5@?cR$Y;Hv z!C(q%)qAjK+KPbRa@5GkoXE(C2Y+F-^rdqbxY%e4g6pZ-Wb3&rCbqtCoW)kvoyH^} zsmRd%epIodXINawbEMYz<}?_mVnQ~rS{&&N0UDCSf#%7XlbRVB74?j1Ze{kHxk;F# zVrk8>EuI^v(6S}giE<}Pf@-&QHpHe~8LvyC{5GCj@`c5}ZaozN_BQn(95~j^eEoaxjaHsbNH(Xu;+-@@5grX( zQ&iLo&{CaUSqf0VW`vs_lhaU188`p}K7FYwji>CvI5B0ZTM|CPw1+}9#4<+=x{g>} z3!~E5IQuK&G%SKcX+2UO1$RX&@tI2J+j-@}@%$26SoZUn%XZgu8s=E#nQa%cxBk2@ zZ=`Kup@F*Ct`wET4cF_5PNpGXsZdc-?Jc1~tp#}u7AbvGt)sp=v30GiHaOQAjOmda z$#rjcNfkwAY$2em;`S3cSFt*FfPA01hw-3Zks>-d0v^POOe9^Sux0y1`9MX zC3^sd#|hQ9;IpB@ov8*k347o9!L1djJ7_gB;hZiO+LOyB7bRp$NwZ?L<2xmd6b*8K zStwl&#BF2~0K1Y{X&q$nyqmdQw{{2qR$Bbi-p*^Z6!B+uY7alBcV_*~noNyCkKh(8u zKCzu*^wmW*HPtx=ES<@>5;!T*nF*nB%j7iONan^A87DikpeoB_r19Jt)*YjxsN*Xgpk`tKuS=xP3; zeLt+hh}?b2oE`cwJ~UtZ0FzvW>FK91S5{#h?JK}pIWbdPrpx+42ZHOn0~nc@3iM|) z@8o7iP-`OFN?@;A291>`C;q4MV)F-sKPBDAk;wE{h3haGN~_uN2R8BX(%MG`NDj8jJ=d=eCEjXlT!Kq2sO0jHt}$WE@HgBoi0N6;qm}7D6<69?nyxc zR3N=73}$@gXr1wH)d%9>Q!KFH;F5pzb_9H9G+vi2{(kUdizPF_t@`<5J6et+Iy=@( zDrDP*7akupr#Akt;Tb{$;O&2Hk3RqW ze}S2=H%2X;ojkHAE#$#bxlpM8K;!g-{gv4 zB;<~=*?f*yo52|L^9{kMx358WjQM>Ar%;S+Y-bxS&w2hJG_;(D{JTQf{xq4X&krId z9wz8HyoP}$78d0+JaHBlR8$0WrF{fA#>PiOq@-RSx(ath_sW0?D?{SXl)rE7R@Mrl zFAx_y?Uywpv8SMdsNxz;Ou4s9sVL-8#7#m5p!EnsF86mZt+5N^6S^&omiZ+WLKFmy zYn<)~3OW7IfJU~tWh+68zSnyU3|jT4n>}K|{L#>XI<+=~^h85`1x3EjHByCK`$)DF>53xa@o+@8x5MwF*l2xMpxeK|ccH=me( zAq(lilr2%p85UNxOPZ6-I@Gns76u@wCn(}m{6JKr6AEe5?!uO(NV51;_KS~%&7S8fzQ3yjcRzWNszS%7dF5;X^nTJ_)Wc#YXV z#_W&k?e+EbZQ_oC`JIs}#Z$UHWDzg!z>+lkqj6wpINISR2tbQa;Y;DIY;7aMLE zX2E=lzn(Gf%hdQ1GHCC+=C=r|KvOgV1A_L2EhL1Jw6FfLB%;HaaoLYU2*4PALd52d zZ$$8&5U5lE-6P)ZK`eiK#{8}kduFPtiq5uFtTaW^ncl2aO<^MoIlC@kc_1`)vnN-I zB8h8%daGkZP*6PD%&z|ZLZmp@T@qM|O8|3^E_>wWc6x4*#AP}H&#yp?opMn?`a;Ak zSu?!j4G^Zk7-D4geXpr{j}d;e_uh)f2W({e_Glm=H$fNU2>HnX=rG~e7^axe!`d@`>T;P1zxsNJwdT6?_UE{ z5EPvS%iw9IU-B|H7pXP3ws(qz@;z<~$YKQsu%XF`sUf6A6f|M8$l5i+J5k$JnnP&r zb`nuK#;q@|ltz^0H^|e>5hH%x7_7+Lu08tI(rW!p1J(}@UTN%3u|wWDvkgI5!*Y5g;ozA_D#SmMgPfoO2AnrNSZ)0UX#%51GQi=dyFt3u>(^!!BA01;{dY z^FEiCRm#fDeXVz1Pv#D6w%R>paKC}s!{On-4c$4C7D8u5+0?2dcaTRyBMYpQr3gHOFYg}D~JuF(kj88%(QCNQmN#^e1!O8(8uJPf%IIQ+=dv+ATSetC7#M#R9@ zHBU#ipR>ie;~18m>@J%5b;axzh~fxZya0%|D_NzDD(5lx7~Iq$x{k;~L9>63J~dlk zcF(`|LO5*v{^U zM~$0#n*WCdv>XG=Rv&TLxZv!3UQXsp<86E)2w=HTDL$X4R+z=58FA|vzo6KC-cz?H zT0(TiCA8w?1Y~P`^OS-dA)mK z=xcV=pLR{SF6_N{ZVq-GaMFw^lHhAKed#&fB^Jg7Z>c%#BmLfNJTPh$5K{yJVaz zsdC50Jl0V2Dn@^b#fpVis6S?7Zx1D@9lgl=k(39P)9?i=@q3w=&v7sAWq|)(O2dQc zXe!;%^>qlvGqwx`7nWI;E{Dlh)d+cF*w~I;rGFSLbjNE^Dd~jWaXuhBU#oe_4nY*2 z{%tfuT+z#rc~#|#S=0%YgAMkQrzhibIR2LG@83Zi-|GB@6G|Igl@JDALah{Q5f2ql z8BL5#;`qf|{HKdS?FpXYYGf`2=IQFJ{iZuHn%o1H^|h2KxV83PLlr%yy;ir?Ix!O^ zv0wjUPoebd%7Uz~W6~54bHdsf5I$T*(AC>KJUCpgF0Td&KZ0s0s^yL%Tf^dHrL=f1 zj#ysZ!@poUS9A_Eqjx&Z+pFkwpW0pm4(oPgbWl~}cuLq4dS&6&&p565Q%kwsS~Zsp zUf_}ll8C~4qt5toghE<(U7s%8IXQV6iN4<)C-MY9+&VW!B2x)J5@kI&RyV}IY18;^ zhwh3B(J|X5bJ$lIc!BA)Fk=&L{W)0C0V11LU%Sqm^&(-g>zi2dy$Vg~&DH@|L0?55 z1-C(UI*HzgDbLg{c`0Jin!b>-xjsU9ghFWx?NBHiTpcU1o3WRy7>9#0jv++q{%Cma zl-`3@+SNAKrr!8*rrVb#+rVc%Y84ABH(}(R#-8JP?;e>tBJmMHM z>odI|3-$}l)bAKjlxZG0$Qz%+>bC1`-lZA`YD=YoiUR zt=6>-31U*W?Mmm;P2=3iYzlUF@wUQZ;49&5p*9QFO>c3@g0_RlW;Dfl46S{H$^Nv_hmZlRAw7(022pZ2d{Aqk8iEu@K4Q&l)+i2&vkRW z31aw3uwluYBXxlcXXD6OpSD|}55S79kT%sx-vd+;C9FBkX@*ckgX7MH$&;zC4vNGn)oQru{ts3fWRs}u z!qaVR-0j?$5v24KA>uj4N6Heh+Uy4#pW=i42P@IkJe3v)n5wF(2a;np60AMoA znv!(S0`r&La+*5?zJGRW^XXjRy=QWJ!nXO-MVrhQxE|DMW1msoNL;ShRF|M=N5Zp=iiP-3)bw%lZhC`5=v2A|^FPkgJiFg@_MRd|4o}1Hqr>cTQgP>$4qPyDfbGA! z^cT#s@J)`jRdjOlG!sS+xjZ_s2qzj36`p>D4c6xF#&ApB)FJ4g;-xUG4F7a6!A4KA zINJ@ubTbVkY8y0(&jJ+%QzD_VpKyw8N)1X5^7t#K)xMyI)8domw;^tY!|tib!xSo* zVB~JBwwzO;GFiJaxVo0rgqz=llz|)%_jW9h2+>gDqjvS} zsK}ufh8)nA@_%bPQP7Zv=UJNS7?%)9XQ#GIR%XQa^f$wcKjL;l`K)AB*P2Z&4hx1} zL`SUm0^)zgS5YYrN~LuUppC&Glg)t4D1eoc6DPia<8OSjwWcL-{kf9{_hCH_cl&&E zPDcdhvwO^u`uC{28j46orIpdHAX7YoZ>OWmG|+5a%Zdj15II!SXv;QH^Pz7P5}6{x zNF_t35-!S2(_I>eoabxRy)M=b>g&R z3>_>&Uhr{1kxFwaCL4}etl?n25>p!AWmK7#$@+sYdP9Of1TH$(C?1V#I*q7R)qtY{ z0p(gsq$u%|F*J@RHR3QDiHx3ttLbaU(L${rMzN^1urOTW(qjOa%aDBucP&FJ0;RS~ zGxHteGmdV*&O+HXQ#9RSO{5(nGR*|$yHOCj@`!FvOtC#k*ht92F|aZPI8e6c{D>$W zWD5n1SYlW>rVTIH=^_HNH=+q{f2bnIptd!W6CECh*xp7q>5_3^lwm`?XF0^8sSMd$pIfjCZpnfV_wiJOS+`T#KIyb=_!E<9^iSs{TYMD4XoFW3FByT z-q1afg@JE0e543J3+f_16nB?+X_a}|N956I1U7a zCjXm`})|D%wI|N z&G-=o@hdXTx^yBMCN>NHg z(p>o^PCV0G?Ohu8*KFY@x2g1T^vUpaD=KQnaD4`kEvOfmSDE)#7cK~f$n{fB62Qc; zS2hAFR>*slXUq!cdd&t2MsQi?S$vpRCXyG{)}#fEISWiipKT;ex)sW&+w#>W2PH&p z90N%khhDZLE;$ul+94KC-*mJC&*w#fDrnNDwnfq~S;M6>WLpCQPgUk7? z`$B}_C7hdh{E5p!RL-R_@k7^{Ml|lG{qb^Io>G5(y24&u)xNMpf(d|QdyIvQga}+V zBQ!MoSuGMJ`TRu3D){J(3~ z*ViXf=*~7uo*U^+JL%}Zeby2Z_mHmbP9qqa?sdAyr7ya+gfwH6)>sE5gKI)Cxu(>P zEZcn@|73mdfu>@yF+YQAis(-0sdKcgVjc<4M8j8XQ}kmw90(*lSwlLmU2vI9u?dxI z0A)mRQf(eAA3w3%z5er5PE7Yk3n!^jePvdtT0cm$y<_8Sa#s9r7Ntv3t~`uMdJ@8W zJo1E8eL9c!Vw&cr7PL+>RI(MaqkDHO`|}=cQ*XQUz=?V^6x;WU@;faoC;_BR#%&e& z_7nVAo+P=A)I8}a3k8Fn(dvg5-bVyY&2td|wa{mAVKt+J2B0UK)%Nx(Pdh-BLmIE= z;nTS}P)dGo*UkFQ(E7z&)U41qAZB3En3@CU7)(hi0^8*3{2BSFrQ!ntW^;rl<~~AK z^>r0mSa@LGeLITbx+zuArRqTa$+13Zhewp(@45N+fHijj(OyUhr=A7#rt51xp@}Ui zt8koBUj+k>2_!FgEi}gK>p5Lo2cd&0vPyh&bT^DPb;tE?x^vT-v*t;hb2U%P2g=wx z=H%$`z#Iw5@95q=y?gkkdB5;mORc*?VnXUvPPJF}v6-Y@1vrs!w>wPODcB|P z@_fn;_{yz^N!2O1N77%`)>gaJzn2d0DHnV+zwdkfKf6j~h6w~CUcA)0Z#eZh>FKY1 zVN%0f@Y(w$Z`0&k5N>Nd8Zr!#2~bs%FYcHPU2V9{8?3@E_2>uoOT$`k;1;?Riak9! zxLe!)ZN(*G*12C=2!tv;lC@7oCu1OJXyr?GseiytY`w!IWW;0E+suXh(WmBP_Bu*R z|8VZ!jv=NE-wjU5D{@rDFLU~3G#ole;^{yG#m`7Y6aQR|GS+d-W8)^bDWxf@O{7-3 zPIg2JMyF+d(6in2-LHI~Q2a7JgQ}2#iJZk@@81N@Pf0>kwp=3vq}Y_L%+hyO_J|0{k5ES)))AZgPmEEK!?DlK z&KqyNCVTn->u4@w(n-(73%mW!*U}rb`0tPgjB2jOE4sO&$KAdGADKY0=-QTZbNxAR znT_|cF%0@)M#XN0v!4q{I6`b4^#?2NQg6)pSA4Yk_QUT4+LwQ3hmpI(<++iob$|-P z6VSgT+uo>HF5EbF7psBA!X!_D+V`9_0e4ofEgCBvHEIOOKTP zM}Qigi;UJvPeu5217dJ;!Q5Xy&B9K;C-+Cq%Zh{tmQC0D^dZ;$s=`VK#t`Im1#%fW z(&xtys6YSxUqD_a+gAIsm0C!vWa_Ob#Utc~$p;UDr=_SWae}>-Dc))!EX{yV4zrfE z^;_RS+(i#}=W<4*pmHD`t5|ipS(*Qdtt7Gc)d9=K^yS#Q;J~=!)ZhBOXYWwgP?&Y; zv*MUUcKTf2`deS?ETromdr4us$OYTE3}xrE9bB8kn5K@zu$ZYqXB@!#hpS^epP2h{ zbCZ>BX6kVec5H}HnXVHD9SRR`6-$J|%p091QoM>Py<1&XmUrjY6zC41GNXg7I3?S> zcf>SepPTvD#0wUvOo&6{rS3n~ypOZ0!{>7&z1Ey0tNBe}O<6WongSeCeSL11+gi~- zt821|XFZG+Zr5udSfw-D>E1dWMS;G8B^P>@Nf|errl#CeO`qEZKeDK`vc99qhHnrq z!=G8ubHEN;K(&AD< zP>67zY5k_UTAEe4qldT*9zSjjp-^g#=fv^-ogAxmh`7uuzZQcu7)*t8sXb16K`4}W z@hJ5XIfQNb=Qt6i)mq=+FsFOiNI}3Ad zttK~aCue456AGmgl!u#lxNL1rln_!)^z`%s{r7lzP9PMD!k}Ydf8bse9#SJDoeT}| zWd?Cfnj2b}n>>B-GXCb>SJ^cmkeJdqc$Lk&dgIPh;SAG?_;Y0fUoiZ<{`>qmoN5i( zMfn(M-@e^}zwZc@cyCu8Il1|1&of?RWEnKm zH8yCfrl!VHS5sG4Q! zwvZxzU40%!`7qF6vGjx(8yofQ+k4Q!0hX548(T;okX^Ip&EAq-Msx9-#7%4XvP+>* zC?6J(T~p&`%F0TN^1jujrlzX;UyL$Np-?CvEf7^zRh758)QFg`SA(UNmtR0A6bgk> zM?h3H)YasErKYZ?l9yjdC=?2XQb(W{3ho8wl`-b$%~xvh?W!s(VGlx~P$-l-A~(N4 zNuaOgvcFPesl&Hh+o69c6bgkRqKMB|Renop-}+nveQc`AukUgn6AFbwq12i?+{drW zN|lsEU1*ioE)n~1O-n;9o0s=0hkgu3p-?EbA}gDhlas4f;n;mM0K;3uoHHI?ZI;rF zq+~*&P$-mIaPtnAloeNWq=^r6uB4xFj#XAUCfd zH@~2`q*PT!MMql;W-g<-6|$@JW;791rOFkN*~{z-omNp*W3kjr1(fmf^3z{t7ZveK z>9{i#3WXvDbhe2Gi^WnaFMkcgR8>`=tHs6q3g^MwAVif^+PMSaw95R;tXBLIrH3i$8Y*Rax@yvgD2rB@IovBkm6gki zi-apm;?XhNMduJ9u__);p-?Cv9P$KBYL)p@lF(cjq0gUZUcQk6`&U{LRb|FV1lDVL zabdo?hL$jj*CNkv<&h%yFd?$+WybiW%1fb8K3rrfn0T0&!CSc?G*$C>*=LMMZ`g!7Z9-_b|k*ScrRpS^PZ)@Y-M7st))q-PhNh(UD%YTCgD52L3vrKaK_OqM@f0y|5n7k+1MLHj+y--zAF>7f=YDdb`7sxkqTAR6=YYEK`1(XS% zK4#cfQqGJYD14-GD^*pL>+ptVyvjACvRnCEP*hAruNzeUTVc*JDyyQB{xbjioo7nQ z%9XmT%!F5nud+(7?rmDN)JLVrtiO4aL1g5LY+eH_>3Jsi{gEy!AjyX=z~*zp#)m_~rA})zq3BHe>5(lUifZ$~1?Um-0NL zq@+xc$0jUfQ;<_tRq~%fvqO=l-aZdiRaI3}qaUMIh@PrSxssCj>tb&NQy{Dr0;{6L z{8nyJ5{fTTdSmhmL|7!4RpB|i6Ce4^YZ2Ug}00960J8B?C00006 dNklxuX47s4+IVF6|Ltjlb0ZIqFX zkx)-@4tWYnk)v9FSY{wr`9O698HA_^QP2W~pE}}qO(IbvseFby5;W?+pmo1Qe?#m4 zjtUU%8(#YbjekV$xcK7MVxKdDgDoPQRpUKf)xgxj)Z=lSzJ+m=kbtBpprL_*Sa7aV zre#d<6ORIQG;n`8WR&eqU=YJL@JPuAn1Ya@H=@`J$P4=nhAP*>AW&akQ&a%6lGit zCRvA}u)NA#Z7D!&ZIOoWUu&y6p?o-~uYrN9>~|)RukChb=Vw5FKA~WqJb4n7vT{-r zb4D4P(t>$$aaB=XdAZ==qvkjeQAa&9+mVT38!4c%V0Cyb9zj8?ZE z_j_TX=d%Bkga4n!>qv+=D;-{Bs3v{TM*HJbwf;ja=shoO5?h?QpApNzl~yUQHuP(;gAuQIzNF3 z_lyy$^m73d^*<{;1*MdDZli(gwmS)vQd*234n=k5!lntb>gu&SDfb)PA z{&WjzI|&GU@>qB7ROuDZDEwz@F8#iwmKvGRd#+ze^@jEn107lw_0)tFhY@9-_vfJY zhnkYmK!1OhH*sM}4;*}~xX1VA=;-Lt1VfPEn>{^P4PhCuhM1gcMH@_ws?A~cd&&C1 zv|g*Zaetql@FB_Fm4w9Dl{A;ZhwjbSVOO2|n4|XoNfXv+=za7 zoKb3>UbH>t!~PKTJbqG2%6{`M9TipNVir1`9w&z%gI!<0p6?d+9~5cwBvJmh%jN!E zk()KDny2IztJRln>Od+rk?wHm^mkt*t`f4K-vP ziKLSJz2SO(A3VH!v=)QrRt;Ls)@3y{HAPGOfg}W2yMSRERO>Hp@Zz$v@+&qRhuLx# zc#07LYnLElZM}y-#pTppLe=%?O4QGq{!=NUPyL>g=;9Po5oaRhJGZ{x(c8OU;pdkr zG)!+VzkhbU^Bo}x2?=1X_?_&AbUxUQ>x+v?-~PCN1MYFG%bVlSJ;~R{3kk|N_WwDVM98$TAuwXsEt3 zX%1|5(O7(E4ZL3n9wU1NaM+JS!%BF)nA952xMrQ+Tg(@wy3(7xEK7bks3P|M`U@dAy$KDs zK@5((Af&i`H$hKev3^rJR9C(Zl=vU)$s+Qt+H4A2Z{Cln9+Ns>ZC~6alC>uCP=Bz; zVsx0@@ZRNvgx;6uF2mGf8E!X`IYQ*1=g9{pxs@%&e5PF#h8&9NB%aiQLLcX_W4zuk zQMGdA^+&mXwHjjhN=ZrUqAL!#R4mD9eeDPu+t%v6rqx_oGI;==hm(#N^n&KdLyH)=_V~ z^*Yw3M!$Wl(rT)&yC%XVJ$$;L$axjXY%v0F__5v5XulNW?Xl0=P*Ej&Cp_$R@icyLDof&*(YUqprO=j-mol^nDGX1mHt(eZvQZr1DNIv0)?QZMM$ zpvl*gMw59YyYFh~-YoaYcCNE+@V83PWY&a?HwcN%N^@0wU0z*XUDh2Qk0*-o&w9@a z6BAP=G+hKJDV`y^ldXltSQf{_yk3v0lF`uc@E*K}(fVRdc&($O1J2K-MnZeLXN4+Q z7~l8pCJ&E!4Wmde7ck$roWi}6B2|Q5XZiCV9Gff9hn|7{m~210jb>!%L{b^yyndi4 z^dyF)e5zF1kdQ1mZVwn)(HkG|YV9`3L*NkNO>c9Gk*%`)fdRUp>$R@LA;qoxk=$D>PLAlmYQ%fjJdYm?C7~hN12qi|iRS0T zA-(?=$h};F!8fD2&`{hrXWV+qEIuwTty#4$YIg)k{TFyj4BC7;T<;5&xoJv^{ymi< zO^0Ut+iOQ~!w+@(eu-*t%3xz4VS-JGaJyZvdj4Gdnf*X|r=^iYfm?Q%&nbRZYu8;W z4!&Xi=!y&gSq?QKmFxff#{0zO*^fNLR|o`OYq7CPNJt=bP_N3(sETfy`E6(Fv0#T~ zzi|YQak4MFz6RTCU^L8bq|iIv`{Da zM^p$J&Ze@tys*W1Nf#$ey27inWGelIr=M?;QU9=4dq!5wa@#yoH4BSe7a0yI_xTK8 z=|6M0{QNl>m0zV5h9Yu#eLJyyRg{(OcWUi_`h*CR4w%e9zFR;aPVxnZfDU~ZYOsLh zKzm{BQuUy$FbA_o4Lre87`J=#jm8JW&ook+G~_zT$iZ zQyr`g=GN>OSbL--1?|KOM*b;6?=fE)xPe6dYb8kN-AV)l^O(!+0|j2EVwWkASn}mW zDy+(VBvB@;Szq65z|B6uE7C=^P7%4>UzEC|DLR$BXpp*n5fnu%RjPC$I-(I zH{;daIk*k~s4Cz7Tpjazg19wcMlMxV1fPntwbV&lh1`!B?wBlfkA5k5WbwJV{(J}0 zXXBDO&T$UoNfQ(!QVPf@MMM}>Zh#2?>JE-43Yp4c*xK;&3y@C+fylk$dWv3k45y#8 z-D>BA`_d*n}%tD2-5w>MVx?P40Iv zH7GnAg2U*3+u8Pm{1ZqN0I_3gqRZCpNOHbEWKSJccIqC_uOM)DF?N01HM|p}({7B| z{EEYwkeMlEnKnPpPxr6QXvEj!YdzV;N-g$hTt+);y%DidRzEDfnf}>pNLL_DGb013 zYygiNNtm^?9Pxg~&nC7T6Y>WvX)5IOC8>@nEpe8vF|$YfhoE&=%~Gw0eY)&RRYiF(U7`a?C( z&t`idL>GCNrv{=wN7xb@i*;!S2v02*H~4^ETCODjA-~0R)2gF*K%zT|F>Hl;o z`h08*uo@(RwtY(NwLG7Kt<~POG&VYmgCROoS#WT1G308F2EK;f>`Z@xT>~{ToJ{@v z=GmHb0k}4>-`?sMs#W@meSV=3^gJBBdk=l`ipB5|XVGPoCqiIXpH?dXH}d=C9oFT^ zw8a*(GH)!Alo5@jy=_-#tNXxiwP&Nnwv4kV`D~@-rh04pbTAYnk{G|d_BD+&5aQ!k z)rU8l)0G~3Qit<32)dYBodD`ARqJi&Tg6J{LmDq~D39MA5YAm;|8T0v#d4L`%Xu(6 z7o6MqW*f3GV!W{1rrN(kDaHEyg2eD-~K zUa`?^v+OlltD9Dh4#7-()k=->jgiPX49LEFZ#?1vP98Nmv3z?ta`!z)ZR(q+jGo@j zZC>C&C`bMheC(}3PoRxVl$9F+`?2rNC-fyX%Ij7~7w8I)>#D_}{VC!gG#ZKK-S6*E z;hj-SOG`Ms>rv`hSJwng(!<`LFuZqfL!*Q1tqwc3TE5QT6O^8CKWryjuQ3iH+Ca~0 zOB7X;C%N#t4eL^3V&IJN@#$|bdK>MUomcbz?pJGF$h_v%I~_m2LN??od{Ov(03i+5 z@()Z=h%OOO+;JfIvoA|^#`2gRSBo#x7BGvvvNDX63M!n*4^el1xwtS+?t1YKE5H|W z&%Wa%B4XnCYWgHllWMv%!(%@w4yI1^Cq?+H&a)rQ{;-tK^i!A+=5fvxQ|177uuttakoQ zf9x;mEgpN9*qzf7t8FJT>l}Rs?kyaT#+Mup$nt1AG2E_<-f%PKA=>PZLNrTcc`_&< zcp@~OX4lGXw>GHn@w)JiYuh^){GwI9M0V1H!Tq2zB6Dnyac1TiITv`TXL9*Mz2*Rc zL44Dwx9~>6yp}DBLz-GG4o;}zRM8?Hr_23SgggL=wCJ;bkCQzKyfkWf4aprJ*#qL9 zKQ)ByCd2LC0+@K~>+5@nsk7n6Y^P4lz6}i?Ep|HsZ0ny9H}d32m5-WTfCz)Sw4!1r z{ecD$=!?2FwM;yHS`rkhR&{`W^WscRjZd4tOM5<_UVGW=9eg4|cDa7MT;XyUs!K?m zB~vL#MnvE)6bA)oT}xEyU~D3Fe+S#Pbang$lw``2KZ)_Yy8e$%fZkp`pUp`K_}^V6 zygM)g!ha|c+0x7Zm_wkT$$yXm6NRz^Ko92s$*&awzzZJfI z02V4)2LLrJ`{y z2cvZs5yDY(BH?pBogMU%*>c4&yQ1^D74_!C?V{EA`V`v}7cD-;fsJs=Y(1I+s~Zs! z0aytvH=F+Qn6N`4LuP_>Xt!^NKJyJ79)24$F~P`&uo?w%_P>D?4Cj7Urb|%OXz` zKA(@q^5Un#QbLy>1}vGWPMn9Ib%`aBky6S@$!^zA97qVxKYIn&I$RayrD6MM-p}5> zWlX^D&jzYLkX@&K`^>6N5BIUy@SN`CyN-`Nomrc3rdOz_D6$}-+U<^2sU~d4yLKmZ z7p8LTMu=#|PL7V;b{owo$NY@!aPIkB z*zr#-6eXEhSbVxtR$mV_>UZW6yT#N?_VHFS|6rY8ob3++LYg-zUq2e2H*RnFE2e5g+6X1$0L z@wuH{Pp@D9JQHJw+f@KCV?(`z6C5_DFC#mMgHUB$`)I`qQk&c@e%xf5-vKV4%(~a@ z=+G!R_gXWl=+DbRd*kDZ!_N>?y09h0KF5iSKwt1^1^6dW^~jf*;c9VPOtU*oyk8s> zJT4snx5qnmo74#$wTg;{9PEU6D&sG~%J-Afdz)X%9E3XUZ<D2~dC^{P2 z6^}a#8`+^Y$RkQ0B^5=Nw9H1^$jZ#m;Zf;@Ih*rtBeKZB{E`(r?wy#iJ(d>M>5tbz zO3lw$0a*YZk8gP-Afjtj*jLo;L{g#YvD-;Zy6?|-5-XDv-t?65ejK#gI^Kf|Oe;~6 z@7+1M$j!Q+uMZXZI!+I&w0fR-@VYiuYJ=2RF=@0)G_u2v9{gm~%aDNl; z6VHdgFv-BSZ!4F6%IWpKQf5&@C-xNy{``V>k(`vI`njY1DWMIzc61SLv{J1-SlM5~ z@Umg?!{&!}U-2`x5P9tLu~2`r(@6orfllG8%9puK-WZ10;CVGHv%wqSaq|5+p(UX( zXLT09u_Ns<>f`w6j!=daUJ>b@_WB2M=Y7KxC6dq0^WwBtjW&mE!s-6%)r*{u9e;0I zC~2F42**#ar(Uim$M5pdH#o<)cy!URiVUIkN>>9^Qp1mC>K5rxsx-*=T*)V za%1RU$p%naZ~yR;RF9)WN=C#uda!V{Hsg%XCVHG~7*Ks*=Nc}8(k8~Gh=53rZnORL z&(zPeYkybT1sjQMPquweRo&dZ$W9*!90YfuCU&aT!ul_as4?QDkY8VzhAVbw@J`H& znR(?Yt5^;sm`yB#LbXs45hK7e%6E&bUu_fh9Yb_hDKZXju-rJFEXQDQ!xR!@Gd)jf zj|=sn=J{8v7eYZS$hHUjpbZFPmDaeH5Z1zJHkxNOdQFF!WyrK*Is@5=BEac>!;Rsk z`SKw4kSG|Zuc@*Ftly0&OO)3Qr+M^`P1iU|cY_L`+g-WlJ3Fe=WQ4MwqF{s^HVIls zIxdqmGO@!X9dCBq{8R=fs@tH!U4J}KW2gA#)P!`lOeVu7t+$1)jZAN534j$M-L6OL zuD6h9YR)Tqt1Whx)f?Bh@}cY5tr3i&7hFka2v zy5Csl{^VW+15MV|iQk+J1?l=Khp_Sr3Iar>=N00Qd*l>U4A4-*dsTzv85{CY$F5@$_D35c#`sjI^|tZ55)|E4Fli@2mS8yMoSf^L8JM&2 z35sLZ{}dfK8R5^<^7jqHfy?3Z2r~s}r6^4r$m9}VK5&F+mzI|Uyne6C9C}$wS5KoK z-=bRiqQWDWaKY6D+U?bJbr%(x&{OLh^lGv6**xwU`D3+Q4hHLY7S#1GW+cal{q44u zO2WJYmUq<$71N2lGB<^C>aLNoBYZ*jI5{S-5a0U0r`i}j9}}ab0G%z{B&SYv$(-%n%J!uWjev)}JyZ zC}z?#DX3P*|G}SoZrUv3*#w8k9RY(qH?T5VgMt%ko+1Eg5U6$Q)W;=5y$L96JMBVb z>#^@`+JbjC=L9US4_Jd-HYtWHCb&>79O?d+C@Kx z;MN4Zp7IIo7K@+YccyxW4^QZJYxq+VO>iZJ@mao_97uXNFom?-uEc(raM9Kyg`biA zr*xIobLya}(8`OqourWY8P1NZ=I|^)cGm{lXiu4?WQ3d!F54g$du0bgcL`uI%_DV6 zISfK`AUGq3@w4s<|$t1I&1GBPgy+v`^giWq3*#;<2ZP6tA@_dT$x z<%X|YA{(k&;k^G3qoQO5XFrTN z@^Xr6HB6PsQ-`MD|b z6sqn13JE-gC}982F|Bl5GB~RjAp}-SU0porTKQ3F%!9BnCS0gW$Q>)GoU%X|fkMG^$XV-C$fpCEK#a~f^E30SKmN&&YCfoqp zp!VXn;orXx{`55ai2U#mT_54edRP3&;MQCRrL;30>CBGqmgQ7he8AFowA^zf*$dR9U9I#d?SfvKO^iMh6nF58+$imCr_Pr zB}?Md=b+-N#Z?`1v&cH{eoV!mw^O!;jDQN}0UkbHO0~n6 zA#s$9Fbv{f9T>L$0FH%p2yy*~^d-JL^qx$PWQ|}ajdNrS9!GLcrj_q@RLH>rANjd9 z!pQe=8kt|@Ri`pw!JVDliUb`iwp)0cH56X;7jV*HKQy0rCwSYVST5Z~T@1@xVtHMRMR4anyET z@>?(-&&HzCF5YgOTO(M+UZS%&C|ao7hP@9X6oI-Sx+ z4hjkk?&``@Wc(^&mJv-?9ALXLmCiIbU9T=|MEMOBQZO}rw%zowI!Dyl z$UIb#l%A}^!JOs~*#8L`-S%%T&YSJsKJtCI`gV_Mf6Ikx@A7)C`!8&-s*l4+u-8?1 zlz@lFCMfB`G+&r)mksP4_*2a2Ij*;SnVy5dy7ci6tk`Y_MW-h{W*MzNM=A`gV`8ax zGi}ju8X3)|J1MLfdT?-vj{+7Mm}k49kyOw^g?1-Oa!$@%iQCNPW+!VEY*q+t8SB+A z@SAl%aqe^gKmfcDpPMhMw<|TSa?ouBserpiP!~73n{9D@zj%|M+CY!ZYR`o7mc4rgLRlsPuRqK31X!uX5P>K4d^#A z80coJX_<)|bRoJzmA9F^hdmx251#MP!$l3iFI}v4sc=H4n~1oo+JO9B@{Pf_>`}Fn zpF-m-T!5*X>5AZX5ksCXU^cU~@_-~`8w3?tRYbxIssMBZR`4%d3E3U0AZEgL- z$}0?|dL`V#P;Us$g`UE)5B9O>5T+xwcYAwZh_m`wheYxqQ3RQ2`PDf{#&&M^k^YJz zJo&2+MN+BAfdeBcIk{Nc8MX%n)#C_roFgK4kUw8#l7*0$N#wv)ZYom!J0aI%%T_*?`cp}j?+*ndNO<8XSnyg=|Us@mt3X%m4aQA7Wr(3MH zI>?v~nLac9ygvHy4MRH2;>@1W%NiQ~`B&!WQ)eKD>8V4^^$DUfl_?`;P-k42@A!?P zR;lI?E8sdet^u%vK!>iO*AW-6NMO8F5HLFq2ij|D3mrDJqERIMkeRE$k7SrZlSOK1 zJ0Bfkryb6eG$N4oL-%r5<{|kCN<`Q&tHH;G2w%0x$)A)aW){?7CD>)>|5-p!^e_+) z)f6m-l+Ar~06UQ;QFK0Q{QCvyvuZM`^OP#NEF~uNjQAVUg=U z@YF7|vCF5TEH96~OjU2V(Pf41?mKrEY|^-&+v83mw_Z`Cn}aUIm#GVn%PW|bPGPn? z9THaH6)jIL6Ekdb)epJLzIq*-z1^9m{l^>-C(t9$FPcB2YdmyF+v7N~Qg2#qnL6JY zrJu2pF`6otu`-wSig4Mbi0$&7xL$EB`Y%iy-10jdsLAdYiry^j9S9)U68}sn45Ybw z0;WojRoS<0fi5XcGDUE0SO8^{3abvmpHPkB}KZK$i8wjHsxPn z@1D1l2z$)!Y<6VMH|rR6geZ~=`^Y$U=;7I4U-u+CGiBV7=Ow*%e%Ar{KD`E2MfJz2 zd{^%pk#d+adCai9TM|Bk(_+}1u23@fk1H6bfreHV7|pEsxnS^Zv21o5UyLj?KU0|x zh-$5|xz5Pl&l}?Wp~m+Q=osl5KAum+fQR=488b02*X4$2BoM7iJrb_8c{t?3)T4Jym2}!;sL0mN6)N; z4**;q3H^U3mL506UEVS~8~>rrkbzbessF*wdxL-fk682mZVaG7(C`#Rqa%w=%^abl zrlh8%^>EV_kyH|tkdROjNiQnTFDlCe2;w#r#qPc)8&lFodECDHi=@XJs`^PnxHvXXmAqR2AjryK)*5 z;qn>erOMC>ZTmH?>@+;kEY;n*53KL)>((-ga<8wr>vaz|C30t-HYgJ7%`E9pS5bg` z0-=kL;qFMRkSl=SwaF>zpENVsZfR>p%JUik^m4dlUGj>`hmA~&%66jXy+;#jsnl9` zuXo6Td7~i%3_3?m{oA(qWi)s@?j2)v^NbB1qE$~?tSh8Ra=42fuTnFkzW0|RPB=6J zs!i#n1*N5@BguR?k9R~Uk}mdbv72Nv*@wJ)CoC1`CXyM$ycJVE*A1U+cI__5@>4}& z1sj4LR%Q#EpKPN9g(1CmT+226@vFTpvK+8l`0+9RV$sZOVj}Q|jhGr=ZF_6>nc85X) zE1Jc{$7PG#SVYxN_#_yvwzF<6B*~>OgVEse_|RI}0dTGy02)FS<-ER~z!o+G@`h9U zM=41u&9er`P(`Gt&9fAgwA0gLiR~||bqDZxr2n;Tb^G})>%~{3!py$xc2BmooDW%y zxeOcf;SeRg`F62i!;$N`ujEq<-US}1$EF6YdMo<6aDtm;X9|2-C?dBtt3SHE?BtAiZ11R(;- zS{zdll|V>X@JxHZd+}b=ut3(7*T(u`>TPJ&&Eb0)o84V{=Q(@7u3V3OzYRRa!byP*Bhh_}9vvTPp-;)_)T`dgg_H;xRRQ{kAQ457mA*M5bX^n!QSJ!hQL_Q9Le1b_D4t=tJ_KP4kz)oIr{ zA)$_nC-Rx#j)BBFo-x1jt5zRv5cInKW}_Jmf*WR+h61$pG<#|uwVEeq`kUFIC2#@A zeWnSSKX}a5=F(Ao)$0?~5V?{Emm93HC8j~|eINbRNBS)m0@ zI*{G#HgqOs*pF?wj2glptyE%gy#)e;=A>BlJX111>3?NVwc^H(2zhH%wkxNBwbQsK zZ*~A6Z~|t2VIj({-{^wT`9x}sulC!*VGR$f&3E9)MEYIy$*~O9m>0j@V#=!7=Bf@8 zx9T-STTa|3HNp9zrCAK+oYSf^fps#?b;S1R7Q+~N%0@oP$b3_F>-%ncn7e;0A))b# zpqPPHNB&ut+t#vC9enE@_^^|DLTVUaz2`!F*q|Atf23EvaS#!ItJTX`*eiH|j=z=} zyCY?Ykb#?nP8-p!pfjOh2a>b>6^d5YQ1de(5iRZNbf2WM9r}A(?q2VZ_k`|;-H_p2N(?TX=Q;A^@W?Dt z7#v0P>M4eVwR(Yc^}Hw-uz&Y$*Mg)J9n9ubw$kX1Y8nI-RJWNXg42;t8u~6 z?YFKRmR;n}uO8Djh`AuLvp!aC^<-a6#?O^kVuGC7bNlUV8r@7I6BW`C=NIcU*Z`8aE5lJ%|5-3htL_DT^cv zI*f|ILuF=_rzWQ|Gd!k>w`6-uLEDo7fjn*QhK0uVXfFSFuz@Zs@(|X1WR6AZcdE$& z&rC$jz>Kf@Ze*+_yHP(ipiM)e-=+bi9^Ta3CU5|Tv)usZWTX#Y)no~ZCF+w z$Ju`XX1kN7UhPF~q=l}A<@--g9h2d4^{8cBRqmgjls4&G&NedV!ghf-w@g=_)n`k4 zFPT={DH{c0_8$&w&RVBNhHIZ(?7?sANWky_bT+FGw~H*h%nTv2Ye zO7Ax-Q*L6+`rxQ{gRdYZ5kVYxV-3R8T{qXqj9SFp@uHnH^-m0EVj#oeVq|bQrTJ)B z=}FVgIXd8&NjGhH>uCoEC6-+4b_9$y49+)0GTtv+JtzY%Z2jlaJSeN<(zv2oQ{Po3 zWF1c(Yl;jk!e*9H`-L5VO|-2tvm>i=)E_^I(ofS>Hj5TZqZ_*UlK7={{5JNFEOpUG z*ze&T;|GTuGg6}s2C(nA+^z#It#LKuf!|-a&iyVo+n}XVs@X5yZX0GirFbTmhucLW zk98}Sm66-mlz+ICM6AmEcQ~dwbh;Bz=)ESP%)zC(e*%#wt+A;W`vsq`nd{x^=TC;- ztsevI&_gmiqFsM8_AXvI#KGu{>;OHtw!6bUb!dLmTHMcZ&_Ww~_$vveMrB^i(4Yi4 zDSEQ+jjYgjU(OiV_S zn6Yqbtfo>lT@O7l?xyEH6rrFg=OrtP;+)82pT@BuIoIIW$a>F%i|4{tCFnY3-EqpW zJ`f%9AuuyNmhz@8v@<_9JR3?y-2ysR=TPh20n_+XEKD1Q1*^(Y`43Z+YeV@w#u#@EIJ0?ZqrN1JmktTN)GkoL)R% zZGdJ&{ngtaODy?##;ZIBx^XQd5#d2%S4-m=+a%6|x=lcyhYG`xikwQgEHlG!sq6Pq zY|!>RKUS=}@-($ZBkCxF+=FCnD*TIuoT;tu!mc@4y_iWbM-gCtzc8@khef+uX34yq zQ6O4hFpwYQAJ^C#cX}vcDvG8mS{Ww(r@Z+&WjaNaU~qjc0X7^yN|sa<*hDmq{!Th3 z7O70n!13|!wlL53815OH4_8bc2|6FBzi7Si-L=6C@_Kn_%IY&1TsfW`bZ4|6EXT;> zaWiP{Ay&M4!b?`7>3z17LiT*1dE0qdt5d29pMpPTL3l*!nWAFJ?DoP6_OHZ#a~olqyUHr+1)_FB8X`Y6qY=J_(9N8Sdyk{*ulPGt)3Xu)mF~; zlxS0eUD0?w2O=&Pxqgdl+%$MsvoOM{&N>^1eFToc)4`%I;8Z44pX9oY{&;mAV?A?a zg^ke!>EaV}8d*VARh1BAVjuX6LIO*EXELfFzY@j`M5>8<4QgrHkDy9QMsnX|Skpak zF|6qVK3vO^n>J`9Y4O+EUTu4vX0IF^I%c`~s8$_LWuw6;c&Jb|2VfT@IzqkTvXF^{ zi`s2(%Y=7o-g5whvY8jRRhfz788s^Q8N5djkiq}Z{KP)&RTd+2r?Gy*rf%8`;L_Fg zV5W|qXn|HLs*Uj(oR?p?FoXsU#`0kGx3DfA3i*d2ORc}B%9&PWMrki(f6y8Q+=$P? zo0lJ6Zfa~|AwIg*fCwqwqNJ!z@435r%xZcGwUtuvx1vra8srU!)CR$w5 zkP)6hIf8OM8QP3S-G?%M=6F@T)<7$0n34AEGN@rL7J{LP89nXnJq1Y4R#W?SF0Pf? z@ccAFT4gENcreQ7#(Lm*2lj;nYoA7Q)`J(>(!U74)?|_fpJ|Vb~#$vlUxAfHr^hBPjP- zTpzLFsj+R2AkTmxZ!UZ=&ZtntQoTbN5svT8mRd5*SC0AV4|v7bJ`T8Bm1~P}5y{{` zG4+l4zKFZY^E?i7VtO^ByIKq(RIhApoV&0@p-&_I#TD*;j=FDyJ5cI}Jf%%*{Y24s zv58uVIUX+0@_!erlO|h|WTRe7E0QsA2%Px7g2v*^ z=R(DKBh8O#7ufCO_FvL7!rTW*rAD`=&yN{L`1Vi@9Pifs(GR*UIX9QQ25IS+%H~?K zjxBK7s13&TQj6qPJlk7wMhs&JjG1|8h6*xROAX%WCsJyxQZhRh&%!;WI3?)PbW!zl zMLB4)I7`8;W#bigKoj8sAh>)$t!}7Ssj-eeoVyCwbogeLtjJW97el5D~_9(og;14 zvS5dJOOjQNK0IAXNhgJ*08XLVV;lXl-BaQ*`RZZwX7vd=%XD6}wTxR84ZVdrZgEfAG|lngx-wT+ z(+Ln+#b+$ER_XxOVE&8#6_C#dDsM;eYC`6>*UJ@T`$ThQ-A6B>R#|@jaC+mC*FvMe z=$HYoS774QiKh&+cgMo2$%23Mb;{?h(Z};^h(k1XC*0*@BT`scM*2X2#=W2w>UfqJ<1&o@LZ_-US&xm2z(Wr}-8Vr*!S-F4MIYaf`;Lm4y87*ijMd&pcbtOxfmS|e8RFm z2~#?1r~5GOu~&ua^FShb#n2(79pVQ0a|rInllCzRlV6~?}v?J=RAC-3p zQ1f*-uT5CG5!xo3cBp&DHa8|+GcH&4dZyszniHIE%Ho_58X1hsXZbKGA=NqKsG&Md zYa5eN`8sRkqzb{AWGNbRX%E#VFu{WcGKl;jP`zrBgw{G|bbrr33P>6lFDUEt)yg-?j7!~WbyBiJ zR)-8#ps&VJ)+8h2{Xw83&-x7N-3{XG;j}T<#uD1Q(zYxrD*E|;*&UcJO3BDcf9Gtl zD#3g!*#`eyRPOHPHHt6F&b~Ut7L{v-AXr~T?FaTp{FQm5Rp`P!k_$sSqo2M$bZ zBgMsw)Gvw@*umk+jd8B+7nD`+(;%oS7a( z3ohrva1<`dPhZrephq%R_%7o=M*3O1^yKV-1@4L4(8A4a?0)rF^+EfcHR>#G|i--N^A;P@@&#!j(wl3Ldacx$`{ zk)Msm>$!BR7G{oN0w1| zxsC}IUuh{{3O1o44p8(EWHhUP^nMkJ=iUEotxNl25uwr|8zfjpz-GI1GdmqtRixmt zGFLEy_Ic|E_?fTS=F6wCL3^1t3#O~X{-VSgB2qyAGDh(-%FmZFlK2@Q^zr5{A0FUDZB(wA>PzbZk+D)8nV4uo8e}{6w z;rt|H0TjnkAA@&+msgg~5v`MyDd7T`u%i8Ki#f%efK-7Cw}daGQFFAwQ#RJca`pAr z2k?uoJg;kICG|?>Ga-wxw#5!724?al(w=s0*m8q$d1q3&d%~k2KqxfrQJkEd{Bpg$ z*6qUuuq@*FYW?bEn*{Ss*H;+xV|i?Ll{q!9N}(b^koSpI-q<1bqq4Siv@qKLv!u~{ zj__2O|L5BWGFVaQ{iz8S3dVf9lcNlku*jxR77P(bMuwRs~>}* z%fHxflZpjQ(QbzQUUHz#(o#lpsZd`7_D-HSPN(*~Z|UYJqO)bQIdPx4UMGfK_6zcJ5XdN)}T^ z;tOrG679@<4|pB8%dq~-;;;7sWZ&T!DFOsUM1dIK;PqI!X`5*#slV$))+VOMrpBgD zprMJGuvv;E0ob;>r6xBu15KY<9V$f$@Mt67#)O162} zK>$SM^5>9`f_+`Ros7euonMl$-8v>Bpx6TctMHdQJUpU;cx+OBSF@y6d3ELMeH{8v zmaa^(`;d&fqp^O4$e+3K$^ZMHX7~UD?obm8#vK0PHNF)>rg+i$Vx9@RD zNnv?Mn)op1qDg%i6oeBBH`h`LkBWs<6AFbwq0|tFXLwW`OR*F(E55xad zv{YZW1@}n`9dwaGp-^fBy2rRrQy`%w0scj}xhaMx-e3I~zrs3*jqxlgA8;t{?_;n6mh~_;OiUY2lkZRW%J^5M?6IuekV< z3O8}(C^CX8E9w*qh0^$us$k;VBm|cTH5b1zH|`~;yz0}Voi0iVy;Wh-W8vSMx} z4e8fWMOl$?Cy)x$w%oTX;bCBwm6Vk7b24D?sx{LTNbS4gOQiW0gj)!OLZLJzr1p%x zT_&Psh3u@%{Cpl;OQUNiwewdW=H&95wPcYBX)X8dibR%KfYb^GXAu4hHYzCa^KztDK~Z4sGA;$iycK-7CR|k%n|K0lhc~%duQRi6-@0km&WM=-h#ALB^b3gC z5IYiIVSHG)Pg4wZn`>&Q%XxfGZhqS9Ow+c8q*3yTC+E`v<*atIy|7eOl$2^e$8CCM zj&5@;@(CmEvCV(OXFRe*D3#?Js=z3zKuiT9tEl)mIWzTjUhbQs=v&ZP!JKJ|!ufmd zKT3PUFX`6FkZ~_CW~;JjMcn3P!V(|50kqIz<2Uh1a(k0D%v@~DDH0k@#6EZvx`%)B%D$s+zLn6gSK5xs6u@joNDj9@}5vv_Z~&oYE7ikZ9uW-}wZIr;p%+|<^3 z+6H>sf>VScynT~FWaNr$UL~=K(3u#tY_5%Rd-vf}qt<#lY)#Qw;(}Y*;Qdg%&g4CR zmDbLvwU%a$Evc3*bW~MUA3jPpY^}%CHy<3DoKF)Li&b1)Qdm@6b#X%Z6uzggMCuGe zQBk2EqgKeSQmNRh2t-^k6@}KP;5CF&!Mf15P`*bX%nFKx@hvDS@QX_XA}o?_9*-xQ zIk-fKXtlVwSbSG$1z6@jNiHraX=l_*LE-I~X5z!AlMgDph{=O zky6DEXD8C+P(TS&LQ%*{-+pe2B8{T2EG+({o=DB$>9=SUb@PXXky1BFO+}-EGRi%o30vQ%<>ED~v*02S$5j+1M00960FWs1F00006Nkl[]; @@ -47,7 +49,7 @@ export default class ToastContainer extends React.Component let containerClasses; if (totalCount !== 0) { const topToast = this.state.toasts[0]; - const { title, icon, key, component, className, bodyClassName, props } = topToast; + const { title, icon, key, component, className, bodyClassName, onCloseButtonClicked, props } = topToast; const bodyClasses = classNames("mx_Toast_body", bodyClassName); const toastClasses = classNames("mx_Toast_toast", className, { mx_Toast_hasIcon: !!icon, @@ -61,11 +63,24 @@ export default class ToastContainer extends React.Component let titleElement; if (title) { titleElement = ( -
- - {title} - -
+ <> +
+ + {title} + +
+ {onCloseButtonClicked && ( + + + + )} + ); } diff --git a/src/stores/ToastStore.ts b/src/stores/ToastStore.ts index 85888ee30f..971e49be58 100644 --- a/src/stores/ToastStore.ts +++ b/src/stores/ToastStore.ts @@ -22,6 +22,15 @@ export interface IToast { component: C; className?: string; bodyClassName?: string; + + /** + * What to do if the user clicks the close button. If this is undefined, the + * close button is not displayed. + * + * Note: the close button is only displayed if the toast has a title (i.e. if {@link title} is truthy). + */ + onCloseButtonClicked?: () => void; + props?: Omit, "toastKey">; // toastKey is injected by ToastContainer } diff --git a/src/toasts/SetupEncryptionToast.tsx b/src/toasts/SetupEncryptionToast.tsx index 1b5f8a4a49..93b97db365 100644 --- a/src/toasts/SetupEncryptionToast.tsx +++ b/src/toasts/SetupEncryptionToast.tsx @@ -65,6 +65,18 @@ const getIcon = (state: DeviceStateForToast): IToast["icon"] => { } }; +const shouldShowCloseButton = (state: DeviceStateForToast): boolean => { + switch (state) { + case "key_storage_out_of_sync": + case "identity_needs_reset": + return true; + case "set_up_recovery": + case "verify_this_session": + case "turn_on_key_storage": + return false; + } +}; + const getSetupCaption = (state: DeviceStateForToast): string => { switch (state) { case "set_up_recovery": @@ -299,10 +311,15 @@ export const showToast = (state: DeviceStateForToast): void => { } }; + const onCloseButtonClicked = shouldShowCloseButton(state) + ? () => DeviceListener.sharedInstance().dismissEncryptionSetup() + : undefined; + ToastStore.sharedInstance().addOrReplaceToast({ key: TOAST_KEY, title: getTitle(state), icon: getIcon(state), + onCloseButtonClicked, props: { description: getDescription(state), primaryLabel: getSetupCaption(state), diff --git a/test/unit-tests/toasts/SetupEncryptionToast-test.tsx b/test/unit-tests/toasts/SetupEncryptionToast-test.tsx index c96e5c1673..52c19984bc 100644 --- a/test/unit-tests/toasts/SetupEncryptionToast-test.tsx +++ b/test/unit-tests/toasts/SetupEncryptionToast-test.tsx @@ -189,6 +189,17 @@ describe("SetupEncryptionToast", () => { props: { initialEncryptionState: "change_recovery_key" }, }); }); + + it("should dismiss the toast when the close button is clicked", async () => { + jest.spyOn(DeviceListener.sharedInstance(), "dismissEncryptionSetup"); + + act(() => showToast("key_storage_out_of_sync")); + + const user = userEvent.setup(); + await user.click(await screen.findByRole("button", { name: "Close" })); + + expect(DeviceListener.sharedInstance().dismissEncryptionSetup).toHaveBeenCalled(); + }); }); describe("Turn on key storage", () => {