From d84d972e73ad708d54d071f40fc56039c825e6be Mon Sep 17 00:00:00 2001 From: "Mr.April" Date: Tue, 7 Apr 2026 11:01:11 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E9=80=82=E9=85=8D5.x=E5=90=8E=E7=AB=AF?= =?UTF-8?q?=EF=BC=8C=E9=87=8D=E6=9E=84=E5=89=8D=E7=AB=AF=E6=9E=B6=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 主要变更: 1. 重构API目录结构,采用模块化设计,适配5.x后端接口规范 2. 优化布局组件,提升用户界面体验 3. 增强国际化支持,完善多语言配置 4. 新增权限控制功能,支持前端路由权限管理 5. 优化认证流程,支持JWT认证机制 6. 新增中间件和插件,提升系统扩展性 7. 优化状态管理,采用更清晰的模块化设计 8. 新增搜索框、广告等组件,丰富页面功能 9. 更改包管理工具从npm到pnpm,提升依赖管理效率 10. 完善配置系统,支持多环境配置 适配5.x后端特性: - 采用新的API接口规范 - 支持JWT认证机制 - 适配后端权限控制体系 - 支持后端国际化接口 - 优化数据交互方式 --- .data/content/contents.sqlite | Bin 475136 -> 0 bytes .env | 13 + .gitkeep | 1 + .npmrc | 2 + AI_CONTEXT.md | 196 + README.en.md | 98 +- README.md | 97 +- app/api/auth.ts | 87 - app/api/auth/index.ts | 188 + app/api/auth/types.ts | 99 + app/api/member.ts | 55 - app/api/member/index.ts | 189 + app/api/member/types.ts | 122 + app/api/site/index.ts | 47 + app/api/site/types.ts | 82 + app/api/system.ts | 97 - app/api/system/index.ts | 64 + app/api/system/types.ts | 41 + app/app.vue | 39 +- app/apps/.gitkeep | 1 + app/assets/css/uno-reset.css | 387 + app/components/advertisement/index.vue | 400 + app/components/advertisement/modes/float.vue | 137 + app/components/advertisement/modes/index.ts | 26 + app/components/advertisement/modes/simple.vue | 63 + app/components/baidu-analytics/index.vue | 77 + app/components/icon.vue | 56 - app/components/icon/icon-selector.vue | 299 + app/components/icon/icon-usage.md | 141 + app/components/icon/iconify.vue | 49 + app/components/icon/index.ts | 3 + .../login-dialog/forget-password.vue | 565 + app/components/login-dialog/index.vue | 3 + app/components/login-dialog/login.vue | 116 +- app/components/login-dialog/register.vue | 143 +- app/components/search-box/index.vue | 154 + app/components/seo/index.vue | 128 + app/components/sms-code/index.vue | 26 +- app/composables/auth.ts | 22 + app/composables/captcha.ts | 31 +- app/composables/lang.ts | 11 +- app/lang/en/auth/auth.forget.password.json | 40 + app/lang/en/auth/auth.login.json | 20 + app/lang/en/auth/auth.register.json | 25 + app/lang/en/common.json | 42 +- app/lang/en/index.json | 3 - app/lang/en/member/member.balance.json | 16 + app/lang/en/member/member.password.json | 21 + app/lang/en/member/member.points.json | 15 + app/lang/en/member/member.profile.json | 27 + app/lang/en/member/member.settings.json | 72 + app/lang/en/member/member.sign.json | 14 + app/lang/en/pages.json | 8 - app/lang/zh-cn/auth.login.json | 18 - app/lang/zh-cn/auth.register.json | 15 - app/lang/zh-cn/auth/auth.forget.password.json | 47 + app/lang/zh-cn/auth/auth.login.json | 20 + app/lang/zh-cn/auth/auth.register.json | 25 + app/lang/zh-cn/common.json | 93 +- app/lang/zh-cn/index.json | 3 - app/lang/zh-cn/member/member.balance.json | 16 + app/lang/zh-cn/member/member.password.json | 21 + app/lang/zh-cn/member/member.points.json | 15 + app/lang/zh-cn/member/member.profile.json | 27 + app/lang/zh-cn/member/member.settings.json | 72 + app/lang/zh-cn/member/member.sign.json | 14 + app/lang/zh-cn/pages.json | 34 - app/layouts/blank.vue | 230 + app/layouts/components/aside.vue | 88 +- app/layouts/components/dark-switch.vue | 12 +- app/layouts/components/dark-toggle.vue | 6 +- app/layouts/components/footer.vue | 193 +- app/layouts/components/header-actions.vue | 117 +- app/layouts/components/header.vue | 77 +- app/layouts/components/logo.vue | 2 +- app/layouts/components/menu-sub.vue | 90 +- app/layouts/components/menu.vue | 80 +- app/layouts/components/mobile-drawer.vue | 8 +- app/layouts/default.vue | 180 +- app/layouts/member.vue | 207 +- app/middleware/auth.ts | 40 + app/middleware/global.ts | 11 + app/pages/index.vue | 93 +- app/pages/member/components/balance/index.vue | 180 + .../member/components/password/index.vue | 169 + app/pages/member/components/points/index.vue | 199 + app/pages/member/components/profile/index.vue | 162 + .../member/components/settings/index.vue | 784 + app/pages/member/components/sign/index.vue | 264 + app/pages/member/profile.vue | 57 +- app/pages/routes.ts | 51 +- app/plugins/auth-init.ts | 64 + app/plugins/i18n.ts | 112 +- app/plugins/icon.ts | 3 + app/plugins/permission.ts | 70 + app/plugins/pinia-persist.ts | 11 + app/router.options.ts | 4 +- app/stores/config.ts | 231 +- app/stores/interface/index.ts | 74 +- app/stores/member.ts | 86 +- app/stores/personal-center.ts | 393 - app/stores/system.ts | 543 +- app/types/composables.d.ts | 19 + app/types/member.ts | 131 + app/types/permission.d.ts | 29 + app/utils/common.ts | 142 +- app/utils/dark.ts | 33 +- app/utils/icon-utils.ts | 82 + app/utils/language.ts | 76 - app/utils/request.ts | 480 +- app/utils/url.ts | 88 + nuxt.config.ts | 39 +- package-lock.json | 10930 ---- package.json | 142 +- pnpm-lock.yaml | 4948 +- public/icons/ant-design.json | 832 + public/icons/index.json | 45159 ++++++++++++++++ public/icons/lucide.json | 1671 + public/icons/material-symbols.json | 15163 ++++++ public/icons/mdi.json | 9034 ++++ public/icons/ph.json | 9074 ++++ public/icons/simple-icons.json | 3395 ++ public/icons/tabler.json | 5988 ++ scripts/download-icons/README.md | 136 + scripts/download-icons/download-icons.cjs | 90 + scripts/patch-oxc.cjs | 48 + uno.config.ts | 15 +- 127 files changed, 103052 insertions(+), 14661 deletions(-) delete mode 100644 .data/content/contents.sqlite create mode 100644 .env create mode 100644 .gitkeep create mode 100644 AI_CONTEXT.md delete mode 100644 app/api/auth.ts create mode 100644 app/api/auth/index.ts create mode 100644 app/api/auth/types.ts delete mode 100644 app/api/member.ts create mode 100644 app/api/member/index.ts create mode 100644 app/api/member/types.ts create mode 100644 app/api/site/index.ts create mode 100644 app/api/site/types.ts delete mode 100644 app/api/system.ts create mode 100644 app/api/system/index.ts create mode 100644 app/api/system/types.ts create mode 100644 app/apps/.gitkeep create mode 100644 app/assets/css/uno-reset.css create mode 100644 app/components/advertisement/index.vue create mode 100644 app/components/advertisement/modes/float.vue create mode 100644 app/components/advertisement/modes/index.ts create mode 100644 app/components/advertisement/modes/simple.vue create mode 100644 app/components/baidu-analytics/index.vue delete mode 100644 app/components/icon.vue create mode 100644 app/components/icon/icon-selector.vue create mode 100644 app/components/icon/icon-usage.md create mode 100644 app/components/icon/iconify.vue create mode 100644 app/components/icon/index.ts create mode 100644 app/components/login-dialog/forget-password.vue create mode 100644 app/components/search-box/index.vue create mode 100644 app/components/seo/index.vue create mode 100644 app/composables/auth.ts create mode 100644 app/lang/en/auth/auth.forget.password.json create mode 100644 app/lang/en/auth/auth.login.json create mode 100644 app/lang/en/auth/auth.register.json delete mode 100644 app/lang/en/index.json create mode 100644 app/lang/en/member/member.balance.json create mode 100644 app/lang/en/member/member.password.json create mode 100644 app/lang/en/member/member.points.json create mode 100644 app/lang/en/member/member.profile.json create mode 100644 app/lang/en/member/member.settings.json create mode 100644 app/lang/en/member/member.sign.json delete mode 100644 app/lang/en/pages.json delete mode 100644 app/lang/zh-cn/auth.login.json delete mode 100644 app/lang/zh-cn/auth.register.json create mode 100644 app/lang/zh-cn/auth/auth.forget.password.json create mode 100644 app/lang/zh-cn/auth/auth.login.json create mode 100644 app/lang/zh-cn/auth/auth.register.json delete mode 100644 app/lang/zh-cn/index.json create mode 100644 app/lang/zh-cn/member/member.balance.json create mode 100644 app/lang/zh-cn/member/member.password.json create mode 100644 app/lang/zh-cn/member/member.points.json create mode 100644 app/lang/zh-cn/member/member.profile.json create mode 100644 app/lang/zh-cn/member/member.settings.json create mode 100644 app/lang/zh-cn/member/member.sign.json delete mode 100644 app/lang/zh-cn/pages.json create mode 100644 app/layouts/blank.vue create mode 100644 app/middleware/auth.ts create mode 100644 app/middleware/global.ts create mode 100644 app/pages/member/components/balance/index.vue create mode 100644 app/pages/member/components/password/index.vue create mode 100644 app/pages/member/components/points/index.vue create mode 100644 app/pages/member/components/profile/index.vue create mode 100644 app/pages/member/components/settings/index.vue create mode 100644 app/pages/member/components/sign/index.vue create mode 100644 app/plugins/auth-init.ts create mode 100644 app/plugins/icon.ts create mode 100644 app/plugins/permission.ts create mode 100644 app/plugins/pinia-persist.ts delete mode 100644 app/stores/personal-center.ts create mode 100644 app/types/composables.d.ts create mode 100644 app/types/member.ts create mode 100644 app/types/permission.d.ts create mode 100644 app/utils/icon-utils.ts delete mode 100644 app/utils/language.ts create mode 100644 app/utils/url.ts delete mode 100644 package-lock.json create mode 100644 public/icons/ant-design.json create mode 100644 public/icons/index.json create mode 100644 public/icons/lucide.json create mode 100644 public/icons/material-symbols.json create mode 100644 public/icons/mdi.json create mode 100644 public/icons/ph.json create mode 100644 public/icons/simple-icons.json create mode 100644 public/icons/tabler.json create mode 100644 scripts/download-icons/README.md create mode 100644 scripts/download-icons/download-icons.cjs create mode 100644 scripts/patch-oxc.cjs diff --git a/.data/content/contents.sqlite b/.data/content/contents.sqlite deleted file mode 100644 index 9bfc44164e91b29860c065aa0966be4611386ae1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 475136 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 z zvWkq?eYwG-74x`8M6&jnfIK{U5-ykNF32@oN?i$l5b+l|uh?+X4Bz+b`)jH;gMK4cZ%=$GSc8>& z`7jE1x+Z3{CA~3na?29+?W4jUG{EdJ3Z~ye?VvOv7(Fr^cC_xe-u2U(gg{2Rn)-(_d ziF@|Kc#3a*iRiw^4jzdnWmV`&G^sRmZ7AVV5kpfYdt3 zi;&9Su@@mr!B&f+eJq$OFSvoUz)&`7cQ-{$DwM4G6fpU7+wXD-oSWdCDH$B0+IcLgne1F9mt_i90&SqeT6?-%S6RXK zt`+BN?lwA&Ol~f>IGtFxO;OCZM+n=WTb5rlUc5nSR zc18{zOpjf}syq%tRQr(u*^3`;VYAu3ez70mFG5q|dWyRWUT|N6a=6UKSFIb00+ z(o!)hf;iFa()|2FG+&&{&u8bON;Ef4*odb9axu2w=@uza8Z6&g3vR({mk%JzMvWo9 zzX{1;Xus6qs+}62qlhN7t(UfI7fv`!rzHr1ziFO-ip~_F&k$GGQ!{z(3mfWfS;1*9 z<5RBGmPCeNw~Gh>-ZhPonRVEiOQ4c6#&ogI965@0hygCFztMs0L3BhgBX%yclu0nq zo=(5KAZ=Q}-k~g)W4KOsxgh%u{A(ZBaUPz5F`*=w{qPB#5{AxNU~H1w>;ME}Bz#1Y z;0hJCthkn*H`$@f-$*iHd(X;(StzHzag_{HjLVf}Y$6v_lR9EDs$p|NX2c5ht#ADH zFQw>lza(%C)@F4-#cD=M0^j<^SAIU&Sl!%`8Innx)NZHNtqhVQHaEa+zxE5krW{HR zYI_*&K`^X(0LkRHf#F~MHM1GFB8Ie8`E1y(F9QqCCY59zDOt-9~TIg=!b*y=P)-qak3(+1q5foFgDKb3^D5@VI1(sjb2 z1S6dncwu%jyItO{W%llukOF?;cfa|?fBda){NkUPBp~!b0w~omwIfKIm<#8VOkHj? zkz5RM0HnY#-Y&%DhO`>!0gk;QyB`Vdkszjn+s==|6_PwktX$v__M2b)nn_|Rgehik zJLw6@3_gr%T&(C*1{}}z5mm-qEkkD}Hu2Hjh6GTy5o+w|7|b!ipr+eF9gY$BMiLTZ zbh+8psY?St_0gYrZGZjCKaf!JW6N#~B+Ji7rBb$>53}WL4u|pVLX^ucmWoIObJ-|2 zJ3F9CPC9Lh;$L-jKfHTf<*Z{l#u?o!)G3h7;{?fKaGDeow`$cMQuQuSjT(b(_bmJpif zm+o&!2zGlj;xT0KipRt|A3Z9uOPTv61((sod(9G2m6cv4RaOT<0%;SIh+0p zFqH(_Ca*2SB?8 zf#MU)G&=7jCWxA8vUx@)f%N8?Y?kpU8;MMiGS04|O&uA1aAo}hITAw49PMNvm8C}W zNOTlR07b+wVx1lAQ_14Ogv4=@lmwr)1015xbveAQMdNf%k z%_L+$g~KCXY5xC@zIKj(&;Fc2;0yw15IBRt83g{CLEw)XUm%d}n;%d75x#`+K;_}E zR3M>awn(B;u2LyR^Z7!4K8Nd}l8;Js*c|XajGhFuXY5_xLc+g97z)7)1S3@l+KI~? zGpOIMeEd)|y02qWz<;RVv*3l?rGD+KQR88K9;FH)-4ni3Vt;Smms z3dQU)@&uRVcdyZEkJJYoYYKm1SMr2~^=H+nL)1=0^cgNYn(Im9At;}u2F2OeT_BFM zG8$ImEUd>$$H7U@o7_*-@()JkmDI9hEVATLQB5IpOdVQ6pCFJ@5o>J68#nfpt%z9Sd+6M zZ?6L_xfuJbk@+gr0rzoCCAHc*&>%7d@t<0TV6{$_pr9FXNVZ`PhOS+`fWj0e^qf!t zJJSP{wIWLa%3;ax{Yh{y@mlG0dbiA8l)5@5A$v1uYLrDi#M^gTdXoDB)W}C+R)J9O z7FcbseivmT4T%{g&x9k)mX!&0Yt3w^6*G4Sb)1fH@17|ko zRJG03)wVrg{;gx%CESnbQgTaov^%>YL=84AdO}u9g|oRWT_D*s!T`PFkC%+aD)Z`O z%`504ToiHkq+8z6?9P7S0ezb=42NXckMWz^J&NNJxUdOk+f|DRq^&4**4i7(CoI(m z66hQV)Kq@s@GYOly-P410N*7t&+yrsUs}~4_S)~U7| zBpnHO{!Qc*?E@nvBH72v;hYXG9R*Lj(3n1K5n#C>`$SX%X4;2_&kSf6xWLI?b+zoi zDx9d*>NbT>(5EAkz63kbE_Ka|PsD)ZkHI^4FR(EAi;j%&lCdr7#SL$ZT#sq@S*;Tr${|E=A15bkn)-TquyznjJO~^1hG%K9-dK z!%va2Q6yHb39KY18+<1-u%2Y@ootrz#@;?N?e45Z9BYWa8;5Gqs2T4xB1RIt72MP( zDe!NRQyUM5Un6(v9?Dt^<-`-#Z)$z#U7p2eYGRUIT|E-iyDorUv2cfyGay;XtVCew zrM(YCA2`oczN%rCK30ITNqezif;2$@d$J}HSzSPvBfMJXUz!+<4~j9j-_s67Nlr=u z&$AciIN`rqQ6358M;Z?Q5*v7xg<;_*$r0*$+GiI(Q0Cro3q1|v?_XEK|AC6xd1p2= z2U{B%nUY+=Z@VY!gB%CsAvS?n@)E&7eITFU6(_|4O&(})GU<6C$JL|+V$iuM|K|kz zK3U>ZSjDf~SH_)p3yByj>CP&Y zXwVA3Tt)0`+98W8+!llH?e&N-mMK>W_a(e8y5>VClF3FPhh9b?8 z2%$X%1no5znUGbn{$O-aeyK|{ZTU1eTL4yy15z2a%Rb9vuLJwokm1xO24_fjZXXv~ zMndE6%f%Kq>rHfPw1PNj*di=b;ldh#L>a>ZYpY(yC*PJZ;W)V0Rv{f{FjzMc6SRrZ z!eAUbl-{C344Liyf$34$axsU;!Bhjj^Dwnle2`&^{{OwLJpiQ}0^$i(eOZk3Szee* zq3Z_%TeXPsfc4urVN?o#-dBVzcE{r@-+$-PRf`x8)EA}zn(jMOA?RX{=&LRbT-8YU zo1$}Xzf~VWm5uSHM(Xx5as;gz9Ol-b5zki%@1ef(T31@~FFT5M3Ot7my8U4LOeY_-|K;7S(3D!5- zP8&o0^m*q=P#+)OJ1NxrrTg~|_T1<)>nUx)VY{P26M#L}cN>$0s~GOga{?213C?;F z=uhZVF){4>F7heB{=|#uVDD)9B(U$hlS8mSbq0JQ+)upJ6IlateOLJu;6DB;8jqB? zW*P>u79N44yj-MW;m-CZMBkZg2Tj`$w*% zROl&lq?3yn#NseMZ?npn%TD$VAIy)ZMUu~eUQW1)IhHi%mVVY4ztGE7)jn~#0x7+m z(nuuY;+Cayf;8acb#$BjI2AqqQW|>ntVFB|+qEJC3g#$LV+zF|AEa{W<;Lzhr>||x z79iKOrKj&!o2RXq+u}GtpM9G-2y0y_BVn^S!+)uyCp*|NMe|QJk6@zoU#w+H04TLB zE%?W0h?0sr?HPWbQOVV5eu#5~2i5)|mr}|A@K+$As|UW(>?CGjr<5UZ>RG~**+Kj4 zzwe#!_3^KSJ;b1j@oY3eVNnClTB@?i)@hma%u8XpbxvAWXm$Rn* zh;wqQ!wJQBluOA}Z%uvXt$Od9M5))usMRsGj%mv99qre>nUN2^E!MX<0pBlvc&-8zvZM?7llL@oRu@^%-~n3effhq~lNflt}yJKD0h+Jc4}6 zCzTxe1efC^axAP#aAq_t5~?hW8a*Vwu#<6|@$@%NU39w~{l4CkJUUMRiP3sXymGyj z`!K;gU^m*YX7jV+o#EE@3Hdt3+miJv9)+>sM&#(g*Azx?b> z>X{KN2{D)D^s^!N!MBAC#RvJ>(HIj~VUG7OdQ?0KJD&g(Ml+sx4nR5jCGk=O*U=;5 zDJEOS$t2^1g~TU5eldm*6F}u8iu2i-(eF8Ju#BfNC#~W|@Z>~c;5~OjQ$;J+22Cng zCTup}nu6AYe8vi2GstFOr7UiOi66lvbBDO>epVbeOg$^a^XX zoP2A)CExX$87BjJA0?xZqow-ywgAuZpY+D0oBSq|G0rvWO~xVn(dkkHdd+bAzI4rM zQv*^BXCcovcCguN3L2xEv1+=cp=$CvCp0P}1!II;RNS<5V2qlI+8n+yX!5lno_yt- zZ>Co{(D*XFP(3;m_jmLQwC0k@z=!LqbXKQrccV8ch}0@+VL|1`3WfOXoBBso|z&F<6n2&!sDq# zP{z+N*@8#2g!nBYF^*o1f7j^MTK@lsD(Cq3?9Ukl-X{qB+3VqJE9?Ky=3sv9+%##G z`&87N-Y+jzNc&tWSLhN^&SMFlE#&fHp-8XAY_t&06-Ou6re}a`rZa1E*WtVAS z8W9864px*8H7PQumYW=c+nw{bQEpLa!33z)%*Zt=g-w@;N0MD! zez_Svli<<=?Lky0^NoYSp~$4Xx)!N#0VZnd^IZB#N9Q(0pR3YEO6zs(=x65cXwk(zDKIPG_)F49}9jP=k+ zx;Y{ERDa_tNxD94RlzeAO;)N8wUv_c^ zSNpaym7p7S2kAr;0E!2hcCFF5$g%9my_0g&y-7!aRI<69#Y9PavlFEdF3ir*6<~(J zTwR}J&Ij*$2Vx2v$lFxKDj~$W|M5NHL~oMgk)rSZxU+^l(Cx*}-Vn?q!{KffGN5eh zYP~{XdR%q%Y|#xW(y+o~i$km?PEnEoIcTsC?4=5srn4+>>Tm~TI_uG*qnC2r;=byx z_9KsnhrQEd%8Q@~FXblSS5!LlZv!*QK9Y3p3a_(TV6u(G|Ngmt*y-P#xufA7wN?Pi$)rbnH z=!Spsl;jBlUx-ryGdXZ4o>8MCP7CIUOS?M_5{aepL;3FCaNMms_mF$&Q|!m z(X#zECB1s~WW6m^03)LsD@r|wN|_9aK%i}@1X zz$}@ZQZ?2-&0r|m*#u5^y@gk*(9FE98i<#mQTCpG{JVbR+$-n)$8-AkFZ-Vt=uL#a znVZX(XG{68Tv;k)7fO|dx!L^ud}(p6uv7^bN=pO!X1c>tf1e}f0_S4QlWIhyUwKXJ zD*b#F12Ldvt~4ligYafuYAWFYeNec(okpY9rq3VRB6W4*)?zC8k<4e>;wBw9_bvoi ztDS4zqT}h0!zMifA>(m(A)8qZOjM7<>5Y>1rdi4hXs+M-#@D_=^Oe+MH^Xq#S{D&g zKxGwAR&3?g(x-+D@+s?dqBcf-Yu^tE#6$3md!i(rkVJp1g+;m7wnxjR&JZdrl8EXf zr~{)>Dy!+DPoWf)#IeOVHj=2@b|olxf?CCo)<{u=vlvmzMx=_qD19rFh$@gP)Q)OR z851h4f`SN?Dryjz*AX#;97b=bV2pZ5tC*CCqvkdhwH2v`k3M$*(Z;NtFNL7Uo3KUe zY7#Qa7!+rB{=OZe8VUXKPpYSs(Tx%M<*fmb9^X;u7k__M?jPm_}$2cK)?M+xhqHFqJK&Hg?086VutSATkF z-m8tq4)l11=9e_)Zn+n19@R^#X=U}l(4x?Z-R{ipp+X?e0_~8opHm;(eei3)V-1JY zv+ovQ|>*ukjYE`kIfIeoldiTac0JT zAKiO!c0RW-yOdwd&M(ep%B4~Y+VgKMU3Iv(qu7l}=1(GA05B9T0 z#-y7QsR!ZR%;UMWg}u(!_R;P3^X%rqy~D=M2M2}jPAhlsd2#99<7eyJhuz1wpUj>+ z_tEm*^_^ZKV{Rhw$$? zzNPhxODFsMRIp58IwylCgc<{bQ3woxRVyC_2`W?W4NX$ZuSF5Eh)#ig+?ra$$y_WO zu3De@d#`tM@u|fqmD42tKBD0OCi>%nMAOkD@#s5Z)wcFMu+UnXN==Byz9YWud`9QTX`=0&gZ~Shs*)7V6VU7*Q`g8_Z zyc+bKmL*!&>z823Kl{7B8*qiHobWW)3D|-MV@nuDGz)Ch`#J#LM2v%ts!U^`N}M2` zD;+9UtBY;dQLDsUuP@OObsNkkON~hZ3Q0!QIfaU1yTADR?*rSNr-v`p^99)MTy}n8 zb~amB%oXM{v-A0d!eU{zSg4#v%io0BePF2iNKPw4W6TZ6jbO7Wrp16k9($vbS~@X_Js z5X%!;$vEK`icEWE5q?^;!7NNZ6dE~7EgF4Hmr)8~BIj~3q0PL`=GxT^aBSy33%1R=LL>x@g8P6Q3OTwI?PSCFX@ z2ocbpeug<}xz@@gQ>wP8CEB;>HM$p4u2QW}SLkQjfV9g?FtqmDyrU%`i?XykN1%h9 zDTJlT(p^7Y*g~*VYZT>?bYFA8mFf;oaknA1FTbc4Bvv*zaZssnZVhYTFgoD$mKOxu z``g?e5#cH>A)H;*;(KRGjL}jYE>3N=SULonu4M^^E43p=q3bl;rL{30G+^I$m?=5L zcCb&M*E(Lw0l{z6dKjw>n!hp>*`z71R&Ng&qa{mDOdG$4nM}|);p5&aK(IT@KJRI-C6C8AG04PBF)cL=uIm3Y!UsqS!z`&GwZETARNVi;||EaxwA-=9aw^KIx5wo z)FCMHOLsJEg}VV=bm~KJT-myfy*SvS`tc^^XEB>MYOVt=Lqno6Lz}3-fVf)2x$mY+ zC6x~UJdWef<)+@H<9rWT*wE+#+H88Zy?+0Wgr+>uirB2umq8KT<2)OvcXn}m3VhIp zRPW?KMkuG;+x<&`i+WAfV4U2lu8Kd-s24bd{oJvBQBu)Dvs#S+%6iyRmDi0%xy2QT zo)3YB^)l0H9lbs>x+Oqe1|nBj(hEapVE{VXD!NQ{2P5;5n2WHaDDl2Z6;j!_z+~tL z|M{NeiRe;7cyI!l!c?R|aLp;QjEM(zo-`D*d$z@D^ z<=_TU60IRxr3VmfCqp-8bzjx9AHxiW zNzYB8?Q)Cxp)fZ91)+uLx7O)+7x+f>Ci zkbn;>wMMrLqkUm8EDnIdBEW>ZMz~`ylupm1x`4pVK%4bs14$?2m@fI-2ncY!I_SKU z;?-Org<}8^pIL1LwZ>HuchWtog;aUo9RY-!)pi)%VO(tp1S<$YY+YiRQP3CO`_jPP zC7D@Ux;}D`qy*E!c8^+L*Zqdo2cb*_zTmi_0sh1)UzURhE6Z06#YIjq8j8nBY?6H7 zP{|wZht7MQNQRJLqpe1Z%Qv)LPDW5HCuhEFOzDb@_Ak8k+#t^|sz~*15pFvFWr+N8*}%H*fyp;*%J z%B(m7M-s~$DejPv0Z<1cNgdj#*su{>M*!PLA%&(QI}C1~btDu|igbM8FB=DYIlRy1 z2OyxskIinn-(D^=t5#xtw|(?1>xK?al5#>6<{8}LG7mX^;$+tWMz`5$?pDJ95daBx z1nXbxnT3N*ECUF&m_~Hk5|mzw|L114TS>~LPAJ(dmVQkc5oI$G(r)#B_*_IK+lMRiHJOntA*8|<^Pf2p%~*okv7K&(yWJx7A@(V@Al5q54nvdg!xm@3^V>y=Do8@W7D!Wr`pz1pn9mc< zlE^rE@gj%qc1-<=UwmJ+Hoyeu(s~asKHvr+R`JfZ*{YZ-(Qezw4z(y_6+|*_Gg4_d zsqJm4r>J{6u#|;>rzNp5TXve%_vjfPq}BhUeRSmF+N~Sg2bb?>>Pxky)z$k~moLpO zG@`|&!#k~;i`S1f4{vSVirPDc@*(Q~-xRNlpil^L9O-hK}9bNNXp>1F)P+**bo%Bcr=eS5OmxvAO zlS2&E76rjVi9qh`9>QQ{AVBg3zAfD8=sVLQHrTcGgwT+O+g%h32HA?);&o!@(8t}o z5Clp<0IU&`^P3v0I9?(z7@1fhFO!IUIU;yY6vx7*6?S8iqZlKm5#F=48&=_#2vrK} z>}^Fvs%3Rzv>5am3@&Y;BxiZ8<25sZ2u6je-@KEGM1~LZKzs(QPyz0~*{uL;*xx zyau%h<;(g?Ild{WqSca7yy6{3g>BA1g8|fn#(RIwz)sPnGY1-jCbIK9x3R;5Rp?_NHt%cro?_n*F-tZ84ttD&bDIw47QsLMY z36WEA`pQhnc+Qa#*=<^3txcsetayg9;Xbw}3(DfKHZRag$WDe^TtZ~X7(vgp8ns$G z^F+iPDFCaL#stf53{EBy{SA!?&Kt$YdGHVZ3;z3OpH8vFfh2|s#Om~5GoSOF^1xu1aCMSrm|VzoGNm0-+A}#3sY~^HJo~7^=Ky)Z|d4#j(pNiP)8EKg#;gn zy0|#vKs7jzfDKzKJHRG`X7WL;h>IXn5pEqv2F8KW*`202V(X|^ZLF-3t5Kai8eqwU zi@CF8Eu)5%x+s2N^9AfS>N>~1`WBhuWboEKwNX;cjULdZ4#PI#O6F0+{HdTd{Ak+b zF-IYhzV9TQT>!~J;pD?d(H}>2$0c>gXvvN(HtDUp5I=QXvN1GT7I!A=1(q_^rI7Vg zMhLxZ8W%I?ygpYfmAcU;L)d z#l#YKrm=K{ki~*kbndNsZ;U@qgMNHu_HcZXW7e=t`KNs)JoN6hU&9@Xaw4oj2&s)5 zN_uIj815Gv_|T0Qh+uHc2o4g!5IDg-IYG*e!#WFnz~h*LoKMFD7NkJ}r(^*FfApkX z20q22hlIrpn1GH@9(il;#>Ej7T1Q$WX_GWr!vobqLzQkQX|B^~@@69WgDW!S)^{i* zyo@{rnmVL6@jkvV$$ii|VhEDc=Pv@#ci?2rZc%!L@L&vJMIr4e1FVPXJxfv3(;k2h zWTw}}P}H|>(;+cpT=T}hz{lmnZ*nAP;hB@4Uoy3mM8PzZZv{LlZ-M4w|LYBlB#0pr z!w9JAC3c>sph~Q>{6~}gg}GqATfNP6JPP-aQ2X_}e4t2BAr6^(3YqEPm#c$eyC;8-p;{ijg}!6X zcD4SbaTH$@g`{+w+OJ*O1Z54fIK!HT<){W_++ffJ-QnI^92-E2Hn1p|sAM^8sPRQh z;$%fk>509uVmJ?{y^pOaCgYl<)RN6qRz*j>S-vB?sj{1O9BEh;(XJaAifDB3ONqnZ z;^Uc>-4Ol05u8Wa*B9dIf5v}*Jcg@#)d;*gO$mN}ao+X8eP6iyfPhx1nc2WXxaI%n zUO8v0Sb|ZRm}gk9HCWnfXqxmeG?Tyl)U+M#b*j{Fp2hA|!A z4G|}i^9IOEYo=0HjkMRsQ1$C1d+?ZIx_U0~eKbfZnzYuGeJ2&f#X5AQJ5UqR3{hUK z%{CIz3Y9B_m#616x137n$l+6SX;lwozO^0kIJ5yNmq2}V?5K_>TvQ1Q45P~US{;pd zcG@_M8LXG_N9ma^23d2d$uAQt)zU6~N~ZOYDQDP~_DFTLcbg&nHT8js>61ujiYP7No<3$#&Trrg}1mh`;O2U1dPv`9Y#J*PFp@O zQ6!gs?c3i9s=IJ3Srpv1yPhy6wW2jGZ(~0xSrv>OLik@-wb_ih!GtHy` zl?gKjs7#{*&c=xd9);r-h=zUh>%XlC)fKs!u<1D%Z^kfQNglPuuMp4T7M~_;m!c!> z-P1DLLqdlkYeuUb<>>38EO@4QlU-vF2Qn%nXAJw~ynEXi03-(haU)#F=qrc``$>TU z5~;{}$2$6Yl@HTCM>L@tY8Y*tB2DN#?M$N}B-XDhDjS)JX`weA`vlG|t1_f%smzFl zs+hf#a3M44LX*@XR)>usEN2O5LFOsPZRS_Y9yGM3U%26!cWuFMWf=P$9EN! zEVDLD!YXCxD*M%HUOP~v26JP??8ThMT-B00VZ%0c9atIf*AaY( zlzpiuR?nf{ZJB~UMC0fzFGfwYp5xfMIUI)~7_?du5cDlV6wSW?(a?2}ScHCPp)N=s z$O=YKAS4v4u@^&%ou=x31NZPHiqN^FV<;O=V8Ou=n~`km#Vo}12|uyHxGcoRxfnde zx!#t;v6S|iG6Y4D5S+^hG`mw5^YT~6KOq!)|D~B4fqoMC$#cDNR#xUB^4#zIid}-W z^gso&+2eh*Bhx!&qpB%NHhSvc`;*|FqF&?pg+VcWy~ilHkp7hp@uL&EmXF@bq+QID zmyMTqN514l`8Sz-GJ$I3OI}F8N?!O<3~|K!UzR~83+WNg(TFijc%94H)tLnmTzQ^% zruri})2F$)7%o zWtAFwCoy_oGmU}=hF$FKi2fnH;0V}fa0v~jVg0)?4iYkT5q1FF;^`D;O-?Kkw5IBRt2NeQ;dNX?M z-ul1&Op*-iNx}Sdsda=2L$M-c56G^xU(Od7W*3S}i=-{jR?4&GFj|Zj77C@Pl3&PI zX3L)2dzo%#+*Ht>I9yC*ZiBKt(i&C_T@Exfl3tU z12}mldmbTt$x1NrepD!|-XyZ2%3x$elvJ=tt4rd8;yx50jRG&TRxiee(2rzQ6v1Ov zusG!F1|dIQ6V`ZAi+M4295dJx;ny%7#9Aj~tkA5AT%xbQ4z|J33rma|sO%D)op}#4 zh*qE?Z7$%NjhU_>m?^@AJ=G~Gq4l$RWOtLlQ8WZxXG!u_l6d`6J{7YdIbA9swiZPi z5~eC;P1Q)uwkHjT=XH`p3x+Xi+ipgu#d=5~;y)9U*76vFfiODoIU6jzsiFvqd9{!w z(-{&|&KQYaVWM5c01#q=FoKCB`k5SM9%lOGc|Lj9T(T*HD|^T!J21<|09Hw^*#Z`; z@is@IeoAk>MBo%DMKlHT57 zyLQ~q9A(eYZjLvHXmRjgg4<}W;8KmMQoNoYO*?VUxnr(^T|r#8sC~Q|d!MWf4$(cH zyA{>3?~8VEd*Ylnr(09xtV>)2ahtNb;~w>h$9>@KW;nB};Yw!oE|UW7%GI6yG}cXR zB3zn(nbYZuVI8~xIy_7gW?Nn599mHqkZzDpR6{8iUf)#ug&ng|9dvmac+tk?S?G_3 z^Ho~0sJX(kdR+M>bX-$>VLX2tU-0c>nGtQ)VR63`cLOitL@C57=XE~~aM?F*k-&sF zdtl2=#@;OOIYWVE?qs~zxEUUaNH{|gE5eh3j4tBNRseL{lhkK8U&=ZtFp@AkLMcWN z4N?@l`0+p{tfURu^?0}T>MTThk^9Wk;NDqr;sgs0nHT%0Nv2xQ44#rRB7OB|$N){z z9bLAS!AqRFpM&2e&LK)Ax*EZKFZP5taq?gjQN>j(MzM9;)7?mk{3ix(TuI3NT5R+( zkLu8p-65pegQ7~LHDEB(L3Hay!kRf1!zZcv{`Y1BYp#JB#3>$`^;Fb4#dI{%ofMJn z*uPw>Kbt8ri=~hYOyuUf1M)F7{UIHf`}m{VV-%df99^k?+HFriCN-4WPy)F{h)Nhq zH?&0%-OTy@tQTJpRVLV+>P`v}sZFI3%7H3`r;3H`B2E_^RrbHR7-ch+)_^QORbL*AfG#nTb`+5uVUEgsmj?VaIIJ0>35K zD5njc6W?sN#Vx}_P;U$q7)2|fD=a^q5L7NI#1EUt;nhiz zVfP!l`(l?Pun<{6)l0<1iR$9bs5*a(|Gq!tE7c%@9cGlV$q#H~znu{psl>>;BS_m+ z&c)=N4{;H60s?<`J}u;eGlN_d#T00IL3o4`ik`{K)TZcbSu90mi5ql78y-n{Nq-z%86e7BD@jr zhB2o011sgm;OYz!t8^R)pAI(gVM!HMY@Gp79E37PiqASBXmgXh zga8b^x`U6PKL3M!coDsVK8vu2=T^FdV9twO z<>)rTf%ne22u!|_{K)mOvbW`MU*+#{w~k>}3dS?pXp`E)umb&VQW@wI$8}nL55?oy zb%E50KMC6ukD!NmtA4exf02ZiCFAHLI{@1y2YRJJmX1DE(41KV`iEF>RNurVZIDu9 zVT#(hNRB@vI}%M$Y;=f4iDf*+bEfZdztpv#*}5q(ft1l@9r|pS1w#t_FLX+9j0fA|1Cb$$FpyET@D0%)(0WH{;~l za-NEe#dck;cK0)8mXJuwJW5}2dQe(&*O7Y`8Vl-y*EHrqxj|P+ZJtxU=W|$&6OFW_n1lJdfz?O> ztNO+vw39IL0zfBx5*Y&FA<|4QjVCoafvxzflFc1Cl>pm7E_Y(B39Z0A#yo*ah|rUe z%>VzA@^v-k_-y*a6z67nLa;5}VjGNT`Q_uju2j>ha*19B?VHE92 zY7Ofh?o%|Py4$~=U{ViK#9hT&Al#90p$SofF}6D2P@{|ek%V#|e52~R3i7v*j3nOM z%Ye9V=}x0kMy?DlZGu*8g*an^TRYt&>DRo#LP?aCgnd*lx0WjWIceI#)-=gO^G(_N zeb+xh?|96hUdDsXEv#S_jaRRBNAS!X!%KB!^KT0b?iqB~U zspu+u852t0rKFI)ZLn>jwH>1jjH-sbuezr4@x_ubaTpff;IyW=7#S!qc~jE%-YJ$k zA>&|dsS~2Dg~8^AOq$TDga9ELL>%L_7k2mE0I5_2Q|Suy+={vax05eYK1?$m_^iBZ zSWOvYXn-M=g956qASFgnRpt(;+*0X zlp&p*-1FZWksrQB1GmPZc{05v#p}}Cw0f*MH*;qh z!%N?p+vcB=B^+40_956B^!}?|3h0HNMXrDe+yiv*D++Pj_20_3r(iuUn-Gnzu6mC> z9)f@%b#l_wQp3AV{yFX*srI6w%PJ`t1#@_lu#XbxsSFG0^)b)U)2@~rX{biTnN_`C zxZASf>hhEkasEAtIm4Z-t%!)#>jMC>_LJEBW$mzmVe*~Z z0*&8d+v%8PrQIR6EZbIW)-l>=8F7^TqznnZB;D#GSrq|5TpHAsg^on9ScL({4732q z%J@5niVvG})!>J{B-G}E+-2%vSm#pkQX%Y$eMlrJ?w0dw`c&SLKRBVBg@&KrwO(3U zdLKO_y165YROM!7A@ME(0@HU6@~unpX;*3ihZsTzQR7rx5=H1mq{PoS$9>=`yTUlZmw#kNsC*Uk7~%PIAfE{R}K{>W=ut{P0*t6VT`9q z7zdWe{_j#-BrVgz_u3Rq9U7!a7OF!+N{$*dR~VS3&pfLn%(%(Xene;;+2)|o`{^TC z#`tJ;97PWv=}5dW6d@d^ps#6kh#v(mN+}qpb|_+*r6$Licw|K%dM6|a*Mb>Hsy86J zxTLuZ1;*gI#2}A|JHYi$ruLXipY|nORt?hhiY;-P$)D+p%U0XJaDVo)=ZoGWVDwH- zB*N7=Rl;jb`(3=1jSame+jfrzMsrL7OmCB5c)=gAo0#}xcbJ~?2)?Wd>DfwjA|WZ> z0{^>JQH9{__bkA})c;0ZMX5ALddFLq(1F!nU$}{&<>0e0oaGUJXd!Ld=$_3W!WJLG z!trN-dcq;trV;I67^N}i;m>#j**|tNSk_IOSMcd^FHwg%pow=>7&E52NeuRs|H2`IiAgGmL1_WJ$4(jn7l^td zX52Wg|C|LF=BOJC2y1~m3L$h{S%Qumptb_c2I!q4Z8LFJ7H=r3Pc)rs0^=hd1M*8; zv-r~bpbQYC4>FKtBy5k`qRk{gYe8bL#8Z%Yq);jX@?G$?!83*;+JFGa=?k8!g@=^y zf|Mm~IH2n&2j@lXqaB~82#T8m6k4m{+FYi0Vc5UJHqBy7YSKF!VnzWj;Hytvv=4Nl z9;72>#y};Oh^V!1uHjh7yF|$kS7%x6o$PIPT~ZuE2SQ2*+qCx+rRk(H8yAPcxZ+*p z9w6toD5#*8Xl)=l&Trc%>sh#TvSX2X5+Sf5=&gvkuG$_4Vpk^Vp{y)8PRftzl@>#+ z>PY<6>rI|It+f7(S4kw>OQc6lF}YjWMEI-`(0oyBv$Mr@0(}1enoklk9l#^kYBEvq zAT9>IY$dr@Ty-DA z;K@oxRbw5I+CHi}D_LJeOqEfNEOUIa60OPH1&o`BRais_;F!2%YqIY8h~jV~=Du}8 zvAATuIM%2?d}+jtiPmsjI8!p^u&h5~y0Nl9+5J{h{zdcqXP3yK8=K$1Od&bcj6+=3 zVAcDQ+pks?Z?j`4tjp~$WU`Byyc!A)<@PJ=K~nVu$^EOA3n{TpB!*%{m}MXw4~S01 z!X^WX?wnnfbfUkrHYnT>OD)%3IiZ?FSxzpgllh!kNAtSm4cTys%jw-~e=p;=1k&DQ zbz_4wmfk-|IIv}^;=fPR%}oz}KbZf&d~p3*Gq-j#ySa6=@Gw)^>$GmIE!PWsx0Z7C zOFP%s3x!M9ck2h&TW#t8D$oLL1k(^w2iL|G6xc6ff{_*VouEL0`pXt8Df^r?rXA-<1y|>XP=Zk zndQQFsnjIC8`mnrtY^iFFrcev5ry|u(aV5OQ6?7gZ|oM_^Cof=1-)f>9ieBJ zj4iGoXHDW8Kr}g5c+zN5$TV$nS|xFjct9Pnosu)%Ni=f3ARy4Ly$;w#04yS6$}ivr z7v~Nzqi(mQmzfuY=uwhp$PA*a5*^WO4W40IRh`7n@4Ox8VPO+-NEqm>ULD`D!FO>) z93h{T8;rN67Cw`sK$o;070I5%EW9ckSEHyn9A}|(J_g>av}_2T$OMWgSH|*0U5{tB zsl8LHm*UX2B;KKMNP%@&v)41M23|*15`8r)J*18eT*8_wMQGC~E1JuImg)1F%y`CF z*U!RtDC=#7o(ai|;xph{vfZ%1~UR)_Cbi;tywQ{UDBn zK`kq6E&iUK$OUW||2qq31fmx9GI;~T_{P{OP*&i7HJ^gbSDr@b7a^66Wv2kUu;tyYKD zBjjFf#g?Pedwe4!w$XIiKz$ij^Qk)Oqsz-1Oj{rt8Sv^UQpV7QU0FPV2u8-I@}5F6 zNS20Uuy7!uS_vv(>`=*FT{ep^oQ0&g2&#xHhKGW~`N423gs*onFMpj5=?Zg-*4eqa zQ};QB8Q-EOBl!TGIRlB&ty@lF2p;&<+Eu==d*}S_Ta5M{eZ(uc2A(CzY)*ecZ~`Z^ z0;@R=WdfNi&tZ_2uHZ#xcd9@heFCXqZX$qX@9JDlt}xQBmP782AWNF#tasVu|4ZMC zYW-=qia02%4=Kp>8L)g~jFMmketDcOLLIS!9?4Fm345Jv6&j-@fv7IA-qTu&a=89D z%di~K(*-MF{`IbZKH<{glTA47A$9>@Ss)IaK>hbzwFw{fT|yltaU9ram&rK}nH?X4 zB{wh%#?H=ho_pC8#kwy9JKd^rxtJ_)ByxS4g9Az>^9PmgBiY>SHpQ1_L#5A{)f$4Ywl*rid;N&{3M*_VUE1gR=nXb1>r!?s@B;tSU zq8+u_kq+5p+TLbII%tz69wYRQnCBQFIJMnTf<-b>Z=a(CjZqs+nEEKOBAK_h(XnDi zvfj6O07cDR2{9QfmvDp57NDfx0gBB`PgkEFmJS~*&+n}?a=DfLjdJ&K>%pw6|M$<&z535(2{`+627xmO{MCTK zpZ@J1eQkC9-&6-lwdlxOTS$T0MTxATpkvhZHO|f6a~NVxGNqD) zY(*~80RSyGB`r_0RZKbOQCAE-C;HF1-)Kk%1RAyQ?M&q!(g>MFo;#5QBu5;jD{y+UoA8QX_+?6QS3U z#1~f@a&~i5#T9O>F7$m{LLZca+XZNb^lm_31R;n3-IMiRv)PI`Ow5<$;bU#)W2;@) zuY<-AXKmP=srSO$z%5iy8UjSBwnn#RMWuSR^5`>K2;VX|bjqLhPsch$VQ($MT8f1N zYl2`84Am&k#cL7-r20z=RK>9^92GR$n4vQaS0x)mWoN@k(D@Me7%pX5wSg+Fvb{>2 zco*WHsYGHBU!>hv2wtQEu1d&rBhDP8J;P0ZA~NaG;$@_3xD(!YGfyJRlX;$ifszSwjz#GS@If4w79bwSmFYN zza7?+uPV#3=A(WUxZGzTrb7gzl>f?I0zS*t_$p!Of}RH})fWC;3>Lvvs%I0D8k-C# z+l{eT_60H@3%{s2rNiCRPV$^87#+bMXI$OrOtq`$VQ54G!L2Hw4&m?I0q;Vqga%1 zhcZmUZ@we^TUJp>BRM@HAz&sZFvXq2ixIKkO6p2Z(^-<-RtWGUa!{>9k|lW{ z%ekJ&5JQw_O3oBtP8FFO;)aAB)=kQ`jy-FCP5 z1P_o_DXMAZMUj*3^i?|(LQc3ff7PpT?NP`1+Fb)Ef{Y?4=|UVgyFymSH*ZXi8j6~@ zzveK!(G~r5n;%&nX(QUvO4N$|9#C%yJL9s4S7qv~Tlj*Vf2%jvtlvny3az4tGEyAO zKw=(gLoCR6mk`uHf@xhxJXm~IavjNuJb+h;mn-qYq7rq$hSw@+X2{S9pPA*|fh69i ztJh$)7{=_8I4peFc%)YRTP%*Tzgp}O3X4L|RPIZ-E@xU?Xm}iv_nD%869P2)72BONM0yEoDoHCD( z+080>j#%6@9vH1z0dlvYEdVap>CTZ1$|Q_Q4}+8mz{HYhRijSP3r753IK12l~9_b0xK2nV7M=^K$685j;UE~s{?XnYDhJ@v1*_XlucO$ zZcwEv?QO}#Ln{&-GsKCgUN-Uv@enBajM%0|Vtr4ac;i7_v;6#}Ez&9mEX96;X-ot& zM(MmfD$J==>2YLxHaJw2XvEp3t3V@)TOC9@RRE&^5(2;p(-11k8)s2SFcbDY2tB9v zTB#agVSL>@R*c^`-2!-7cYo~8lOo{fSGTSWZ9SesdrxnDIbA-PxQ`C@lYNk$>#lp_ zn`lZO2HQ;&MCyfBr%H?4RtIV!Z8dKmMHIlw7A1F#M(;6r8^~0>$Gg39N&nviXAM={V@Q(hfACY73(3v9n>D0nWRVG83g=>hRZm@W3!?@shwheqXf3{DFlJO>uW&J4UO-*IIDI% zz^ugidW{!XdcUP~n4!A(!|hZI+@djvGq7iVQZ|W;cmwy<)5TV#=uwk=lIrB6O6td@ z#1-S@SC^KMY%4)JFI`!&WmneDUZZP_+-9Nk{EUi%0Eot>xG1-TR9h9qIYo3p+si~w zA>#ndo=^yky^!PO))b;4S|LwKy0YlhKCUA9pN(4_iHNMCsSYr@K=WB`++oE*$djiS zP*@hQDMFBy9OHs9;wlGbZp5f5APNkKYQ3eVkJ@WtUi>Z}(R7XeHOSVXRX%4Grt%5R zRC!f8OWedpNM_v6#DyNXTxfyan)ed^z^hN_tCIMod+zfs);qq>O5*G8LnuVXVUcUZ z{M2xtq*+ArlHSRiolz36tT`i^I38CUKAGyp#KjTscro!Yd2j0GkC-$?30^KiAeWt8 zJi+un#A?N?9qf-}xHF=vv z$q@gy;+sdfC>G=GZ6!)5NQ`cP{63;B;Kr#n!5Z}W57HMlAqgF@`QZQIc3%t`^#8Y4 zGKK3m9&TJ+omVEk?6T^YaVQd~uG{ z%K4}g%~b|`p`)hYEMj%$4k@9S>X+}V1-BZ9!SVqOcuf=k);E6rH|Z71(0*^I1%tVC zHi>&F{^rHIF15jBO~ZDvC)2ub>Y>n8%xq9}#UnP8*G}rZ^qQ1kR&d(O_>^-7;<>_U zCo4PnOigf@k`|t5DKJuJ3-n$S*P{3h^kjKyVXip$@cSYV%7^IG8Tb@xc}f!$uy+tn zoCnL8I_wzP5J7>iN%BO8R(eJg!q<@*p0E%k0@i|+LE?<%6AHu@I_mu|cr^uk6C1F( zT4s9aO;>TOA67mT$$cCg?OiOr*dARRCZ?`7#j6qTB`?SZfH_lP%hS|n`0Zax?V&&K z_8Q@omR6wDOl@?i^uf2j@s*zsHdZ&cRDYXEn#p8(;ecYHMKH zi3~;e*o-;7~tG|X33Q?S7SEp~4(ag-0V>DFgS88BRqZBe~V1LgJIPY%- z52E7k|IgmL1;>?~XM&Vk>Xt8~c8~0lZ?irPuA5DnRjm7sYRR~gAOQj(0D|CUz*AMH zEt%Kx_GQ2S&&+eHtf~VNB3iAYS|o5zp1k~-`Df;z-~au@;wrbZTuTDaM(6+oFe`z# zf}efkkBvJt;@Me&gipo5>QTpmoqna3I<~?j0>`B zirGcT19}L$l#UR$vTQI+4E}Aj7R(5XE^VzS#EyviG=+Zr-9P={%fJ2o?|kh)JZx== z8H!yUW0tY}v0()kWcY&NPy@LDCYJT4XOvB$f{3y^Y-;gvM#co3NPDlr0 z`PSh(xmfJ2ef$l3#JEkthd|kTb`tK=hK0@DK@2Qdnw>-B*2>&bExCQ$j@-)Zr`GQF zr~4bd<#_6Lyt#8#_h#RHb#3|EE{CBv|7;Yt;l?qP389QKSXtA# zWW_8eWAS7rX~pwqB3I0&Gnq;;U9m>2tp1EV>+7^QA(e42CJVw)`}%JVEUVY)){1H2 z$n*m)K*Ff=fsr-6isvRKDUDi=yXoZVX!EGC0UP(8L7Ea9MBHhJc>r`bd=+qx5_5(8 zb|_3qIN*@8_I~|0acO@x6_pDvxjbUqP3(je%a4PC(mDY)DcsFr{o@JDfE;QUUH-9s zUmSs{8BhYWMxs_kJc#*Jl8%zH)?3yk*a5m0%{i=yWOi0P;Y2hM{zy>obWOxg6Ijhr zP@Sw;ZCpJn;o;zpOFpC$+TFOdx+u@LLJ`5?6GjlZ<>8(qCO5bb*4REu!oNi4dn~{3 z?tsQ35&$M!QkoqL1;sQV;*|a+w2N>4JrqqO3ZUZHK*oq8wzi<2I65;CB`?^2@`oN( z>R+&LWBa9S=EIk4971P#qfkHL?VvNj#Bh@B^etu|y!Yp{mfdkzOCUa236tX|JjTc% z$Sx_q&oCYS$N*piauZU4z-QO*l3=d4+f~3&)`@l^xaeXi-VJn%yc!_GDOnxS>rgS& z8?+EGMrt6FKQYz`LeVD=P79`)1_p}gL0W=6lPFN-_kSB9U0@uE08#>*XPwwI#Fhr- zwCJWs3^TiqBHituzbA$+)4cQMC7PBwx{LSEc0rdXBDY8@9HDis1VJ2mgARhACDdu+q@r2fxk3*2RlBcJ%rk`k4u^RM<)~-qLbI z<-^8?)c{}$oR|uf^6}%xMQrErxzXx0AGYupE#~wAXKHl#G5zg-evHB&w&-vF^I{*5 z@t6A)MacTiL8$`eLWdjF6+WaapLJS3WbNGd>|=_fY|D5|@_|{4ku3-j-YX;#a{BSm z>UU8%PQL@y_dWMi-%0CK-AUAv^Dg+ z@zl}t)K^RST-I}mus>uK#OhTilZ8_m&@rH?nHrQNb1u zCwwstFb*4Sai92HlfnJ|GK*a<0ph3u;YT0Rl{gkT+}bt?K!0a`dTx0hJ7zq_^*A8b zReH?73;LER)(6K7x95veI(5^<`_2yhr!mWx%?`fcSFm6p|0e>Si-))urVCpBrx1S% zlR_|sy&thUbl$mWunJfP1_P{o1`mFk2V%_)e&)+K;msJ)=zGUYD0h{%k2Q+o)}1O4 zdocy{&(rsB{Tz<=C;q z>qC8hs=PsM8A8}8uXJ8q*lBNejU_qNE1{oU9{sP|8;7Z=Z?3)g z=uh}&lQa62{KoCo^*yk2mRbtl{(GxlJHGTN2KmV z3cI`{^fOXTr15GM=Ni4Nodt-`LLtPR^v&rP7k5%WZCx3KUVM_ind?Yf2`R+lb4F6) z`~TN|>cXeKfxjkyCK8xPU?PEu1SS&r5tYENz4p&vZ7%=%&pAl3c$Dqj@o3P}9c=+; zi&$@D$2)E|GFGV+D<{lYITpvAb}DPdW4Tf>R>`DeRy-Aq)fYBf*y|Lc?7D=g2xAW6TwJJDw!d2X(yJ@W-)uWQ;l2OJM-^ln z#!@q1iX~FnbS$5( zUHg0g##mop@d4{_bp>7vK-O`2&0qsuqH{f6{NLBVWn7>U#@;14jeADuO9FD_X5P5}%6XfGX) zr_%XYJReDy%OI*sq$=fH_6&dl>q;Ensd^4t-m?U|*ge%(?xL$-00YY`?h2pAa^^wa zu5VP=PF6Nb>6yE=wO;&qxg9C)ZrnGg+m)Tg@Co1qGd9j8^~O0@24PLpNxf-KiD0~G`iyKvG*0x!J&(aL zlpQp6#)i3+-Z1AeT(3GHgK!n}+2>w-KBRo}%b5>KZZqMK8X-)cDc{69gNo~?pQ`w2 zEX*n2{BmUA&WErT=9GS7srhgg7G{Z92_tadt~oNrO-C!v~Q9*@>XIx6B~1Q zIi-D5^u^_r_RUbIb*`L3uP|x-+*EQ3vBI1}3THe$)B5S@N+IkTlh#j8C4{qBV@@F@ z{RHDttOC!Bo^fZP zz#U{?7?Gdxq|A()l%Z94X7sE)6BT|cN%T^lyf#SZiOxj{|r~uoxpf zOnYSMBcC7TH)S0O|7d9dg|{0#ieTPjlQ~L&c@t!#Hh|$X zpd651*#h-52alg3s!m}lrDQNKQ)Fgt7nx26zN9x8MdCAIW28qBB^`w$zs*SX2U8E; z`T{s-9~C}VXdXvm=yvzPAp)B;8k89r53C08+Nw8HKZVT|A!pRs@pf>%MTm25jObuZ zJRxq61j3^Y4h~+_-$B<$n&lF@yuMc#e-oo05o&=MuGTL`L|i}lOBqC$XsFEjv8NVr z9l;A9V!wn3F9oviz}5ow;aU9%@;eXV6bjzK0|y>|<>1Ie@7b{j9Wd~o0gwg4)SZ`9 zm7*>XL#4)1B5%#yCor_XnISft`UQG;Cu$1!xm);F*cacC`BqwIL#Fl*ve!a1bMy*} z{^f2Dk&%7}thy&Ku0rJJ+rc^wbn+uFun@WE_pK@y9=Xo^3#?fbP|@tzmS)kKRj)iZ zT2n(-Ehih&*|f~iDkbzgVhBs3<2?&pD;*+th7&8e<+Tf!FDKkH60;0wCj@aMu3qUr ziiWx1n*w67EEpryeF;>u z&!z5v6^$fM>WA3h)Eh*rjjSF{U3=Ja-~1}=l&<#c{1`8IEis-vY#Bx*QUOy(1nl&7 z!MG&(BEZsZUjq9a{)s@~^$Kzmi8+EN^SMNlM~#9J&nIG?Bj+`Q(e8qO6_F(1(pfMr z&Mz#?Eu`_DO7gyq$LRH3eqm-lr+J;=*E7k5^juu?8ZM0ZI-8!Ko1WLa1~WTe$6|A{ zxrF9*TE3o*XQnl;5fOsFo{pz=HP6b|*@cwuHP|`m>p18JdSuoCKyEr`_~`w;H9kUCo^~N(E1_=mwpj)0MUU#sZXu66WSX>!|B(l z(^ku!5ob}Sm$KG5P2|}-y4p0iL&$RUVmMkk=qsSMAFk@qr#oGr`_|eQ-%E^MYN^>n z)m#Xn`j+4qudLpFq~sS=tE4{k63^B;w`k(JDmg@3hWPdkE1i}4nBpCkKe~91|M$sP zF5th(pNRw}68Mly;P;oFeeBi!*3OCk!mAL<4MW*hY*hGL@g ziP*;o{cr@tZl#>fWRhtso=C;AxpbnGN+e3fM8+~x(Sk2P8M81gKXVx_1#fp{8 z<{{W(Igv}4Nh_1gglNQIrk*A&Qj8w~uSDEGlsV9d=`vvwk?IPVw8~anaCfz_ap@X2 zHkOwR09ctq8eh6-bvdX~P{->9pK&WqC>R9Cr!kTSY`R(fyQc zlc~2==Wu#yoJGtZP>cbLD_YH;iqL}q+agk%$it9B$bBHw6WO5%IYFjU2dK#>W4PFZ z`I8e8KN1zAJ)C-tjrAr`K2Djir4|Hr#Cp3#jN+o9Am!;II`|+71R&HAn^Q)2JBZi7 zC;9WRz`ZF*e7v>RaQOJEdzp_x=VQiHd!08Q=r=Y#8V_%)^vP9rr@mQRS>wV_&o8TEH^NcG7Sbpes0eE?{ zOaU1v2ZS{v(l`Iz3C$470@2AZo5)ByF!P0~bmzTPW0cl&B_mStOcewKzY*Su=}@6KIV_q@%#38gvU|s{n^IL#y4PyU za#R(10M4>AnfTy`v50GOst^Yb>)f=RrSupajNR!6fU}YNJrzt@J=wi5pBUs zH0I%yu$G*!niyl27lTt{w^w@MiGF4)LpN!68YlzTzUupT^skjgCWN^48K??SXXsOe zu7Rc_^*K6a$|3t=4d)@EFGy9L29TpSJz=$kCg5-jwO+Fkakei|bW#D(RQ7LeJlaI1 zAw|g!7O+So5^9~|LHRxsx`FphVuMu&wU`oQ8|GiEDa59Q zg@Rw;S8~N^ScrybK}B98kD@m1c&>F&Xn-~|K5ck`{~!d_aQ&} zOsY4Lz(fKQ2}~p~k-(3#1itd<*(mVa$!q`k`Hwomi~@r;$T5-G6m=ge$ARxyi} zN;;diVpb|qva;C_#;QP$*m5Xi+q`4#!$V0*fGyh?A_C7>NbKVv@R$!hr6O}lg)B{z zK7*h?;Q;f%PChd|efP%E?B2b#`ax^GHoLWOr+xc&Y^IvJ*<0^-@8l0x;_1?jh3Vg} zJ^MHW{0Crk7-wTmM*B8StFQ)wc%WEH#4R(E$i_bGk}$SFd5-68 zGj`654S};fTihhrk*o-Aa4MXh=c0pB90nUOzKZj zO^n{5W$q!kFNp;4JP_8FeV~chpLh3wRN}4>))lsN01HBn|1j(EVW|mLWC|eO2l;fj z1sg+692Cg#p|j$sZGB5pV(TmFMJ@_+jr>j+YzVtUMi%*yyKq>6R1o5kG5vPCDy+5| z3hvVwkSNQD%FC^huwg2|sbp&C)v3D&0KViT?y+rodTw;x=wu_uj|UhGE^Rrad*+@% zz%q>k(FR~7aYt<~f*YR>exAc4O#m`CE8$`Q6NZ*hN$Qd3sJKm0q%dAML_H?GQ>Mal?HNdyqb|~!w6*+Y`ogWphkS?s+@qb)?&`n@io$eipKOayCsB6A=72A4U0NP zmy8DuNr<;|R;O2+Dj-rM0N?T_nDP*fvG71HTfx5fCZ%#PI)h`u7xEBeWz1rAh8h@! z`4+n%s-8y%wH}%Z6(6@!Afh>g^nLs?Tk$tDPZVBnbE%Htp)99Wr{t3g|u55^kT9EQqC>w^w>C1IwBS3TdL@M8qmD59ZRVKm8F(^-8uBUPY z+0!Rd`G&0Ac<7TCt;mo-eYu{>5nxcC=#-W7;hhGsz(L6|AW>hgr*Z^W)F(P+<;J6@ zypm%$q`q9YatxN#Cpu;2eBi6Gl4CHYzFfC*4As;pI%VZf2jyZYsJ>jcatsvJCpul_ zhR{r_OdQKN_BLvxN?Wdj2zm3cQw5d;Y|gQB8i8_tZl@OMw}Fwx7!p4rLfVe5y-&Bh&-AvP4g{ltsILw(TW0fncTBO$7&U$`Co zv2ZxhD;;&u7<5O_r&ih}+?uUlvQJyBvqgUUR_Yh;P5s*HG!cg%gyW&pVsOvu1fB_r z{2skdj#7pC;(su>Z{LFX;?f<1W*(u{Lrfa~Ipqv0>r)g1Guy93&l>hUTC4cWK10yA zIPmG!kJ1(X!q5D;r&lui!e8=X&!=m~42YL})YI!Nz0|@T^ynhx%np0ww4L|B@{*5w zJ{32nQ(x{uZ_J6nKM!B-F>g$m8h_PZ?jbL68nykBk9ecCx;Wx#_7*;SSYotx=DmA} z)zTj*=fzjc#AxN{cYG$urG%*xoQp0KqQdu<-HD?%dA(mT_#HiwFU9jGkqD=aNJ@(W z{7locv*~Njb3noi7qj`9+`__B&Lb+58Zsl=ycthe=@bYD_O|n>V9B_At%$J6B1E+| zL8Mr{d`Oy1y+{edb)l0oT>nvWedk3#stp^Q;dG?Z&2V}?IK$_%$>~%+FvAz}*>o-` zM*V;WA?T_ue|kQce`X<-n2iVWpGoEu3$Y>j)7DCtKRqAJANY!VVm^@ne0)ANpBs`t zo#S=+)APanW68uqCK1R#KR-L8G~j@I=)9=QpPmoqpGf2~$>~7;x%7N4KR2ZQ#IUQ& zpPmoqAJpJN4U6d~wPq0^VgnTrD&F^S;FBTMBc~Bv_2{{#dI9mu>IEiofzbi9So^9} zxHva6Kew>pdl*yz?zclKOu=P!6{hEd6%LNKQ&w1v%onRLQPk-wOwR`^oSDuhvva-@ z3m3)1Ap#*2ye@xwKA8VZGCr5cx%qns81F_3b@B7YY&|A!8eGffrg8b$w zZMRv1w$%oIgWo8N2{2rcv$^rd!=>3)Un+8pz#8eV9Zo#D|N52WysI zKgBIUy^P!_aYRtS=)R%E#tbvWz&p+P$}AsHoD+&FGf=;2_uXI>sW{p~0mz}gbSp@O zUFVlhL6lw+#mR#F$v22Z&X*cWjpBq4%YRkA_I;yF#lt?DRZKe&!K0_Rkq?bp^U9A} z3>bdBLq19nz2n2^@{qp_P6uZ#=`dY`fe#{-m*G<;{U&3sVEx}_ExxNRFAuDyVUN$ zN1#&&aaaMmi(T*V%Fx(-N z2m(t~kqZ$AMM}uumQV1B-kvyhg&p6koRFWQBJm!c#2d9z359`Gm`BG-zn0EN*rap0Kv5lSA`uzPub!YvU z)M5d6!7kA06MeZ#3J!RKOCD$ZqOWv2TY5gYvkh+bdEYwnXgN9iU{mHExO}_&!o}w} z`%KJ>A1w>&N7V}VBV=CuL7TT|{n6=YdOoP5Pj6m4JM-U*8YcvUh;xJo*k0KfnBhlf zoCvV{IN!SG`2gFGb3zwi3U7a$$Oh~H;ydBZ?=@10FEsoBP9AQ(#n*iN_PPF3ey2I_ zGvCh{u`rD|`?LHNxfGvaz2JY}=|4akg~Y-0e{p4@)#%>p-9M~XS~rrbcW18ODjijC z^>aCE_Wu1!>fZI8q`k0u++P;_fB)&iC;t;!0w#YZ5|~I}B7unnez+y@mH&AB?A6z- z<$v+VuLOOVeM^bYkW5a@#ROnHrF1cqv&y-6ER!gea%L)%NM;i0%rJ(?ky&~yt}kjj zALqKvM)4yGGat@(+2cGa?q=|vxQn3!yob%qdkup$-fI_1DScRps9&Un!zm2@aLANw zgW`9)Rqu4Hp3OdxYxbiVPJU60#+4QLykM z7vkAOB5)V6ae`&w+?YHWMlR$b%a{CT^dbK^X!95cE&KTl~6jPORnkbka_3y3{I5f>Dy3;#kgmazb$huTQ6{g>DH^t1;+F#kq;9pNn34{J3X7Y`y5v6!^{a4sL{6 zP-8-L%4oE02x){UV|2$4o#`QR9*w1CRl#f$!MWf=l>x*Upz>3ktnLyLHKtoe9Rv%`H-26R zHwWx;WIkYbu#T|D{S=@7U;k$p@ZaRmL;@2DOe8Roz(fKQ2}~p~k-$U(6A4TtFp5mjs^u(#Kwn{8-5@m1-73^7flMk_WL^UEHp9cJK7>=1z(?ZqDz_R;Y!gJd)vjYT4}y=LzI+|Bas+p{~Zopk?rt-N=yxwX=qzQ4a` zEjJHmGP8%^3jde*2euxznZ<*I6U6EQS45`>~KF; zUHfsg>tnC~{RR9t`7@EgL;@2DOe8Roz(fKQ2}~p~k-$U(6A4TtFp zh&oiNBop{kv~tOOIT;5RNTwLe1w-TLGx6X^Hz;4@EnwfkQVs8Q6)M+H#;{1SVao__ z4e%R(@usoZIzZqBGNj)Tjv?T`IHY2V|-LnU>Vn` zyQoHk9Y#+*eb(zDKYC`C5UIG{LrVd@VS%8?OTb08TO9h5(jdY!K$Jj6QcM@Ox5ei~ zOaV+DV7WbxoPI@!9HCWgsy)&pUXX>5D&POk@BUkcyNQ+pNQdFpqS(Pe2yX$w11v8} zLY!K{1N9pcX4|NX6d!!+H~!(@zo$kd%@jwT2M8Eyfo&aejk^F&0@cYuRRBiX;{sI{ z-~Y}xze{;cdxo&__H?;fZ(T8#xpS@CDfH!gzXwS^Y+<;9>x4qmKu?q?6b=nogv7>Z=b=wyLJd)x8T}4JRDH!0 zLd$HS;t0VdXI#fTz;L5t4-w*?+Fk*_35KPNG%JHuudlB_BT2R$qhocOb@Xk!MS2R= zHv44+wt{YzSZ_JUPNSBLjV@5*2&9B5&zb>LJZ6&-$2>PlnN+|4@+M^RjW3fRpNsLx z>tZ)mHhYLKGnI%XQju6X5|2SQ3U|YT6O>xGzeW2k8$>L2jp<%GwRW!^iKpYaOe~+v z=91ZDB$g>>Q?W`WR?Zc_NHDi|AWX#hdaF|Jy#rR6&Rd7?fFt#-ef&*s0Ar&1usZ#) zuOw)OiWlUrt~~T1NXZhUSu^o6=ogqwuQw}^>BPO`o%G`T?5)nhMtLXQ+T6{pc58jB z9Eq*ekJCq~Zg2TLtN-ft3Ww%PXqM68+ip5kunMzq!DxJz!%B7f< zF%yt4R?obQ(fB)mgoOSTe%Z2m zD!khvxCd#q7wVsvbu7`X-kZh(X4`b93w65CZa3^p#+-S41sq1SDj;ODvqunx^V*8( z*~Ri%#`5_#&l1Ml<2TGls0Ql*0i`b^D0%}^G-}+ipz5*qvd2f0VwUk#Dr2UbSp9lE zXsRN}k7`hMAAI?J%CKo3gL%k#%ZoPp7HYM0>Yc+^e*?R~M=14dPd&b)sPaHMQYVEdg^3y3KQwNJ~Ac31HI?|kjM#;Uh{G|0evBF7;G^~P3|A{5FOmqGE=2`-)g`hNi= z7%H`gl-j0?7BLNWy<|waHnFt{=Jfkt!D^0J;~1;hJe1o_7BxYU%h;l{C^X)KDYYT_ z;M>1t%tC?~+ERL0Ksm^xiN&y0#XMjU`ab&pcmC}+XrZT_fK{!EodIysN62SUBNpgA!;Kw!lGFRV~H}-l$iw3ZqL+3>9n}Z?}gi66|wnieozl zk~BIPP#rPbDLX9qJx|CG~N*98|=DcQok*2|K zob^haj>NDS$DvYBvl7RWnQSJROC)poNGcc0r}LR|8XkjZuo6qj{D`Z5?NX1W7X74I z=*1F>cfobOQ$Jd)CU2Xw$vd6t#LPisW3N))wmMrUcX}(a>B>e|6!?>;K>D|F7qN-+f*CzjJHZq~M7JCKB*S;Mv~Cf3o>27cP9}^3SZy zZaO!0@o2eSvaiOYfP@fyBEnb|t9&)uG7suizE_JLHyhW*Yh%3!u!B{`6I|B;6EIb% zm<`){+UxeMtDMz{jGj1`cY*Ato`$JMY-cW)SUx#gttI+*woZ=AmBaF4%IeSM%GpFI zyvMmef`&#f5B;REQ(8g>xkO4UaNPEZMw97 zuxyrr$9VLFZ#mv!I@<`Y0h?y`cuu2l|zp2EGNP0e{Sg?q*JRN)EkSXz5F2L=M<$!g#}9r8x-3+}q9 zD}NFF@lV&U{>?i(Z@lrv#b?*n9ofiE@KN*y2xM`OyGSIzqV9q>7u|Z?p<8=^Nl0XS zureQ*jXoYd05x6$AQlmANL(MlZp~Tn&5nl=O%VOk_vQ9si!S5^wePZe;$D=w!E;1i z_)}_N3q0LrLwzAx(4y`Gt^w+f%NZLX(+L*RHuwhyYtW?%v-{y0VV5Kuj<};?LLQeb z@2SJw^8oiEgyoqs8x*05NXLxzcBzgVMbXe;(3%!fFlqsqpNP#Vqr06d*oLWz=fPC< z=7WJ+KYF{?>vinH)vH6QJ3yM&EK^{rm%^H+Si;_Xz@sS0#bi@F0~$dCtnqtbPGaoAM|lMK}et6Wwn@A>rnfZ#FHXg~}XQ+!!|_njw@$&#YoL(J&vF`2<2M z+wQy<%7tYr@AQc@Q>5bSPewwBiCThAY&RtiF=~iUQ6WT^GOEzebYUzJYzBeyLHTSzy!k^(H6W!V}3ZoD)HbPL2vldVk!+4HxI-CHRn)1(#k_abs&XO zK4W7QX*yD$qf@3FvM*LF4-tJqs_MQ-IiB5w&;%NSe<*6H00=(iC-kST zvP|F%1b!wQiT@*^8xDY2Zi{V?2)_mr-VG0s0~~q4t(5@=YM1)7n_!)6l+2DQwVzpbZ-OOMy%Ra_Zm>6U=2icyK4l#=`a{KLX?EoH5?@#3I6~3g-_N! z2aCy%6A4TtFpj*y~j)6+TF+RJ`(| zt=(6&<`MjqA+vCM0qUB385mtFt3W7b*V;q|3}IQCsz(}d$pQ_o(>^*K6x(G)iXCHg zNYe7hA&#-aA!aGX+{L%k&M%&g039p*#~$|^I)7m|BwGmLeXR8G%>ezbs)4XV-~dH7Au>EjzYyAnEKIKfs0^lLGH8&a6T%?F#|O`l zjsqz3u?t@Tw~KtSn?NmndkWx^Pql$?N&el&lY0_Qq^icEu_RYC3&&Hpd+J?q#7C%` z(Ur>PM1Dnas(ocaBX7`A6Ty757xnK zGU4=ychu)};-mBJ2CQ4_9Jv|&09tvj1-g##{}6rfoYUgL;4pvm_Q<&b|BbfcodTX#gPH%lBLo!4K~iIb zpumf?_Q@QYweB)|wa9EBeMdrX613{WZkqcAD`2bpQY9|1S8ypZJ&I z{&#j;v@7~ZGV)Pa8Q}*HLZfE+ zpT7QgAMff?<)UV%js(Am1Z%nk*{DOjgJi#eWS`R|%S3@YV*@17I5o>ZkA&K4rK8O@ zEG&%OS4AN#*_nE_h3S-qNxmb%BC9&UoWU5d&I zlCNg@AHV*07yfURiAtM(On<~?Z}~3 zEF#J4NOBZNl8APWQ4fo&@o6O33M7a}!GU46BBg$vSjmvhKSHXwKNU6hC-L~_)njDa z1$P*5GI;Y7iC5~57<88kgGfT0CqMRQDl^?D+Ixr}!&k?nz6u5^{uDmAG3tYORG|(d z_AxH*kI??t@X=>ReG~x5z6#~@H-YqnsM=(-Zv$9}{6C5G&Ip%nA55RX#Bc##`0Nw- z?A@`jhJS$+lSm&T?KwB_UY=(Fl04`9|g|G)X^wNF1A^}nBdL;pWyJoz(`z(fKQ z2}~p~k-$U(6A4TtFp=%&!!op^@b|+tHZT9cfuisf)ooyEHA1zc7(kpUrBbPmFo!m$^lDAGO$?czi{jWd% zf6h)Hmyh-jO1WD%vQ;b9ztO1mZ!MIq`|HQIXYG`$dVSe=>S?s1}tmUJX z9c$)pWU+m}wOrchE}od{_sjD)mj4OT|I}eR+1`lnHs)8_{mrA5?rd>?FR@|GWOw4# zlNo#S=7F88r04tVN2Q;6{jWdvpLh0dCpUI->HU-HvR%Emu)2Le5u0C{PEIf1ZZ=al z?jJAT*(vYO?r%*0G}8Z1E332hqz2l>UJkng>HSd*boz42z{LS)>4fEdZ#71LwFZKq~8}`XeKT&D! zWZToT+mZdPdv-h#GfV0G+IC}kcdIntSgNjqEx583`za8meSh&*SGAQmFnJX?Pl(Er2jv*=I?Kp_YQB~ji20Tue6t{)tRNv zR(_=yU)xVrR_FU$C-I%5qh@2j^l7C3ou#eC>*=kX&0B}oR&~iLP_hfB$ zDS0OqzjJtF`_@|b$UOW3%Q+|J(pQXcQa;n zX{}mJ&Sj^666s?L<NJxsqNcoN@RzPXui)0zJtV*UB~{Px|A>`85UzI=N*v3q+tAJ5#marbt6{!XiQed+q% zZDcdso2N7X|8B-lj^fANMBU6??=`n?F2wFsQsudMJ9DG9oGoTf786?=$F~#tnh~8L(=+#WS9_hgbZOO&H)hi})(@w*!7RFyjI3q1Q*_whIfa)jo%645 z-q^UcG`C{kw^p*P&iejIeR^Xvb2oFcay)CUZdjPa+5B2#@#fu4#{a(>yYOo46FGc3 z`7@EgL;^n~5;#x)|Nq)}?e*rbJp0?v*57#J`tq~sEg*`AgU@x=SjVG#o$a$@z~8RN zIRn<&r*xwZYHh(-?C~ZQ?+I3?*u9CT7a&|0unmMI==l|FSkiU-T)YS?%n)~gxe?+* zLfOf8pBwp{Fl>*fo2X?ZP9Qo@JI(|7dhwzmY7ho*_?7Sd_doV}JM!!Q`6+e$%Cp(+ zksYtK_6J=J#&rDz_dmh?Bl5)r_wV{)JRk1a>woc_0OtwrA8sp5{C-N`mk^lq3GRP_ z`)ALSFzYaJ^YDC@d>n{$1D~mO*IG6^>eWare*CEp*RRm(p|SI!fcg{Mf3Pd;`}bS3 zwD)^)f1=al{t@#IL&Uy|W6nCC|6fa8crEpb!w=1|=e^mzSJ#%m9dWjn-oQbAFjJ;f zHq*Ie#VjXd@nj}x#q(w&2kU1hQz@n^R=_iMct&ti;XOGdGp!mIg@)UrW^q@bI;|k_XNk`cTjrLEujKLljoF8sJr;PQV!zL4;7n zeT1bXE;!56nNh>(}IQX*H%rBkVR zJ{>D217k0I#-72r=)pD(48QA+tLIn#8blH5QxT1qg?{iUU06@)hRL^V&}EUl?`JCNy$jS zKL8&nz8UB84!?I;`AP4G@_2WR9?W1z-^~EjS7Md#A=?s_f=fNTYLRA9)RCIQDLuv! zZ}n;X$yRYI>=vT0Ss1!BprP4%V81aC2-Ac&cc%vD=tYWY3C~@S;E{7XrV}C}0SU=- z2=V~y49_%V+r<<@yfn7Dki`U!($8r#5ta86n0eYDd=6i>(d2g*d#~PF{_Yo@q3c~$ z;x59}EXGRZl$AojLa;Yf;<0STidS-pR4!{(a#k@g--hJk8KBHZxx@fg=y$|t431Lh zB@i)KMu@ zjlQfP5^A~IVa(P$x=Cf4y90>oCJqKS;)ir0Z( zPzgACyaK8v7Nuo&G3MD~7&RyWS+#983KS#^C8$8YC`c~2wAzTixPmkkSXX3B(S-eL z50)y@I=&@nflB4Rsduq(uvS8KX(m&2Lv$Hd99qX=_#}!`TK=$NGjA25-I4AhRstqL zCAtc#Hqlcc2C(SBKmc7Vz3oO@j0B|QQJ~@;Q=m2QSfIsfAdy5xXkRo^#1H0W5=$zD z$otxNJ&Fl#x1P|sHxMY1D>XDo-Ur|KuCah{Zqy36WOBK#>O@&pJb+3>apD!va9w-BU_2Y=x6uYJ!T;@DmUY7TNm z7l3erzU>!n=9VBD57D!v7sWYp0RJiFx3Q{iTrY!)2~l2~cH z34HkVKgWjz%a1tGE4i0B*e|m}@JOY&lo<2DkH3L9mLk-kpX`jXsJ9{@(vXn`NrXx% zdpmAuY~64Ep^U9dyGu}fi2V&@hM0nFY_EEFSm~le6_E^vjMcJ@{{ZvRDar)*IRvJfkSBLM*En$1Imj7QeQ%tJsI<{ zhA_Q6r=Sk;xqr)BsUN9DOzI+`hBy|aq`y!^76|jnn@2}S$Y6fp%t1hBbU#mA5dv81 zVKsB2#u7EfHugBUHxaHND|`R~U>3xod~~TSNbG2WS)k~IZhh1E;9Gx6YvLIP?LB>{ zz*Ht3kHus7CmD-mlgWIpl&xU1X`Vr-z>nrCh<)2&lwYwtV1>kypox>IZi|4oOjAe! zPm!cqo_d27#V;`rQuE zNy(k0NvA5}o;m#<@XFMKx4uxWA3Q32uHYp^1a~XZK{2`aZPXAgZZwiBWMq`po(2>zZem$-|`o7Jc9hF3CIAeAC?TLh>A(u044^qNY~C%aQo`pPad`m z+WGXcU=)l8mjv~0zkcb_!`4$lom`OuLvAg>2u)u`5!~FzrP8RD>r**Q5<$7>lPgOiN$s@MAl$1Ep{+9Uid|ovvZuM7qEDxCM3;rA)o6wh z?sG5}(Te!8&mc5jA3uJKq5i->(9p0K9mmM`Ltug)*18bg=Cd~s45kp`2~o!Aq2V2{ z?vM;O=u#ss^K#H>jQ4Z|AT>k(6w)Iz5j{*pR}9{|+R(|J%{s_qnWsuH+L;Xz4?)a) z8K;1i$tRIpp4NHzcZNDyf5b;6T zTEthF&Qr#obu37IUYh!!?sUA`zh5sHybKt$q}i79o53e9s;K9Yfn8`9Jalvlyi|{L zY7zB&r*}N+CG0GtV@7L;3S~xWAW$L16+pWK*y z!sU`5nTxY0c;pVq3b5#wLpIc=>0Wt|X8a`l;Uo$1)DK zWW*N@l9bLx3%0^KS-vS5cr0NAW+N#Z!a0;f1-z8<+DcYrR?tB^-+E2Z(x&caL{-Cf zEf73RwgnO*eRv+n#xE%Q@%hN}Ve1R{&p1O-p5tLv@t~f&Ohc#&{i)b#K`3>jKlM6! zoN=!@2UNRv+#q`&3|X~avw^dh6%{5v-W)~k{fO1MV(>e9B43K+!o^rD zJv*De7I+@1;FG@#(v1DQ)lW_AFHx9vGD)3DU z+4J0#=*+^!xtaO7pe73Ru>0+h3RC<;U4`lSV1 zCOI9be=a?r%g;Tfwf?zocqQOS_@2R3jLYy|4YcgY4J!anY|<0$sS30rQo>7Zcv{?^ z)qwE<5R9YKa(os5AcAEioif&)mrgNGdT&YEFA)4vHGYOWqez_@l?IXCn-0rXQ+rbPOk3RP21ENf=G&E zCUP5WusA_NbaaIw$EDlibv|G6Tcb->G&8|Q$7XvUqYVop$PAEb4_yY>|P2sr*<9d|DtF%~a1aq^~d3?Q4;1Tw%d z)Kf8>^e+(-7XhqcOJGQ|_j~!ZOyGS35viMe$mb;nAf|=q)(GRd z4_~TCNHbKS8bO9ATYqRfW!b~KGDHpZ1~gTJP;J+Z6z6>Cb*xr;X=+3K$-lIfg2=eh!&7&hr(clQ(C{-vJotk;hYEv%Gq$#D;N7rW+ucHg#zIWU^t^8Ouyq= zkQ@Mr9+tcGG)AytU>DZH(j@<_AldTNn^bqH>z=!WO`1 z?V;JUtUh9oA++k)c8C-RRYQnC$YSasVmI2o0@qf0;ElS|fcknqEYiCM^(Ebsy=%x$ z{%c}yu~AMnp3%R0C9KpEnnrz^zJ3SI=r-3tHX4~8@V zQgM6D{b^iZhA33O6u2$buR?SLqNPs^6@40&M{pqNQ#(1zuGgnhdFlsYi010o9hL37 zL#}Jw%F!4fT{UX1K82GD=7&Cos)w3A`czInKUh(XzDOF|NHMYXEpXa7HW#H7UNoN< z6BTVMup)Uj72d-Q=7IMxLn-C$kmI^w!0!-9QWIMZ=SmE=1$gDKeHA~FgF>?d8~{cb zVbza%QNxp~fhd)I#PdET4=vhOfWy5eZs`P?9lIE@z3_N}d5%!1qvy!vsiJsFhgi$- zG>UgOMTWeiW;P;N;YVIq$c=WtkfAZzgG z?bEhMcrBcdy+v&c9_Uwlx;ddurz2e`!r+G5aS(X)wmuWO&7e$9D;Irks>UQWnweso z;Lgo}kr?F$jKZE-3cEBdm3w3}kW1*`Bt$@Kc+qs*?Op@}51R-0r;(SCjZfiJ>YpH^ zhwh^@ojIe+;)c61PR?;+cOEKW2S<)HKRx9xcM-;|7e&FoofEUpKul? zGJx?ZafyHM4E2?66%mn6$iJG*DDWr6h6YRmXUlfNfy_!K6J;cU_(=h-ql*^!QLuT?yC-^BcL zQn8Uwu&F4;b(;Nsf^;N&@1wthoy zSe0XQ&|1$!#rJZ+m^zSzfX5B^_|LAPGijHLuLCTKR4qzln>kvCgelS zuu6(o`i?*EtG~GD=Amn!rl~?J2ERDP{7i%@QzOX`C6At<$uK4BJ4!c0#Tv|8c7Y@C z%uk8-t<|lr*~RTYXk*ko#S%)484b?hS~02u|m8bLS)k4F*_gV61|X z3RrLYjw*od^m9(t@yjUm@Q_5F?T1<`kyy9nYEtqkLYLNE?tXAfFZ2I>;^+eYoBWwb zU?PEu1YU{+e(#f?`1JlS|7rcf8*j|7J&QbWxYWY44th_+09+BO0eGQ0#olFBj{~#O z$D;?no1FcA9Z{QLo9OmvrCOt31y>nw@Z?R7@}lH)II~q?|EytsIV5-o5t;B|ZoEq) zX#23ZJr5U2t8-+)CRxWR8Fws^o}@1+;8`!yuLC_RFbVcm+ca%H*?71|Hl*9R--b@L z!IPK5JEGV^&<+-CaD(I!;BqU+Bq15-lc>v4NJyVRx!#SHpS0%50YJMD;p=5`w|6b@ z+0=V&`0+A{*7bVtM!zTqz`!1VrDL_&Hm9>S3+5R((KfH@`*MhpSy?d0fA8B*%)pU@&~<%cJ-E@!#Z^L)Vq8&}RO zZX+yl4MEe){oGd@IpyKc2N7dKNKv?jU4?C@74x8tVCiHdE$x8`NRqF0eR-_Y+(!-v zR-@fvUN$h_!9!c@v1I>mzzv(oE|DZ<%z8vb4~sMm#+c5{={eNqve)1 z@!9$zazBX0ng zhg!0C%R5FvhO3sUA#MPm?P)dIz~D+R07?BQ_LNrnYTd(t?Y73dSw+hNMDh+V_Q?7; z=>K>$SZE^ZE%p@g2(j7EFuYxDl)zKu;V5ueF2w2>+{O9KT;mB}!V#>Dqk9RL%V@F} zA5BXwOb6#FdWC+LLWg1VN-*zU1u0ngwhhcOG59U>$k6S06c`FC7T;I@U8+GHnR z1$qF{B3qYj+DjOR1Q-L+i<2ur6I7`CfOZ|&wBb^iU|D4IVwzuijAsZ`Mocdb_6)cw zT$#x_f#cD{k>M<1>7#(pDEPU~Jz8?M4-1(KZPKaB2WR7FQ)cHN3f z0wa9|^tJuSD}Ef2)Iv|%|7H1g=vghFq#|i7YacS@_hIG%l@bfFEz#4SsA)G|23}uXDCPp!}Wnu!dfa&fGy(m46P@N)}!yinAWfp&adw!?YfeSSp9u#SK&}2^u za4=M|z*WY1nCrO~Y(5N(UDsZZMvUG_c$=uK>LX|$pI@fOW>;_y50fb+IDeUPEk3L= z<@^6nzH$NoP5w+IFp3vke~4dZY+ zm&g~>$z0YnH27qkv+(5!@1CAF-#~n&t}y5jw>77hVoW2 zqPTG=`%T_lDqKIOmp86XfJM=2u?xk0E8@<9nn!&Bq_QCt*S5 zANX#UcA(f{0GQ7SRm4LrMvyk-qBakv>P=8eJ()5aM2p4O1MBS)sD2F5P~1&)aa-Z| z6-mn=?)0t0h|MXZyPYc7hiKtH4@1M7!YRyKYu7z&NOeC9-e7Nz@qroa3+>iQ9lpmo z!YEk95Q*q_x+-&@D-002#1P^RqN&BoP#^#gMi&Nv>m2R<5$3JN;n0f%5L;i)j?TYu zou-o<<_!h$1>@B~V2#g{02iB8;b`qpCj&)+IA}#UyHL4t|5`Mj`i4T`UCX$^h#M80!(*gzb z(i5mEFu05v=?`%?)#xGJzy!k^(H6W!V?Y7JXIIZj^(B&Ysi`NRS3wJlt$eq|;2bo; zIQEq%`kAd@Yoy&r>Xmo&uaz-9gt+w?s0vVL=u;>OjIDvDBlS5tWy&G@Vh!gZqAy5Q zUEJVG+kj^`Av8e*(=|dooDmgJm^6q~05p~TTN{ryQE3_tV6|YUAhVNl1oV9*bOZ01 z1nXBF0Vok94!jivimO;Axg?6PcxBMXBbF-dCRi64C9@;Ks1o>$HXE%{qYv8_d;fwl zgPe4!nrz={TID)%*0UF)R{0F0#rN8zMD=JxQh;J_AL9160Tw}vNH?e8K}o(~`~trc zm3_lPbXW_>y=xp16YN#T*T862?-bkEO+^U6W?eI|(Vr6M|G&EM$-nwh+xAb|JCVRd z0_P=x4-NkRzcyZbz4=WM#pXH#Il!nqZRFMGQyc&Xw(e?kI57Zt z0HhNGz{CJRA+4XAM|NTW@MAD01^|ufofrU&A4LNI_WqCX|IZgA82oP0bv`|lt z0HW;9V+&j;Fj0Gik!ufI4_iRhG2G|@;hY{lY-vzg47~HCB=inaYOqGZlp;&~twx<^ z@&waD$jEeXJjir~!iT}cUKnF!cL8;w(4sydF5HfL$4fXBtTw>kQbV*oc;FVul!>!s zsO(0AZXrltPlo`9>an+KZ9IEqoaPYZLx_$B@A60q(JCKC_r;|?8j0&jUCx>i_0vOg zmDJB3J2y`1qrtslrS3=fzPQ-q@sVd{NA5xgg%Eq(Hyaf~*;aB#K4TUExj`6{%D1wP z6McN_ln$jB;=YM|2C^SJ5rw7^Iz5c+eRFa^_Gi8TkCpq_NgYn^zNvf$avwbvd5xs) z8eYcL&=5yt6!6`%MMkIUB6e4I}#s58Sm)x-<0Oe=udP3N7&FO#jtaVzdUpRG0sm1~ zeENk#8GX;lfz<6CeR1ks==PmHovIe~YzT$!Ten_Z@%h#-XL(R{QsYctbEk#+Q8@4s z-~Ye*UoPOk$)AY?CK8xPU?PEu1U_04_}XWmU3j&${BLH1u!un-oj8be%GMFNcciRT zzL<;WD)GEoEa$VSR4SdSWJ-xdv6xO3_3j;`a>UNh@$DesG7uevVC18+($W#Z1Ph;8K92O-5#;8t0)Qwup-}jP zp%8aZP#x4)17r6@b^(gqi5FJ1%zm#<{5Ef)0(J+-4MJ41BybP_>mb80*f@01~#@3=i$#b`@?jIQG;_eEgBW`yii`0O7%^e85BPYB)E^YJh4G zPC>@ocw28>L4~V`eqnVliz<1rt$WsSMB++0O2#c9cNPTB)Q9{Dbc0*{E&_2{gveL9 zfWy$PS6dW6u1z2y%WRVUFo0HVnl03j(5u3l8)UG?bs&Z!1yG0U!qjT}kfM$o#bfLg zr-t@zOPpHBVOi6${w%5EXb(MAFg7VB_X(k9Il2UTt|$7H(YJ@~?jD~;+npX@MGf{M zr|9hzO@lYCl9bY)|4hH$5PYm7t2}l%`g4^NPgb15_*A=yUBcrCmV&N@F~H-JLTYih zV3s;I1UVv|`ksOd(g90_5bg5ZtRX;WTu<&UZ*Lyd&5<%uu;kNrr-2hOMOBf~Sy$0n z93&ho21goMM#kHI1emn>EO@Xnp?L;F;%7HH!saLhWq+=^z`xNRQPtDGOT zuV7Fz1b84?dBjXq>1{Z!sC0t1RTjvQIgUCrVq7f%V;!OJ?8Z9N(20^3)r2h4u!}Gn zk4Wl_O25V0+-%f)L`^TeQ^>%A5RN7CP&pn^*a{7Kjs=MTzir5>Q{x#}aC8JzO9itV zlif+crC2SPqe^&A%39#kM-?=On_goXrXtat74oM6z@47r@JtcnIMNPh4XxjWVziKi zBian_rg_AP6VqYAD+W=<{86XT2AZBGy|cbRWf6$|*nmp!B6JSA7i_DD*W&@#Ltdme zUVsAtmm_x}C0ZEW=NJ&Ld?nBp{)w&cn%i38}Pb<{6=?tX?Wx@x48 z)5gmpmzu-@4D0Uc*$o6|p1-H5D~Cc=eg2;w*fVoN&_mjMPT~OKCS-(V|G80+4;DR`+DRP1DO<(GJhQ<+i32!^14uWJ*nx5 zPT~OSV+Q^p;{f9PU#P)6Y|8*iII>i0D%w=QFF?2a8ism05ZRC*G4iF1Ua3jqPvEwc zaWWn(%uA#gIZgaplUErL^Dz`uL=U@EMM7YFHViKFj@Ob5K&lZW*S<;cO7V0fx%5g`>Q%@it*Qqq93_z-M_5LP|I~ zu;BK<5hBdK49~;imhgLI6Jq%*{@Dj_eW6@GcvSdYp?MsMVMFIW@X~;AoA{yz_N5x^ zz3S(#`T_CX_!^$HME!ApibT9WtM~F>`o?%n zo%@)|asS|{5cT6Hq>DiS)w3hGfUrOUWr(k+3;C*= z4(iayZ6=$!OL*{7LK!OH-Sc#X7+OJf?$gTp6~QUg=_+skd4F~ih#$}^Aqv$m1x}%c zeic&D7R6A}r%`zX2a-OulcVf4SB;vhPvJBX^FyCP z)kDo5eJUrPAFQZGJ3EYRq?p+H7C7x3n~PEkFPhJbiHf!r{!IlyAf>(iKA0YPXEEdX z)w8|0p@K*e4{5s#4%41N9|_#b6{A#le#C|Wi%Jd9`xCm_#XVcp@Z<`#zuo6MZCoN# z%*lQo0cE)YW&iED=k|eM{0)nB40b>3?r)wdil-dpO86OwM)B^ZNU#j)70~U$w*gz6 zQjY*RG7;Tvt0v%9*FsFjx&rXk9wOAQOVCI{D}UIYsj!Lm#SFSuI>K~ISd8KQ?m ze1N?GqhoeWz8Xh3cxMNO@B#?uNtcwtdY*pY_2?gYOLh-jM+TR5u};(gVs5kTI>D3p>YcBVDiq$HZo*Nu z^SD#|fXWXlf{u>+AdOu=ybU~r%`S_sF!blRSV8;UL`5F&09?zNt?n{|aj>f^PJY)6pH99{; z%2uf@u(q0v11T&7z})5oJTVPC?Mw zbWlMgQi*(G-Z#|?7w6;isrlTHsPqSo*oiKGdOnzcFzUTjK!IK=^x=}yrM+IDCUZ0M zb3sis^xGj7CM1xq!t{Kw!a;$Yvcf`izE(s|TVc8_&{de84_0_SnMuU*z7h);7Z#>x zvauloAv=pMe|kQce=L@solOVw7c0b&{ArQYQl&Sd_8uymX3j z(tAtNeu0y^JO}acfwcnge=?A0Yls33;4D=V=UYrEfH5`gUy?5dn-qX{I^Vjr3_v}B zDpyryK#IONAXV^Uu(*CpqFLO}+>$n(mrfBQQm+VD433LZa^ezEm+@^_fGpt1-Kz6x zQ7bBOE#~IxnoqRJJ;p66Grn`@_H&xqInL-#5!+~< ztR9m8|Hm)v>vz+k%Jm6 ziFUIsqJViEpv)5JZiMR{K8m8;Q#gmBu12_uvHxPfgX?hIlcP3>Dr6Q38*6u9N%9&> zpntH?vfu}H7qqLk#?#D;1ly<%8YY4)ih<1oF0z`+`1BfgRahyh~&U{#Yw z>n@zb%28vx-M<830pCzZ<25~d1$MPMYSZ<&wJG^=;G{~UUoXQw)M}tm1pKYS4Y{j%?~?|A4RKoNZrE@ zy@4$LZgfm;*Fe+il!NUmx`22rJ|Wh#;imo^F=s;x8LD4qxTjrzutjv z?YwpPPA(REYaf5pYCpz(@I$vAcs3~R+UU`*5S`qX3|;Y%B)Ap1u?2U-bi25@b$I9I zexf^jXFhlL)-7vwA>PatYuWtX&e77L**HGf{%ZH+)mzKodPBQNr=w!3ftaCEr1iLx zEvI7TOd_AF#H=`$=R_`_H}mDZHDZ1CMXY9zu6aADHz9-@zb{`pP=% zkm**r+pd>Sxj0jO0Z+rE;@Yj7=DMefY6gz1q3P6ybZMYESBxSl4$>W506FRd(t=eA zlbD}$a4l}(>UzCrV&Ri+u`&!6e6Cx#Dy6lbH376YeMI+AJ{<$~2Z>8U1G#2mO>GJR zV>yHFgfgT0@m7Kb21N`7Oe;I22$c!>inv&i@K()2-*91tHfS*U5hT|5o})c z9hL;_*pVxOFwzNF;05&b@SbILY;Fp^r%}*ow>!MT{!3mybZdZOd>FpE ze*HHMIn@Yw14uEu)#vVXPzYjQ7F-~|{uc)Pz{$SkcmKxL z1}jjv-yzp~r&l5DK*@jPU8bqPUb~Nlg;oMzmjpihCT)M=TwkIMRk2P1%Rs^bDPp7< zZ!ggJTATw3$Oh-OICt6iJ?%)>Xg`E&bFrRN$xz-{=@66BCNE3(GSt7%8M+ex$?tyf z<=@8g^B;IMW*2|%S=zq|&PDELtSZ==^L{#_wpIXdlxo=fwd_8xvL<$E914#2W2jRR zJM!Sn;$2^twrpkEXc}elE$a>r$XT-*RI<@&!+0P>D)+JgjPSy)*gyhviI!Px<;3)K z^2ZkR5I46NN^}d%U4?N=j`-MKz;nMwi!W^uu`zibxBKCXZ!VIIL8qQ#@lD6$*;qE7 zjc1anNV<~CXDgLh!Zh<|u=sumHNJNF71{=J)2zH|EyLU3qPw-0OlCW&;+^!S-I$JB z``b5*t;O_qHgoIVz2d^XUSeyjovWwJn>LR8U$n7BauDX=sT31uBxrFoN{omuk%^dp zBOC$2i)qM9hgyBF9>L@a=ZWyE0$61LkBU|F5c^+b^>FIi!a7Zks(m>q+S)~8ljJBTDicj~W%Pg^Zl;$iAE zc64Bgey+g*69PfPB#|uriT3S6d2cgdz>>m~8{DgA@Lc*GBmF&}TOZ*+YGxLqBQj_&O>x&jI*QluYbVm%X6zFhjR!?=y}Uk&8bvO zg%J6S<{J;2i;r&Hac5Gs3A+Xz0G;(*YUc9_jR_c&VSIiQ(}91&&xGw-B@5A2@$Ra8 z`T47!Z!}91)CH>JUxvhkm$D2g(S2S&VidYZwLzasWrCK67zz4?N96%g>I+d-A-U>P zs4T)&W4y{3QxVnUqbtMXA%s-MX`Ihr)t7VDVi~Pv#?|69<7Dh+VAsYG>bd4Auj>y% znAwEaQUSZC7G`I}>~tPZ@!I|nlr!}MEa~)?0?^2(!p(_35Uk=(a&ZZW?WVJ5csNBz z#j=|{0s!#ua`W&Iwxk2kTmH>?r|9ZD3EW3cD(O1tN#s0n)8JZ3#^vy*qvM{ezkvqf zsNWL_ESr8dqJfu%O8v-}AQHh7O2+#gE|3}pyH*)?UpP5ZYPo}Yh`gQp_6^%t>o-C+ComX*s<*((z+|Y{B zr&om#oC@ZBnfqSmqe&F*DVhd}7!UIEbTl7LcoIN;M|yTizD=U$8CgAS8lfV6dq&vQ z_ONV3No@XAKt6e?%Rso@kzRu^JmQvG&AwEtt=Wo5UCP4m<$x z7DAZ`4@6vbZPdUf?xIupPR_?*&X+OrGJyzxCGLUT7MaO8%IgMUq$6@$NseZtI4amz za-bDL02`u3)DGtmfb3ot4eG^3oL6MZ>AZhhj+h>*EZIUR_-oOW4gk@J#|?DlSvySi#LB z0tYbE56??*fEKR-jUxb!LEsdZ4P9PN3x7}G(d0-_KE>WCjC&+_GI?;)Q=}%n&}q-O zB$I~$w_wQ_ZezgVQgm7AT{j|?rZPp=@#O4N|6d3;i zQ1~9-v23QcVH?6ICYz}lICF_l2PtJf_c?O)`rPNl;lUw`fl_sXBZ$vMF#%GWsl^_M z-%CR?hr2Ca2Qvr1H`D5#m8|BaNfx^~-DGbw zGBc_&S$XS>%qkW+WlXm;)neJX`HLJx)yTVEj3wsw@VHc2}{Ni^5_L~7?4ES~D z#qa*U|C|#MC-P)uRArJy&J@v2R>kGSfBy5|&VT+(Dl~v^m~qt!X1XAfkP$*%vRB2> z)6jJp{4N&IO#up?(VtW^eLLfmgA}JesRhm!D1gUjEk=N%@&kILAfECPqhlaYa5{^S z2J~29j0t`MPhTQ8de`pVypgKk@VgKTs)hr@K0nCcx!;{u^Aqu;NUxB%tywWGB%p;xey03;z>a!~A0eXbk3>VLl}pHPxbjrB@f-3( zLRQNKN`6LSMe&+2^p_<5{~LezwQu|%`0M=7IR?%#aE^g<44h-&90TVV_!YyzXIsDi zcPnqa_S%2?`fqP8U(a-EPQ{5sQ%B9lW|Yi{U!EQF&_{K3N@RH^UU?R|DdQIl$1X2t z;-%FmGdC;crDpiy&Q9@ZW9Qx7%Lmu*l`4&1^U3n3pVot?hfhoUH{X4Kx%~$hzW(UE=2Tp@We-vRB4EJ$jWex^sk_x1T(de7dOF{k(Z*ek+EVSTPsj2)VZdvlQ?E_|3hAdjfgdQ9??+IvNbpw4dFG7=&VSu|tC5QS~@VUwB}EK+PXX5y4W zoNX8R5uk`q%5bQX9(w48R;cxQop5D(I(I*%W1v-UHgBM?GBfDlrbKK9^E$D9J*Kf> zr>VS2%wL4dO1qlgP+OtIj^_|bopifvJksHMUtKb8F4@rO4}Pd=Q4(vBqKzO?JwR%M z3O2xd1#Wxoohx}=?l72GI*=07yreQMJT|R?EmrGje21L8qtPU!UqRRp!HQla!fL*W z@>iWmRf-4lN$&x&SW1EM5aeG*s-oo_G=U~ea8)@h!7h?!LpqpAl=`a9dO>1nUs4v- zXp&>dAz4WdpzLA!RNkp#KttV9?~F+XQtJckM+Y>#ftbr_k_`0WPSp!U&DqDdZZ4ND-@W$1t@h^KR_*GI ztNXX0LDqYlQ1R~~&>aZ?aj1ofcM{$ih(k9a8~NfE+#zJixCQ0wKmbwp=OnyH34k<6 z@OwzmB>!1)$Ee01WT=FW&KmVW_x%`86r(26%l+)haODn*wLzEAvFwix26?0xSOCv4 zQobd2$Kl#w8#yz2mEChoAwBPK`6jSTrIaSB(4IgPZ0Cm0EObuX=Nv5`_@$XV@Fzn9 zCp8BZR+v3n&N-BF%mI9kIKS-Ajb4B_3rxDx@;|levLUgk$Cqi6wWm zo1t06+vl9?=pZyZBy`kl^Fk7}|u3*!^} zKh~kN6M;XEe#)BzHk#D`u@3W{2OeFQF54-PMOerDS?&l2d^6}(s9`QXfz)kr0L?Cwyb=zu5hNowL zGzUNG(Dv+ca-w~dCZR}=Lg%x;m;>@C>^=ue&bqaYA*;N}X|rx&Z-!BMa&oc@TM!W$ z$ymE63t93f#>#rZJ{Tz)lAZCeFf~0z88?l51WARJJOgGU3?w30PhiuUh@pFxGZ7+e zj7w2NF`0wF+#x6l_2y@*_tS@EBa<1TkXKbGHv8->ad@HP`gvxNh?mz# z74IXePTi+t{XFg;hb?>cUaeow>Q9@DwYO}R^SJ->xc^i_?U|6odECElF?$~Oe;)V$ zF{Ac%X2;1=IHLG`j&L6L|KGfQ9`}DLTKZLu`|n9@^3a2!U&8-uzB(T^E{J#B-jUb= z8%01=>Rq%)FEX!ml;b>KVJNp-&;Z7Wmbid74da73*v1F##sQF&fjlTY$~y5rqTRXyf?b$BgFHRfQb$Zxzk|l5h^fKI?D2_0^$b7a*CaTm zha5iEYe%4(>K>1{8y{aeK!bt~hd^D?gE}(N`14e*3K!XK%$1duT%%ZCOmwR49U+w@ zxZOZ;Rf@IbgK)FfJ)HOm=MKm};-cb=@J5BeqX0T`O+dGwa z_qpXl>1E`{Q3nki{F@O*^1*g!BGX8SBrYUHF&0YJRP_KsW6ePN!(!zhBit+e_ApK{ zka-ekG#+Hnk3-!DX$EDt7!jjd#j@^o8YLg}gE!dcKq5kS(L$Foe_-kd?uB5_EUuL< zX(SnE9$Fw*M^se#_=0;pwzT4S+0m1kn7=4-Zm5PY{EM~?xyU~IlrJwY+HoG^Gh@kp zbZ6F5O9-8lm`GVK`_(<^I=d!65MK$eh1?~U(6Jh|ky)0&@1cUR7Pych)~@S9PhRI%`$!z$%*lFRw7y$1bb*}0Qpa*gV>bN zUmbbqu4h4-MVH4Jz*%ls)C?(a<5h>mPdPV+JKplE*Mev?ZmZ zG64QQM7%Uu0zZL+DhTAoL-?iXOIiDUlmJN#OTL3W0)Q14Xck>ZQ=xW~#luBO+2PGv z^AyDFv2RJqR4i+OCJf5n0|I9L+7A(0K65E`orMh?m-T#HxAg4fgVN!>(nmR9CaB}M z6fG`U(icZyNJs{%Dwr!X)!po#Rm9{{;la0l5A`%YUU_@vu*eYQg48uJOPv%51(WZP zZdGp{CUOL+Qcsrps?Ero*-0!{~#X&wI>RDey2E(f0LXgBEk-Lcwintwe_PS zbSuB0#nm;m4nh~95X~Vxzgm?omn}X;C_w2OUQ+2Q7SrqR4}sh3o#XHF`O< zXrX|C)`;G4u8@*K{9CWm!`8USkB8I?pvB`bysGEz2$>gnv|yNj)W%t1e{3n3Yx#0~ zC71L8xu&<~R-%XHD;j?{G|FG%mcGWM6C zcGTuK8?g~*=a{{{K_0;F__84n47oPdqiDNiStH}G!H5iiQQ{+#g?SKQ@#VlGWNN8g z2fsGJt z2kuU=S2?U8eG-lf)0jzGo}z1zS!a8aLZY0v=j2 zkjDF{Hz$*|2apB`a1`&WDo@-o2Jm*nNkbgPNvUccDf==R3Hug7Bfp#BK>j0^fBdA$;@W;u4G>`c(&L_n<6kI*D#!pTC^$C zNmW)`O*G$={h)NHrcK;$w&3}Kv3k}!zi#zmt5_^P#O4{(U-6>ZKWq_WD_*_mKp-A( zuXrZqJ0D{3j%1Fncq(yRe>WG7UJ>Jp;v$#ivV{78WR&&DAzA_V7GA?0jw%8j0Lpe!5qM3 zo055n)v_fANIs_&$N}vrBQwJ$*u%-Il+p@G7b<gR!Mdtf9$DPnFt@nws$L~_W=(#tDXN-u$6QC3(UJib&yr8F6-GNj6i z(WEEc=jHPmPUJkvE_0H!T(JM&JY6jJ>Hz~cNwWX$}8 zWz76288hsp3CB5pCuDjU9MpyN#IN+4439;z9@HTzx;QuTS9owFX$8z_)W=0r=>w_l^UV}a4AHDs$^E`gaaH@A=)0n9Npm4K5`Whw8C2Z zc1#Q0>6ll}*p6g`Fb}>ArgXUg78sY<3V7$UN(bCVpox6eOtX z;_8=9t@4`{82Rst_uE*8&@aMapURL>;%gL()f4+-%;4e~t;-8Ae z~5d5qtA#N~d(@5Fy_Rbl1PGswBUchGJchp z?e3vzrn~h3U5a5NZpjbS(L=36^{fs3#N=90{~#ilHXC}BCl zjOvC6lZ^KrLjohdWC+Clm{AM)O8!`8-#~<@aH(@nk@`$hXEs2mqFwipFH?SQqBMsP zYZTDBMFo;0qE+6qLt14F2m+O=A`gT}hd~Rt8oI+vb)p9HRGbgyjAjio7!_k1?b{8!inY_dwp}^Ryy#gHuO$H?$_R%1biO5Ynh2IYl ze%w~!r|iWy1kef#VoeTG87>K`x*+%qgD#4`c!m@#yMhIe2B|IuuO;}srki4r6wc;y$zF~;{k(mYd|5sBBYiRQnlQ|h_ zD;QphN+K2`VE%!qPqSFbr92Au8O4Qy1$EL#asameV@jV*ZZnsy0s+Hz&ujxxm(Ahq`=SI*I zQkOZ1-SWH*YyxuWvk#YW%K#&=^!hu5 zyCJgYv*W}5|5_nT*7mmwzeH<1tZKP|PVLO#t0E~RJktARIm^6`e|Tpo{qs3`>EN|A zg`-i>w%kSh&1=)1<$_E7kMu(l>z!~LA0jI7$nWZ3($kfg2xN~NF z1X!L4lsE?@lniTHNnX7EN^lWTN*oSYNQO*DFp*lQ%n?SO)hYC4gQ1b@e#n>wlK=+G z=KhF5$S}Tzdz!@{3itSLCg;kNr0GEiJ8zj*4Z_;dNsx(Ig=T7dc&seJqgqQr!SS9y zc*NoE)Pkc~U8WBncg7zagBD{X;3*OFD}}f}LmSNuOgD-ZgazYQzVw``uto)uZ{Vb- ziQ4+Wgopkq{SMBE0xx(1(T7jh(8(m|;uZ>G`^^ffnWLpjztQn^O@gymrXw1KMDxsH zA!fU3Pmib^pU!qv##ZGhDhiI0M07jR*FYmeB8wyKd)hf+MrWs?R>()HHj4Zxas>f| z=pzB0MaIE-1=$O~S?nc>>tXBBBgExac;pZf$7%7P&Mh#Y24^T#dL9Po zh)6DkO#g#@&C6bWL#=2IKCxJIeBZ(-wi_W_Vu7A%D2y;QR2P!W5k{ICit618-dGWn zZ6_pb=Ki2tw=m?~K2s)9r=Maz)-)KdRBYJ&`*-vG+rx~kBasjq!`$%834NHUFEy3=p%D6cGq^*-YswaRvQ#{0bsECe6o&iHo zIn*EuPPBbb=9?;J)ca=*VW$ys|nnzTHM8kG?vl7RMBt>TL8NCF$c7nLBlCFE|s(e{EJHRxA5_G`Syip z4_lt6APrZ%2XCpG5&imGA3tmzUzE+nZoLucK-v`4)c{J;?H8svHH+ZYg%?Wk8gMrm7;;HZ*!{F28lWQw(YQ(3 zFj-!(Vr=Ju=`5X2q8y%yW`JL5Ui)m`#2;^jn15u;NJri{-8I;mLZUygp9TNs5Z4*P zTDztM%oDJn1_<=*J#bJxz=|0rCo4rxGSMJLi$UhUgiW%Hadi6QBV*EJj4;xt0~*U_ zisO?r>iDLvTUmTs45V^?9)567%8Zcamh7ho^Tu=GiV-{QJ!T} zXKqbb-khDEU7p>%5?#kWcIC~@(&qf;(y@Dd`cPft^SWdF*`>>KtEusq7B-ibH-?PQ z?V)RYULPF)^49$9dMP#j+T8N&*36LcX|cP;=k>wyXXa+NF3+aMU*23_+u9m3{y}5r zscU>*A3eTW7j!*C_p@qHL3SwvrdH5dHt2Gfo`Pg!ZF6I5%epxH-5~(a?sgk4fO&lo z;55OU5MV`GCjxj%6Dw$2Ib%Ag74b}JrL1@de)mE|yb6|!SIT~6pGnoNs`G(jdGF$t zT{QTEQxEVb<_(rf2}F}+9^uc*cORhS}uWuw;;4`nPQ?q;td zAIP_a(UbYskB_HTSTEkxFYCkxbqp&qxI_l8=N1{VJesS@?MBrS3PuT87uAX;UKt|M zn4;kVkJksmo0(ZyUth33wDRWS^4ii+5l<_|H9oHoj=!-uw>rO^8h>kfaban02>i5g zUE}lm;P`3ywL~6)UNu1rszLP907Zw+N@3+$L3KA(Zf1o0R%#nT2W1{tW-k@0(N9oO z`yq+~8E1Y48mtNh1}C0=XbuBHxnc9O8r?iL&i}Gs-D7msz_V*|BYIAs@wuK{$H@wc z8NeZ`VPNYP_k*}@J*8@SIKIA)AyjFP`1!cto^$ZT?dTnqC*v4@OIM-N5X*Bzfsuz( z&`6}CW8iHZcEod(80bOVUPl~n1S3zzT@$*;>(NvC7-w*-9d+9F@iEL(<)o#d`pGB! znHf4DB>Wx*X!;sc)a`B?J;K)8@L#u3M?!r+taR&ACKZ$t-{R>M>zqh;vADX4ob_O? zJ-j{zFbf@@q*<88Aze7lBQw;{!b#aQPSC;t-C+}-!d#kov@|8p&Q2wso||$!58@5b z><@^gW36y}yYlH1Kd4kMKUq4Oy351@>v4Z`uei9`xfX8Tx_5}} z|8>8Mz*{>1ZnWF`p05t;9*B?LoG6OP_wfbO^iumPn`$zs3c~|Jm@XWtI*p*-E{@0~ zuKps?!&v+lPM5GR;Ah}G#gSmY!=G>Z`#8<(qfCh$@?nSu&iin}2YzD|YO8{T7YS*@ zRtR-CYIxmib(#-b_zUL;@`4QNb>uStwyz)I;}2W>+rD1z<1+q=ugY#q;M?H2W4psb zXMmOUNcfE%PEbP^-`Dj@(8l=@@v|~L-DpD^)Y@ThWo~9>=Fw2_yZCrDI2Zumx}E?( zdNu+*dNKwbq^ohyao76whB}T+)D|%(xB9tE_{to>31Q++0>;Eu3rc-m!+C=k!f`XU ziU;-JkmY?eFrGY^36g%v36ym&0hV>$0xY_tL0hi{m3=b?MMH6@<$#Cg-*&DD*Yn^WLp>y$};e<6oVkuyu3VBf5_P%5b53GtH; za=3sd?6JyrSXolb?I_|#moj)zrn#Rtj-`(;xbJfx%JEJv58dOL?+r@J9LToZZR5Ls z+`&!}QADyk2V|Bbdwj?&A6Mj8G`P#FNpiq#Ilsn-d!#E{>9rhy+3xHJ1@A7EACnxl zX3R5?JEFqGK|qJP2{k%fjx=wck4;z{3<y_0H)|O@aGXivVZ!`1q`g;+2hsOA&|n7$4v+(enIINML=TEJk_YAqGuM!| zUJ3c{vW@cqYVq3m)IX%5mr)0!Y<2faMwK+&mc08V^GO)3dGIh{tvIA*mjMcNlv};b zT8tUdf6Pd-!^$&9x5_i}WVBetzQ&E~NCC-SC+rvq15=~Hl$xvLUAQMBRM3;3vL~?md{g@2XKq=CV*MX zZjBf@vEaEi%)G^4(NHlzrCGC^R`OkhZzDD) zqGR&oX~Eicj*q7W%l3_C7vm|nhFP$5Uo?`zQw|Mt0xV3JJr~^U8Dk-@j#+Rsr$NFb zbj%5`@=a46tEv_A(PcB=07g4tX`XpO~%cEE>uK>TC z&2f_u;E`uP56UOZl$S>_Wo{9EIh!jdBEnCEDT^^DK%5qbM#LG5uiQfXvYR)J{K_H3 zPlAWV2{Y-Un@M9lvw8LZ!)&G*9{mggM)HBh#@{HBk5-!hZ9kb^NlDN!1K%InAJ{-Ll>0_h^N1+i@ zN{%NosrjI$Mfn7Oms&@N&!`5sbs;2`RI9GPkFXBM$IKx79s&{A6<0!)c@B(nfu7%J zBb}PXHW{11&!khUd99cn#%i-G6*zrW$Sio`H__xqwOpwNO_cIPJ62uP3|~OY6U0G> zI2gW<8eH)g2^jj3>2FBEG~{Fx9(zJMHWlPhQ0>WBn2nF&`+Xeb5>lK%JKp4-=rv$l zXY5APGHD_zDfvMmRr>H!;)2Pr<{36hG=UP#YM4CWyrX^`(@vB?jI*wKi(V_4j3SG( z=#cU#0R^f-rBCcDxbQ-b>?5~z3LY}`8J6ry@&s}nZQu}R!~1b%uGD=w0Fgw4R2;+$ z!>SR~Bg=avSU;C8b1UfKi#RHY#L}?iTV$4|jSMnlKj>AE(0rogowH`(4O7_e;2x;Bi%AvKQVJPZZ zACp>2$#?W_sO+<48w%f|N=S#jzN9E_%c;1mkr=Le7)t4A837rGR3U`Z)8n>V2;MqG zok-pJJy~!Q^+Kw;$mV2pNTe|$D2FMcL>l6Q@5TV;YLL8F(lZ;dwk^7xCOo!s!lg5fyTArQhJc(`t z8SO6G-339bxG=Ngy}7xywXwB;`}|V!ZfS!r)9j@y^@?bXtP3-U#MdvR;tb$dzOE?r)jb4_en z-CkXon{!QUS+F*HM%1B{ru!i?ZcgCbCc7CV4V)-t_jeP( zQDwUyGUMh1ZnWr2S}S4_xWAhKjs}DKp%VgU$-9BQKpJymkhs5_0FLI0`=Jv8H(Gio zF(>Ab`@1o4Vl25IIw5eD@EwUcF~;2Aje!$W&Hc~`fjgNf7gNyv-55AA6x|P<47ed- zre+XT;OET!HlQroqjEcfy}Hx{F(&b8NWf%w#TlPN3-UZqBQhOl#W@-my z-%Ra)?3=0Gk9{+>_pxuLc0Tsa)V{~QncDT(H&c6_)Xjk%k2u*>J$tHQU1d_z2wzS& zTTGQX3<}Gh7~ed!wjKil&%q-(Ky)kaX#b%~7rKQ`6bhRvZ0LU4NSAy%+pV%s3f5#x zo5_&sIhe-Yr%V7?OHd4Owk<>_ zz3t1ED)zT0wCRg?TyF7WWQG0liEsDZLdN~^7rfcCWX%YIc)?pex7>1LZS+PD`~TMp zZ_dn2Y_m5?+9fwEFLZ^Scun07ZyV4E4wh#d1ba=uHtjQ ztOd+|g(|agOXcElULWM}lb0rAV2W#eULPF)|F5kx&!`HX}bxQhI1E(JuiNmRju_D#ZM7{YM1wAh`Ngaczuun zF0U@mEpA+iDx?a7sEb2t57Gti8lTq($6uQ(ZOksk<0lDB6<4jJ$XLA+KOqooA-rX6 z(YlzZ*14kIIi|TaPW3?~O4jLEMcA?~RH!QtuIU?<8p>^<_jp{eP(@85pogK&=Eb;V z;kJr{W#|}=oK1m2{8m(4de~|B z>=+*f7E7-heqM*YHLK5#@c~vaO!aUsK53#L)Ie=NzN^3TK?otr_y;kbM)c*t?%4l*sR~ZJNv}HxwLra-KUS+ zzlr_-ul?HBUi&-$C;mGB^Q(t}AKv}Xzj=M(i%&n>d;RmT|Mv9f+Y1$4wQ_oXs#3#= z5DFpgO)pF}+i08~pf24_`N3Q5bi6gx(DZ)svoHTGsQakHHeXGt7AKv@RR8*w2T|q+ zA4D%G6nvE8m^;3|<5f}8vD`*6Q}Egm0!q8V8{T{UE{a9+YaWUgBIf}gK{iDTIT`)| zS~&S-++nzD{XNxAYPD7Ew(HePUb%}pl{xqH z)f_}`c@^H;YN366fMEm<)O?hZo<7u_IO26TyZfw78KQp~GB6~o0wC^o+fDg}QV^lC zeOv;3VJE;t9K0Wzw(}?x8KRtC!votRbQ3N5?$-j0BOiMUwE-)vKgc9UVRsB`&dOVdTOtINuEyNj{(4;OhqSsG}`UX6qfC$|6O8U=vjlR zovl5UCbNZ}e<;csqOm2jK>7{2`~Y!6>OPk82Og^BqB3c`ges#Y1@>NBJ`%t9)mPr_ zeppL^FUu+2!hDq6>~~O^H9$K&d^>*g%YWy+x4SFSIqY|&pB-Q8wre3<-|V&fm71)NwIr$6{@I`Z$N%snQ~|B9N@=;?Mn*>$fxF-e z;Pb*3>1%t#`<8c4M%&)FXubdQpZ>Xbr(Z`&Nv8jBrTAs!G$HTD>-iyS6DK0Q?NwL{ zYG|@1>ls#pmMjM%y?^nuzx>J1zxTsm{OpUrMUD_)Lgffmt&;504@o?vmB^{#N{ zVI9OQ1#tVJ*J(HESX+{Or&~ua$R3c581X~At0*ePOK(+yNPJz`GaBCyy+g@#>VW&y zQei&3eSE3m_gj_P8zkTFo!T0My4S=j-;ITk=C!?crW9(UG_62IKJFuG8(h2^NhXYu z5=;=9&kCey2*}x)+4$1c^gzIs%B^65ck>H4+ByL>5?Ht`& zUp{(VJGx$<+bLZ>2=DyiTmRWN@6UaC_4BV$sa^TpXJKzC#cV0H`6)^cWG@P1VwJWN zzj{}Z^w$k?YPPTb0M(*JfhbZITxjLy2M%y`nKPM-mLLNex-=d4V4uF@Zxj zXjNKDN;|Z)%d1Vl#k4;@Z86`y8kA}`KyhZ|MB>NC zeFzIeSq>oCAXN8${=Kg($jFSMg}vQ+H|!PV3v=7Nd1u6)kxDYXd^hPvW6`)xr7rP}q1Aelk169`_e-4=}a#m?& zTW;P;p>((w`{G|q@?=u=?KB|a*wDG)T}9(sBw;j)f>c}IidI)@3d^S;B#*U%Mp|$E z_)i8ta<$&O)-S8C+(3bPQ3!P?dy$-!a~emIfFsj~VtWkxMClJmUexTSO;8E6WnpQZ zU;OMZ{%GK%ANien&{ZE@Rb79XZQ2P?N1qx%w2@k>g-a-0{SRq=r6=>{_Xozk+HUW` zB14&bRP6Tk2X>BH6;Fk)P@{`Jm)TX39z-2}8ol?`UnUeDG*@b!VTYkzE(x7{BYdRE ziD(5M_+lJF6wuNWWgG^66S=q$;IukdZ=)xvvNWYmbGKavQ(O|b4+C0f9GvtCqD0FV zi#wX|BLqEg01N`^c$5%VMbEvqRE@WrBHvVXpkwjlk-N11IrNXfd%Zx^3(V0v%oG%& zSEA#P_(X@u9+lvie>IL0v_#gfe?WyzYZ+4N4REk9yD_z_xe7lEr(E(BEh{7`5`#80 z8ZkMwSTAl5 zDuV&FcyDy*22>I-ERH;aCv^_sCTpGskmj}Je*ap$8um;F0W z!pFruwg3PAYv0)ZweSDxZGO*Z{8C`xhpWHy&G%NnXn(dzb8YVPxn-xhwmcPb6NZf) z#E0z1@T0fcg4V4d$r5ckAP~R$BCo~vh1%3WGl_d4^mnOIF&HIxcghp{NbN+GV*%P3 zttu!XVeL@&7;vJ^jVKD%t7y~-6ZKyghMvH7395FtLA^uu0cC^DHj+D;uiI?ad(vS5 zS_>~=hb9k+?1TcMvb2?lGOj3AVIPSsjzB@OZa}XAH6He2Xbd7|mREry!`3yiiNnXL zK?91PvmUU_f&^OOFwuw??MU>X&`B$R!$sO8*mk6kP4XUleuxv~5WXE+Y_f|UYOy63 zak#bi)la;8hwb7ncGA$Vu#1s^+|wQq@51cXsw#5AU6~IG>a%f+?Lzp`zwmZ;-oq-! z?gI=Fbg@~55o~aje(TFW^{#H*zAHH0d2ijD<(io_9^$L`=N>vQbMfH->Q`aT!(X6Q z1)$Mw0xJX#mz1&i^B?^+a2>Lji&*lkkHVEi{n9$HwvR}ZF`vA*E%$F_ppK}(889L+TrF9C5Uyk7iLH`wbp zeC$0y>QYFBxWm*raDw0p_rTiwG}M(tp$mrK2jI034zjon)>kwq*_rqa*kmE=uaI?n zZKTvI|Hcumus^|GErM>Mt(N&hJ*27Ef$v8I;C0RwP%F0zjnrfT{I7v1A)lv7Tu^ez)76-!E3L z&wl4{p?7C%du^wAw|DQut&jGfeAK?b_Yn#u+to|J-ogf?qrK9zjz68Tc%x5|d}WH7Ok{1l&GM?MlcYkq5yT;+o`1 zcV!5Ms?bzN6(j&iZz$advF>}d{vNmSs3Ad46iQXSk)Q*px!`^69hn`H2ZnyD=N@u-<+Fx`=`7uy5sev$>MOzgVoIj7vo47O5RZtKjFew-t!JTrga=ZKUStq25?RdC`ew+>VLz)0IFIExHbJ*xEEe~uksxyF`YNp%_fL)?n*r~k^k zi*<(W0i%W}CV9cvU5Co%ucRV)g#@{22mK%aOHe*xR#e4j`%U#mO=$zrg>r&$RC5qQ z=kqBP+fV)~=|tDYRHcD#Y^-fUhZQQ7;YYuU{X2ZTBtUVSgOD`g((n-%fy~l4?BEer z8jbDS)V7`uV@0sgETZ}AFrCB$!I{L4Z@L(Q1{f=NBSB>a?8P%!OURij3s};w^axQh z5$HI6M!fWRsH0{;AA$#4POJ^>z!UBt*S9`tc{HfSW{R^5C(~l{mlsMir5XG)H&a}k zn_FJ0Ebh)ORs0icF$nNjfsK;m18QvIxUqGY=$C7?(x>f%web4xe!so;ZsXIfJH4fu z<^9^#$Cd5(8pZATPiC)n_pjBiuX6wYwO{|Iui?M*Kj#=Y$G|xT&M|O~fiuUz=l}cC z-}$ZJ&F}x&*LPljeRK1(H{Xl4QzOIQU@jzL?6P-KHEf1;%%F z3=_{J!!G%x4h~{@*<=7AOvb8?D`b407q;phoVTg{7u_;6!QkoerGzd{p|*Q(VM~KE zvWD2ba2X;b3QcgiSK$CSu2r7SYP}0LAZ!d}97D9}zqi3E%yCZ84Ln083b*7NGB ztb7y|Ksv@!ViSo@xr54&wt|8%svxzF@+5i2t$t~dsWk1T1W_lAibs|3Nqz~D{RZ$I8r_`fjcM7 zxa#~8ad$*VGYE@XJsl*T1ecGbvU6!gR7f0VCbwi)EHDYVnl!aZfbiaycgRRc zI>SVZtCWCC$}NiXM#KqM>bvkXA+8EBG>Bp0IVAk346VeGgEk@P|A)zdvj;e9=z@w> z2qG@v_l09AddIjwRiE{Egeaz}SA&r^CFlQN`@dfM#%uWN{Le2J2L90d2j9GN<;&}z z9q~+J;dB2=WJD(eEElH`8Pzy~t38D2ys9&OKvDW4&SSp(LADvKX$rA=f z!yyy22|p}Cwbhvf0`d>x8KrL>P~ps)A&M3I7($=01&qFhZe+y1nfYK~KgRbZ0!&3{ zBA||b;e&dJ7)!=FBd@7dMMk@Jd3)DyZ{s(5UzK;(gvZBcjy(4q$O7=yfgs$t4EdMP zOylm>F_j`d-om_K5mhB*;i!jjamjrEN-+({E{1If*W+| z2wHt&4@-ziSg(Pq{=(bT+LqB8nArNx2SkhxJ>01U*i@xo`hoXBYFQM`G29E^k(ft> zY?^2ZwFOHL@|WHYGBRji0?DX<$H+{Tm%)<^p24Vmfb`eD`k}Ych5Rm7c_at9E=LG_ z2j6MQfwhoXSjU_3*1%qgp$PzT?l%w%8PjdRG?+l=0^pck<;>u4qmPsM7Q!SE@ro0C zVUs8oU>8?CMCNwo&|aQF(u9cCoTByL<9;4I}m9(~Tjz zVBk>WY_Mmad?d7381^>&nXShkKKbZ_`~AgRorNR6Jpbw8=KX&7!Q;*M7vHPgyYroo zS~vD*et7&}eDnQxzASzAfGTqN^UZHNRpjL3E(~dl!yvO!T z33?BDPjUp5Xm2A>2ejQr7RD_Nr%+WR@|aEbKs@<7}59VoJ>* zMy=UK4i6+NY;rO)Bhe^$7`Jr<70BRx#Z7E;6vt>MrieHkWEHe=7Rf07rVj@L^c^K{ z9QYz*LghqB1j>`3O#wNBXW%o^t*Di#=$ShN?U<546zAO47kkX)QmISOyL4$G7f*nW zatvtoGRdii452d8=YWBOdT=N@TVjqR;!4t$s2UlvkI9EEyhBahX!{U3$dJJ7K4nrC zuCYOz4{@JoyhkuE;Znzfx>F;~9 zPxN}nrcVM;OCLoF6yaBxGh-(-34m^J>fWjxdF3N-e&)ZnUi-z*{^)<9;*GQ4B+&>4 zfrS5I;smCTAli`x#hs1GSp+c1u-pf&jini(q9nr;h%y$Cp5rAT>*WHzL2xo|_P~>4ENIyh64i!GB6Nr?Z;avmCHAv*-B=SyZhqiXn&&E*%D^ zeeth}##2=-KyX?+&*&gnUGc_kP;N)OIo5Z6qs{B6V5CnZ)Bcapc=#R`;Fd;48LA9a>RmXGi`;lUEV$n?{=R&b z&a#~|_rMmhtRb-<%z;f0+6{({F%?@PLXj1tk{lu2>#a%yQMV9h+*~qR7kUp5L}o9Z zQF;~n03CYxB*?Jah7hE3AmdTBF#qfxGTV15-Fip6pOwTDC5j^$1S?Uc!Lb9^JNBjW z?XDcs;0&kVfwd3iiIEw@2A#@;IDSp`f4y2;REvpM1>6`3k{3Dm9f=4JS_gILLjH_~ zfH^#9*)FOTU7gKw%wf5OtrBnJmyFANm>>Q54CE@hF_}C`JtS5Ks#FPo{&|lx;O5D=8^uG1EtyiuLVA zq-stqPicYVe9R;Q$W4__A64rUr!*1 z5_2ClZGTj%lm46-$T4d6;nGmL=Lrh-e*7|0oaM(9?dvB<{a{b*P3Z`Z_tip`Po(!Q zd~Z^y0TK=8_G&a#Q0e;cfFq+D*-Q|17zP^xQhKl6!QV)s;>OrezKR=;{LpkkCWfVi zf;|F&txbn<)oLYWcMO(_Rv#nbop0K=q+B!DsX#@BGBV&jFk$K;Ld$0^rLF^f*JV8) z*R2YUt$+ggAeu0DdzC&S2Phm6Tu@Y}|JcsK5zE9c%=HN8{%&^9ih3Cq!C;m;DG-o1 z1ht0${M78s!$gi~eyLAF^d-v)Fe{upLNz6ocLspZPK;= zD~%c(^R1q`%C z^oDbVloaCMdX*lw#zlTSq+S3m9*5yoJr5dB1eXCzxbQ-v%MA065`+r-V@ttY%a`LT zxug$hF}*dnToabBX#CyKD1V7t`WnxK&}xpETmF=REtkgc5Ms|U{3!oQF3*v*#UCHB zqc*?Uh>bWq$L#G5@&ImrWMLizSbRCK z2$@IuKExGWG%0jGr=ewr;H-MuO>0CD{Ao4_%Q z_zG^qtPm9dfRHLy8BD^TxuZixuZD9=X103D#hsczJIV_JWUptYN~fKifI%73l7Ted z$Jvrh)*j$@=?A=l+rJl$!g398(hx`S;g6a}%D&7@Qy9Ks!;-;PifS^4Qg@=r-^1b_ zTtodblro&|aNZ%7|C2Hl_CBu&f>sI}rv5CiwG*Wn)w@!Gv4vR``}Lx+qQdDY)=8O8 zfZ+I2VKs4nEBiqe$`6~k-)zD21!I+a@@#wTdD>#+1oq4=gO=oK-p6gqQ=MoXvC0_A(WT{GPj;Ekb%j`fx|WR2rQkH4RQeNHVz|z zmFyY|Xv2d!fXOx`^Af9NOAe5HPAQNB+EGSkhE2dy-5p~XT$Nu&S_eh-lC}~2E&^Z> zxe<`!l4KkT#QXrF`hJx&1 ztw$C&JxX{&2Z=%R$D}~jTrw2e6L3+CUFh7G-7lKtx*S%9Wx$W`m2q40v8%{!pc;En z5k(HD-4?p}OkPWFgf*@G3}YD7C);*p+sbFT?Qk2;X4PK8ZHL=Nj{ttL+m38QJ}=sqtOi;ZZzo->Tw?vU=XT(JMYUsz#>Ab7CzLH2^o zm)Xe(8N2&=q}lsQ_pZWh2XcmwP2`k&Zqoay7bKD9CL@vNp1au-c?ohb)7;Bz z`OLipLMif)B|0N37R7o{hom5pkf#MKmcmvTIxqz_^BK5`tQy-%&y%G1TLp%&$0tq< zSfLACwI;)8=*W%YCd@fNe^5jN;F2m!Wjf4C5DRPIqstom_qAAjl67Y6m=?Ixp_FpQ zb|fQ&li;fOdn9B7P5S2=+QylmyXJ?Q{7|@!)CBn~da6q(#)c{vXkB9(C&*7+{pEJ` z$czyUW`-B9zYN1lT#90Qa#P+Nd<+M3K&2TwV?5@CB*)W;QZP3Wdo=C`fI~*`3>l^s z^pQr}7*-~cpShg8I`HSacnAI>^(X$RSWNzG?wiN> zokv{mNBmCw2UitV9zBDc+k59>p%)g}>iS{f*yERQAB!q)J!)3*FaP9tOIGR;pVX@& zKWBbRdDvfm-+FTW6s@IARLcoAVL_cOr%yvoIp&aU7{-Jb|1^pmb9~foMjC_uyF=nw zqTPW|djb3Z?@(N%mne!{P4k0$8xf7FDcJp#fz8cJIi~EkRn4#?r!1_R4H~EGej=J8 z*xdbufx`#^_fye0&lgp0+u49Pa*|3uxo2Po8I39<+r}N|`J&1)+g(nwlR3z;?e3vz zrn~i^A%V(U@&lQ2Xr!`wR)-;>Rt~CDAm;~_pQMl|5+mgSX`_T%ChX6|3`&$4M|KKZ z8`_3qJX%yJLj^dq4hk#2F?!dyA80hP?oc!uOvdOnl_aV%w52|CU-j0uJK&~_!(+@; zfq=*hF}YUMKZwYs&4vox%D}o*SfS;K!sk_7q|Xw{P&|6KXsE3`h%(MD72*e#Z!V^oD zjQ1Tw0wca;2*mxEQ49G>{#a&T;45v}r8A|w@QFER!Mfl5`82iW%v$rCjcY?BaIHkEa1ki7DZ!}Cs6;TJl;R@*mA&b_3s8sDlB|4skwtDn2m)IiH(y~Q`S%_PVDxP7eyDB&N{kPM`b^xhug~} zLsd6X3$u3(6xRq;E)$8*_28Bs6bs~9AyW@q8WGL;Kk< zEqb#1TZM+=PcfO3k+y>2m8c|QF+vUp zMYdHlD&JPV<~BTxVf6fM&IEtEL7AlC8A%TJr_8MLnUvYCzl30Ne=M>rmDqAWWFR`7 zP|HC<*{;N#aX*%8aD0zOw%hHMplYQ#+-v&M5_Gl?@3|55gw$mYVz)eR1Dn8{#BTZ9 z#wYd>F~qL~wQHl~6(jc%LDkQV-Y08{xse_z7l)zdek0N}vVq}VVBm}7*CEQ z=)BQM;9jLK{wTC3YSq}DM9wLY>PmkdPJ4FI?uwb@;$tzVIO2PQj{#D}aT+5)#qP6I zDF&89skVEMku-c}9tuKe91_F86L$pMHw@h9!{>!Fqq8W{=9U3QVCnUD2zNtd&v(a% z{r^V@{6}qntME&-#>1+X8|c)|48AIoLc$}xUzW4X>-dLvhSEQuGv}DPQ8EhJmfJ{! zW)CHC|3!sh({5+;a&-O}db+7CNMFiMqtA^Qt={UGTC%MBO>eZg6yd(b`zR>Oz&hP} z;}j)j6V)pp6bKj{c76kAlps6A){$8X;)qP$ypB6(#z%nVnLvqiKtjo|rj_Ky>#qbC z5v9c8fQ4kpbOaNrg~}XZ$&;16eO(QwKTyNBSs@IW*XSf!$!wMdJ>-SLk_T!beSK>mo zGJWv4GydQhv=}1+Pl=dcNpw(QWeKXLa?pT)Sm&>NDXWF{SXCyZZu!I34IDW%QClCF z@X$Y{-@zFXoAE*P;nV0;TSdb#^f^N0aI=DH=4h$XZ*+WJli=)?>4-)llPmmudPLyt_+1ruY?0Ite7ZNd4DnxMQ|u^ zu&+6DlXnD{suj(_C)R1o_`ZcvY?lLUqt#AtYABIEo~faz-mTz`6*1X%Lc&k(584)m z!w9pYy)F07_)BUXbPV{g4DaV4wNdVZNODNR_Y*bdMEY>n(~7MqEgGGW99=G0OJ`~L@t7JrfEa`XCg5iX(=-QPQzY_ZFd zOn~CDr3;pJgvL0D&?sd~pyw(zM!Gq*Njgfnmn`u!fd#OR_FTM`OA^`jJH`hqUu_O; zG$(vw=;_>%&GnA_Kz<+U7gNt_&sc>m(iqSebc*F8w66;~svn+q6C1BC+L`z)F*%S5 z8jlva$~<&hYBw1nh%Qt}m()!oyNd+R$p;wB`5J+w_VJb~*nr7X(Fkf$U4f24r+ zkh81dz)%khS01+FJBHllGUzu!>nd(~8t+Uu(SBiyQ?m$OT@c?sYQ$bb9u1n&f#s9~ zhU^Ds{^S$1Cx+AQrr$BQ(oSk?f8;KHV5nIG?j{36F6jxopEg7TbmSl!Hz}VKtQgyQ zU^+{ulPHI0q8Z>V98?dmVus1dN|BRHG{_mBz>cuejd3)FPe+?H86%85J_3zpGsW@A8FhS9*R3o* zEe29KKMy~+CuK%Rb4&KqgL&h*aPp#kPEO9wA!M_6fH_1%j&G!WQ`rB%2E~RPTcZ$$ z$d?>rTf4sjdq-OqqxO*5TRxF1IY6<4ILGIMA1o0UF8X;rM7$oRwnm zN~NS)uh~GZW-z5TsoZ>eQzB9>p>Y)M@ru5wu0JalxF>x1K8-kP6XFQvv` zn_HgUni(=aEq2%VygoSo%-rnO<=NEu%bV+KTU$fMKWNN6b&b#KqsLe4g05%iepU@C z$S!5T)CxMw23_u1Qjlz{ZEkFBSr>=DI|Sg_-EPALFs}~+oFb8&fXX{d;&72_J8*9XVnSe#p(Urvp`wY<2nG&cl(TDY$9d3|vFH2hj3k3g@Q zpas<+dTD^7LuaM1@+@lJNvB)jcPq7xpo7wnE3=mh)#xXvsC{f~9vEkS1sbdh1%{XO zLvt7q$_<;J)#&E2asHS6DniB`&#uXh=sA7H=X!D-Co3ps0Dqu{fvsEI58}G@l&a<7 z`1(4AP^CTM=i`EV&cPG6qjyxEjAQ&QU4=?REYA%EMjlQ&%c zfuAPCX zUw{4Td!Ma;2-8Uv=X5^Z1pS)UiqMy;4i?I0p*od>FX+^%2Ub#=;6dQB%X<7W!F#V**KgElDg@u446az=tNO2ags_jIh_a){jMfUyEJX*)VoNb zE7C}Uv10O5?$>-2!$h?zhV$?=oY)AFgQ|Q&p?8SX5wG9b>q`6)%`9`&e=zrL7;90a z(>)A;BIJ0P&Llo~Fo($^7v%u)EFlid>$?a^Y9a9i$*fYSOoadum#yFsAJ!HV!l86U zIpDJ2LDDr4$+#GaS?a(hV(Bv6rUK!I?n`>Z&Iq0#lWihw5= z>Rd~t6SY7I(h9esrx&m!9Ydc`Q4KBbB|=KtKJ{vC_<8nfD4-w8RW2mHf@r69heIGg z_n_WwxA-&GlT>@!_1F#*_!X4EH%H+!h47l zq^VG>VEj;D!7E`Ge!W7i*Xx8U)6<8Chf{FL^!jDQ-nJ|4_I^D;tZZ{SXd+*D`jgjcyO^_iP{Bf-Q8Sl0v$$(A+nE~#d}L@w8BP4pG}J1++ak)NU`2{pt>n}#D^1f z?tao>dL*X6BkmERNeTzKpUM4|7s7pR7^8XEyy<>8_k>3BwR`*s7(r^x^&_5E3Sc}s zbIKFbT@48!7#$SxOAz4l%Niu{D-`{49s&5K zjsP4tK0?|;V0RP;Q0Ul*ZT5@6jY_TFsCEOKikpy%en`(B9ro4sp);=HeLmscG*3i_ z_UcX9&N+|x)q9)V?%}8(rPXvef_g(T&lnL}#14ht)WjGF0nu=)x5fK=?cU8BUi2)+ zJ7yA(%vkrqP+sCTT%29cdfFWgppZ2f2_V&qXl7WZ!MzF&Q>e*Kehd%p6?2OD$O>$S(#PJ6e!z4YnRy<2;waISv8cqr%pU;p1; z!++<0&M|O~fpZL;W8l@pz`vXNPySwg`u}<7lhP8PZ| zNN5AIazAc-G9O=X-)Bk*hZ}(r_seE*;*0JcIlXSRdrbL{iKwu>J8)obJ}1OD6)gi! z0^LXGJWfG{&mq2GvW^p?&e6eZY z_i)-&Mhm&nYt;8C6QTx$M+gZgsNiy~3?3KfJxdZ2aev5wZaKVkgTLnLZVLC>f8xs ztMZ=Q!p!~nH@~s{+Sh*V`>*}l_wm=6{`teJzx~at+dui8|91KH&%gfL7k_`c6dAGe zQz{q`<-Vs&GgD{>3Y&Eu=g^%aZyUj<2s@O8xv+-V%8TAFe)i+P$Tna#x%}d1fA~Lo zHv5!V;e`n9tFkk|fs_glLo~ZZFyb5D7NRv*JKcH%KeZd-Ti%9`uIh)uThv!n zLU@bRrl7i{2HZv04m2V?@-C1ZLMhXQ-Z4*gsI}KabYB?}6gB9*pMUQwp)dbPy1whXqC0`8Hfp*}0SW)~Pyf*S2j9GN z<;&}z9TBAqpZiywC|#V2dj0{gtJMQ`5vh8sQH$GO{Orpg zf*{i*!L(#XWo`-(KdE9B1@Avx{he>VxB5l#1DvBfAvL9NWc1m0gh;Fk8Z0pnnItJMGu2{h}p!7h$K*frNlhS>R~0qK4Knd z7BLppfMeu^a`DlmYSg6@3$`JsMz4I7ml*8OV4-@D2|wI!?X~$c!%pix!q2703qAdi zg)U{cXu`c8yajXYu-)CqI;ogXgAPO*qlt`ygsqx`79PR4%ACRscY~nHtYluSq7Xby zC)#+;cGv@mpQ4)#BWZOr8A0om7hxNSY7spUiLKz02SW=l<07ooz=th|AAPS}-$MmI zzeAJm5D9Cf#((zb|M5TkC?Tt%VZb#lZn7xc6N`v)JybybhBnL^b@dF^_9x!G!*&rJ zZBTBIAt?wYVgWfN{qVPlRkI1^cb_a}FM?_oi=ndfLPe9qg)@jmHaTt*;h7_-3m(u|LNDsLr zkETip%4Y?J#>0s*J2N|9ER~8S*jsRKsE$b1el(owx9A-SYZ7kPskM9UVrii?vrsC{ zFD%cLmWvD3s=v56JHK09TKqQG^&Kn_%7}hzx88dPQGK0n9loVdu_kul@SJ-@N(dZ+tc_=F8_7r=2=%Y0B@^u`0Lw zWkg4MtGBnkTZpY+JwQ%~q=!IK{u%fzrxKHAy|q4$=9G5DL7dp3+9c8vNAsU(j9tX{ zC6q6Ei-B87Q=JH;HYy&{AUd@! zLW(9nU5m8iAeX7h{^E~@sM&}EVzE@)pb|(+Eze<7D-DnW_>cc3D4#GZsv=hUO~DPL zjrlg{LULJTRGoVwCiE#3+fV)qTJ0A<`{Hj!r)guV(m=*GY;;ixs4ajW{c0Pr(On^& zpcQgoNE#vQf^w!T>rV*~5dTG#YcYg?bQ4jX+f)SZEf}{Pa;pDlD?eNNR^c z1B?~Ck)W~ymF{rX5^|=>VobK;h6qtI5$HHBgQULWp^lmXs!gH`5N1Ye112ps8)ij? z_S5f;qtGTTj|R2aOmTMMWLj+gGW1w!2LH^>6c^{_mX|7vyR%Cb|HN7h0z6h=qvZI2 z8k;z7Y~3aL;Uov!aa2JN*V&w4eTLx*pM$TtXz4ZkWu-iYIaaU;%Wp<~{K)2C&=1@p8541jHjHvGm~5X$l-2eMfiK87?u zZzDirquTuv93PrVbQ;7BR5qpqtF#V$cG=+549_Q_762Vis`yZNh}k3I5Lm+BIFr&E zmnb@l=7(%U*>&Otvj*HoV6cvljJ&|oy=o!%>pdh%(vSw&K6VL^VIttTZRM9Sdn_H? z7(GB2Afr-AMlLu_4Y=sLN7x>=j{sJ`0?iHQMjOTBk+#u-t=gh#&i51gC5qata^iAaK1omV+1hRU`-B`+1Z6LKtVN@eh1oWa`4Q}Tpj}+ z8pTkAlLKddX=w~_j`~mglY?b$b{y2eP2(SygKqa|auCfg&ke;62{~~j5W*BfZ5`1Z zMT*@HJ0%u&a2b}OQYd%TWqETB?5IK$ASWSqis0f3Ot_*5^dk4sVev7AxeO!EVEZM{ zcsnBW@A4V%f=GPWLjV2$jQ{`UVnQXR4heT5tR{z>%cX_s(rlW^c}1ThN?D|Y@EOSA zhwyJQV$)>rZ^tqmb9Q*v;LqxJ-~pA{BUcY%oEWF)hH?-(0nR?2cgF+dM`|KDV zkB2Qjjug69u;)`Z_2nNWJ`p;>B{AN&(hTbOix!7DQ1>oiT&T6GLTvQV^sLt?BQGro zYYLzu6o+h5xSEvm^%jhBIMd;yw#WBSR|#57ttDV_JyPl8BnQ-d$$Q*~_0qz;tU(f* z4AOU>J{Ke{LM!Mkt{-CSqP8SKmudrcGAF4-@4!;f18c1WxJfr2b}ohOle;Zmu)vTd zW-Ly*hb8h1a~IAXsP6b<*pIL?xLQ@9MwV2mavw_iiJW#pm1eHy zl(#AeYie_ku^LJx>a}yjo*+IA{0`Sew6)?;V;#ZB0>Jf7h;F0tGkQ6N63vpy%Vs4r zU|2K=Iac3 z2B7!N;SrpRI4C6g5mf+l33CDc@J(R`TtzqqEG&%R!K#Dz1YeCg4yOS!E5ea9Nx~+5 z9x6lAgB?R72i`|~nIXelh}pm=(1~&t_7uoe5xv;S3b`O#!w-bRU=YT*W&~hgp;P?e z1d5*^9b_Pu5>lQM#A=+X5D&hs5vWkc!VuUcD=hM^nzRpps%ml%=MbRmbQ(v*)*j%% ziqWQ4mMD%cB-(?><5`l7h56rX%jt%}h{2JbfUKwNeWTMevHZD0pne5Cp~{$LOoW`T zp5^^I3`-J@-$h}>LoEM3N|r!kinvk8BX;D#tBk`UG**8KDWW$TNnv9%%nsy<;cv5= zF}esUmX#$%uql8o4<6wQiigA4{?3qEn#4%H8MEGOJ#HTvHUSC4&%^l&(?%pKn61>> z9ieiV_0@XEgIpjF$FL|h04rM1!o#MD9L2-EQO3?qJoOk-3wu$;&^%b}CcG|5vaNLc ztx63$9Zj?VUy0pB#8E3~;#k!$?$z5xg!S~$vWOb~7A{Y(*L?44z3pB2K;58L|6Bb3 z*BM$}Z;e1#leFM3FI|3)+C8<=z;WXfXdm&47Rx~o>XvC5x(gN#0eS)U|K(;_#EB2K zn<}phkdYX{U-FCYPGc9bxg`h2!_O3ebtnYeNY^c+= zg}^2fSn0W-+k~8hWP>lN;Td4!(A3}goM zC)9}ZE_|YZpwkAI(x6oP>C_0=!Ko+2&a!V}k)qpWsJDF_hyiI>)PxO&XQI!9@cqGs zDyI%@1UAqI4R-Dpce|9tFT${)d^0)>aKfD2770gBi+FKtcp)n+kYSKO2`X%A)GKYP z5Dl@En2!g43}@N(VNk*~qckWhaA`W0SGoTB$#NGe9>s~|Bk_`8(AdaLB3h4_CVCu_ zCukfhV}OR0X{jkMMVaue=q1rmMF>zn8^~qoMDm)Z{VDG*ye)Kr@DN0hNHN@iqJn%L zVYKalm%O_)&u+s>+|^oO1G1gPqy)4MZ)m$obQ})&n>g`-_z()hiLi={z!`CgltUbf-GVieCE>&6b`Pvxu?n{u!GPQ+xXQLs?70Vo19`%GiXjo1(SeI` zqsy=&ESn<09{e??-DKwe1H{|mM|S9*)X2M8f0B@~U`bMM#Md~v3ScOM3yh?W#5$M3 z=pyDrViyZl!+@r}i;7beJ<O(iWUsG;O_L5AkFda5Rl$D8GS``8ZSwWy15c z-PUO#QU2ToO__b7c2sEsgeFZBUk(=)ceFT27w<|t_Eu%cE#n^(acOK>V+yFU#~}EAvsivhSRO`xr(ftV)^? ze4Sv4Ujlmo+9jf$;{mk&9$f~{=;LLj!mT=^H;YCC7Ey>vqZLBdP##ew;UyWwBMwA{{L6VgsM2uG zMz{X-DSU8p+)Kzbnj-NhDBUx{4%?UNV;xLMxYf~jOv*{wWt+BFwY|cHvy33xJMg_@ zj6t~=o7{T-5tzWAA^!#r$ay=ur>20-iIJTdh)J45u{~y%6_Kry(?Rye7imi}Ao_?> zh5mQN>@Xm~IOPCBnTV7~C=t*=P?>SL%AjIlXq-5sgdSaT16C5w=3$2wTfW~aB09J3 z)1$R67rk4!=v~<6Ra!^?(+GDKAD^6Mw7k6h94(_Ehg7BM`N+iq)mM^}j-YoDx<%3x ztJqc?LBytxouYTt#yv@n1sp?)Qz)^C)#9d9l3fer_xv2UE!JyV&tW@N?DV^c7R3G! ztzIDFI|x8v+E5pyhIhHO5q+HS!9aLMZXBi;C;cJL0bFB=@eVELo= zUcZ|f#S+g9@fW!ac$z_jcE%n^=y}=*t6UH$K#_VMa!Ir>+~#J{oM{}wj#92*^YlMo}k z9A_&yCnJkfBHDoKwa1AIOiKcrSUHLa72|{rtL&CVwyV~uCbI|55Xeh}@oPMl zV=56BSPhIanQAe$bZ9Yz?Scx1I*bFlS-Srj^rP4FL$MWnd7ly}NQqmlu zw~E369*$*@fdM%W;P+(&Qo2&o3&q9ZYY;ZuSOj@5K#)1k$1-5kYkU`Z8G0p@Z->w- zpg{XP+fnW>807%XEDaM>u=rwSF)GSqns$Smz5L6LvA^vs%t*z0cS$c*kG)lB;}}?0Azs4@0;%spbU_;p~7X| zVT`B-IbpvTykql&JR!KHm_!o=v8upQ(YX3L0KlWj2f|E1u;RGm5rWdnbVjKM;MYOF z2Vz@IRz|{F313qr!kdn0F76RC;9moq8K%`vnKWh~mSfVUY(^9o0iuG1KLz0>bfqGx zTsh_hp9YIKkt71K`ot&C!r?ShiSe{H6w-M zPJee7E;<~*VNrNhdHWz2T3*sqmVp&x5qbC2*3cMvYsh~gPC5sAuGQMlUJR#V?l&vc5y7o zs>4v)2uLD;@=ScR2(zkJ=2<&XBKFj&l5%te5vWtAgCdRysW1Sl2vZG5{j}$b62n<+ z?-sFVg@LAnVqs(r)=*0fWH=uAT6!Swz6l0ZL7D3+x)!#chNIu=g3W122new4y9kDj zzpQM@Q1YhZ;93_T??)ra((kB|xQkGq-b%#oCZd5ONLa>-M%#Vq7%|#440C5jLk`;dj^Q$Ge-ySuHW_l@ zQEyKjt1x%jZ`7aCY~fBrrO{#OA!pgC1l*6nB?LYyZ64Eh96+on!($$q&KY}_D%U;` zr8>VnGktk}W_s>2Qot@1n5T&dbEzAMLwTm6t>R!B+m=Jg{{)97iof?DT_ABJ0j(Ug z9wW53h13VX0&@0YQzB**9U$$3@pW{-Q}?DS73@ovzTJNZpJsqsoclIcoLN#?1FE$n zMlk_$bfW-8ctaA_%FHvjcsh>v-+a<(s6-YbZyhmYEgypDKKv3)5z&k!td~q)dp?U& zIG&plU`taLxHs-^UtPHW$@|w2gZq0o!kafL>$3~Za_jNaJL@;*?#`F)9{&IBo$GI0 z`FY>BaZ<-^67R;@xR)fIWq`e)8jAOeTxUyCltis4YDG%g)q1N8XNKg6bD?H9lqh2h z@7gWuz;zPaO&lk|#z2guX@IsUkn{qyZ~C_HiXyM~Mc)KP7wA9G&-ZzLzjMx9NDe7F zapDnlb}7!8bAFfS_uQZFbM5Un-fTW8IR4+K{@-)_9sU`vz;FeID==Jv;R*~_V7LOq z75MA90)PJWCtp~5`~CmXet-UjFW&=h=k*kBr@uZ){q10S@A0SwnW~<%S=Ja6D`&E# zYj^_Ya>R3^BG>rL*2Xa)yU9v4(kWvVh|!5}JQek(Oh4KGs{7~YD*8s&Nv z3Gl37mSbiqaX*-1?&|i+#LaezqDDh2kTsz~a!XEQFe*zBvU(_bT_mYsS8?~?m;xt? zggoL1a#WHvpx3=|2wX=f(jnfP(Zb@+WyX^TSE6nF_qB)m12rU4>)K;v$w;i_PRd ztFSBbK7fCf3=eNo33M3Bc^H8luhB{c?}5@&?$g*=Je2?wBD>)Ax%QJPYA-N+0%IhU zr0Gf*z>KBx!U~u_`qDSu3ki6P%6LigZt>h$)(WTv(@Td#02h}JxKott8bYRRuWFR2 z)u41tj#@A8mv1<6$BTZMvjA}*E>pN?km*jLNvSQ9!v zF@ABTyX=u)yysDI$o#lMYmN;bQnKC8E%|SJc6NaA_~0@-MmV9=Xf*Q)gKZJHH@EHH zp_n#~VnPLno_8+y*qVQVEc3vT4bnyj|5o^da;4)JGLq~H-f!KOyeUuK*e@RLD2np#}brafAC<~t_dO1hIe_?PQ?Nj(Pan=6BvL5UuPqQ|s!K#v71T&XuK|R&U9&7!3x6Vs#MC#m znQ}^M9#?OVkBO1e&v-jeIxT_*RvCw-VQ?EPQGli5jz}qZHG-{Lu5S}=X+Cs$-pwh{8Ch<*xXW#{KUDoFkUa)6K8kBSh5ViY{}6f%NPhA%<}Q+&rGxEY*{@(?m_APWXX}te>Dp*+(X?st zX$>0bB=matlG`sn5aVC^m>KRdLPvBnb{O6i2ApMxJ|&eQgH!329pNX<5V46(;ARr0 ziDx*GbKIO;-6*WUG@&%Y;iRgn2}#c{oIrp%vn7d_-KI%UC6x>0dC^NRtpai zRlwZbk~F@QTgY8!6@`?vk%{5CqEH5vxKd{|Sy!coFj7{)pmwzgkx`rcO~gkI_Ki$- z6IIy}*tZxN+hyVJ?U8Z8){ur#r&pc<6qzNd(RG@-E)F0BH_VXNY<{Ac=rFjT3C3hr zOm=~3B3z4&zVc$7YG-^S+)iz7umt6yFbFxs?X+ zkLR#P&_@LBe?WINNdlM{jkCSCeE;pz?&Irs$DdwntTk?IZ!g~1yEnhKKmO*UsjXYf z?R!thA3S+dt3E1P|Gyu7{2YIWe}*eCT!G;V{6(z5pZwFGdVYE3qfdSC<_lkb=f&5) zd^JVO4k4(Nn<2N3XWGvcb#k7GS1zNbVHNd@Gr7pd7|5t)8S^Ncbp%7g6Nw>a&uC4-gi@TUUjt+q1C@2xzZQ3pf zsWrN4q{f?NBF|77)j>1&6xY;dFoUVRy^Sq{whp#~UWesHQk+=>9&aER;zom_J!XUX z>PQvI_^eVBAowQjX|AwleO`FQ@LOfgf{~4^_e^#o{ne;nq0t0M@qG=H!_R3TN|{$m zJUdXWnX&V@j0={Si-8TKjxZW>VEbt8%$0`?wu6xbL{3z>WI?s+jmLScJ)zH-X6Bx? zL_4E70Lr}?S*+@gPzmMZOQJFf&M7q_)C6fQ>ANn}T0^yRODbBE`d8GrHS#LJQohR4 zC#%?HC|ok_3TCEdm+K5xRK_QQYvW}1+Boo|xYxKBEh)Iy^cx)Xok5GiEEKsOWYpT4 zoM4e;PFWYAE-CpAOf0gEBp7vSfkfD*+lbg0RkrKK)@}gMHQb7zVY4FzK!ErkJ_bO} zg-Ox`t4+~N?Hg`68FJdBriCLjp<9&Ux~z1rQaiU=DOE%U_9_q6E>)U}C{hS|l}uG& z8aTUF1_8h;KkkAfB>R86QD{A57@E24Is6clogJXSDa#-2vycmcrSaIk_}P!-+`w zSfOIwbJG2QmMsJUrV#+quqL2T+5^y&RR{g4#5vwl3j#)>SHUW^ zi=4*vdSlE_(j-l~crD;+=#@J#URt)0+>zX$xC?pte zNJW7jLRKU}SeOnr6Spjhy6K1}c?5hTxnWB#2A;u}36|3OBa~>Ga7-}MEu%p(AZx>* zh@6$5dU$*!>SA^raU+|*(ENwMx{K$fwFQB(0!^V<89bFyBh~=j++*n^&XW1VjyRB! zY1XKw4go6RytQdvPyt8|XQ|X87r~L)ORr)5A{PTLl31E$=;&R(dsG|X8Z(6{qJ3|A zzavYD;dWNZUE)lDU?N4CB%PG^h`0ql9@kKyQi%@H!+A!i4dC_WIHsrpE{yZGphmMN z2B1#l0{x-|1M#Nux&F18= zjPgN@c0wk*sCg6va+HnK2{8~Kw|2fG2YG_o`iGtBQvRK>#ViUQp+1v75bo%l(Hldcj0 z;ZSN>*lRRi7SSqUEorI=)M>0$6&)<2mXRE#A8nUBbBr$#Lf03_X!4Gla3>(Lh<=cU zAZS&67)l#!6;LCIZZqn3Q!lfIzTiv2z%Gb7_6UC47{VE~18Xcs?ZA+LBwbZJ~J*?w>p%`L$_X%sYsLnH-p2K|5^krvL)|$ zLAsx_);JZqDkLw8d!S%_fo8}^1`qSFbo$IX_1LSNS!!W8_KJNy!)Zu}>)h0u`Pr#K z^$2I>3RsUxt7*xp@Q1E}gaUjoJtS;UkU=rp$ObjANgIzL_v8(kSLm1p#(4^YwL2n0*YNjKRF=RovW>_jd0P9~#SRu{%)VT^T zk6Ru{*|b>)X=Rx41W7>J=~a|MnoVMwX#9_fOzBgJkI0N{w0cL%$b&I}LWP*tClX%9 z)A^0?cF2SYYJzbe9bV>w^-Lu;;teLmw*ZyJ3Tu}27`+TZ#&1=b56dVN&BZ~byIWO) zICfIpDFbmHMN0CD^N_GL0l4SVo})DKHx9(pp725(VaPG7?I(345K;3?eN-@ny{l z84yOEA^RXvlhhebnEOl)QqzZL*li@rnovh1x-aCm+xRwkd}IqO1||DA2+<_uJ(G42`}Js= z@zA*P)xkENLAbQ&Q&~R8zB=aV9|tx^_ZCQXxZOkSm|Td zk{ijiSJnW@BCQd^-SJ7T*Xco0=!04*`WLh6nWekPHO)l*zf+HQ_fEEorP@yE9WO zJ-GIu-Cn=fda$;=yR>tC&f@<+{c#;uE1~whAS{!fgkD>__q%}{ppqI z|MkW83t#ygFXrFBH<|RZpLD>XthPaZPCxZ#;H;c}77}iQeiqRYu8A&ZU0)lCC-$|8 z?2$<_zPSxz8MX`_v*&LvtS{h|u)?rlUQ-xG`v;Y);SN$Ewz=RoRfa&?4RLpKO>L6| zWG?D};<#CD6Rp7Z@z9sBoE!UxWJ_B}ivnrV_vH)6*w#a1tOP#;*)cd1h{NlF)Uc`g zTY;*_jW%WIsrQc73+BPUTH_}XmCJux- ziS5Ys(k#$d$(_Z%widp(VsC%HcXzRO9Bm!YQ4{YDeKHb1KMCuWq|B0#aKKy5;crfp zBDjMx{1lVHssjvM4ju!yQ(lDNon@dX0K_WdFVd%~MVD{hK2vH3Zn#`c{&G1T<0>R> z%Cmdp$R9y_Kc{d#tv!$RYlm>~Y2rNn?R$>NjmUK12pa)#>kVCJ-#g=Fo) zRd}+~Zdz9^g-XCmAfFx*R#!{1;PyE))O`3aYl#C-fyw5^6%ut0! z3H^H^s#c~*z}j6PN(GdSDVnb}l%ba8UeDlpi(&BdBmarXqjP6On3>w@W1LOU_A$;S zBk&W0Jbm3wJh-oWDRXAl1n?Sjph)dvgW=5DpQ~+zK_R$Pm!JfaoABda5!}O0_*CHp zm~Dl_CPE{qZvE!~MXcYjI1<7I>Jx3mHOTQ#s>Wv~{5z%6?VL=&!KjJP`3NLw= z5G8%wx}Ddm}!=1umY(8B52$h;Io`S`sQJx$Gh;>CwFBCa)DG? z)C8b&*)pPgQb@qkggIG`k1~ml*fnxk`KI`uGA2|&6hbUeW->OaK;v6&1GX9_Vc9qZ zvh$Q83Fv?X3$1$r2ES)D`^LjMmL7tHh%+l$g8P9Sz;Pn4vkLqSlOSQk_MP6ld(KFG zgkd;{f%W}1aSXC=VXuN20EfVIBd}cv;S2OWnXfk6N!yTmXu@V{0gh^kDV;wXbDcB* z@Yt*UV8>n9>P3v+BzdTrxxLFF@Y9hQCsW0H?#MN z`pXDVDdl4{QBRf(o1eEnD!AN51K;?gk3am?|B_2I_#ml^U>pFH@AOGKKEYrU0r#2TmSgr9LjJc1lx zhmYYiI=JeuLi$uYlo>bB+AY7dP4q;JAzfK}ov*A9K?&+q$_d&BR-(*4H7?MX2kezbK}*{IXqwT2rg&G7{Y;#ve-%3GTCqB zO_)ZYmpBbJK#CscUCRk!cF_!JV=Q!^SZ6QqbEXN;BGI~Tk|N9K0`JU{AR1#BSGiHp~y^C7XeQq`@=RHOcnLD0F@+Dup0xrG;&CIFcRNh;qGkg-~5TOF?KxuIwQMQIxFHezp&lLWiz~7 zG@hk-n0E&W*nDLN*F($EE6PGO?k~#GagH)7@OzGzYXbV*6b2-IB5PBr=jW@gWq{8l;OP;)P?mqtjIM9X4v?(*_M^ zwA768nANZVt2V4ef$kx4h{RdM7}^)_sMAn{jEPl6{%@D@C>9H5%R_{=dj9#9g+Ken_dol>m*0Ic|G|&-#N)HlpLqPyTFCKH z`M!o1o+#{OjMKs4ItQ`7rl;L)*w6Ut4EtcpCT-ZhvM((==6OfLl}-=9SHk z%TZm{-_QCdYDkf)p`fEk%Xl&%R3Z>^)0vGg_kd7r6~$0wEj8fXRWIXO7BE2S zascxT;^vgY@EtH82fO$^!Vz7u&8h`i`XyhWOEI(@P3kfOVuq3SFgzHhAV}$6rW+CZXxL_5^i<4hDhOs ziY)X63cv;HTX|}}H3KiE;FU59?Si7b3X3V|mqgx_9Aew*F(5p?5WOaXKTnjYFA}7~ zMHA{~b+p+_;>4mHd_Kikzhdve%jPj0{flrmhbm5qaCr!TxTi?K z2d!Vr`THd7afSitXxVv%2bP=7Ht~Hupm+#4iPo-w=hC8#fynHsVH=<{MYKA?y8WEp zg2~aEiVZMKEn(QEQ$g_tKoQK`0rFx7K?)wnJ%@1U1X1P}s!=<+oc=UT1O^!mO$3e_ zj7F0Q=ndvcGY&Pd=PbjXRyeIexRod_R(P5+N=`kjKMkC7D54P4N$0$CpdiYcI56Nb zgrb_LI6G2v0@i}O&mqB#YzA12JjC!4E9Is_O`-B8K7Zm(P+o~#0iH~VR3WRBf7K|W zCMAJ#NrGhnSZsMZkqGR5Ww!u7BeWD9<}@#Cl=84XE25(s#srV`Qz!hEiC%*$!GLtK z_vpZkN8F{G%XF}ao~3TzA|8X0?I3Uq^Yb$o=OEjT(n@|IvhAW2uXE4uHQ*!lJb648 z>%R)p6GGya{Z`#!wmk&ao4+!0i5*dqSyJmCf~_0yh!Lm~u4FAXzX-MUee8%buT1K* zwBjrhYA6zMd-@ZB0i*g zSsr^(0eA%6DpdIkSuAFDSi>2u12O~>RE%Md7#%m)ftV**k_PM&Kb|h7hY=o!!x5dA zf&-T>7HEgVx6y5c`|L4yhSRiKQcE z4_k~v{am&zWLZOWqZxu{UD#&L5MPK>>PZR55_?Pl{JR$lge4+wV%eIesnuHcO!I&< zVNa0l)!I2f8m5Knpfs$Ln=dxlQmN)|NR}#_f@a|_S_unDvYJ%>5}#$AT6H1J z1$i2Dc-`1d-^N0GAn#rnQS=+-h)^xG44f3&h4g-@yd=Ru%%(hNa!~_6v)7t96dPAg zh;mBEsuj!PYXRsBir5ob@*5I$$ykY-uYrm#cTh&q{_RNxWh2xoB}-56go6lyC5~$; zwAc@#Ysk}O@0qB8!N2J`Qc<1GMVGBz#2}~BlpXt0VVk@Q-(#s)6;5vjc^b|* z!Cyln!?Yni%~GfVE<@uDJ4MU{<8H&A1TRs-5)a=t4a(nAD1kkaQA=Y|nDV^g%+hnA zM1rx()(U}N(E+Th(xQhmZS3ocv=_yx2(}C60Qvh2BofzkAT4bWaW^qOKPap4Z4;Zg zrsDUIqI3!tanF*lWMHGKVh^C*+TI*g%BqkjhFr*f0cgT%=?gG`pu$|};S^yU;u4lJ z2G{4w z3UKNmb`D|z#2Vk{B2HBj=uR*s&YfRb^c+#855hcMevOJMg>@$t{HM$< zvt_M!key{I;^d2YvJBsilM2eoGo0o?$pal`RL~PKKIiFsBHfh>DH1R~qwdOi*>4op zeVtZ#RY6Q~kNcJ`3n^{n5(V&SrUPlRAS_;bC!{neCz<=x&ts{)exF3JF`jqJhYI-i z+_)M(O74B!sBZPU@t%I4+$D6lzRz2<50d+g`0`NvemSokC-rUV8N*c_FWO~Em0h=+ zlJDcez<4H1-REno@w4RaKAL}@@AXmHlP6^Ku0G$)=wZn>qKNKudz1>vy$NCUEWtHr z-AWuVzIQ8Xz2bH{#dpFXM=)x&PLmiQS#o@0z;X@g+Ms|QKW3Gs{=TFIOm(FNjL+rA zrt{;|yssxMV1Xo1(g{2A0+bla@6vO!!Lp2xCNygXT7Tiic3Cn;=sIiA$HX=q;n+}2Sd9GO(eF#!Un0Lo>{G+oMQ;Kt1PF-OM(+2s-a^mhn6c7S_Eesv zUu11wo+TpMD#$-vsXsJ8T%5RIR7SIj?X+Q;eVsLbMJ4j3g{od5u3`XZY~>?tVfoVh zBZeOzh~=!xX~4swQ;alWl|6&TYkM(}zB`EVIz9%bq!iu(oV8Ikg&?9T`b;#DKICYk z=N? zeUD2YE7Z!$WqE_NQ9TdN`j3Q>{ZBy?gsVkXP^%s6^hgVL8w6}WOiX+=6_@J)|7QsF5s(FZmnOEjOR#{6J!E}i z8M4Z9lt5P6sYqEzu@x3V0rHwPEjhs7TpGN5CZRs5rTWO1dS6&C5=1 zkP7ht<3mX#mz`mIZAOY5O#<$+@=y$Z9<^4%uX^@P_w_orU8h^SIYb7L5xq_XNTAng za7uC*389e=H7P82u2G~diD_m%eoh;WVq;3mF>l4YC?K3~z(nxi;r~E02v$4sRP}6S z582}4&UQm#UMT|X2)#S_+2Dkwn}lFh3ggi%Jf-1zw|FufY{5Z4HU+y0)w1jj{Jo1|Q&#hkLm8+W4I7MPOKj z4h=C#KojIt`V+duQ%)!~fI9a%(wESvl_^3>SbOuKxk)LyCsIMhwa1g?p_ixIpQi1r zkcPmAQQWlJ*3yCVjyHX)igP_w#7fgO?Nvb#GY3eR!l|lCS0l+7QgL#qRt&zUGk$d2 zYQNQ^lv=1FQ87V=99}Y+dR5{u1Yh(#uM@X>4H1{LC8Y`~t-#hmop6B?i8h&zK=_Jm z94M8JLFxLTDyiNU93Q?QZ#wT{+?IVM_|U2>CLX6GLQX@H^`nu*c_w;M)Rp_rah=r` zECB&me~VAAYd6bJ6sR_!ZQdY&?YOrGf@<&(gEYZI(+JXITHaDJ7~c`*3pr$z#41*% znp$SoY-~~@j4lwyK%*g8MezDt^okuPF-0*hrV|PxkJ+*1G$zIxtx!o@-1iA>u;3^H z&F#ay(x9Mcqzy)$hJpOisQT}M3SCuhT_B{NTdeFC8%h??-Z0Kg49@l>Y*bLJWJ{wP zZ?eH#jmEx#HrZnMK(w)RZlVda?U2rM#&A@mInU`aI9%DNj^{W;f*4?%x>nDkj!M~U8w6N9 zZcw_Y;`oVU%CYn9+OacV4magqUEa9XGxhig%{@Eyg&fIM#a+%m5`(zczC(`JQlmXDq1 zZM!A+>RY#O^~}=0J__gT*k7wQmFCD44F^I~b9IBEgT_JZ+}Xu;wLwuc*2SSQB=R=B z*+EB)Un0^HEjOV(%ZF@L^x^#%`BWe&c4!* zPCmX%+{hVT>LujNlX_{How0O?Ff@>nIC1EdnR@*eQP`Mjq4{Q4AxH^PM~C}ykiF9h zF4Ps*J9>6YeoyYzh06;)v>P7K!<_n`Q1S=Jdt`DV##kqvidoGpGgGNwdn!rL)H;u^ zZMsfqJnJHS?P-^=g6BmT22|9g^k2F!@X@6%1;_IyknM2mkauCrEgs|QA3veh1&1rN zPcoOgnbc9rG#@Kt(6Ade0rk@mh>xZX-bzC#EYcLoigD}+*F{`IvZ>^$jeNRr63h*}0I zo2jlF*n0Rt#1ho+(qWzcb4Bjn!~4(tB=OZ+R_m>-#ttse_e}a3&-WeEa(TM};|tG{ z3c#!LNxKz`9-83< zh7ut6u+F!L=ZYU#hiDqLDQDy=4|Dv5$v8N~##&qj+y>dxj~Z-0KeE6hJJl^>hPkB#$~o-luy-pL7 zttUHo4jbFGg~gj=2lX4}&wb`6KKBovd+swYEW9-Pi%FKk)TldnfJGiXtW}XUNF`w;*Q#H9FJp4! zVZ*k~hc=b(T}-}}GN|OcBkyINx^`=+a(K0|^WI%Wov15s(5#NZF+LP zI(w&ju(`N+aImxRr!W8Xr|&HP@1ItNRa(t#D<+%$69U?^RUgr@$L85v-15;9Xihuj|ZmkxKDH!<6U3I$WBv~IXWxH@($bqNb|p1Fbx+WTKy4jWiv?) zSS`BdF67*K<#Zh#IVAQAkrwBJGSe|e1wY)Gu64XGH5Z?srI$`CAA>IO>G2|Vl(Hv< zdpdalK|p>NJZx5^&f3bi?QINLEB2|se@g`}sH`yqJ~E&Hw+q)`p|nw~yLWc(8xRq$ zy55nR_Rd!gMpE1;n(FqTbgwYIaliUbWjyR1+@!CG$I%?nq{|RNw^GjDF?W?8Qj=~~ zdmS$h&WZ#H8sJ2wUEx8988?CNmRpKsyfe}!XPH{ecSicgbKI(up}i8F9(^J@a*{X% zM0S-Z@emYeh~~EI@?f$n@&MRL4FBG1#26fevw3LvuFLMBMcuLz`zDd2{(M7IbYE|` z=tW)-YJ-lHe4>TOOsaROf@jH&F?PJiD)H^oY?m4OLAEF8ABufQhXW@iBoi?xpS`D-KmR3;C{XJjbf z?(vOBRieG2;G9;aKrK(pR3&?wat8^YS#ZZfyXrQKSV@w^j@jA7{$*;S+32+MDZ)0K z^o|h%{iGL6li_FM456i~?;#Gfl>f^4iS$B|K#HdEMi{SE!b=x#^>XV<_I58hPPZM7OzYU7$urfvc7$ERf8v1 z7mbX2(a)d9!wt??l}J!mBAm78Co!12N!Z@D2)m~$+b7lk*O%Aufe|y1Oo>{AU}*oL!kC(9h0(a*~NkwAiK?ttO{ZX4yBaJZu!%DhfA7kaW`MAG{NZT7&N{k zlw+X)0fJ3bkyVzc?iu?U?`Ud~m6+YyKSXld`Q+H|F?1R-*mo(Iv!E7_vybt^ZB@1@ z)AI>2eMMzM_m8FZb(jT4(mvJgeFhC<(FwsTNpDx$m;zQzDkZXr60R?faGXkrZ`FKl z2pJs7LMq5*76Y_?xEl|QJ9C{d7b-(kpc1Tl8)6L~Jq-=IH*3Aj41vwg1SN|*4FLrE z7sR&={@>5edZDo1$st1EOMB?=QKZY(10)4t)HPw~(aX^uwW;f4Ch^(P&&H$#YXn5H zA;^wO@kw_&2jDv~I8SGOqMimYbJ$+qS|1;h)dV|v$l54*gsc_cG4i#Q8?!-=r*%4n z0N)bgHJk?Pd;?s9p6Z9AMBW5kHre@0juBPyX0)UbGFpG8>( z;fgQcZot?<9eLWbG>n%gEr%vW+A9|7GS1>F4C&OXGuyQ~q7)C@1rej_J7vd1=kcP}!8gx^JDyst1pb-jF=%SO$ z#Cb}&Hz?PW?cB*7*JIYsWn&2n0qy7Pm*sV(>79B(Cc75oRv`Qv%Hb0;FylbkB3A2E(Ja<=cHjq<9lP+P-NV1rXYKIH9)8c43*f?w<9O9Ic`mBVC1`l)hn)(4;)l2gHFyBg)dLN3W_LX4~@t|{9AkHst4m$?qy`*ek!b|$UeoRXo^NF zN}E-VS|S9J=|yp1l(9>Pvy?0xp*!#>NUdnXsf#E=ceV z2@f45_*VO%l5xjCi76}6iIm!76^o!XSC z{%B1kCd-pZ!VnuTZYkp74Ahh)U=kP;0ArNAR<%f|?okxgXY#jMK<55NMfp{o`z-#X zIG%hyQ7G8P-&(oW-aP%($GWy1h7W#2)o>>h$gMjo;4g?>%Y@J9Ls8SnNCf5_^^J^l zNZ0_RqdYu#qiU-9OdSP`=8EE}<~i-0JmW|>o~*)n;4fS1$=T?BT&>i*d7sSXn1m7Z zGK>biPO$Z|t4YiQ^}fbVbM%cIT$A!o_Zy-42uh|DDc4=Qc-ndc)G4sy<;br05&bKf zQLK}pj8co_)ox2sI+Oe#SBbc3%EkRc77@XW5pgzCA)#F`u?kPcq{aJQ@1aA}mQ6rH z=2>M&iFx)6eYb;Fu2R-%IrIr5)d}HDk-BFpnu!D<#ECADJpqM*L^2OBB4SIt~qz!^1Rm4Hh?kt70 zNWfba)WB-AN(Po2Q!EIsJol6iU9@$0Ejl)Bd~EC==I)XQlpbL?TZeLtQzEMW&h*fm zL75`41f?(L+G^V@X(*U=C@mo^Nbacj#zt{pl%L$Ww(-V|%WJLs<+a)R-uk1bm4%Hv zGk0g6t{pBFZf%sepDxbMzgbz|3C8FuRQn3|H*&;QvZDY>Wj}`UHSE&|ML6` zAN<&huYKj>coI9z#3G5^jM9ySpy5&#bL0@WQ_5prUBm(LTJGZyf9>}N3LAd>;n%-P z8w(B;N=DN{YH?$|10bnj5?1>!3BotGz-CnWiT+}*U^`&6Jubfj|AfsMIq2Z|s4n;e zx8U?Z%N^!kwIga3G5m{ewIG+^a03>G9<4G(c)auGjG&7pmKp0-b@ibD2SRmULVRhXCJIKUbIf<9!#@#LWDH zY7my6LPXDoZP&vGuVGH^ISf_s;_{Gx^`CPKDux&MVBe|xjLdI}&nv8J4Sl`)N#Fhe z38NO$1!@lJC1PhINrG{F&#ILPSS!Nh(O%@JgdZ+xlj=@*83TMh!L~i```QP}=2W?5xi(g)w?k`D4gN0lxnHuD6jyW;k`O<*W^E+R{!jJ@{ z=mq}??1cCdVIaWeEzS|adi_0ez)8&7%VI^!OL$qa0r1eMzz9ArZ7P6fi5q&bAwc>Lr(}Kpar3rq;67 z4wHxR6U?l@utC}IFp|qd1;bnp$G|S!TaNG!E|vHrY?)iw#0n3S!2QN|j}*Aq&^ByP5)OSu?nmGGZte=gK{N77Q-YX@ zj*!F96kDdD02K-{@iJbVE;;tCU&H_Cb|C9yDu!f@cGsdZ%(_Ec?)v&S{)2VJHBSrc zDzn7D+ult49bsoJC~GUQPMB}c)VFA*c0Kj$e+XumS*#e)kY04+Sqc>!iZk+N`^i4@ z?E2z2|2wlNa6n5zelgSFVs1-?2{+*xI9Kf@p?{R9(W${gH(`goY_GAT0{6plDLq5V`Frh(I@i;`gczE5{;S*f8QoXa^0_GH1jHWSF6S zBo>ecuvK{yqwk?W#o3T)mUs;8ZDtXdOX$j`xh6a!s0OsGpkkfv*Gs&xAu_0Vaz^ot zFqKwLb(nbL@fb+Ym4gDcgK@-Py+ZmDiBIApG!em$c!I_7(eM1>vnU?t#8}}pFgq=O>{(6z;r;OJ)IifX1f`)s8NkeHo#m1=M#@H zAxD6Wj8f*SJ>iGF0;mqcJvURjy(i;Nil5#a6uqx~)AWpf&H%s`1c5Eh=txzMZT`*N zTD_b%FN9VRZ2m(cxGFWCqQ1H9lq84-g$|co%t62)%2*rA{7fj^+=;%;o#AS) zvL$ZQXw+Y_`3EH|t1T&$M#_@wMW|Rh*mfK>Ni z&G$a|lmuA*gId}iF&jCU7?qvUVvjcT|J=*uom5eIL-&~hW!UfkZs*sWA8$j*?o@cm zak1OW&%k(7@sH^?D`LIIDIZV*3UGu|1_ zGM?SK*Mr=NAwnkCv{n|_U!Z3W{T8`}u-XoZ2WwGO6i=`TR1Qfqb*t!!9(kgbNwxgM z@T5XQiyc~^d(7s79bs;efTef>&R+m$7$@})Nq~U@6U#1Forz*BJ)$pT{EKDmke~zu zlk`mXN~WZzOkqM2_B6S5A?LfQ>|sXF{m5qZ=lJ-;U;kc)OLbbx_gpvNO-H&oe&?$a zU?g~NQ7UzT@RK&@ z0;x~*uxP$!Opus)U8qIDVIW40>mI4mAz8omE#AWY5Kr?_d>`tnnQPI`rt%|{O(`Myoi9C$ki^xVL@(_Ky%dSP_cUjZ za(W<50c3biilfq=2A*e+%K)JLG33%|1m^hM%-H-KNUgJz`LUVO?9|xS%vfpe^a9h! zG!>T4P`boKkIekbUB6EG8AM!TZu#-_@|&BF=WiWMZZ@YD%d1b;9+VgF=2sf`>#N0$ z=E~E;`u)=KwN)9s7Lr_sk?st;{E@SAX%JlCVV6H8Fa~oPhiSdMKkV`+xnUr4DI`69 ze!}v>K!#~op9R^LRPJGyKeWGLm%m|`KlDCIp@v=lqCc+#G$HnL8VECC5OFu`@~1|; z!!CbBg3X;Me}sik-GCW(`BP@^u*)BQ|4>&H`vDHS{M9@9d#ezoYi)kOyZl`kQCYW& z9D+^Wjjgwbo2XqIwYv0sA z0J()v(wc-T`Xzgzt6d@$6C-;CHPalq2yV{yMGGWRh0QpKl=15Tq?I%!;}dc*1aoX< z7`4*KdzT;Hzj1wgbz^>E{EhLY<;m$%d2yz7dGUI4`|jdFd*NVX>h|hlad+qKDZ~H! z)SJ)oclc+x0>c#;uE1~whAS{!f#C`aSKurw@PB^p-A}HqzW-+rk|esIu#JyWbWi|{ zysg$i%Ap$@o12;~Pi@YZwu<8u#jW|xsk!m3tywyO&P+{?&7yIaQ1}%6B}L%kkMc4)T4>8s@_6BvJv_z9h&kC01i_TI4DkR;fq)^ z723mh0Bn)ul@``gWyH(!=?n7aKNnzp$4W|NjzKtOTt&@#IUU(OIo{*AKy~*m$YceK z2&D}-eNf72NySXb4kzqN(xA_WtUmu9L0&5PNYN{+g3*^nh-%hjHQ(S(320l0rjwyn z!#*O5k!QtaQeI-R+Mb8LuTnlzElLD{&0NrG6BXXKf(FHaNl4cMs)ZAeTBL?*S1FEe zOHemL0*8_mKr$j2Zuh)#XuzR{J6Qy~mOy^oAOnbFh)gUH3NdY)h~nR#(!rxCNrVuf zE2UGcD1(yBLUw(RqyQ^$A%!6!A4}5IfUG!$FgG+}dGd~YBEm=(l67j6`GWbTtV)tQpyL3TSoTEiwvhUB3d1s;hb*1|)49S^bpv;jz* z@Y@0JBkh88i+uqq>7G>*-w$nEAARYYr17x#v{Vo!QHLT})2_zK$#9fM!^yLB9V#Rk zh_;sjP(}p&uc6koAe18c2^=TZPq{uy60nR_K#|y8UaoQ}z6m}Y8HFK*fFUS>MIR|& zAfc$FO_cC3EdEC19q0g~rp-{($w=bT1e%SR2y}+k3I!NSZVEs3bt9990^*Zw&jFx! z2XQ0MPOFPzXD3B|@t!v&Ibk%d!Y<%u=QkL-d7gbRB=YW&x6>5z+&L`{jV6yAkTQQV zK!oi&-3$y+)mS8HV@)_h${7QT$#Y!t1`(i!;OaOrawqv_ZXfaXyhI$w07g7wb+qMD zzABWY$9bhM!y&eYtz^K z3v~Yu+&zg%-wI#I-AccZR+Wuh5$8b!C2z`8-$cGSOiI7@Z=0C0Z1g&;9Aqj0>P#O< z2a#s^8RU`j6s2D5k^0Z0b}E*z7DXxSP;62x51cBB8OfH~t?2%e8eLI*hb}|9nV<)K zAWdN>)XDPNq0Ugqu`tsDoqR}QLk#5iXw;{#hnzz}dy-zoW=eEu9#?OVkBKQ)DUZ(! zl-f9Q9F~UR>=httk{y0TP9$#H-o072A#@f&5#m4VQtz!6L) z-jfJt^;Yy=kS3HQ$G9QT;2xlUK%EgTQC)?l@{?j65LS?e#oZG1;(8uXzKAMzR_TzX zayy_vpN@q*ZZrgBIsl7?Nu3BCKR!QpQS6ONJhD=fqc-JkCkU{jAq}3>P{J_II27>5 zI85iaFcV`l&#*8c*_Q^?GMM&>yEHL9cjRD{ACGJg0 zX<%8jLrS%>id462aE(V%)meu(IW>9Y@Vb-{YGW`w1gG37gVgM{NNc1EBLqFd9T~BK z8F0hz$OxPTSORR-%C_95@%&p-JrrJT(!xo4xz}MiQ)*!z6)+tP^d4m!=owZ<{SO=o zoV4s5x!dq9>Cx$6GeaqZ=M#|l0c`iI;Zck$Y3Ab7;=NvOCcfmhkPpQ8mp*2O-f7ti zx^!E3Qy6fTA%>LV6dD-|M@EsCM)N8&xiE8>04&}6zwr)nW8tUJp}XxYmp9A$2?8_n z>!|CSYL98GCnrtxUbzhVkaFYW#8wLrF>^t(xg}|QDYuZj9&Fo4}sqxlil3qXQ7W{uxyvrtpMmYlmQGaRV5=zB=2L36XZh1 zY<6)V_+vBjf|(RG8XX1~G{G><+L2u?MdHAYV>xF&H#5f^>obAS1TRoO*GQu7JvRT2 z1Teg$C&1j#Ig%)T?i#YMCXL}tFEiu8HSkv67r&JUR1h6wuL7ojzc(2PnW}KtRQDF} z$Ty=HU(I|sc~v1F-7MA!(D&9}jgx^oH%IpFikL6tHZs1MCI6DW_FDK-^8C~3%6%5^ zbh>l$-jvVuWr}@XbOMtUh}{`N@$)D2*}DnYI?z7&KvYaC(9aH3zVqs}CumS?NtLDI z1_X16MtigQu{qw?(`(NOhA*5Lia(x}8G$C~AG|i><*dU@5eLGGFu{SFlHLlbJ5MY< zvOHW|hRarqj53%lg66}{kq#^~70x9c*<6Rtqu^_SxCQuGkVj2y%G_u4u0e;E(=j7X zK=A8|{`(0x7ffgPe_}NAQFr|R?%MTAZRhIT!Gp%({>;kOL9@78t3TRUx_mfZetPf9 z^4j)WZ(pz9cyMbWxVS6)|I=JeuFrDGFYpJSuVPkJ@a%TtCM3_qcwJ z>*u+0TrY7=acR7ZTuWS+xt6)Ea9!oP#;r!sW(D{YmaM<>o(Udt_NJd#PyH4lr=HVHO6(3>kC|?T$5ZgT>psc zb*}4NZ*bk5yHO=)d*YMA91%@jyT!G;V z3|C;d0>c#;uE1~whAZ%cw*vp{yl+2%MQu zc!JX}t6i&k3O!mh!Z65$Nsz2JNw`s*+N^JVNS3^sY|`Px# diff --git a/.env b/.env new file mode 100644 index 0000000..c38fa3c --- /dev/null +++ b/.env @@ -0,0 +1,13 @@ +# API 基础路径 +VITE_APP_BASE_URL=/api + +# 请求头配置 +VITE_REQUEST_HEADER_CHANNEL_KEY=pc + +VITE_REQUEST_HEADER_TOKEN_KEY=Authorization + + # 默认语言 +VITE_APP_DEFAULT_LANG=zh-CN + +# 禁用 OXC 原生绑定(解决 Windows 安全策略问题) +OXC_DISABLE_NATIVE=1 diff --git a/.gitkeep b/.gitkeep new file mode 100644 index 0000000..8d1c8b6 --- /dev/null +++ b/.gitkeep @@ -0,0 +1 @@ + diff --git a/.npmrc b/.npmrc index b22698a..7dc60b0 100644 --- a/.npmrc +++ b/.npmrc @@ -8,3 +8,5 @@ legacy-peer-deps=true node-linker=hoisted verify-store-integrity=false auto-install-peers=true +# Skip oxc native bindings due to security policy +public-hoist-pattern[]=@oxc-* diff --git a/AI_CONTEXT.md b/AI_CONTEXT.md new file mode 100644 index 0000000..f1bf5fe --- /dev/null +++ b/AI_CONTEXT.md @@ -0,0 +1,196 @@ +# AI 架构上下文 + +## 项目概览 + +这是一个基于 Nuxt 4 和 Element Plus 的现代化管理系统前端项目,使用 TypeScript 开发,旨在提供高效、美观、可扩展的管理界面。 + +### 技术栈 +- **前端框架**:Nuxt 4 +- **UI 库**:Element Plus +- **开发语言**:TypeScript +- **状态管理**:Pinia +- **国际化**:Vue I18n +- **样式方案**:SCSS + UnoCSS +- **图标库**:Nuxt Icons +- **构建工具**:Vite + +## 目录结构 + +``` +web/ +├── app/ # 主应用目录 +│ ├── api/ # API 接口定义 +│ ├── apps/ # 功能模块目录 +│ │ └── cms/ # CMS 功能模块 +│ ├── assets/ # 静态资源 +│ │ ├── icons/ # 图标文件 +│ │ ├── images/ # 图片文件 +│ │ └── scss/ # SCSS 样式文件 +│ ├── components/ # Vue 组件 +│ ├── composables/ # 组合式函数 +│ ├── lang/ # 国际化语言文件 +│ ├── layouts/ # 布局组件 +│ ├── pages/ # 页面组件 +│ ├── plugins/ # 插件 +│ ├── stores/ # Pinia 状态管理 +│ ├── types/ # TypeScript 类型定义 +│ ├── utils/ # 工具函数 +│ ├── app.vue # 根组件 +│ └── router.options.ts # 路由配置 +├── public/ # 公共静态资源 +├── .gitignore # Git 忽略文件 +├── nuxt.config.ts # Nuxt 配置 +├── package.json # 项目依赖和脚本 +├── tsconfig.json # TypeScript 配置 +└── uno.config.ts # UnoCSS 配置 +``` + +## 核心功能 + +### 认证系统 +- **登录/注册**:完整的用户认证流程 +- **验证码**:集成短信验证码和图形验证码 +- **路由守卫**:保护需要认证的路由 + +### 会员中心 +- **个人资料**:用户信息管理和编辑 +- **专属布局**:独立的会员中心布局 + +### 国际化 +- **多语言支持**:内置中文和英文 +- **动态切换**:实时语言切换功能 + +### 主题系统 +- **深色模式**:支持浅色/深色主题切换 +- **主题定制**:基于 SCSS 的灵活主题配置 + +### 路由系统 +- **动态路由**:从功能模块自动加载路由 +- **布局路由**:基于路由元信息的智能布局切换 + +## 技术架构 + +### 前端架构 +- **MVVM 模式**:基于 Vue 3 的响应式数据绑定 +- **组件化开发**:模块化、可复用的组件设计 +- **组合式 API**:使用 Vue 3 的组合式 API 进行状态管理和逻辑复用 +- **路由管理**:基于 Vue Router 的完整路由系统 +- **状态管理**:使用 Pinia 进行高效的全局状态管理 + +### 构建系统 +- **Vite**:现代化的开发服务器和构建工具 +- **ESLint**:确保代码质量和一致性 +- **TypeScript**:提供类型安全保障 +- **SCSS**:强大的 CSS 预处理器 +- **UnoCSS**:高性能的原子化 CSS 框架 + +### 部署方案 +- **Docker**:支持容器化部署 +- **Nitro**:Nuxt 的服务器引擎,支持 SSR/SSG 等多种渲染模式 + +## 核心 API 和服务 + +### API 接口 +- **认证接口**:`app/api/auth.ts` - 处理登录、注册等认证相关请求 +- **会员接口**:`app/api/member.ts` - 处理会员相关请求 +- **系统接口**:`app/api/system.ts` - 处理系统相关请求 + +### 工具函数 +- **请求工具**:`app/utils/request.ts` - 封装 HTTP 请求 +- **存储工具**:`app/utils/storage.ts` - 封装本地存储 +- **路由工具**:`app/utils/router.ts` - 路由相关工具函数 +- **验证工具**:`app/utils/validate.ts` - 表单验证工具 +- **语言工具**:`app/utils/language.ts` - 语言相关工具函数 +- **通用工具**:`app/utils/common.ts` - 通用工具函数 +- **深色模式工具**:`app/utils/dark.ts` - 深色模式相关工具函数 + +### 状态管理 +- **应用状态**:`app/stores/app.ts` - 应用全局状态 +- **配置状态**:`app/stores/config.ts` - 系统配置状态 +- **全局状态**:`app/stores/globals.ts` - 全局共享状态 +- **会员状态**:`app/stores/member.ts` - 会员相关状态 +- **个人中心状态**:`app/stores/personal-center.ts` - 个人中心相关状态 +- **系统状态**:`app/stores/system.ts` - 系统相关状态 + +## 配置信息 + +### Nuxt 配置 +- **模块集成**:Element Plus、Pinia、VueUse、UnoCSS 等 +- **CSS 配置**:SCSS 和 UnoCSS +- **路由配置**:自定义路由,支持动态加载功能模块路由 +- **服务器代理**:配置 API 代理,解决跨域问题 + +### 依赖管理 +- **包管理工具**:pnpm +- **核心依赖**:Element Plus、Vue I18n、Pinia、NProgress 等 +- **开发依赖**:TypeScript、ESLint、Sass 等 + +## 关键文件和模块 + +### 路由配置 +- `app/router.options.ts`:自定义路由配置,支持从功能模块自动加载路由 +- `app/pages/routes.ts`:主应用路由定义 +- `app/apps/cms/pages/routes.ts`:CMS 功能模块路由定义 + +### 布局组件 +- `app/layouts/default.vue`:默认布局 +- `app/layouts/member.vue`:会员中心布局 +- `app/layouts/container.vue`:容器布局 + +### 页面组件 +- `app/pages/index.vue`:首页 +- `app/pages/member/profile.vue`:会员个人资料页 +- `app/apps/cms/pages/index.vue`:CMS 首页 + +### 核心组件 +- `app/components/login-dialog/`:登录/注册对话框 +- `app/components/sms-code/`:短信验证码组件 +- `app/components/icon.vue`:图标组件 + +### 组合式函数 +- `app/composables/login.ts`:登录相关逻辑 +- `app/composables/captcha.ts`:验证码相关逻辑 +- `app/composables/lang.ts`:语言相关逻辑 +- `app/composables/send-sms.ts`:发送短信相关逻辑 + +## 开发规范 + +### 代码风格 +- 使用 TypeScript 进行类型检查 +- 使用 ESLint 进行代码质量检查 +- 遵循 Vue 3 的最佳实践 + +### 命名规范 +- **组件名**:使用 PascalCase(如 `LoginDialog`) +- **文件名**:使用 kebab-case(如 `login-dialog.vue`) +- **变量名**:使用 camelCase(如 `userInfo`) +- **常量名**:使用 UPPER_CASE(如 `API_BASE_URL`) + +### 目录结构规范 +- 功能模块放在 `app/apps/` 目录下 +- 通用组件放在 `app/components/` 目录下 +- 页面组件放在 `app/pages/` 目录下 +- 工具函数放在 `app/utils/` 目录下 + +## 未来扩展 + +### 功能扩展 +- 支持更多功能模块的集成 +- 增强国际化支持,添加更多语言 +- 提供更多主题选项和自定义能力 + +### 性能优化 +- 实现更细粒度的代码分割和懒加载 +- 优化静态资源加载 +- 进一步优化构建流程 + +### 安全增强 +- 加强认证和授权机制 +- 防止 XSS 和 CSRF 攻击 +- 实现敏感数据加密 + +## 总结 + +本项目是一个现代化的前端应用,基于 Nuxt 4 和 Element Plus 构建,使用 TypeScript 确保类型安全,采用组件化、模块化的开发方式。项目支持国际化、深色模式等现代前端特性,结构清晰,代码组织合理,具有良好的可扩展性和可维护性。 + +通过使用 Nuxt 4 的强大功能和 Element Plus 的丰富组件,项目能够快速构建出美观、高效的管理系统界面,同时为未来的功能扩展和性能优化提供了坚实的基础。项目使用 pnpm 作为包管理工具,提高了依赖安装和管理的效率。 \ No newline at end of file diff --git a/README.en.md b/README.en.md index 97c85c3..efde29e 100644 --- a/README.en.md +++ b/README.en.md @@ -1,36 +1,92 @@ # Madong-Nuxt -#### Description -MadongAdmin的Nuxt-Web工程,Nuxt4.x+TypeScript+Vite+Pinia+Element Plus +## Project Introduction -#### Software Architecture -Software architecture description +MadongAdmin's Nuxt-Web project, a modern admin system frontend built with Nuxt 4.x, TypeScript, Vite, Pinia, and Element Plus. -#### Installation +## Tech Stack -1. xxxx -2. xxxx -3. xxxx +- **Frontend Framework**: Nuxt 4 +- **UI Library**: Element Plus +- **Development Language**: TypeScript +- **State Management**: Pinia +- **Internationalization**: Vue I18n +- **Styling Solution**: SCSS + UnoCSS +- **Icon Library**: Nuxt Icons +- **Build Tool**: Vite -#### Instructions +## Core Features -1. xxxx -2. xxxx -3. xxxx +- **Authentication System**: Login/Register, CAPTCHA, Route Guard +- **Member Center**: Personal profile management +- **Internationalization**: Multi-language support (Chinese/English) +- **Theme System**: Light/Dark mode switching +- **Routing System**: Dynamic routes, Layout routes -#### Contribution +## Directory Structure + +``` +web/ +├── app/ # Main application directory +│ ├── api/ # API interface definitions +│ ├── apps/ # Feature modules directory +│ ├── assets/ # Static assets +│ ├── components/ # Vue components +│ ├── composables/ # Composables +│ ├── lang/ # Internationalization language files +│ ├── layouts/ # Layout components +│ ├── pages/ # Page components +│ ├── plugins/ # Plugins +│ ├── stores/ # Pinia state management +│ ├── types/ # TypeScript type definitions +│ ├── utils/ # Utility functions +│ ├── app.vue # Root component +│ └── router.options.ts # Route configuration +├── public/ # Public static resources +├── .gitignore # Git ignore file +├── nuxt.config.ts # Nuxt configuration +├── package.json # Project dependencies and scripts +├── tsconfig.json # TypeScript configuration +└── uno.config.ts # UnoCSS configuration +``` + +## Installation + +1. Clone the repository + ```bash + git clone + cd web + ``` + +2. Install dependencies + ```bash + pnpm install + ``` + +3. Start development server + ```bash + pnpm run dev + ``` + +4. Build for production + ```bash + pnpm run build + ``` + +## Usage + +1. Development mode: `pnpm run dev` - Start development server with hot reload +2. Build for production: `pnpm run build` - Build production version +3. Preview production: `pnpm run preview` - Preview production build +4. Code linting: `pnpm run lint` - Run ESLint to check code quality + +## Contribution 1. Fork the repository 2. Create Feat_xxx branch 3. Commit your code 4. Create Pull Request +## License -#### Gitee Feature - -1. You can use Readme\_XXX.md to support different languages, such as Readme\_en.md, Readme\_zh.md -2. Gitee blog [blog.gitee.com](https://blog.gitee.com) -3. Explore open source project [https://gitee.com/explore](https://gitee.com/explore) -4. The most valuable open source project [GVP](https://gitee.com/gvp) -5. The manual of Gitee [https://gitee.com/help](https://gitee.com/help) -6. The most popular members [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/) +[MIT](LICENSE) diff --git a/README.md b/README.md index 3b46c31..fbce263 100644 --- a/README.md +++ b/README.md @@ -1,37 +1,92 @@ # Madong-Nuxt -#### 介绍 -MadongAdmin的Nuxt-Web工程,Nuxt4.x+TypeScript+Vite+Pinia+Element Plus +## 项目介绍 -#### 软件架构 -软件架构说明 +MadongAdmin的Nuxt-Web工程,基于Nuxt 4.x、TypeScript、Vite、Pinia和Element Plus构建的现代化管理系统前端。 +## 技术栈 -#### 安装教程 +- **前端框架**:Nuxt 4 +- **UI 库**:Element Plus +- **开发语言**:TypeScript +- **状态管理**:Pinia +- **国际化**:Vue I18n +- **样式方案**:SCSS + UnoCSS +- **图标库**:Nuxt Icons +- **构建工具**:Vite -1. xxxx -2. xxxx -3. xxxx +## 核心功能 -#### 使用说明 +- **认证系统**:登录/注册、验证码、路由守卫 +- **会员中心**:个人资料管理 +- **国际化**:多语言支持(中文/英文) +- **主题系统**:深色/浅色模式切换 +- **路由系统**:动态路由、布局路由 -1. xxxx -2. xxxx -3. xxxx +## 目录结构 -#### 参与贡献 +``` +web/ +├── app/ # 主应用目录 +│ ├── api/ # API 接口定义 +│ ├── apps/ # 功能模块目录 +│ ├── assets/ # 静态资源 +│ ├── components/ # Vue 组件 +│ ├── composables/ # 组合式函数 +│ ├── lang/ # 国际化语言文件 +│ ├── layouts/ # 布局组件 +│ ├── pages/ # 页面组件 +│ ├── plugins/ # 插件 +│ ├── stores/ # Pinia 状态管理 +│ ├── types/ # TypeScript 类型定义 +│ ├── utils/ # 工具函数 +│ ├── app.vue # 根组件 +│ └── router.options.ts # 路由配置 +├── public/ # 公共静态资源 +├── .gitignore # Git 忽略文件 +├── nuxt.config.ts # Nuxt 配置 +├── package.json # 项目依赖和脚本 +├── tsconfig.json # TypeScript 配置 +└── uno.config.ts # UnoCSS 配置 +``` + +## 安装教程 + +1. 克隆仓库 + ```bash + git clone <仓库地址> + cd web + ``` + +2. 安装依赖 + ```bash + pnpm install + ``` + +3. 启动开发服务器 + ```bash + pnpm run dev + ``` + +4. 构建生产版本 + ```bash + pnpm run build + ``` + +## 使用说明 + +1. 开发模式:`pnpm run dev` - 启动开发服务器,支持热更新 +2. 构建生产:`pnpm run build` - 构建生产版本 +3. 预览生产:`pnpm run preview` - 预览生产构建结果 +4. 代码检查:`pnpm run lint` - 运行 ESLint 检查代码质量 + +## 参与贡献 1. Fork 本仓库 2. 新建 Feat_xxx 分支 3. 提交代码 4. 新建 Pull Request +## 许可证 -#### 特技 - -1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md -2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com) -3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目 -4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目 -5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) -6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/) +[MIT](LICENSE) diff --git a/app/api/auth.ts b/app/api/auth.ts deleted file mode 100644 index cb968f5..0000000 --- a/app/api/auth.ts +++ /dev/null @@ -1,87 +0,0 @@ - -/** - * 用户登录认证 - */ -export function authenticateUser(data: AnyObject) { - return request.post('/auth/login', data) -} - -/** - * 手机验证码登录 - */ -export function authenticateWithMobile(data: AnyObject) { - return request.post('/auth/login/mobile', data) -} - -/** - * 获取登录配置信息 - */ -export function getLoginConfig() { - return request.get('/auth/config') -} - -/** - * 用户退出登录 - */ -export function logoutUser() { - return request.post('/auth/logout') -} - -/** - * 用户注册 - */ -export function registerUser(data: AnyObject) { - const url = data.pid ? `/auth/register?pid=${data.pid}` : '/auth/register' - return request.post(url, data) -} - -/** - * 手机号注册 - */ -export function registerWithMobile(data: AnyObject) { - const url = data.pid ? `/auth/register/mobile?pid=${data.pid}` : '/auth/register/mobile' - return request.post(url, data) -} - -/** - * 微信授权登录 - */ -export function authenticateWithWechat(data: AnyObject) { - return request.post('/auth/wechat', data) -} - -/** - * 微信小程序登录 - */ -export function authenticateWithWeapp(data: AnyObject) { - return request.post('/auth/weapp', data) -} - -/** - * 绑定手机号 - */ -export function bindMobile(data: AnyObject) { - const url = data.pid ? `/auth/bind?pid=${data.pid}` : '/auth/bind' - return request.post(url, data) -} - -/** - * 生成微信扫码登录二维码 - */ -export function generateWechatQrCode() { - return request.post('/auth/wechat/scan') -} - -/** - * 检查微信扫码状态 - */ -export function checkWechatScanStatus(data: AnyObject) { - return request.get('/auth/wechat/scan/status', data) -} - -/** - * 检查微信登录可用性 - */ -export function checkWechatAvailability() { - return request.get('/auth/wechat/availability') -} \ No newline at end of file diff --git a/app/api/auth/index.ts b/app/api/auth/index.ts new file mode 100644 index 0000000..9756425 --- /dev/null +++ b/app/api/auth/index.ts @@ -0,0 +1,188 @@ +import request from '~/utils/request' + +/** + * 用户登录认证 + */ +export function authenticateUser(data: { + username: string + password: string +}): Promise { + return request.post('/auth/login', data) +} + +/** + * 手机验证码登录 + */ +export function authenticateWithMobile(data: { + mobile: string + code: string + key: string +}): Promise { + return request.post('/auth/login/mobile', data) +} + +/** + * 用户退出登录 + */ +export function logoutUser(): Promise { + return request.post('/auth/logout') +} + +/** + * 用户注册 + */ +export function registerUser(data: { + username: string + email: string + password: string + confirm_password: string + pid?: string +}): Promise { + const url = data.pid ? `/auth/register?pid=${data.pid}` : '/auth/register' + return request.post(url, data) +} + +/** + * 手机号注册 + */ +export function registerWithMobile(data: { + mobile: string + code: string + key: string + pid?: string +}): Promise { + const url = data.pid ? `/auth/register/mobile?pid=${data.pid}` : '/auth/register/mobile' + return request.post(url, data) +} + +/** + * 微信授权登录 + */ +export function authenticateWithWechat(data: any): Promise { + return request.post('/auth/wechat', data) +} + +/** + * 微信小程序登录 + */ +export function authenticateWithWeapp(data: any): Promise { + return request.post('/auth/weapp', data) +} + +/** + * 绑定手机号 + */ +export function bindMobile(data: { + mobile: string + code: string + pid?: string +}): Promise { + const url = data.pid ? `/auth/bind?pid=${data.pid}` : '/auth/bind' + return request.post(url, data) +} + +/** + * 生成微信扫码登录二维码 + */ +export function generateWechatQrCode(): Promise { + return request.post('/auth/wechat/scan') +} + +/** + * 检查微信扫码状态 + */ +export function checkWechatScanStatus(data: { scene_id: string }): Promise { + return request.get('/auth/wechat/scan/status', data) +} + +/** + * 检查微信登录可用性 + */ +export function checkWechatAvailability(): Promise { + return request.get('/auth/wechat/availability') +} + +/** + * 获取第三方绑定列表 + */ +export function getThirdPartyList(): Promise { + return request.get('/auth/third-party/list') +} + +/** + * 绑定第三方账号 + */ +export function bindThirdParty(data: { platform: number }): Promise { + return request.post('/auth/third-party/bind', data) +} + +/** + * 解绑第三方账号 + */ +export function unbindThirdParty(platform: number): Promise { + return request.delete(`/auth/third-party/unbind/${platform}`) +} + +/** + * 生成第三方绑定二维码 + */ +export function generateBindQrCode(platform: number): Promise { + return request.post('/auth/third-party/qr-code', { platform }) +} + +/** + * 检查绑定二维码状态 + */ +export function checkBindQrStatus(sceneId: string): Promise { + return request.get('/auth/third-party/qr-status', { scene_id: sceneId }) +} + +/** + * 验证邮箱(第一步:验证邮箱和验证码) + */ +export function verifyEmail(data: { + email: string + code: string +}): Promise { + return request.post('/auth/verify-email', data) +} + +/** + * 发送邮箱验证码 + */ +export function sendEmailCode(data: { + email: string + captcha_key: string + captcha_code: string +}): Promise { + return request.post('/auth/send-email-code', data) +} + +/** + * 忘记密码 - 重置密码(第二步:设置新密码) + */ +export function forgetPassword(data: { + email: string + code: string + new_password: string + confirm_password: string +}): Promise { + return request.post('/auth/forget-password', data) +} + +/** + * 刷新 Token + */ +export function refreshToken(refresh_token: string): Promise<{ + code: number + msg: string + data?: { + access_token: string + refresh_token: string + } +}> { + return request.post('/auth/refresh', { refresh_token }, { + // 不带 token 请求,避免 401 循环 + headers: {} + } as any) +} diff --git a/app/api/auth/types.ts b/app/api/auth/types.ts new file mode 100644 index 0000000..03d1862 --- /dev/null +++ b/app/api/auth/types.ts @@ -0,0 +1,99 @@ +/** + * 认证模块相关类型定义 + */ + +/** + * 登录数据 + */ +export interface LoginData { + username?: string + password?: string + phone?: string + verify_code?: string + pid?: string +} + +/** + * 注册数据 + */ +export interface RegisterData { + username?: string + password?: string + phone?: string + verify_code?: string + pid?: string +} + +/** + * 绑定手机号数据 + */ +export interface BindMobileData { + mobile: string + code: string + pid?: string +} + +/** + * 用户信息(登录/注册后返回) + */ +export interface UserInfo { + id: number + username: string + nickname?: string + avatar?: string + phone?: string + email?: string + token: string +} + +/** + * 登录配置 + */ +export interface LoginConfig { + enable_username_login: boolean + enable_mobile_login: boolean + enable_wechat_login: boolean + enable_weapp_login: boolean + enable_register: boolean +} + +/** + * 扫码状态 + */ +export enum ScanStatus { + WAITING = 'waiting', + SCANNED = 'scanned', + CONFIRMED = 'confirmed', + EXPIRED = 'expired', + CANCELED = 'canceled' +} + +/** + * 第三方平台类型 + */ +export enum ThirdPartyPlatform { + WECHAT = 1, + QQ = 2, + ALIPAY = 3 +} + +/** + * 第三方绑定信息 + */ +export interface ThirdPartyBinding { + platform: number + platform_name: string + nickname?: string + avatar?: string + bind_time: number +} + +/** + * 扫码登录信息 + */ +export interface QrCodeLoginInfo { + scene_id: string + qrcode_url: string + expires_in: number +} + diff --git a/app/api/member.ts b/app/api/member.ts deleted file mode 100644 index 9cdc9d9..0000000 --- a/app/api/member.ts +++ /dev/null @@ -1,55 +0,0 @@ -/** - * 获取会员基本信息 - */ -export function getMemberProfile() { - return request.get('/member/profile') -} - -/** - * 更新会员信息 - */ -export function updateMemberInfo(data: AnyObject) { - return request.put(`/member/profile/${data.field}`, data) -} - -/** - * 获取积分流水记录 - */ -export function getPointTransactions(data: AnyObject) { - return request.get('/member/points/transactions', data) -} - -/** - * 获取会员积分总额 - */ -export function getMemberPointsTotal() { - return request.get('/member/points/total') -} - -/** - * 获取余额流水记录 - */ -export function getBalanceTransactions(data: AnyObject) { - return request.get('/member/balance/transactions', data) -} - -/** - * 获取所有余额流水记录 - */ -export function getAllBalanceTransactions(data: AnyObject) { - return request.get('/member/balance/transactions/all', data) -} - -/** - * 绑定会员手机号 - */ -export function bindMemberMobile(data: AnyObject) { - return request.put('/member/mobile', data) -} - -/** - * 获取会员等级信息 - */ -export function getMemberLevel() { - return request.get('/member/level') -} \ No newline at end of file diff --git a/app/api/member/index.ts b/app/api/member/index.ts new file mode 100644 index 0000000..d949d3d --- /dev/null +++ b/app/api/member/index.ts @@ -0,0 +1,189 @@ +import request from '~/utils/request' +import type { + MemberInfo, + Address, + PointTransactionsResponse, + BalanceTransactionsResponse, + SignCalendar, + SignStatistics, + MemberLevel, + SignStatus +} from './types' + +/** + * 获取会员基本信息 + */ +export function getMemberProfile(): Promise { + return request.get('/member/user-info') +} + +/** + * 更新会员信息 + */ +export function updateMemberInfo(data: Partial): Promise { + return request.put('/member/user/update', data) +} + +/** + * 获取积分流水记录 + */ +export function getPointTransactions(data: { + page?: number + page_size?: number +}): Promise { + return request.get('/member/points/record', data) +} + +/** + * 获取会员积分总额 + */ +export function getMemberPointsTotal(): Promise { + return request.get('/member/points/total') +} + +/** + * 获取余额流水记录 + */ +export function getBalanceTransactions(data: { + page?: number + page_size?: number +}): Promise { + return request.get('/member/balance/record', data) +} + +/** + * 获取所有余额流水记录 + */ +export function getAllBalanceTransactions(data?: { + page?: number + page_size?: number +}): Promise { + return request.get('/member/balance/all', data) +} + +/** + * 获取会员等级信息 + */ +export function getMemberLevel(): Promise { + return request.get('/member/points/level') +} + +/** + * 会员签到 + */ +export function memberSign(): Promise { + return request.post('/member/points/sign') +} + +/** + * 执行签到 + */ +export function signIn(): Promise { + return request.post('/member/sign') +} + +/** + * 获取签到状态 + */ +export function getSignStatus(): Promise { + return request.get('/member/sign/status') +} + +/** + * 获取签到日历 + */ +export function getSignCalendar(year: number, month: number): Promise { + return request.get('/member/sign/calendar', { year, month }) +} + +/** + * 获取签到统计 + */ +export function getSignStatistics(type: string = 'month'): Promise { + return request.get('/member/sign/statistics', { type }) +} + +/** + * 修改密码 + */ +export function changePassword(data: { + old_password: string + new_password: string + confirm_password: string +}): Promise { + return request.put('/member/user/change-password', data) +} + +/** + * 获取地址列表 + */ +export function getAddressList(): Promise { + return request.get('/member/user/address/list') +} + +/** + * 创建地址 + */ +export function createAddress(data: Partial
): Promise
{ + return request.post('/member/user/address/create', data) +} + +/** + * 更新地址 + */ +export function updateAddress(id: number, data: Partial
): Promise { + return request.put(`/member/user/address/update/${id}`, data) +} + +/** + * 删除地址 + */ +export function deleteAddress(id: number): Promise { + return request.delete(`/member/user/address/delete/${id}`) +} + +/** + * 获取验证码 + */ +export function getVerificationCode(data: { type: string; phone: string }): Promise { + return request.post('/member/user/send-code', data) +} + +/** + * 修改手机号码 + */ +export function updateMemberMobile(data: { + oldMobile: string + newMobile: string + code: string +}): Promise { + return request.put('/member/user/update-phone', { + old_phone: data.oldMobile, + new_phone: data.newMobile, + verify_code: data.code + }) +} + +/** + * 修改邮箱 + */ +export function updateMemberEmail(data: { email: string; code: string }): Promise { + return request.put('/member/user/update-email', { + email: data.email, + verify_code: data.code + }) +} + +/** + * 上传头像 + */ +export function uploadAvatar(file: File): Promise { + const formData = new FormData() + formData.append('file', file) + return request.post('/member/user/avatar', formData, { + headers: { + 'Content-Type': 'multipart/form-data' + } as any + }) +} + diff --git a/app/api/member/types.ts b/app/api/member/types.ts new file mode 100644 index 0000000..33f5b4c --- /dev/null +++ b/app/api/member/types.ts @@ -0,0 +1,122 @@ +/** + * 会员模块相关类型定义 + */ + +/** + * 会员基本信息 + */ +export interface MemberInfo { + id: number + username: string + nickname?: string + avatar?: string + phone?: string + email?: string + points: number + balance: number + level: number + level_name?: string + created_at: number + updated_at: number +} + +/** + * 地址 + */ +export interface Address { + id: number + user_id: number + consignee: string + phone: string + province: string + city: string + district: string + address: string + postal_code?: string + is_default: number + created_at: number + updated_at: number +} + +/** + * 积分流水记录 + */ +export interface PointTransaction { + id: number + user_id: number + type: string + amount: number + balance: number + description: string + created_at: number +} + +/** + * 积分流水响应 + */ +export interface PointTransactionsResponse { + total: number + list: PointTransaction[] +} + +/** + * 余额流水记录 + */ +export interface BalanceTransaction { + id: number + user_id: number + type: string + amount: number + balance: number + description: string + created_at: number +} + +/** + * 余额流水响应 + */ +export interface BalanceTransactionsResponse { + total: number + list: BalanceTransaction[] +} + +/** + * 签到日历 + */ +export interface SignCalendar { + year: number + month: number + signed_dates: number[] + total_signed: number + total_can_sign: number +} + +/** + * 签到统计 + */ +export interface SignStatistics { + total_signed: number + continuous_signed: number + this_month_signed: number + today_signed: boolean +} + +/** + * 会员等级信息 + */ +export interface MemberLevel { + level: number + level_name: string + points: number + next_level_points?: number +} + +/** + * 签到状态 + */ +export interface SignStatus { + today_signed: boolean + continuous_days: number + can_sign: boolean +} + diff --git a/app/api/site/index.ts b/app/api/site/index.ts new file mode 100644 index 0000000..2848c4f --- /dev/null +++ b/app/api/site/index.ts @@ -0,0 +1,47 @@ +import request from '~/utils/request' +import type { LinkItem, AdvertisementItem, NavigationItem, SiteData } from './types' + +/** + * 获取友情链接列表 + */ +export function getLinks(params?: { type?: string }): Promise { + return request.get('/site/link', params) +} + +/** + * 获取所有友情链接 + */ +export function getAllLinks(): Promise { + return request.get('/site/link/all') +} + +/** + * 获取广告位信息 + */ +export function getAdvertisements(params?: { type?: string }): Promise { + return request.get('/site/ads', params) +} + +/** + * 获取导航菜单列表 + */ +export function getNavigationList(): Promise { + return request.get('/site/nav') +} + +/** + * 获取站点首页数据(广告、导航、友情链接等) + */ +export function getSiteData(): Promise { + return request.get('/site/site-data') +} + +/** + * 获取 Web 分组所有配置 + * 一次性获取前台站点设置、搜索配置、统计分析配置等 + */ +export function getWebGroupConfigs(): Promise> { + return request.get('/system/config/group/web') +} + + diff --git a/app/api/site/types.ts b/app/api/site/types.ts new file mode 100644 index 0000000..1f7b3bf --- /dev/null +++ b/app/api/site/types.ts @@ -0,0 +1,82 @@ +/** + * 站点首页模块相关类型定义 + */ + +/** + * 友情链接项 + */ +export interface LinkItem { + id: number + name: string + url: string + logo?: string + description?: string + category?: string + sort: number + target?: string + click_count?: number + enabled: number + created_at: number + updated_at: number + deleted_at: number | null +} + +/** + * 广告项 + */ +export interface AdvertisementItem { + id: number + title: string + link: string + image: string + description?: string + sort: number + enabled: number + start_time: number + end_time: number + created_at: number + updated_at: number + deleted_at: number | null +} + +/** + * 导航菜单项 + */ +export interface NavigationItem { + id: number + title: string + url: string + icon?: string + code: string | null + sort: number + enabled: number + is_show: number +} + +/** + * 站点首页数据 + */ +export interface SiteData { + advertisements: AdvertisementItem[] + navigation: NavigationItem[] + links: LinkItem[] +} + +/** + * 搜索配置项 + */ +export interface SearchConfig { + keyword: string // 搜索引擎关键字 + keyword_enabled: number // 是否启用关键字搜索 (0/1) +} + +/** + * 统计分析配置项 + */ +export interface AnalyticsConfig { + baidu_tongji_code: string // 百度统计代码 + baidu_tongji_enabled: number // 是否启用百度统计 (0/1) +} + + + diff --git a/app/api/system.ts b/app/api/system.ts deleted file mode 100644 index 495f9a9..0000000 --- a/app/api/system.ts +++ /dev/null @@ -1,97 +0,0 @@ -/** - * 获取验证码图片 - */ -export function getCaptchaImage() { - return request.get('/system/captcha', { time: Date.now() }) -} - -/** - * 获取微信授权码 - */ -export function getWechatAuthCode(data: AnyObject) { - return request.get('/system/wechat/auth-code', data) -} - -/** - * 同步微信用户信息 - */ -export function syncWechatUserInfo(data: AnyObject) { - return request.get('/system/wechat/sync', data) -} - -/** - * 获取协议内容 - */ -export function getAgreementContent(key: string) { - return request.get(`/system/agreement/${key}`) -} - -/** - * 重置用户密码 - */ -export function resetUserPassword(data: AnyObject) { - return request.post('/system/password/reset', data) -} - -/** - * 发送短信验证码 - */ -export function sendSmsVerificationCode(data: AnyObject) { - return request.post(`/system/sms/${data.type}`, data) -} - -/** - * 获取微信 JSSDK 配置 - */ -export function getWechatJssdkConfig(data: AnyObject) { - return request.get('/system/wechat/jssdk-config', data) -} - -/** - * 获取远程图片 - */ -export function fetchRemoteImage(data: AnyObject) { - return request.post('/system/image/fetch', data) -} - -/** - * 获取 Base64 格式图片 - */ -export function fetchBase64Image(data: AnyObject) { - return request.post('/system/image/base64', data) -} - -/** - * 获取版权信息 - */ -export function getCopyrightInfo() { - return request.get('/system/copyright') -} - -/** - * 获取站点信息 - */ -export function getSiteInformation() { - return request.get('/system/site') -} - -/** - * 获取广告位信息 - */ -export function getAdvertisementInfo(params: Record) { - return request.get('/system/web/advertisements', params, { showErrorMessage: false }) -} - -/** - * 获取导航菜单列表 - */ -export function getNavigationList() { - return request.get('/system/web/navigation') -} - -/** - * 获取友情链接列表 - */ -export function getFriendlyLinks() { - return request.get('/system/web/friendly-links') -} \ No newline at end of file diff --git a/app/api/system/index.ts b/app/api/system/index.ts new file mode 100644 index 0000000..d190582 --- /dev/null +++ b/app/api/system/index.ts @@ -0,0 +1,64 @@ +import request from '~/utils/request' +import type { SiteConfig, AgreementType, SmsType } from './types' + +/** + * 按分组获取配置 + */ +export function getConfigByGroup(groupCode: string, options?: { + enabled_only?: boolean + with_metadata?: boolean +}) { + return request.get(`/system/config/group/${groupCode}`, options) +} + +/** + * 按 code 获取配置 + */ +export function getConfigByCode(code: string, options?: { group_code?: string}) { + return request.get(`/system/config/code/${code}`, options) +} + + +/** + * 获取协议内容 + */ +export function getAgreementContent(key: AgreementType): Promise { + return request.get(`/agreement/${key}`) +} + +/** + * 发送短信验证码 + */ +export function sendSmsVerificationCode(data: { + type: SmsType + phone: string + [key: string]: any +}): Promise { + return request.post(`/sms/${data.type}`, data) +} + +/** + * 获取验证码图片 + */ +export function getCaptchaImage() { + return request.get('/captcha', { time: Date.now() }, { + showSuccessMessage: false, + returnFullResponse: true + }) +} + + +/** + * 获取远程图片 + */ +export function fetchRemoteImage(data: { url: string }): Promise { + return request.post('/image/fetch', data) +} + +/** + * 获取 Base64 格式图片 + */ +export function fetchBase64Image(data: { url: string }): Promise { + return request.post('/image/base64', data) +} + diff --git a/app/api/system/types.ts b/app/api/system/types.ts new file mode 100644 index 0000000..b99508c --- /dev/null +++ b/app/api/system/types.ts @@ -0,0 +1,41 @@ +/** + * 系统配置相关类型定义 + */ + +/** + * 配置项 + */ +export interface ConfigItem { + id: number + group_code: string + code: string + name: string + content: Record + is_sys: number + enabled: number + created_at: number + updated_at: number + remark?: string +} + +/** + * 站点设置配置 + */ +export interface SiteConfig { + copyright: string + icp: string + icp_url: string + network_security: string + network_security_url: string +} + +/** + * 协议类型 + */ +export type AgreementType = 'user' | 'privacy' | 'service' + +/** + * 短信/邮箱验证码类型 + */ +export type SmsType = 'register' | 'login' | 'reset_password' | 'reset_password_email' | 'change_phone' | 'change_email' + diff --git a/app/app.vue b/app/app.vue index bee6165..0a3ea27 100644 --- a/app/app.vue +++ b/app/app.vue @@ -1,26 +1,57 @@ diff --git a/app/apps/.gitkeep b/app/apps/.gitkeep new file mode 100644 index 0000000..8d1c8b6 --- /dev/null +++ b/app/apps/.gitkeep @@ -0,0 +1 @@ + diff --git a/app/assets/css/uno-reset.css b/app/assets/css/uno-reset.css new file mode 100644 index 0000000..c913a53 --- /dev/null +++ b/app/assets/css/uno-reset.css @@ -0,0 +1,387 @@ +/* +1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4) +2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116) +2. [UnoCSS]: allow to override the default border color with css var `--un-default-border-color` +*/ + +*, +::before, +::after { + box-sizing: border-box; /* 1 */ + border-width: 0; /* 2 */ + border-style: solid; /* 2 */ + border-color: var(--un-default-border-color, #e5e7eb); /* 2 */ +} + +::before, +::after { + --un-content: ''; +} + +/* +1. Use a consistent sensible line-height in all browsers. +2. Prevent adjustments of font size after orientation changes in iOS. +3. Use a more readable tab size. +4. Use the user's configured `sans` font-family by default. +5. Use the user's configured `sans` font-feature-settings by default. +6. Use the user's configured `sans` font-variation-settings by default. +7. Disable tap highlights on iOS. +*/ + +html, +:host { + line-height: 1.5; /* 1 */ + -webkit-text-size-adjust: 100%; /* 2 */ + -moz-tab-size: 4; /* 3 */ + tab-size: 4; /* 3 */ + font-family: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; /* 4 */ + font-feature-settings: normal; /* 5 */ + font-variation-settings: normal; /* 6 */ + -webkit-tap-highlight-color: transparent; /* 7 */ +} + +/* +1. Remove the margin in all browsers. +2. Inherit line-height from `html` so users can set them as a class directly on the `html` element. +*/ + +body { + margin: 0; /* 1 */ + line-height: inherit; /* 2 */ +} + +/* +1. Add the correct height in Firefox. +2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655) +3. Ensure horizontal rules are visible by default. +*/ + +hr { + height: 0; /* 1 */ + color: inherit; /* 2 */ + border-top-width: 1px; /* 3 */ +} + +/* +Add the correct text decoration in Chrome, Edge, and Safari. +*/ + +abbr:where([title]) { + text-decoration: underline dotted; +} + +/* +Remove the default font size and weight for headings. +*/ + +h1, +h2, +h3, +h4, +h5, +h6 { + font-size: inherit; + font-weight: inherit; +} + +/* +Reset links to optimize for opt-in styling instead of opt-out. +*/ + +a { + color: inherit; + text-decoration: inherit; +} + +/* +Add the correct font weight in Edge and Safari. +*/ + +b, +strong { + font-weight: bolder; +} + +/* +1. Use the user's configured `mono` font-family by default. +2. Use the user's configured `mono` font-feature-settings by default. +3. Use the user's configured `mono` font-variation-settings by default. +4. Correct the odd `em` font sizing in all browsers. +*/ + +code, +kbd, +samp, +pre { + font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; /* 1 */ + font-feature-settings: normal; /* 2 */ + font-variation-settings: normal; /* 3 */ + font-size: 1em; /* 4 */ +} + +/* +Add the correct font size in all browsers. +*/ + +small { + font-size: 80%; +} + +/* +Prevent `sub` and `sup` elements from affecting the line height in all browsers. +*/ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +/* +1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297) +2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016) +3. Remove gaps between table borders by default. +*/ + +table { + text-indent: 0; /* 1 */ + border-color: inherit; /* 2 */ + border-collapse: collapse; /* 3 */ +} + +/* +1. Change the font styles in all browsers. +2. Remove the margin in Firefox and Safari. +3. Remove default padding in all browsers. +*/ + +button, +input, +optgroup, +select, +textarea { + font-family: inherit; /* 1 */ + font-feature-settings: inherit; /* 1 */ + font-variation-settings: inherit; /* 1 */ + font-size: 100%; /* 1 */ + font-weight: inherit; /* 1 */ + line-height: inherit; /* 1 */ + color: inherit; /* 1 */ + margin: 0; /* 2 */ + padding: 0; /* 3 */ +} + +/* +Remove the inheritance of text transform in Edge and Firefox. +*/ + +button, +select { + text-transform: none; +} + +/* +1. Correct the inability to style clickable types in iOS and Safari. +2. Remove default button styles. +*/ + +button, +[type='button'], +[type='reset'], +[type='submit'] { + -webkit-appearance: button; /* 1 */ + background-color: transparent; /* 2 */ + background-image: none; /* 2 */ +} + +/* +Use the modern Firefox focus style for all focusable elements. +*/ + +:-moz-focusring { + outline: auto; +} + +/* +Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737) +*/ + +:-moz-ui-invalid { + box-shadow: none; +} + +/* +Add the correct vertical alignment in Chrome and Firefox. +*/ + +progress { + vertical-align: baseline; +} + +/* +Correct the cursor style of increment and decrement buttons in Safari. +*/ + +::-webkit-inner-spin-button, +::-webkit-outer-spin-button { + height: auto; +} + +/* +1. Correct the odd appearance in Chrome and Safari. +2. Correct the outline style in Safari. +*/ + +[type='search'] { + -webkit-appearance: textfield; /* 1 */ + outline-offset: -2px; /* 2 */ +} + +/* +Remove the inner padding in Chrome and Safari on macOS. +*/ + +::-webkit-search-decoration { + -webkit-appearance: none; +} + +/* +1. Correct the inability to style clickable types in iOS and Safari. +2. Change font properties to `inherit` in Safari. +*/ + +::-webkit-file-upload-button { + -webkit-appearance: button; /* 1 */ + font: inherit; /* 2 */ +} + +/* +Add the correct display in Chrome and Safari. +*/ + +summary { + display: list-item; +} + +/* +Removes the default spacing for appropriate elements. +*/ + +blockquote, +dl, +dd, +h1, +h2, +h3, +h4, +h5, +h6, +hr, +figure, +p, +pre { + margin: 0; +} + +fieldset { + margin: 0; + padding: 0; +} + +legend { + padding: 0; +} + +ol, +ul, +menu { + list-style: none; + margin: 0; + padding: 0; +} + +dialog { + padding: 0; +} + +/* +Prevent resizing textareas horizontally by default. +*/ + +textarea { + resize: vertical; +} + +/* +1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300) +2. Set the default placeholder color to the user's configured gray 400 color. +*/ + +input::placeholder, +textarea::placeholder { + opacity: 1; /* 1 */ + color: #9ca3af; /* 2 */ +} + +/* +Set the default cursor for buttons. +*/ + +button, +[role="button"] { + cursor: pointer; +} + +/* +Make sure disabled buttons don't get the pointer cursor. +*/ + +:disabled { + cursor: default; +} + +/* +1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14) +2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210) + This can trigger a poorly considered lint error in some tools but is included by design. +*/ + +img, +svg, +video, +canvas, +audio, +iframe, +embed, +object { + display: block; /* 1 */ + vertical-align: middle; /* 2 */ +} + +/* +Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14) +*/ + +img, +video { + max-width: 100%; + height: auto; +} + +/* +Make elements with the HTML hidden attribute stay hidden by default. +*/ + +[hidden]:where(:not([hidden="until-found"])) { + display: none; +} diff --git a/app/components/advertisement/index.vue b/app/components/advertisement/index.vue new file mode 100644 index 0000000..d19a0a8 --- /dev/null +++ b/app/components/advertisement/index.vue @@ -0,0 +1,400 @@ + + + + + diff --git a/app/components/advertisement/modes/float.vue b/app/components/advertisement/modes/float.vue new file mode 100644 index 0000000..93264b5 --- /dev/null +++ b/app/components/advertisement/modes/float.vue @@ -0,0 +1,137 @@ + + + + + diff --git a/app/components/advertisement/modes/index.ts b/app/components/advertisement/modes/index.ts new file mode 100644 index 0000000..aff7ce9 --- /dev/null +++ b/app/components/advertisement/modes/index.ts @@ -0,0 +1,26 @@ +import type { Component } from 'vue' + +// 内置模式 +import SimpleMode from './simple.vue' +import FloatMode from './float.vue' + +// 动态加载自定义模式 +const customModes: Record = { + simple: SimpleMode, + float: FloatMode +} + +// 注册自定义模式 +export const registerMode = (name: string, component: Component) => { + customModes[name] = component +} + +// 获取模式组件 +export const getModeComponent = (modeName: string): Component | undefined => { + return customModes[modeName] +} + +// 获取所有可用模式 +export const getAvailableModes = (): string[] => { + return Object.keys(customModes) +} diff --git a/app/components/advertisement/modes/simple.vue b/app/components/advertisement/modes/simple.vue new file mode 100644 index 0000000..774704c --- /dev/null +++ b/app/components/advertisement/modes/simple.vue @@ -0,0 +1,63 @@ + + + + + diff --git a/app/components/baidu-analytics/index.vue b/app/components/baidu-analytics/index.vue new file mode 100644 index 0000000..a6ec208 --- /dev/null +++ b/app/components/baidu-analytics/index.vue @@ -0,0 +1,77 @@ + + + + + diff --git a/app/components/icon.vue b/app/components/icon.vue deleted file mode 100644 index 198ffb7..0000000 --- a/app/components/icon.vue +++ /dev/null @@ -1,56 +0,0 @@ - \ No newline at end of file diff --git a/app/components/icon/icon-selector.vue b/app/components/icon/icon-selector.vue new file mode 100644 index 0000000..8dc4395 --- /dev/null +++ b/app/components/icon/icon-selector.vue @@ -0,0 +1,299 @@ + + + + + diff --git a/app/components/icon/icon-usage.md b/app/components/icon/icon-usage.md new file mode 100644 index 0000000..3d2d80c --- /dev/null +++ b/app/components/icon/icon-usage.md @@ -0,0 +1,141 @@ +# 图标组件使用说明 + +## 功能特性 + +- 支持多种图标库:Ant Design、Element Plus、Carbon、IC、Lucide、Ri 等 +- 支持自定义图标 +- 支持图标选择器组件 +- 支持离线模式 + +## 安装依赖 + +```bash +pnpm add @iconify/vue @iconify/json +``` + +## 使用方式 + +### 1. 基础图标组件 (Iconify) + +```vue + + + +``` + +### 2. 自定义尺寸和颜色 + +```vue + +``` + +### 3. 图标选择器 (IconSelector) + +```vue + + + +``` + +### 4. 监听图标选择事件 + +```vue + + + +``` + +## 支持的图标库 + +| 图标库 | 前缀 | 示例 | +|--------|------|------| +| Ant Design | `ant-design` | `ant-design:home-outlined` | +| Element Plus | `ep` | `ep:home-filled` | +| Carbon | `carbon` | `carbon:home` | +| IC | `ic` | `ic:baseline-home` | +| Lucide | `lucide` | `lucide:home` | +| Ri | `ri` | `ri:home-line` | + +## 自定义添加图标库 + +### 1. 安装图标库 + +```bash +pnpm add @iconify-json/your-icon-library +``` + +### 2. 在 load-icon.ts 中添加 + +```typescript +import YourIcons from '@iconify/json/json/your-icon-library.json' +addCollection(YourIcons) +``` + +### 3. 在 icon-selector.vue 中添加 + +```typescript +const iconifyPrefixs = ['ant-design', 'carbon', 'ic', 'lucide', 'ep', 'ri', 'your-icon-library'] +``` + +## 配置说明 + +### 离线模式 + +在 `.env` 文件中配置: + +```env +VITE_APP_ICON_OFFLINE=true +VITE_APP_ICONIFY_PREFIX=ant-design,carbon,ic,lucide,ep,ri +``` + +### 图标选择器配置 + +| 属性 | 类型 | 默认值 | 说明 | +|------|------|--------|------| +| modelValue | string | '' | v-model 绑定的图标值 | +| text | string | '图标选择器' | 显示文本 | +| width | string | '200px' | 组件宽度 | +| size | string | 'default' | 组件大小:large/default/small | +| disabled | boolean | false | 是否禁用 | + +## 注意事项 + +1. 图标名称格式:`图标库名称:图标名称` +2. 离线模式下需要预先加载所有图标数据 +3. 图标选择器支持搜索功能 +4. 图标选择器支持分页显示 + +## 示例代码 + +完整示例请参考项目中的使用场景。 diff --git a/app/components/icon/iconify.vue b/app/components/icon/iconify.vue new file mode 100644 index 0000000..ad99b50 --- /dev/null +++ b/app/components/icon/iconify.vue @@ -0,0 +1,49 @@ + + + + + diff --git a/app/components/icon/index.ts b/app/components/icon/index.ts new file mode 100644 index 0000000..1682be9 --- /dev/null +++ b/app/components/icon/index.ts @@ -0,0 +1,3 @@ +export { default as Icon } from './iconify.vue' +export { default as IconSelector } from './icon-selector.vue' +export { default } from './iconify.vue' diff --git a/app/components/login-dialog/forget-password.vue b/app/components/login-dialog/forget-password.vue new file mode 100644 index 0000000..6c98a29 --- /dev/null +++ b/app/components/login-dialog/forget-password.vue @@ -0,0 +1,565 @@ + + + + + diff --git a/app/components/login-dialog/index.vue b/app/components/login-dialog/index.vue index 4fe2093..dd2670b 100644 --- a/app/components/login-dialog/index.vue +++ b/app/components/login-dialog/index.vue @@ -11,6 +11,7 @@ > + @@ -18,6 +19,8 @@ import { ref, computed, watch } from "vue"; import login from "./login.vue"; import register from "./register.vue"; +import forgetPassword from "./forget-password.vue"; +import { useMemberStore } from '~/stores/member'; const type = ref("login"); diff --git a/app/components/login-dialog/login.vue b/app/components/login-dialog/login.vue index c4e64a6..48c8a7b 100644 --- a/app/components/login-dialog/login.vue +++ b/app/components/login-dialog/login.vue @@ -5,7 +5,7 @@