-
-
+### 群聊总结长图
+
+
+
+### 软件主页面
+
+
## [点击这里下载](https://github.com/Wxw-Gu/WechatExplorer/releases)
@@ -18,22 +45,13 @@ MAC系统 获取微信聊天记录 AI一键生成群聊总结
3. 如果遇到“无法打开,因为开发者无法验证”的提示,请前往:
`系统设置 -> 隐私与安全性 -> 仍要打开`。
-## ✨ 功能特性
-
-- **聊天记录查看**: 浏览微信好友和群聊的聊天记录。
-- **全局搜索**: 快速搜索聊天内容。
-- **AI 智能总结**: 支持多模型服务配置(DeepSeek/GPT-4o/Claude/Moonshot),一键总结群聊精华内容,生成话题报告。
-- **图片生成**: 将 AI 总结的内容生成精美图片,方便分享。
-- **数据导出**: 支持导出聊天记录为 CSV 文件(今日、昨日、近7天或全部)。
-- **安全隐私**: 所有数据仅在本地处理,AI 功能需自行配置 API Key。
-
## 🚀 快速开始
### 使用前置要求
-- **微信版本**: 推荐使用微信 **4.0 以下**版本(4.0以上版本不支持数据库解密)
+- **微信版本**:
- 微信 <= 4.0: 可正常使用,获取数据库密码方式参考:[Mac 导出微信聊天记录](https://blog.vcvit.me/2024/08/02/mac-export-wechat-chat-records/)
- - 微信 >= 4.0: 可正常使用 (正在迭代) ,推荐使用 [WeFlow](https://github.com/hicccc77/WeFlow) [Chatlog](https://github.com/sjzar/chatlog)
+ - 微信 >= 4.0: 已支持部分能力,仍在持续迭代与兼容性验证中;如需更成熟的完整方案,推荐使用 [WeFlow](https://github.com/hicccc77/WeFlow) [Chatlog](https://github.com/sjzar/chatlog)
- 如无法获取本地数据库密码,则无法使用当前项目
- Node.js (推荐 v16+)
- pnpm@7
@@ -44,15 +62,15 @@ MAC系统 获取微信聊天记录 AI一键生成群聊总结
可选配置项,可在 `.env` 文件中设置:
-| 变量名 | 说明 | 示例 |
-|--------|------|------|
-| `VITE_DB_KEY` | 微信数据库密钥 (32字节hex) | `YOUR_DB_KEY_HERE` |
-| `VITE_IMAGE_XOR_KEY` | 图片解密 XOR 密钥 (hex格式) | `0x40` |
-| `VITE_IMAGE_AES_KEY` | 图片解密 AES 密钥 (16字符) | `YOUR_AES_KEY_HERE` |
-| `VITE_DEEPSEEK_API_KEY` | DeepSeek API Key | `sk-xxx` |
-| `VITE_AI_BASE_URL` | AI API 地址 | `https://api.deepseek.com` |
-| `VITE_AI_MODEL` | AI 模型 | `deepseek-chat` |
-| `VITE_FILTER_MSG_TYPES` | 过滤的消息类型 | `分享消息,图片,表情包,视频` |
+| 变量名 | 说明 | 示例 |
+| ----------------------- | --------------------------- | --------------------------- |
+| `VITE_DB_KEY` | 微信数据库密钥 (32字节hex) | `YOUR_DB_KEY_HERE` |
+| `VITE_IMAGE_XOR_KEY` | 图片解密 XOR 密钥 (hex格式) | `0x40` |
+| `VITE_IMAGE_AES_KEY` | 图片解密 AES 密钥 (16字符) | `YOUR_AES_KEY_HERE` |
+| `VITE_DEEPSEEK_API_KEY` | DeepSeek API Key | `sk-xxx` |
+| `VITE_AI_BASE_URL` | AI API 地址 | `https://api.deepseek.com` |
+| `VITE_AI_MODEL` | AI 模型 | `deepseek-chat` |
+| `VITE_FILTER_MSG_TYPES` | 过滤的消息类型 | `分享消息,图片,表情包,视频` |
#### 图片解密密钥说明
@@ -62,6 +80,7 @@ MAC系统 获取微信聊天记录 AI一键生成群聊总结
- **AES Key**: 16字符字符串,用于 AES-128-ECB 解密
这两个密钥可以通过以下方式获取:
+
1. 从 WeFlow/Chatlog 设置中导出
2. 使用内存扫描工具从微信进程中自动提取(待实现)
diff --git a/public/example1.png b/public/example1.png
index be3b950b29e336b6efef03e001b9b274f8995bcd..8f4882bdf1f2696817650cf6f45cafe279e7ffcd 100644
GIT binary patch
literal 597149
zcmZ5|b95eWwDkmy)yB5%G;EBsF?*PXM4tfl>QSc3shS%ii%7bv>ML9!qM0Z(lh$Kk09dF`bljH zhhjBD#sLk)Wo2L!%t&?Z_we+pGp4KE?~!TFy5X#(3ekQ4#{ey=BjyBO*ho-1Ol93)V3g?+>}EyCsX z_|neXu(%q(uGXl|3`(&+B5#b!Qc5>t0$^dbNv>L?NE&>bj1&PCc}y!21j>ZGouBo+ zI~b|<{i!D>EB1akO-`p&uYb{t$K6j@NouD!=Ku3>>EH0QZBDQ1V1LkhhYRig`g(+~ zs@dRo9VDr+c?YtC_PYFs8l6PI7lwGGXQLMo5nFALfl9G|T6(JORDmN&E8{2l=bIBV z#m)Vke)$*A7*GjIcBRLgxepoC_19~=>OH&$nO8*Hr2-hHPk~>)SiodTjdUh!UhoL2 zVO^JM<|fUcR=c>A+8Rxcs7=f+n;Ghv6FhhIBO)Ry A@irJOBwm4~xa;w%Z#? zBO)Tox#*ziQwBErYEx{Q!8ir|{Owg&iZRuNol{La+d)6K+Pr?0q1ja|bBWB5nM{qB zt@Mi@hgx1ys{R?5b1O8=^XF@Lc{RNC7U%t)!NgfB*G0h~s3=-&F;NfxwNPYyiCCi7 z61xgI hbZ)I n>CDnZ$8&qSSizvxt-=pJNCig@GLsBK60shq#}F_XGF7Tjk0s>e zA|*AtJ(`{MoW}fb+~#Fo>z>0}`x`>n=U=L;%Cx7a=L<_=_0=_X8;(142>TH@zo2-? zm86>aBePwD)z$e?Xr~-KjKgcYzLT5F;4h?SAsdwk0W3I%aFEWmP5BM79rZt9IDR*` z!2*V-OAR=oRoV@;>1RuT@m*%ic?HErzBtdvAMXlG1yZ4sy-?b_Y3V$(qgFBo=jvx} zTt3!a11w+4T*VqSX)&~~0`T?|J&mIUa%! +4q9Y{KJyt@lzL;Y2}1Ichw *k2;{8u&aBs{Gt!1-P$fU|s7i5GJM9j+Z&REb zvP5lu3RWMTX32~y*A0=8cCxjUqa9V`=w}J&UW+btn4!BZRV(ART~b_)g^VU4M|)SY zfZ?fZ=jfd)GXH^3f|E%Cj4E0Y5*PC`z}L1xY30og(%9J|$~P9Ubc*5TlnjoIx8eEe z>Z=CC7c@lc8Aje!@VVG2t+y*xxNlR3goKQZjlq~xNPnMVMe6b-vxcSa{1qDbi$$5< zC0tHrIKru*50@i cbZf03nb3XSU;2RZ}|^(Vw;0%1c!`uH!V z<52npS@e>9|GrLBPLYkazR?9G@&@Q!Uv4aoarD8%-yJMd7R01rlhkwQF<_eWhx52U zKXGPh7Z$qMY!@r!aPbhvn8?eIQ4C^-pPcC7$3wOTm-|%w*6+~$huNa7IS&bqYKZw~ z5J{y`^C^wpyzJTXzj?E_eBG}pyvr rjsbqi* zM8D||WfYZ6HSIk0=O-SR2agY&R-w*}kIm>~Xg_NY9)pgVx3)O`xGQ^X_ag^QPhzO3 z>RKG1*qq~v&_{?bF<{d-Bv^~1HLL6YQk7xV4w -dFt&>&qF)W8a&C)=M}0oVU_L2IzBr*^4%Hx11@Rj}xs>z8!kirJ zQiH`%H|=*-7|y%h<(9<<*Zt-YEBH1|x^~a&8j;5__J^%L#GY%TR7JzV%{WMr*?JUv zkO*QG#(L%BfV*id =b7pm46TINoZ#$}~l z^lR`n+@?z!dWaH<|3Vc%dskh*r7h@>L!Q#^l~FM`OuL~o#hVq8iyOd-bZsY=Zv%}D zWmOnHC&&mQKhS&gA&>UZ`zV5r0j8a)K}s2o_#b66$y5}WM0^!Pa!nV%hplmk40-xD zDEaZdB}tJj0Gt3N$iTRPUFR7sgy`K@9qf8uPSImyr=3@NKGI5cOPVaIVwSZ1z1+AY zGm3(*H0~WCN!r n%%XSOp0fDs)8f&=fHx zKO0dRdB4|RxTHLLq1VgkD^nQad=SS-Dz!lBVMQ*(;gDCx31@|tpTraAGUTD?NB_vN z%#$ N#It0zB1SdU7H zp*kFbAr62vSaAn$&q)ztUw6IUTe!i4wNRa1mrtmpugc*4!rwo)M8?vUGO*j$ &k*}9<$7&B#V-Qf*pi6@>8(|z1Ul;MO)S(^6T{Q9YmFn1 zBGWFiK2~04@(zZtL$PXQoK?n&>t?&2p3N{HW_ldkuK3ufNI&P-t4>Z-am5aVP}VAY z8atW2dg+tp{z`!QnDg-r<(qWPbo7o!v@XN3P9h3f R-D%z(fgboE@sID&$k`k*s^;v|A1+ zmB?nt{Uq{ZEVZ+Bm-N;FzSxKyC9J=XjL~{L+>DO4D)2Vi$|Q(U-cGaC`s+0^atW#_ zGqn4>3Z{t8ab9~TC()TPEj%2_Da&}x^_9g3A|Eel>WKJe));QT4pjZ5yS?R$O;l#r z;j;c#8!}Sf)>r0MSY-Y+q9CPeeSl>{XC4u_cv#G6&_OXZ-8VPe)sJbmw>Ljk8fJ-^ zS@Bid)%+n-q1Eg(5JX)?cxvn0wqn@(T-(rEwdzH~L BP(2x80J|v#3H-0bh7ki<`aZs>A>7miLBY!4%oXMG;Rqc@u)=M z;!P- 9fMuU=5Go>3+VJ!EH~M9k=JeL&nF= zcTcr=8Cz?d{ZHnK!Df{sSlmz9rG_VLc=w1#n+D?(PsN FPGwq>#4L6pSC=r!4$dxpt$WYn*N%V84wu7P9W3yaz3LR=hJ-*)TajQRGX$t_Y zsM+?5<&zh=;P{86yq=c+2CF?rnAp2PM!_jKASVGA=qx&TU%jG wu3 zEXMa)DPka^avd9#%P2oXhHf6XI0bz@oheaq6^gcsrB^NEtPp|XYlIKH(&@~0&n>_K z`$!d%6#D1;GdKVoB@_5l?{&rBnD7MVI+=n(QCPn~qf~jx+oL(N+dSzfUj^U1b&9*w z$ruWFB&b(!_n#Qjl;V^?05!95=Tj|v&iM3^i>tMFxgPIqrk>XFvhSDmu?yeHuKBPc z%Mj(Xw4|@oF0qvrMp^o++SaarQXf=bp+;9VC @+1B>f+TULWHjO5dgTW4y zs#(eRfc{{G^k>)Qd<|_EhI(>d_iL-R_74EKJ@SAA5PJLez&kgzB>jZ2PKny-_pGE; zgVd2o;uLaJObm Sihn z)?csFb*yx@(|*lIh)yO~l?~}yxisA8iGiC_?^h3iVj+<~GTcLu$$_)CvGhx0-`$_W z$jGSQyqD$IBpoBe2OjwZoPXXK@hK_B _`rKL=P9KN>yyRG~Hf)4i0g_gWIO_1&v2;+E{w9K&ulRG}gf%&V}-Z<|? ldMzv7!ZsOXD$QltI$~aT&~WLK7>#T3Xtve2tPR>L-U5>5DDrE|F%@ zKF1#F7F-G|CAKQfa-V|pgKX91I|k|PKkW?It%rNT00DAoZR9|gf)I+?aAZUw7=r|t za>Tx2hGAT!01%S5l#dJcAZYsq^q4XgjoB%_H3cl~U-ovty)tk;N~nHQ+Oy7_WDS78 z>2`EuRyWZwagNF2Px|O@K%D}F7O)~10{JvZ)HDfv?n??!kFSIT1pU$Yovz1?S1gtR z5a|HM*hZ9$N@fN ti6KbC$3)>Supu50h4s5@G-1NzgZycSDGC;t2d-aqe-SY z>MWl>67;~{96|#$bn%DFE)L)F#k7Yaeh9y|`PArEMumS(`~1j<)Z<3X(`2)n%^6vY zl_JGncQusJjrTau$P_PZQhb5}4>@p|XN-H&um8u({^s6*_w!PSLFALke2sYB01w~d z0A+z?y|(81;^f%k;cD+Wq6V2khjco-Ei}+I*FQDfV>*0>Zg6}2-DF`9k^7gu{5uzY zOVvFQBGBx1EgUW@`0a~(kW-6@WeN9#i6tom6DY&dwOl jSn`mJ_mG^mBtr$4!W z>&gz=KlYeMu$@v=rl{B{6MI?j+J(F76ZiRk*+|~vhB6qkFt}__Brd49+YkJjGy-4& z2V3Z|x5dQ}^|?F^*4S{Hv~)wDk{nkz@|sX@g%bC&;}-AsXyWg$OR!%!S! y7GUM(tg9K zHaRbeDsTJ1E_waP4+P}5M=KYa;Q$5{;vmTY94ByBqWX_-OQ5*8Is!lx?xg?bP?px` zNAL(!&^1!1Hyc!i<-=bfv5~8ooZ>j$F|@X&g# z$=%?I4ltC=UL zIc>^hj3JCJ#|wGpO|^C>75|F&nb*^Jyy8;A=oub8|5oQ0S7mkjg!Pa<-&wdby~K1I z+EL!C4c2hTZS&~slJPko-rXDAZ^coFPjZN>a3BlS)-(pl2}eW}>Su#b6FF;SXQ$Qq z9dFtZX1FsnQI4*Dlw-#UHNx?DV-pml^}Sqi#1L1(0LN30XhMzN=9C40jH4*%MCK7x z{(z!E^7!oV2X^65248~O$&$0MpH=WfInE#FUjw~ jQBh}`h>@UU5^wmVsH+`SCs2{oA$3(t`Y9LgGr8h}TtIv%2Bh$^)F z&}9MkR4h0!4g|%AwauBx_*_0qlsO|xqRP$h|3XrOXIiEus&h#dKY&@aYyF##a%f@5 z59DW-N>t1^-xcT>QDXmVuyG)Tc-sGj@JNs#D?1qM*R?a#bm6c->@tsE-v^(WYYBAy zT{MZRdfc3z4^z;8ynL>fcr(qi$cm8}AHl_#yKSxVh5)V*D8M~*bS^RclhIlw6SL~S zvjrB=xvGcHq@RO|4h6!-&Of^lHM+gX_C}^$cD~$HWJH>XDDyI?(x`?cBxp0m>{asf zH5uOacP=#`5KS~W@47<+sdXN8b&0Ptj-m!_@&NGi$A$iRa%;A=<78I2(>(g&y{Bgo zq1bl^p(e8$i#`$xl0U)8iAb`4vQNBFH>#@7GPh6y|938@XQAr+hI|M|{2d$Z_AYxu zYzh^Ij^dGLCldnl4g2E5!DRmQ)Vkfu4Q$Nz7!wL 67c Exy}+=;x=Qy@p{Ezvt_>d_zp zRl3`|_Tr6Z#xRO7)YDath4pWU&M7vu7}&=tFE`s80WhvpY_;?D0_CbD5Wtz8d}6 a+}8HE!UZSx=3`^a>2LxQHeuNNBf5#0g)L? {dRo%L|Q-;3hBbr2WbF{Ii1`1p<2P!I%k0QUjkW) z;y-R&B8!CYf5{RkY;76VbyO-9tr~ttH{`DTli76&8Cslt>&Y}kf xvc1pcO%Vcl<_z6PgaTx%anyw2H|-2z-%N2W z?y>I)<>#R&1l&&0VK4ZrL*-3ct?qWQ-nYGd)EAG(3pX>WvW(AeUt;%ZKe(R>#tl($ z{9*;C1sq?%*yLZ48z*^S5k&n@F?**22l8W^{m#4dAGqx)wi24OnW)CGE}$ErM6t#* zO?${!GHnGtSSkv{o+x zv%V1?R5?`tW3@o-=ITEwDPrQMJT0^GPb}-1D`hQdM }>rtL9$#%d8g0(M8arl7JJh{KH$oENHWDq zSi4w}buPRW5*2e6GmDF#Aq9zhSY#xVhQ87ghHT@=qc!;A&)!-yps8aan+3>fU(p G@&pq-$hxL%d3wC#V@)M;D?>czkbXlg~fiuq6s2CAqY8JJn|B+#kN@_c7;S}$T zg=&@@R?+H(3G_QoAH)w`cq5D~U;>oWWGf~ecnAmvq)`S9HG8^}JCN}-3NH`LW9{_Y zrBpDa6OarYKJCZ(B C~#Mi&cAzD2+^N4}C34I!>4yRN!2-c+94 zZuEMK-{WA9H( O*Ecb z9YM_e!Z_peA>}AAf?BWrP_x!s$nX0Rk$Oi2p|8&&G*ntQi!iFE)Rot2phJZ`>^3NV zgvB|~FC@b~=LaPv)N_(tU%SID6Y$IZ@rDg2bX5L@3m9;G)m6i_cdlCXdFW|+UGpwR zD71Q95{TT73Hog5w|+C<6yz-vQNVb^W;W1UEa*wpv-TEfvI&8F#9_Ddyw)#7T4j=W zPu#+Do U&H@miwh_x?7Crsrqwp0h_0nS&Sp1K2ar=PK<&~@$Xu5 zJ4@1=-@86LGqZOU8O^+Wx-FLh!=%W{QeV_ >p8oU}B2^dW @eC=Tcmn1iLXB}krz|bAu!;|U z25Wu~>eMh7!klFa;f>I4HijK#Ng%Vl$q;k11qx* gvIqE8`{m-ddrW!dQ!v=6w=T=x#nqCY+g5Gh>z=C4Fm{grE^;T zRxJI-_8I6Jn>+efQU(@XZ5^$DGMFIRBowSy(C@$j3{7kYw;i#o*3`b;kcVyXbhwT( zxM`@DO3AY7FEv1FRIdBK(dn1X?qXwAXm(-)6E$+vFMr91Vq4GuiA%yR^X_Ur &(V`yACs lFErs)#n9 zOOPOgIW0Edi+O4!ei=e)cHDQg@@kC96NBuCZrB}14?A@ElV4mZN5n_*vLx`@lrM;z z)-qvW()EWi?BulElOJ8$XV$7hQ@Pgj76}MYFK#7p^gn7QMe3m_?nuJ;dW{%~LeyEV zSPG(P4Dr!y?c|2?X0hZ;rc- YyR)J2g_qyPd);1J_O zl*^_paPN!s{%;n*MLSwMUu}8uDi{lriB{%oOii8pRf)ARinWu7tkVmAe8`8uZ3>Vi zyY|#&8YE?90-z1b8g~<9Ah4+eVDcT)AvxsA8mt=B#VuXy ?Y9NjHd70d4D{W;vWH^kt^Sw;RB>3)Cu~)GoefvU>5JrWtlF~UBkRED zvEL`Z{s$*JU$$nYvSLtBZlD1E$QVA47dD0gN1xTXo|C&ba_r4JFwZn1AnVp_P$#Bj zB_($5+^;(5NGdtC)T&ngvV<|~-MVfDF Fe^D$AS6l<<7xk zPi`l~>qiCt%LRWks|K^aC*PJwV{YuQ;rVleW+(Tx8zmNntw58Mvo-(Ct#1aZWPF}y z{pBS+tE-tvXEC$gegaF}Hj4Pb#g^;e!m@kKYur80Oy0MQtY?Mu1$V2tpPNtiAAqjZ zlHr9@FIWD77#z53ubP*RM`puNkP*>u{-i~xF;j8s$aiJw7(TK*eR}qa{a+B4&hW&P zsagrIxcQ;5%BOwja(jeVkQX(zg-Q910 zZ|1!j|3F~w<({+m+P_-s=q!rmPm&4vFNjiMo_VEdHIIow|8hoN^Z9D@(O*Q1as?2f zVsle~iCaCap&+!$3>x {1RHp0YS;FrE++ZuZbaU3stvywupjj*kA{?}g3<~NTRP>~^s{+}QtNS%( zB>mN*s&xM$L0q$dQ0yiN`tbHe6ZAK@II27Re(NK%bgB>U^~58Wj+mBo8Lj!x^va!} zho*^grSqqM&hS-e_r5hY5cH_nzPI|UB&&R^{M85|zrTCg%$f^foU?Y*Cu4pnktjoq zH8J^&uG#i5k!PHysAz5iLRV$nWYLdC6tY39MdF(PSWC*_9Vw}Qr*!8#nZ%L@Q%tVXg1d$PW_!$SxxzHLkPpM~69oEVcq$^lng*q>~w)ko*~ zTKR^&-Sc&_Y)#@ir!zAAJys+6_D&SRD9Q1LDGM{bR<-S8eFg@2-;9K8x7(K}@{VJI ze+9X*dEcv+UDoCcwN%0mS7TMFSL-${4|hcTJ63$qvr`z@wx_--0%& zF!2Yg(K%ls7UmCQzn*O9zkeTiUl7V=g{ZfLG)!27R8o%n+w?-b%)Q$#y=d^c4cdMp z{X)=Zh1i4acJJRocjDao+)20pdDc&hIR{~R$?>lW(x(gcoOK8(Rf~(A3WK1|8+>Mo zA>}okip>x1ZGna`ehLD&Bon2x*IRPhx&oxPRvnC`;eA)TuD$W3lNGxx-t4rObizUF zD}B3q*-SB(icl_8FXIHP6A1MeZaxcqXk!JVcT`_5+3K__zN=eJOGh+)%>QGQiay91 zs@;nhQQoAB)+-6bzu4Ko(b9#=bjdswYP4$VvkiP%-;1mgVBerSrprhBVNKUn_-_(g zox>u)yonRT)+HMzaBLR+f)|&e8FDIgyP+2SiTRyl*SgCcrO%hBGBZoR@VD)Pu-Z(Y z$J9!bh&Xe$e!5z_S&QoSuEihtAjT7sa#<}4#JlD9(U`T3jr*)(QA^7EJ@Roi13cxC zmkmHH b J$qL`cW%QuQn zK{P47T0B0oJBzyN$l%llFB7)H;G<&$OhT}}!2%`DNgdyG63gHSG1psE?*>}S7YY2u z^yEUz@j9&RlS+U>gNSCMnyxV`-IeJzN~ei#LTi9Wk#5dI;tUpQF36iKg|VV)at!|2 z=L%R*FJeT`?OBH9_*rYcuCREUX-%S;Gq}Cv^G5I`{EII0=ZZ=B^k(nL%$f)Gr{`yD z4@**Lg2MH9)7_gfBNbg{nu~6fhV;--$NMKFKosbip8YPrteQU~GI^*+Y+z5Z)n53% zf3Jj*pNl}zSxw7gkdVRheHbswBJTOJYhlHpZsupbd~AbbbLhD+YEm*i57lt`m-bFe z{(yxBC_n!08PJ5;>9n)KlwQ;>xLmpFg<4y-ps53(muyz8`%u@(Nu_)lcN%BR+o^zu z*@?Nui8-IelSH800RuxC+;_98n+LZ$^2Qa@_j|7CLm9g~0&n3E$v%HX%tAr=yImMs zzvKr?xmd9EDOoz}o~yRt6Fp0EB9# g8A7stlb=$+BmaO%Wn l<(2QvapgT(0^p zOJ{BW1eK*k3n$>4 _B&jU^?5R^^%mqj<)dXJ^DSE{;~s|`9*|+% zz`n6t_Jb~ZL_e$I=P9>2JvlZlbe_#|yt=Blm~ xTyr?41h=(VLCS|MU zKce90UkF$z3och>W=MvCP)9#V)2{K)FB)s6alaFwq^D-y-i Z>q|CJJ zv`wuSzvSO|;1rXSYt|LcPRN61$o*KV$^g+|Okv}>5x!aB@33<5Blo8|O`c!yi5I6v zdK+C09n!9`P#E2yD6NBBSBxu-fNPnHOY4LCd&LI_5mTMwOMH7Vds`#ZV#10r8Rh^| z<{y>2tWzIfzo&4fkzZGmE!RtjEx+;VVPm=R@YdlOphhbzE0s(73|S3R#k+PV31zdC zEb6db`Ow5AgS$WGPr*S$#YlXHp!JS!q(^cYO;Cn$Pfew;=)C(T?I$RR1`n4Q%HMj? z3%%)Fi>tthwcb%lJzDVRZ6q~2r6IODHH4!*wDnb1U8-i-QrV`yB@)|Aq$XXy7TFWk z!sug4`z?)bnT0!=mb3Dfg`{HONQ5U|A|$#oGjV3q@K^)@e3>Rbg@#kKe0b<}Y^7 zr?W}*KC!5J7zxl)vu&v{`sjG%R6nPtB^#(Kp}b$kUTnWG#y)F?QEBBeuxH>wKto>o zvg>8tcCRqcX#TGv+%CwMmxL==#DeV&= r2gie<>UfASIfkW2!->%P;jvIbfJYhLYRjXi^PoG@7_IrUuK<}K^WL%` z5@c;-LlzU{g&Nn?A%WUuHrd3(42)Ifl?JRHzr*apv$F1b5pL>qM9SEkS`cZXPpYPf zZ%La!n)$CyAwn>*h~D6?U0(maCRZR1rTC$fa`(kAasA5WB~$9X87KI&5utf()iu8c zn7Osr24aw=EKGe?c};LXd>b|VBc#?Tv&$)nLaJ=W`(~p8$D)F@ByWzGpQc|vgD2@> zeHnpw^4r_c_bj~RqBKxc<}^}@N@_Ir@dD#av5|-X`er2>BitU|Y_jn0jFOa15zpEQ zUOhyuJBa05i|(O%U|3Wt{-H`q1HDM3{M?d#<|K2aszlAYxs&mTiDAaRG?feG+>oI0 zVwdK?i9948#tNzT-?>6VLin5<6R1ErR52knLyjXA{+6g?Sg(CZYzl$EXLTD}UR=tV z%hTfY_s!Hp#FdCh-|eG{211y#PCl7vo@^gF=q*`sy g$0>LlRQzq5P4rAkouWlW~Ysmkbvb@ z$oPnXD=~Yds4{0MvqOZxA?z&4GL-t7E@=BQ$CM|P7ue6tV{h }}VCOcl3$>P*08 zrAhFEdrSl>-dQua10a21%DR`^%_6A~pnriB)vw!bM4l<{&*8QO!Vxgf?M7FZYKz5x zxCHhR2~C&_mlu7uL>&Vs*8G?Mo|@*;(yv{1fEs+4c8CyX;Eu&7N62kC_rk89%>ri% z*2C-agwBb%P$)SXJdQl3c%j h zkvc4m(3MYGtn+>&Sf13_FkXXF#k%g{J&Ji#GiVMK(zjP<@V_{Ui7So?BIZb|en(T) zW8u4tUK6#W@Mtu1BYs(Qe!o=pz4CPO{g;2-!QFkvA4ce{N3tiDa(z~6{I0fc;lU(~ zEU8xi!?$SS2u0L!Z!&*vR;egDN-R;-Y%mGfzls=oqb1676QW8m^c1*M{Nx>)sFl;K z9u~FaR3p-|6Hm*lmJIsKBS0hnvz7hF+pmAJ`ppmPv_qw15@^xHuR}u76k(xUiOO X!$ohsvC}s?1z`IX5oHB$sZhN#Kqat;o@2{p3&hPx%r!;#k zN(15GrrAKvG1Mh6q(wj=lWO?l;#VUd?r9G$8zE}5vfs`|#aTSWgZo>zAw6A{lr{N# zY`*?aVVNC{E{4|5s-Mn??Nmx;4_uj2MOz=(nnkm+RA3>BC2j!@yN##3X@8kMFj93H z*NY+$7FnjEdPfbzhDw9pdah%EQdO(CoM!(Q>4EUmxM+J~=f@Qs%OpBS9$T&`sbb;Q zLYxiC7B_p3Taj`0*XLEIZcgc~N@meF{V)*Q6*pArEXz9YtZ|6S4J&(K9&NPUg7HAo zI*&-|7(R8P)AayM@Fa(?qC$l_3+9>aJ8YKNviDGJa{O^Uk>gvjP5`u7?Wb9=EYBXG zDmPodB&;rm!HwUa33}J=SEySwxgKZtTNh64i&}IKyKqB4wXvTFhb4!V`L71&NmiXm zIbO_ADUk@cH!DoUR{x$@ox21T7oZJe$=4L?G2gaj3psMMGM-NDmY3d=cf{$YaV}BK z6C U1QMKpMZ_{uRlbrabR#nkdng@;FlGBdpl^qk_5V+b+w+| zsI4ONzYd$C_7;TEWsljMC4a{X7Te;O^_!_FlFI6?{^~mvhR)X?G5%G+7Ft`}nv&w- zZk`?# f~2C zIc4-LE3QQ9`=}O<8qLvdXDCSEC&eTQi$7Yr-=*Kz8=I3Mc >^KIdPlr47I_7T%p_YrVZ`H4& z+#f%o_0QqNlR1cp@UR5DHBbFMGlw;t2fRzaQ)0=$Lv}}JE1aFxjVeo~WiH#FtQUl= zfmoHV5KY$v%7ANXReauQ(wiw}YTYXC$`=y{UDwpsviK1r3-etV2=-#VpznpWWIRg} zCM|8LVNI%c2I^)(4NNZai$ie;B=GOWKk# ;qR`Ql%o5Yt(Ok5|jFkfXXT%e~ViBS9`su>7qf&hyRSi@n}PhD;~9pj*Yy zy5EOp$FS`ysfilMOj&q?Q8HyR4A#Z+ZxWndBjQpr y!jB52KqR4{lGxy3#&y>Bp?!s{w9uiRU23y>M6MV{ zN7&-vEDTuplkehV9A(JDq3w>6*ep&% m?n&9|(L9ZL8ldoB+>a!$cXe{F<) z_PHV{$1HT-o6U@UhUwwbn5tK4{cZgrGl6yQN=eM8H>4>%!}52Nh!2JVkIOlJQn-VD zmd+|IV9O$8DYb?txR5}s-ZixQDlhW#mFmXQqL-)z93wKVT-Dx-lnEiSfRl^k@CCSI z;~q@dw}=;DD?tmz$rqdL;vVyRf8dxueXJ7Ra9-d(HGPZ7W+WS6Kz IHK9g@n(#p`VUU%3rN02TAu^0I#>DTp(30* zhV-t~kxN%=i6R0KrB3hXq#%R%LDCzS6X}8H@a9W%1p()SbcwR?L1+jf`V|`TnO2MQ z;;lizv@!8SMv#cb8tk|sD^i)bu1;`T1!8dTR+Fdm60AHK2a#xPx+*fB%o-zeg(KF* z2d-j8t%)60REhS2O6i%v7N7geEWd+8T#gtuhdg%Md22;n(ABJ7mQ2;0GnST}sFG@+ zxgnD9`=gQvgq~>RLoGjXZodR9z6~+4YJDyg*@|doT>N9fCmYr` H&Hbfg%$kb-+NM>-4S(nLYoT0>rV i2d z2-mo0&AZGNun#`q i7J%Eit8X zp3m4ZvfJ|aFvGL`y6m^1{cyEKMtlLPAq+^DQSHlhzbbx|*RDux)orce-lPhcxi;LO zSuu9K_V!<+jm*qp9__`;UH7KMO)|suivCFhdzF3GW-C=cr?e^A2{V(lf~g=KDhg66 zmzAZF({{<_zS}i+YW2nC`JK~bxtk8Uy4qZ?Jpy|8GT0jtCJ2A5>bB&MBS*%|wQmWQ zzBU#gj?(oSVVn2ty+|P`ft>_C9&U=-;GhHq;!V}45FIDrf8#CX6;nZ15a|XBy>h5l zsolpd{F2L^$~r30w2DH`du&df@!ZoY;3h=ck^38xL|>5;x0||Nl6}HlJYMXu=(o|1 zRq{t0?!o8z>JS}QoF 8A=;BT0)#bV7)pp&-fYbLV7W&OjueW0e!oC5Y!b50bp%Pb# zEo-!2=lwk=Q>Ip3_tIf Ezg1N& zX=q#do%xO FsJbI^XJp9A5xdQ zY}_~b+|_;<{pf-05qEK`WWyl=Xq}ksB5N(4n|q$lhfwW&cQ+T#hz}tYnzrtuzR|Ub ziAd}p(kf r;@hQ5dmJ2y6^Oy?Q-beL^V2p-I5Xxf$3IjI01r&MY zF9tR3td*`^C!Kt3aVU13EARZMA*o8$UOu5F%t0sSa5+F^iyK?Z%B&Cc^g>9`M=Uu+ zJi@4?Y8QIE>(lYV((3twKX#e4_dLD~8nLF9S`&Nfx(DXm1~5NXP7z1SlzHjOds?n_ z#z;=j$Os7PzH#M~wdnmM;;-Z-Yf4*BqsDnXF7G=zGMBAe!exTbl_8$hU3_nbl?%m$ z&KQ;!HDbMCi)_3G7xv@lF~#8(Jaaf23m0Gw+rNxB;s;F{?-;wCM9Zd7vfv8w>g9ba zGs+|jXM0dkMe}E-_Bl#R(0i==jj&SxXc=bQyhQ}$Ztb!eT4>I=o<50)pO7U@7tF%> z`IA8e^E&3&4(X==n0t(>6g<;Js 5tlNIz><7PRK&%?nQJ|* 3kW9?by2uc zg K=-`B)Z4qL8~#Y2Z#<$qu{fp8pmeT~uu9uk~` zDePNKS@<>=T|0Uo@C5{wN5n=5Oz1fK;_$N?J&2;JCb(Mp^qS#mbIp0dA-&og?M}cx zigb`Es3oz4n>KPDd1f&-m&sNEDkQ707A~sa_Qmcp(rj@au`U=AxFZ^YYguQJMoZsi zXM v|z{ksg z>zrL1ANv 2j>KO4uQbxFIYyD z@FBfhQIW_f_r7m)1}g~W2=MXV(jrSbue9C24!!M!e|0PR1BF21$?bTFP6;(``gafb z4jg20pNpqBiO|qQ7Eq}Z#pd=oQoFxyHYHa>e}n|WKsRcCD4UVR=1CbVsVYm9qGD#2 zM}?2X!Pi*{G3pIt(rZbgK;#QLjHa&8CwOy2Gn**!_XkWHUvh(Jk*HMB%vGN-$8;~@ znd6o`7(_L$@-Y=Eh?_&wlA}eE%GudjnLfFs qnA34%3iOU*8X9O>#N8%RsVvgyXu%?b>}zmYGkNYFL5D2>@;ym7vKK~&&| zHpA36qReqrm>626yZXN@z!2nBlI0ZeDY?jK#FFx#Ki&=vk_SAYhxHgClRB;i5HO;% zw1_z*^tllUrqFy$g+Q ?RKx?$W@}+H7i#KzsQR758L0 za;8)h>@bH!)_@`F4>m%& ~#u~$OjK8s9hK}{8OQxN#U3jMu}+5M%28bFQw=6d7$B= z06OFi`;DNJT7@=q3ccz3_uIhYqj2O3hY@ItVk399@~tV1mU2OfjooI=#B(!dD4NRG zh0PW8SFS&~J*8H#KN2=vYb6Z#5M-D>KsE5Kg;y`+KoG&yaVMP CeN zl7zZQPnn7Ag|?c%(^6N8N@J?FKC|-QZyvev9jW-TW5y=*6+z1j PPbRMfpMowMn~&<_UasVm5(wbLK(d&SBE z<-WdO{?+6r^n946s`AW}c(Ro?h)sMCwvMTkqHOegZhu~_K6aG4XJ>XoWq$?GKr{C* z2|x@ot6MD6zik>$c^A?- 12ps#~jCs`i5*cabxw%Qd2l#uGWjzKPYfkNGDU*B%cluR? z5>`Y+*7O^7<^fs8g3~VCY<4iC7x{DGjBx=}pf(b9#`XBo8h<(-z>lk3C&fZUa`Ta^ z?w8pbOs@NHK68cx;;@bP-G!IL(vr-az|dUA)AHkDwZ+p8MlFiFu!WKzUXdKhKVG_< z#+b)6S@@{o_@N|VnA6f#(Utu~!$A6p)A>QlSl{R#=#d)C&q*Uji$pxh(hT J( zDMNvpOKisjRc1{*>maywdbr@5LX@$!+|nm@Q90Xd$hzG0JoMcsuP(2M7q5SInPzJu zYR0BtuG4;g#PAPA?LcPQL`w#q^w>?Oyp>y6>QFo|_2-XGE1ImHf5TOC?K#OSx#^iW zX %IMgD*UcC_;; zjg5E*Tit$fac*u=m?%i@Je?$trXGzpGRGAcT>4a_lxtplpTpE18FM l-mPZR|i$^iqYkJ^m0 z5)n_AS~%$eZksn^5o0Rn|Hejvh+@T|TE%@L=(;`?x1v&72R8caeJgLZVZDs9Edg;& z!Buqm=+RS^kWXj-Yu4i=Pk_M$3qche7#*S;xarAk{{43n=)MG^Onq1kJS8<--{REu zpL2#O8jQ!I!x?-VlswUnm6Lc!$E)g< W%Wpm=Nga_Mc=(C9?O+krfVgm(6fy8SZ4kad``u8t%5_$%z^Vl+M4d ziA95+?_BNW^@nqDG=!ed1j*vqX*qcdZG0AwKk8WZJ7sli>P`Jnwb?Z3Wx}`77fBN> zxj)%unoeh5B?o+cnmBq>;(BcKw}< 5kHV#A=KN2^1lZjw)2{HeZc9G5mz}QZ zt&LyS7El34L(@~c4)6~?F~kd}Dc1ph?58jq1Qz&Fa0=ZO{0jih0_n-*b3xCSil3z; zO*!mKVKtoel%DHLbe(of DJFmdI%+sT$2S0<>)=M!` zx{SW;@H56?{tThNRwK=a4yH_0A#dHY=ihb)em5O@6?CvG$dvC;*)>!n7GdvaxuxZ( zU6iB>hePUDaKQs9 hC&J!zLd=xqa*+BW?fhC! z29RdPKjEZ6+^~KKPO6M(_n{_?DZ;byXq>-w2l~+P2(ym4I+ Eu$rE^Pmcs&620;%;oT1^If`l@mthffE@_oYmfKtz7nG6D&Ytk-?2k3nOt zv0gsSe%A}C2~;-yG2(?YZ$&zM$p~&L{aBrTf~pE$4l7uN){a^S_Rgza*#2z0&SzWA z?KF @r7u6Nf-KC``hy}Dd|sdrhNUIjVp zUJT(XaOxNoP$L*0NweQ58mBx+p7k3=yzGN5&B%kOrzSn4s)g;trZ<<@B>a^Bi9;X0 zy#?zDur2ThrwLmm+>Sh<1G6>Y{+xaBd-4v4@GH-}t-Px2 `;MInv7%< z3|*H7QRdeN%i`1JkuS?@%V|9tybXGM10pu{b`w&NK `dG^Ox~) z&Y8iHWRDIEb>jL7J(XmSWuIh1bSx?uQJ_v%uq-sr1P;8oPN75{Cp=!3=LfMnGVdt}MA%>=*~a6u z1gym_uAh)i5Yr(nXB&)iA`?DCe}fceANgWj*R5WHvB7(^yPV)*Q@92s6kD7dF0PXe zO5fLK3-pcnNtVpRrmYZ-*F8P39z>;G8l+0^{I?r8M>?wgHh^47v*r{dQ4UO8N)C!b zpKwm%+t-U;3&kww6&jqJyA;|Prk}14-adDaUeDFmVC;EKe)vt1rQR%KM)BkU{&SsG zFAK`Gw@F|QK@cQs{H&2q@Ta5Z-1zaDpcv*SZ;9E&Hf;0^IZh6Fe+P 5vd-*PB zL