From 8b21197f8c97339cd4e006132c11bee55ce9f904 Mon Sep 17 00:00:00 2001 From: Leo Date: Sun, 15 Mar 2026 13:26:09 +0100 Subject: [PATCH 1/7] Fix problem of app failed to load tray icon and not starting --- src/main.mjs | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/src/main.mjs b/src/main.mjs index 9d20b8c..4d7061c 100644 --- a/src/main.mjs +++ b/src/main.mjs @@ -1,4 +1,4 @@ -import { app, BrowserWindow, session, Menu, Tray, ipcMain, shell, Notification, dialog } from "electron"; +import { app, BrowserWindow, session, Menu, Tray, ipcMain, shell, Notification, dialog, nativeImage } from "electron"; import { readFileSync } from "node:fs"; import path from "node:path"; import { @@ -173,7 +173,7 @@ function main() { app.isQuiting = true; }); - app.whenReady().then(() => { + { if (config.parseError) { const res = dialog.showMessageBoxSync({ type: "error", @@ -210,8 +210,19 @@ function main() { toggleVisibility(mainWindow); }); - const trayIcon = getUserIcon("app", state) || path.join(import.meta.dirname, "..", "static", "app.png"); - const tray = new Tray(trayIcon); + const trayIconPath = getUserIcon("app", state) || path.join(import.meta.dirname, "..", "static", "app.png"); + let trayImage = nativeImage.createFromPath(trayIconPath); + if (trayImage.isEmpty()) { + const fallbackPath = path.join(import.meta.dirname, "..", "static", "app-512.png"); + const fallbackImage = nativeImage.createFromPath(fallbackPath); + if (!fallbackImage.isEmpty()) { + trayImage = fallbackImage; + } else { + consola.warn("Failed to load tray icon", { trayIconPath, fallbackPath }); + trayImage = nativeImage.createEmpty(); + } + } + const tray = new Tray(trayImage); const trayContextMenu = Menu.buildFromTemplate([ { label: translations?.show_hide ?? "Show/Hide", @@ -342,7 +353,7 @@ function main() { } else { mainWindow.webContents.loadURL(url); } - }); + } return mainWindow; }; From 7a3fbca829106528d8668967b5557b198d205565 Mon Sep 17 00:00:00 2001 From: Leo Date: Sun, 15 Mar 2026 16:12:12 +0100 Subject: [PATCH 2/7] Added autostart --- README.md | 78 +++++++++++++++++++++++++++++----------------------- src/main.mjs | 48 +++++++++++++++++++++++++++++++- 2 files changed, 91 insertions(+), 35 deletions(-) diff --git a/README.md b/README.md index 5e029a4..457afb5 100644 --- a/README.md +++ b/README.md @@ -1,25 +1,28 @@ # ElecWhat - Simple desktop WhatsApp client for Linux +

elecwhat

## Features -* Desktop notifications -* Tray icon with unread count (aka AppIndicator), [custom tray icons](https://github.com/piec/elecwhat/issues/30#issuecomment-3470456738). -* Custom keyboard shortcuts ([default](https://github.com/piec/elecwhat/blob/master/src/keys.mjs)) -* Custom CSS -* Spellcheck -* CLI & D-Bus interface to show/hide/toggle window -* Dock unread count badge -* Very stable, I have been running it for 1+ year without crash/freeze -* Can be trusted: - * Code easy to review - ~800 lines of code currently - * Automatically built by GitHub Actions (CI) -* Preserve window position -* Custom user scripts in `~/.config/elecwhat/user-scripts/*.js` -* Custom tray icons in `~/.config/elecwhat/user-icons/*.png` by default + +- Desktop notifications +- Tray icon with unread count (aka AppIndicator), [custom tray icons](https://github.com/piec/elecwhat/issues/30#issuecomment-3470456738). +- Custom keyboard shortcuts ([default](https://github.com/piec/elecwhat/blob/master/src/keys.mjs)) +- Custom CSS +- Spellcheck +- CLI & D-Bus interface to show/hide/toggle window +- Dock unread count badge +- Very stable, I have been running it for 1+ year without crash/freeze +- Can be trusted: + - Code easy to review - ~800 lines of code currently + - Automatically built by GitHub Actions (CI) +- Preserve window position +- Custom user scripts in `~/.config/elecwhat/user-scripts/*.js` +- Custom tray icons in `~/.config/elecwhat/user-icons/*.png` by default ## Why? + I created this client after due to recurrent stability issues with other linux clients. Also I just wanted a simple and stable client and thought it could be done without much code with electron. @@ -28,32 +31,36 @@ Also I just wanted a simple and stable client and thought it could be done witho If you use Gnome, I recommend using this [AppIndicator] extension in order to show tray icons ### Ubuntu/Kubuntu: -* [Snap](https://snapcraft.io/elecwhat) -* **or** [Buildkite deb] with `--no-sandbox` because of [issue] -* **or** .deb file in [Releases] with `--no-sandbox` because of [issue] -* **or** AppImage in [Releases] with `--no-sandbox` because of [issue] + +- [Snap](https://snapcraft.io/elecwhat) +- **or** [Buildkite deb] with `--no-sandbox` because of [issue] +- **or** .deb file in [Releases] with `--no-sandbox` because of [issue] +- **or** AppImage in [Releases] with `--no-sandbox` because of [issue] ### Arch Linux: -* [AUR package]: `yay -S elecwhat-bin` -* **or** Pacman package in [Releases] -* **or** AppImage in [Releases] + +- [AUR package]: `yay -S elecwhat-bin` +- **or** Pacman package in [Releases] +- **or** AppImage in [Releases] ### Debian: -* [Buildkite deb] -* **or** .deb file in [Releases] -* **or** AppImage in [Releases] + +- [Buildkite deb] +- **or** .deb file in [Releases] +- **or** AppImage in [Releases] ### Fedora: -* [Buildkite rpm] -* **or** rpm file in [Releases] -* **or** AppImage in [Releases] -## Configuration +- [Buildkite rpm] +- **or** rpm file in [Releases] +- **or** AppImage in [Releases] +## Configuration `~/.config/elecwhat/config.json`: (or for snap: `~/snap/elecwhat/current/.config/elecwhat/config.json`) + ``` { "log-level": "info", @@ -67,6 +74,8 @@ If you use Gnome, I recommend using this [AppIndicator] extension in order to sh "menu-bar": true, "menu-bar-auto-hide": true, + "autostart": false, + "keys": { "C ArrowDown": { "whatsappAction": "GO_TO_NEXT_CHAT" @@ -97,15 +106,16 @@ If you use Gnome, I recommend using this [AppIndicator] extension in order to sh ## Custom icons The naming scheme is based on WhatsApp Web favicon urls: -* `~/.config/elecwhat/user-icons/app.png` during startup -* `~/.config/elecwhat/user-icons/favicon.png` when there is no unread -* `~/.config/elecwhat/user-icons/f01.png` where fXX.png is the number of unread +- `~/.config/elecwhat/user-icons/app.png` during startup +- `~/.config/elecwhat/user-icons/favicon.png` when there is no unread +- `~/.config/elecwhat/user-icons/f01.png` where fXX.png is the number of unread ## Not planed -* Multi account -* Complex features -* Other OS support, official apps already exist. Porting would probably be easy though thanks to electron. + +- Multi account +- Complex features +- Other OS support, official apps already exist. Porting would probably be easy though thanks to electron. [Buildkite deb]: https://buildkite.com/organizations/piec/packages/registries/elecwhat-deb [Buildkite rpm]: https://buildkite.com/organizations/piec/packages/registries/elecwhat-rpm diff --git a/src/main.mjs b/src/main.mjs index 4d7061c..1eddd11 100644 --- a/src/main.mjs +++ b/src/main.mjs @@ -1,5 +1,5 @@ import { app, BrowserWindow, session, Menu, Tray, ipcMain, shell, Notification, dialog, nativeImage } from "electron"; -import { readFileSync } from "node:fs"; +import { readFileSync, mkdirSync, rmSync, writeFileSync } from "node:fs"; import path from "node:path"; import { addAboutMenuItem, @@ -38,8 +38,49 @@ function handleWhatsAppProtocol(window, url) { } } +/** + * + * @param {boolean} enabled Whenever to enable or disable autostart + */ +function setAutostart(enabled) { + if (process.platform !== "linux") { + return; + } + + function getLinuxAutostartPath() { + return path.join(app.getPath("appData"), "autostart"); + } + + const autostartDir = getLinuxAutostartPath(); + const autostartFile = path.join(autostartDir, `${pkg.name}.desktop`); + + if (!enabled) { + rmSync(autostartFile, { force: true }); + return; + } + + mkdirSync(autostartDir, { recursive: true }); + + const quoteArg = (arg) => `"${String(arg).replaceAll('"', '\\"')}"`; + const appRoot = path.resolve(import.meta.dirname, ".."); + const execParts = app.isPackaged ? [app.getPath("exe"), "--hide"] : [app.getPath("exe"), appRoot, "--hide"]; + const exec = execParts.map(quoteArg).join(" "); + const desktopEntry = [ + "[Desktop Entry]", + "Type=Application", + "Version=1.0", + `Name=${pkg.name}`, + `Comment=${pkg.description}`, + `Exec=${exec}`, + "Terminal=false", + "X-GNOME-Autostart-enabled=true", + ].join("\n"); + writeFileSync(autostartFile, desktopEntry + "\n", "utf-8"); +} + function main() { const config = new JsonConfig(path.join(app.getPath("userData"), "config.json")); + const startHidden = process.argv.includes("--hide"); // Configure log level: CLI option takes priority over config option const cliLogLevel = process.argv.find((arg) => arg.startsWith("--log-level="))?.split("=")[1]; @@ -78,6 +119,9 @@ function main() { if (config.get("quit-on-close", false)) { state.showAtStartup = true; } + if (startHidden) { + state.showAtStartup = false; + } const createWindow = async () => { // Create the browser window. @@ -370,6 +414,8 @@ function main() { // initialization and is ready to create browser windows. // Some APIs can only be used after this event occurs. app.whenReady().then(async () => { + console.log("Autostart", config.get("autostart", false)); + setAutostart(config.get("autostart", false)); let window = await createWindow(); // Check if app was launched with a whatsapp: URL scheme From 1365d5863c33face49aaab2ce3baf1753f965940 Mon Sep 17 00:00:00 2001 From: Leo Date: Sun, 15 Mar 2026 16:23:45 +0100 Subject: [PATCH 3/7] Add --autostart flag and quit if autostart disabled --- elecwhat-1.13.4.tgz | Bin 0 -> 26686 bytes src/main.mjs | 13 ++++++++++--- 2 files changed, 10 insertions(+), 3 deletions(-) create mode 100644 elecwhat-1.13.4.tgz diff --git a/elecwhat-1.13.4.tgz b/elecwhat-1.13.4.tgz new file mode 100644 index 0000000000000000000000000000000000000000..7d17d462d505c964c01fbfff0d02f67411ebbcc6 GIT binary patch literal 26686 zcmV)1K+V4&iwFP!00002|Lnc%dfP^pD4O4RifVMegiJt?y4kU8*+WZotd1;cL^le84YK{}NzPNq}*Wg&{0z~6eMcwc(o zg-MjjPip$rm!E%>pQXP4%R-c8B8npV!{_+O{U7WMn)iQecW3X*{r?<4A3VnVWszj% zt0XSx{yy8<9(cE3uJHe5_y6ShaCABz{g=#f*Ztob?Cx!?@&Cd0{hcrO|8xAXmY*L_ zU$P%Zr=yGE2|IuJ^yK)EDfIAI`_Ip!kV&4goq%mWV1KDH!L|p3`<}-R^W~~YX7iGD z4!igvdsYa+#`(0o;e}w&@+ymYndDi(j7buR8GUZnDrlfY;-M(Rh|i! zNVXKkA}LD|vodEp27Vu>vq{s3pE9Z%1X%dM{3Kr*4wGdeu zut`<2XwI`)lFe9B!thyMGM=XSjfg{U(|+;iybydbNd>gJoC^Y*$V9ANg= zR3;HmsWXFbVb44pR;9=&kDZi^~#(rVCk|d1RPf( z7CZr&v=G9=5Fi7CB&B4P6a_5(l?ZSvn{ls_xLNOxJsFVaQwF=xGd_g1@Z~a1gk(IG zIqZvPD|H$GK30fSa0$QwOa#zRR=7f5mGd0e_)A`~h-WwwdgykwhY7?5rv_?6!_ItOojW&PzB* zZ_cj?MI01zZX#X4we_)%I__dd=wHsof+bTJlHDY7-VMwYtPqh%uAy^PL@;D5SY9BY zW}?JPiygfip243^S7_s)v6((E@U)kSh-h^%NX9a8I`+yi#A`?W~Fd zu2g~hp;jT%g+feoICy9XhvG$|D0z~xLda#F$z+nGNePFcz}$LDE|db8KA8drvPB*z zQ$Wf6_3_FaKZ8xXhyYgv_lS^rmKRLC=Zj@3f;(3rt7vX-e86tz0!Hy>1uqkX2;Ocs z6>77KN|tQNrDS;qYeB$>C|M>VD<$oSFNCMoCD#xuRyPj^YM^*I7c0DUfo|X34e2yHw10 zN?cbWlUHmva8HnDaUZFpLKJiAFl%gf^)1e;NZz-4J4k{6%+55DG+y0 zpF|;uJ+m8L054e~D&VSX)Fq^eCwVz1@{f~xW>U$ogq^Msf3K24D0t)g6A@bmG!bmU ziz^W`Emh-%t&9TXX zXVsKPWmSm6Q$`DQbH5)Pke zq0B_fm|V$HEO?nj-jbK4C^AbLCU7P4D5?q&Fle$uZ~|r?S5Zl#QIf^UbrM%R1ps-K z1g&c#^^T0wzE}*JK-jS7)(sSgDT^d3H7Nn~LsEj+FtxH@4x|~y znclK0mauWa&#DxKByk^+CYOrB$2qcR5IXQ`Ugt?nD7h3-!c!Ilk`~lhFNj1vgb+#f zX5$fT!9y;RluS&gfc@8iXv-pB7Ktc%u?m%>K#~BQmnBDB0{0xMIhoyHgo7WAPmq-q8|}T#%!9yX>8VoE=LzH z#%y?c#179+kB%>o&rZkCco4E9F-5&Qd>4v+CkJjL_Xw`j-Qqm5EH4P?|xp9JoO z;F+}iu9qfPf~EXM(RC83%eS4$#L-GQe{#=Ws;C zFoC37>B0&Jfr4;3=b2(BD8PaqmwDnnk4P#}l)ezMN|8U{;u661GzCbgg*!~lS8MV> zK1j4)h0-AY=1)++f`%}$+X{g(WPX%ii$cWsnXf=0618B#s?5x(4%-EQU@TB-paxnFP5T%^M_4E7KFLKgni< zvzeXeTF?ae!IVb===L(@E6M!flK2Z8)d|Y$r#Xlm()W~3gwg?F9;v(P@HowwC7Poy zi+qt}0@*dl5Mbb%3SJte2=ogxGnp&Q+!oz3oZsjfUMbR))G-C6yM=m1NjnN*6>hkj zP#qE_BBR6;i&&cuG=Y^!ED5SO299e9vt}!_QdHS;cAbbDbuh+wXbJf76pdf@9F~QU zBp9$XA@dM!GRhYVj+~}o`4Y*p zE{Q>;Lt%_B@@(d4xVUYktctwoA?z8AQN3X&$)w;w)O_NOiYi+%LfuirJ``{D3~$9& zfJ*FUo~J@#eusC-`ii|{4TLN&7ChC5?vdYzi2MuwYhJL!e6h?kV-`2c5>O>867Z6m zdrot_?cEL(XZ)_$#i2;q43XC?OFADS(gs&D@w+%=#C~ncEhHM$3Zbt7 zSVD6&bm0a`8(W{dHl0V)-MyCjRc+Eevd{3+1IxJG*>=dDa+yTz+$bcZMh??d8=Gh7 z#fw`6C`3yAwHD&Q_5j>w%@BRA4g6>i1}U&8#C1+eiFM0&**#P7^SCpqaeN(qxgq7Xz`Xu#gl+fOoJU6~Gg<~=Ylp#6{rp!6Nrb{Olq{7u@ zS@AwfD@jH<7-E%INYNF9$dw2*Z^|R>CPJ+ow48IBxG)jr330j4Gx!P7TDHkAmt zlt$4*vkTCzA|d%qaR`F2r<6h@UFPHvH^_)tNn>Mi7uh&8Pi>W4Q)tq!K_buSfF@$j z(`lgYH-1Dmh$PQEWkZCe1bC5gZ)6&E4BiX6GFrhW8yWfc$e(StA!57nyehRz0(@d3 zrSqC6OJYH*yh2<(G;mYK4&!H!k|L@Wpa+12UyBq0907?PdUymJi=#+j*hGMpld&<1 ziz1UK#Mk0M9)b-9*~!)bjl2?Mhbqg!k1WBm3k%!{fsSau$4l~ikWzj@7xo!|XPA{q z?+}*^c3>FwL|w5gWD-5|cJDvrN&4OMXpPxB|qXgsrit#vKmS}Th+XHqaBC(i= zf^9u`a1ZX3CzC}2Dis=HHHv6dRVID3B-X&7d_8&((ndVc1w*P(rNVqTi7EavGJ7WUh|3) zD^!m0C;!{oO2x8}k!i&NrJA~_-c_?uFC>{fpE8jFbwwqT&w${Tu851WNkG?~ ze5wUuSt8`O3YcnV2AXS!=Cwl;Pj5GL?(NSyKI@PSYAy#-r`rhO(i>C!`CC~NX^6Ra z+Dr!_AYif1R%{{Sq*}C-=}az@s3NB<`iHF<3*0q81>_tsTY$Y@#hKk{?0V>339*C| z11mQtS1|f;fy5X=ur4%#_>-+Xu%Kx1s(9!nxLwrjizDD z=-i2t6lN>)E$_7N}0 zHLHw_tw?F2d=e4kFp0A3s6Y^o0c_V0ViogJC~x58cg=;~cI+x*0B~ru#r` z6|8WW`&v|1S|Qqw)NZ7T2(n**LZkr=2M8nh8!nEoHX3zpjF6ULkws)>QW#CxvBWu^ zKj^PFMLt8YCEm<|$uCF^&)G7UQb-+1z^#w0F#txGlsYJZNI>A;#|Eo6)Pis$CQ$N} zC`_QK2d>&>A4)M(QIx2S2I|OWyoghXI{{gnf|yohf~QdOxT&}RVF5V```2|a7nWLE zbpj{(O8M-qg@%wbyXI*Eh^S&G?4T;R3?nt9Sn`7CxeoTyW-i9!E`(l~iRWD2;cAfq z(JPXk$@zh!Y;?Rl1lTD1QjK{vXHpw7mT481fO4mrY4a?^vvCOAg|R`P;)Aj{h3}9Z zo(zUYR;bHRgg*p%4LRk7i^UQG4zf}^%SN-s3zzjeXoxY<%pZO%#MPKA^McQi-PGKXS`=_x%$eu&*$faG z{I-c+sRa>kzLbua+OmALa!;F3Ni;(yOHo;QQ5T%@wei1I;mO`ata1d2vVK{=zEXNg zkpb6JhALaz@u8PKV`fLzrWtVxBXq7L&>>fPu)a?#E9ij`cka17^)%0Vik&{oi^T?B zS~rxm7>o@EBx2-Q4k+0!0)KBKBXk^k3m(mrO!OcS3Ta-eMXWJdQ=}n$%7kUCH+Py~} zw8B|j6=Xltqtk%I!72%+MvNXnoJAY04F@bmK>>M|wg0#7nG;bfK!49j3Je%heUkP{ z2BJfWab|+81TV;R>og(G>DZsNFu5ddRZxgELB$*@F54YQR+9)o)ad>Bf})LdM# zZY62BkW!vZ49KNJFv9d*c3a}`?%@~=P%Bb$)JEfD(2ftZ5d`?B<3pf5q$s&7F22Yq z8bDc%3c+Qbselu5fa^IymvVg?N}jRSFC!KsRzXOz4Qo~E!Clx7A~)9&7UY3M?8tJZ zf>;So;j=?s>)NGzbSk35Ik0tnR1uQb%4*fRKv#z2kT{)j6fY8~jY?!F&ZCG+l*~vS z1(!N_Fu<@t5tg8%!YJCV?1r$nFQ0g*xjaUXq@7TUi53v=O{`qB;o?t}Hip-k&Paiu zJTqvgM=VXjsnlu4?9+L4Nwg#gS}V14>USQv(x}LD!B;xm#(qeXBL?6o)2blrAYlVB zDkCQ;#h{il@F{rL(10B z3=us*dIw;))|^!r$3Wtth@EtgKm~F+mT!mul0ptDQbJl62I^buFvJbNFO5Lq>{4ktu}6wkR~#l+hMg($5D%H!>|nN zx0Zm(+=f~f5j8HPG0<*n8+686?8^NrHA9WoIsRf04G<92FyUDjmuYc1B1u;Pq!G>YN{V@&#@cx$ zEeF(|W8?Bh=A6bVwIRxjWllC=56uUh#SjGvVS}I~uo%KS7D=Y=9R*Dq=^;^Jf3?j9 zUYu8xa$2PrFD0$lp%5}puL;gmew}03B1#^7rn7C_2r8Z3VA&JKYB?cRp!NjJuK}tS zSM8OnCCZ99MbYJ%4I|?n+X-bs3D~Hf|2mY6t_bP@-b2>{9T6! zxmV1I5L}3Ip2so(+=xUBj)6esfvJdfb|qE>ULt&n9a|IJ*hzIlBLc+>3D%nLw61|7 z?$j0t6v*Ri{V69@ZkFgoZFyi7@?-^}ilWJ8l(Vr+vI>Ynl_4Efg0D3w!xcxO-TXO5=m+ z$gSr_7MGrJViG&#dMf88s)&)PYaO*oKPUs#P7}gfRAjZo z`jQ$55xH6Zbhi?bJ96Sm~8-_fHsZGAmLk9&%?SmBN~BX0NTJ=CG0-wW!BEJpklb6>F;O2qQC_g?Bu_CB4>wn(6tagooOuM% zjZ?*pZB!kPid;%}AQhr<$6X+*u<@L=G>is0*YDYSc_=dpI~$t_$+GFn(`7zHOa%v& ze}pw+hBpTcd(FT(rMu$nT64^DlPd^m=r^$7yZ~;7I8kNb7D2~57${ZngVMARTK7XX zw0@aOp$)3O^Qm=kKss0<+|V1qaTPDUX5Q3kXMnRR9)~h2C!=4JFgK!RoFds}_r4a>2>rM7F-Q zoF|BCLr%wA*Y1(!TSuw8F|@{StI|D-Qr|!n<*h%-(*zyV8)s~CSG7PvS1Or-NJ8lg z-dcDF1kVuz(%Wv|!N!0XGFG*P#=thXsvAJ5C|)5JxeAwQpGNz$d8tyAfXt!62b}r@ zHV@qroefx`fTyiyHf~q>i}D+_44$GAr)pM^{&Ax>*ogEFyVlu&CKhkQ@_|k$q8KRO zv9gPx##Hx7)#L8aeW*)4puM*>?!(Te;Mh%kIu(#`W>jKj1Gc>I2Inq zEekZKh*<(kaJJ0It_d_sfz<`*w&=0DcM^(vm=bDImG8Xkg-shtoPCfyX(mg3s5FPp;Sn4ihzX2M>`HA>(z z6&Y}Ltq$1u!$R8@*SxJbi1N5%u(=qoeBu+lfRM!U$6WCOBIF*&0!G1&;-6kK!1W`hjkQ zg~ByxL8}OCb5bsqB#7{lcHXIrY2ff)WVNt5yA!8?i9RxAnbp8w)nhz>I?LL2Sx0Bt zHjYt6-gM~}QmrktK44vdg<{*d97k$z2%}RC>ulw=Q=F4RhFZrp$;Qb7b6Qk%4KcY^ z0GR9mqH>KOwq~>m@@z0qBr(!8Uzz4T6AFsr4eVXrM6e%dACZZ?wFY+0T*0z(w1p)(40>bC8z*H^3!I#_Y{U|5#b@aN1ZJIqY_e93&aBTf12Sho zlq@I^0JJ|FqfDtSwU}sE^mF)s8)LCZS>L(ily~!Ko!WVI&pd{?wX7QSHjH7HRdJ1V zyns?|TEAnS86=Mh3>|s zqXazk$OZr?>iRX*c9k9BhEr_&4$v3lkrt%crNT}jMsv5@2)w8ThwES7Vii~@fKEStYcdTy6F=jn`D*z2YhA zrMamPl8KvofmTy~&~VvW^fE{@0J8@nTK|@qx&)er5=NE#@Hu6)HPR(??4;`)q1t6@ zxn_A0Q@Dy=XkK`joP zoMox?K=CFd@&-G!*?=1;ISJe#UZA(MR(i+{Kn6-pH?kgn+{QsD=Dd-HDO4slX^vEI z$GQ8uq9tYPwH!jdk{lT0OpP5%JtQEnC71>(AOPhG#jq?4*6ux(8&cuEASn+u=Tl9T zFnyHYWD@Lg3wB`wU$7Gvr!tghL#|cbt5V~xnodbaz+KlbjWQ9aMBKng3uJLtr$U8Z za86l~D+1-O8er>pK~*PBQ7p1)Pn4ILAk-$SdWMrDL%KD_h8gq0iU-P*_5b)J@w*-& z<8z{UC{>dRUb!W?NCc~u^#i^Sr8+6V4Ipj@uBfHwI^TeNE#z!peTx+t zW6Yu?GYmR8g#@ojObP6|iMm!MaqIVl%H|qodBxZxW|B?%)FtOKvO4C4uLExyA|u=>W6{N&fEG2r!K9tSbhTec=2cZ^6!?yz(|E@SXk@aJ*u(_9)=UNHYG`oJ5v6z9RXai$N4th8KLAw^i!_F+ zT88TMsAf)0<#tGa9SJw!AP5&8m9)UPEI3Pb(J9&;Z#i9YTlR&jQrsbu(CljCn-GHx zSvva@BE5--V6j-uuF(4A*EdN-B3o(mh{tDzP}V7Ozb7Tx-&B4X1PA0weF;dF%9Y$B zP`gFPX~&eE%k;==vaqUBtozV>*COMT$cc|NRLbs8E!^6ZT`Ftq<2n1LkbC_EF}Q)G z3sWFd)m*1o^$ojS+m}WSH<=yBZHsbhh_6saCCO%(6_}C?o~ zBSsg1XKJNmnP7;U)OpeIM^lnaY&-XKOoKB?Bjv#`X^b*}mKaWwSQCR+8iy(vN1f1D zoglVhuVs!lN2rdhCbxmA;0&CR;vt|`DCsB|kfJ~|5t*1K#Eun(B<{>*zmhqeCbbxY5BvD&@7UfQ}K+Olctdr=wzjQNDDdhbS^UFcn{9Q+*-XTH2ysw%!6s23FB&geTc|PfQ3> zJsfqj782H#t|oIJP$^3e3a?fT2F7I3(>MX0fJ)^H^pvk@0urPOBDLv`XeZMTaL@v6 z$O*E+C0{Kt&MCJJ1vNvhDupUdqwTAzNZ^VB^A%ZX)aY~PYmQB_S)far8&YizuS7|- zoo?-RXv1rOX-O{nGzmUdCtars^-R1PNi#vTDtMixhXB{nEgzq1{RYmD&yl*>a-K8g9!vAKX}Q+pPy{k5m`37p?rfO@fmt{# z-)n?osw@@tTpig04cPFRA2pJB=%NNCqk^NOVOqc?rszx^qgGEIbE_F`?Sv4~ZKX_j zmtqJSWPaE46u&DF&x5-Hi0qDW98W6eLIxl!%q2^F8(`mDyC%V#Q`jAS&=*5$CZ zUftpgjRzc5ZcKX!GP>g3ApKee3JlaSDRk>KLv&oNjoO`91ra!_Rd7-9%SozAV3rP^x>S^9}#2Wbamf|ufk{WGyj*Vx-lRHY`)&W&|g`Qbq zq3g2MR-iG#8cJ(;<5|2}4~#Q1JHZL0-8w|IsJ9t~Z1`9-&$X9A4}$h5vp%nFeGXo0 z*6yxw?EsfW{(eO-EQ$zHc!(y@lT}{xJ+nJdABIqY`++Iv@qYEKRK}Eg*jL@DYQf}& zd^k3G&F%;!IJ)kkb$*wPoZx|Kam#E1pgL1F6E|8CYZs~LT+faBcjAY#yw<}J6dK|Z zWG$-z=)5Ju1tkNb;zpgoZRuA-5wRKfYDh`MZZ9;U;e<-BRB$+vxaXsb5j!5U(=+yJ zcyTd2z5IneJG+1{*!jiTj~Bxi0lPfIzej()9GzaW^U=kN92>Q^Go*X`RJ6L!SJt+$0Ihr972cVQ}*iO`11JlM;!3*?EIID;~$@2 zde6^Jjz$;wLRJ6lf;zJE;l<_gXbkK4`S@t$u8H}>F*_dn?A7t*^Rt(iX7S$HGd4W^ zh5dAVdK9qHF%C5P>-oiKJRTjfvkP|o;{4=zbQG}T)5DXON5`i>2JGp}OLls8$xe=6 z9K$*<&jJr-Q*HI=u$Z%F?8WHf@cHoca`^Q4%YHd~ z2`u9I*~^oo8c+aGBX%@;HafgK{&^HYOEw&jU%nVAc#kjH*)wl=a>7nWhokX$c<~Dx zk1l>bK14WNjLwJ07XYQhvx^HD&xQ{#1dA=5*UB@>iFaYPtPC*Bg6=>%jqu;V*J8hJwIbF&W?_s!LcaB zIXpZ4dGyQJbD=UEJ19GRdIo@bI$|fsxSq>1gc6+F(eTCa$I;lq44BhXuWScwd_Fon zhF^|P508&VrWNLoOF)f%kc;i@Khtt#JSmqYe+1g$Sdr$?g;yko<|!FKBd!u z{o)lrzBuyqB}2S@HatFgdC^2XnEC8{ghL_%IwwIb#@)b!!)M3O*!bn)b9HR2c9nl& z&xd37bTm3;!=s;%@j9w`&c@?o1(UO99*&^kNZ5Bjq_;)jNeqL5M6_jux{htI> zH4?wk$s$mdGtDUz6cStB;~NRm1Dn=F<|*XQW8q{HKR`xLu9MVRdyCD)k-=;rX)QO% zCKl8IVbh(-1G*M|#_-YNvMQQoU0Z%er*zI6ULdqT&*@#KA%cj)xh{2R`7gloPQ{I0 zfOI@a>Rlhy1#axC#5$ZoJvpsBBx)Zs%yX2b2eBuKegUVJTN)_Oh%Bjw5d`kd(V}j` zK$TxCDZTpB*(46(bDLlqrS~N25Ao`kRgHg1x*_M6Dn=}TplYs+fmVFgsZ&Ps*D-;| zXor@33R{B}o8AlESe7c=0)vR0FnfBhMb=)#^icj%)=a0WVZA6Zj)X&~=Rr~S*45uo z{qZCF7Gz2qGQ1zS%u%T$`+}~XGp$T*SA5DAWK)G)j{uz5U)OkZ_W!NKbRsqMq)5aR zJSf~0CsGFT@Uf~&q@}FRVV6CE>U578dxS&eI(_dk&3mcdYt>;Jwd3A5?~T_EIVtN8 zE~~tuc8}tnQZkn{{X!-DY?k2zt;VdG7Hk{^r5|89Ov%_eLIfZeBgyJ`;Z1)ZdW z+Biw}(<-H^w4je_aSb?#7TF$}yjrNBLB%zd@zWA3O1o-GUU{)m@M2c*8Vg}k9PiS@ zwF`sPWL-51{1Gl*o5<#RWZmY0Rb4r!7MX=5se@TwLga&BkLG2$l>7bu&CN|X%c?Lh zW_=y+(SICz-VkE< zq}t2~)Zx?d*~!bx(aA5aD)SHzRh=g*S4+X(;gjz---dR$=7qMr1BtmvVIHzf*6ufs zK-bx1MH^GXLwCC9TX!L$=YeTyzFLC45&ebs8A822T!ZPY5Kuo?@1{D}E5dFtcrtc2 zMM=bXwk^@rQ+o?M0w`sn72Ai3z5n>~*p@$5?>OLsDl|4QpHJZaPV)D@37k|*#$Z#3 zwZvJ)VwvVE2x(9TYx@j>e$r1AT@3011vd>mdT$NgUQhywN`Pr}u|l42{rIM?JCs;4 zkA6HePWAf5p{JdlcO^+ggAbHiZEiO_y)A|CK7LEdc6bM^F-9MXb#u#wWwY7=QSC72 zWorF}bh0HJ%FH1|tjNKWDb&MWE0u0Xg?}-#6D}!2g9tRn7ST$;lueo3c1GnaDwQEp zy_%y2*A^|hNH;nf;YI}*z~kLIas>c#0)b$~Ci@=52?-vz_-ml34(8lI{4geDK@iPH z&f;di>ScM^OJ~b8oR^FAap-;ZkN2aBw)Zg=HtNS>Qq6EXf8ZR0!QkHRE^GUIFc@ra z-@nhk+S$7|*xI^xZ?Mb08fq27^CflY_y4nScL5ejfel=Ay+BN1OMgav)&Ir>#HyS)ax;QXUvPJ z;UfPHl8Ny4h^+T=+>i4}_Fsuf|M}(RdH-;H&U!s(e5JX;NIk4hdf*>Y#ARof-{yjgNeI+M^5rs&@`d?= zZiW3W6Q!Q>A^xkkUM6KK9zPdpnzL6B&HATDefo^P2hyiH!s~=Ry-;{={=mOux_%*x zC|u5${p+3n>bzg{i(mfN-_H-9@*nRH!euto>nTKf;G^sm!HWq|p6PGqg_!;kbM)8u zlEer8lwZ5EZC(cmEeC$G0CM9jyuQ5VQS{aD{jK-?>0qm`d&wd?@Y}z{bw28AtbGLU z0XrD_i_)l6stP5Rk$0Bfx6}`!W=5RG!dwPNCskR3*D5~nDR0$(O#eRW(^u>5mJm4j z82-Dt&7>-~{KxR$W}Cu*o;RR1%kx<(08TzDA+WSO@ZU~So?ZEm?RSs*e0?Z**_Iaq zL)6kVnv3Y_z=z-wA6FwO_6y`>^GA{2$OC`R2RFYw@OO6n$LchWOAKP+EaocSOqRuB z#WH-XE(}$(M}0jjet;VAqrN_$M|4x^XhUK}Jqi>NMfj`qA3y3-lgHkpK9Q@hzWn?# z{C`p`tfm<0#${gS~rulOG=Zus7j9Om=p}Ai8(&-o5Re zoxR=3Rgw{3uPLD?eZz zaUHPyj`f{nWs4q$2H_6^Jyo;l{unOVg9k>LnsG_n% zifq7mF_V@=!C$WjZ`c8Q_w@%_!R^-{)Tg)a9@dCH$6CDRoQTjLGJY=R*VxT-bc-vUatxpRnV>})uM zz(5&jZ_9BW!d^QBW5YE-9sgvw03-QRM_h*lWh!W%MIxWF=a(-|hFLVv3&n)GUA0Sx z2kDMs$!Dj)*A5O2m_PK{H{US(A|qSJz`J%t z`BG$0LT3qJTIo6*Zw+Wi`733a8sbNto7$hW1l-nI)9{9~g9DaTso}cNkdn{UI-M=F z_h+@{9skwvm6-e_R+F3;@kM2%7~l2f?3@;=eyUcizE2xmAqC3TcK#t zl~@5GQjJ5oOp~(XGY$V#Ky>_aDPmmdBF=dhfw|I8)zP;BAbkn6A<;d9$NshYt2!Me3W$p)RD1&(p#0aj2z%%HzucvVg#=|IqL1c5i4>ro;nPp}g%sswvJiPy>W>2z&lSQ$lSoR;@W~7qPz0jplP+9#WPYOw`h|*1*>s9%zERN`Md!Xk66j;Nt{8V+q_+v)G3$ z`Tl!*VQ=OT1J}80ElbZm=%!SV1@=e(@x%^Gy;zNU-zo;@ujh*VryDjfoV36V_+rcg;e? zph+njyY2UNtpycR+=1Lz41s~*H;gZ%Z{$Z{Bh?JDVQ!!ghd9^)!+*ns{FR!G1oqd7ZZ;Ih-7+xf2ocHK59jo)=IKMnNF zHwR2yKM7x7y#YDmx=sw}I$+E0MvbU`0FGwV0(seKw7PA|-R%OYBaGUK=_{hw4b{dK zB~fR*TX=mEcF3oDj*aU>)|6jj+_W)QR>sc(Sa*uZLPnSQY?cb&9K{;0DZp5iQy;7= zrb?3nK@X|LNJe}qeD|bWN`AH!*&Sv=A6}~Qo#Rtlp6*&7_D+4vG>~P!Jh!zen=R_c zDWiQ>B6Jk^{6_N{Q0WhXCMgfL;jP#F?N&n(t_}UJ#D`nYgR5~qnD1T05#nb1eP3TqYm(HvNzPccwp={8}7Cc;`^Uw@(vDD_M#pnu{W1 zSiw0AL)-S}Bo;Zf#a}lzhGpQuX4tFRg5dj;B)fvI;orvBNd_TIxJ4!C()due#jJgv z-@KhCF-|eeeiO+|WUSAIm7JtNIaRyAR|yXERM3b2AY$Gp-+z&P_WM6rkN?@;y1)D7 z{(rXnUqk-!JiqBbhd*iv|F7`xKRUL5`T5xWpBDcO{C|7x{%;SqzTE%M&HoScYAK33 z=f_8fiU!|DGk?*_^ha4CW{}AW1&_YPWDlqWAU84oT6@l}llVXWJ+JquaerEm9(tYq z>+d0lu!a90)2}$ffBbv;AO8;0K$`?GouVYd`s@Xlf3NgzU20g0;vb(NHt&B@e)jvn zyVr96zu131|NXz@vozuB_n$Ye|8WL&KKX{*$yu^k@L7^=xSbsHfLn>jn5WmaJLceT zq8rro8r6ncJNL57rT7gBq(QL)xafJyO@EQgvf!-GPPxPs`}##coF`SB{PPMv`u>O4 zGRkAoPkEI^^FNjbe9Zp4HE40icDc{|LAV_b^u^7l$xMZIz@>YQW<~A& z@xg8hUBD0wzHQ^7@>R_M`10!ySb2WQBk>F?4&K^kU>z0`uNk48^A$Wvx)3Au8A2&( zJrP=*O*056cm_$EusZ)ymdD~P7L&+$Dj)a1`_6x3+Jbu>MuA4Y8F#(VhzglX-T(FapZfQY7ydp@|L+gh;{UhyzQq53M*81M$^BSR zwzc96W2l@36|Ce{nJ<}+W@1r_&wx(xm4U2!Po1f-lA%Fnit|JigjZ>yYw+e zKGx>T%}6DB`8U|S1eKGQg#;Vtq@0Xzv}gr#M+w_R|gNaw;$Nn zrD7u@n&<3q{-`MOVjoKX!WX7?a{M<6mw%s>Y)f~A`|Qrs!vt?puwE}t3}m6^R9h?k zeIc+O&RtEGIaKVHB~R1V`P6qkzFhWVv6S|>^owWv%>VKHq_-0edU?^q5^)*ma@RU!*(Stc~uz84O{t!=a9LX>5qzS{}!h1+&faqEQt0;n}X z_j5m-4$|9cSL56#dN$->phyY>sSF6GPaEkssfv)ynjG{=_aF_-fm&W&H) z54X*ia?XpTnsaA2-1Al7${(r!FaL+=|Jz^efBy~kzoO(V_CMZY|Kr7G4IbW2@*IfGaB6@#^ z@9b^Idz0Q^mjMhY^Vk2-+Z7K6JwCX%)7#k@Ozscv#e)a;BCI|3sK0#dd4K*hdnP!% z5+OaW$Bxt<+$?|T_1GnZszaF@s_j{2Q0k9fOk^E?#i2&@aTY_5yyyn(byUd`9#PT# zPXYgnI4XR*5^|GDa`-9!Rd-r#K=!Ra89n#1q-%A(GlC1Mu)d%~8 zxh82o=`VmX7Z_p(VdWsNcDr_p!|~Ybv9T%i1mBz-vv1f@?`b7%`Aw{Z3GQDYjs02- zE`T(TuId1r@OUP?9z1okg2*>~8uXZI*-nJWppF*3uS3YQ^*w_EtfnY$RB$=(LxI%a zV3NUV1UJ%B|UiuuP)=GVr9C*Zo}Gp zi69G>P_*{Pq?;IWjl+NLKo8nq;6&{VpLaP>lfTOCA9G0Ga_iz1>%wzT- z5RX-x{&(T8@}2E(vFFa-*rNX(lw5lU%T-u_$o*=*dg6JZM3iFF3^A9Ftbyd8*Jlq(lCg8+rke zUJuIX@i&dU4zOXWKeLyUDl4o0PZj>V57goHIO9uuxn#zdQNgEWnB?Y205iV(E-$|O zj=g>g%EVPt0&SeUp$)z3^|HJtc@|Id_wU$5&@;OEl)Xl9zp?!x^N*^SCmDNvK}wbU z&yNEjK#%J08U}$egck*oh!Y@&FE5yq0p9GhcPqYPy)n};=uMLBot^)jM+=_m_VrbK zY?U5_fJI7~-u1(zY+HNxajat;Zeb0mE zD)F`Pj4$`$>ccNiYr3m<57YI$ckkYLD66OWtd~MSF36@(aG0c3m(TSmN2O-U?lC{` zv{>5%Jroie{Czg%sT4*i?(wpR=8I}+zeBxvQi0e`X%lE85n0un@WOoPeAa{KYI{n) zwq4*;Z5wfh#(Y?#Y9B%xS$=Z_DKFN7?bnm%&}MM<_VVoQ>FBSQlyYGch;S`JMm^$S zJ(WdLn>3Qvqv6XX&)5ex&9kxxmC5#*T);~hf1-qY4%Mo)f!`5fWU0!e0r6HfNG*rn znLglK4}ReH?>*R^ZpG7``#(I`6Jlq|g?KQzC;A1y>FaIvz@ihvqSP#apZop(zx5X@ zITwPy16w^U-xh6j;cq|fK?T=}&y))R>#q6%^QVQcMj)|k2H_9;%s09hgtPZzaosEP zJe75rSwk1W?a%CEY;dun-@;!dZR_g~@cj`l`E7ek3AIOPpP^?F<3?Jp)_{J7x>a{G#3ke<-xq1YvkEiKwzkJCU^UfdoBb$8?WT4PZ(veWkx6joBs8$@TYz&(Z1%U#skotLJjbgXCj8}y?}Qb z@%fc1D?u{Jfw{kDQ!O<2=qXlqHfFL~0^SEKhcFm;ZjmpSlJOMAhUcdN_1Sq|sFxps z{lim#d;-Fjme)`~fM*-BD=ez&NB|Amzi-M9PW0z^kMd&1v*b4t-sx5;-Xr@eY$$=4 zRn4tpG4UEy|Bo8FSS~!v3-;MZ<#J^@m0n$Nu|16hBf}X;K2#uCf7rjbwFfwt=$<`w zD1A@y^VT(J7~5ZzF0#8dxOdNMuzNiKuZj@T!ci#1br@K zUi;79&i%o<|8M(C{P$=1Aqj`U(bH?O8+{!QJ=OL*cvK_T%^~h!KbMWKm%N<24d8Fv z%cB>i~Z;talNp3$UG9e8%P`Wt;r<;zU%_nraDi@4trClF~vf z9e_*}lE=~5s&sPV+0(y_4lm!H4=(@O3$^=x^D)#_03r=AS76q5qJVb6A!P=)G1<*|-?umKyq z-wkjp0Sp6Hs9MrJrrf*xTw5qQYZ)#VY9bVclbP-=%z%LgRg>W%Zn?v6=+oHIlaO%l zSex`ZW&k&9AFffe3aMR#gBe}t-qk*@rP&A0ACNiHKD5*QNeIeeXY(j{^V1Cj*;;va zyhN%loh}rZL9J!u=$8%Z@`<3(^EP^KgbSnEF8VdYJC_6jy&Vts9{jK;wzqzm^4;Ay<`aJZhgj@6HG<|zR@&@- zNbV1x4qrTbdo&vVba{6E_Sx~t=4WB~*j>%rTXj4jXa37&%u5>{iVFg*A7Y&N2YGFySE2f+w(r2tJLiF}{eJ)J4-VXK-`U&u+PRdk zeKa!o0ekJghXMz9bKcZ0u4>b}rmK%_C#Eg3zk%Ds{HlI&uBpi4j=q+6offux_y@$y z{IlwRU~BFvyYu36)qfsrZ{J(<|L+V2U-JJyr~dZ=pS*)hJzix|z;2496!uTF_(}NP zs8y)eO+Quhs%b=jk$Far6uh;623z+zFXwPK{|wJ#;V)RK45jEb4M=wgw1*T7%2*$^ zMhDEm?0~s*=&xhl%l*(!ThmqOODK)haptr{2#O!W9EK9PLTYV?rn#M|y^{+7+pUAO zSJfJR=4mAwomIuRIhSWQS;y`aD~>`nKKs#YEM&W18_kt|Xs&B_l4j=v`q~8&1bTHW zWY&S^){eHA)v1H3+t4A+X+g0Y_tq}7x5cw2$)}$)7}q$_v1Ql z9dSfaJZuP|H@wI??-br+V}`0Ccp1O`P@njA{~hX#T8wb3mVX=+rhcJ13Vn1AFlzUE zZP$&Gch7i|Dt#S7M2OYEpP#t@+b_)fzmos!(4o(q|FOHf zy>9>A`4a#4S$@=$GE^&B)f)vXo#GIAydX0M!c(?!TrS4q% zuTz~qEB)WOx3#ykPXD*Q(Erb?|MBHAU{B$RS5dseixp_EO2A%-tO_u88cTyh<;{S} zxd2(P{^CrW@HC%6QA=Hnv(TL5h{YtY zvdEs9O-Nf;^aFO1&#*YCY}5Jm$z09!8pB$eu}^`kAC%eDr_XMkc^pH5-Dkr}RbRbj z+_r-jYu%RUl(kKC$i z$k9~5qdZC3-`lw#?%ZRYpWq>+fZ-!9KZ@uo@3O;rkuOAlYkM~w!2j5oPkE83F1}lN zdd{;r75e3i0wmFoSfRZ#r&AQ#VotxN&yFF>HScMxUgFUm;lSMohr{uj9n2;B=DBo;V|i zH)5h5eU~9#w~LdGvjVKw-T&@8kHP=hzbtvd7wp3%&r`v(TP8BNjWK&Q7n!)G;Bfj3 zUO$KviNBhFRF8evw=kEY9O`d6Y9#x(lXgmIk9(WH-I^lm?~=evN6^p=56W)S`h!l4 zU-KmEfa`B2sFBZ?OHlHCP`zy=ZMXKyOlh}tlz<&#!-Nml+bc(kGr2QTfRC zm87B0GwK-c{I5TZ(Tsr~x#1e$`riiZ+rRzI|F(PUzjNTRTwdgPsUe|Wx={~x!BaIn zjFSSu5CB1Q-?@SZ4$gT|;saUBWthlwqINNE^9g%hJ5TXm;92%4P#S-;=lTZw?6>z( zi`?9~z9_Iq>9vImzU*jNb?Kz_%T+bU8hVo0few*=trM#7^EWz78T?xZL+c{apZ`pW z^#@xfGy5F`SsXZ6q?||Z4kX#zEZ@)pmg7mWl3xkQmPL{mkZuIe4(k0=3k#Jr(LzIW4bvoxJLc~4Viw{mv2MnHIouD;Rs4yY}S1%f`*8(@&4GK3i* z^xjnYx93BHG!t0@WEW}(^Ylu6;`MZqfFgEOH*na{7fpKT2uJP6oaB(r(B&mgDq)>!)Sc}Uuy8wN&$gg5~E{(x-_27~5XJxY$C zrnT3nVHa2SO-HA(>q`LnIe@=i0I65&z{PgEHfE*8Hc=hfS@p&K>*UDn3f)%u!F8(wL!_MHj4wo6f^bw`x3xcHiC61d2Ig9c6vK z($Sjg@hK--42U$gK@odGdb}2r^fi^=M6%q730zO8p&p4^K$vKD?qnL~gYXuwZ-QJ;|gV$joXYVQqX@dxCyP z;`$PLwan&Dp@ZXkRgv~6fl6-!Dh&OJq+0dNlh#EKF(D>H7^;fKcy(K{=gwY-a@c8+NXMw{Y}Hw zLal4B(ZZHd;&gZWdho`LDJ&h+96MOE)^%VE2iV%UW~e3*p)uOnhH2`g)|&5Zv7CM9 z1v2}ks*lt1rGWe_kc5BCa}-|I23Mu6)e9H3Cy?;XKt2&Ej$AiCI<#!V(cOs21;xpS zdG=IH^FoY87C#p}7KQ9|Vo~xWl>vid3lkn))qs2b^?L0C-|r#g_aTae2(6JL zOz?ynvh#sO@UFOlDyxsTzhNFDP~A2z3BMLkwZzt03+?|?i{w?4>tvf;=MdnTD7Bo} zeB#hWxJbV$x3-FY9}HEH!EeHhZ*D?uzx`EWmR_7kvJVB*WZ5sPGKWagezJ`IyyQ@w zJnQZBU`-H1T&UNd?&cNhjmE$5Yd%Ib99~y+p1w0wss>DLG=_I8_3s@E;Q)nH)zg_6 zp3DO_h_av>p}kchAS?Uh?X-Ai=WcJOn0+1Mk=OasOqQxR==?5Pl44{Jp z;S()xhg!sSnUty6Zyy4`(~GeME|g|p%Md}p?7J2VFpTa0E&E#r>2Yh&b`mri$ca#I zra86eyWBQ3TzKOad^Qg^+&HXOu_k~sN^>N=2RuL>i^|=$2X9-rfbxEZP12vTEASliH=}xRcdCTjgDQ^ z8%FP`=ybFynwiI`sOo;%^W$B3tq!_Z$3VMJs@N)n`$j_YXewob{(iD z1nyfEN9;Is(Io@i2A0?bb?p;X;t~o|!EdUjgkO8u87D-)`GM<256J`oR$Me^xa+DJ zjZFVAk)y@3Ty?tZ6mP2JDz&TMvGCsB)^>gI&9OgW6YesatgALm`(9WLShWrg?Pzk+ zMo6x2qf$ZOx8sDtgc#ue{AHnsT86wM-=qE8TPVb8MraIM{;qVNoA!NrI8)Foz)*9UEIZm!w${Ko_)Y^6>TO9_P0)h&htNV~ zT%f9uQ%APY_L5}^f!(;Ex&%dnh~A%jE@2p|q1(lV46(Gc&L(VPv{`cV0eMnwlv)!z zc?eAlhJCXBleMH+=YnXG(`LeGF=MQaw3aH~q!XKrd|AhjlejlcvP8~%K*-=7V=@!3 zJs97>@n%P7`hK5^CnlLLf7m!}T@>+vz4nvrS4_wU3-6nUn`T2It4m1*`Zs4zFaUPk z(V?!9Zr1XqJ;raGxfp6m=-K^&(ejfTT`+DRQQU9 zkS>GP!3dx1-_TI*Hldpe2W(hD(=ij8qj~+N!EGH#H{;$6bZS6p9*y2XYva0W5z)kf z5h#ppy+~G2-?$#*1`r!tS<6jPsJ4I#m=i%sIgKGOE2VW2WDW!+u14=SE>mQ&a%-bE zU?$V$tChCdM@prH0_aZs$qDeYG5&7K(+_v5INXjNEVm-WdG;9)UlA9|Ge4`-E zP9$XmB&agdhHX}#yRXUy#MvL!gZ8JwK09@7X@iXE^p2!#H22nKZ-eSaYM*3M6y@P~ zybk30Id5h}Yxu8o(O_f{Yrg&vNqPIO$&cEO(UB7X%9*$k5+h(6u)c$L!LuDbRVlAm zVYYgWfd#r=UsL7)*y*pd&*ib}a&bKXvQ(k96eOwpy>1TBV_R?BE!TEbA7-6(KpAX} zF)9+cQ}3fyMz?RjPmg+(UvxnSoKXmhF#M8@((AcJ}4f>`6#}KEa`sz57N?WKz-;PeT1FRA2(sl{sf$ zTeNg-S8y=pLSl6>c;1hywJzNtUU+(>pl~f5T)kn0kwXZvexF@JxpGQUV>d~f0`&qv zrif|4k$(DV&Ltzg3rB~gWl5RvRMjO#@|;LURaeVgMFBOUdt^v`$532ocz!IwQ_Av; zO0iZ@`SyFy0;nAK2$QJPCKu_T&*T7D&&M|>f6+O1&Kt(GOOz07V=t{)u zRRPQ#DFoC;rk4s7mNW22gbsGlz0M7P$l4V3zO||9ETdi)vWC*2 zWm()c0aq_CPMVg7Itn{;{Voi?6N`TrCb!i>tm#wa3AD>z4~y@%$QbL6Y+{&qjYbyK z=6Lob+>(S%A$h~B8x+Y+$yRF;!xUR3G-)FrZm|wk5TiJRnfVoorK9=+& z!T^Q#^&N+ck5LCP)EtTg*!~pB3E3skhQK8~G!$UBBR)t?NRom3`uQkbF&d>SX&EEUI!fWY^i531~=mbmB`&?03= zv8gLoHr55-)iXW;D|jOD?HPe0pgK3&kh@j~eJC&H;g_l{|MTVV6f^12*j(!I?QzDTlUk^ClNE6&~MYz|rGg|NrdII~+bVZ$fwI1~aS zmXj|P-~X{jKL1VEoJGTnfqdL_w$ffzq@n(}+f4OWo~0^NuZoD+%unH9wyT?@Z6?)8 zO>Rp#TD5LHT`JTCKAH{sSc&vF7cVU6)5M0n0DQ;Z;Cf14Kx#FI2C0y?=+gK z5XmsVvJk1cqu@&j{ICW1YchM|sBsQIz+PbXs-*k-rFdV~itL#ar+S>X>vu+Z+Kk)G zdgU~(h#Te_6Wg3oYiQLn(VDASdF^os9VST6OsS?F_nj#}U>n@zt~gz(puR&M&2>I3 zlr8H%Y~Q(#0j#V$2iHT!dN@kGmj3nYLGQtv@Bh~CV^tY>g;IMuBV66t^>z`^R&4L+%3s#ESA z3uGAkFxD-F6pe^y@b^UE@)elxnig;!r>)_>LB#*By=!Z3+s4B0{1sT*Gj+ToDN&YX z%acv))=53>I+@s+c4w7IKoXSE@HPM`%XaDaq+Wn$3gwA`!%mAkM+Crli$Hio2^WF8?8&s% zi=mTuileR0YxIV*)SKuz3Z(L#2Gd|q?%z+%>DSaRNd4z6iR_@b%%4qzpk;)=7X7SL zJ#0EN;=^%ltCFe?M*kYE-COR=YHOqiWE(h5y5>###OTq|_5WZkRlh-fi{jW)gRkoE z6{TvAkTt^5ascr$WB5+VjYg$7eAGjOP{sc3{Oqm0K_g#tqk)RzSwf=1Z5+L6MA_J4>7kVqC{H+SDcfyt ze<%7RdU~C%>r~BVU{mH(B2V}NSM;73%QV_jRHB1X3v;YxQ=_Waj?t^8l4XoDvYfPb zOe-blc6TJO;9@epCi(E(XB|_`O>?*}qyJ>i04(~n`=CpFRE}1=u%}M7E!t>+j3y1}gbVe=&xNx#18YKZ^ zci1u2>ztmLKuDNNeY5fWuseNT;duMBu|~TOR#s+x_1F&9i?L2H7na7Iz#GhO9zUI| zVT)6(Cj5Xd8%}e^31#AX|LW4msjnczz9d9y1YF`s;?9?9m9~Vdtyx=a_j@<){~9EO zHthLU{NMeszrz0-4u{+Q-*0lwCAh|R1Lb8Y_bqo&Kr0Z;2Tn;7n8k#n!^t=#$3u)$ zG7JX?VT_LlAxYEd0OK?o9rlmYWRwi>;4too@h~36gCyz?qv6qEdYr~bapJ&)1ck%H zqhYue%I{15zpm{6CHY_B{}21&cq{+kul%R|aTpGd(=i!ELp)59!7#>0$@pM+6pcps z_~>{%I2er*5|0P{F$tp~j$$%S!XX}oqmhySVgGO|{@;cCs}CLkcqz@wTQ2>j`*(Tv zH_LxG?hm^1e{e9~%KtaHBr@a-zO{B)?>J>KaS#G_s)<|$;~Af*1(b(=*#E(C{wO06 zq|(Tz6_BzD(jXIE?ey@8BwAG{;-=spAbfWp9$*E@=)x~KdQ>$0he9{Y?)^2b|_sA&S)f2a{H$Y{mVc3ni8HlCoVSd=6NuUyB2ms^k

ES)vQ1o0**5w2=PRV}Ae|FQIkzT- z@T{qmz)j3>S|iUBj^1eer6hTi)l|@fdtO9pY^7``Evg*F)Y0ERp}by=z?wq$NAvci znA=V9`r`WM_h%ok-~4iZDZ8H<=<4z_DWC^hZf`G7-~RaS^wssptLr!K&OiS6?)<0o z%j=8NU$10RPGUxC?mrRH^l7MQr!HsjFMj>$my7FjyE;10&O^Iq;(hfOlu+r{CTK(`gu^Y87>qaod*>q zaUfX&!6i_jeWrQ|iA)+a?O3sSKO^^4!1Pr{6Ldx}BMj|!UejGo`%0cEKYzKKy4JI# zEQs@D8?Y+>wr#+w{QuAfUupa|o*_gt5cX9D{=YWc@ z%#Sf+jjy}2>o_|`KE&aLU(p50s;tQ)TFiu$C_NtRbi0p(Iq(t9_;T2`|kP(FKIqg&mG}t0W#WI%Zw+*SnOk|s(2ZVeB(da7wKc0 zG`{bl zds_8SjhVl=m%o|%ovGjGJ_I*84EBp<$#PKeOyTNQ=C5uN5~+VsAN7}2x%wvylnQYN zdAjy+002{|l7S`OC8=S0e*%_`)d`$|%Xe^%@*CCRYRYg%m{}XgY^C~0DSd#cvIIKjPBzAc)Fmc5Zv$3|xX)fGq zbKPtUMOEubYXTPNl#Ww1QAXt~)>9+B<3IyKh~go!Uc_=fphsA{uGrL73^$@DiFvXq z#42X_v916d1`buTvR0J_dr^%y6u_!Y#hbaFNIxVH7*o#p8@)^M8(Ss8>du zu(?_&C<``Eq0eMsjB~DHwi7h zD#Le?(ms$gj~O9_M~fR8(Yjs64r;3Mmat`Y^-CBt9P Z$z;3BvAwp}_WJIw{{gB|(EI>^0RZkmhEo6l From 859cfa468c3440ef93bd5e5f647e6dd738f18751 Mon Sep 17 00:00:00 2001 From: Leo Date: Sun, 3 May 2026 22:43:59 +0200 Subject: [PATCH 7/7] Maintained formatting of README --- README.md | 47 ++++++++++++++++++++--------------------------- 1 file changed, 20 insertions(+), 27 deletions(-) diff --git a/README.md b/README.md index b11c94b..cc4b689 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,4 @@ # ElecWhat - Simple desktop WhatsApp client for Linux -

elecwhat

@@ -22,7 +21,6 @@ * Custom tray icons in `~/.config/elecwhat/user-icons/*.png` by default ## Why? - I created this client after due to recurrent stability issues with other linux clients. Also I just wanted a simple and stable client and thought it could be done without much code with electron. @@ -31,36 +29,32 @@ Also I just wanted a simple and stable client and thought it could be done witho If you use Gnome, I recommend using this [AppIndicator] extension in order to show tray icons ### Ubuntu/Kubuntu: - -- [Snap](https://snapcraft.io/elecwhat) -- **or** [Buildkite deb] with `--no-sandbox` because of [issue] -- **or** .deb file in [Releases] with `--no-sandbox` because of [issue] -- **or** AppImage in [Releases] with `--no-sandbox` because of [issue] +* [Snap](https://snapcraft.io/elecwhat) +* **or** [Buildkite deb] with `--no-sandbox` because of [issue] +* **or** .deb file in [Releases] with `--no-sandbox` because of [issue] +* **or** AppImage in [Releases] with `--no-sandbox` because of [issue] ### Arch Linux: - -- [AUR package]: `yay -S elecwhat-bin` -- **or** Pacman package in [Releases] -- **or** AppImage in [Releases] +* [AUR package]: `yay -S elecwhat-bin` +* **or** Pacman package in [Releases] +* **or** AppImage in [Releases] ### Debian: - -- [Buildkite deb] -- **or** .deb file in [Releases] -- **or** AppImage in [Releases] +* [Buildkite deb] +* **or** .deb file in [Releases] +* **or** AppImage in [Releases] ### Fedora: - -- [Buildkite rpm] -- **or** rpm file in [Releases] -- **or** AppImage in [Releases] +* [Buildkite rpm] +* **or** rpm file in [Releases] +* **or** AppImage in [Releases] ## Configuration + `~/.config/elecwhat/config.json`: (or for snap: `~/snap/elecwhat/current/.config/elecwhat/config.json`) - ``` { "log-level": "info", @@ -106,16 +100,15 @@ If you use Gnome, I recommend using this [AppIndicator] extension in order to sh ## Custom icons The naming scheme is based on WhatsApp Web favicon urls: +* `~/.config/elecwhat/user-icons/app.png` during startup +* `~/.config/elecwhat/user-icons/favicon.png` when there is no unread +* `~/.config/elecwhat/user-icons/f01.png` where fXX.png is the number of unread -- `~/.config/elecwhat/user-icons/app.png` during startup -- `~/.config/elecwhat/user-icons/favicon.png` when there is no unread -- `~/.config/elecwhat/user-icons/f01.png` where fXX.png is the number of unread ## Not planed - -- Multi account -- Complex features -- Other OS support, official apps already exist. Porting would probably be easy though thanks to electron. +* Multi account +* Complex features +* Other OS support, official apps already exist. Porting would probably be easy though thanks to electron. [Buildkite deb]: https://buildkite.com/organizations/piec/packages/registries/elecwhat-deb [Buildkite rpm]: https://buildkite.com/organizations/piec/packages/registries/elecwhat-rpm

ES)vQ1o0**5w2=PRV}Ae|FQIkzT- z@T{qmz)j3>S|iUBj^1eer6hTi)l|@fdtO9pY^7``Evg*F)Y0ERp}by=z?wq$NAvci znA=V9`r`WM_h%ok-~4iZDZ8H<=<4z_DWC^hZf`G7-~RaS^wssptLr!K&OiS6?)<0o z%j=8NU$10RPGUxC?mrRH^l7MQr!HsjFMj>$my7FjyE;10&O^Iq;(hfOlu+r{CTK(`gu^Y87>qaod*>q zaUfX&!6i_jeWrQ|iA)+a?O3sSKO^^4!1Pr{6Ldx}BMj|!UejGo`%0cEKYzKKy4JI# zEQs@D8?Y+>wr#+w{QuAfUupa|o*_gt5cX9D{=YWc@ z%#Sf+jjy}2>o_|`KE&aLU(p50s;tQ)TFiu$C_NtRbi0p(Iq(t9_;T2`|kP(FKIqg&mG}t0W#WI%Zw+*SnOk|s(2ZVeB(da7wKc0 zG`{bl zds_8SjhVl=m%o|%ovGjGJ_I*84EBp<$#PKeOyTNQ=C5uN5~+VsAN7}2x%wvylnQYN zdAjy+002{|l7S`OC8=S0e*%_`)d`$|%Xe^%@*CCRYRYg%m{}XgY^C~0DSd#cvIIKjPBzAc)Fmc5Zv$3|xX)fGq zbKPtUMOEubYXTPNl#Ww1QAXt~)>9+B<3IyKh~go!Uc_=fphsA{uGrL73^$@DiFvXq z#42X_v916d1`buTvR0J_dr^%y6u_!Y#hbaFNIxVH7*o#p8@)^M8(Ss8>du zu(?_&C<``Eq0eMsjB~DHwi7h zD#Le?(ms$gj~O9_M~fR8(Yjs64r;3Mmat`Y^-CBt9P Z$z;3BvAwp}_WJIw{{gB|(EI>^0RZkmhEo6l literal 0 HcmV?d00001 diff --git a/src/main.mjs b/src/main.mjs index 1eddd11..900890f 100644 --- a/src/main.mjs +++ b/src/main.mjs @@ -63,7 +63,9 @@ function setAutostart(enabled) { const quoteArg = (arg) => `"${String(arg).replaceAll('"', '\\"')}"`; const appRoot = path.resolve(import.meta.dirname, ".."); - const execParts = app.isPackaged ? [app.getPath("exe"), "--hide"] : [app.getPath("exe"), appRoot, "--hide"]; + const execParts = app.isPackaged + ? [app.getPath("exe"), "--hide", "--autostart"] + : [app.getPath("exe"), appRoot, "--hide", "--autostart"]; const exec = execParts.map(quoteArg).join(" "); const desktopEntry = [ "[Desktop Entry]", @@ -81,6 +83,7 @@ function setAutostart(enabled) { function main() { const config = new JsonConfig(path.join(app.getPath("userData"), "config.json")); const startHidden = process.argv.includes("--hide"); + const startFromAutostart = process.argv.includes("--autostart"); // Configure log level: CLI option takes priority over config option const cliLogLevel = process.argv.find((arg) => arg.startsWith("--log-level="))?.split("=")[1]; @@ -414,8 +417,12 @@ function main() { // initialization and is ready to create browser windows. // Some APIs can only be used after this event occurs. app.whenReady().then(async () => { - console.log("Autostart", config.get("autostart", false)); - setAutostart(config.get("autostart", false)); + const autostartEnabled = config.get("autostart", false); + setAutostart(autostartEnabled); + if (startFromAutostart && !autostartEnabled) { + app.quit(); + return; + } let window = await createWindow(); // Check if app was launched with a whatsapp: URL scheme From 7b6ffac9aecc600f8b599033ce02c365e5bf9dba Mon Sep 17 00:00:00 2001 From: Leo Date: Sun, 15 Mar 2026 17:01:01 +0100 Subject: [PATCH 4/7] revert tray icon change --- src/main.mjs | 17 +++-------------- 1 file changed, 3 insertions(+), 14 deletions(-) diff --git a/src/main.mjs b/src/main.mjs index 900890f..60b5940 100644 --- a/src/main.mjs +++ b/src/main.mjs @@ -1,4 +1,4 @@ -import { app, BrowserWindow, session, Menu, Tray, ipcMain, shell, Notification, dialog, nativeImage } from "electron"; +import { app, BrowserWindow, session, Menu, Tray, ipcMain, shell, Notification, dialog } from "electron"; import { readFileSync, mkdirSync, rmSync, writeFileSync } from "node:fs"; import path from "node:path"; import { @@ -257,19 +257,8 @@ function main() { toggleVisibility(mainWindow); }); - const trayIconPath = getUserIcon("app", state) || path.join(import.meta.dirname, "..", "static", "app.png"); - let trayImage = nativeImage.createFromPath(trayIconPath); - if (trayImage.isEmpty()) { - const fallbackPath = path.join(import.meta.dirname, "..", "static", "app-512.png"); - const fallbackImage = nativeImage.createFromPath(fallbackPath); - if (!fallbackImage.isEmpty()) { - trayImage = fallbackImage; - } else { - consola.warn("Failed to load tray icon", { trayIconPath, fallbackPath }); - trayImage = nativeImage.createEmpty(); - } - } - const tray = new Tray(trayImage); + const trayIcon = getUserIcon("app", state) || path.join(import.meta.dirname, "..", "static", "app.png"); + const tray = new Tray(trayIcon); const trayContextMenu = Menu.buildFromTemplate([ { label: translations?.show_hide ?? "Show/Hide", From 6b1d8901f3cc71d1fe913b3792e789b76e3f7aed Mon Sep 17 00:00:00 2001 From: Leo Date: Sun, 15 Mar 2026 17:04:31 +0100 Subject: [PATCH 5/7] Wrap initialization code in app.whenReady() --- src/main.mjs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main.mjs b/src/main.mjs index 60b5940..11641f8 100644 --- a/src/main.mjs +++ b/src/main.mjs @@ -220,7 +220,7 @@ function main() { app.isQuiting = true; }); - { + app.whenReady().then(() => { if (config.parseError) { const res = dialog.showMessageBoxSync({ type: "error", @@ -389,7 +389,7 @@ function main() { } else { mainWindow.webContents.loadURL(url); } - } + }); return mainWindow; }; From b90675778c0e67e6caf4e562e50f300cdf0a367d Mon Sep 17 00:00:00 2001 From: Leo Date: Sun, 3 May 2026 22:37:38 +0200 Subject: [PATCH 6/7] Removed elecwhat-1.13.4.tgz --- elecwhat-1.13.4.tgz | Bin 26686 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 elecwhat-1.13.4.tgz diff --git a/elecwhat-1.13.4.tgz b/elecwhat-1.13.4.tgz deleted file mode 100644 index 7d17d462d505c964c01fbfff0d02f67411ebbcc6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26686 zcmV)1K+V4&iwFP!00002|Lnc%dfP^pD4O4RifVMegiJt?y4kU8*+WZotd1;cL^le84YK{}NzPNq}*Wg&{0z~6eMcwc(o zg-MjjPip$rm!E%>pQXP4%R-c8B8npV!{_+O{U7WMn)iQecW3X*{r?<4A3VnVWszj% zt0XSx{yy8<9(cE3uJHe5_y6ShaCABz{g=#f*Ztob?Cx!?@&Cd0{hcrO|8xAXmY*L_ zU$P%Zr=yGE2|IuJ^yK)EDfIAI`_Ip!kV&4goq%mWV1KDH!L|p3`<}-R^W~~YX7iGD z4!igvdsYa+#`(0o;e}w&@+ymYndDi(j7buR8GUZnDrlfY;-M(Rh|i! zNVXKkA}LD|vodEp27Vu>vq{s3pE9Z%1X%dM{3Kr*4wGdeu zut`<2XwI`)lFe9B!thyMGM=XSjfg{U(|+;iybydbNd>gJoC^Y*$V9ANg= zR3;HmsWXFbVb44pR;9=&kDZi^~#(rVCk|d1RPf( z7CZr&v=G9=5Fi7CB&B4P6a_5(l?ZSvn{ls_xLNOxJsFVaQwF=xGd_g1@Z~a1gk(IG zIqZvPD|H$GK30fSa0$QwOa#zRR=7f5mGd0e_)A`~h-WwwdgykwhY7?5rv_?6!_ItOojW&PzB* zZ_cj?MI01zZX#X4we_)%I__dd=wHsof+bTJlHDY7-VMwYtPqh%uAy^PL@;D5SY9BY zW}?JPiygfip243^S7_s)v6((E@U)kSh-h^%NX9a8I`+yi#A`?W~Fd zu2g~hp;jT%g+feoICy9XhvG$|D0z~xLda#F$z+nGNePFcz}$LDE|db8KA8drvPB*z zQ$Wf6_3_FaKZ8xXhyYgv_lS^rmKRLC=Zj@3f;(3rt7vX-e86tz0!Hy>1uqkX2;Ocs z6>77KN|tQNrDS;qYeB$>C|M>VD<$oSFNCMoCD#xuRyPj^YM^*I7c0DUfo|X34e2yHw10 zN?cbWlUHmva8HnDaUZFpLKJiAFl%gf^)1e;NZz-4J4k{6%+55DG+y0 zpF|;uJ+m8L054e~D&VSX)Fq^eCwVz1@{f~xW>U$ogq^Msf3K24D0t)g6A@bmG!bmU ziz^W`Emh-%t&9TXX zXVsKPWmSm6Q$`DQbH5)Pke zq0B_fm|V$HEO?nj-jbK4C^AbLCU7P4D5?q&Fle$uZ~|r?S5Zl#QIf^UbrM%R1ps-K z1g&c#^^T0wzE}*JK-jS7)(sSgDT^d3H7Nn~LsEj+FtxH@4x|~y znclK0mauWa&#DxKByk^+CYOrB$2qcR5IXQ`Ugt?nD7h3-!c!Ilk`~lhFNj1vgb+#f zX5$fT!9y;RluS&gfc@8iXv-pB7Ktc%u?m%>K#~BQmnBDB0{0xMIhoyHgo7WAPmq-q8|}T#%!9yX>8VoE=LzH z#%y?c#179+kB%>o&rZkCco4E9F-5&Qd>4v+CkJjL_Xw`j-Qqm5EH4P?|xp9JoO z;F+}iu9qfPf~EXM(RC83%eS4$#L-GQe{#=Ws;C zFoC37>B0&Jfr4;3=b2(BD8PaqmwDnnk4P#}l)ezMN|8U{;u661GzCbgg*!~lS8MV> zK1j4)h0-AY=1)++f`%}$+X{g(WPX%ii$cWsnXf=0618B#s?5x(4%-EQU@TB-paxnFP5T%^M_4E7KFLKgni< zvzeXeTF?ae!IVb===L(@E6M!flK2Z8)d|Y$r#Xlm()W~3gwg?F9;v(P@HowwC7Poy zi+qt}0@*dl5Mbb%3SJte2=ogxGnp&Q+!oz3oZsjfUMbR))G-C6yM=m1NjnN*6>hkj zP#qE_BBR6;i&&cuG=Y^!ED5SO299e9vt}!_QdHS;cAbbDbuh+wXbJf76pdf@9F~QU zBp9$XA@dM!GRhYVj+~}o`4Y*p zE{Q>;Lt%_B@@(d4xVUYktctwoA?z8AQN3X&$)w;w)O_NOiYi+%LfuirJ``{D3~$9& zfJ*FUo~J@#eusC-`ii|{4TLN&7ChC5?vdYzi2MuwYhJL!e6h?kV-`2c5>O>867Z6m zdrot_?cEL(XZ)_$#i2;q43XC?OFADS(gs&D@w+%=#C~ncEhHM$3Zbt7 zSVD6&bm0a`8(W{dHl0V)-MyCjRc+Eevd{3+1IxJG*>=dDa+yTz+$bcZMh??d8=Gh7 z#fw`6C`3yAwHD&Q_5j>w%@BRA4g6>i1}U&8#C1+eiFM0&**#P7^SCpqaeN(qxgq7Xz`Xu#gl+fOoJU6~Gg<~=Ylp#6{rp!6Nrb{Olq{7u@ zS@AwfD@jH<7-E%INYNF9$dw2*Z^|R>CPJ+ow48IBxG)jr330j4Gx!P7TDHkAmt zlt$4*vkTCzA|d%qaR`F2r<6h@UFPHvH^_)tNn>Mi7uh&8Pi>W4Q)tq!K_buSfF@$j z(`lgYH-1Dmh$PQEWkZCe1bC5gZ)6&E4BiX6GFrhW8yWfc$e(StA!57nyehRz0(@d3 zrSqC6OJYH*yh2<(G;mYK4&!H!k|L@Wpa+12UyBq0907?PdUymJi=#+j*hGMpld&<1 ziz1UK#Mk0M9)b-9*~!)bjl2?Mhbqg!k1WBm3k%!{fsSau$4l~ikWzj@7xo!|XPA{q z?+}*^c3>FwL|w5gWD-5|cJDvrN&4OMXpPxB|qXgsrit#vKmS}Th+XHqaBC(i= zf^9u`a1ZX3CzC}2Dis=HHHv6dRVID3B-X&7d_8&((ndVc1w*P(rNVqTi7EavGJ7WUh|3) zD^!m0C;!{oO2x8}k!i&NrJA~_-c_?uFC>{fpE8jFbwwqT&w${Tu851WNkG?~ ze5wUuSt8`O3YcnV2AXS!=Cwl;Pj5GL?(NSyKI@PSYAy#-r`rhO(i>C!`CC~NX^6Ra z+Dr!_AYif1R%{{Sq*}C-=}az@s3NB<`iHF<3*0q81>_tsTY$Y@#hKk{?0V>339*C| z11mQtS1|f;fy5X=ur4%#_>-+Xu%Kx1s(9!nxLwrjizDD z=-i2t6lN>)E$_7N}0 zHLHw_tw?F2d=e4kFp0A3s6Y^o0c_V0ViogJC~x58cg=;~cI+x*0B~ru#r` z6|8WW`&v|1S|Qqw)NZ7T2(n**LZkr=2M8nh8!nEoHX3zpjF6ULkws)>QW#CxvBWu^ zKj^PFMLt8YCEm<|$uCF^&)G7UQb-+1z^#w0F#txGlsYJZNI>A;#|Eo6)Pis$CQ$N} zC`_QK2d>&>A4)M(QIx2S2I|OWyoghXI{{gnf|yohf~QdOxT&}RVF5V```2|a7nWLE zbpj{(O8M-qg@%wbyXI*Eh^S&G?4T;R3?nt9Sn`7CxeoTyW-i9!E`(l~iRWD2;cAfq z(JPXk$@zh!Y;?Rl1lTD1QjK{vXHpw7mT481fO4mrY4a?^vvCOAg|R`P;)Aj{h3}9Z zo(zUYR;bHRgg*p%4LRk7i^UQG4zf}^%SN-s3zzjeXoxY<%pZO%#MPKA^McQi-PGKXS`=_x%$eu&*$faG z{I-c+sRa>kzLbua+OmALa!;F3Ni;(yOHo;QQ5T%@wei1I;mO`ata1d2vVK{=zEXNg zkpb6JhALaz@u8PKV`fLzrWtVxBXq7L&>>fPu)a?#E9ij`cka17^)%0Vik&{oi^T?B zS~rxm7>o@EBx2-Q4k+0!0)KBKBXk^k3m(mrO!OcS3Ta-eMXWJdQ=}n$%7kUCH+Py~} zw8B|j6=Xltqtk%I!72%+MvNXnoJAY04F@bmK>>M|wg0#7nG;bfK!49j3Je%heUkP{ z2BJfWab|+81TV;R>og(G>DZsNFu5ddRZxgELB$*@F54YQR+9)o)ad>Bf})LdM# zZY62BkW!vZ49KNJFv9d*c3a}`?%@~=P%Bb$)JEfD(2ftZ5d`?B<3pf5q$s&7F22Yq z8bDc%3c+Qbselu5fa^IymvVg?N}jRSFC!KsRzXOz4Qo~E!Clx7A~)9&7UY3M?8tJZ zf>;So;j=?s>)NGzbSk35Ik0tnR1uQb%4*fRKv#z2kT{)j6fY8~jY?!F&ZCG+l*~vS z1(!N_Fu<@t5tg8%!YJCV?1r$nFQ0g*xjaUXq@7TUi53v=O{`qB;o?t}Hip-k&Paiu zJTqvgM=VXjsnlu4?9+L4Nwg#gS}V14>USQv(x}LD!B;xm#(qeXBL?6o)2blrAYlVB zDkCQ;#h{il@F{rL(10B z3=us*dIw;))|^!r$3Wtth@EtgKm~F+mT!mul0ptDQbJl62I^buFvJbNFO5Lq>{4ktu}6wkR~#l+hMg($5D%H!>|nN zx0Zm(+=f~f5j8HPG0<*n8+686?8^NrHA9WoIsRf04G<92FyUDjmuYc1B1u;Pq!G>YN{V@&#@cx$ zEeF(|W8?Bh=A6bVwIRxjWllC=56uUh#SjGvVS}I~uo%KS7D=Y=9R*Dq=^;^Jf3?j9 zUYu8xa$2PrFD0$lp%5}puL;gmew}03B1#^7rn7C_2r8Z3VA&JKYB?cRp!NjJuK}tS zSM8OnCCZ99MbYJ%4I|?n+X-bs3D~Hf|2mY6t_bP@-b2>{9T6! zxmV1I5L}3Ip2so(+=xUBj)6esfvJdfb|qE>ULt&n9a|IJ*hzIlBLc+>3D%nLw61|7 z?$j0t6v*Ri{V69@ZkFgoZFyi7@?-^}ilWJ8l(Vr+vI>Ynl_4Efg0D3w!xcxO-TXO5=m+ z$gSr_7MGrJViG&#dMf88s)&)PYaO*oKPUs#P7}gfRAjZo z`jQ$55xH6Zbhi?bJ96Sm~8-_fHsZGAmLk9&%?SmBN~BX0NTJ=CG0-wW!BEJpklb6>F;O2qQC_g?Bu_CB4>wn(6tagooOuM% zjZ?*pZB!kPid;%}AQhr<$6X+*u<@L=G>is0*YDYSc_=dpI~$t_$+GFn(`7zHOa%v& ze}pw+hBpTcd(FT(rMu$nT64^DlPd^m=r^$7yZ~;7I8kNb7D2~57${ZngVMARTK7XX zw0@aOp$)3O^Qm=kKss0<+|V1qaTPDUX5Q3kXMnRR9)~h2C!=4JFgK!RoFds}_r4a>2>rM7F-Q zoF|BCLr%wA*Y1(!TSuw8F|@{StI|D-Qr|!n<*h%-(*zyV8)s~CSG7PvS1Or-NJ8lg z-dcDF1kVuz(%Wv|!N!0XGFG*P#=thXsvAJ5C|)5JxeAwQpGNz$d8tyAfXt!62b}r@ zHV@qroefx`fTyiyHf~q>i}D+_44$GAr)pM^{&Ax>*ogEFyVlu&CKhkQ@_|k$q8KRO zv9gPx##Hx7)#L8aeW*)4puM*>?!(Te;Mh%kIu(#`W>jKj1Gc>I2Inq zEekZKh*<(kaJJ0It_d_sfz<`*w&=0DcM^(vm=bDImG8Xkg-shtoPCfyX(mg3s5FPp;Sn4ihzX2M>`HA>(z z6&Y}Ltq$1u!$R8@*SxJbi1N5%u(=qoeBu+lfRM!U$6WCOBIF*&0!G1&;-6kK!1W`hjkQ zg~ByxL8}OCb5bsqB#7{lcHXIrY2ff)WVNt5yA!8?i9RxAnbp8w)nhz>I?LL2Sx0Bt zHjYt6-gM~}QmrktK44vdg<{*d97k$z2%}RC>ulw=Q=F4RhFZrp$;Qb7b6Qk%4KcY^ z0GR9mqH>KOwq~>m@@z0qBr(!8Uzz4T6AFsr4eVXrM6e%dACZZ?wFY+0T*0z(w1p)(40>bC8z*H^3!I#_Y{U|5#b@aN1ZJIqY_e93&aBTf12Sho zlq@I^0JJ|FqfDtSwU}sE^mF)s8)LCZS>L(ily~!Ko!WVI&pd{?wX7QSHjH7HRdJ1V zyns?|TEAnS86=Mh3>|s zqXazk$OZr?>iRX*c9k9BhEr_&4$v3lkrt%crNT}jMsv5@2)w8ThwES7Vii~@fKEStYcdTy6F=jn`D*z2YhA zrMamPl8KvofmTy~&~VvW^fE{@0J8@nTK|@qx&)er5=NE#@Hu6)HPR(??4;`)q1t6@ zxn_A0Q@Dy=XkK`joP zoMox?K=CFd@&-G!*?=1;ISJe#UZA(MR(i+{Kn6-pH?kgn+{QsD=Dd-HDO4slX^vEI z$GQ8uq9tYPwH!jdk{lT0OpP5%JtQEnC71>(AOPhG#jq?4*6ux(8&cuEASn+u=Tl9T zFnyHYWD@Lg3wB`wU$7Gvr!tghL#|cbt5V~xnodbaz+KlbjWQ9aMBKng3uJLtr$U8Z za86l~D+1-O8er>pK~*PBQ7p1)Pn4ILAk-$SdWMrDL%KD_h8gq0iU-P*_5b)J@w*-& z<8z{UC{>dRUb!W?NCc~u^#i^Sr8+6V4Ipj@uBfHwI^TeNE#z!peTx+t zW6Yu?GYmR8g#@ojObP6|iMm!MaqIVl%H|qodBxZxW|B?%)FtOKvO4C4uLExyA|u=>W6{N&fEG2r!K9tSbhTec=2cZ^6!?yz(|E@SXk@aJ*u(_9)=UNHYG`oJ5v6z9RXai$N4th8KLAw^i!_F+ zT88TMsAf)0<#tGa9SJw!AP5&8m9)UPEI3Pb(J9&;Z#i9YTlR&jQrsbu(CljCn-GHx zSvva@BE5--V6j-uuF(4A*EdN-B3o(mh{tDzP}V7Ozb7Tx-&B4X1PA0weF;dF%9Y$B zP`gFPX~&eE%k;==vaqUBtozV>*COMT$cc|NRLbs8E!^6ZT`Ftq<2n1LkbC_EF}Q)G z3sWFd)m*1o^$ojS+m}WSH<=yBZHsbhh_6saCCO%(6_}C?o~ zBSsg1XKJNmnP7;U)OpeIM^lnaY&-XKOoKB?Bjv#`X^b*}mKaWwSQCR+8iy(vN1f1D zoglVhuVs!lN2rdhCbxmA;0&CR;vt|`DCsB|kfJ~|5t*1K#Eun(B<{>*zmhqeCbbxY5BvD&@7UfQ}K+Olctdr=wzjQNDDdhbS^UFcn{9Q+*-XTH2ysw%!6s23FB&geTc|PfQ3> zJsfqj782H#t|oIJP$^3e3a?fT2F7I3(>MX0fJ)^H^pvk@0urPOBDLv`XeZMTaL@v6 z$O*E+C0{Kt&MCJJ1vNvhDupUdqwTAzNZ^VB^A%ZX)aY~PYmQB_S)far8&YizuS7|- zoo?-RXv1rOX-O{nGzmUdCtars^-R1PNi#vTDtMixhXB{nEgzq1{RYmD&yl*>a-K8g9!vAKX}Q+pPy{k5m`37p?rfO@fmt{# z-)n?osw@@tTpig04cPFRA2pJB=%NNCqk^NOVOqc?rszx^qgGEIbE_F`?Sv4~ZKX_j zmtqJSWPaE46u&DF&x5-Hi0qDW98W6eLIxl!%q2^F8(`mDyC%V#Q`jAS&=*5$CZ zUftpgjRzc5ZcKX!GP>g3ApKee3JlaSDRk>KLv&oNjoO`91ra!_Rd7-9%SozAV3rP^x>S^9}#2Wbamf|ufk{WGyj*Vx-lRHY`)&W&|g`Qbq zq3g2MR-iG#8cJ(;<5|2}4~#Q1JHZL0-8w|IsJ9t~Z1`9-&$X9A4}$h5vp%nFeGXo0 z*6yxw?EsfW{(eO-EQ$zHc!(y@lT}{xJ+nJdABIqY`++Iv@qYEKRK}Eg*jL@DYQf}& zd^k3G&F%;!IJ)kkb$*wPoZx|Kam#E1pgL1F6E|8CYZs~LT+faBcjAY#yw<}J6dK|Z zWG$-z=)5Ju1tkNb;zpgoZRuA-5wRKfYDh`MZZ9;U;e<-BRB$+vxaXsb5j!5U(=+yJ zcyTd2z5IneJG+1{*!jiTj~Bxi0lPfIzej()9GzaW^U=kN92>Q^Go*X`RJ6L!SJt+$0Ihr972cVQ}*iO`11JlM;!3*?EIID;~$@2 zde6^Jjz$;wLRJ6lf;zJE;l<_gXbkK4`S@t$u8H}>F*_dn?A7t*^Rt(iX7S$HGd4W^ zh5dAVdK9qHF%C5P>-oiKJRTjfvkP|o;{4=zbQG}T)5DXON5`i>2JGp}OLls8$xe=6 z9K$*<&jJr-Q*HI=u$Z%F?8WHf@cHoca`^Q4%YHd~ z2`u9I*~^oo8c+aGBX%@;HafgK{&^HYOEw&jU%nVAc#kjH*)wl=a>7nWhokX$c<~Dx zk1l>bK14WNjLwJ07XYQhvx^HD&xQ{#1dA=5*UB@>iFaYPtPC*Bg6=>%jqu;V*J8hJwIbF&W?_s!LcaB zIXpZ4dGyQJbD=UEJ19GRdIo@bI$|fsxSq>1gc6+F(eTCa$I;lq44BhXuWScwd_Fon zhF^|P508&VrWNLoOF)f%kc;i@Khtt#JSmqYe+1g$Sdr$?g;yko<|!FKBd!u z{o)lrzBuyqB}2S@HatFgdC^2XnEC8{ghL_%IwwIb#@)b!!)M3O*!bn)b9HR2c9nl& z&xd37bTm3;!=s;%@j9w`&c@?o1(UO99*&^kNZ5Bjq_;)jNeqL5M6_jux{htI> zH4?wk$s$mdGtDUz6cStB;~NRm1Dn=F<|*XQW8q{HKR`xLu9MVRdyCD)k-=;rX)QO% zCKl8IVbh(-1G*M|#_-YNvMQQoU0Z%er*zI6ULdqT&*@#KA%cj)xh{2R`7gloPQ{I0 zfOI@a>Rlhy1#axC#5$ZoJvpsBBx)Zs%yX2b2eBuKegUVJTN)_Oh%Bjw5d`kd(V}j` zK$TxCDZTpB*(46(bDLlqrS~N25Ao`kRgHg1x*_M6Dn=}TplYs+fmVFgsZ&Ps*D-;| zXor@33R{B}o8AlESe7c=0)vR0FnfBhMb=)#^icj%)=a0WVZA6Zj)X&~=Rr~S*45uo z{qZCF7Gz2qGQ1zS%u%T$`+}~XGp$T*SA5DAWK)G)j{uz5U)OkZ_W!NKbRsqMq)5aR zJSf~0CsGFT@Uf~&q@}FRVV6CE>U578dxS&eI(_dk&3mcdYt>;Jwd3A5?~T_EIVtN8 zE~~tuc8}tnQZkn{{X!-DY?k2zt;VdG7Hk{^r5|89Ov%_eLIfZeBgyJ`;Z1)ZdW z+Biw}(<-H^w4je_aSb?#7TF$}yjrNBLB%zd@zWA3O1o-GUU{)m@M2c*8Vg}k9PiS@ zwF`sPWL-51{1Gl*o5<#RWZmY0Rb4r!7MX=5se@TwLga&BkLG2$l>7bu&CN|X%c?Lh zW_=y+(SICz-VkE< zq}t2~)Zx?d*~!bx(aA5aD)SHzRh=g*S4+X(;gjz---dR$=7qMr1BtmvVIHzf*6ufs zK-bx1MH^GXLwCC9TX!L$=YeTyzFLC45&ebs8A822T!ZPY5Kuo?@1{D}E5dFtcrtc2 zMM=bXwk^@rQ+o?M0w`sn72Ai3z5n>~*p@$5?>OLsDl|4QpHJZaPV)D@37k|*#$Z#3 zwZvJ)VwvVE2x(9TYx@j>e$r1AT@3011vd>mdT$NgUQhywN`Pr}u|l42{rIM?JCs;4 zkA6HePWAf5p{JdlcO^+ggAbHiZEiO_y)A|CK7LEdc6bM^F-9MXb#u#wWwY7=QSC72 zWorF}bh0HJ%FH1|tjNKWDb&MWE0u0Xg?}-#6D}!2g9tRn7ST$;lueo3c1GnaDwQEp zy_%y2*A^|hNH;nf;YI}*z~kLIas>c#0)b$~Ci@=52?-vz_-ml34(8lI{4geDK@iPH z&f;di>ScM^OJ~b8oR^FAap-;ZkN2aBw)Zg=HtNS>Qq6EXf8ZR0!QkHRE^GUIFc@ra z-@nhk+S$7|*xI^xZ?Mb08fq27^CflY_y4nScL5ejfel=Ay+BN1OMgav)&Ir>#HyS)ax;QXUvPJ z;UfPHl8Ny4h^+T=+>i4}_Fsuf|M}(RdH-;H&U!s(e5JX;NIk4hdf*>Y#ARof-{yjgNeI+M^5rs&@`d?= zZiW3W6Q!Q>A^xkkUM6KK9zPdpnzL6B&HATDefo^P2hyiH!s~=Ry-;{={=mOux_%*x zC|u5${p+3n>bzg{i(mfN-_H-9@*nRH!euto>nTKf;G^sm!HWq|p6PGqg_!;kbM)8u zlEer8lwZ5EZC(cmEeC$G0CM9jyuQ5VQS{aD{jK-?>0qm`d&wd?@Y}z{bw28AtbGLU z0XrD_i_)l6stP5Rk$0Bfx6}`!W=5RG!dwPNCskR3*D5~nDR0$(O#eRW(^u>5mJm4j z82-Dt&7>-~{KxR$W}Cu*o;RR1%kx<(08TzDA+WSO@ZU~So?ZEm?RSs*e0?Z**_Iaq zL)6kVnv3Y_z=z-wA6FwO_6y`>^GA{2$OC`R2RFYw@OO6n$LchWOAKP+EaocSOqRuB z#WH-XE(}$(M}0jjet;VAqrN_$M|4x^XhUK}Jqi>NMfj`qA3y3-lgHkpK9Q@hzWn?# z{C`p`tfm<0#${gS~rulOG=Zus7j9Om=p}Ai8(&-o5Re zoxR=3Rgw{3uPLD?eZz zaUHPyj`f{nWs4q$2H_6^Jyo;l{unOVg9k>LnsG_n% zifq7mF_V@=!C$WjZ`c8Q_w@%_!R^-{)Tg)a9@dCH$6CDRoQTjLGJY=R*VxT-bc-vUatxpRnV>})uM zz(5&jZ_9BW!d^QBW5YE-9sgvw03-QRM_h*lWh!W%MIxWF=a(-|hFLVv3&n)GUA0Sx z2kDMs$!Dj)*A5O2m_PK{H{US(A|qSJz`J%t z`BG$0LT3qJTIo6*Zw+Wi`733a8sbNto7$hW1l-nI)9{9~g9DaTso}cNkdn{UI-M=F z_h+@{9skwvm6-e_R+F3;@kM2%7~l2f?3@;=eyUcizE2xmAqC3TcK#t zl~@5GQjJ5oOp~(XGY$V#Ky>_aDPmmdBF=dhfw|I8)zP;BAbkn6A<;d9$NshYt2!Me3W$p)RD1&(p#0aj2z%%HzucvVg#=|IqL1c5i4>ro;nPp}g%sswvJiPy>W>2z&lSQ$lSoR;@W~7qPz0jplP+9#WPYOw`h|*1*>s9%zERN`Md!Xk66j;Nt{8V+q_+v)G3$ z`Tl!*VQ=OT1J}80ElbZm=%!SV1@=e(@x%^Gy;zNU-zo;@ujh*VryDjfoV36V_+rcg;e? zph+njyY2UNtpycR+=1Lz41s~*H;gZ%Z{$Z{Bh?JDVQ!!ghd9^)!+*ns{FR!G1oqd7ZZ;Ih-7+xf2ocHK59jo)=IKMnNF zHwR2yKM7x7y#YDmx=sw}I$+E0MvbU`0FGwV0(seKw7PA|-R%OYBaGUK=_{hw4b{dK zB~fR*TX=mEcF3oDj*aU>)|6jj+_W)QR>sc(Sa*uZLPnSQY?cb&9K{;0DZp5iQy;7= zrb?3nK@X|LNJe}qeD|bWN`AH!*&Sv=A6}~Qo#Rtlp6*&7_D+4vG>~P!Jh!zen=R_c zDWiQ>B6Jk^{6_N{Q0WhXCMgfL;jP#F?N&n(t_}UJ#D`nYgR5~qnD1T05#nb1eP3TqYm(HvNzPccwp={8}7Cc;`^Uw@(vDD_M#pnu{W1 zSiw0AL)-S}Bo;Zf#a}lzhGpQuX4tFRg5dj;B)fvI;orvBNd_TIxJ4!C()due#jJgv z-@KhCF-|eeeiO+|WUSAIm7JtNIaRyAR|yXERM3b2AY$Gp-+z&P_WM6rkN?@;y1)D7 z{(rXnUqk-!JiqBbhd*iv|F7`xKRUL5`T5xWpBDcO{C|7x{%;SqzTE%M&HoScYAK33 z=f_8fiU!|DGk?*_^ha4CW{}AW1&_YPWDlqWAU84oT6@l}llVXWJ+JquaerEm9(tYq z>+d0lu!a90)2}$ffBbv;AO8;0K$`?GouVYd`s@Xlf3NgzU20g0;vb(NHt&B@e)jvn zyVr96zu131|NXz@vozuB_n$Ye|8WL&KKX{*$yu^k@L7^=xSbsHfLn>jn5WmaJLceT zq8rro8r6ncJNL57rT7gBq(QL)xafJyO@EQgvf!-GPPxPs`}##coF`SB{PPMv`u>O4 zGRkAoPkEI^^FNjbe9Zp4HE40icDc{|LAV_b^u^7l$xMZIz@>YQW<~A& z@xg8hUBD0wzHQ^7@>R_M`10!ySb2WQBk>F?4&K^kU>z0`uNk48^A$Wvx)3Au8A2&( zJrP=*O*056cm_$EusZ)ymdD~P7L&+$Dj)a1`_6x3+Jbu>MuA4Y8F#(VhzglX-T(FapZfQY7ydp@|L+gh;{UhyzQq53M*81M$^BSR zwzc96W2l@36|Ce{nJ<}+W@1r_&wx(xm4U2!Po1f-lA%Fnit|JigjZ>yYw+e zKGx>T%}6DB`8U|S1eKGQg#;Vtq@0Xzv}gr#M+w_R|gNaw;$Nn zrD7u@n&<3q{-`MOVjoKX!WX7?a{M<6mw%s>Y)f~A`|Qrs!vt?puwE}t3}m6^R9h?k zeIc+O&RtEGIaKVHB~R1V`P6qkzFhWVv6S|>^owWv%>VKHq_-0edU?^q5^)*ma@RU!*(Stc~uz84O{t!=a9LX>5qzS{}!h1+&faqEQt0;n}X z_j5m-4$|9cSL56#dN$->phyY>sSF6GPaEkssfv)ynjG{=_aF_-fm&W&H) z54X*ia?XpTnsaA2-1Al7${(r!FaL+=|Jz^efBy~kzoO(V_CMZY|Kr7G4IbW2@*IfGaB6@#^ z@9b^Idz0Q^mjMhY^Vk2-+Z7K6JwCX%)7#k@Ozscv#e)a;BCI|3sK0#dd4K*hdnP!% z5+OaW$Bxt<+$?|T_1GnZszaF@s_j{2Q0k9fOk^E?#i2&@aTY_5yyyn(byUd`9#PT# zPXYgnI4XR*5^|GDa`-9!Rd-r#K=!Ra89n#1q-%A(GlC1Mu)d%~8 zxh82o=`VmX7Z_p(VdWsNcDr_p!|~Ybv9T%i1mBz-vv1f@?`b7%`Aw{Z3GQDYjs02- zE`T(TuId1r@OUP?9z1okg2*>~8uXZI*-nJWppF*3uS3YQ^*w_EtfnY$RB$=(LxI%a zV3NUV1UJ%B|UiuuP)=GVr9C*Zo}Gp zi69G>P_*{Pq?;IWjl+NLKo8nq;6&{VpLaP>lfTOCA9G0Ga_iz1>%wzT- z5RX-x{&(T8@}2E(vFFa-*rNX(lw5lU%T-u_$o*=*dg6JZM3iFF3^A9Ftbyd8*Jlq(lCg8+rke zUJuIX@i&dU4zOXWKeLyUDl4o0PZj>V57goHIO9uuxn#zdQNgEWnB?Y205iV(E-$|O zj=g>g%EVPt0&SeUp$)z3^|HJtc@|Id_wU$5&@;OEl)Xl9zp?!x^N*^SCmDNvK}wbU z&yNEjK#%J08U}$egck*oh!Y@&FE5yq0p9GhcPqYPy)n};=uMLBot^)jM+=_m_VrbK zY?U5_fJI7~-u1(zY+HNxajat;Zeb0mE zD)F`Pj4$`$>ccNiYr3m<57YI$ckkYLD66OWtd~MSF36@(aG0c3m(TSmN2O-U?lC{` zv{>5%Jroie{Czg%sT4*i?(wpR=8I}+zeBxvQi0e`X%lE85n0un@WOoPeAa{KYI{n) zwq4*;Z5wfh#(Y?#Y9B%xS$=Z_DKFN7?bnm%&}MM<_VVoQ>FBSQlyYGch;S`JMm^$S zJ(WdLn>3Qvqv6XX&)5ex&9kxxmC5#*T);~hf1-qY4%Mo)f!`5fWU0!e0r6HfNG*rn znLglK4}ReH?>*R^ZpG7``#(I`6Jlq|g?KQzC;A1y>FaIvz@ihvqSP#apZop(zx5X@ zITwPy16w^U-xh6j;cq|fK?T=}&y))R>#q6%^QVQcMj)|k2H_9;%s09hgtPZzaosEP zJe75rSwk1W?a%CEY;dun-@;!dZR_g~@cj`l`E7ek3AIOPpP^?F<3?Jp)_{J7x>a{G#3ke<-xq1YvkEiKwzkJCU^UfdoBb$8?WT4PZ(veWkx6joBs8$@TYz&(Z1%U#skotLJjbgXCj8}y?}Qb z@%fc1D?u{Jfw{kDQ!O<2=qXlqHfFL~0^SEKhcFm;ZjmpSlJOMAhUcdN_1Sq|sFxps z{lim#d;-Fjme)`~fM*-BD=ez&NB|Amzi-M9PW0z^kMd&1v*b4t-sx5;-Xr@eY$$=4 zRn4tpG4UEy|Bo8FSS~!v3-;MZ<#J^@m0n$Nu|16hBf}X;K2#uCf7rjbwFfwt=$<`w zD1A@y^VT(J7~5ZzF0#8dxOdNMuzNiKuZj@T!ci#1br@K zUi;79&i%o<|8M(C{P$=1Aqj`U(bH?O8+{!QJ=OL*cvK_T%^~h!KbMWKm%N<24d8Fv z%cB>i~Z;talNp3$UG9e8%P`Wt;r<;zU%_nraDi@4trClF~vf z9e_*}lE=~5s&sPV+0(y_4lm!H4=(@O3$^=x^D)#_03r=AS76q5qJVb6A!P=)G1<*|-?umKyq z-wkjp0Sp6Hs9MrJrrf*xTw5qQYZ)#VY9bVclbP-=%z%LgRg>W%Zn?v6=+oHIlaO%l zSex`ZW&k&9AFffe3aMR#gBe}t-qk*@rP&A0ACNiHKD5*QNeIeeXY(j{^V1Cj*;;va zyhN%loh}rZL9J!u=$8%Z@`<3(^EP^KgbSnEF8VdYJC_6jy&Vts9{jK;wzqzm^4;Ay<`aJZhgj@6HG<|zR@&@- zNbV1x4qrTbdo&vVba{6E_Sx~t=4WB~*j>%rTXj4jXa37&%u5>{iVFg*A7Y&N2YGFySE2f+w(r2tJLiF}{eJ)J4-VXK-`U&u+PRdk zeKa!o0ekJghXMz9bKcZ0u4>b}rmK%_C#Eg3zk%Ds{HlI&uBpi4j=q+6offux_y@$y z{IlwRU~BFvyYu36)qfsrZ{J(<|L+V2U-JJyr~dZ=pS*)hJzix|z;2496!uTF_(}NP zs8y)eO+Quhs%b=jk$Far6uh;623z+zFXwPK{|wJ#;V)RK45jEb4M=wgw1*T7%2*$^ zMhDEm?0~s*=&xhl%l*(!ThmqOODK)haptr{2#O!W9EK9PLTYV?rn#M|y^{+7+pUAO zSJfJR=4mAwomIuRIhSWQS;y`aD~>`nKKs#YEM&W18_kt|Xs&B_l4j=v`q~8&1bTHW zWY&S^){eHA)v1H3+t4A+X+g0Y_tq}7x5cw2$)}$)7}q$_v1Ql z9dSfaJZuP|H@wI??-br+V}`0Ccp1O`P@njA{~hX#T8wb3mVX=+rhcJ13Vn1AFlzUE zZP$&Gch7i|Dt#S7M2OYEpP#t@+b_)fzmos!(4o(q|FOHf zy>9>A`4a#4S$@=$GE^&B)f)vXo#GIAydX0M!c(?!TrS4q% zuTz~qEB)WOx3#ykPXD*Q(Erb?|MBHAU{B$RS5dseixp_EO2A%-tO_u88cTyh<;{S} zxd2(P{^CrW@HC%6QA=Hnv(TL5h{YtY zvdEs9O-Nf;^aFO1&#*YCY}5Jm$z09!8pB$eu}^`kAC%eDr_XMkc^pH5-Dkr}RbRbj z+_r-jYu%RUl(kKC$i z$k9~5qdZC3-`lw#?%ZRYpWq>+fZ-!9KZ@uo@3O;rkuOAlYkM~w!2j5oPkE83F1}lN zdd{;r75e3i0wmFoSfRZ#r&AQ#VotxN&yFF>HScMxUgFUm;lSMohr{uj9n2;B=DBo;V|i zH)5h5eU~9#w~LdGvjVKw-T&@8kHP=hzbtvd7wp3%&r`v(TP8BNjWK&Q7n!)G;Bfj3 zUO$KviNBhFRF8evw=kEY9O`d6Y9#x(lXgmIk9(WH-I^lm?~=evN6^p=56W)S`h!l4 zU-KmEfa`B2sFBZ?OHlHCP`zy=ZMXKyOlh}tlz<&#!-Nml+bc(kGr2QTfRC zm87B0GwK-c{I5TZ(Tsr~x#1e$`riiZ+rRzI|F(PUzjNTRTwdgPsUe|Wx={~x!BaIn zjFSSu5CB1Q-?@SZ4$gT|;saUBWthlwqINNE^9g%hJ5TXm;92%4P#S-;=lTZw?6>z( zi`?9~z9_Iq>9vImzU*jNb?Kz_%T+bU8hVo0few*=trM#7^EWz78T?xZL+c{apZ`pW z^#@xfGy5F`SsXZ6q?||Z4kX#zEZ@)pmg7mWl3xkQmPL{mkZuIe4(k0=3k#Jr(LzIW4bvoxJLc~4Viw{mv2MnHIouD;Rs4yY}S1%f`*8(@&4GK3i* z^xjnYx93BHG!t0@WEW}(^Ylu6;`MZqfFgEOH*na{7fpKT2uJP6oaB(r(B&mgDq)>!)Sc}Uuy8wN&$gg5~E{(x-_27~5XJxY$C zrnT3nVHa2SO-HA(>q`LnIe@=i0I65&z{PgEHfE*8Hc=hfS@p&K>*UDn3f)%u!F8(wL!_MHj4wo6f^bw`x3xcHiC61d2Ig9c6vK z($Sjg@hK--42U$gK@odGdb}2r^fi^=M6%q730zO8p&p4^K$vKD?qnL~gYXuwZ-QJ;|gV$joXYVQqX@dxCyP z;`$PLwan&Dp@ZXkRgv~6fl6-!Dh&OJq+0dNlh#EKF(D>H7^;fKcy(K{=gwY-a@c8+NXMw{Y}Hw zLal4B(ZZHd;&gZWdho`LDJ&h+96MOE)^%VE2iV%UW~e3*p)uOnhH2`g)|&5Zv7CM9 z1v2}ks*lt1rGWe_kc5BCa}-|I23Mu6)e9H3Cy?;XKt2&Ej$AiCI<#!V(cOs21;xpS zdG=IH^FoY87C#p}7KQ9|Vo~xWl>vid3lkn))qs2b^?L0C-|r#g_aTae2(6JL zOz?ynvh#sO@UFOlDyxsTzhNFDP~A2z3BMLkwZzt03+?|?i{w?4>tvf;=MdnTD7Bo} zeB#hWxJbV$x3-FY9}HEH!EeHhZ*D?uzx`EWmR_7kvJVB*WZ5sPGKWagezJ`IyyQ@w zJnQZBU`-H1T&UNd?&cNhjmE$5Yd%Ib99~y+p1w0wss>DLG=_I8_3s@E;Q)nH)zg_6 zp3DO_h_av>p}kchAS?Uh?X-Ai=WcJOn0+1Mk=OasOqQxR==?5Pl44{Jp z;S()xhg!sSnUty6Zyy4`(~GeME|g|p%Md}p?7J2VFpTa0E&E#r>2Yh&b`mri$ca#I zra86eyWBQ3TzKOad^Qg^+&HXOu_k~sN^>N=2RuL>i^|=$2X9-rfbxEZP12vTEASliH=}xRcdCTjgDQ^ z8%FP`=ybFynwiI`sOo;%^W$B3tq!_Z$3VMJs@N)n`$j_YXewob{(iD z1nyfEN9;Is(Io@i2A0?bb?p;X;t~o|!EdUjgkO8u87D-)`GM<256J`oR$Me^xa+DJ zjZFVAk)y@3Ty?tZ6mP2JDz&TMvGCsB)^>gI&9OgW6YesatgALm`(9WLShWrg?Pzk+ zMo6x2qf$ZOx8sDtgc#ue{AHnsT86wM-=qE8TPVb8MraIM{;qVNoA!NrI8)Foz)*9UEIZm!w${Ko_)Y^6>TO9_P0)h&htNV~ zT%f9uQ%APY_L5}^f!(;Ex&%dnh~A%jE@2p|q1(lV46(Gc&L(VPv{`cV0eMnwlv)!z zc?eAlhJCXBleMH+=YnXG(`LeGF=MQaw3aH~q!XKrd|AhjlejlcvP8~%K*-=7V=@!3 zJs97>@n%P7`hK5^CnlLLf7m!}T@>+vz4nvrS4_wU3-6nUn`T2It4m1*`Zs4zFaUPk z(V?!9Zr1XqJ;raGxfp6m=-K^&(ejfTT`+DRQQU9 zkS>GP!3dx1-_TI*Hldpe2W(hD(=ij8qj~+N!EGH#H{;$6bZS6p9*y2XYva0W5z)kf z5h#ppy+~G2-?$#*1`r!tS<6jPsJ4I#m=i%sIgKGOE2VW2WDW!+u14=SE>mQ&a%-bE zU?$V$tChCdM@prH0_aZs$qDeYG5&7K(+_v5INXjNEVm-WdG;9)UlA9|Ge4`-E zP9$XmB&agdhHX}#yRXUy#MvL!gZ8JwK09@7X@iXE^p2!#H22nKZ-eSaYM*3M6y@P~ zybk30Id5h}Yxu8o(O_f{Yrg&vNqPIO$&cEO(UB7X%9*$k5+h(6u)c$L!LuDbRVlAm zVYYgWfd#r=UsL7)*y*pd&*ib}a&bKXvQ(k96eOwpy>1TBV_R?BE!TEbA7-6(KpAX} zF)9+cQ}3fyMz?RjPmg+(UvxnSoKXmhF#M8@((AcJ}4f>`6#}KEa`sz57N?WKz-;PeT1FRA2(sl{sf$ zTeNg-S8y=pLSl6>c;1hywJzNtUU+(>pl~f5T)kn0kwXZvexF@JxpGQUV>d~f0`&qv zrif|4k$(DV&Ltzg3rB~gWl5RvRMjO#@|;LURaeVgMFBOUdt^v`$532ocz!IwQ_Av; zO0iZ@`SyFy0;nAK2$QJPCKu_T&*T7D&&M|>f6+O1&Kt(GOOz07V=t{)u zRRPQ#DFoC;rk4s7mNW22gbsGlz0M7P$l4V3zO||9ETdi)vWC*2 zWm()c0aq_CPMVg7Itn{;{Voi?6N`TrCb!i>tm#wa3AD>z4~y@%$QbL6Y+{&qjYbyK z=6Lob+>(S%A$h~B8x+Y+$yRF;!xUR3G-)FrZm|wk5TiJRnfVoorK9=+& z!T^Q#^&N+ck5LCP)EtTg*!~pB3E3skhQK8~G!$UBBR)t?NRom3`uQkbF&d>SX&EEUI!fWY^i531~=mbmB`&?03= zv8gLoHr55-)iXW;D|jOD?HPe0pgK3&kh@j~eJC&H;g_l{|MTVV6f^12*j(!I?QzDTlUk^ClNE6&~MYz|rGg|NrdII~+bVZ$fwI1~aS zmXj|P-~X{jKL1VEoJGTnfqdL_w$ffzq@n(}+f4OWo~0^NuZoD+%unH9wyT?@Z6?)8 zO>Rp#TD5LHT`JTCKAH{sSc&vF7cVU6)5M0n0DQ;Z;Cf14Kx#FI2C0y?=+gK z5XmsVvJk1cqu@&j{ICW1YchM|sBsQIz+PbXs-*k-rFdV~itL#ar+S>X>vu+Z+Kk)G zdgU~(h#Te_6Wg3oYiQLn(VDASdF^os9VST6OsS?F_nj#}U>n@zt~gz(puR&M&2>I3 zlr8H%Y~Q(#0j#V$2iHT!dN@kGmj3nYLGQtv@Bh~CV^tY>g;IMuBV66t^>z`^R&4L+%3s#ESA z3uGAkFxD-F6pe^y@b^UE@)elxnig;!r>)_>LB#*By=!Z3+s4B0{1sT*Gj+ToDN&YX z%acv))=53>I+@s+c4w7IKoXSE@HPM`%XaDaq+Wn$3gwA`!%mAkM+Crli$Hio2^WF8?8&s% zi=mTuileR0YxIV*)SKuz3Z(L#2Gd|q?%z+%>DSaRNd4z6iR_@b%%4qzpk;)=7X7SL zJ#0EN;=^%ltCFe?M*kYE-COR=YHOqiWE(h5y5>###OTq|_5WZkRlh-fi{jW)gRkoE z6{TvAkTt^5ascr$WB5+VjYg$7eAGjOP{sc3{Oqm0K_g#tqk)RzSwf=1Z5+L6MA_J4>7kVqC{H+SDcfyt ze<%7RdU~C%>r~BVU{mH(B2V}NSM;73%QV_jRHB1X3v;YxQ=_Waj?t^8l4XoDvYfPb zOe-blc6TJO;9@epCi(E(XB|_`O>?*}qyJ>i04(~n`=CpFRE}1=u%}M7E!t>+j3y1}gbVe=&xNx#18YKZ^ zci1u2>ztmLKuDNNeY5fWuseNT;duMBu|~TOR#s+x_1F&9i?L2H7na7Iz#GhO9zUI| zVT)6(Cj5Xd8%}e^31#AX|LW4msjnczz9d9y1YF`s;?9?9m9~Vdtyx=a_j@<){~9EO zHthLU{NMeszrz0-4u{+Q-*0lwCAh|R1Lb8Y_bqo&Kr0Z;2Tn;7n8k#n!^t=#$3u)$ zG7JX?VT_LlAxYEd0OK?o9rlmYWRwi>;4too@h~36gCyz?qv6qEdYr~bapJ&)1ck%H zqhYue%I{15zpm{6CHY_B{}21&cq{+kul%R|aTpGd(=i!ELp)59!7#>0$@pM+6pcps z_~>{%I2er*5|0P{F$tp~j$$%S!XX}oqmhySVgGO|{@;cCs}CLkcqz@wTQ2>j`*(Tv zH_LxG?hm^1e{e9~%KtaHBr@a-zO{B)?>J>KaS#G_s)<|$;~Af*1(b(=*#E(C{wO06 zq|(Tz6_BzD(jXIE?ey@8BwAG{;-=spAbfWp9$*E@=)x~KdQ>$0he9{Y?)^2b|_sA&S)f2a{H$Y{mVc3ni8HlCoVSd=6NuUyB2ms^k