From b9f343cf2f394837537877cd5da3573aae8769f1 Mon Sep 17 00:00:00 2001 From: KnugiHK <24708955+KnugiHK@users.noreply.github.com> Date: Sat, 10 Jul 2021 21:11:49 +0800 Subject: [PATCH] Update README and setup.py --- README.md | 25 ++++++++++++++++++++++--- imgs/android_structure_backup.png | Bin 0 -> 12439 bytes setup.py | 3 +++ 3 files changed, 25 insertions(+), 3 deletions(-) create mode 100644 imgs/android_structure_backup.png diff --git a/README.md b/README.md index 9db0c0d..e4d0fe9 100644 --- a/README.md +++ b/README.md @@ -19,6 +19,7 @@ mkdir working_wts cd working_wts ``` ## Working with Android +### Unencrypted WhatsApp database Extract the WhatsApp database with whatever means, one possible means is to use the [WhatsApp-Key-DB-Extractor](https://github.com/KnugiHK/WhatsApp-Key-DB-Extractor) After you obtain your WhatsApp databse, copy the WhatsApp database and media folder to the working directory. The database is called msgstore.db. If you also want the name of your contacts, get the contact database, which is called wa.db. And copy the WhatsApp (Media) directory from your phone directly. @@ -26,12 +27,28 @@ After you obtain your WhatsApp databse, copy the WhatsApp database and media fol And now, you should have something like this in the working directory. ![Android folder structure](imgs/android_structure.png) -### Extracting -Simply invoke the following command from shell, remember to replace the username and device id correspondingly in the command. +#### Extracting +Simply invoke the following command from shell. ```sh wtsexporter -a ``` +### Encrypted Android WhatsApp Backup (crypt14) +In order to support the decryption, install pycryptodome if it is not installed +```sh +pip install pycryptodome +``` +Place the decryption key file (key) and the encrypted WhatsApp Backup (msgstore.db.crypt14) in the working directory. If you also want the name of your contacts, get the contact database, which is called wa.db. And copy the WhatsApp (Media) directory from your phone directly. + +And now, you should have something like this in the working directory. + +![Android folder structure with WhatsApp Backup](imgs/android_structure_backup.png) +#### Extracting +Simply invoke the following command from shell. +```sh +wtsexporter -a -k key -b msgstore.db.crypt14 +``` + ## Working with iPhone Do an iPhone Backup with iTunes first. ### Encrypted iPhone Backup @@ -71,11 +88,13 @@ Options: -m MEDIA, --media=MEDIA Path to WhatsApp media folder -b BACKUP, --backup=BACKUP - Path to iPhone backup + Path to iPhone/Android (must be used together with -k) + WhatsApp backup -o OUTPUT, --output=OUTPUT Output to specific directory -j, --json Save the result to a single JSON file -d DB, --db=DB Path to database file + -k KEY, --key=KEY Path to key file ``` # To do diff --git a/imgs/android_structure_backup.png b/imgs/android_structure_backup.png new file mode 100644 index 0000000000000000000000000000000000000000..6588ffcf62e512ae71dbfb245b35dd18e9e6d97e GIT binary patch literal 12439 zcmc(FRa6|&(F#(BKx_AwY0^ZNc4m1gaZOLd zvmAa`64_>uqe*q&*n2pggyaF~Li+Ni8wusO>uCN&i`mcpTt`BZWad0Mw`<9CVcgQS zF;3qhIs7a{d!1aC171bTEW+|ua+GB$xG30&@^&GlU+;zz2{Z6?1yOai-jJm%24ZNq z_O?d!6H-z#7}ybE7X8$mF<*jFI63$q6EGqc`P1w_Pos`V!UZGolsoD0FezO4;ZHEO z_yeB>jC_&qMah;lPmsj&w5 zU5Pu9$rRLUil-(gzfG%aV@e_V_RQ7wIL6c%@a9hi`IOHDM+9Jst<)E)G5piIhL?Gm zzPz+-?dkb#Rbdn@bp%Qn7pi|lDx*|2Ise&$mRlS0j&Ah3)$v7=4Q5PCO!*9hm<}9w z?h={K9?4F2mi#=cdDK+()}|*`1R+g>0;ZmMqWsgy?-Vit*KjfsUpW^S7nwD})<>s3 z>10*8h$?I`oqRv1;Y4D#!hs!z1g#+N;YE@mt)$h(i*#GAdc;EVyRkjrXk3J7-wJN! zi09rw1nAD6;8tkJ)iY>+~hP~syTjrCLha#p)G<7O|@r4BE zEGIUv_0%j@M4Nd~N=z6{iqgw^r!iIy7cdzjsFW;>HMWKu&7_Jp`4sDApCcplEW?0% zCe>&7FzIX=eFZ7a({?7du&_v0YrdYu{Lh`5ltS793QJZQ)(mDFGJ0396!@hdbU1O+ zLW--D=#mYhTn)_SH>zTOwr9H*qfM#a*u@8wJI)`kWiwM(Uk`9pLhnV@L2u!SEli(v z@`*A%8T6UO8_9?yDmgef#P2S)b<*6{h`|+F@i^dr1N_J2!Yc1$$K~~NT+SkNmKgu_ zjlDAntSP6t4B{cR)t6S1Si|59dPkwKpNggAeO;i^EbQC~8(63VO6qb#1oGW>zS#21 zJp0`Lt41AQ5{z_9Qd)3H;EBD)^ltB}ujgkt0^SB66&DrhtT{~qq8_8ImPFGYm7Yq9 z7KMuXiwgW6D)s#LVLN1NS5=T(czfCp>Tl>|LShY9<#pALp+9T%Lf#2lFxsgbIV6W- zbSnUb5oqat`AD-UOE5xO`$o-N$&n&F-NO?zCgcclQ09Uditu?@5fjk=kOZ8z&aZvU z5vp-d0`Xbs6yPO%>-0K2;gb0SI!K(F*zB;sE5~ZLQAS;_tS>&#B_ra865SjQHK7Kv z&T?^|(_GU<$iWXOD+XkiQ8n;Y^T`RY;`nmXf@}IaOdhr+f=Tj4nFQr3_J}ulTZ(4}1TEZb{W3glfe=gJ7-rA+}C1*&-%);a$ zrR*k4(Z?FZytZ^kgW0>NfVI`c;P3bQIg*lb-D}+gtqLs4ZWDzHyq@wC^ch+~GixLr zl^>SrTUu^5{(My;9vU73ry2QMR{~(m7MoM@Dr}kT?>e2Ht^iIFyo=Ra$HpqYaFu%QQjiVTahgx4 zC()7DZM{M-Rnj??0Speupry8U&JQiB)IG(v71rranZ7&>?$#5dh7%jmh{x0Ij@W)! zztSioFj(UKn_(E7WGAHF=<8>c(V@g#>l4Gcs^SbdR-DA9%qqX56A z_95Ne9$0~Q9(H^z=QZXS7-@gRWqe|CxiavgKa}UD3*xcs*7%8{p}r&~h{f+tJXYA4 zAojiS7k%9V>NOP&M~%9&3uyzmY6VH5HXcpu z9uCo=MBk2S-N)Y&ww3#T&VrH?_6dxhv(}Dm!Y?9(dV6YXR=MELFde=Q){Wod8Vn1l5$>e?KDx*sZ!}Iu6I;!e3iV=4YUy@apCx^lN0@z zz5Yqzm`4nC(KbHu;9CY|oAmOR_gT2Xi2(1HmlwAXZNzpP%hmubf^mtkPjwp8P$$h3 z4fAnzh_bh?qOUFKUI`up^fRULp)gTG?@-C2Z50^`a?f zPPUZ8+9dgvJYsGk%yyVc2Gvy)#`Sg!Lpk9QqjN}s%RI+p?;2UG4ZH-YhIL7xc`7M% zlG|_hTsP1otMAi>?UyfcGE?bJP0h{XM%(G2hY)F%O#77~jvBq7L*SUohZKsT0gBQ1 z=<2}+=~FJbD5gZ`K^n&1#=PH_EDsgdo{o1Vy~9du-jlFTCgKw$p!F;TUn!|d}F>dlQMx3V*@#IN(Vd?Cvr%8BiUy`^bgOdezynPkRcDznOpZ2BU@WrZcYISrcQji zP5{}VljYEN0`PdbBP0T681lD|^X3RilaTzg4up0vR##;MFB`0d)uxFfJgdl9rhPy+ zcx9p4R-k2ApOUb}CHw(cg2~TGOrlvT$XWDD3|l_zK$BVZn;i=ilWAXB(gmjCJDG0Y z*W)Z}0pERkw7Am(faqHyK0dzY*6tkkK|TLL)nFSd>k$JlyO_qd%DmCr850q4Uj9Rg zkiARpMrX-IrX_ogUL>x71xH-^Aaz0H0{|+2_+{v{Zg!153vAGz6zeL0)2_hwCs6TM zuyUnaJYmxChwqn4Es1o~wge)CnENW=^K%D1J>8OrXGUSC)6bik86|Ibs|2ndw-h)0 z9s-V6(XExGc`~=LvvqrP^gYdF6Tc5+t%ZfJ#-{0EexRd?)vX#p3jTB`paK37^T5Q{^0VBArUd%rkm6#PC3?ti&-Lto zZo`1YUex8kSJy^pFCi<>&YfFLn8%(*N!q{f|q-<0=T;(_=WJ>3iz&S6FqCczr2 z17S+|hfmsvZr=?B&(!kl|q#dQ%VYrG=j3!6m_ zsOyLFO%uOcnwuABVewqnh0Qz)Z$%Z&lz+_obX3TDX{mgU?val&GPMG6Ud72}R8xaT zSq^zs6>YA(!mOZD6O*4-WyRItTs0Xxa5k#rQyt`+LuWdrp0-ApyFNZdmiUvR;<)Q| zSRS}^y=NvT!^hR}7GBxK8$<9&**zEE!_L*itz2;vVb#BB>h|VJwf^OEYSQ=y1{vF2 z$ zAV1^2-ISu?>sah}Is+czWrm0}PCkfhl~?V-Guj^r%tzR4cyiA=jo@_3+@2TZzQV5^ z9~U&8eTpIHgGHXdAE~SSy?xrPzkgBGKVgFY`{S1xaQ_n)ZD*g0!jjKMXN*-GK7B-v zuhdD1{d7Rz(=c9Y!jZH1C(a@)ov zCGoGA8XN0n#z_L0MZFSjr=m%TIk~oWR?me5cT02mB-ljXNV+_43DGUVIwZGf7_+An zKqB+uO&Z5LRHQ7`{6K?LhZoY!!Qw34@$w%qO2+#6>f;MGFfENYr-T3rz~Amxw#?lBl*v z8{nro6FxQn76`=mh&|-D;E#y$wzAV)2kt;=hsN%)>hznkDD^%jf6E}zWE*9!HN;NePaMcW)1M++mksiI4IvYo9 z-OECM*!?J|Rwg>k`1j}1iHr4lPhl)~kMJ^jA{!a`8+NL`zELRxGWyJRcXn}YX^+OX z?j)r1Wm=7Q6|a3S2Z ziYmj8{m37HO^m(+$NA;HBT;iwCga^29m0*)u>KX$#Z(rB z#m#Ibh`X7kZseN}hkoILv>{`F?`Ns9QBN3!_7t+OT`W~*`@>uk=Ok+Acmr5!tLJn5 z%(&TwBr5gaKVD9K@_X9@fRwQRc7Kbc$xqtE#YX9Whxti zrgj@0%~(p5_s6330z)~voWpD}pPr)z3E4S&1@vmzCPcQBlqWZOw|bQY9z4K1o<3Y~ zX<_PXoRue9XUW`6mrh7wj+*>sDSz^^uv zDEb9sa~r(rWqhn!0$j8KlFOz|_;CB-{>==ZV;Vfg$`jX}9SS{ne@gQNU59^GlZ-=J zj)1sCTPR-&;low}#oF4p(zd5NE7J>l;ecC04O*4D+=^ub%j0&#%)Rs!hwoTuOZl$G z5hz&L(Q3bCj>c1&u{v}wK}k*u+J@!n-pA+oHhJb)Xs{YYeylh?&*yh-y2E%!w85=Q z4WTec{bC^AD`7lMbuQQ53N4dt@+%o>}uRN1QITOawdl?;E)H`1aRu` z&zSUAZMeOl;e1P5Jzq*iZLO^oz`7dFbw$8JLPZlfC%UW0%FO(HrA2>Mmj0v1FxkQiE zQxJIUbJXQ?OE0hMDjkATjoGnyZ0jyC+3}zlJ*=muPA|z|hCA>j#8cbN!bCwZ#fGyo zld%L5BBsOEt%?M$7%el44?($2Kh>kS3h&*QH9tOrgt8N{?B&{RlHkQT7JZmv(V544W+w&&=uqM8%P7G`D1hBD)-8H-6cZU0K-xJsb!L{&;y8r7*O3W^_KYGsAB0 z;6zH3;9V?&_}c>{=wX?>5NAD5g-EBz|5fXq#5IY_EJG`26-6qijCiz4{qE}Gs*Dq4 z?UVX)MY#jxe-ef*my4;W8JM5EKF1~VyiiH)D+yKCsq3D2s!kad1k;mYPUniq*LMCR zc{y(5I!?&+aM;`>tmZrX-N3U#K`!JO-u?KfuL7w%=#Q=R6#;O$#Cd`??H5XO>f?=o zB^$k8CPfVM^Bgvp`aTRQFs5pXjmK4PmPEw1ac(4a_yn<;M;E?$He=}oYOG0BRyxi$ z*;KCUiRoC2$M&M!{`_x`jR)P(&BD!=MsQx*1d3_7eavi1E0mca`rw=fEkHm9GYcMr zFXBSpu^j3wTsQWlKkH3q1CvqtmJ!?~mc0CNE$daeV2IZur#W|$ zrQc}z#^*OQ^{@`PurfDabTtV)Boir|?#V37v$U|@-7&e*lLhLuQ0+Cew4}9n9Q>tu zWH1hvl(gZgnLTK3X@=aM2}0+mTOdnp9?4ZU-vg9!7i8v18nTl&lRV4gfAOf2`VJ0! zuHgMpDsz)klrD~0u*Ks657Eyv^rb)nS7fY^9yQ^hVR=azUzwZiOG`@`7fMjaUEbvB z(}ybzQ2VY*Q1~{P2vY6!@`l=_=VTRiZ@^Xadl+}1>t%yB+PWO=g1nJKAz9@9AVAN( z;LAyx2KTj9pvUHQsgc;-Z)lbsr z4fWjAd&!>$=tkAhzf|~nKu@WB?#Zr)N*SqT>|zvR1F4H9$X5A5oc4cS#%3}+unF_B zDBhJBkxo(P-1vHtF|~AOH9NxVI{21l(44Zvxb8CL!c)zl^b8jKmzH_KVfr3rqJo&+ z!5MrTmM-H+WJ11jeqDZz*+yy@f)58%z$8LS45^d7Z5Bu7gx1UjktCCd_x)*;!24>B(5Aai zU1T60Piny@o&76fU>?gr_cPmm52$Z1fTx^iXqg7dDV(avX91Ay-QK~Fc4mpZ+V9r9 zxCZf0)upS>3#hgnBC#W+GpgTjnQ$iTC@s~0F;M89#vdkn2uUq}0$);A*PN6F+W$`K zx!Wn2VxO31o9THzb9vmK@0lGNi%cMDjkTr?0w5{OcV46)0C06^!|~5XH(?WAsgB6W zMgVPb5wvzmZR6m!3=0n^+aiL(xcr8)4r=nU_<%HVJDLoI^}pI=Z;t41QAKAyx*ZFx ziNrliscBZWW-;2S1lEvQ5_7I~?wNV%@u;XjfU;tCf;ftpvbQfr%8kn653B<7o07zb z*bi4%oG&*~@{iE#T5uNRg1)DU^c1!sbi2E$Ana(QJZKQIeLWA$vkJWX3)`B4vn~RP zOEU>i&>Z<2qwTB#$A8WImC)yf45l+>?-_d8$!Pxd5@ie>9qR@Rg$jny@$SeJUz<|aY>7BN&Uh-x@>)=lo%JjWyN5-{cOf1s9GbxNeOGW)57JfOE$ zorz~}fJegHH|!E}SB;11g&h_%#x1Pf%%y?5=axs6gYVtX2~&^C)0(Y*_hgYx3g`a` zgg+Z;n_QKRgi22NS+ry4ALAl z(g3pGX2e+U(Kk+stT4-+CJI+Ptv=N)J?lW3sxEWrA0w^vHPf?PHiFXKQQgCSl5?9G4_;hTLYy>Ho; zrHrL-@9gdE=Q#zvpXM393hKPotB&tzB_}3c^pZCui9YP3P$9&CtYdYPbr`vGzm4a9 zKl@?-vYk5Ol!6*Vw^UE3D`=qq*1~ZM2lIQ5;d?$WMx*aRDg2Z}+8*Y|)TCHe(DLAaGJzb4*S_c+iW4%(BMAxZ?( zp-)~sb|VM%$K|H|en9By{4nHxw#Y_O-6MW{l!=0d<*`Au8rxF1m+R`an{2GUC~dWk z&;5_UssC17H`x~X)N+$pk^E$In^SoCz{H@uw{zt$+mpAkGDkD}SXY&*;Ot_$7KPU4 z*V^buo@T-Hq!LpYiHVX(}OFkY^w;k^;pA)x(xAx#1eQa5A_RDqI_8l z3+vmhPp}P~(oXn6;vG&Ht(Bi-?!S_Y88VWQiq1D9A8Xp=kxX?4XIdI-Z(s&^!Wg$Vmo`CE*h6qWoyme44 za@ln`LOm( ztrL-vmIOSUetb;s-{;+)o9KFa1aV-@c-}Myn#JnoV&ZryEWowozf~5$vb12#5!Ahg zM+ni_{M4U$(^7v+&5Ap1aO|nh4$i9HCF9rV8xBPbDQvLKLA@@tRTM&Fl(rbwJ>qN{ zcQo`$Fyy;VcHVNnYwFWNrb7Sbu-ksQc?S)6dnBy311~Exc3lSWtOGU;&j0;EXb%d0 zPOj{cbu{`qZqLHXa;@Svj~}4AZXEEu$L6u<(*D9H_>QqKgtUPZi?nG#Di`}}Uo|*D z6^Bgue=%=UU-(obMgpH=H}>EE*-hf$frOjUJmW^P`T8(LRuv+NTf54RdGtEVwzOvn zF17GHjBgS?K6a3=Cb-Ylx5&MPb>}C{rHb-j(_UUz2%!$A^jgLETc!Rjtb zRll`lk08{VD|25%gAnlY4M<&L?>4$zxs;`7xk+Z^Fd*A9WS4yd$_%zfM`qS@Mv?8T z-aZ~P-mHY>|7@3UGs8bv$Lvo^QLT3$xQB|;N1gcr9KGtX6_!+nPZZEa+@XvNA9)8D zQcsdo22VUK2Hh|nNe2?h>M26$mC5763`44P{N4m{b%@1+ISSNe2Dv_Jnq| z+C-+*-)WL-;$oLlAhSC=$^y7n8@`K1bb@Hy2{}R@hPeT zVh;NPPWx~-Gx*g9Y1TA7#fAa1SXAv5ufExyxgk%=;F~@HjcnHfPJ0T@(`H zbzof5?OjMPUFf*k1;`8FFW+Kxdx8}LUKh6^OA~$$Uy2L`8O#sR&mSJV1bo5yHXY0< zr(eQngoaNwVn-5#!Z=sae(LkY@Y)ayw$uuSJC;hP;tC~?I>2qzTX(9hueABuBh}wI z{7{vr(urLel4hk8fsDln@4F@( z>rAsHg_sadP2EnB0lu5JDMzM*vb`2kHIuOabmcPzp9OwnD=W?-7;pJ5m0Qq+_o7_{ zN5f04sSMh>$R~axbwJYlF21MI=QP)wavkcz(M~~+cyPQWdC7Ci*Ta5GUbehc=wlAmXOBQ zR-~}rtPTx)i`86ertaWqE~_3^Dbw`S zR^qU~gY&}~%b2s?_GyY5x?V1|HW9c*&;3sDa8n{@{|5cfcOfwymPly)84ZLNN6RV8 z@|XKT_tVMy20i8W1EbTFRkYN zL&l<`p?9GF%T?`y_uIdpj~NTcSJ*GNDQRUL9Suhwg5nz9++WQ&+!Fzl{v{v46^lQ- z>A=*)9A1GN`HzdCyQgsTZ;O8`HKYZb?CRgkO`6oH94sdEnA3H@>V#R9UfvI|yWLJ$ zyGgDjNFuLd)gn2@CTx@vBvyNec?JL-_nVwuRD zq)rUSwW2M{(JgaLR|YVn<(K~Y(VKlPLdGH_L8w43UhaVAq<<>C+QmJm(N}aW5xu>< zV}iKS%wW_pE6?u{k#wymY8)wr z_8{XBoRva3a9LAZi;S+jT~*B1FvgXaWZ|6?1D+2RQ*VeoC^sCAB{L}%s(B>kPNTi? ztUgpjX=Cb~g=cQwG~u?)Xi8-&bx2@lp*N<8;HUR81V)FnLjN5lqrb zt2vquPLz*wyT{?TVzi(Yj*c~5&0Od1;Gs4z z3yY%y@<`7y@?~{4>R!FYcb0%i)}(3rjIkssZdTi@+MujdWWAL}W-l%9*xXQWPf_m1 z-{#D6lmGhRtL!r2#WOY=88dgP-j`dliV4)4r7x(|76|-tQR5GQ-si3Ip76dQIxk~& zT!lwVp34_rzR_kFBmZd)GOG!t^`|!1NK6u!{)4+*SvaHDxJ6d!cY8cYpybrWh*~XO zdBy?YXaL}xy|D=;hDArmi9^+0nYC#j6yP#rp?)R*TkV2Jxl0?Dx5gR%luX1g8P%8o zLb|7W@xJhtF1k0dn3Spo9gZ7q{u&Q?CS%845N<8-oMbxtjcfKFQ})dECgZ~DCjVj- zS1cv~0nR-O#D7?L4KK$sqZLKz0f@<_Te~CYb8tk&5t{nOKp5#j3qt{^vzu*MvwzkP zbDv%8wJwbKC=``S$Fmx|+qBHpEA|H+0jH9P?~oLUXH}pvrN)~s9R1m&@RWn<_dhj( z2J;(Q3KibJ!-V;gf#zBmFihN;f=;T{X%BYH^BSKS?e5Pe$!5T^&FV1l-HZhc6*n_A z;xSp&V~PBNKYYgYIPl;cAF!9cC!Wo1NCMw`4maGnw==LL&{$W4G=)w2EL&)Jr!4;7 zy<6XKcw>$&8jb;hN0UX_=W2Po6tuwQ$TC|^dm$08L83+-PU zo`6-p-d^v7%&f8UE0<=qlt*y-$esZrD_Pm}Gv0StnbY0nWC0A~Tg=pKJ!wapdk61h z5cVo2hqZ#OBVi!F;_$vy|LCJWBkQh{FD&TKvSSC%V-$O5%5bM5FhHLx;`?UWcYkptppVtMD(%UhE(9m`4*e<2sP7wR&2 zYhJ*SSFn8`G|0tp%?gGyl!VV$-|~E-1ip+o{o-|;p$3*>ykVo~XYtZPo>w(!wOF*G zhqH9RU87O1PFKRwMsO8yTo!O^5gL||=Y6z#|9^)@BE>FgY&gow`Y3hbtetLi#UALZ zJivRZm&^&x zg7WN^M^-p82EDIm;$6sAIQA2=7cZUu7IyONKOgipDi|iqdgD(SX)`2skCZ4q7e?}f zAGL-29)!|FjZ_zL#2LO~Mw{%-%dv2d{{pJQv6xUMsJb!PZw#?&$ z&4kI{z9f}Z7KytB&nvnjAd6>FVX?8fg&bHZQN!HgyPA#SES;^Q(T|P^Z&}^mElKV*E_{IH;0s|E z5unzZ<(FRHY2TO_@b3EB*5bi_d5`AnOTEFdZ&I`f2*T-O#J0uZ6SLLhnp0yWQ1TsH z#VIpr9O9&~>eCSy!uX*Z)G9-+Y?$A&6%WN#-hTe5$j@R^t?7st{JM>n>3qFBD(Wlo z9FalmxUoNAE#UEj-Q_4#mTgyiY$aCgOHw}lHHa9nin-n4oiOo07s)UCIfv&zqOQ_M*g|vG zl{6&rHJkb??p7VSDvhu_d6y^+f@FZP@`66hF}d#_bB_WX&}M zPLwOUo||nqtIUy$Jfu(YughnjU4PmG9M#M%x&%%C=8Ty(EMG<}e5lOmv#=&2m}P`njg?lJ?XW z+%Y^e=)hKCXPqj;u_U9Q{u8{`T#^o5KSouAw~O@vKgKC_$D4>n8`Rk*@>LT|axe}| zBJTp`|Ep;C&Gd_#QVDoBoFwLy7r0cC+-1fL_xq&Bto!!0gVP*x*Qd)_x>*hTJm9;XRT{o775&Inl8%_$e1MRv^K{*M~=+5kt7 zI61BeC`#z9ONgamUmZ}`DzCHk5YM_}jRzA^mwVcN#@jng@c{RK3>eybh4mFDqPtAg zEzjn(OD)$L6>79{5yODz3SjnO=CsZnompig(Djvfd#oolJ%rS_6=DBRHhV6Yhnm{b~t%y6{#8t