From f5d29536f8376b24892ad8a889b14271cb610dce Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?ACT=E4=B8=B6=E6=B5=81=E6=98=9F=E9=9B=A8?=
<1340145680@qq.com>
Date: Tue, 10 Feb 2026 16:39:39 +0800
Subject: [PATCH] no message
---
.dockerignore | 16 +++++
README.md | 13 ++--
docker/Dockerfile | 120 ++++++++++++++++++++++++++++++++
docker/Dockerfile.local | 94 +++++++++++++++++++++++++
docker/docker-compose.local.yml | 24 +++++++
docker/docker-compose.yml | 26 +++++++
docs/chat6QR.jpg | Bin 314001 -> 0 bytes
docs/chat8QR.jpg | Bin 0 -> 173317 bytes
electron-builder.yml | 1 +
env/.env.dev | 4 ++
env/.env.prod | 4 ++
package.json | 7 +-
scripts/build.ts | 19 +++++
src/env.ts | 52 +++++++-------
src/err.ts | 24 ++++++-
src/lib/fixDB.ts | 3 +
src/utils/db.ts | 9 +--
yarn.lock | 13 ++++
18 files changed, 390 insertions(+), 39 deletions(-)
create mode 100644 .dockerignore
create mode 100644 docker/Dockerfile
create mode 100644 docker/Dockerfile.local
create mode 100644 docker/docker-compose.local.yml
create mode 100644 docker/docker-compose.yml
delete mode 100644 docs/chat6QR.jpg
create mode 100644 docs/chat8QR.jpg
create mode 100644 env/.env.dev
create mode 100644 env/.env.prod
diff --git a/.dockerignore b/.dockerignore
new file mode 100644
index 0000000..983b9c0
--- /dev/null
+++ b/.dockerignore
@@ -0,0 +1,16 @@
+node_modules
+build
+dist
+logs
+uploads
+.git
+.gitignore
+*.md
+LICENSE
+NOTICES.txt
+electron-builder.yml
+backup
+env
+docs
+*.log
+.env*
diff --git a/README.md b/README.md
index 802a9ab..1543293 100644
--- a/README.md
+++ b/README.md
@@ -375,11 +375,16 @@ pm2 monit # 监控面板
~~交流群 4~~
+
~~交流群 5~~
-交流群 6:
+~~交流群 6~~
-
+~~交流群 7~~
+
+交流群 8:
+
+
使用微信扫码添加,二维码过期可提交 Issues 提醒更新
--- @@ -400,11 +405,11 @@ Toonflow 基于 AGPL-3.0 协议开源发布,许可证详情:https://www.gnu. --- -# ⭐️ 星标历史 + # 🙏 致谢 diff --git a/docker/Dockerfile b/docker/Dockerfile new file mode 100644 index 0000000..bd7c07c --- /dev/null +++ b/docker/Dockerfile @@ -0,0 +1,120 @@ +# 构建阶段 +FROM node:24-alpine AS builder + +WORKDIR /app + +# 定义构建参数 +ARG GIT=github +ARG TAG="" +ARG BRANCH="" + +# 安装 git +RUN apk add --no-cache git + +RUN npm config set registry https://registry.npmmirror.com/ && \ + yarn config set registry https://registry.npmmirror.com/ + +# 根据参数选择仓库源,支持 TAG / BRANCH 切换 +# 优先级: TAG > BRANCH > 最新 tag > 默认分支 +RUN if [ "$GIT" = "gitee" ]; then \ + REPO_URL="https://gitee.com/HBAI-Ltd/Toonflow-app.git"; \ + else \ + REPO_URL="https://github.com/HBAI-Ltd/Toonflow-app.git"; \ + fi && \ + echo "Cloning from: $REPO_URL" && \ + git clone "$REPO_URL" . && \ + if [ -n "$TAG" ]; then \ + echo "Checking out specified tag: $TAG" && \ + git checkout "$TAG"; \ + elif [ -n "$BRANCH" ]; then \ + echo "Checking out specified branch: $BRANCH" && \ + git checkout "$BRANCH"; \ + else \ + LATEST_TAG=$(git describe --tags --abbrev=0 2>/dev/null || git tag --sort=-v:refname | head -n 1) && \ + if [ -n "$LATEST_TAG" ]; then \ + echo "Checking out latest tag: $LATEST_TAG" && \ + git checkout "$LATEST_TAG"; \ + else \ + echo "No tags found, using default branch"; \ + fi; \ + fi && \ + echo "Current version:" && git describe --tags --always + +RUN yarn install --frozen-lockfile + +RUN yarn build + +# 生产阶段 +FROM node:24-alpine + +WORKDIR /app + +# 安装 nginx 和 supervisor +RUN apk add --no-cache nginx supervisor && \ + mkdir -p /var/lib/nginx/logs /var/log/nginx && \ + npm config set registry https://registry.npmmirror.com/ && \ + yarn config set registry https://registry.npmmirror.com/ && \ + npm install -g pm2 + +# 复制后端文件 +COPY --from=builder /app/build ./build +COPY --from=builder /app/package.json ./ +COPY --from=builder /app/yarn.lock ./ + +# 复制静态页面到 nginx 目录 +COPY --from=builder /app/scripts/web /usr/share/nginx/html + +# 只安装生产依赖 +RUN yarn install --frozen-lockfile --production + +# 配置 nginx +RUN cat > /etc/nginx/http.d/default.conf << 'EOF' +server { + listen 80; + location / { + root /usr/share/nginx/html; + index index.html; + try_files $uri $uri/ /index.html; + } +} +EOF + +# 配置 nginx 主配置,日志输出到 stderr/stdout +RUN sed -i 's|error_log /var/log/nginx/error.log warn;|error_log /dev/stderr warn;|g' /etc/nginx/nginx.conf || true && \ + sed -i 's|access_log /var/log/nginx/access.log main;|access_log /dev/stdout main;|g' /etc/nginx/nginx.conf || true + +# 配置 supervisor +RUN cat > /etc/supervisord.conf << 'EOF' +[supervisord] +nodaemon=true +logfile=/var/log/supervisord.log +pidfile=/var/run/supervisord.pid + +[program:nginx] +command=nginx -g "daemon off;" +autostart=true +autorestart=true +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0 + +[program:app] +command=pm2-runtime start build/app.js --name app +directory=/app +autostart=true +autorestart=true +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0 +environment=NODE_ENV=prod +EOF + +ENV NODE_ENV=prod + +EXPOSE 80 +EXPOSE 60000 + +# 启动时创建必要目录(防止 volume 挂载覆盖) +CMD sh -c "mkdir -p /var/log/nginx /var/lib/nginx/logs && exec supervisord -c /etc/supervisord.conf" diff --git a/docker/Dockerfile.local b/docker/Dockerfile.local new file mode 100644 index 0000000..3745495 --- /dev/null +++ b/docker/Dockerfile.local @@ -0,0 +1,94 @@ +# 本地构建阶段 - 使用本地源码,不从 git 克隆 +FROM node:24-alpine AS builder + +WORKDIR /app + +RUN npm config set registry https://registry.npmmirror.com/ && \ + yarn config set registry https://registry.npmmirror.com/ + +# 复制依赖文件 +COPY package.json yarn.lock ./ + +RUN yarn install --frozen-lockfile + +# 复制源码 +COPY tsconfig.json ./ +COPY src/ ./src/ +COPY scripts/ ./scripts/ + +RUN yarn build + +# 生产阶段 +FROM node:24-alpine + +WORKDIR /app + +# 安装 nginx 和 supervisor +RUN apk add --no-cache nginx supervisor && \ + mkdir -p /var/lib/nginx/logs /var/log/nginx && \ + npm config set registry https://registry.npmmirror.com/ && \ + yarn config set registry https://registry.npmmirror.com/ && \ + npm install -g pm2 + +# 复制后端文件 +COPY --from=builder /app/build ./build +COPY --from=builder /app/package.json ./ +COPY --from=builder /app/yarn.lock ./ + +# 复制静态页面到 nginx 目录 +COPY --from=builder /app/scripts/web /usr/share/nginx/html + +# 只安装生产依赖 +RUN yarn install --frozen-lockfile --production + +# 配置 nginx +RUN cat > /etc/nginx/http.d/default.conf << 'EOF' +server { + listen 80; + location / { + root /usr/share/nginx/html; + index index.html; + try_files $uri $uri/ /index.html; + } +} +EOF + +# 配置 nginx 主配置,日志输出到 stderr/stdout +RUN sed -i 's|error_log /var/log/nginx/error.log warn;|error_log /dev/stderr warn;|g' /etc/nginx/nginx.conf || true && \ + sed -i 's|access_log /var/log/nginx/access.log main;|access_log /dev/stdout main;|g' /etc/nginx/nginx.conf || true + +# 配置 supervisor +RUN cat > /etc/supervisord.conf << 'EOF' +[supervisord] +nodaemon=true +logfile=/var/log/supervisord.log +pidfile=/var/run/supervisord.pid + +[program:nginx] +command=nginx -g "daemon off;" +autostart=true +autorestart=true +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0 + +[program:app] +command=pm2-runtime start build/app.js --name app +directory=/app +autostart=true +autorestart=true +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0 +environment=NODE_ENV=prod +EOF + +ENV NODE_ENV=prod + +EXPOSE 80 +EXPOSE 60000 + +# 启动时创建必要目录(防止 volume 挂载覆盖) +CMD sh -c "mkdir -p /var/log/nginx /var/lib/nginx/logs && exec supervisord -c /etc/supervisord.conf" diff --git a/docker/docker-compose.local.yml b/docker/docker-compose.local.yml new file mode 100644 index 0000000..cf54b76 --- /dev/null +++ b/docker/docker-compose.local.yml @@ -0,0 +1,24 @@ +# 本地打包测试用,使用本地源码构建 +# 用法: docker-compose -f docker/docker-compose.local.yml up -d --build + +services: + toonflow: + build: + context: .. + dockerfile: docker/Dockerfile.local + image: toonflow:local + container_name: toonflow-local + restart: unless-stopped + ports: + - "8080:80" + - "60000:60000" + environment: + - NODE_ENV=prod + volumes: + - ../logs:/var/log + healthcheck: + test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost:80/"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 40s diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml new file mode 100644 index 0000000..d70050c --- /dev/null +++ b/docker/docker-compose.yml @@ -0,0 +1,26 @@ +services: + toonflow: + build: + context: .. + dockerfile: docker/Dockerfile + args: + GIT: ${GIT:-github} + TAG: ${TAG:-} + BRANCH: ${BRANCH:-} + image: toonflow:${TAG:-latest} + container_name: toonflow + restart: unless-stopped + ports: + - "80" + - "60000:60000" + environment: + - NODE_ENV=prod + volumes: + # 可选: 持久化日志 + - ../logs:/var/log + healthcheck: + test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost:80/"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 40s diff --git a/docs/chat6QR.jpg b/docs/chat6QR.jpg deleted file mode 100644 index be531c3d4d14171071e1fe307d0662bcabd9327b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 314001 zcmcG#dpMM97&kg4Nzyn)h)I-A=-^NeGnFKX>9C@lW|fK|O%^gT<}Gqgv&xDUD^m_h zViH3bGdb5%$!TQ7oH{v7-nTN|%*<=Q>)ZSK_I2&Q_TJz1jqBwycs%#>+|Td6@89o! z7Tzz2Fgk}0cpbnjT7(zJe+5XWh+3!;uIq`~Ve$cc`71J2Qmqvmv?Bzwuzu|#Y zH{CKR|JGIIlICjAiHB@C63u9jY}0G&F 570l2kZFfk^kbsNg!1XeWZHi|mw zHoO9x|BPu{ZzpcrX_jPrq%+rKoxqAD* `Fib_-*55PYz8mIL)ZIHObpDu)Ey}tfg6J_wll0IN063(#mJKI za^s9m`Olou;6t5L%E0Pf@4TA*FJ4|bf8nc?_s1PKI8| FB+_|JGfWB8)gir;wEq=k4ZD59xO#4ZpmE_W1@m$CK~ zmLgA4cd>2oRt(~f#3ipSiFZLCNHvZMsN(`>*8M$Kb#@~~%BYvGewM9Hi}m3@bRL=J z>!HoHrPQz~vO0)Q03%XtY0+M8lu8f4bDoX3t#1DWZ?h*6M`mVxg`Qmu!w)jyRr8kZ z*!$bxcasF12xuUagV=%A@(-~$1}3{L0HG2$W*v+<;-hy|3f){=_PmYfyeP7^@>g_r zP|v}m&SrbzeR{UZ)5z)wNt4<#LDw}wfcfu>QF|$vNuq* L+ >F~a&+1)qrEUiM+IEV9gVyaq#G=AZSt?mH-zc)Yq@zBx{Iw>TE3O+O8S z@?d~u(?mUugEPU#Hp@XjGbmsvwTCDj#uMX3&3c}=`U~_i(r~Jryurh*C+tpqnj zYV-I1oMgh N>K%=10RVIs2DYa#&O3ykw+vMjk;S>2? zQ^toC2fIugZ +h}py8cn#rAgyt%Sd{7Ow*c{H}?;ApTF>j8sWzEZ1(%) zm8}qC75{u7B~lj($F`*7EeVt=A9sl?b2$eY-2bZ(ebHQF^Q&}0b}lo_DZlknp?z(a zdr2&|=Z5l00&Dvzs{)#fGiM|dU+Vq`>;*+Z&p};g-@r_i4GG;v(taQ%pX|aMxK*hr ztw!#X9yJqGslzRlt`>Jpid(rh>w3LxwA!5qPfHJcu8(p*>$5-}RStl^dahF0m3iGa zoA$A p{o_Z @K!0>TTRk -9-xHe#KX!hmB7AH96ND zj=t_#=YP3%pLxoa%LQ*@#gA7MJPWFwM{9}+_nTb7EOYI|j!7y4PfMYQ@;zC7qw<;X z@_pI;W6oboa%k^obc7kaoKdRIuF&+X{*Q;g_kmEE;_JJ;yx{QH_YIo~3snd(g@f$o zN5f0lYj7dIX!3Ts-ym-pYJU{vUdZMUJ~G2j=eL=PR*Fy;2`Svnc%N ZtlvV35(KeiP>j_2du977Q$D0SgI(9jTi8gVZaWh+&`c=$)rf~UMUWs9`y X~c2L4y*6pPWMX_jplE^Vv`?`4N(Da;M;V>c`i7OEGd38CN zTTqXIkjC`rPgzu#_&*j0MkFSSGu&ra!0Tx(9@xrBe5r@wcoH%S^`y#@5jJ1yKcH6N z{VUUw+UDHgB=xVE*zR&)s}ji>4w#m4(wUss@4kCm$hsW8oWQ~0`-QL0z36~$H z{UF%v3)($=9ZH5DHvzvEYB&MnuZ6+`H%PTv_-b@1zLHU5lI|mRRM@ai{gH5c{(EgN z@s>h8IOI>~eH$WQ)Y>Vd+xIPf#_#cQgFb*7<_xACJt(U|DA;xpC?$#=JjAr|ZzWDN z 7(^keBnK73d|YRnVEqaL%?VMiDt?G zm=zpgN;DX28wGqJ!w5rZUW}ya^mLLZs#+JX<0Ii(xR%lt!;DL~;hv?Brad<#2*31! zntys-nJHPL *-<^HbIf84S&7G4bLUzK#P(3=V!@0gDA#=oEJGIOb*p6IyjQPE+hfA~6& zH_5x4=9PDOl5FyOi4K*zvdrGPw(afKw(VBY?`!WZdpd7)p1iFs+0Kge Ne8-2dZU2#GV5NzJ_H zvT1AilD&Uji>duV_zj2SsW+ol{-;dw|E#6-|3Bw{&X)cE>^T1*fQ+V;E_VhI?FqQ5 z1YQF%XkpGe6HBGd4OC76?KMU7t^QC@3-dB@1#lT0vBKxzW`>zkXHR9vR4+vpb$1F? zJKSF5wn_SnYoGVsxc*J;R$I8Bi`))WyN8MRx;gB{2X6gK`3gclvljj!40}Hzet-H+ zq{xW*_u)z%Sh9kHZW1VU$h{AK5SCM4Gw{%7(0}?7u(NiN=dSXcyPn_b{~zz4`X7J& zf8$eE=2q;{6#gLWfg(AG$Iy82je(>i %YG0~Bn<4+6d 8y5nvh)Kl&8F82OD{pPZ zR%Zi1i!d#^Eu_@yagWqgJNKgTuh|wYW)AkYq5TrY;dnRniiEE-EO*N*F4^MmlQyPP ztQ(!;q4l|+L-+H^6xm;%hxBR5n-D6{6#@XkX=Msqn@Ju7gvTCYZE15&OnAUCLAf56 z4iY+>Wi0CsGp<_RS07`uN0^aRM`C*$bM;8~uI?<-pMR{wRL>q#_q5o>h%nt!L?Vs~ z-7>F#kDmb4_XVGoMerZ-$aQ5d{uAK&7-z y>zI-V;#LO6$P^w5jc{^tWKiga4d@-wkm2{}Kc^R5RDeB;ExHCh!;kf^WMX^S& z$YpDB{I3p%Z#hLX IJ4BGhSho^123HbK`>*|jIxwjP>pW@YNNUh zCkxxky$1B*I=AJo1cj#^(u9+tI<5vATBek=8etwct!E^8LyO7uT4MAtubTt}Yj#hf zMqzb~d7zp_y~TIusk@^48r(>2n4>tdi6LRUo>cXY7it%IY02Vm_=#gyVMkh6$5Qng zcc#3GZg*)d91}0gFOPeZmxlQ(+}KsLBEh(xgs}vj!{Lp1*!oWFN{YP%TI}Etx}59S zB*9d#&)%WmD`SoTj{EeaCi94o`|qX2PC!-@bh92v?V$}PBxk1!y(-tX )h7D>mkBOs;it^hs!~BXW|W&=(XmqKt?rf3*H{1eTBzXI zovwl0^Yg#x{wsExlW;8wXl{js#-^Qe8%@Z|4y0##C0tCRTgy_iMs?cLiynrAJS_a{ zW4~MfnMSP&F1P$R<%(5==CShVXS=tw(u%H;K(`&H?RY%Dpu?DduFuUfP+=eVW<4Km zS6GZtTWkE5P*%EmCGhHvj44OTPQ*G%8jcngRTMn32DDur^|ve8KJ0eUi?9izVl{Sx zk8T0=I1>R|lV#UFRk8kz50Uz+wJ1>E_JH8hIexoe43U{yEl(~JlQl< u z0tCC^*nvFn67`;u0P~QiUQROs$=qk7RNsB{vze!yKf1YoY+R#_yfu2ZV%aZ7vKGK0 z7a^yg&ZBjgqQS|0ef~wwwYT=DoJYIv?mDmka_z0f3;8CnC#9!m5FSsLy3}$Oz@Bi} zuE}cA9Rp2skJCtH=_Qj#E~Do8ZX@#O_}t-=Qcf7QFLhMAz}7mnL_FbgqK$mCq=%RO z+nW{hYdz rqRwPBmGTZexSS4l1uT)Ua0~$u}<-jP5GtW*yGo zXE1v{^h5PK6=T2bQDIV3a%`$si>r5O#dLI{m!JP4)g%Uu*7Ac8vWtI-FVQEXTLsG1 zAwxKc+>`l(z)@o#Vx2-AfW8K`ma`fIMbm*khIpoyA67as8H%}!i7R@S`Zyl!9N+Nm zbHsawF?ZshVfV6jKUZ_fce^gr-be>WyNZf-hVkVL!uNNZc~0nh#6mJOv0iFl1&kwG z1y!vjY1nK=zdJe@RpTp=zCvG`TT}j*((>}sS8=_+x0)Jn`d}30SZlLUz$g?gM;QkS zDg|arM~AkpWbz+`ZwW@S22fc9<_m!Ot^WX>5b>lk0iKl#1{ ~vgb{j;fpT3*?4Hf z{D=R0O z5H*-NCtFxX;y%j>|7*^EMO|gw5h=~Pq)XQ!@{BjNE3SaR5*%Q+FvD=QFW@^Gm>zos zR<_w}Acg#@9fQ)mo%@vhu*$7?Gj1%%+gg~jh4(e36#z>BkP}2;4mph~Wepi9ToZ7R z%cEOxmnWr;ln6tbDsuUE1x_XA78csn;_pH?XNnoOFTG=%%SYkI-Z!lj#+3!n?pIl@ zOszBB_Vn$VJ8wpF(+G?H%M#;zLj!+ WGb4 z@OZ;;HNVvb(AI+Y!vjgrM}(JjhZ-2YMn^lv?Uw|n%Gy|T#MZ8z;de58sba$N_eyj= zuWuyaM$_xq@xsO^I`w6Kv3iwFcGmm*ZVoWMP8$pxofMDjFeZw(_u|^**JtnE9mE}Y z@)p(E_p=d7vF#&HzZQO1Bwgf>X`J~E*it33KF}>0i>zXEkfy6}?K% `i-?eBTGugy7_dF+efObDE6f$h}?ZWlmzPkR+WTSEK>Rr^6`>9PGk_ q15Y>={EAz0OgR7@z2azvj64455m6R7+ z$UPaaT~aE#Jp~85&Fi$ khciUad;UwI#y+47EIaS`LuOf zFDD6dZFlHvxb4SNFAkBMDx|$V{C`8B{(m!%cL+wqa1T*z9wnWW SKhY0baF_zhk?5as09NLPoe~CCh9;c|=}q^yYKneOX(>>10WlWma18^}#5QD9P5$ zp=-nJuvu!a2>G2cYe&R1zT?gQvg4rhRXU&x@`SUls(V|@$tlCQF7oy9g{NR2%3VVv zpL)uD%C9A`AEu35%RlWU_lwH?CDuiFTDVWEqWrgKX;%(rJt3&jkGau61$O8*n}DrB zv!x9UGsk-XEnBrlw2F0D>hn>%L{LyAo>cL)07fn?wB4bQ-(hk=+nH6ppjF(9-+0$8 a-0E%8QY%^c06R25UQ5 zJ3VrPVCqS%4z3c==3A*r=i`fCWw1Ou$Bo-1s^bdjgDMO55 GG#M0rSwLF z;0$^|Nl2v;YI(RLzD7vto>DU(AO3Sx!^_zxw)66|@gY}l9q4DEal#)c 1{
q7LjVhu|dtwHKZ^G0O+<@iSIdM9h1m=S4Uf>`Iy zIQ46FSW(k~%+M3`Sl-7)R}bapnySH6#Na_T$V+4ihIbf~ i8(=>WyaG@^jZ?pY9|s~4rPNf95u$LaCU0MkF$~)4BFh-zjjjw zD>Q0^(b*To%Jo#K$>Zy1pLqALEpId3vph4Gc7_03bR28DclXw|gMrbYiuiGLsYM68 zk@u+=UoHXDO95Jh<6liDl~kK;yp_twK*NiV?oymU=OHmik<4)_h^hD?d6-&?gP0#d zS~CrYfzF^;gRTVOvtfL#^lJ JUt;S^H!F;=VIt9-Kozw#tut(5Sa*ug{Sg z1XNOr=Du)`RMiP3rNUK5Y?hDE2<3Vy&fXw{tL7}mHkP!Qu+>L# fulk;#Y!c{vf cDxfRIGjz0i2-Gz7)W-EwUd@Q zr`;BO9Ugejwn8#PF*;bN-IFI=RqIL(;w9EP3V2XwTq@STG~(R(w{BFhccr$JR@bLf zXQ0ogyM#yeM@o!Ihr6bFW`y3(e(4{Nzvk%S?V^0ci4@>nMQF@`9z_U=84 Jum1VTVeqHeL`9OxCQWp_~Sy={(IX$-ZI;9JPQ$6F^ z#!`!FzJaZTqUGuZ;@FVp2-e {ntd>!h*TmSAos${HvV7ucpVjx#Bqn7<_s` zi5~ 0GItd2EPBf7N}_R;Oi zR(5;GY5RB0Xt%N!D~{kbq$1w9kCeI_HB=nJmP;8moQO)}{I(*}BIcC~tyUL^cYTU- z(w?^qs`}R=3%L^BGUkhk=`9+EUp)uSfZ3vM?{U+ly+Xlp=)x1?gPgA*I@ (kXivz2QB-%0n$2@ufz&UIEv5UW!$sDz9g! zdPdD#Mn!A*7jLMZjP95B8)dn7Ts8I`v`OL)&%9mpEIz;~Kl9XR!j0;;blAhkS2N$R z2GZkS{6Xk7!WSngcB4Nx3{q<*b?|0*jg<~8rrm*;7hU7Gn1!o+jfFk9sDEAMVkz%- z5oINlTpRV2Zr(L=#rFw4;e}_ybX0v*PI?B{{rcHOstSXh)jOx0pcLMK22Nc37wDVf zj9)zhe+os12-75~TLXT>I%g;mLM`{ {%iNSeCMPuLN}ww`jE{YytVQEDg_gy&iv6BD((e(D4jTMx=TJC%36qTYTl zLD#s&p1=(6II7So+uis>Qg(O0*9=wrMG#!9N7$p9p$7lcjOq7*ji$00UGqfcJ9Kt3 z>_~I8>md4FVM|!tV0m))M3Ajj*ChzKHiT&w>C(_*D8F#@yh*Z04JmSX{oZE_4zEQO zOU92cR(bf(SIeX_wkEq5=qXJ$fEBhGYN&9LMJS(6E4QDNrhg4dV^a3FS?$cEq@qxj z&GHtZY|sIT555|hs60OQdrL~kv;*BG&ZvTNtO7^`HhDNzRJ<(j@Q4kvu{GSlaZK2p z*A9Xsjy~op6@=K#$q;9h490{T?C2UVw-f_qm%r*AY)=dPlJ*|c;y!$sd#X{R)NbgZ zq^PhsnqKyHpzxMgDnT;L>jizB10Mm8O`)=0w*B7au`hUw=*8U&stRw>8rPe$`T!{{ z$!()Dg6}O_#BN8}^)^4Fs|UFjvZOMpLuT-}jk 5{Pb`7$8Osg7O_D z!sr9|H44l_@_G_d7Z0KLK<8h+l2|{AKB!7IRL)5df>Cu!;^jqfSu2zoYyz4h=_n^l z$_|lp$;O#cTtA1URM%a&gJC^HEWeWCaOIqw7g|)7w7xcZO$WaaFt%1~Y@hZFnzOQv zllXF9pk-Zw{Ry6P9kB$-XNZfKHj*G;1mZNnXLYRPBV5ScDu5G8(ozN0?4_R)a2WJS z3PChB@jxn&s7|Z~Xsexs5&@|fF(%ZG(_MToq m74JH)bIMVW9$Y} zF}VTmwjCV04SR}uM0G1r--b$U#etB|aoOk17)zMF)y|1k;II>&AdHdnn9DD=+9KIu zERL2N(JL%Zx0BblWBbHW9=oMZQ7L1>KU5Xlsk3LmCpKVk)kXd#za1hyc603cWtZ== z-@!kn-F-gv#elwUXVu9g77H&bjPRd7g1z|=pg3e@G>i!6bWes9v=6+A`O@z|z~_K8 zQKHi@8Es(9mp0UqBji}+I;lrE?_Emr6$T@7r1Wx<*9sR`z;iHYy>t~oMIL+F2ZQbB zx^%hZeQjKBVV_M`|5~E{f5CL*MA=2 ^Cv266umdZ4=x4(lvE6i~iu$ur5P5&9$dIFD1 v*EvazEaU-XJ-xGMOoXM43PqTN0C}@u#4FC1!_8t#+ zpDWk>wwyA4lHhTu_j@xC6#|@CI!!n>XpoQ0mj$9)gAj@3g48;H0 |l^2J5GXq&Ic6?gillUPVKW@r8hhbwTP|kCRbVIAdg2 zX82T3xdu?ov#rxtb?(5368os1zA8=Ar7^dSi(;06p53j;CZ69jo8V_XqX{ 01d9vMRhYd;X8iSZQX%vB5Qit3JU| z>~6XUxkkmb^r$V V1QHDB(nh=`ahNoD#S%?pwcRXQ9vWs=TcpxHs#7#2Bu_*9kDtcS1iQHM~rtrlByyfqy87ucC#?uJoeR*YF}MjkKP3#oEs2<(1jK=?A#X%(~L3 zjO6U|rIS(E$!B!H ;0#}N97BImJ_iPWf+Qr`qu&R4%h~n(B{r&OSZW9y0b0&Lfu&h8 z8D_Jd8CFZv7%%j3o1qj*$8{aTBH63^n3e~mD%^_V^fadLskRG(@!X-40^R0g_XmH^ zC*V^uG6=rwqasJ-94YU65C9Hd@&__fZvp{q^Vh&|YBxx_fsrRRk)%2#OtTk{V2t|! zV4^_+@&V`>m||PyzZa*Tle051IyL}FOdxbiiE^c=8@N)nn7U>hJ^|OBfe}ZBd?P=< z1lJ=)axgq=zLNAGo({e=Lo{U%yE8CzNC%o#0 MS`w9FH^YNd-o8C% u7cL4tSe%c7?x*I_ zAgJ{R;on#G{9kW_{|vhQX~@->hL{*m5nL?-NI(@zMO+RcoCcB}ka7fF5Z95g15%JE zky+~o$(ntx!^!%=ZmoViP0ZG2T|4WTB+0f$SGV8A{)w&lrg43GcB5a0y{~`j4+2AT z-mE)#k>{w|z@(6fFQzNJn7;LkKZ8V&kLnDHqH*mGNx_TqiZ*cAp;1i&r%r9TJ*nit zR;SF 99#k3u|9aB-O5O6@1?q&bP%hMfkBIaAV;53P{RaXnG%0&Tnx0 zuTI +F s>4+z#{5Ek}%%S{1u0!sTRF92lkz$RGdb5?!ZUdb;GS|Vm zo5E>OFj!w5M08VJl$dL14}{YpPoQ=Y*S45?Qu+()U`zQfv(ss%FB7(eMrEQV_LiEr zRPVeq3z~TBbD##7pI$ryNwgqzBRm6n5iu)Wf1rIdH4pcGY?Jxj^t_z&ULZdSq#b^N zk;6X-U)gOWlxaGNp9Lv;IDm8qfaCh8OoI@_ON7+`ApP0gC9QMsM;oC6{01!NDgcDM zQXGQC1MU3TFkT%6HBrU%dJ#R@I_1Mjm=5>st0Socu-pK>!eegVi{=l&;h;W>*{um6 zMPY|4)!WK_o{rsWu8}A7?HeSmU|Q7Zu=R`Ei>_?U<0&h?cy&1+;aLX3q*?IJW(pq2 zv_ZP}?gDhdU8Eq&Zjxs6IGXTls@R$hB!R)o`u3R8 0ULpn;*u z+5HyvkYWq}CurK!(@d!<_$~%L%n rr2nr+XtZ u~HT;fOOY+{&8H zqbDrTJyOI4wBw8v|J+ehEZ|1FPObsHK$wG=cq_pl(;Ry3ri(I=P*H6H_Xi=U5Wa0; zWAGBC=CTetZ2Qt>ZCgiWYf3Yt3KjftZ5!QEfpNK!NABo7Q8)A2WZjIec9L3gio_`A z32|t{H%dnvb;6^XgIdJnOFE^&;^tu75OtBA(`AHWjHkVHxfU-9-^4OOh<6S?WS;5% z=-p40!jV%k8lKzSdUO4YWdR@J-2*P=8E4+_H+y`5^;kg%tM@m^hl3hc@Nbj(-ke~I z{&}se>t;=$K6or09M&V{19^Y@L!XmxEP*vq@<{;@#IA+T-=d?Y`iJp$YFT^A%MRnM zLj}dJl2;IAOW9#cu%e#a!4L2U5YFtj$(}&`!`}dt&6L&we198=)IbC@@JzI<(truQ zCQ4$0VRfA K zB3VzQN7wzmG>;dUhZYsSTHlgurcZS&Eow164}k2?(J|z3*2ycpAhyo|ft2=z-fpwd z1K07WwweO@3Kvo6?}DqTfFwPg^WJ^cf&c=vwJRgmB;O}@M8`%y{&+A@?lN~Ab{yvU zY3DC5Q0v&{^}uV}sfQIYj?uI0=!>^@yKZcW;=W1rB9JDAbmUn-2z`-&aCCUC*Ja=v zan=xe?xBq4fPMSeW~Bg#@1ekCt9rgg_~PCXQ9=CpOy0=E0B4z=F T|C1s;-Nb249U2d$o;Gie8>RM;m&8FHIVR0AJ*e%?8XM z3||s8pfr4auDLqlAI>7H-;i$(E8*Kn#PlYL)~L`&5Mo6gG+sVgUm97L>ViI;G#g90 z*lw4P)c!1>JWo(5BVg;+8wV>V$7nRT%DMsbh#9vB`^- *-gae#R)oP>ME&%k55*|kMAObY-GWBMf)!PrJi zb`x+<%d^@+){`_%)OA37_e!I_+ouc5T+y=qMd*+?(Unv?vtd?_$9stT778ex=SvGq zTBly7xU7N_no%QBG?<7N&Vq?}M0-*;(Te#Zia}9WD$)V+*0^BAwZFH@nH-)jHGcs6 z Pq!Cq&=OGkC=JMy^WQzVrUIa5`hOhp30WZr|{ z+9`vfaeGwpgOE+C7AhD(yqrHU(Et=k(`Y> jMw)>UcEcS6Z;-GOP`h(o=iHoIm#=G9xFknt=KLYAf<*#f3XSo#!QdKkoEJv3{ zQd>-kOR@Q=J2GhhqQgelZ3JIikzbt9ELPzKPm?vg+zh4U2& kS}iw;n}>1_u)l)({+w$;P8pS1+Jl9AF-ptetFV9E 5|RqK0u-g+04kq^UD7GqDc=r}lXbdQG_y z)xECRXL;glTg;RiM?>_@NNQ+74OLzeTE2(jWoeh`&FOJY??`aUVfbcv|JLhPwPEf2 z&!xLsUE^z-!;*KR1%ok5S!Sr0*ul5Kz(!hJ-~sH<5`eo0u;dvfd1E@?7ER>lZso>) zj_v+>|MViz4my}H`sI*MO56#;AYuMZds_J*uJ&|p1pgV7(GkI_G3nsIsnL|s?a~Dv zx3)(|J=}5O4`?&&P3hS;I5SR@`kp}b6n2 q1jKo_X%dIn$6y z$4LUy$Q-3k?Jlj)P0=at%Xz7^{%-S>j8P{8W_kNp@$LCT-pbd&7XAr;-p 9Q;qEA55mKj(Aj2%DNhp~ z{aeW!L#~0oqh@?bT-}03#g3BryN@f0wC4|$ D2(p zEy9;20&yFW7W!S*-&M}YJk8qp0=dRvcw~;~`eZ!J>b9uiFGnw~_L(x)5c~0hFI(+# zm-N}l_qP=hmx`EtnpBpV-A`v538o3e>0;h@6EFf<02d-U3#33B%yOXlv+{AyMg9{A zb%p@~sMMp51N#`v1F4pBg&*bu*5L1~Js=EEm9?M^&u~$f?uQtKUDO3*mVF9sj|wkr z%2>Nq7h3K`TmJNU8NZcMljv${i2YpRY><+DYV;a!6BitLA}_+zpSclOdUMP_+rvfx zbMYYc@CN-S=u+Qmpr! shve)gCK<#UnR>Pgj?H`#IwNC8KNd40Uca~KrHh=4HMWdMggIe9Z zFmbQ-^5)YH2Hy_?;33I`S$=GJ)WZ0yf)XS8U-R(7B5Y3h$^iPj3oH*8ibA&tR=W5< zJg$%kF#W8pJaC3B|HbYdgr)j{Vhy+N!(8ddTQ}Z(*d9!4Xn5U>ZjPUjD(11fY1)-L zU6>`cx{L`Ui7~xi*Kk7R3G0uxuhT9xJ-WOrjLW7vM`~4B7d2UZt&gLD!{p=b4rz zEs=LwI@p|=GAdJU!{#gfjb?uZAE*g}VmEl85|aIegAeYCRHhgq7sv4Bh2W3bA6?Gu z(ZRN#yjxIZ`kR{&Gw5{w^1;siynW933hBh>M9Ss&8$&Knm~a#JAG0o(>O@qY2bb+( z0grR*B^`jFlsaNK4WR%wQzS%%pKh bW%CRwc^^HV;`b+aZq`BfnG*$C~V)HrctNR6=|tne-V z8y%>ie}46o>!xa-^(XIqQyNcvYG>TvM<+{TkfneG`wAX-A|m0NQ9UtS1LT}eqT+PA z&1NaJeuCam`eN8$PLAXiDQ)qUmi#;YKtnNWq}Z7j1=_*WJH_{#>vU_`8>Gwm3v<`q z!AFJiL$7U?J>_5X0|#3+;7b>$c$QX{K;w;R-YbTMu6T}FXoNI#ptykRR+s5)@4qo4 zHgyEI1WU%L)8x2@T4 w!u~+Vw3^Q8_Q}F1aDa4K+qA2p zV_|a5@pdz#r4h#DLgn82uRHQ`dAWH{ hZ)y60n4!@Mal_2I|ifrq5;lZu02(~1CU^kq{F8e)hqJ_cIxKy`_M>nn)(Ily;l z-~505f=OF^35W$27PH@oi0}n|Bm`Ju7l6{lMWh)luiME4DTv$3tp_1(CZn!@we&q( zudt{quh8|dgY99YymYnhro_DTxJ-J^(;E1?k9AXYM%>%85aQYvWK#t;1``l8s&@0w z9t|M%>c~7)fi1Vam7|Ou!!APu$ W+8~cM4!&B&0&E5!xN0vn-T**ZqVj0J4Nofg?>bs#!T%}#!3%duk&`~t z7;~x>pEp1VrCDJu>H*;_wIRrJzVgo4_c_je8F*)ap4 Yvsro4V9OICaB94E2D+YvrBh@?5S!jXEbzaZXphb0J^+dV;L_jO zI2cCR6}N>zEdMb8*#7!+`#-*SJ$myXM|*%^9-Bik#hKWepzYuSpaubnlwcpxgbxND zK`Ca6cv>h2`AZc`c_0Jx3CjY3*-J+^?k0VHNGl^DJ}{QyC<89wIcZ}44?^yU^dNun z*bF!v7k~(Vzhl1>$>uAcz~F3z&46t5H}yZG0lZ-wK8J|zRN%+dq%rtA#_JfRv#uHe zeq;tti6)H?0fy1rRQ7w4>@o)cMAI(ATBsoibv@vBzm~5CzSRQ(GkKI2*@->DmH>Z# z2UOR=XiQeq=3}b?(|&Tv97%*|ddkW|oH!W{5evzy(P#P#YhQTn0vj~K4?-V%$H|Rj zV$((_H#P{gg(s69#wPDC-bXV7AOb>->5ajctQW(Jn0m7N=);UrwkqPr_2rEK={Aqh z!pQ}w|53qEkaHCm4Lj0Wol%zU V_!p^L!iSVmKH3M z9me%R*19E)`ke+oB@ljRjxPoi|CI%7b*H+*p8AH9{}it35Fw5H1)os1XmP{M#424T zVu6|d#M&7n8AZ3+L)iND^Z=oy1t7}e?ZJT5^4gr{H ?V=#RXyloyu!E1Zu3{aHE;6i;?jlu-P zeG;GrD_(~biok4$^&eCTS;7^{lr%&g?XJ{6bX;GJy%w$ph?WU1@-f?bJGFkbG$Ndc z+NsJWd%vT7V7<2kNVO}8IN*<24TB@SHF8H&UmGJ2w~_{g*j~j((IeKWWF6*|4*JAu zyYe|}ZKYwXnG^C{`X};$`&gPvAP)WU;6ZSeAz$;Mq8aJ^cR}9b0y3UODC>q75?F1c zULd{rfX?k<`b!LJ0bkw5yls5)!H2@I+DeTsE3RXWJhivb_l%c?G<`bQPUbSqojmul zI7|}Ln*)j>3J-A73nX4ruFR;^?HvXbjiAfia |Xii$Q>{K~x}oPYK5-E$wWr*EFG zEPsGjrUKo(!?+1F@C|H8?M9h8SZ3lK=r`DyBsPa1<%z^J>_8fSnH4BQ@p_QG{fm)? zp5{7t H=4vPuPd<*Ix;(0rlwHH_Dyj8Oowf@uZN1qgOw*hZ8VE zx71N6>4pceHM7l_MaeiNnS*pg1xI#W1rGG>fCw*fo;4}u&5O||>NB@uAb`JJfNOhT z8EkKON&?PMCFm)P;UVL zAp<4zv9wHF?K7|koxs9&PAYT+NlYuaO2|PX&=Yphc-0r8+Q=ml5>KuQmLS#DJ(nqw z>_+lEKj|iM?v0pVqkcEXcDU1;EI`ji9WVx>`Rop8k<|sTN|#HC5ul@pR2^_KGXnA; zX=3J`P(H3XY~e=gn6h?pk`k+KxK#O8i7N~n (BWVX^%C0stbgcBk_WnLrC9BPH(V%NKEm2gYgK5^t+LX_2ESVaz zy8toIbbW~?Ax|B&hs0oC-(FvWI6Xvw_uO02K27(biDfZQHl}BWPWN*Cf6o{AIRv!m zdmQhW*sA+gZtrSzsOULxNoND_pP&KhHroj!#TvM0iByWthW4)VzQ_+XJwIiLDbp zMBp_-N*D}==1SLo)+*#oJe9n15jLBkcWV9j3n!_M!mA7GZI6bJX~KWQ#bFbj;KWIh zNYjUHjJI=EWJ-AvrrhPdHS9I*K3lm{l*K6Jz)g30BzYOr ^e+#CUv0?SN%>K~R_{M2daJONHF|IGj09`TOP>|B%zI%F zB(%dvFz6BQdm`{PU`>7AKw7{be}k`qM`x9(IWqTgP`Yf!l <&G_@aN)nc>rg z1||kuUH5~U(B9Hc0^7aBaT@w?|IX%l_toC{HdBDX5b!{LiJBwxz=Dib#z>XTF|hnS zv V*@?1OsE*F~k;*Nw@Ot@qJ@IjLlo=+<5)*_*&yE)7z(si);tF zvHiHst_I9;@O5gfNA2mB`V`=P6KP*S*ra-dg!V#_(D+SE4+?LcE@u}hRcC1+Kj)2y z{UESdz|Kf=&=T-vkA=AK3f?1H1vcHSAmR$R=8!{fZh~TzH-Fei-2SCO9D`ChJ?|1o zn9 lhJLeG&)k!E$2mmQ;QrT$wZX4x7hu9?pVO>SZCpGZL{sJ&2*m~sy9Jf z8HiFrVDpYregI%g=~CYx1V_g0hhJ#Yr94b42alNJD`M8k>Y#jxRUu(f{7W2k!_Y)n z_8Cuq&;q0e8X{M8c_1KKFr{~&eO1t5+IP6C;b`JMsX@%28(Xmp1LRf1CAvonJha~X z2RQLEJ`N{uY}<6_n;PjvG1xBWP7d1y&r)Yyfg5hv0lZraTc{6$u2mB;v{^Iw*3P QcuBNEhFZwx2fn|bkCuunx#CC46MnMyP-h9MiVJYn{ z9|;+2XO?@@&Vjw{DI%^5bSfulLB)GoRKqxKcuknC&!IGsw?DLhn(_E&*S87a>z&gS zsZ#tR|4ksi6y!)-jw;Le D?Xs8GmD_Y)8Tv;zw^AIudYI8_2Le zUs@w+Ri-xIO&n~I&O|(rd}r;Y$4Rr$pakwa^s&|9%Wofz(z7GV>yP^+Y}Y&e!1IqM z#Gn6-$6-$za&ZQGNbIe_YeA!}JQkyX^bIHH$Y}VYheS+EYwi>Utr&FEqJPlZ|AoCb zk7^?C)<&^WX+#K$fPxTbS^?84h%%Lmii#K&6$K$}+sY);HdB<45@`lSpcRD{S|Z9Q zLS$B^2w`YNWhMej22^IL2*i?9%5T%}``x?Fy64=rzO(MP?)~Hb(by`Os^74OXYc(y z%(X&EJM&J!DeNca;jQb1{1K^X<>5SWeJ9673x;Vv&tn#Q`{de2@^{d6|CmMQn-h6x z4cxj9tAJ7#QE&{RNN#iQl_%&TS9qarUolVfHns2*2!z C=fM3ijs&$`mzaF?;x@jU0l7Kn3*_Zs1P1fPPDaC8rcFf zK)G3c%m~7xKLuIfvuUIaq}BYc+wBdN>hle0JgN4xu9EEK(x9+M!|XN1x{tSW@tci@ zU p48qirhn^hirP?_^)uU*>N5 zB4K!*dFYQqm!@;(>gzu3F>-L*_ji*lML(+S&a(2jwR%gm_gRQ+tGFZ8>jY5s#vizJ zR_+DNdblT!C!sFznU4KfkU!G%so>(~2e~6IUEJ(f{@LEir8(IrPcpn+VyEi9Bnc8; z`3IT-ZO*gBH!rM=m-T*4J_E=Z1H|wA$UU%JT)C0E8t75`J94GFxnRp6hg*e;ofQe( zIS@r}&1_N065x?O=x5zdbkz7EI#es+^}goSZGxTnqdIqHg2V}0{dE`3y3P2cqB8v_ z?=9m4L;Uss{LQw7t^dl0W=%wmMSN3Qb4Pv%?XF^-ftbNx0*kl!4$@_7>35EOme<`Y z0~9Y|zapDA+E)!Vr{Skk1N8ca_X#80s6WBpTcaPAp^v$WRN81W6g(f)93}srA}y$( zm-uxLb<`Ll<{0@V__;ysC|YQv#6sZS|L1urS2lyKrGV+$%oC+iWv77}EQ-wbqdMaw zEwld3ZTa8%^*al@N#sR!AN=d5(HDDA5r-oS;T0y4+;}BHooS1L@|jyUqe$`jCh+SI zC{o8qGvHnNpTU?(ec*qYm2z9=0X_)-Xg)mh2ABfj$<6}K;6Xl&U(})krbRGRMl6UY z4`<0$Am6EH>VH$(cb5AySpoOr$_DtMBcS8 WSbv{;6| zSc06Re}OgRDZCk1j{bikNu4v3sE)Z|E6F`sHRJNtfKx!Cs?qB66_z2q68WIdnGJT} z%S?=L1!9E$_%|bBUBY0Wun>-m5$+=erx->W>=n6f_M63|_fI9&zB(=WcvbZL{gV{F zPW6xFK%WY-y$}1&wi-5s8ts+pM(3AQsclQy*Ba<*V>n$Ks!u0igRXoeY~X7*)3t^- zdkP4Wc#zykXtg1ng(EKZmuci8d$AQQGTFIKrQPuBqe{0dCgeVI+S(hYqoVRk_7X cJW% zS*eTivp#Gx*+961>m#uK%tMGnz8fxkeU*Xss{4XbM !mBf4U&gT* zzWWc4Tb?0z|H# V{T>cam(0qcNm(kBtVLCUgtQF27 z7WS=eF&o#Us DIxcmz5J^{Kd`~eeQisg^~&7!H}ZOFrLp$=L%PqKjbz?zke;e4 zdvb-=+}t}dlL&)Bs@WKbM$zTFaX)?+94v>BUXXf#w3B!BJalqz7MK~QDISO`V!ev1 z7EbJuy5BiJ9aLnH@#@xwcSAkD>$>b38!ff0vplXcJ!&MRI>W^0X|5!Tq%1|Ge#lQX zLQ;#`vxs!DuU!hw#f zYA`ZFwT>F%lv zrysnj$?9o-geTM?lqu5?_s-Q<`Yd=|=CM1zICY%gpX6NT^wwcjEH*F}3|v<|RO~QC z51%_Ci^b#fS*Jl_cqv;8*lm5)YLj&$&ZvLlW#8BL)4-|ETnukyyah(N;I`w(-@2Xf zf~zGiYBM==b71t?q205v&d@MOalsBIOevy~Q4BfDP@FW>
5NdJsDaMUvuXk&dAR5itC$?W)f0esFK{UqL>3DkI&9jd?+V^%%`EI58 z4(Nc-EV~^@8=#KOe8@{h8RUj{5q-8M%L304<>J*V2s(_1)5D<0o0jd g^5mWxG z$VNqf3AHBUBY4Hl;pYMzgo_64>QcX#qLJoDrPRx;z;wG+LFJFCmq_Qic0XVJC8}iW z+&kRC 19p3ZY z^ZZX2ee+i)_Idpbb=i)DPZn*w*B+$C2w<^)5Rlmvt-$?fT)6Be_l7g6F=K%mEdI!q z?_;_+cwRHDJxR>NHP1e|{*!iKin#5?Bhk_qS?u4o&*iN{ys168{a>I_-s3PXkV6Y) zCwn!qs{?wl7LU06rK6(*Ja3sxga=xzku=Y) fuAEmsK!?hAIhH3e_)XSm-%jH$Q~JDX*!IC!!6%qJ2!#|Q zMG=R*Q>1|#{ u=KfJKF#2M_YU2fnZb`wag3IZ94pmdv+27nZI&mWM zZR+>j*HEBkH-K^v _%=91?iedNnF8ElWCHAZ?B;iBWT)%^yVP1T?FyDt~vq{J`A| zuRi@&)BJ#LGh>RTi@WEc%WV7I@l^-fuMc4Ls6AwCKFb=R6O&JzCQUpV7)_(q2909Z zm87~OJZU!c#dMdg cFC686)6z8w* z@aB!e&v#&|N|$`fhQOIK)6Z2y9ZDWTC98S3i3Qpd!oLg`MOgt&USE6W5uN~MaU>pN zsvw!cSW>+aZwLNfsg-1I-kK7LP#2FBo%Fs`GO lM5}x}gL+f3 zvy R7OP@j1L|1;q;H_Q(abqMiwj(K? z^|04BU~u}rC0ufBw`=pCw)V{MN0BfjAV{eGkxUt zQiM;zt-KlPc%+%)9`B62F~P3$h6%CZ6n5HCy1LyaqBgHAs>C=x-13Me`{~vdrfX!O z&W_jG6k`Jk2aEQ+dWkj;jAp@8w<^lP>E7oQ(;Fy}42tyv?mNN-_j`yZ9aY?CIZ6u$ z7+41PvbEP5UhauuOGZ6okx%mZ2M@c615*0+fboTIvLel0_gbHNIGjwoX1?~^na3~< zA80dQc_O2nlS2mFR_KjTF&`SC?cvZm<#xDzmm+mao@eD)%>xZ@zu51~8_F(#^m(1- z?pr<05yi1f0!{br>3UsX;>K`jpVQH*KeoG}!@*y7q6T!|+_6MnKGUiGl3@WTA~R2) z=peRA{O02^`>S9uL)@%6m{jCd{yLoN*>h`iPuz`1Lwd0#^^sYbjNY1yr!UU#68zX` zcJ8wB-2bhGaP-Mi>M&qR7tq^i)Cc&T^)9MBhRFWT >d=$o?5}YeqNN4Cnv9di)=% z$89ux<;Sx7crZCHLasJqxU6%sN^MUG=w(q&yK){0d%P|M7P$>GelBs18R`D1G$P+` zz3G@~-OZfjkIbL0n-$)-_&7%Q_4hyH?|0GTf=$M|bm_^Scdq-elf5TvRy572uas_V znvcDRS#`MKh4k--gEg0zDJ!Zyxu0)h&csp(O6FX~L&WM@HSYR~qRK-T(mgdDd{6mH z#v?i3u~* X<#7+na<^TZv;6(yVkH}?CFbT52{y+a?_@S8+ zE%sX+FU=F&qCKT2 S{sN}340UEybre< zuYQ_5LD>0cDv}(YbbM$pR@ioRC`-0&fA9RMnb2oI9CS-@n>VT=hg&dW$vVWXMJF2R z{EYvHJNcFF^U}t CKay~t$cW^p0)jY+<=$J*hW72aWL}K`gvM~TR zW;bFUVbI#fjt7bfTSNRyorSw*sgzUGya-RIccDdDI~)97o}VIy(kEpRZuG1?E-6G} zu(8>>s%1@a`;@8Wn3?G@{g@G}Cu6?(P>!dFqKF%QzaugSVivUSWF|0PF<^oiPz~`v z#1{n^;7mt6#&j8fH`k2gG%BH;B(mVsR9IBpL(cH&3BJslm7X6iwy~(=sgZM8yE==j zbd0ZlGBqocqIGDbp@}px>vU#bO+o8ei7$KFRM)=jaZB;-qSk;{mbHS9&Ak+I9$kK( z6dqz)3S`Cjmwdvx-CEgH(fs@5axr%nQ;YB7MyAJTe|!Xd6JBEaTpT?lFnq^u)Twv~ z6jb#kzb71b5!!iJV|!+i&)AE K(GrQ8o7Nd6fT0Dl&^+oFz{>4k?5 zvdi2Q dUXov*ZJ+MoVV)S4&y=6&s$8A!n8kEDR*Zd0yZ@Hyv77h>4gto}gs(3NYkFAq zTKK;d=m{Dan}vP;FvX#O&L+3^hvHB~OpPGU{92}$m?aMN--Zclx#5X=&UJ35cRmh1 z2JW3jwHdftX`b<}doXoX=Q1qvX(p4Utk|Riuw|)GzC({Z1g*^w3!24uQ_0t_AsRgz z73cHS9`}J)!QpeuS*tM0@9ZTIyw`P!Ff=T{3R-~A_SW%K$yrRf3v9%jI=#@l12IG> zmRr~NV;9+YKF7z;A3*EdZ;$;^ <6cPTKa8Rf2CyyKPWID#i>ZQW|H*>CVJUEXcHE8+$oIzTjYi)ps#O?3fxM z|Bd(#_j SX_u{!N-b*24;IGDt@x?dQk@L>YSz9^kdpRFWII;hrx6|! zp9=ehwUXE( *;QQyJ7y0?Y65z6G!%U1**Fq!W@Lm1ir3|Y3g0c-QOsx-j?); zZOAOfCl3GXwP_U@0zvdsMG`tHVru}}U5~wEeKqoHoIX|-d5*BlVa9K3Czku=x-$VK zb!i)AZSWCKRwTKXOV!^^YI=6{m;^1UPB_Lne6z>Y(rVfHK53fkuV>c+(%MzU7*RN) zKcLtJ3c(Q&nkr |>s}!?EQEIc^)VQ) zo}*d0X{qJv>&9u!{(3u^tyCnX#RMeid-bi50uo`k(bvPdw4x(jdZ1!;`>-?hHHXl# z16u(|XN|DL;+dn7Y#NWf05j8H>KxQ9_9#-U8Q5=XPGVCZNWXMqe 2R z04G{6_*!5y do;-M97 zzAJqx4b`S)ikrl5sXs{1Cp|ua$JZTXHZ}xJ_i?rRGIV2DJJ<6{)}tv5nAUg(wPWL` zDCC?l9NJ^2`u#Lnzv5H $3wLbKrg41Zjob0(QrxSM~!TM!{)bN4aj<|?7 zo)(R(vYS)aV5|G$gE4_*zFx`48{%BLDr;3s0H~{2w^T0A?#6kCOWUknVIXUc$k)BU zUYFnCl7BbHtB=-7oRVw ?XLC4CR8Jg%XHtR!Dm_`Ype3>FW;8UTx zCUWbl!m3aUQJ^BJXKb~X>41-Z#fS>?dSdXGgXMeBHNY#>jIXATCCFE>JKbk1;#q+r z8>E4wO`7ncR^m1x7~koMpmK@yFnz%*pR84EEkWQri`p-nCp?oCb=8Ja6Wg_IgvI)p z5RWw(zj3hZeS U !$ zX7p7%M{kVvc`m8>eD?N_15zj1XT@dI(+@YYXz0SV<-5Erm)fo }7V|A7>iYXDi@E|*aJ|mF>gT~hv!t8nZvSLS z-QStab wx1u(_K?&O@+9 znH@%tngW_?vfD?(ql^e=SK4FECp(t65! EJAbn`sFUr1F!ElJ1*xOpU`n0%;va8iBdJ2hxDGnrxHW{yp z+Z}*MI%#uN(Fw#u_PF!sKneG&tG$?`NL~Y$<{{e9NmN41lsyMKF+Oem9L1iop{678 znP~9qO^}sTDzZ;2ifPqW%$@<+-Kct1i5!ht6KZSf(tG4;`tbm{uU;=bytb=P^IC&* z%YAH4b+~R=8dikXuBE_4(;GL_ZAiD*CCWYWDCsW5{DBl>qCZ#x@pqVT`XS5oq!F<* z1ibW}2Kv}--4=E;wGd_*Mx(9+U7Q-Zm=y4!b*Fa+GT(DLF-;mGivcMQpDO=)cXMf6 zn$F$(gO^U)I*s(1OCukg`srNd1`&PE(5zJ<6pCk@$)wzeqJ~pzrz3OxAsAG5yUa2^ zX6ZZyHdr$jouRtRB^#)?fAvOm($@LC#bur-kx?34N9`>Fn{*{`kfVO8O!2^)mcRE* zzm>1+v1?5=wrbcdo$><(NIhc#Gu>`u4c39Xy0;L{nZvTpy3@^9177)WYiF$$D}w9U z%Ude9W?yDsY-Myr5j(8lHQ}7z=gM`VEbtH0JW|#7V$hNG43|_5(vliqArtbiH*`Zf=HH! z*m0k$)t$+z!`&a&0c<(28Ud?jzR&ZKA&q|0GK?|=4Dx-2c;3&{GYmQ|UA@%D1VtQTdIsjUMowd!k z*w^K?e1FH-`_ihmsqy(ZXTJbgPkh&(`D1^%U-YESu?GD?U-QML{k+2Br ~&SYx{|Vjp8Iv?V$23SWe-mziI>}q zP!$Ynnfe8HqZ#%U(P(eH8Z*uezULaa@z$j6T`S$FwblB#1KdBY;rdB=#LOV^HuPt% z+OGRPf^MC1+sA!In8d66_tGzUT+b2J4!9!M7-7)hAQ%IKIU85pgU%~Hkd08HsmiFQ zv72*)p)y`Ew<>e6Z&}AU%g!f{0e*Wso+J`RTiRbG%q8mn`=n;NpWmXj^t55;9*e7{ zA3DyRE$%$!ngQ1E=i-00AvHqMrO(0rxV?S`h`0dt`fG9sFvz3^L~%); *>C(rI@aTGhEtOd&QguLwe_{ z#KHxhda RYdHBpPS#sjp;u3AY@IB)%b)M>WA=DooKT|A zct|Z05IW7|ym&d_sjZ|2OG}YQIK$RQk_ITA#j=q2&4zK~`_@*TCZmr|wN~2XvW{UY zu_f;){Gddcranb&$mMQUl-bBtnx9EPMaV0MLo=1g^FMGumq7LukBEwdlNWEI5?iu~ zO7w%V`M>^|vf^;||I)Xw b)uSUV4}qH-u0$+D#^zshuu2qc#~krc?^=AIpJ{b6Uc5`WxohvF*4>1B1tT( zzYdgVg$GbISk|~3ti*zPn})j=Wq!JF)Kn`CM4l`U58vSQH}AY;?#6nrGL!t577exZ zGzA7tklrmSZ;=0@TL_H>Ww%E1u! !FK;96`#ec9@{0Zjn6hr~~jh&?B s}#q zsagPHN92x;<7+I4^e9sGE2K0P^0nwNj=_XSf!jZ=PaCnUXd)1<{HWq7p)Xd~lh?Vg zliH8okwQ;0CJWEpao*hE^zn}B#mr;@z5U!zv&{s-NgM5FFIf9-RepBm4aTodCysXB z=yWsKSN`MtM~}Wgb7ooOvDsI?2e$adFeo$YKCcUrlo6Uqr0RC*gT}rU`0ak~oBn5h z60VM$9m;h81q D)b>Nad-ev6bFXqd9oLRUqZb6 zMx@!_l-4DY%e&yjK)%v?X9)fR^>u*Y&UG`CR6ZE6#Cd&pr=WV z$D>@y?}Y#qoJofmVn~sJe4PNo5T{ngZ~@r(5wr$6sRmyba|j#YD1hm%ONazo^;e>b zC5aGoMP 4O+028l=bL@>pfE%wTDO8<-rp8!4hnoSpu?+ zLwp_i1V#YbE?OuvlUI6;Q5lP88v-+iz4>Ckz8uC2na^nOJcdd8r3utQ6T5#SPy34jypN zz`}=frn%Nuj4*%+qKF4tHHZwdCpC1+mGI(*@qXgGDI+z0DOLPI&W#6;R7QWs4MSBv zRT^mIV7+3$2IeG3hqVnW3pdYgsyfZbhFz)zAa)z~OWSyH??@=UcG`-yt<#C$w-^{` ze>hkCeZb(P`lg9ZKmaS>2$$50)MIVIH}nhfwYp;~MSeZ5;zfqEPL_?>z(G8xGxLs! zqs){aX-odpM$^V!nndF@i_cr{m6%c-y99jpvIIW4DzW`Q8%QXx;ij*iI5B*g`trj+ zU1;rM`d95rbLgT|r$U6))kzegHGSykIG_mO$u1eHLOIhwN>*P`KmhtP7q>LxbBgFS zdCKDPu}(}&R2CM%ojsJ;HxEA~ed1+H!*7eI-#-qC*I@e8^^6HXW`X@tr@i>%qyAQ6 z>jkN@Yf??0p(XwI9`!i^N3p&ecqbUdw~7>=s6aS>j8tXW!BJ0S`D0OIRBZah6n!qs zQp&3}*wIFdG@K`m%P^3Yg@_$pYfBL|TQz< gNMIbebBCN|V;h7lo zQ1RVm%3s^^)K~Q%ZP&OEyW{VHcHIq2yU=~J_&-pYpLrZ=_C3lMr3A%cv>cJSkd}xD z<9@ZEz3C;J(0Fu8xilA@i30p^%NRS{2+Q3K2a{N&COeOxx#z`J#yTUTuyILAb-aWd zO{%tz1ynEtn&&gy8BY{( a2Cr#@eQ)5JqIVc4uNv$U{7#wz0O9p;oQ#>XmB2 zJU{u)`Giyp*EvzSD~&F$+C(mVb;jDn3 5%SeVxM*QGnD$(K z{_P3kAB3e1OTEekl&9Jd8;^LDKLwHj;cjik2*s;QMOQHWF%R`UmEL{gu2k}An3VLX zo&IQl^{&R$uoBW+gi{qlMb2szYz+o>jNk|feF#!L!X$nQH)_GI-;nv}&*QjdL!-Ev z|7wkZoVP*#Bfi4a;u(8kL42*dRnl%LFW!2qdg@gV-?=gU+{N#JUJ`jCWn2%)J{8BW zW3NnTH2g8t?`T aZbBFvuN*zhX5@Swba`8?>J%KfnjmPhT;!@V-$(Y=)Q+H`jA&L`5 zk)ulJL$!YqQ@-F3x)bDKI#kU+0iy?FW;)}l&(|F-s7M5$mkAO B5xiN}Ze04A%oE#B`K&LKaI{(Lx>$}9H}^fhH{IxUwyV0#eNorykXR=d zm?=K|>C @f6oJy^~AQ(1AdH|LuY?20An zz!Q}lQ8DLcd|4ba_|e)LLE?o)e %va1<06S#IUgyek#&acf)xqSlTF!NVL}s_MY@WhUGFo)I7^VP%T#kifZ&|i} zbMb3q97fAIaw&7Jm^c-J_TMV(qShBME8OAY9pj47dw_b}MQeWIeXwF+J8AO8_rM%+ zJQz*K?gB;v?QuUBH>ug!3S}*V9yKf1kmIofHQ-AckCy*Zc4dp*JMT+nHBDpAhsu+h zCeCxGtVZ7LkbU@2URj=c(XF|Gy%v~W&%;CSM0}`9cvc;>=0Ibn3|Rl8D;L1FN4msD z$Wp|PKl9z%(hCc*^LItAwE1>oh8lB@3C&m1nMj}i1`m2|6XZs(4}Kk3Wq+jeJaCMb z@|s;q4Prpnt4LB&xb!ZxiK=HnPSwF3VB~G)6bJ}|UrQ6Sd6-lDo8dR6mD~8i5b{wN zZVmgsgCpYihI;VkN3rVX4}bQ#85iCxdXc_I_&1Nx(G@{MkFuzFEaFiwJoavK`3d4A zE|4_O1D=;w+qKM)qhPn6*{;X-9}D027@ zp#mh~DGcX<5j*2qxgT1LcJumu*E4=Ev(=EQV)0kaP#w=mhNcUiv|svDhZz^&l~UU^ z?I?);#M;wy_loCcm!q$9SHE4*V|Hy8**ww_YCpmKa9RdI$?ZZ!^d~CTG*34uqVy z;0P*?g hPreK2jjFEc>1O zk;&*U15DYpKI-bZ;&(e-X|srJxa-614{$Ft&O9&6s0f-FLK!Tr*2W$gE=}Smxf|Fn zX>;1|^ZheKpu>BWLTW&weJd4rC0_wQA_?))V&i`JY!z+bO-(x6+`B>{)7;3OPrejb z6~wunub#hw)&EDR|0Et>n@k& c)?2eL7JAxl#8Pui^EnqULMKPhPCv8pF*n+7fvN7x$ASPy>hY55cHeEb zN4P`Er25G%;Hn-$@+5 @cxN9YQ=cY7?q&?d5m6Ougo6XhTvz>pWBJp01p{}V&VDGD@ntP^2PJN7%pxJ zBPhg=t5F@QA>kkoCTn@vLGD%e^? $jOv2!6XbP}UT-T>K3ZJG)-f+-}l{AxMaA!^S6 zoX<4;fy@d|;+|j&oG&HCu-7x=`?)bJyLCNG#(|3RYfXTzX|mUiSoGM(XmG``F7kSv zOO&g{DZ=@9Ax-<0#1&De%pV>&RMP&p%5=B$S9`dr&xCMOdl_(3qfof1OPr@5@SG3s zUd0VAK1aLK&M=CJUH>z%~Gtx8{~uNjYxztJUC zr{oZ<)$Fm|%n3t_O5!8h-5z5Q3|u3eB+Ujsy5+iIgqAp0C+>}p?Tic)weHejSykux zV#UG+bqYWE9WkAn;hE=Q@Mn2tsS+N^E1=?=_~Zen8TNp} uZfB#z21g;MGj)~N?6(P +OrB>rXprE znSLRbZikEiM~4a5WIf_*;Jt;Gci!aV%|_9{=t!n}y7LC>jW($nnZ)wqjsSUv{n@hW z$K|C}#kW@1=hba$Tp9xz8+0s?^Frm@$S!wdDd-|`CB1|(o(Ilh{>UXx{dg>CBi-Gs z)a~hR?sllZ0M9x7km(_@V(sEIRIhCB302uyiHGzz{Yjk3dcz!cwOLK9HHrz)q)hp6 zr5&(}e?ebpI#TwPIvIkL_>o-HP$0{YaNqDqjj{@?F?!6EoaZ4o_P#%`z036V9kDA- z11dYyf27c#Tz|v#uRBEY-E~5h-7D2)p;Q;T7Bg@%Z-+z32SGsOWp5qG7$>CEn!e5W zMX6Q;sf6E1_fA%+LjZ-VOVyNih36$GitaNT`IqWH#z=gPj=eLf8@?1&<`Lq--e0H{ zI6vzpTD@)Sp}(oy9rkQd9yFfxCsm)rg)4>GDN(kqrBrwYV$Cg;s_Dmx4K0&-evQ=# zp2qbtG{k6;j5>esUztw3Dl0HyWaVjzajbtmJ&hSw?CNO6cmBi7QX}sI8hC0>;qzrG z1FN+acFY7)9d`7}pM&lOf~i+l62_>%L}9nPHPG=`V=WBNrAUKl3z+vO4iuz*?&X)y zuKod66?5m;=lS^8CZA6-imtT3=eal3U)g)Q?{-#9%ph`ywg3-t!9WsTIFFg+SkYR! zOMLgV69&C2-kN)TLo<9V%}1w$va;NJU*wqR9&;{j?>%X^BDc{5;N`GIvts{Or`Y~v z?Z?n-wuZz`>A+>;!oA^CZ7Jsp;R7K7Fqc`rOE0x-j3VsC3iM!GNuKVJ!aq$)%Ome( z_q;vvuJ>={UDoTPGSJdc_OF0NV0(aikunw{{jOh $*<;Ztpd>O0ueB>WP^=#L?1Vy9o?(r-7wh?rp3%3JP{8 zzA{*`B>y%}cq`JM6MOOI1bf1c3%d%D*S~NOvW-E^h*v%I rQ;zpUxRb#Hcw><3iDgU10M*TU}_nWA4i8HrBi5J6 ~ z{+rTyYIN)GO01bSt6yCg%NzV=$JR}4r9vaaqX=!1PQ^%IU=WYUe qoe_@qmI#sbdhUNNsdN*PcLf$$1c0*z=_j zd8;B345A*$armu__fk05!?0l0Xe&nSg3yC5c7} YQp?4tr>?RIpW`}D~-&~5Jc!GztNdG9|58tXsl)J8VmK3=qU z<)**i7j0Vj@?~A(*|YBpR^2?Xchyb0ixLnfz+ntk#6L$0Jw~6=5h-L FUy`gqj$=}6IC(eI}cWgh9-KBT*&q)6M(&B=$D}BgH1$>O? z9+V~-V+B592TD&u|G@QX+EDe}Cms2OQO3xPK^OO=2k*RFx_gCgnMvZiRJ->4@eh#= ziz6R|dikS^)_C53vS;A#FG_gZKX3E_d!jC8P_Ar53IduHt0H+xez;XTd8i39CY$}m zLNc4v10nx%h6(!xf;n>VtyTc`1=qx?)j)*+jY5>IsaZ_Q&hT1>itQ>U_~JU!1V1Cb zFqdT`%5yzhiW^A{`)1u6n)|wWe@g(=5JxOMB8ojH$JM<)16T1OuVd7B9(Hp4O+PuW z6?5K)8%P=CJR`XsGg$TjTMoM6Q5+4zR}>mF+z%8?EQZ9`t8#BP(`A4kOwPf5*Q7{j zdY*mip(m!A5Ov|2vP|5vuNL|i&bFAz)qbT6*wU+oE>B_6{;s(<@Cj1YA$b+j|4r#H za`6a$ROcTqgJAV{m#7E!l4n8IOAUuLW_0o5=(zO{kUQD18 z78XSsd!FI(%AaV~MYlaZ6n`5Eu#{d0S(c(0#