From 19abeee875975057e7c1d347a589ab46332722ec Mon Sep 17 00:00:00 2001 From: Asad Date: Mon, 12 Jan 2026 17:35:30 -0500 Subject: [PATCH] feat: commands to disable/enable viewer; re-validation on file edit --- .vscode/launch.json | 17 +++++ .vscode/tasks.json | 18 +++++ .vscodeignore | 1 + CHANGELOG.md | 15 +++- LICENSE | 2 +- README.md | 49 +++++++++---- asset/toggle_context_menu.png | Bin 0 -> 45516 bytes asset/toggle_ext_via_palette.png | Bin 0 -> 28323 bytes package.json | 43 ++++++++++- src/excelEditorProvider.ts | 43 ++++++++++- src/extension.ts | 118 ++++++++++++++++++++++++++++++- 11 files changed, 285 insertions(+), 21 deletions(-) create mode 100644 .vscode/launch.json create mode 100644 .vscode/tasks.json create mode 100644 asset/toggle_context_menu.png create mode 100644 asset/toggle_ext_via_palette.png diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..34a59d0 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,17 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Run Extension", + "type": "extensionHost", + "request": "launch", + "args": [ + "--extensionDevelopmentPath=${workspaceFolder}" + ], + "outFiles": [ + "${workspaceFolder}/dist/**/*.js" + ], + "preLaunchTask": "${defaultBuildTask}" + } + ] +} diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..34edf97 --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,18 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "type": "npm", + "script": "watch", + "problemMatcher": "$tsc-watch", + "isBackground": true, + "presentation": { + "reveal": "never" + }, + "group": { + "kind": "build", + "isDefault": true + } + } + ] +} diff --git a/.vscodeignore b/.vscodeignore index d255964..5dd7b05 100644 --- a/.vscodeignore +++ b/.vscodeignore @@ -12,3 +12,4 @@ vsc-extension-quickstart.md **/*.map **/*.ts **/.vscode-test.* +*.vsix diff --git a/CHANGELOG.md b/CHANGELOG.md index 336c6c0..17444d5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,8 +2,17 @@ All notable changes to the "sheetjs-demo" extension will be documented in this file. -Check [Keep a Changelog](http://keepachangelog.com/) for recommendations on how to structure this file. +## [0.1.0] -## [Unreleased] +- Added commands to disable/enable viewer for specific file extensions +- Added right-click context menu options for spreadsheet files +- Automatic file reloading when files are edited externally +- Command palette integration for quick toggling -- Initial release \ No newline at end of file +## [0.0.9] + +- View spreadsheets directly in VSCode +- Support for 30+ file formats (XLSX, XLS, CSV, ODS, and more) +- Multi-level caching for workbooks and sheets +- On-demand sheet loading +- Pagination for large files \ No newline at end of file diff --git a/LICENSE b/LICENSE index 5723c45..ffaa914 100644 --- a/LICENSE +++ b/LICENSE @@ -186,7 +186,7 @@ same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright (C) 2014-present SheetJS LLC + Copyright (C) 2025-present Asadbek Karimov Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/README.md b/README.md index 9cda12f..852df6e 100644 --- a/README.md +++ b/README.md @@ -17,19 +17,12 @@ Powered by [SheetJS](http://sheetjs.com/) a powerful VSCode extension that lets ## Key Features -The extension uses sophisticated optimization techniques to ensure smooth performance: -- **Multi-level Caching** - - Workbook cache prevents redundant parsing of the same files - - Sheet HTML cache eliminates regeneration of previously viewed sheets -- **Smart Loading Strategy** - - First sheet loads immediately for instant feedback - - Additional sheets load on-demand when selected - - Preserved webview context maintains your state even when hidden -- **Responsive Interface** - - Immediate loading spinner provides visual feedback - - Sheet-switching indicators keep you informed - - Persistent state across view changes +- Caches workbooks and sheets to avoid re-parsing files +- Loads sheets on-demand when switching between them +- Automatically reloads when files are edited externally +- Handles mega large files with pagination +- Toggle viewer on/off for specific file extensions via command palette or context menu ## Supported File Formats @@ -65,11 +58,41 @@ The extension uses sophisticated optimization techniques to ensure smooth perfor | *.wb3 | | *.qpw | | *.xlr | -| *.eth | +| *.eth | + +## Usage + +### Disabling/Enabling the Viewer + +You can easily disable the SheetJS viewer for specific file extensions: + +SheetJS VSCode Extension Preview +SheetJS VSCode Extension Preview + +**Command Palette** (Ctrl/Cmd+Shift+P): +- `SheetJS: Disable Viewer for Current File Extension` - Switches to default text editor for that extension +- `SheetJS: Enable Viewer for Current File Extension` - Re-enables the viewer + +**Context Menu**: Right-click any spreadsheet file in the Explorer to access the same commands. + +**Built-in VSCode**: Right-click any file and select "Open With..." to choose between SheetJS Viewer and other editors. ## Getting Started Want to integrate SheetJS in your own VSCode extension? Check out our [detailed tutorial](https://docs.sheetjs.com/docs/) to learn how to implement these capabilities in your projects. +## Development + +To run the extension in development mode, install dependencies with `pnpm install` and press F5 in VSCode. This opens a new Extension Development Host window where you can test the extension by opening any spreadsheet file. + + +Build for production with `pnpm run package`. + +## Publishing +```bash +npx vsce login foo +npx vsce publish +``` + ## Learn More For more information on using this extension and integrating SheetJS capabilities in your own projects, visit our [documentation](https://docs.sheetjs.com/docs/). diff --git a/asset/toggle_context_menu.png b/asset/toggle_context_menu.png new file mode 100644 index 0000000000000000000000000000000000000000..df47e0e548a5c04580b0bff4a5ba2647a03c9518 GIT binary patch literal 45516 zcmagFWmHw+w>L_6cXxM(bazQ9igYT{-QC>{(kOy-w{(X{cXv13$Mb*BJ?9Z)?6NJK~w5D=&e^3rc1AfTwh-;W4T;5UCWbTkA61%!gMgqB;@ zkv_aQPXFAhkO#gx1`ICjF9;p!Uoz3GoP9q_Eq~Y~SKHzmbTQeI@aXy$SGwAS9zxY$};nSy2zE9`yIc}#bBIxMocMo$0 zz9Jr12xHw|0u2`9IZ`1g@!t`Gas?gDrwSEp7Ha(~CnqPre*H?!|1}7k-Jt#G@Gvtw z+s4vTz;Yt*=6F%cKOi6=7#aWI@KB1l{5pqoM!46QQy3*BB_$3oT-w^&nu_cUHwRu@ zTU%a=@GhuUnhNvMPwLFUNEE571dU7Et+Pfh<{Qj_KM#UGR~&>!S}bf8r(2kpnPDle zIw~rv%~Ip91Z!rt6dWbEFWIcY<6;(Fp0o+_f-j?GIG@@)ocAX3{h{G~E(Ylj4i3a# zpB(qO{<2HU$h`mXL5fO1fZ(#?$B%@>#9`rJ3VQn8?qFm%I5>LMEIT{9PTlN0;@G4l zoHb%KH8o;lVv00BKL|?&Jv}``L&L>-8)i=#lvD1!{!oj$(o%#Rm^{M0LrS@1_^nRe zz1w&`irfNA2&@6-YPoFoz>y$>_{2hCfgH)W^tHsKEtvK$O?8R_!Vo?9U)kB&Q%oP$ zggrELQ)QO>oaXA{W!rINiXsEwO3(lPCRyeoN%l-1ugDZ972k z(t4l5`r+ne8M$0pULIkm=eoGK7(8>lJtkpcuk(%H5)u+5l~+fr9puAD^ED-3mz(Vv zL_|mjLhv5%&P@h<@6Ph$<1yp#`eUt4OiU!;pUs3AHriA`mPn$_55^VZMFaPEq`rfIv{ zPD)5P|KoklShf)Kwq5Jb&4UAvt%3MNdNqgE04P0V8b9Zgl{O*k83uJlKlv1v_unci zL|l&EfnwE@gLL`T(6HL<%v@;XCggEt$;w(W`(0Ox@WY1>6ShAMI?$wfKmYk*-SQcQ z7nKHLhE+XZA{ypCu$0L3Pvq9-{uwSppgCsDF6BjIH)Xdt0|~Y?q2zr~`c~2xxR6_N zDzl%{7|MSIUOjrBk&vXnock7FxFKF%UizaC2_v2I?J*oLHrURV<9^%(g}=GExvx-j zbo7M+@uBGVJc`T$I<2FFgOjr}F5`&$BII~%M@L6fli*m6Q7k%--yx?owFH+R6v=B) z>G$v0WZlLC3_)>gi8+y*L9`@X_;UOZYxNq53RoL>%lowAQJ6CfER?oVsRMAnSW5}BWv#-ZqrJ~JVAW%ilat%q zeN^~E^L3yeo@*?|Gt$%ZXVV*T)G@mf2KY@0;mTmIh`FF;6~Eb4A4u)=Zy^~H?M|yx za3dL(I{(*uS#}l_f9O(gpduxo#3Ni7mQxzdbOBp zzyC!vx0SSLPVhArGc;VtLNI!k6#>BtnLO*nX#p-FCBz8*&hV9kh)+rmxzuO~PA3l~ z84abLC}+OxgHbt(6f11zv6-P8_dvO*uJuMF2DB0E7K#JXI!g6Y_crSW!DqE#A2qIoTu6fr)=Jq^5k z7|RI8p|t}Wv=l3p2@zZfKLlgYj~)}KRBh=bSBQ^JT|DnKyP#^FxdthxEg5n#w5{$1 zib4{dM-HO$`2s}hP*7|kI8iq5lHHG<1tl;k_0Ue*r46`(WWw$t=B1=q{#YiONy^|3 z$koAZ&voh>8oD8K6dM`3K@Z^I{Sq%wNeN$&5SpgBH$|sgNBl-<-|8c^$VOe6loCs9 zzx5{+d=<LLWqKrRoE!N%ql7*LN?Xx zJmQ2h+KWq6-fHk@wXtb->@#P&d3s)vd!Phr zIDPJ$>mzkbSm_>DkYU(&9vW6G9KRfK>ZL%wi7PVFYU)t`{9<*jxYVmFAL}myJ}T}n z6OH~A;o8L7SD7F2R#M|Jt0Ga+X&aYf!@}g1mACHP5$hX=@(?B-BC!!dSenCv@63bb z2aHAM7s8XIz9bF85Xs$RQV{cP<2er{j(4h?#3?#*B}{D;>SJLgp|Uj zzfkd^VK|jtsu_&whldAIQPH!$dYeU;rAGTZb24E!4h{~CA*r3c$%6B3VKB~Op5yYZBn6V;3t@E2ej@9NdZ$!%e{?_saE$( zFjlcuUoVE)&E_(5Ux(Q{#D_oBSzo)jCase~dAcvL^&oOv)pDk3A*f1SLMFgFpsNV> zGIL|4Wn>VQGg_MY?O6Ak`l%y_6RB(R`}?oksBA&m#jvGDWb zzcT`8CO$r%UM(l+gxKS0YirB<@kU}7%@l$M8wZESenXm}!}Ip5n{K{uhs!Zh+)$NK z4-wxNw}&e$hFGYYni_v-f%g7>7%DIX1rV{-az(R+-MO^dKF|F;J3B+frrSF>_&Q&` z4TdE}TozPYCpb8Db#)e_8No>fMMYqou%n~L0zgs!dG6%t{&FHm`@0V0{L|xUM<5(( zK)r-!J{2)>rghVIlv9Mir-^%GX9_wyf|MgDDTVxc3D;iVQsbO`HrV}E<`jgX;=;MO zT9p30hCgLAVWOaTr75bAO1U9g*1@$~9}s9`bXCLsu|h(M)b2HI5_86t`M~9NX2{IU ztjC8#P0SC6LNE~qpVZ`hh-bRe?oE7^Nhada8SbEAy@Ft2 zVId?W zxu2ifh&+%iSuqwj`(xK9Ml<>Ijq;$i%N0-*L*&E!6w(6G4x)H8-@OYHG?fXhXGpwE zm;C`ZaFWioP2H1kt5Pj2wZ+XbgCb331C1?JQ|v_MHTzRDmU;E19nOi!nKwD4n5gK| zpnXVF*Dx1i?EU&@6c1?g4Fc@z1Zue$5+Ro;>`$tDf3UHz^lB~rY4Z(AHA`YPDrhxq z_721m&fxV~L`BJv2nY$+b=7k?IE{M|3=9m^EybUqMBwBRw5TX3*9ef2ktarW#bH2fyZZ;g{y=;)PaHgr{JXFV z%c!IIBV;v`_@7^bT{scKHd{_H7YULyiFKBAxmik1XcuJNQc%5t(gBVJSH1X@SQqNy zuu9u=EALkR5Q@n_RcTX@Lsw$H^0+0TF^iY}Y(9yVM_B9I;=Z>{sx%mXTlrIFu!qr2 zm+Hdcw8uKYN~`x9<#I-f`yOk7Z}&E@?aI?czEodd-$XdMhzE{VG=TXFi;KAe_E4h4 zyw)(`Q!d}k&CSmcGeT=>E{l{>arkMXBO`^}FSbCZl8}Imwzxf6-t3DG{QkGq-LXV9 zd!gQ@#rx4kS69~(_iQLz$hB(PKc({&rdby>rs2dWvCJ^2dL&OmM6+_~9I`3jc&V-T zn24Dig<5~*JUY9#bSZL|e3k#BL-_tn$9=w5BMlo+yGws6;y&?c!XW)_%1{NJ?;&^WM?Z zmoV%8g!q;09&Oq=+_thBzs^CA!d4g{Cg&jY)(9eI8QZEV=)zU)O3H^1-~sn6~t++ZO9_DFQyQ zVNOWWqGS~d&y+EaE0fO_7h+`hS!<;V(l(z`kP6;N3RC^KW91E3q~zkl!U;2uC(5?U z)10c2Qu4!ES;0g8G!qa21%`K%a-&?3j3V?WD+Vb%6C4-~Zp{1p`w8TUKN9MIQkB#~ z=S=0vkx*GDgg$jr840WU$QyS{Kkz=-VJ zetVgmD|Q^zuXai$Rc~q0Hgl$xIHGte_xAecRSjd2@S{V(n6ztl8nw5`4?G9-{WW<` z778DIs{y65_u$;b-h$O ztV4#Tfjbbtlh&)3xKOa6K<2ies`$yix)qv8}*b?Bx!k`Nh- z%pGQI*}c65RjK}Rg~N~~yqzv6B#`?(N9CQecP)YB9wJaqotVh(jm_*<`Y6V zhmqm~BMW=}&a*r;AOYiBiSBS&M_8937EA%>40y7S<`l3XZI!``yj{UWe!`nZ(P3$iU<8OC2UvR2AkS@-ju@ECu-&*IWkPs2+ zNzf0RsY=}1GbOoVPYvTB-;j}*!N!WQk^~sBi*PbwNt)wcb|yICW^qW+B=Yk| z@1rFz9typF8IGtniy`tR(iOoqk<79t_$1olPJReK^?3VMrpln(qiE(Vx8N=cd&WAx zYNB7Grj0z=YvBCylAD`55T=~h4T+Nj8`)?SAvi7{dPss8GM;0%6A>FzdM^Gm0bbuP z`g=tJRT}a5o5Xm=Cb8NJn*1o8{YR;v@!*=mz1}9IfC`|BLBL0h6rp8D$THkZ8RTRj zPcVK-#qUCANX7{-tR|13{)|{no|5<+NKzK$8hO|zKOAS-PU?7~GC0_UWbwuyCga|D~2UBOSql;@N>CdR+@4*ZY zqQ%=Hj`6LFqYo>B7*oagY>qpmigHaxgYs)l!p}3CdcVL_xa(Z!Vjz`4Q6|h+su{Y> z5K%wFRiR&^H(}m|%bJoq0?TM67JQjihTNpyeFN1hWlhX)ubAzO?nXIkFXO7I5{PTQ zISG@TtFEOAu%k&R%t6&uAB`!PA38L{u`^M%|a+jes`E4irjELnNuxbZ5@UkAUVW1XQlRavZ|-fy5$@`-J*V2UL!dvS%=YvETGP7rhPr5HT0!BLA%V)u2gztG>n@$2&xM6yP~N@+)HKC9H3H>o zl=uH`ufNv?S$L^F;gzEj4)w*zT$Czy8Ww5VgPxsw#hZsKUHoa)A)ELF@jv|o=q#9c zOT9A(ghbJX9f&>f1Zk#bW)cC7#iSJQ>lD zg6HIQ9z!JJ*vB0D((#UikZL#KQObinA+AMi3-Lbi*Wk|B0@y;rZYFWW7-Oc(!i%(==LB(NaZQ#=IEDWMgZ~)DRyC zd`?}#EZ3Yrr`gO-3d?ys!5}47>0ZZ(!9-MYTsr*lB;fCFXT-|M`70-!aY8x2>XTfOF_3EEXr+F> z#vdm2CgJm{u(C=~Zw3Vg0n+x_(vsmr38AxTQ)P>F=y&M0_!>i}-_ez*dJUQJIgBRKeX6d|`drz8z6Es(+Od&4k~ z7wU$`#(?b2%TuY8%2wFf=6Rb}w!gnGD=W*!#x|P4OYK=Upkt>x;kI_LhR=m#EW-`d zgBiB4USsIMHxse5Wtwv4m4zeCvpGp z%B46seLxmYEU;@45f*NCIewT{6RWeFG@kpZpM}95I+BcO0%@Av-7V?uEyAbY*V(B~ z4EdavQt$F>%}2dVxo12>;SFzf$2pBW6J!A6P6X}2;C(qe*EE^Tq%ST4p|D$3ax!iy zejMC|DE3uGeaWiuyxw;8l!1p z`T>Qr^EWJU*Mv^*&L{!U?WptAH0LHdQHhOd9}(j4@TsS-TywoW%87N~(J=0)_%L(Z z^$RldY*3wZ+Mhxl&;pJu=yF6rf8-SWNtBWjk_VBcthg9%A!}oH|1kB-RsMHqN^xQb z+V!u^jg5^>O^|{>!H5-w;YA}CeY)D8hJ=KSBjd4DZ*e)M2@rEvO`A_z%wX1Zr9rat zL;xA-4m^LVa>a(z_DQ$8#p0)}NClx_^t4%!a0jX@(z(RCIvo zew8b&m;6iEX%C1JVorPNU%q@XH{SsQmQLj-)cc#8n~6twc=*7n8sFEKsqDt|bV9Ej zF<((3A>uUg^G~8|Y+r$cqmEz5uHSsM@jDWbSH3TQ?LcF=!Wsr*hwt5b=-HWF9yyR( z7&|mRekEt`Kjc9eu~6axmsm$+`eIP_X7tC235WgjkctYg%6mmAB^f!XodJ>4x-oqg zrc|i?qR6RzAZP+Xp1KRT8~;rj&(F{Q4{Ky)z^3Z@j+^t@%4!~zIks>HpG|pwzQzi+a5ZEAWuTPeVhxxxQ{T&`(qwx8&qML7}6F#JdKujRq3_VXQB<)Z}dF%|3gh z+g$4zh>=OMMn?G~pCsQ!X<(RsP*WNY6z{J>CZ$Str zd7<|M=h_cX*VBNw8`3vC)-$DVcbVWHZ;u0W4ga34YYW`&C(_@Zu8t241*}WL%gNC^ zsu1&aP8fCfhC2kOKArWX{WAGbZ>^0QZEkp{9+#R5?;R7+MiP||$R9^Vak>_PlgBk`|H*i z&DSYN8Yi5c&?)^SoTRuake!UfJ}>)EO_#;jD*04Bg!jWR=wJw^LgT7{H@*Hoh{=xy!5=Zw6Lqju>Q|vPL>mu ze^90c_#Ew6a;-!;*4pS^0y(j@NwUPLyUZ=+%CST{(>LmluCH1#FsiJNi7YJUT_%MZ zY}wPqYs;3GDFU+xxFFfnxo!sqYrTiI$-FU1`%E``RD2p%5Vu6>rbJNrS% zeX`OtJvnH#@^rc?%LUyd7XW0^0R*2cdaPg(FH0K}@EqTsGZtST_K+8EZf=l?`8@S8 zk`S4$zu&ods#qAygBbXRM%ODzLU|Dw595GtA4^ve6@EEcAZnuDPdy6pM&OO=o%MzW zIk`N179h$GukI%+B6i}hMuG6Q_lIhdZgW3B1xtC09gDc$d|7%x8oEBqmukH^A>G~J zvRvEsZL~?K+5OaJz1`&a!vFPSs4nK zUzVyM%R5Joey|uyFucyX%{|^K(P^ynzPso_&%Hk6?{dx>kEeFfO$8oRPRdHP*`QWh zTVPM_hx$AnwBz%?`qkJjJ4mlNm6=fYryYU=alDQ{ic9{lb$}`eY$I5ZY~a;fR*?(mh-;KZSqLa(OWG$ zfjTxkkxuB1OKnY!L4!|VQ~G>CRaI^Zo7Lja=besvC%dDwOEo3(ppb-a@zT$86}ofk z%tLzi=^Cu$=QtgEm#E+Yrnm*4}k_%eTyuR4AIGt1Jm*wP; z+3jX%e_v|&(&T!})`}v|C$ONXrWQIJ)XR5U@#5pNI-2=<7=gR{G`_u^!Vyu@f3n#h z(_Qy;ad-jR74LUl#+OA-4lf9|mnV0Civ9f|TkEUCS+r+$DvnT4QFDcTu&}YEQiF`l z?9|mYj4+R_zYnbyU=O6p;$`5~u((!}2ArZ%slFW`ZVu@9 z^(S{^D$ zA~tPWY-}<&GomXhSSLD*l<+^y&nJHrG(gGuqN$k(K$#((UEdm|6b0wP@9jtT%TH$J zbab?`GP1|Z4V5wZ`N2io+rz2QW4VVb1@PX29Tgw`xO#6jC)ZF;1^ugho60mKgHa#fxn*w)cv;1D$6^)Pjs< zU)wzR`1nlEkj8x@Q&_2~sn^weLQpxe;WE(4MQ3Jas_W}_V8-cSI4}y2ZE+!^zS)1# zuU74m6zcdaPeW49Yg*UQNKmSu9IIV|6vU2Ib{1msR+J6%sqb5(045O{167B{W*>>I zo4H~>mL1^)rhDfq+D;4M2%DXJWpo zZ;GDtjHeMCMn+bcWMrxrplMcQyi3+@r?M(NA-Op3!b^dxDqfxE#-{TsD*lOPlf&h_ zkUX4f;>ILn=;P%j?4zQnyw&tE1>IE8eyVUB-Y0*+8Jv*Xs`_7u=)Q#&6((k8v~0f_ z%B`)n|3Y3EyxTkYOfS_W9xTf?!O!+$;^zJ>1&ePZJ4d^lax^NvM)mRG>tgfu{pIej zU%!OvZH4TQ?nZ3e>1HcFw7@;Ac6N4lw4uKd91O5V`ln=gpd%D2}f9gf`)&nwGfmTEYOz(J=>Ccl zID@V(CmZ|g=L{?;L{;0BVjV=MOhzkP1O$qZE1E(=Ev>Cf0Owm3PWx*A&7#UuXulf_McCPqmk`l;bvH=`oovgg&iD$8|$@5i>AlkL0xf_r4V zs{`$gLWm?{71YsnsnGJW@6M+y-dLw^Ae|1HR!1-Y)_IPW&t~XlY<}!t6cX6l*_kpP z&PoSy4R%X{&5s{lJU!}d=Dx1nA`6SS*uHB(`@6B|ehH@BP%=5E!;FFNS04jo!V|)OZ2q1-+A_VHZ*-v!+dvi$hVGv^O)zP5F z361%9I`S9(&wW?lz8RzuKCBlkT<^m+DoZKA`6t1$^l8|*-* zkAV_O+}&@|7+6@MA|pQ=Ss1{E@-Q+o+Tk55FWk-yF1NTmJKo8ws-kgxv|>jDoNyvp z*E*i0+)uXr`}f4Gkr5O(3wWq zVTIJoOwIgWQfaXB9w6aaG;Q2uc*?G5BHn-oZJ>iBeVWupa}j>yNqgNv!DF34)NJm& z4@HhO9mfDct4Bj_ov1GI{)V2Jzqdquw){IlQtqKcmoyq>97qV3IS+@m8jz!QtxYvl z#={>?Fq{1q<=nNXaVn7S{ew?)MjoX-6{r(+glF9{A-MoU?bne)*f-$Wi)y z^!)uV#+~}~EFR$@{_b|i`qqJzv^30#QulnhtDY{LTdQmcV z3LE4^$Y!Y`{QdnUB-UocuB>d&1l}JLIGYNd8U?TBGCamzS2Ue7mZ!tkAW{pMP5t5VqwLYz8$p0BR2y}i8hgaC&*ZnWRz_%RG@d}wIsd|}fVG7%!7 zE6oyB{U!%mcJ@l@y3MVTbZ&sKGWl$Xl0u=BQdqj4KtuovvCejNWpuPcA`lLpOjuq; z#b&)0Ox?mSk-xsg3EJ5|Pr6$J)+tnN)SGN8|{=gN@4bwz$xAI+}MqR8s zPt!+sRH)|Nx`sWUh~||wH0(7bF!y*r#!Kp#D?<*A2DAOkEkeVgoLyhTmiv*B?`;9@ zzej=9dV*x^j;%$CBadL@tDp^@sps4cZLb5<=Qap9}zdiea zW{3xsSTd0{>9r`ux_R&#Q{8!;0fCIJu6*Dq{`vDKE^v18ZX=Ri+yHWvj)n&2il#b8 zjb+HsmWP*D|KmrU3O!f@2}(z2=j+>BS65f~XGBw~2K9RDWNSuH9X*~fAGte|p|;0z zaR0Zo&|4Xh>XxR3Az%@VOx#0nh#19sxROI2qs@A^134N*#TM# z5<{f_3%ik?+{pf4EFZhqOE<*i>-GZzLyGvVnBgJGL^0fxAaYpfrV4bql5ll*5~HU0 zecomMDm}Nk-F8udTUQ%|B-Jk?kcuh);|EAOF#*9+t9uPNT|nQG7LY#~+60K}pOf6; z%3f+bu~1rC3OWKXDJdu?X2Vo9H{eix=*=;~d{h_mj}KP5`NB}Mahfg1x_3~Wm#L(y z|JiCw$x4d|KZ$CH4G&jw7W-nagKP7;9dkm6|38NJgg1cZCqRM&!d0BDtu1<+ubmwS zgUI9UDZ9=5mp;!M5pV)rTyFjWAb#(d$Vi|w5YPNRf4P(pdf#XV#4c2DE>vw#eZfIP z7kfGbqM0Fn)GDkVrrqMna*NpgR-!^8-Ey<@A<$3Ukis8ESfKuiL+sMsWD=@_Z${^q zl_W!!S{*bsqi^xQb%AuHpE>oAXN4nvs%^PAds3>ZT8{Ai@-iu6v1;}kO*eRhT%QLk zFR!NdfPfdxVLWMZm z+fUBUW^)*Ivv)i}wa&J{tUOHfMBQ(|CXet24y6}7aPxE>ZX@K@gJ zRq}kM0^=))OZzP9xo`BztO^vKlrvw&UrE ze%zmSDR`}%a?7#OsB-Jf*@s%8tVHu^jR68ibi&*V$z zdf!#iJH!xF@)x!Rpc9_GK*-J-@*ZnI0)bPV@fFr?s5;m8jqgdTmA9sV>vRa}#N%td zgIV38qF7AKi~D|p=4*}wxf%S;so240P5&^ml-&zxabmunk0e54n&yZqV~;nBoF@HH z_Y!ZoxV|Bs^n(s#Osf{IH@v~9V;^ICB<{EPO{*4+QiiXcK|T%HB3lBsa^+7PPT zzO1&Rq~lfT_`A7td2TBH#41@)^Lcnrz1)pDqT~Emb@?NXD0vn#L>3``ox?D4n z96VZ`Hq}^c{+VlSZ3Xzu?RZ&e?6=uO=lHALB8|m(MM=qAtBg|AE8yG6uWwxK+ub+e z`o-Q-N_3HCXHj@>Uu;`x(&6Lb#SrlE&Yt`!%cX$X zQZH5SAADuYyPSqjZu%0@$lJr~i*g*LR$Ox`oI;U9j%U^=g6kA-A@jdO#}V~q{aHP$9o_ms(ZdQP5?+B z8IL_f#Ny{^nPw`xe!};$Uj>`bk6gZD4PRHR|5mLJ#21LW8A(VuIce$W;K@o3kB+LS zs)mGqIc~l_AUZJVi+S`}mlS^92u2>$Z~pqXad2Y7@^|HMxsL^S>?!HJOhmmV zcE+UbC9EanY-nKU&zr()tRp`2o!i@=S?P3$W?K#UMsK1+`h2P%8Cz+$?eGyt0fd)g zxBLDQ)N)`b8ZS3LJe;CuIv$A@*0TFWQW+Xrh1l_Qi4=T4@m%GgHhdBslDd!23xN9K z`Sx~pem6ifg@;|SwO&s8LbKtv@#Tvdte1(k^;Dh&^au0FL(vCnqoEN12IgGiET+@<4}OZWH=)XUFU8 zEY}~?@O3%L8&cUfY{*Qzkf*=8?pslymt5vHZ@8=FE8*agogus zB#x-6%2o4gEIa#jrOEN4_dF^p>a%Vo8u=R<8i99R2jb!WjzVvod$-#`Qxl8vL1CF~ zRw2YY06DA%+vRUsTyR}j52l4&$!aJWFmMhdT#q0zke0TwM3D)uX}Yq!6JKHGugj|7>X_q*#X^i z*Y}pSlq=C~4)J)QA@^}vI99)<1L&XzJ}*`ise#9&BwHgGL)^;Z+hsL|2j-@xGp#a_ ze<~JBH6M8f!>MIskPrmKK0i2}I5(h?Y?ndm`5YFH7{1}5xdIjI?(Pn3A5g!aS`C$Z zI@Oua^sj?34VD8$2llg9R5pAEjeKQsFpsY>a|fwNMp!yI#I8W zJCd#W_N_SG|E4_%dnBDkMQt>NB_)UZ`)!)9{MC(!Sm9Y65JW+r1y?>o5ldnHll9Ri zN`l3_CaR32%=(vT{+{n0CC|JDOq5z#?`6yuA$u7r2QtyP6gNsrc?$l1sjaHQ7~b57 zRz5A8+K>eUdsv8OHzzdjtr1Rn2!9`D$?WHDwkY#|qdUyKqPh7&?u{oNIeCZuW?#9W z5*)7GY`OO2Bv14n34#+d2YNa zvBvxjz)K!Ql||2a?OW%JmS0A$8{K)x*T~IG#FdvOF1-3S@xOfRKecmx09!4WTZ4&; ztU(hLiFz6u8n!r+birX#-0B7s5)fP%J5ru;Zt9y|cZJ%Yb4U)(OYt=R0W%~hxuM3V zA6mu#%+nvYTln-e)nfBp8ehF4tcxXBs{>|dXZ5R1!#B1EiwU(XCtx8)ISE2lXrv`& zs=IRKx}N_TBq*oE6Q_h%Ce^>{xR`gY8U8QV6#GuLkYf<%KdeSBmJEnVqr=086Zt(L zP-yS{2<#XDBEg0dkaK76&NmNd%4)2pi@|=hXXlpCxaBdw2reE zY`fIRX}{5{QSh%?4#5S*`GO2&PbfO@j88Ld+x>mKHf85^dI4O{yX^yc_^T@?hLLlZ z_k)9jI<0d?ejOdJ02PDa@6}otG=N<(^xSz7z}h3^Hit;;dJm%EofwY0W4v5k51X-K z;y8R#V@y9r_%N)dOVnJq+WgnwcXD=$0C?Es^ZWo1wEunBBAj1tt^p9KILJSsgRfKi z8-wICqo)|^PZ1|;Q{PR6xGzK%rD@D;I{z1`iKCSIQBeVmEQDN+vrv+~x(~IMlRyvB z)SSkomMttQg3R{IfFgljb_J_c!zrwZ2?^CTH9b8&60@B)mwuJ)4?}|9Hk_$f;CU!0u@ zIPGEJghbdq!>RD*W&i&DTToDNmgHT?KSmxd?nv*%{DX*yXd&%3qXL5h->#*07cSbWETP2}!{uRr}h_d=eKYBl1dCrZ? zNg$4#$QQ32#0MQfEkkYFJ+-Y zq^91xcTpsQZ`oFdh7JH7=#9hdLU3)y5cgN=l6wn~TE${aN=_(Dj(o_Qgg;i8U zx_`LXR@(4*8_$=Q6Etny3ky+=wkHlY-trz`;NY+>q!J+~eEMR^(MiAt7VSsc?yp=x zcW4!hLt0T2pzSYt|NpyvrqjJs4w9>Ll?L$JEFeoxL9qrx?{de5fSKa6e}X~t6J74= zqGVt|sD=Oh`Ln}DyZ58tmrt#3>zkX<_eIM;{k8zzg)s8#1m(WFy9;flU5-jpiL%}| zLMr4UEiDbv5m3H$cqnAl9R%_Mr(k7GRU)Pf?r5crm@B_*v(p5f`6`TYK!5iBO6Tw zYYn*-*z5vU0{L3U`$5Y++}lgb%$y!R5+`QX`QZm+$%jp^y0z8nV82A4>y?m^0bE5y zVMwC!TC3>;(0`shdbg1l{6fz@L1#nE`e(oLVcj(rW&uH`M5ED1}I{NR1!TWSO$~^*ubM<71 zJd8%nB7Ofsg|X35*74-X4I97aI3+tS)LW~Kd=R)@8VHy52Ok8&7dE?pHDYF&I!B55 zCvs8czxJwaGrAe$RsnL;XwnmcUc$|9^VblpV*1k`MPQQR!s?M`Pj^k8j~y=p<4Lc^ z#Rj&0(vszVJrvN6`Y*HPZ&@u2?+ht2Z!qe&yY^BxAIbL=&Pw0WP*q~#C@CrjO@ZyQ zUU;^s{QQ~#SDml3ek&25%Gzsr00}v(3gw8=y%|#p_+RA7%q_>4daW3&ROsBWJO!^X zyvNL7tVES(Z6wF$=QJ`UdJ8e#3s3Yi1(e94_hY9W6$~s4K<|Kh8DTeD z^JO8|i%TWpdhy$LK===dCepU)hkc88qFqT?Z2x6v?Vaefmzy|xW@&$EdHFX!DPuuL zVVQMXg@F8oPRocnuER|523*sWkpq&)>)mpXXHBpom-P zmz!NHPh^1sP-SPiOq9Okt~>(z^C1*{TG}20wf^4QICF^fO0G=a8rW-CkC3dRFKfvl zT=rmY4rJCLFblk{Bg~2Xf{V$uv9YmD)guaanK^0?#Cq9Bjb6dP}Z>) zAc(HX7Dz3MAWB^K7wXb&YQoO!V)(y1E;eF@h+QimpptRnH0}bY>~hz8_oidia?2Y_ zD+<)Z@!$8&G$bm@@_(z0yeFO?^T?b}CrxgS1h+@OR(z_%a=HZe&4c%EBoS{Bf)64{ z$bpbJTYnc8+JDXKvKg#w?n90a3=b3Y_rVgKRaUaMQs&<5bDJITOfas?KL4_s{vC;* zcP5~#>p-~R*Ixzuh@b+$UK{->c;ae8{1o7;59 z<;?PdM3Bp{)8hM|AEWYWt8L#=a^J|v{GNvr7u^z{ZJbMvtxw-_y%`Dk9r@2E$e7<& zN~Q44eAMw3>p0yReRcjF;rOz9;c%&*^dFy9a?rp>pNt5|>eo!4^u_`w)ER0#ju+5k zMydkVrQo7^q7MH=M@F;SzQ=b;1=zcj{)&;VxHxWNW`+xF&y>|UKcbN`rJ2C{6Ydjg z=LFIBSk8Y`ot5TbKwFZPI!XhbGER4|(|`tv{(dW(mq|DNwkr_Qt9B?9oh*&N>aNgY z90;M(|Lt;8TJ{1_8co0#O)K#w*BegJ@9^$?qA3(6RQy)|(_n7uGg1QBkzI%6<>U;H zh|nse6%oBJeD#BjBM>$2jo2Pu_fL#egU*ov8P2$@P67VpUg7*8NJ8meKjB`A$6!BX^?F zKD_6RTcwtk=@QDlf`USe%h8pn9Y!WpJ zsG<>K;{;>b2S6l8Q9*%|i!0$02W4V%5)v!mB0W8Q^h14VKoPFwh^v`ElzHWb5WH$k zvcRi`Hf;{iBqK(+Y@nIIP>J7>Yk8E6IJ{gxa4;bs;4M*FT#o}VMSk`I50vtAV3^1C zfyBC><1V0{qK1AW0pCXwU}0gIeP6wM2Q)T6>aT0Od_DQ-j2f&Qw~Anh@7Bw#@kyU_ zLHSETA{Mp;Yp++{H;`}W3f5KX0i=mhJX1kMfl;%C2G?!!AeSoPY<92l13+CeD&K2>rHk@d-*1UHzHL6!FKv`peW`O@Ha=>i5 zBq2b4JSrcsVx!4uX=$mP&Nq5HQ&w6k4|e>D?aAQ3MDa(wt>n)|UaePIz{ zvfyAdQ`0Z^hvSufEjq{ToE$UO7u%S zv+PyBV_~##hW}fnfc^c4?)%>Nc4m~{9{BrsPDyHU3C}%4#M`^zp;(~=jOL50;f}8I z3JhLfK;OUre3^UZRhXU?egWh4V|pkc3H1CywTyt5wij9YO-1>Wm6(+gmcKucnkziGUpe@GB`m>22)2R z!}8G5B&*2Qe7wGJWNW|D@psHBCrxrq(fgLw{7$=A*{FU)jh{fMiEs>YT!dYG7mM*Zun8 zUpNj`Qd^ssg{K!pM(5)vAVRUwmzB`{$?EbjJm58qDDg9}FLcLjYes!5@GbP;b!waE zx*bDITCKGwGIE7O7_)aG_SnsMT3-4$gvP|gQ1NJ*D_GumN^+Bs2jq_+`^%+Iq5#hY zb^%9zUfJ>0Oy0=9ki$Ta;*oi5Jhgi+?&$wv>MX;m?7FT^cXzjdba!mJ1(Xg!x=W-a zHjQ*D-5?<$Dc#*6Dczka&9{7?H@@HZaoo6TU2~3cjMtjY0?g1-1*Bfjh5R= zZVdr}3u5T&w-vaA1#WL>5XY?E&pE$m^RFPEFRbAKs}}&P|NU=4SqGSG$}SHES%0v| z|Tci{2Ni57Z$NVN*qT1;)Oh4>H%CQD zeM%@(l8Z&cVkx5|*(opS+8(n%oeZL8^5GWOqr($z_PoPEKNA zX8;XqWNdse_5y^3!H#-!@HL0)3IMO5Zeq>vud%#**q1N5T3X3K3{lsv+$Q>jxB;@6D&)FZ zqWLf72{;9NQ88%bzoHVrZUf6Gj$H5*Y<=M0!tq8+QE{;8{a&$ZT8(KJ98OdpFe-^j zNKlx%55NpaF4(^7@B`=~lfRS50*lfGow5GnMj-5O03G3AzA7g!4qI{Ei^+6yTwU_f z9njenmab9P* zDnj$u&(0*xdLw|&3FuX^vWg1KEK!4Wc=kYLZs%38*st6)s5D$3SA*vYm68Bu^9Z)r zniNVWeL%wpt^#S~&t@OG5OEoB&)|nTRYB+-%w?Y7HF#e!?!VTcij`JUG(8crMY_Y8 zB_Sg#D=I=v*3r{L@x`a2ihXB0NHh*i;D*Qee|~fD(o~*9F>Lw}XFRuBhR7eRFpqIL zHF~rv_!&NaZk~~E_+N7V$S?EC$jGRIZ&0wCMl-au8n+bK;+@R75zuLfdjgmx#?$#n zrlu~yN0i$OKJBkS#OsuY5KgXSWMr6gZr@~zHVW$z=#lS8UW4n}uCIig@n6arvBuZZKt-EG zxDWIWT+44gp z(WLWM99@j~eZYxd++c6A{GEK?>+vS3nN7O4E2R(qWWqoJ3V|hXyWAcE8ro<5et>G+ zUhZgMBxCIV&5H`pmiV~qF1k8{X35)^MXNl!N8g=);c;mxp=VVxA*rz3IXE4-u5;DA)!?H=~_nz&?AK8iVe84z;T;5 zCp`-9BL?O`%X@M1+9T2DV+9CH>l$xDS$eeTthVs?bVV7p!u(;iMpEA5jlnWhD;yK{ul*dGkw~zr{;#3JLY5nGumb->JTq6@Wx}W5F_j_aI3Sp2!e%A!gqf%z21H#D$SUY zDkSXb#Ls2%lF(US6uw6k(cL{Et{cQ_EXqlgD?h&adoezQ{RR1$LyJ&Jy9kdzK~|1I z8$XJ+g5}igP{T4k??OJdG&dD3Zg@@)mKS#=N{A0WT`C5zad%Q+G9J|c>w27|Oa1~0 za$za??Edu2d*-f~#szq;#w{Q29e0L3zdzPiYiK@+x<1@Q5l_rJF6g}t1nbMg@4emU z$J=?)rQ+s^5%lZ6Qt6OJL4a?c^v4{zzgimkLQ)9hUq2eH>Id(qWsU9i{P+jNMoM*j z=C$nX4l6PmS8ME$!aOm3i|qU9I)|DuAN*FDj+H7JLx4~Xo-S*l+l{cN&rJRTQ&KR8 zf`j59>HsQ<6!`IpCnud_zNL0s0IA_h8q!%-Z=adf(y2=l_J4f$(hv&@JbZA)a)b64 zK8^LD;2>MUf}h|8^uKk{fkLuY%?Pr}*4%W}G@K54?OLGmvHqI`mfKle==H9j1-Rih2 z1Dj-v77WAmn-nPIO5DM>H&~nz}lz)-_}gHg-&o zD}Z;{lk3+V->z{&bEqoGoMsQ+w9EI)qZ6@TihHxrtcz9uz9!}M30T@2-WmBQCjL(~ zS#?zZKhcEG^FN|VO1ibVX^9jhAdKEYe-;LykLgYm;n+1B)Xlbakb6!7%Bs0saz3$M zRD7pM_01yixMTP#1R7kdJ>1=fM+a3S;wHw%P%%+4(a;R)txlfDQeAH*^Wg9QzJH+c zJ4mDs41Bs-vjR;&p=%QpqoeWcxGxxQv&3snFY*`P@7`sLAo@b0LWvj|88$`U7%Zve z&?_Ke++Z+R7k)ikt*>n*G9w2w^L)h`OlF<`iilz(03v~3?BYJw{NWMVSI6q(<<(V3 zjwJSJf4`bjB|hWv#d#;m#KJiG9(;R-Ahpm-R#y9;!)sYB?jP3L+w2>iSp6UQ>FLck z3x{H3DM3am@AZ3LUiG+@fjG+0sJor{9j;F4L{>KDn|D*)`T5j(D^yFy3?6G)F zj3gu78Y~&06LW$g6KK*O*2^1W|BULJ2-?p%0H^jH0W2oydbxEQ#L1OkmljSda=xD! z@&9nY6#({0$ElhZMz6HA3WLVLm)3RN4W^k;=a0zP0IC@}G;Ey0GCmBW7nLI?Ax3%5 zjUjS8n}2gp5`;=rU)Fg4IVSZr_#a?g(U%C)_;EYJVP*nwc-dn9JU+cBZpyx5ldnH2 z#>dG1hZye-c%h~mg%-t9ZN|mJ(_Qbbrlz(ZDy5&ms$uofRJJOwG_Xy8>1xH4kqI9^ zH~j$&fs4G>mzP&i10mY+m#_qi{|ksyP#X|PBqb%9WsAc*(dfc9mIp=o74W?x!qLrX zAOL3}y%e36mP$~X-6cpUd+vU2KiQkOb$;&&z6tX`e|rCBLBHmeOCJDc4TMckcc`Ig z{vU-A-|NqCxC*S9JW?t91?_*BQViM4} zH-j8bDfp1x!ruL}r`|87!1CCqop}Gbw)KDeFIIx_XQMpx9Z45>d*Ud6FRuSl0Eha9 zvgFxX4n=ncstBh08a|WSo$osFHQ1R;n}nNk-_qa@^!Kw&uU{5wbAqi&=jrJ_BB7wa zsoBonK0wg3vKh&+@LdUiJX(9b(2j!iJxU<26$1}uSk6WWDQ`_y68@i$cz2q=&M~;m zcfZZFw=Xw1`8_=dyMOsVki5Tu#^ryJgn*CK?rw*@L%vXvwYK+r+n=^3C*HRF4@v&h z|CX@lN9CyVBv39vz2u04dXIdJ#KG+lb`(*CNu$R_eyDDh(aSfnA@k2#+FCrkyx_+g zwM|Y+t{^WDZ9w+?x!4r-HGH6;nk&BJKa4n9+MIyEWY`D$IS?|2$vL@NDmNV&N&YkU zSLQVT+%}=N?2)_C^DKQC#M1e53L@^W))%TTzEqcS>=mk#9BLMGd#fOYW;bYe+{$ANf8 zC$@=ClC6(VGgy`}oAtqwtpS9=I@v~KEZ~uU|M-^*P=;Mu`rjYsQ>`aFj+cy!DSkkH zdl)UUrra5BpmpK%d`ckM1D<#yjiuq>%5F*TuWV-G{pcdmLl zc!Ha^3?H7m7)9i}wlK^BbT;N&;?+{)H0CR~omPa>3ua?glMWVRZ|~_c+*}0S^mipO zov|1#?SF0lsN&XmpRdD4&)E`>#8FGm&Cc?HWgi?t%F1?A`G~^Thd)_`mYP4El(a0m%4&CLtS%h6xRNJ~%ZlC&-W*lHmdg#N-qL#M1s$;hO?1C_78x7QTQ-6dY; z2rV}O_?w*?bzo-%!_vSa*Q~kApXlSSv|-jlAxvEwL%jwmr#tp8$NLtmotq~+vjkRt zk800P@PK3d;O=fv=b)s3VFnWEIa0+gtMtViUNwQQsMQLGdjXMc>U#$Qq47>DAaJht zZni|TtE=nz>Hh5SXSvb_0HaTSHO-8TVOGunAXMZOw1$FHP~+)xX9QSI&YYk94k%BQ2uu=` zvg(Eg&@jii#4*DDgwK(OnX7q5yK28m_1jA;sw7?djr~!vZ>~1bs+Qo)HXqu#Fw@lG zi-$m#0ctDcf7T6rUQo5FCzUqciOOnP09whwJ9Yu#Erh`d4i4@i@Gqs{O9Y*r2nYz# z0Beuqc-#8p`WwOI=u$n;S`^^UJLRdUs5&h=ae!`cv{ZjIn82f($Az~B>{=is0h>L7 z6p7s977vCO?QDDiK3`jxcp1C;zF0OO%Z%GkBSBv?Fk-7o$ z#_;Vsu%Met^ojG5k&u9I0XhM$1_-{tr=6;^eIthO2{h{g?-(DQPa`h3GhZ$WK=1Iw zq%NtAje>WOe=S#F3$JG2;y_pL0l4wUKzpRK6_J=Ao8<=fed>>YPeWf(;6>&vRGCPE zvH;LBJNpXy!RODhx01^t;x}?q(p!L;0AMmA0%fvtA36#69T&Rdzz`Qv2FytVs5EHp zh4*X#Bnjvc0A?_vct3bs0XJ-M7|r$sPYbjqbiP{9Ar|m-I{?hFsVQz=Ui@V8I`rg< zHLkLM(p5dqm9hS(xaf2zRc$Vx>wN&o8@G4_Hs{{xgKtSV)*~px1lBJkf*CBPrF1}2#U z!X0MjO&_rd%scRBV9EoBr8BkiiD3$HHXoyZ6a^Mc`VW?RE+{0XmfSNG*Wt_m6XgtG z_b16-yZ}wg9b`wZ4bzagK>GqsG{b5j$3RsZ{Luq=vjO=8k`Aco=)iIV?*X|Vnvw7} zg@mtO18?w>chAKy^hm^W1ou;jCh+j)rl*0DqO7R6eslXBJPz1UZ{3dga;qT5tE;QE zR%3A4@Gls_mu67j(2(2!#r-E}XDY!Y)C5Y_(Cfk^p1m z<>e)-pa8$oH3h2T04#|d=MO5`ethI(VPOG{m=!snwqQ1Q(~_E6k9~8HZNwXw>un`H zqJu=#%;+X*&vav)xfKLL&=3o~XoG}QzifB-6U@gepGLa`SEKx=%S7U#z z@8Ng@{;_<%Pp>WUG23-V6t09QhY!qjx$@BX^q4CoM__gX;hJhZbwiev5oIiwpX^mG zAt7O&AX!%1{rX=F*HeqNX0;+XvHz0MBsH|PQPDB$Tinz_u@(#YlJ_j|FaA_c)OoiS z#W#k-V!w*Of|m1SnqonnY~zh-z|I^I(tAOsP0K564t~2k>z;OsK!jK~KVM`+&Y!@$ zw=#NApoXohl*trFmw-!6g86sqqT%U~pnUyvi&F9-civzygsNYrhcc@dC5A$-y_D#0 z`aivqAMSWfs9nZfwEzR>Bt%H02WNbcgATy(SsNdgJLFe5uav!spS#)<+CC>oWqF#*OkNvC=-nB0RMBhPD$fxgThtqH{xM69MY>#E8nJfDaN@A?|2xc%` zqK(owN>#}GF?ncsG(po&>3<>Th1lcgVIUppwVhN{BLd#lK=&!hrn*ai_GS zgfhHw>}5&cv@8>$`ivJVg{GBurgS_!>NIrw_No7~^Wit&G`DpPO<%Vf?<__p1-c8N z;@e{!QLE3)th1Nc5~a2<_cYcQI54y6(;{lhf2@<)$t+zlUaRt&z$dej`PpiO z2>CMI)LA4YY9F$uIN$iD19z2`wOn1_K>tS2X`|r5CJ#EWN8b*e*BfwZJ#FQ`xLV5) zCq~gQR$I<%dOxe5Gl7{e{dyjTA>M|)cOlyMwLm_u#07~Sm6q?=Yy%5C=^=`yhyUW# ztQmG7`ZUp{+a;@xfm}0kHi`*6;b;5$KN)lkzlz|J-<%g6<&m{lEa_l4)ZB(x!9^rE zxIcxh6)NF>@F@_!JXQ3vBQSxICQcj(iX9kp-D7U&du78O6lxHb8b^Eo5 z?u$JIJSW{?I~-}FQ0(sD5ZvvmR39C~r0gR(tzq%?*FyI`kF2i7o4}Z+i;iyTVzt<)ez^IYy5a{z;FsB|iqJX@UAp|D^9Zmsl?Ndj|awbClCHH!5XFc zy7l;BfKS0!hm#;O-h}zJg+FSQ{S=dk!eoz<(Xx=`+m#OL&bUYXL`-ipS(virKgUnu zB|#5nn%wFL()A@jO7!3h?UR|^j4w8otkC^d$2qw;Ij+J%^+*d4!2_9rS4O)$zYMyK zAQAMtAtV~JAlSB0Iz2N(tNr?QVpEehsQ09Og?JcnwW~Im2gZ~#raUxEZX?FeRt~X& z6RoXcJm2N#-6A626!I*xokbd?=EpTL(_;(sNsAxlCotu*G0gS`Ana%-e`1-5!d>*k zN-62zzU3F(4j-jFS5LK!5NYgY*V$#x;g=VFrf5@=sd~*lW@EQ5_(lak1=TAym}KC{JMkM-u_64+aGJC_dKO8D zz?uwlKFb1yfQ_TD7K|9?#Ve_JheNCMeCgzzxL#}GC@<+vb}fcTBDo3~6-L7cd>l`h zG*(qCTi}0COZY14^@2wx*kr*JEQ`GWa%KrzAEXfyEA*7N^y8B$Ws z&CR@4qw(T}O{%>E1HkZXHc~3dAnm4hFTnWzficW_n~ft8Vq9&bZgh4+%4~VTHEK4N#RNqn3N{?AQ$-sF$!a2OWQN4=JgEq4W;r5NAaV5t8e3 z3)@@bS=pR|Q#n!F*guCi`qZ)fuEy3m6pos;l>H3?b)2G2V*=i%=G+pM+flOoWMx_$ znq+#)D@PGB*H*2;83K1PBonQa3$>C5)YE8b(X*5(A~~r15X%nC{&%r77Y`b(l-bYH zr!!i~Kc9sm*;CrqA9&TI0+~6nI|@dRaTv)ZY=rv6NQQ!~YIW+o@^5pL6TzHJW@82V zp@6)0PUxNtdYM7LN-KycGIT>>;SCy{Fr`5NWDg<+rUd|~HfS)50XMMT?kCh30ZvL@ zz8}!go4Yp8R4W(-YC1|QEX>J9T;&lNDYRk*hz?SRET=>+dz)ss zL8>h{-wHBl8+-IPuI;14_~aQ=G>njz+^{FU@1srqAo7wgPlOS_k7$*il=<{^?$awF zWEf^T)}W#fK_c2y3`#982@F%LvqfpLYWceKRQ}OhJWoZ6He;AotV2lHTeWhJID^3FK zwdKeqf8;%lQqW&T=UJ2KD&(Q=Lkfj@b_6wgB)kw{RBKO|+;=dS2xEI%=43iV^G#mm zQh%FFwPL12EvHa5C^HkCAD-c^vIeUdq`Gt=oj zlR?R*3+8}xIQld$reN>P`cV^h53@e(qXAQX(!#*KZEi#tujzV0`^FCpgsfR9yFEZ zNlVhvnN8)(fef@ky`45lXrqpfk0YI+(Sav}AF$4^Gx?fwN6aSAt_iHWxo6=q^N6IS zWq)h(pciP~VTXK>mncqZsw~OkpPrEy?bZmn$yDFgfJc;&Q83pqH|HxQ#Ik)uKIYN& zp7Q8ybM4PGR*4m1;n!dtk1qV9_ILaKcvQRC4GP#v-z{JrI^y7RhO1QB-rOmQ@}VnN z1%Ksi2rsz5C`lwr-wb(9rk9{x@d-X8+vxg0NU4>Qc3D>$SzISOA(`JN$ff&u5c!^b zf#gw(Ix9-9{jUbU@wNJLqUzF|Y)gK1;gKHsm?P^c9h@I!U8L>2e6g{H`s8gPOr3!m z@*)rZ_pFMGJ^kYEG&4$mMzqUw%rA&5+JY78M?|ILE>X-k_uu)h8vkRYqCum4R+o^!r;&B^0g!Xt2!&p|4{}u%QABAyi(oWXBfM1J-(Q=XT)lh&HY8SqXF%8_HIzup(men2>m zko{`8isPuJ)s}cu6S~r zBoB?`^H;A^SLy;Kg;tr5`SI;Um&egfu<|SkXIzgM77WNZ@X41vgpTGB-WU@3ls`*@ z7#krIZ>BoBn8mRlr^vMNKF>B(5T>u9O{i9)_pu56M6ItX;3{{f%!wo#bc4CrEOE+0 zB6-27&R2QrLS?e8(Z|6fURIjN9<3gk7)iY?M@V>uMqr2lO`aGTv7atP6|Dx++}=da z^ZABM3X68(W(IKgNlDwhF1kVX9<(lkJW}wsi*eOk@gFY;Nk#gWm&p|edwSr};4Yz9 za79eCwC}*a4N*BgJ%tE^I0Qqn4}g_?K%E>Q9H4Fj&Z`ta<7jX+1T`fKr5!NM=3!)o z342m;B&I~R%C=j|*%Bo@Tj~Yeu_aObhnm=NOHe8z6T&s|a~MbL9%8Q8%8_rA9_Aqj z{TgBvQ4`Y74L#l5wCLzkH?%9CWE!_LnOJAru;zGAUzqZ59^eUy`2ejX?lbC+AAZF$s(HdOUOQNl#Lvnn5M)I8_#6-`yB-;Q+=dI4Sn?b@3LxT zTck`uU@ZQrcbtUOYuRETBp7K`yy>wLE91H4V%Yps?w$^pTo5~(KKaq2>JTZ zyc8uKp?ZU3IFxEcc0`26`n~%VKiL_SVvNf$NmI!l{oAPRrN+7a_FPB`13J5XT;{0j z+GeLq-I;&s1MlT|1i6L2EM4!e-5#MHv)yD>bu3hzohWI&+_{A+oK`|i~C5B^YzqgD<~SaeF!_x zTvDrB-@ckix(8Ljm{|Y6CZ| z$fbE(lC0t%itdsx%F+^6+O`!{{OIG``0Juit>aH((A4BXl5eBd?q}ICxSie|m z^fjh1`d2W610x@to6GHfqP`%Ke_GY?WYFaH$ssB#3Y^C9h=}=J^FY*wfWX(0EO7!@dU`rftc5cX~t}ZTLk1@%T_A=K)HO}!w z8}Ic9PE}@4hgj`0;kHj zs{v)_HAG3WEt!dADQeq)eO z!Nu-GUM{3xyhtA7p}e1l_9@15DsE1%x2IakgMS1q2RpQ1WL*;OPPrq|z2FBe*-Z+( z96kx<>guty`z7kq=%E^`-zda;^nuG)nkBL6*Eb=Yh*UWnw+fG}Vo36rxHKd!QqclN zj?g)EG$+^@J#t-cHNohKdp(WZc%@Hi`etTy8CvVCzMvy(NDYsgTHSicfET77+-e~T zlyCS7%ZHl_KE{0xnn%k=-KJOF88{&5$IB*6B` z*^-%&g$Blkz)%r)O6pc_KCzs;$e`2feOW4ZhyiRvf-XJUSfYNn6gs53^; z3kFMMAiX8kmZ+|8#qEfFJcQxE6NOkogfy}Gx4;XpBn~GPWujN;TQD|WL7NFY?kLF% zwNyIj5h;P$0+**j^Tu=G>u9M;!xfd?q=6QS{+BPa|H_P#dA(r2mVoE~@=T8(%<0@f z%(pafwi7bK?qqzhS*XFBXwJr^#e;j-LZ9xJXYqwl({3wOwb&SfO=5^$s%wCz;n%?> zmRo8<*|ZEU8=D+!eBmi|5~fM8c!-d*>!Ww^*nYA0lgtk0H=@-&kq!t?Wup6F-{ zz?#Kxfl61<^vlS|h_m?f=Wk#)adQ_rC`0Z8Z2;#lI|cg!)eJ3E8YSSV)k046rIJHV zVO5nR$lL(|nAsAv1U)@H{gY$YEQU}qLkwb5Dq73&=q ztY~_DE{)>*S@PaqPkCZ9ql%i|^91`(qtt$=6{WCoQBnC*`z9)LGMx%8Jc2!u=B_VODkf zUF5-ckA+u_MWl!3!JmIYzEYbPAI!rjp!l;>)%GkrGn&73jZwP%i|us_YvI0j=LNei zrEm6yh7Pvz4x6~{nRXgK-~YF!9^J6^!wmG#X|!y|QUPJsg_*V{H`x-2vq2Cez5Ld9 z!LD+rb0-YPd@g*nNzOAy(>K2h9Y(z+1^de&lHT|x2-}#XzYww_x(;={Vf#XP`r51` z$%hH%pSh?WtEYaDz0F~QISoOEb>3Q+_i~ls#+RIHcX`A)doj%39gH-odCIh@AX!WJ zc4}(Vd?a-LZ)*H@zMmuCSALNTl4p^9Rt4B^@Xg~v9yi^Ka1#Sa9WOmqp0TA?(8~S( ze9I+qPe-phMMWT+$2(n2*D1F)s`!z*XXf-M@Cg44u1G=24HRsFUEtqsFAH!M7htso zO))DgE4CrPzM7PVa)C|P7hK^1t{KXG5dr)w_*|k0eQ@Co2#qSp$}TK!Y~aXB0D}TJ zTkLFXPy@(R;L-K($aG;m6m%Ba za`KEd|9dq*jLI|^2ilJH_758yrM?Q3H-U$szl9^R`Z&yx(MRv5 zeIhYC46bX~Jmrz`ra8xL8 zY7)*4ZJ?;BIVDZqfb6Xwu*;Zv8OedwMlI?8O{ap)5HSy(2?0c);WU0I=Xj#FAt2DV z;K7r^k>hUJ%H{4_Scr#_2_~U;3+De41GRV$)h-qHxCY-jX~sl9iegp~hJGs|(@rf` zEg6&3=|f{VbCwrqpDmThaWaQ2x<0jJh=2h*=N6_ear>8&%^I78;7Ll9Lt*OfMGtaA zS0mJR7MxN|6)hw8;ZYopoH&=VzM9{mx)=_~LB{x%{012drP9154-_)FJrEX+NUd$3 zQdn?p#5!k2#;>|rY|OU)P$FV$6VHF5bK3A+3~eiMihNchls1)Jj#{{p2RZ4%bI?1qL{rx%Hj~XQBfrb z3%ly+;g{**pWePXVV$0zaB(FHoYplMo#kPEHU7FwB^hIuvqI>0FtF#D){ZRsbwET^ z66e<6<7XVNs{juHPBtSK!Dwot;)~si#6hqvSO_)Zp@xoz7?v7V?h3n-rmU7;xbH6{DG6xogkju@IhMpd?$JJozu^psqLMDoxZ8-X~fS+KvY7)gg`+GVl2CKc1xe1g8Cap@k?=Da?8{T6Wc!zbV{VL zwn-Nyaz89#mi9Qy)`!2tJ%eEgIlb1>r4$C;5gWWgNtQX3W+pJ&<#gUu_Ll}N7BSQ+ z9*-9cIqn%>n~#RU1%g;PD0FiV9nI`;tK9LJg70#7hf9zj;+MO3-iEe)+8n(nEWQ#}+05*u#v|1Fzg}Tk=L}9xUub*8Ng7+J#@+4sVAz+>j7Gbk z(9ml9=IPDNHM9YnIpfRlht}9=hR1v=$Se>#AtYli>c&xt)71*@2L|3fm z!o29l%Mqys=~A9U8Qf}~*Lqq;Y-I*7{0=trhg0}pI88<@tBHKjSq+ANg@o|!`jStu zadKvUt)XvXXwmy3F@Sag5XryKBy(F+thY9Tk;&((3|stzwfq2BRNFUk=GCe6qKLK3 z4$_G#P!HL5;|8?ZaMrS?7WS9Ejo|R>YnEDJ+qG(3}@ql{CJA?DAw2Rr;$#|t@xnQt#_^Y$y^{eEQl3i5t^_;m7H zJAn4txJHPRGfu>JdVXHFmoJj#4R^Ku$VLa0iZyyRKqAHsW>KrsNPjB9EW)+icY6>Q zyjRA?E1z5J0ZNC-Tnl-C6SSKfZF~-d>1^HJbf*fpob(W#qUkCuMLPt-B`s`OW4er`# z)v3HY`%umWQgrQRw>)0$=XA7Ihdj*t)A4x=O49($|EUwx=={AW!WEy9S@?rAYJ=kn z9uZN4)#F{U+Qsc}0Dc-B)gs+Byep8mEPjmBxYQYxFiIlhHzLgOt3&|c?cr3dZraqa zuiOY?iCv%Fh!mPb;2&)+%&dPH+vuoPFW)(1mXK>c$b~yOEuimR?M;AQRx>j*vXtK~ zaKbenCk8mb{!rm@Lgfbb;}*w&n|DQx^WZ1i;(mf=LTg}P zXSc_3<8xb6bS@D4u%p}5R`>q?&%Y*3;Q)zGX(?&96PqtwFfCC-f-dmIERy1jVH>l= z-}mrsch#3BZIolkG0UwRei`Umdo z?o^nsqGwRiV{Mz5iS31yg|kDymHw^$Vnu9;t7ejr{zC$RxcAjtEnDrtII ztOJh`2-@lszmh}OJ882d9wV0;hKx_x<#>U@bw@Y-^JQHlz0Zp&W9Eo&47)HpOAV;o zQ=qPmaO88BGq%4e7_ex_R2jtIUv!6-&J;g$pMkszRi`?NG{pS=Xu|u|tBSdA#@2Rr zA|H37udn&y4_sigjt@>w1Z;5PXX?v!12e(1ge>vf`Q_o<fq^vRICExINJ!amrHyv=*u58*MpABr!^6!!JHwj+ z&sk!YhoDEY(P4FT+{DRn0T&YXbS@*x9P8T#E-sjS2inv&MELpn#o3KDIe*rc25j|z zAfbcc>IQMF{cwf1gGd3av|3b%We}IfBJ)^}S7OXZSuk)z}e3_JLE3f|=;;E?_L8Nv}j_ zBaKPrgk=Qps72@6?&C&uyt+%w?gdmCNDmI4*=|~_tFk}-J@Ir{^`w3y0mZc&g04j6!hLL9U-O=Wm_0E$Gnr?a>>F}PaPVo`brCy6A@q?m7- zIAJzqK}LsfW7!acNb<6WXat(TJUu9uH!zK+mP1@s^i99GFL#YCmJTBRlu~_kQ(fZR#R&F0r4`F(; zzN%+$@9e?y9_W-INKZCb@?%IDhzL`PxIhF@X@f7Qs5mMNYp;;Q1o-*s{i4o)&C^bL z$@5lGM<>u4nlARMRWGCL2g1T5D{FJoQcQVOeKLo(>VV zBhq@|1-W{9K(Cb2g%?3i4ECWC_2C245cN|1n@b(YSc~U@bYO;fB*2+d8%S@z)OIT7w>->w0iMZe2+%LC23%*XFZfc_d%_*r)TRwCEnoLTNV@^ zYwJDG@ynb5lHSbat2tUc|cioWQBaEj0_VLum3XzPz|HC0ckp1RZ&JePR((@U zIXptlxzHgSpK(5&cvSYYY`C8(Auqsgu>Er+EImtuYM}}GBbfQH2K)Bm-@Ik7k?$frsx-yT;4#%QWRaJHOq}Hs= zR9WRPPwEbmo-6>Yh{VTJ3X=9ta>K^AD;uZuOP>3X+Siw|7PX1XqtEYgZskL$sFUG8 zWH;SXgAB#b3|I^~P7|b;xCm#;;76RokS646W?``nYgPTyG84%LL>pSg|54~)FjvdK zIx=kugEnauFQ!B*w99GKLhC#i-R=E8MGMNz=Pr$*7t%%*Oky0K3J(!NWk>*}tOZa2 zG#d*AIQ2#(z~$kHSb$jpRP_Wr9;W2qaNUL3ysmiygYUU_@0!V}2&rc4YO8nB-9};vI?<0mjP1TmQ&Q4CNPr>1k>}(8_^Od@Uke&&0J-QFaW!M+K`ok`0oP@VA#aM4jxX67-sE8ad|z!SG1r(j&F+>lygR#uD_ zXvgXUQTBuRkeiUD56Nk4M+Zm2WZ+3+sZndQ&f@G$;w~!Sj5U8=I5>g<|MJBn1ZDzj z;qi+}fVL%Kwsa*Ey6G1lTkRC&LKHz~B=|9{>54kgtoAp7zKG?`YGz*BIWaYLqx0En z$MfCD+nW8*;b&Q)LBzC<+s|{hpxM#$;l{P*pcj;N0&R(_JCSGg3tU7TAhCXf5{K0e zaH5So?dB1KrpG$Bona8I*ah%Bhxm#*m*Wy2Nv-oz-6yx;{sNM$gaR*46KmskjfJ-I zOS>paUX^4*yIbTOi^UwHH?Ln#ebkz>T@Uv&eSQKVvaV_ZB-g$1Y(%Mvr!hsqyuV=M zyPh3_p*haz>Vm)f9TOQH5)1e8;AH2PgBy3y{8AQsEk^HK6728a_VbW~Pm$57B9@m0 z;n=7xvsKOot=Eo*jR=`Sw1%)iS|e9^9&~6of)0mQBhg2I%oqr39vf=>1Q#dK41xhv zX|aRFE{dSp{F1ZsW1>`Rmw-BaqMmT zIPmx=>3ai{g>(yvxMb*vqa=5E=&hs_&D{(1od5RrB;c5&j`9b7as~cCoXmRGa--DI zYdJ{|SKGGt1F@+Jak-b|g5RhQB#eg4XzwdDz6Uy#+(2`mu3vaRl9g|1G=fxG?5*GN zbsDdy!|%;0w{_5dNlBLzd|niU-*z$=Hm3?T;Mxf>8wFXQ#P_~`{Oi=r3}D~I z#oNG_9AI_~(Nf=--;L14ggnX68gUIj%WIs^U3%V=O?*LFg z2r~Nbu93;OqZchlLJj}%F73X;=M?duU7Eh^)>?Z9jK8cj)J?I&CrqqHf9%5le{Fqt zJk|04??LvKJ&!G;vNy-d4%uX6&&VnwD=U;)wxeVxBeRSm*?Wd;SxMO;_oaIu-|v0g z`^%rz!#SVNd%RxH*K@pysNkBdxU%v`Yd?HF&(Y{Xz}fo;zq&4C>=+htGRoN~OUIOa z5j*3U0LN|p0`0j<_md~~JvF}XqKNNvyF8ibPCdVBx+P|fNZFqG8nMM$W?sj9yUlYT zXcS{ z?N&zDM`Eg8wtLmt7WNkxJL8gW%`JY9O1q-!Qz9i8lI$L>1E=MDbCTwD%7`0y#H2X#rS)J}!M!h@q7 zR%!51{|>hg7_6!vj37|tI5h=eB`X`Smj>B`DMB!3gE`%xt)-y8ESmf5VA=zUesJ9Z zml|+w<%}GK**sjYLJW-R|KtMdSZH~ND<(~dIg2fKF+ z<>2v7zzbJR{!e_*up1;L1OEKsRdHydqH5#zM|ttR3h3W?k40CM|B81+Ai*w-61#Q*H43mW#~8f|{AqqPrI8^xw}_sOSTD z5H|UUB&`&T5a}){;?|v3*64e4#Ss=G4%oaN-og#~_s0l?y(q^#U99R?J zI54~_cAr|hWFd#-;v#*V=jJY0wd74Nap#oZ?O(vk4R=Ur=fujs%-*h)<&#KO zUr^_y{j^Rhqpq8i=k51B($8- zn^{Sm-Q%lF3|~hg&=46$G_X>X>kP?p!a_oJZJ^Bqjb@L`_?EuH?xV-!VJiNxS0sDn z(@#gj?)F|{W36`F8l&f!k`33;sVQ#G#R;JDT4ZHT>Kz)&%A2=gWb>QovSpT!Z)F!> zbH^<9uyK#;$^G}kqADb)XQ(@JuevcE#|ej4stBEZ-NlX;6 zo&IQ9@v~<-K);3vw6n9bJY}e>2MnmwsoCEPB|i3uej(f~1xg<}pcYsA9(`UAJ$ z=^O1A4=+>$2K0Vv*sMSc zWmSy?btN>VRc{dJX!r^tjadFbnEPM_c?JjwO9g^bm=0Lj0NLgK#;7w`o`T+1UXVLz zWo1Rcq{13_sW6Ima8&W@iq1aYIktPQ#UY6w&p$?1Dy*pHLr*Nv-QUJ_u`9Gg?AVta zhF(a`N(zaYZd}__PYSWRVGqU^_qQe&Ha4Unxg}xsLg9u3YF-FT1O22{w$vCLq7xG| z%{Mc}h}Rb2Zub=D=5_>1Ai#dvlHLU%RRt+xRaI3A%_WPaA3unXwbHJC?CbjhhSHAx zS)rct^77C=pp)f-F5H+QxCb#dTYoQnjg6d~yrH21psnP-gvr#(35Q9?2)#{2$q3ov zLP7t<2Ky2ACCS4IRoHcnXEvs5TJjc<`DBe0#iQ?39LEc7jui`<2Qn29JRa1qF& zL#|pcf%|cLM+autY;(|i=&7nyXLVUJ)LzaFqN*w*?@n`!Dn57T^}EgfZ%=X#T0c&E z5Zw4DmWDvYHN&YZGPtvoig&*i^UtM~XTfhi% z`cDU$4ypkzI6Nn`$-iunDq?=QTJox(Z0$kwT9(8I-ed^*XDu_lPY!6kbQEE4#u zOW^dL-|R=@-}kL~{*X^tSYQ1U#1YBMw}9qa+-VTO@epjgc=ffEEtRx7 z8P^oldykHepr9aTmZ7Djge4E91Sx|U(JkQil^d2Cp+EB9uCH*Pt_1-$GTGy?q?@~Y zs2HUBj6+a(!&DXVz}hciw_B{D`PDA%&k#B0BZKoK4^~@4+r$ZSA}8DNgUAaovRBt? z9Jdm3&CGX2d;BbjwlHmiMhdh&1<3G1D0mG^I5v0FH2i*#ef#zopnq_b_XI7m>w!RV zEIg*QwKd=qhVcr6@*lWGST!gKGIMw$5sG)fZy!>n8Nr_}w7v4fH(dw+IZuG zUAV@gJwuhZ{&5!Vbvr-5+A?{D6{O}LJ4sdlRX5V^1cF9&4ev0GZhMK9so@_&K0@)6 zdE{XjE}^$VJfhcyZ-<20yUx8s%NX@vv-$vbesTr_fGqpRQfs)>d;GLqd-4|xrzoev z>qB(>Y-NzSkvf@u5{nak!;5R*iU1jwBl{Fo)FZm*{n{`d zK{9ZXheV}(N2Ff8)`z5$h;*=YDEa-o-w%bNqN%k)lxz5N5abW0ji$7MWsj*0gs&M^-yp-nIUPg09fVa;>%P^OGuA7 z^Pj9Bu={*b6X6=5Ly?QBs;cIurp0gE7JYBHe-7eAzf6~svi&)eznz6&quV2*rCBnS zqd?Kp*NinY!}UPx@msyb#LFG=goMQI>&tui=1_u?(~)ZP){V-YU zt7&2~nX$hKWC#K)QWmNDamV=Za3!$#`1>#$?zx@U7cg~9{XBRHDnogE9)-SIUtH(V zu1hkjrKE6*-RcMe^@gp?1^j|XTJEE2TbZrn{ddng;yXGf6MlkxK(5p%A}YdAy!>0C zM@#eBANAKwbc`Py56eLctnj;X=?m4~JQKoA(0a6e_4TiYab2ICR`bIbbXP=#rhM@KTT6{1u zHa;ABrK-dHC98!}xwj7=+@~aGX0r#0tkKhGU~ji~$l(?wW{$0(k=Czph#7M5Wh`F1 zq{8$gOOEQnu^0FXew@6wB;~h}m6<8+wwCZQJcT4VNM%( zmtw-A-Yk+;niJ(5UUl2E138kmwj_%hAH%v@iCotGa&47;{+vKLSh@F>yeKX@ z(;4skNV*6ng|_co$AEwUn9iD1x~2c@h)40F3{YZRqAm!Jz8pz*ZtgE5)6?#Q=o;6+ za*L+!n@2DnX!)DxH&3 zuuNHQ$w^2&m-^u|z9lIeaBwTd@a9cF9|MuSw1GxnxTce3Wx%*x%Dh@3FP}T`aB}Q?mZLUreUB zd(sawH0K!0CAf$2CV$7?uUtf68cYb_Q&{i$0tc-uN@wJ~2Htrna7F{n}2;7T!ig@-kMOqCd! zh61XTwK5v_(x9;TdH_+n z3A-N#7)Eo*nSS_~WMH4Y3fDhPe=dWdO+Jd}(hyPGF{D5KUH#yRjWHCLhF^YqDkCiH?Pc6ecAEe_Zs%wpZUe3tA+#-WVzM4t*Ib-5Lb;>l3pF|AW?%t%-++Kl%&mx^3dT|MO+Ev;ITUGtzx5ynLk_UZoVnz zo?`s>u+kRmY3^i=Ev^AGWtC{D@d@PmioQh|xw%bOaRND5POjf^jF(W85Yn#J;Iwgd z0p!BtYrVo<-Ug|VV% zn)qaz;6zQ+4b#<>2yBn``!TI#YRPB(_q|=^G?={Sdb_^JlRu9$G5VjNtGb%%a8I3| zshZRR^joV1#l=G%W4>wcr7uC@LF#pM^0sA0^(mr8{Vsz-@o&o-m##$>-Iq_xNj%%Y zHg<}$`{n-)8{t~TYscmF*U*uAc~##^$xQKxK46m8$`*;yqP=QS%lOH{tj>95Q7F`O z{T_pi+Fhe3Qvc3h>|^JcS=`boRm8`pW)6PuoQAOC4B|{<@&{^{j+`?KT$f|N!X_nI@rVJEAQM!K^ z9|QKHEoaqriC()D$l9_lrI@;TN0=BEX~mvKgIKdt_rHAryz0;XLI%H4<oOq+I`J4fO3zz1MWEn=vNx14IQSe$J*j-^{tA6BLM_&2IPqEa9hLL)3SW|s zFW`()VHMrY`S$I3l77TRwQG;OSN3}QOythJXNpTKq5Mr`zW#>$v0l5Q zrk7iR9s$k!{Nhx#Bk%U@JoWC_r1+|`Y!SPUkwLWdl{b0@251;c4AC4U?eG0cf2wk? zwk|MW3*Kit!5ixq34bc^sdOf;SD=IW^{+7Hn~Fm6vuK%2$`)B&bHqkMWRa-dS>%Rb zN_@LqPHaP)^To${gPA!jbXj=AvhdE<>=PYgtJ>ci%rDIR&ToIi|CDOXoP0$on;Z$MFi?40_>#{OLSi&U|T&Q%M18sWR#x^)X06c=~*ADf$m zR)yM`;~)HYAyeh!EHpjPNQ2js4~%klOg|LX}O&`H{} z-<&#`6OC%zlq{8_pM+XJ(XCWFlG72sc4m90SYKjD#|!4?JfR+_z4wCXx=0cxf>5+M zIJtmEmR<)GrVx+~`q94L-VaSpF`R-GqwtiM78kqsDlkiQ3=Alp#9HqJpZ$++8` z+#h$KfF1E!rT569=2%#lJw)YZt{f93<)z!h5E-T#Lu$R4|Jbbo`ToY*0b#-{`o&Ds zLz=76GiB}X&uvPt0g$teIq_Jz zSb@Hh68)v%9+1r1#Bq7&Mz`6~MR-N8PYTr8j&93iJll*_DS3E^Sucdp#y)ZYRH1ty zlnY#5@$m6~?d*hfLKEe^+N)Pt77_xc_2KZ2!vmCMuTz+qn-64)U*qH31YiWf7ufnw zU!Q%eR-kski$#Q}bg~i0qsog(MH;>I%h_H2J%&cB5j%nCxu}NfPg;)gWeP_UnJZ$D|AEW5o?x&a8zOaIW+bVcl zrL@Pv;s#G3(DB~3g7pqX0no+DO{)uXb6KW|==Vs`>40kEM<@yr8m}JsRv9SyP)6VG zHRE{|>BxbJ&mrbK^N9We-5WtJx%m#{Xgl%AIsP4wpZ<#3A^ha|QwL4~1OCO8=NVkX z^Idr;YZ{O)0p#+r28E=RdEg0`zg^**{8Ou`>FGHL-}~|fw>;*Iwu#d>5nP#=n9hDJ zsm@c(=d&tB0=3P*J(`@5njepVU}Lh9JqG{Mg+o|d6e%ta4%=4p5S`2G{IM;2!Q#)s z0ap>zh>SH^xBFT4i?i>Qx9pf(}HK<41(^Y@pYMHAhFLjs+@Ul{W%*}9(w-NidxU_U;*0q;Xoef;}f3l3X zDXa(vJ-mu_gG_=w~qFOJbUW^vK0S0d|Y>pg^wV$OJe! zJ0E}UpV?bm*fy}ri=Cm~&)`)j{7(m39+1Op6i%C}M<_Db(Rq{plX&z3v&&qZ##BkM zCCxv8q!E=RX><9zSHst{$4+{4$kTS}?h9zeyJw{yFfQps6G`D^i8;i9{K1}#X;M;$OXXe z@NtAJQ{rRc1$y?PeBeIGC%&p(hsQUg73gi;SMr`>{o6Cs*nTq!(+WP<0 z2!Zm2yTkE9J|je?;jDg6?bBQ#x5>t$)}&@WVqE+VKZWJY2S4UxN3At`j~T9T;tu1z ztKrQwvQ<6GNsIiEoxJ_#&IvYJ)iX&T%TAv=&MwW-$sNR6@-j`SUdC)x*kKKdQN8X~%=Ixf}69Vq(WXP2u4z^n?+JBzRawIyd70 znzXk$F#z^&U=sq0F?(jGj+?i>RTcRu&br>BaU8u7LR-k{LfMJhw-sj{`_%Fs*MdN( z_ztG&8_R~O_|i=v;mJ4H_(*fu{mhy5OiWERG|{!TcEX$JV`SvgNjKBovEn|vJJ&eY za*nXhIM1QFSS|cdI7ful`lPf?W?l^*sUp<|=14o{=n{F0%6dvmtWq)y`!f(Z^1(TY zi5L)2BYU}c^)Q0#3eAJ05sacb2aX}WE@zRgAEI`~?f@P5*SW)(e;53fdt{93>#c*w z^6vk<$R*jNZqa-7C8h3Dx1jYr>L@(6FH>x`CD@~l%PPQiWVJ6h|H4gMC-vWFqD}jZ z`OD>TuK}9>6I%h zNB7QiquyW6z!32mvT5(M0)Xq1mbWC&+D=|L5a8zZH8tPszv#F963=be_z$(XI{y_O z^s@^VW;hODyKRvq>mzk@QzL~V!o$+O+eDJ!e)-%K!)Y`@;chJTHRr*Kg_c+v#q&y1P$9$BNX2 zc6Ti?{M8clcr}%kiRQb%_o(3&jAFbT0p~aoE#a4oA$K&VCtQSnM&*XOJ~(>INFgdC za|$})3{bkv1)me&B2t|9hV=!yL8wkHI9@Qr=ek^qdWVGDxa zWj8K-?;mgG>)n z=~K(f!1ScD(`QVZ-_BHv0?k}D4&2SD#%_OZ2ADEDp!Kw338Y;@;@Z}aVR zBz}7N=~QvhRX0yVSY>Kz3UWp~eSNWqfNZz~ccBs&%sRoN66q3Z0ZEx)O1-cNE{2fP z@n~yOus$<6xf-4iWUpf$N=Qf`I1&Cl*E%OB>jCGz;N_&@l7=y(IcuIQ!6d@Tsowfy z*nh?c7jBeC>%hnU`K>9O437ry5{D2ct&nktpPCXInMG82jvfm}iFCet^s^|P5qi%g${aDL(?vs& zV2>UY@%YBJJg!Yu`te2-3Db0q2dSA_&-0tG`+*BNT%q@>);&1-;R*G24uJ&z4Awr- zSo%HhAI5&a#xqs$N9nyEnA3ZVm(g)Fc%O(l$!NIrUm%tQcG6L1jswcQHY%lNwXE0J zDjw;ZJbv;d;^(f&?yx+y93Ry_w`5nS7+IS*^3N>opgBZxN3>qJ%p&}uj)EBzFcdLV zI3y*fAXNao7&Q8Oda#~12JE}szRf6^YKk8s33Nu#X<;)SKv;s>m0;M4x^zJK5k`ix z--w%pN=P(xLT6(6BY-GT_NY@f9J;hsRqakKSM$v*Y!gmt;fO<7w?UyYT z6N7)lFb@3k)apU406MUU*!g*eYc^Iy4%8NS6ci!P8OhsfINB%M)4U8Dtex!Cu7=#> zGb~Xqk1$hoGE;aYSMj@6z?^hjK7{rSx!fE#=h$`8)J#Kl`#5a^LV|@pJza0O0RvT# z!Xn6($BKCY={R;gZ6dRQ+}U(L!U+iI)cF)k)D8Z>VpUbuE0)pcMlD_)#}U8MQ3l1w+fX1kV7KvvlEhh`CIw&))oad zeZYnt3Wfndvd1|4b3>)XnWX#k>-~NvX&YwQu$SU@P2`7z9yGZ9XtwSHKpf51sg{l> zTeBe|Y=I+4Vc;VyvTQc#&aW;^;19iUBikLDtI`gYMJ7reC*09q{}~3MK|Gk3mse6| zM@EHV12y)alM}ueIu@2-V0A-Fwz;|ae~N5EnyY)Z*CEQo1)Y_fOS%B_Ajl)ZN{_($ z3MQ1{PS6rUT(Jd23cFm;=bX#5I#fsP=BQRx$c@wS6jym|z{JzQc=~VC z$-!1friIIRnWXJ_83~hA(tGrbldCi7+Jp|064e*XBuaqE#K=^rmDy}NeE&NaaA|G(@U40pGKnWSU&Vwowc^_rOszI8@e;zca& zKj}{25fTuLc8f5(M^VfgXJ|QK2J$T!To;)8_frcF_xG&FGLN%X4+M-=&0+<#(qZPFI7={gW z)K)f*0$rZ1p;upE>;_(zIXC2Da1mDk_5Z_v6 zvKVF0C{&eSytUw_@v3&2$;T&t@ka7r)g2Tn(o1s+H^$HoeOuWg2x}Tef%f`zlUJcPIK>R~n|L*bUcOFFZ}`mJ{f{7H zfN4sCyc^L%H1e*S?} C;TjtN literal 0 HcmV?d00001 diff --git a/asset/toggle_ext_via_palette.png b/asset/toggle_ext_via_palette.png new file mode 100644 index 0000000000000000000000000000000000000000..95dacad7b7c1c6a1d2171d0930ca199ceb68d424 GIT binary patch literal 28323 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 literal 0 HcmV?d00001 diff --git a/package.json b/package.json index e05c4af..df84984 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "author": "Asadbek Karimov ", "publisher": "asadbek", "icon": "img/logo.png", - "version": "0.0.8", + "version": "0.1.0", "license": "Apache-2.0", "bugs": { "url": "https://git.sheetjs.com/asadbek064/sheetjs-vscode-extension/issues" @@ -30,6 +30,47 @@ "activationEvents": [], "main": "./dist/extension.js", "contributes": { + "commands": [ + { + "command": "sheetjs.disableForExtension", + "title": "SheetJS: Disable Viewer for Current File Extension" + }, + { + "command": "sheetjs.enableForExtension", + "title": "SheetJS: Enable Viewer for Current File Extension" + }, + { + "command": "sheetjs.openWithViewer", + "title": "SheetJS: Open with Spreadsheet Viewer" + } + ], + "menus": { + "commandPalette": [ + { + "command": "sheetjs.disableForExtension", + "when": "editorIsOpen" + }, + { + "command": "sheetjs.enableForExtension", + "when": "editorIsOpen" + }, + { + "command": "sheetjs.openWithViewer" + } + ], + "explorer/context": [ + { + "command": "sheetjs.disableForExtension", + "group": "2_workspace", + "when": "resourceExtname =~ /\\.(xlsx|xls|csv|ods|xlsm|xlsb|numbers)$/" + }, + { + "command": "sheetjs.enableForExtension", + "group": "2_workspace", + "when": "resourceExtname =~ /\\.(xlsx|xls|csv|ods|xlsm|xlsb|numbers)$/" + } + ] + }, "customEditors": [ { "viewType": "excelViewer.spreadsheet", diff --git a/src/excelEditorProvider.ts b/src/excelEditorProvider.ts index e94ba04..2c81a6d 100644 --- a/src/excelEditorProvider.ts +++ b/src/excelEditorProvider.ts @@ -7,7 +7,9 @@ import { WorkbookCache } from './cacheManagement/workbookCache'; export class ExcelEditorProvider implements vscode.CustomReadonlyEditorProvider { private cache: WorkbookCache; - + private fileWatchers: Map = new Map(); + private webviewPanels: Map = new Map(); + public static register(context: vscode.ExtensionContext): vscode.Disposable { return vscode.window.registerCustomEditorProvider( 'excelViewer.spreadsheet', @@ -30,6 +32,45 @@ export class ExcelEditorProvider implements vscode.CustomReadonlyEditorProvider< webviewPanel.webview.options = { enableScripts: true }; + // store the webview panel for this document + const uriKey = document.uri.toString(); + this.webviewPanels.set(uriKey, webviewPanel); + + // setup file watcher for changes to this specific file + const watcher = vscode.workspace.createFileSystemWatcher( + document.uri.fsPath + ); + + watcher.onDidChange(async () => { + console.log(`File changed: ${document.uri.fsPath}, reloading...`); + + // clear the cache for this file + this.cache.clearCachesForUri(document.uri.toString()); + + // reload the file + this.setLoadingView(webviewPanel); + await new Promise(resolve => setTimeout(resolve, 50)); + + try { + await this.processExcelFile(document, webviewPanel); + } catch (error) { + console.error('Error reloading file:', error); + this.setErrorView(webviewPanel, error); + } + }); + + this.fileWatchers.set(uriKey, watcher); + + // clean up when the panel is disposed + webviewPanel.onDidDispose(() => { + this.webviewPanels.delete(uriKey); + const watcher = this.fileWatchers.get(uriKey); + if (watcher) { + watcher.dispose(); + this.fileWatchers.delete(uriKey); + } + }); + this.setLoadingView(webviewPanel); // small timeout to ensure the loading view is rendered before heavy processing begins diff --git a/src/extension.ts b/src/extension.ts index de3261e..2e0deeb 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -3,10 +3,124 @@ import { ExcelEditorProvider } from './excelEditorProvider'; export function activate(context: vscode.ExtensionContext) { console.log('SheetJS Spreadsheet Viewer extension activating...'); - + const provider = ExcelEditorProvider.register(context); context.subscriptions.push(provider); - + + // Command to disable viewer for current file extension + const disableCommand = vscode.commands.registerCommand('sheetjs.disableForExtension', async (uri?: vscode.Uri) => { + // Try to get URI from parameter, active text editor, or prompt user + if (!uri) { + const activeTab = vscode.window.tabGroups.activeTabGroup.activeTab; + if (activeTab?.label) { + // Try to find the file by label in workspace + const files = await vscode.workspace.findFiles(`**/${activeTab.label}`); + if (files.length > 0) { + uri = files[0]; + } + } + } + + if (!uri) { + vscode.window.showWarningMessage('No file is currently open or could not determine file path'); + return; + } + + const ext = uri.fsPath.split('.').pop()?.toLowerCase(); + if (!ext) { + vscode.window.showWarningMessage('Could not determine file extension'); + return; + } + + // Update workbench.editorAssociations to use default editor + const workbenchConfig = vscode.workspace.getConfiguration('workbench'); + const associations = workbenchConfig.get>('editorAssociations') || {}; + + if (associations[`*.${ext}`] === 'default') { + vscode.window.showInformationMessage(`SheetJS viewer is already disabled for .${ext} files`); + return; + } + + associations[`*.${ext}`] = 'default'; + await workbenchConfig.update('editorAssociations', associations, vscode.ConfigurationTarget.Global); + + // Close the current tab and reopen with default editor + await vscode.commands.executeCommand('workbench.action.closeActiveEditor'); + await vscode.commands.executeCommand('vscode.open', uri); + + vscode.window.showInformationMessage(`SheetJS viewer disabled for .${ext} files`); + }); + + // Command to enable viewer for current file extension + const enableCommand = vscode.commands.registerCommand('sheetjs.enableForExtension', async (uri?: vscode.Uri) => { + // Try to get URI from parameter or active tab + if (!uri) { + uri = vscode.window.activeTextEditor?.document.uri; + if (!uri) { + const activeTab = vscode.window.tabGroups.activeTabGroup.activeTab; + if (activeTab?.label) { + const files = await vscode.workspace.findFiles(`**/${activeTab.label}`); + if (files.length > 0) { + uri = files[0]; + } + } + } + } + + if (!uri) { + vscode.window.showWarningMessage('No file is currently open or could not determine file path'); + return; + } + + const ext = uri.fsPath.split('.').pop()?.toLowerCase(); + if (!ext) { + vscode.window.showWarningMessage('Could not determine file extension'); + return; + } + + // Remove from workbench.editorAssociations + const workbenchConfig = vscode.workspace.getConfiguration('workbench'); + const associations = workbenchConfig.get>('editorAssociations') || {}; + + // If not set to 'default', it's already enabled + if (associations[`*.${ext}`] !== 'default') { + vscode.window.showInformationMessage(`SheetJS viewer is already enabled for .${ext} files`); + return; + } + + // Create a new object without the extension (to avoid proxy issues) + const newAssociations: Record = {}; + for (const key in associations) { + if (key !== `*.${ext}`) { + newAssociations[key] = associations[key]; + } + } + await workbenchConfig.update('editorAssociations', newAssociations, vscode.ConfigurationTarget.Global); + + // Close the current tab and reopen with SheetJS viewer + await vscode.commands.executeCommand('workbench.action.closeActiveEditor'); + await vscode.commands.executeCommand('vscode.openWith', uri, 'excelViewer.spreadsheet'); + + vscode.window.showInformationMessage(`SheetJS viewer enabled for .${ext} files`); + }); + + // Command to open with viewer + const openCommand = vscode.commands.registerCommand('sheetjs.openWithViewer', async () => { + const uris = await vscode.window.showOpenDialog({ + canSelectMany: false, + openLabel: 'Open with SheetJS Viewer', + filters: { + 'Spreadsheets': ['xlsx', 'xls', 'csv', 'ods', 'xlsm', 'xlsb', 'numbers'] + } + }); + + if (uris && uris[0]) { + await vscode.commands.executeCommand('vscode.openWith', uris[0], 'excelViewer.spreadsheet'); + } + }); + + context.subscriptions.push(disableCommand, enableCommand, openCommand); + console.log('SheetJS Spreadsheet Viewer extension is now active'); vscode.window.showInformationMessage('SheetJS Spreadsheet Viewer is ready!'); }