From f302bdeb762ddf49a809a639948ebfaadc37f418 Mon Sep 17 00:00:00 2001 From: kijeong Date: Tue, 9 Nov 2021 14:39:16 +0900 Subject: [PATCH 1/3] olevba: added PROJECTCOMPATVERSION Record on dir Stream --- oletools/olevba.py | 21 +++++++++++++++++++-- tests/olevba/test_basic.py | 18 ++++++++++++++++++ tests/test-data/olevba/sample_with_vba.ppt | Bin 0 -> 94720 bytes 3 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 tests/test-data/olevba/sample_with_vba.ppt diff --git a/oletools/olevba.py b/oletools/olevba.py index 970330ffc..c59026707 100644 --- a/oletools/olevba.py +++ b/oletools/olevba.py @@ -234,6 +234,7 @@ # 2020-09-28 PL: - added VBA_Parser.get_vba_code_all_modules (partial fix # for issue #619) # 2021-04-14 PL: - added detection of Workbook_BeforeClose (issue #518) +# 2021-11-09 KJ: - added PROJECTCOMPATVERSION Record on dir Stream __version__ = '0.60.1.dev3' @@ -1720,9 +1721,25 @@ def __init__(self, ole, vba_root, project_path, dir_path, relaxed=True): if self.syskind not in SYSKIND_NAME: log.error("invalid PROJECTSYSKIND_SysKind {0:04X}".format(self.syskind)) - # PROJECTLCID Record + # PROJECTLCID Record or PROJECTCOMPATVERSION Record + project_id = struct.unpack("bOSpiv+xt7;b^XtK&e_BDThGj_nOWL2%iKnG<105Jdwz!d;e05Sk_fU5u$0F(gN0H^?{ z0cZed0q6ke0T=)n0j>iu0Wbrw0I&kE0k8vb0B{0u0dNEG0Pq6v0q_Id01yBW1P}rc z1`q)d1rP(c2_Oz20U!w=1t1L|10V|^2Otli0H6q<1fUF{0&ojJ6+jI@9Y6y>6F>_< z8{js;9RO(ELU9lH?*r%p=mF>h7yuXo7y%dqm;jgpm;smrSO8c8SOHiA*Z|l9*a6rB zH~=^TH~}~VxB$2UJOFS5a0l=J@C5Jz@CNV!@CEP#Py;2|ft-{;a$E50c##9#_?wOp z^cW!8g@XZku%rBqQ&jqJLcTx>A+H%%el5oSzS-AL1EVlH&`8+tcW!~FKLAoYg4(nL z(n8;X610RJs1X++t;t2quciFn&j5jifffY^0DXzy-~ICtGKkJB_fy~HlQV- zvde+znS!S~Uc@+qH?jjU|K35L4-amCuYte!{JS8%SK;?E5&j_SfA4+x!SjDS`|rvR zeR4Cjv4DgA{HQ;u9MJI()%idA?5}12}25^*?4%F4j0+vx{^4;I%^d(~^5YNAi zYFJck7-U^miEn|t-r^=f@AOU`J5CywA$-Xi`Syl@KVgl^`{3$0<;9ahibOAlF8h10 z)KTc*;9LR;^1_P5leE7vK3B(GK=pZ_U-(#4et-r)ss2{dI)vlMTU?}ZP{fA>%d>`c zTS=2RHT=}`ID?P_mqdrsVe%?_yFk*OnZnJKPY#x)PIGuj+T6{tyCu&44U~>kgU#6E zJVi;eFrNu4w+HUF-cwnpOQdCr+V3+*v2M7TQLeRq%5(X-QvT6x4Q=NzeNr1oPL>Zs@S?qOGVPrlSyj<0mdV|TjW zv|T6cRn4pN5nuK%(m>$pcu?^5A&Q-dk7(LVYpCKHGcS{VIQ)u=r+0XxH|J};ZpWE4O1G9OpNFke z365h8vGuDKt^D42=~SEN7^AY*H~i8nU991Yhi1iZ4HtXKeIVd3D6}um`1p~zh=Vrj z{yJMC{N(kKfI)wVjra{o<+)_f*HH*NQkL+ZW_Jwn1X0VaXvbOLDODKypy$lf$p60L;>R)r7JojRR zuRlLn6a9SiI?p$uQ_<#3D>`4GV$aXvAh#6Y;PHWufNIfekgVKKyd%JO2ms{-#*R*G z#&!>E9Zg(W-E6ESV{R(6iD3tC1e_a?w4_W`;tz~jFp8_f$K@IdDOY@;d76e%H^F^+ zzK)`cSh-r80JI0y@6Jq9PMd>#?nq6Vi1_T!}P1X?`ca;q7h1o39<{ z$G2~_>(GV;rD8uNKEAhli^rN#@m^niZQxFl;lsv}jt`72HhE@uTwk!fiobg0%VF8< zmpXo(pmMKc!vjZVDG}Y}wp{iPeP6F`9a-KJ^?NAPaqe($!>sP;<%yIqY0!=Qwh!(b zcPnzR$Ej(mjh`~#WP=*b?^OT;%L3@mk4o4)cvyD|?#%&h3ME3ncXuW1Y@JPPo%J-_ z?MRjyDTL`%&@lO^-|5)T zjEq35LmR`%+`!%hJo3*Td%5v`=H3Bz;8IiGQb2$j1_(U(+XKJ*7a{Q2O=wSej)e`| zkNglD3xcx=<%JMP8yYkoYFm(i3|J71O(=hXK+>_Gb_NOvBm)b2|2jY>7L+YQL*LzZ zA0ptK;o;$D5XiTST;J~%VqpT$MadTtxbP^TxLhoB5ZVM7g6W6dgu_O_g1~P+0WX0I zLA`iK1n5ISMI}JcHlbY37g)ay7(YmJ^s#;Dg(YkPv51f+7#P57&%qT1A_^)O8RFMQ z2<|iiKP&{lez6=f%Z@c;<` zi2#oPk^qtc9s@i9cnXjLkP46n@C+awAOj#1APXQH;5k4JKrTQYKt2GJrWFFb04M?| z1}Fh|2~Y~~4^R2OkCXf((f@xnfCX8BYX>F=2J#t>0gNZ;uiv&3%$z@8T^-q#)1qZLB~D>QjH}Et^=>dIw>KaiU?j^ME||Isen2M zVO)?+43dpy3qoMVdnyWksVHGC=IoI3?{jw$1)SJLW@x>gpKn~mKriR#xX>R^W6&z4 zgaKKh4*11jzvqDZ_2Kk^jR6k${owteuL>+D8a#Anj|Gg|cc~FKDM1(>ST<;46aeTW zp#^?_*YDQV2v|895a$n_pCSiBZzDIsV1regW?g1pFLkgHpu!6DF; z(0kCh17O-IAe&fZARYqQfx`#a3(+pZ7Z*S16${djWDGJ#nUIzG9&|!YhRkTWw+Ca-g3P376&=LNGt59aa!!l%C?hD_`{^$DtP7Qd) z_A0lrV+U=>)(0*!JtXI+40^iT+=mm(fK|$$(q4GJFs0QyG5=gjJm0>2q>gLHLTfef zfnm%OYxJmktylQOifh)yR}RbEOTIp*4C(iefFZqct=q-Zz3ihRiX6U6hII71&$?Ee z)E<-scp>GVjrN;O-UTY_SFvX_7OdX2G1N!Dx3zX{Vwifr)QR~S=Hjtz{6HK&R%hFd z7jd!i6^J#lU%Xd*ay0VbH4}R%!u=GpapKc=GsJx5n4d! zxIyDMV_~0pdx|(&s%B}gBewA?E5r%Ln$hK67)j$wj4NhxEs{8ejt$pKjAPXq_5)+6 zRIN4oxsJ0FRS&og-=)&0q>cpR-01F?i#ZA>@4o+R!{jkn#y$2oIjY#Ky@Zm&heIdn z>mObFogI&O;uk3h;|t7dY998}z$Uf^r5 z_UD?X*dt~;If;ka$YjhIh3~j*$U3@%^pbfJNG9>@bW^;@Abg1x!D0@ z_(dyR&Um>}e`X~EO#4z5|5$^812m)>q};n8;}FOfC@TSN@(nI50Ls!f;GnB17gPfl z3FQa9fu@1d7JbMj5+(QrvkY*BK$e%5Ad(uE5J|^&$htQN1i`2U@<_!I+{wlg0autm z;ky@mIMB@hmhUn{Z-Q6A2Bo+H?|0S=_dC|C11SZs5c^-0a=|E}g3v-BW9OwXl)w)Q z-B|<-xgS;xhyzw+E<&3Z+!-+Six4)#clJ#AUvhRZ*|~7gaxSugI@$Oh1+M4kP{Man zjo@jN7taP^;1|1i@^`=fpK$j7Ju`({KvuQyF9m@Cd=vKK)j=VQ8Cn2v_8<=0J3w{(=AiBJBL%coE-Dq=gSN>q ze=$*5&^P@4q!j#LO2Pf56zpG0!ThBZOi(U0yb%}+zvr@X8@=1d;9ebgDd@87pA2KK z*ls9?3Hgn~q&bQq(|-0}>~LhjVt1qq59V{9EcEuIvxvK{!5?LMdUlwyH!WD!rpOzj zRieRyfQaWw+M(rRt6S*Fm@l@{^2V=Nh_c(|f%mXACW_pqYlfC`&U2*VZp9UU4MpM_ zuJ*M|`=>H#&0Z~GM^z;omEoEC44O~ux=P$zVX8{PmW7jJ~^MK_IXt14S zpcZDq-&FQAn#%a(Dr~b)$)Cx^?=FKn-QLf;s_C7HqK>&`4i};5P^7QONcP-Vcrfzb zH!)Vhh8V6~=6OoEFM^mf)h4eKwo+hv0~iIeDP4169lS#)f&Dt3wiNI=(V& zN@Oa7DRYN^JS^Vf#O<)cuH&1$ukM}LK)dE2#SFok3FZWSu?39$YaqqN3c0m~v5As_ zld}nQx%_8<18UUPp6J=7uwysR(60+pHYqduiu+~6TCOK1YpM^qQZ&QRmtG09&a>LD z>?@C{QYo)+xbpE)K^!lmA`RBHvBuPm2M@lnR_uhv>l_3{WErA3_K_LmBx&7g;YB&} zsw0-_!o{sX|L`ylemzWVd8gXW)P-L+4MQU*0m!@mY=SJN7lJmML& zRE7^5c#)pZtv$g+L+cT`LlXU2*kzTrntjSIjiH>gyz$M86g!lswT&BoQ#H>~)b`u7 z*8*nzdE#=ojY41EFeM#3bL>$o=y+x9s-E{neCRXhqY+_54s|5mu4jGL-#(87p_TiH zxQJpTr3?)3nvdhK7RXWEbsX6y|md&lRC3 zIn~D9_mxKY5n|l5eMnRbOy?edGJ}KXgDY_3jYXxd8z>z&H!`a6u{;&f)g1rIhflkt zjj~L>DZ@iBdv>1eVqMWdy|YLXH>kk4Lvs(dg~HzD+iH z6SEjUWwXE2e?OqZp1PNV2!8+N6inxfb=t{+YP{W@;}}GV9`btGJL`HiaI20;ykG2* zc#pCLS5|g3c6qu2&9feDz-)IL;ip3!(sGnjYg&sqQ5Gh){A*T^j0l9h!?qK|OQKxo zx(LhyC+)6<7L`0xgWI0puAK<2FX1O$NPu(fdlDodgAsn3FXPS@%k&=6y6q5mt{>IQj(E-W1u z1RZ{#3QD$MH@|{kYzXqj<`R^NA%Zm)EC}4D0Xg&+ev<*jflZ{}HpG5D9_oYrZBq(r z$Djp6(=UMEADdOMApXZ@l|1nN*sRiz`0LFo=$03s8KD#fDrY@3`EOg3(0B-t(;8fV$ob<5-zAm& zP1f7PG&Rnkex3V^Ut>USRZ>F2>c4eULWo---53!5mfweI%6=bSC};a!3TVv%vvhI% z4y?ZdAI!xS_Tmb6vCs>xsP8q(2YkP;Q4B!oe$*)Zzv(@j|E=DWQ922v`B|%6;F-{k zP9*Sh1#Mvc_!8mzPu}R1o7NaE9-5|gERa<|^5XsM4&`{;Sm=R3`I_`a6i@vWG!_RKy^WIYfa@&b(Gk6h&PrvERR?0Ia9 zWg9zs$VOm8;6Q`JM+uT_WxHTq1*AIEyK;&~J-6v>W*T$ZZ%f+=ejz#%+1l8zW-oYB z?iP(WqJ;J^%Vc?8|I@11ZEwH$fPvZeIP^(5{h5ZQb!BdY0vXODnnJZKVqyikbe#xt z#tiOMh7qN{8~O!CSDnQ@Tl{x(ZK?&%O~tD93$wXmV{GBRc&QAZgp$|yGEXLVIQCB- zOgCm(c8 zY~k`jg*C0-=m}ozMx+%%?0UjzmL5@3gGI{eX1QBN21R^W?78``3?Jglek|i-xV8IH zyDPI=HzG@AICrCe_Li=lBf~>$Oevh^SlQm#ovmZj5E0+nmjn}XtJkxgo(X+*pnJtG zm1F04cH}W~WB#3cKLSIx$$PB9t-J)gt7&{stcY1hSgjlz_Zz!w@6(TzBOZ)#t7R8+ zS0Tozdw#Gfa#r))B+l2G@_EVkW#pEHNK5gq?KrbFad^*EYk6VUp&u6pPsqtmXS(Rg z_OsKi)nlxt)AwgbpOKQbZC6Q?VGN&;mN~Fce&h2)MYG#Vq%bh}SYPUvN&~-w`;?kJ zsz$uuwD%+0G6qaO*5tS4v2&aau1MomL%|NJshjU}bFjq&c%NL#?vxfrw}0;gZ<_ zR^B5TJOk?j%It2_6kM2li?sL5cE4;p8^z$R5-%uT$0kWbQNY5|ZTdJ`Fbt0ssN^Co z^Zs+?aJd)FbyL1agnm`xPafWwe7c&%+lp%cE;C!cs_NryBH{}$so z(qAM?LM)9Wl3@!|$G<;-l#*vdBPJ}x!dQzx@XI@{qXN?ol*zd&a4lPpQ`FXZMPO* zY^0))8tLl$AP)|vIkva?IFkmJciz$ouhu6r5#1ck4^p1my}ig4LpCS6Br-CzvlIFz z@=WIKJI1(;7Smmu!O!|DtkwckQ!JB@U3xa--gM*9ay_I(B-`j_=oCV_k>di#moS$@ z<6YxOg;#{wy1?W5?7{5JQdUiKa$`R3THNOQ>vxv&auTm%>nNtmO3F%I8Tye=QYAC z*@7v%*5fgd7{t5M`jR8uT0HEnI~qmhGMmYRC5l{8E27#Ew3cuJt=7K!V33hZKA}P9 z#^SV`UXC(EL9I%(CU;nXzM?NA=Nb;m1T%x_~Y^(-=mluf42 zCt_fChLkxFK6yxDvlQxA--o`F!&&m8T#cfKfvF>PpzPx}d;dkI`)q3n*7q>xo})@h zg{U5H7IC4j48^#sM>`byUkM_hH8MDnX&JpXiymqSHzbq_FFI{Xq=ZA~(`aJv!tZQn<{m?pd@emmuDZu{f*W}6S@FT8^22EW~l;=QNiy$J@=AFYqK$+_+*7+(MO%%ZA78#{jR zOz>%_J;KaAfq}AN6N#WqWCp)ZWoATo32^vU4jO*&sbDKp=?q(O@zU z$*$1^PN%I|S_^jei|4Lx5A8p^4W)S^ABfQzdPUHqxIkz@COd;cZ9MksML8?s7*ZQ6~HT%L4y? zUUr$Rfn>k9zcDYn%wK-y{)P4ELhZVmwbZG2P zhW_skDDwQm+M)BuA9Fqp;QcWV`V{lmb3W+I;rpDgsMV|5xpVSjHo`yhD}Uz!X`uX_ z`hvfc|HI$^;qU)z{2fm_UA7vGk~(mV>d%PEnpTS~DIazN(TXVG?+;yVic^{EQH}ZJ z15rctZ%~M>I~Et$EF>)y#z(*kBYrMRz8WvOl8NlNlBuU5c-}ALXmaBQzErA&Dn7f` zf+PRVQp1xw6r$5Z0Y$HQAH|bIQAj4*KY5WApG@NI!|_@8dHZcTG`hqEk|{?CiWrge zwHi4k3Hv)wE4x<)KhmuqC^atdaA9e*(Y}|@u`(?iPCk`(YRfSp^tT)k4a+iUGJW)% zx+Z?ro$G_`qx534ry5eyp^36u)C;{mdN1|P9d?e^_xfIT?WGWH_#CF498SDQ;j`{7 z9Y#hnzFg0qsZzXK!dO0L?A$+vsr|_`{l(Ue3TO2%M~(V2oy?jha@bq5?9m}OL6ZUP zZScNvZOv+pWi+8JEd!shPt@bv=IkH0BRy;L5u0NswOLay`5N_*Uxs8@sJj12jnN+!M)^c(m34cHpm88KP3rDW5zHZ)h;DVeQ}H_apI1j(Ldz~PSE4`3ZB z85Pw*-GKi*q^KgCemnITLHuY&o{$*Ze>EBr)|kke0|`NwFYgh?NUG9exbEwHnw)so zwU?zM*BPQ1sSi38=-37(E3}sEDP(aSrx%{J)1@zx>v62q(yo=fL1BAPH3DyI=Wero z`njgk*Jw12RVUxRY>VZ!`LcF(56WQ8RI0(G2VM_hriH73%jrBFwt|A{H;cnlH=%I4 zm=HO(E0GD)`r8YY4>*-W8nPWYZ;*+Ghv-RfVdWp&-qZYa1+M3H|1Fc@5zXSpf&j`- zOxaAs$46u)Y->Xsuh)drLs6D{;+O+0&&EwPU`vm+RxE@48HOicGTd=kZ)7(3#QyHX z`_k@HrO%BxS+#R|hwA|(tk(~6{72M!E7fxJQa(OIegEmYb3iO+okj@>EcI+}+FR*5 zuXxOs1!jfF(lqpS4Oh-rtRB_-Qp<-dcQ8-%hRW%!`P|2mkWzyKC%x=rQ%dwQA1d@? z1fSnsN~nq?$2ouz&zlQBbKrKm^X{>!?ey8|-Im$Ym)hsLSTEHAm(QBun3cGWz>d!! zY0_<#dolktO|oi*(j=s_P)>=1T{1&tvg1Xs0_W6uvi6WP6LBDa{e7Q%#nmftHxLF` zo=PjkMu-C2_`MGPQ)tp+JB4TlKcF?!YfDX#`T8MFL$I__O^ zb0NUGAAt_zJkj8TFLUh}CjV6%RC?YlasF!6w#>va`6r!l?(cfA!>y{Yx{V5~$~o!Y zwj(GIc+fW`>d3|5N%%^AwEGy*{cevS=cz~Aen(cZ0v1}M5eLe-WiXLHfA$CVF+}5; z?$9+6;gnq>AkiOff`Zdc#S!Qo0O->0B|V~e>2p7Z+cdqo_)_p#52G?VEnI8EP0b`+ zQ##H(@^rr}akDdSO|X7ZS~HxE4MBYu41OR zvi7+#^T@Md2T}Lx(tOLz)q8t~d$oh=dvU^b^hT^~xx=s;S&V7Xvtev2w@^ROt&K?! zlf+VeR(X@)?xb;_@JRH*;lIq{e~L-C+|@t}{O10SNx0m2Kk|bA+5ouxrKY?*b0)sf z>ezqt=os{5JU=M^?;mtuWd)W2G7bJcK(imYBd}8N$QYMZ^5c+9Ox;E z>wzBVkvfn)30!26Pc4TY=n3eI?#%LP?s`H)*gaOBr+Iv!IH)0>Pf2LaJkE9SOmN<@ zfdc7O+vC(c`Ip<`Of;*cGWT<4_*BM=wZi?c5DOXPU_IWgZLDYD3-yx=f2x+_xnysq zSS}nL>qrs%eDH`Lwui@+&hOL@v)4s+l6W;dj(@&eVssI%s+9b;@Ylt|$24=Xm9?V0 z%0==L$bl8j@k49*htl1I;;e69)9{Zw>$v=^`LJLQ&heEmJq6}%7ceDC^#8u{aB%^AsCZU*(m z3pCRo4)ydwcbGyqg24`xx9VUUF|8|GPOJo5wl`#!!PlIMbb@qsLZuTCwGKJx`Nlzk z@L5U3;cVhECE?RT#I`vJ(H`?zSK%h#fbQVud9=uP-RwiMJtto2)!!P(7V707&5^BQ ze}sz_Hm*{yRw8aZ(2YGPFEzn!NaLFq=b$%A@%S0ZCtk%5dxUDEeEKCZ`Q7IgZS3!! zskHdMWL}hlx8+Mzv{*3A%x9ZdZ-~t|DIB`m|ElJ2ahz_`PliiGjdq?a|Udee(Jk2L?IEZG}o>)B3%rO$4}-IY;zGjd%{s@~MY zvBAZ!rYJ{VF%4haV4l)_O=Bq>A)~$W;ec^YYL$r&6_)?cU;dd9n`tcII$){hV(<5t z*ZwZT_k&1xrXomXaD7F)&e`A96}=?!W=;weX()SOW7Li5zV=9mYkmC*;Z*Vc2z_Ks zfB5LYz)1%-|N6yiLGZY;T|K89h$(_Ir&!ukTvuEaSUewagrd|1nB?xg_@bw+sr{(d z&gUC<<}}GtKxyT?ww;C-R-QU9wZ+gDg_3km(gsTSAW0VU8*<;^;PcsHtTSgk@-AZf zF}OnwvW#d7h1dKH$#3vO;%Zt5`GYr>BI#vYnPT2@MZdpkC*Jc)K1WpPB0v#L=Kd$?tclR@pUew z*T86uVb=okRM{Yhgy^nW#R!&T5zO1GHybQxF;4f$-%s80X0AsxISM2{F&{!= z(s9FhyE%&~vi8ao?rsyJ$+r&7#yg)e19Efp0uAK{Kae}qS`Qts4im=S$PQI@6GWHp z)hY1`3@~TNQc&VBE0`p*Lh)$*h73WKjiV``*G3bPQAeI1ojKhTo$*>aJzloc^F8I8 zxto!QLR>O*JzJjq?1f53dZo+&jC4rl9D-u|``Eepa7KEx@vRL%tr@@ill5w%K415( zlTo5{-?O>Hm}#7F!zTsh3z(``o;dPq3-9sjKK`aH>b3Xfz_(FO*!oozqwd*ho_5p8 z?ly(*;pl;$;F$9b0ghR`c>UR_w&iJwq-I!huT7Mu)OH%__QaLkI59@G3jSRz6YI>4 zVr(hQdsq{$Uhl3A*Z5T@t1!3DKW3wKFs~=2C)|9@@zH3~BDl_ywe4Mk$(7gi%L;f0 z*qL0TlirCsx>s3=VvWKTOhh{fdy(*SaHaU)464tRsYjB(I1a+@Dd{wR`$XUAv$uHt zRVw8K#jbDyCDKfZct1TY)__lTJ-nSU4Og>EG_f|HLay7*VO+)I}GZC+EYlW1+{=u)O(XLrM#F;@EbD=RG2OqDV0xhrJ7?E6=}7xep$(0Z0g2Ok)A zT@M{2xcwlO{KXgHH?W?yug7~6WF&826YRj5Xj^uB^~g<&K?!>%@9?VIROR7jP@Ac9 z(T+&kv!~6T@K43Ui1JjwqV*fVALtfi85$F?@3Bs9)y^fIvzB-2>xq<^-_zF%KyR!> zr*TzZimG}-X{l6-@)(6`I*w^7AZ+n0D(rfRj`ionl!+AAdBm0IqFnlGpN9o9HqSr6 z+<@Jl+7+>VqcvA+JX*n4MrOMwaBM$8uAII_;(kt=3Zs*Y#XgicwdOK4bMJufjH0n= zygL15-Ba&|P8aQYiE4+b;RPg?jocUG+?@UM`E4<4{W26Vw4N${OF@HW_f)-TcCW?y z&G1&>pkKe?eG(pl*CK@;Q~0h0o{)7;w#O~CJ0?7`lS8LjPIXvYo+|D|bWpWEEN1L( zsd{zm2NTD4rsFMUuL?15RJ^?&I~l3nYDk7zY#d_C%@^t(?9t0R7+PWlE5FZ46WMKz z>w*-%xUXI)&I>d8P z-SC8uf1eliG5@~Z!Id1>2EpqHfx0h-zVdnG+{~UKi$pvv9lk2O)4+v+S-a=cPh2G* zW!a>MdWAr$X_%EKP^XxbyRO)v-#e+Aqja0ud!Y)lW2swx1}ya-2?)kOY&!I_7*aq_ z=r0kF@8^0htokoB&7$UoaQhuyn-z7`H{oZ7Mq&2XfZWHQgH3n9W$Bvlv@(HQ^4>b<`O8B#5v=*qcb8mLl^~)Z(cxQm4)n0FC8Vs>Lhan_M zx1OF?obq1@H)Eq9ynm*8(`h^yfg!8o-6!glLPhwucWZ0gXMkYeMgRSL=rSz_$$oKv zvTkzupyp+s`ZG5>sLx-{MP1H#nfLw7NCF7)ABfa1)qlC9%Ovb)Nh5z&(gh{ET*l>2 z@Ux7kV4vjIxA`x+#E*Fw0yq_VA4vZQO5B0Nf)@ZGAyIH9ozfMYRJX9R6{g}~Wv8Mv zu{E+Ywy-r5rqa}qX5puzbaFPZH8!xevo#T>ayN0J5*5Kf6*3SovUXH5u%`qC*g6Rq z2veCmJKGDeu{jw5vTWeQYG-d^3+|cPIocRFgP@}so3W$815mJyH5(^8J1?7!frTv< zrJ)&zFqO442Nk8W8}J!h0iU56Cp3-|8V7vFR={UqWCZ@{4M_2u=SK{<|2^hkX}EsG zaQ#Tb{Ue6^M-0!87@i+7ygy=isVL2@Eo`lTM9?29N>e*)+3yiQd{k^ArI4%eG+^cP z_ltZ=(K{#5|J?Imej?JN+|G^;ol#08vRDop_+wiNqFrTzXAZ$C#jTF&Qg9G>dM0dP z77M{BViqmwdzG@@a;K_OlI~lQon$YG2SMeQM9<6vm0=dM#1^a47NZ_Bn#Ofjwx?5M zako`HEe{_%)hEOcg<;ADg*7@K#gZ+==iZdQMZum?U$RPC5YV^c^eCCU-s);;Xt(LU z8^dCDLQoQaohT-2QIbUD2t(JKf=SQQ2(>iiEQV2%D@xB_7zXxK1m*1TK|gbSDJMI%kMDF1NC zZ}66LpEJWpU&Zlmk|0SFNk8-BIcxm(iUP68rP!473h&W7N-{6g@m}v{i*K7_+_&HF zODrSylt)!uurs<=NVS19KIFJn4Lt$!M=^zluIX%nQQrYn{WXvRx-xR{U5KKAyPb>k z?*bQ!pi;9}Wr7{QN#*0Y{voCXo=AB<%f|x)^nM-J1Keb3n&?HhJDx^5^w;`D_!Z|M zxCw>V=#(VFB(RPnl6HN^DiZKv(xl^D9Sn~fW;{0zJgck}rr5<$2+AnR1WMj(v1h%D z5=yrj+VWWKj*L=eM%j_Y=FsUBzA~TFF(t_JwcWp3(PO|W91{2jvtT|tagrl)Y`s6W zy#gl>eg9(|a(Ga|7`xETX^1N^v1v}Zeo(tv%_b4wR?J76nVcA^0~gsR?{30lgaw_< zNB7O+M$N!SpcUvtPO42xsYL);bF(YYU4*&wT*_mEV~e*#^oT^1Sbj_+e1 zVX^Unn@6YcIeF>*E2p8>X6zqHEI&N1hR=B$POE}ox6PA@qZQBN@1=5$P9yraEv zg^%sX+aoqDEqmZAA*ZHD|6UGvHLi-Pvy|Y9ulakmLq_gO>l!KNY?XL>hk>URLucpl z*aBz>a_l0e)d{-+U&;!{4VtiBcTGfvuRN!xY@XQJorpmZw|Zs3kT4*mJg(=NuIf>h zMvkRg)sT)+Ws5D%*XC^S>H1@V$Vch^1^Me(xtLrJBG~H!i_Uk_<4V#cyvcS(AwI*T zSt^>8&+r9vdW`ZD?m?M0o3Ae*@{$6B`a`-w}I%0BIs*(ha96x8Tra`rY){z z-UAoy=wx%+Ym9e~lhlY5#YG(%7GlLvbLoNyu^l%voAT?AelJxQZ#wpzGu)x^0i%&_*&~NfK`rUzxTRzVGH2#~TzHgraO!Bg3OxJky~5sL|9Q zaJN1BreDh|70Vi<$X#I-B=ReG4Gc7krK5z`=@4@*d(a5n;l?<2l9H3YdUAyGvz`nq zok-P@BkYzTyBfY#!pvfzM%*4vll_9LG!3tGy%46u{X8xHvz$I!>tihUTiK>BQCHcN*yR9J4t?+TK z2lMT!K2@8!L9(5|O?gj@EP+>w2bsv8NrzV7YNh75Y@X(J=BvYR(~0=CL5{c#C%o=5 z3;BlQ805|_C9+xb+HlXMcnDk>v)u2yb+haJ^tx$hQ~$y|KPkD!O)5A7$5M82c-fM7 z@IFq(XT@W0HOiPy1AWrTO_qtw%bOySY()Cqa%8LH2Ob8*-NM=Rnw})q!9L0^Y7zSQ z@h;pg26u4aw0Kos!T?)gtn!*&-pQ_HX2G{{ho*kt?L~HBlH9zE4-*kU*^}(qOZjIi zb_}FdU|@=5?|Q{Xbuf^UnYK-l208Ggu%X|(<`fG4k!iZZ$20q{><6|uroNB&e9!m> z_vYu6m3-`4UpCm>-{IN|=-O-N2tIgoYp;t%&Q0}`+wBhucoC|NxAy+sk%-HR@Tbm& z`u;>MUY;mj)(t-k_zP`+d9?k^_`js>kuJ1-EYSA7e>e+yS;#*T>mO|ozRZK}+WkMH z?OhS=YM+8m^91bk|1E7_bbG>*RED^bZI?WxfhD@~MRxF_exA$SLOMFftNN8sUsYZ0 zWv!r=+SioFLuO>b*Xfc{Q$t2!#1}{5P83q5X_9EVQRKS#JbaG0&BJvm-EK+L=iG92 z+xlI1VmGt0IKHLVNn*YjB-z!brQQcG~FJBKFWN~=P$hUC_~3atAm^H*#z6@ zc)Fx2S$SWAJ*TPo9qev?%^F|chaZ?_6h?0<(Dp!#Twm(Sk>~aEMzsY#k%@eqYS?;E zmFYgVEJ3wGj2Gd1etYt@3SrYs+RX8z`m^Q5lWr#JgdC)J4i=VNy|OpS#}p{zPNNQMLl1%LSH?rH0b z4`fPA#akb6%J#L(=H7LWOBu!96XBBXwX5Zps;e5eq_)j;Zx|3yExwXdbq6g#r-%9@ zw@-zR3$Do{7RQgO6;sA;MM?tAzHZSE?Gq{0kO&jZ3SUOwI8hYzdh7il^IAlS1i#>C zk5{nXjD87kNe$FL`p>!P3|K?xWtE1PU6Yvl|?nokJ!(BvrbVFhvIOQd?G zoFuzm54S9!CL?hrybF{&H@-0$NENb2btUWNSR6+%j@tEj^p~IVr!4V&Fq3>;iaM^7 ztq(Z7Ycb|g45GfyWr`XqXmIBSKKU-^{b2J>LLBtW7ZDJ;kYf!sB^{Xr2O;Igh~mKM zo6-mkasGQ*?#i{##9j~DWJku>KZx7y?V^@Z{6hDE(Cp#WW|Z8_@q!n$i(4qiZ|gD5 zJKTy=l!GE=_f6s@J&H6xiHk~=6FJ!ulyTi@ozHy6{jA@HA+Vu%X6T(G#yyQBL)CWi zM-!%lc<*WPFy=ex3gxE{t(kdi94jUInAt6fTG!r*gU^eI8%nG8V4hL5zu&A}7g5)N4*2*c7ns^S9~CA)^Nsy6t< z)<$GE7A?cBVT&Y5W1NrSC7+V$v%ozIls+Z+c88^PgQF ze8{I(!aECT6#e!hlYz7cEA&m<#Mg=0-Rk2VnV99i{&nAT!?Ojp`=!&zECxE3$1M?= zXCl0`VLf&h9yXS?;S})r3Hcq5Qy>=d>EP3x|-rW2Bj$-mIDu(*26#=T8@)ZrE+9-x87(g zpAb=`uM9;bdma^pvy>wXCq-{ho=;#1ZQq%+F~U3TgqrLbcPv(Gn=_~$DQj$^p+zeOsQoAVro25pTJ>$B&xD2Zw*j*&Z8W+i`di9L9^*f7>^!?aaKSXXCT>7&G7}am7NSejYgs7d? zHzzH}N{0yp4XYH}*ljS%`d4~A?o+*GMOzxm2|U2{?GpEZZ^|HxZqS8I*^{*o zxgng|)V*J&%tn-A<97`gm&JYnntr!*|8X3#PyA*UV_9&)|Gw z#-o(8wD4kLE|he4G)4Q(#9eN0pNHsGsIqXh6CtgLB5Mjc-Y!a{wMJjmhLVi#N*k#T z<=T=m58l)0DeKJ@^V^|Pt@&W+S-{Vr>i#wn;R#Cc6py^)aMW=jY4n(j{?#sgNXQau zk!Htrh<-7_m7T&v>Qo`Vxz-jQj^VB#G#+Yn?d7u^&TfIiO5{6*0#xXC2og2QS+eE5&=wsE66G6{ zY&kS|8iPaXHEe0qZ9h&%Sq7bJB@kp9@fXor->lK7q0Kbl$6hW*PA;sYs$}ue7&i=7 zU=hRRtooA0+-_f>!q95kX6k7bL2x#c(tT?ACWdJa5k|sw`BP{K`!RlA%uzjS8*N1V zn)exFuoXd%qu={$krMYm2>AZTtr%ZccmG3k8+P$UsXZ{a;XsG}V{ZR3w|`-7;VS4; zfZBn$fK}taWo{$Y6re|%r>Gr}dOW`*A&9Fcuzs`g)3UtL{E1&F$hUkdcG3^7bQXDS z+@7wT{BaEmL4Jg7)>g{Fvt@VAG#>eQ9ezEMw83t3#qj>gg-5!1y9O@aj>_R!8BVd% z5s6i;AMUt%alZ;rK4hsh#Y6TmPZyK#!M1LFyqt6ElS~I{R6{F20!)l;uOm|5N->Qf zc}(Bq0QnEP8<+zrS@|_J++Nv1n0N8$Y2Z_5k{|5_rUqJ;k(5}$S zQ}qrbE1HLNAF3@$28w@L-3j(;YVc|BZI7;IqL=I(*o&%AsIynK*JC3q*nXcuq&C9m zp(AAZ+@R&Gdo&P_Mrl@qHyD1#pPTWG%d06Osn{?&>_&t`%*917tmI^E&oS#72>rJP z{MBoON%!~pUpqh0U*=f~gij_9stb#KvuDe-NuIMq?326(Nb!Fb|G(TJ{)Y;w5NKQo zL?0+5rhm4u{yFaO*T)^gkiyr$0fhwZIDbzesh8Q}b6~H>eM9OwHQ7+3G@i13E|&4B zOX}V>OyKB)x`(4x)@I}Du^D2>*K&};VLvBoB;ub8+&{Z!v|)=&DRpIn%V$SuWBl1y zo<}sVO2J|1oP;zET5*T8WXnf`3G+nRd5Qd3*O3Yy$yzXxP4!$AeR^fdSR_y@-93Qp zEr+bdY=eQ^oZGeQ_JSXggFO{&m^O(&YR2Dn3!QwV=-N3?FNctm<=x;d+n~#;!1~O} zM+;?95SNL@ZEc1i#{n+I9XX|}^_o)ASsm@n6^&H|wm0{>lj4zI@zBw8OYC`FbIQtS zZQt*#?p=IidP-}{?_?c}jIG&JX=)H{-A*wgla%P5zp-jQXt!HRd_8EE>M+lXhaJW$ zsp@TRb3f|fb9}oZ3~E9cyeRs5h3yGuwxt7ocL#ec0TRq+Ok2!1J-lgI=ZkBYjsm1z z3({Jl2t{cYK3~EH8Ms$AcDLF*^wF~5ni#vt=RNOLlVFf+Vk$-19-8Vc+uS-MTz(8s zm!|hk>){IWJ_dTXgV;H3&;##6nU~YIU zx#Y%M78-kWU*?Y5rPgciOp#jfDJ-De-;i$rnC(2kEwnHgP|a-S`kdc2eeiu?|KOkq z`djl%EYoX&Won$V2I=`pO>OUQ48B?$Gl)ksLT~CC9Dd!jv+-=^#>o4$n|&tU^pUlV z+Q|zOn&CH|tykAhtKP5m-P}uJEMr*Gji_r}9?HqYlY4NbT4VyHsLN)3JJXkpt9g?u zVl+pY3`r{ocbq)0Gke14)Bo4rS3qU8v~53hC@lymE!__&v`ULgr;-x?Z1DJce9w1|udZ*c_xso0tZVPtGkfZ~=bn3JZ=MQg`V%w1IkNqdx3?(M!*Q>SAS%B$;Z@5_!b zbPda!3eS(MEnpCQx@C84S7o)8p-4hP*Qq zb)>k2f-E6_Y z7FKLzSG%)y{Y&mqM!z-Zas{;BHEq>3X9XFY8pn@QNh~1ktx>zbBgi9{gU#_y=z=-Zo0Iyr29X=)FSdvkI`!x$dxbPwQClWESk4fT3$?tdG=}81iU)y{o#g~;Mwr#xxq`PN7JQI z2Zr!kM1vE!SSuXKS=H?;t(eY!5bDmMWLDH{PQf>??U1`rea2cATlB(9hkmm(ufU0Y zezj?zm6&tbv*UBUBRow6p2#%ElUP17FZvZ2g}xIoZhGgr*l}rvGnAOGE+eUKoTM(S z8v{ddCluq0`$MboBI?gyIIl8$;du+~`CR4jA$`|qG-(UW;D48${;{9@O*`Fi@UBGy z*lB*?g5R~k?^^!hUCVl_s2ehv*4TpIU;Lb%)_SQtBynuy;_R8=Y7Arlw1{ZbCtWfY zk~p{O4O9YNZl*kFIHlVyAcxt9O%kn&Mi`VCAg@Va6e06Py5tjH4R0w*x}-s$%yFyc zPvu<>ixeu>8Iu=|5j2m~=UFztkMaw!#R#3_94u+N^O#5z=eoB$MsGdijU0t?f!=b@ zJQD5r(?#VcvawMGZrMy!4v^3mJ0=WSzcUmk^L_4Lq*X7Xp~cx}22;kekaR|l4a6X2RfttZh0+F-u9TVh}{ zQ{oqOGRUCi6?u5&NE+^H0mg|JT{RQU$~;16KjuZc-)L(@lMRUalxogq<@ZUExhD7{ znLUNYDfNNR^VCG@3RKSx9_g#;cd{F1^&07=`mrNWZp@O~4Mfv183s9`7WOKAxix6h z6%tW0q|z)mSAh~>@c!5|Zg23Oa!Y&fdEAZ3yp~qd^yoIDR|z=t#GyL~!sxBXTW>g1 zhaW0xzr`D3x;;u9Wnw>*f_y4=3h`7*!I2VO`J!1Zs(wizdz*~9BlCp-iQ(7ClU#_s zV=vqEuox2Sdhj!hv~mK^6ugca&8H_{={76ur&?E5jS1JO(O1FsNSXFo1rJVs&T0Z;P&d6LJ( zYlxi%jK_JfsMJpx5Aa<)s8`~c$MGFJ>Cr&}i(Zq)QXeNf-KKsjE{0xfJ02|FqLMX> zCgQUfmL)$+Hejsy`2;)@-wY~U@LZ06k+$IKJuSULpYXEc)|7~Or=p;8C|HM1@hRVN z-4?NKM@*vYiD^cU=XC0B+ORtY^k|%ln)11kz^&d1e)w#BLMF|*@O;ZwE`xz|X28t^ z?*W;o~cA3iZD}GR>i}+0Py3@JQQa~gmIOAEtc44T;=+a|uk;s-R zGNMX8TC&IF%UP1znQht^TC`~%AoI$8VLBzoL9N~N?np2LF1L?8rb2G-?bnmmiTIMd zmxOlKuW!#2J*XDBU%ln*oNvCad0mOe@1Bvf9?4J>u|;30-^EksiTI5B6Z}T>&}~S))eZ!$jLx8O5{YT#jGId#2aSILTitCY?5;_sLU^#|0wywaTK+}JoSzT z(X4_vG||;OXoNZwK#@wsf1>wJjXtfVM?vD1N91>NC!Qc+USkXm|w6?u@YD6U?D6uxiZ2Y z<)8m>k3!C3=7m-JTwBzA4F0PTrMrkqws0K`j!Io(o#z3y2p3Bvrx9y9^OEt(3G4}4 z*&}5&UUQ|$gP$W#eln;k@EXy*F#1izsQU6_2q#t{k-?Vc32Ud<6Sh+U%>kn+@{@Kbk z#}8-4f=|&;z@X@-tX#I{ORx#S!4&DzXk)mlWE|xh_1wx|YHsIU?i{@3tt`A~^Y0P0)-fMgE-6;B`|EB)T>f z0@+(dp@V~zT_cThC!R?^Lw$T>IF+1}-)8LTdHtgN^R7li)Z^oC8E*`8%Wfw=zKt6a zn0Wl2y^!S*Vj>iUl9@Yqt5Fy4yY%0=Q>CX!8ye(%Bf+`b<{Xkclh49^`^ZS9wgB(# z8;tiVO(F*kBkx{IzTRCIYvM}ScQ@oXsc^Ww!Q}>=R}{sU0)zq$=|qI(>k?BOH<8lw z&b^u9#du|}bm3ZxsLLZ0gD4rtN4u3A5Q59KJsDAhz9J<&>)HL>8e z=NP=IWuX(Dt~Y(D-}UB7O4gF;%%dknv*t@qbrWCBQ$!FeMn1doQm5NgxL-}#@SG_N zYYSn3^<4u6Iu41<{-n7hF_HH=?w0Np-nO4pG9hKR+e+b0dv3|qUtwCgA@jPZO>lhB znlQ#mw`^)miwMT}dU{8!Y{8x&7id~@ zN9Rpi&b)fRDORjap8C`KfiicfX?}NHD~Ihns~!8zKlq3N2NHaV^VJ!k=Om# z_2@rp)Nl6aa|a)%@IjC62hUsJ9{neJ^w^iF>R{e-4y<$gQ$2cGjDl^i1isgj+>U?r zQjW0*-rzO0z$xz@Eu}9g0_zL~v#|pwBJEgwP-c;^Xi)vN-l<;jzWY2y>g0CVy&Vj* zn+rnTwEP|P1%td})h(mLW4B?ovAUo9`&Ut<#3*TH|;vRep#+}O~{Zybgo%64cW#;Wkbjv zX`bsNzy!I`|RC;`3hW%pfVvuF8aaNv^ z#X8G+i-0RcjytizJEer$zKp{8)FYacinZ~fb)IyQkuO)?ti7MVwlkq|H|+(I`O!P6 z^UNx5Ur@$A6nR6*SnHn_pFFd5TSswJmKy!|w*G95&)EdSSpOWQSqZ7u{3ntlvYSWb z`wXQeb#6?@Jht)NK)+nJzlm;9170(<2TQ#mBJQr6xGy8*A{Bi3l6;KM;>~%=^iy|f zRD<=KrWQ@maBj8F*${5!SzxpA+9+CnF?LD z>Q^!GSzM)WNVk=JXx)myn3LAy(5mKr?R|q8$)Tww~5{VLoA|LgO?|N>_-kQj{M!>1-YRK8MLLQBUt7L+EUXBT&cfqsR{Zp1Pb_l zDYT`g#zFW`Zm9|4K*fZ%nIs2A{9}c1WZ+K?hPt1?Hj^eG{J^mOYm=4xU+laQT&73} zAH@Aa1mgCA+xNhI2Rw~H_#doW9&q4>h8^e#Xhm_bjyMXmS*KSc_{i|5Z8y0Oo;=)Y zrV+UwMS?sP6WWCGU{7;I;}K9C&{+2Op+hD3hzbh)-MZ=! zL)*{>G)J)yHZg_RhBlxn0t|sQcmX#MOI`^4#y@XB;|(pg4pvnsKoB76kvP@D5HFG9 zL3Q`Ro{*S;2`&)ta5I|s&jS0Y5z~cH9jAd@^_oOmbjqm__@z;W)QIPu$>dLMGHJsS+$RCrsTOF^f3+@qwpItU zNloqX!%Zen?Z41-wr=GZCLz#iun#wuyk60xrDLyPZ~DUaRfdGUTo8#I_OaF!Jk`&A zf`!|-yK=c~LpVOkrMOu%=B*F5gg!-JocpA9?*UioE0**GMr(QBcc)qVgwne>lm*wB z3PPU*pU*iffBacbYNN^-;Y`9S1Z-LYPt;Cd&z09^f64gBWIZs~*N0;;!vt5F*G5zJ zQp!mOJB_vhv#OdQmdh#AG^J`qhWuQ5@63z5X=Gx0tmTifPS|g~8#!~vQzch_r(kF9 zhE&X%-O^j1HrAGGTh}=Aay^}KnyNkwQN>k!7&?=uzb9Xs&#u5wsMwE=&pzW;r!#3CR=(S&W<;1oLm%uWq^7NT0oj*+QkLpY zyPM<}B{{Eq=ecFYCj*Zd#}ivqP!^LvC!ZF*dwXrwy`V*PM=QEu@kk2Q zNs^Tl>3lveIwFtzp9sXZo0tbM^r6PB4aSKlT zygr0m(S^(-OIEhVSB|3(iHs;6ZMW{2E|u;75GY%4Q_4~D^SW~G^Wo{$3W3XAZg=i7 zvq4W_W6?qGGM&wb{>mM8&OMIlaZaLu5o;3-{F;?SJ z^Xgw+HS(^wX+Em1|6KbNrvFLe`=nJmZK`C2qzt)q$|Emag1BY$6&6Sn!JKR*#qT zV}GPp&YOH}`t|Pp+f{n4cgEl5L^+U)KG2o5B^jUst64PHv$^> z1rb?5!H9ot=#Vc$3k@b&4@(Y4x`?wYVh7JKu23Ib!8rfx_4^AnHYNlfcnGl-XpAd? zB((yK>yf~S6?h`Ef(tlkQK3;QR8=>Gc_3F=Z~L2IJbtI1qk#met8yiehV7Li1g9B)H}C@tIkR82FN@x0U-SSa#onvy2~J}r`opJ+qwo7ZFR67}65AMdSOh11 zDwmw?9E_x=ZgKL@WYW63A7HaMy&_H{(^@8cB4@WZ-QFH7(}?k+tI@m_nJP6WXr9}V zh6Ba9eMEv@70KDFNrJfExCV8F+3R>F`ZYv`C#AR>$?LOZJN9Yn@y!J0GqS-SSNu(v zN#9tmN8fq&oWF73d2Vfth5UZT9O{(WT{V*w`6Shk&Df{biiRtE`dEz_yYNGjyBMj4 z(^%Bbw6w6!XzB?OxEk)#JbZLPK2kqid3x@Shn~O7C}o~U;*j8~$+>YeJNMEAhrO5l z4Z`~_V&nVcM(ad-h@g6PG#-N#F~o+*4-Ka%qqRYK>&;~+ZiiGaN)flNtG$(?`QO=hHcPSO?|jjy4X( znd4V7BIevxHAALxo@3DXQn35&(8d~I1SZxEuJOcrS=}*@&?-;PpKot3k042B++KTx ztiXXng4EMb++;m2a{a;_@t8FgpE3Kk%`={{6>%?dM`| z*<3kuPR~pCLa~;8RC7^5*Ds zoY(Ger587A7pE62#Q0k+Q^dKVU(%4Dq#&yn7b~Xid1Hc8IBr`!XUJ7bl_tj#OM!GI zeXXOLJvOa5eEQW~0Utr0(wb(X$3ya0bZqyV%bs5{q04!)I_Pg*UhQGI4RI zO`6zUL2LihBF ziQ^$F z!tcx0eb+~IKhn*RcJ55~UYW%Eg!N6KHHRu?zWm)cQ8wew3!XI2b-Jp@3Px%q>`vJ* zIhe@bvmK(lBvo2iT18ylsg-h!#XOZ*9)fxph zxOJIJM^BGrM7~jEh&^T@errAMqiKh`Shw2b!v_>I*$>Fby56ve#=30n^r&2hXy*a3$+_Tr+=fYKRl7*I!(I@tA~?I21{NevPNX-a>j%>2WzM^dbo&~q z%cQ)s>s6qb*?shSC0c1gc-3~yGgrLvOK)BMM_te1_r#*JO#(~Y0%4{k_DQwAqMJbu zo)#CMzkV$*I^bJEOk72q{UNsI+?L_F?c@&q;Q8FlXn_}RBNlMpl^fVRV zJuba9wy_y`PVbFSVokOBGD$5Dr}1S~W5%cSNCj32ydU4uhRF_M?MYo39s01nofUR# zZ6i!Caw~Ij;?bUR!@2YV>jg0ph4;%Gttpu=ACQ>SHl%1jHd%kti2G7Yq^H-X+tqOV zeSRAySN8h&7w?|HMfYUIOJf+z?qd&W&%NC9E0&sj8AiPq+BQbUR~oUW_mQEKdkOUw z*3l~*H43^c7q86=^~TiRoVMdb6J8-Sp+8Br&O=}oMBS*ZVI;;ynOP*`)B zsNYpkioX2vnSMXt>}UCzqaJS`e?TL?*NAs{uK=-yGp2o58c&PZ+ z^_^4Zj}yWR(x^oAS{8ToxT;nbKYM5UDj^xN64VvN`XNUqkm6rYQ3zeV)otcesju6u z;&g2*R^5NojK7glUi>m;&)t^-`s^A##I>)-L(rx~_RzfWM=J=O6?pAti8%AG*dY)5 zUd+K^3cSpD8F%5xsk!8aH+g86j>sIR>o>|nV|-jfjcpnCG(RZ+ioM8P`cIGjR2_2` zE*7mVB^PXEbzD|+BiyaSy_Y7~!TcFDknx)5W9JE?c`P1c*0fU{Wd3&aqaks&n0fg~ z&kd>ljt`vLVGPf;TcZDbxl9rdX~!attiy^EE?KFxOE8m(GoEhDY1>b#_9ry-ufI%bJ56js*G@ z8k>+aN!MNz1*I;X+-ZLH8e?1&E0{gezxxrXYY(yr16QT!Iy$}#%iUEWd9yGvx1eMU zY~wNUEXJe(#Tn@%M4K(Nep|9^H2tHFc9<7ceP^qn%Vp?yXHiw^t z)psQ?py|ft>Qdp0Yz5b1)kr#7I}M9^yT-D{uX26aFV+t3F9>ty<<06-Q$FdgSBkb0 zqkAVugHQ5;BR+{u=Tv%<3DW$%B#RTZ_Cr|v4SSZFMg~<@9yq9-Hk4P8vo_&po=56);v#E zF+v8~9rXC|toSUR(A%43*j9TwnlO#ji4`>};ygAUQlD(JSR2ImWNS2?nSb3X)VIHb z6PYg;uwj+=fiY`^T|B5TWa>y|TZ>9TYqrL9+{DX1GX57 zPCLzBSDTgU5lgUMhS3<9*|mfxb1OxHX)&m@xMYhqP}Q=yCY^qid~K=uWm&$FzjZqc zo?c5Y1sE^hP8Sh7P4F^!sz=0u?JdH>;j~ELIcHL5(TqvURzM&=5s8jQ-Zb zis~zKQUW@X^)EQ7^o3uLbrw09`gqu0Tr?>hR8dYt@5R45^oWl1Y7d!5D*x-WGK^iN zZOx{O9u}@g@67R8=1up9KGewju&_-(cQZmi z3%A|mSOqO|V)m)PBy=Cl@a>O-Ux|XbsRTG95bfYYR`){$LMIfuTRZqf1G(yi4(Gsz zPY&m?&}112;f)N1{VyJSpn%v1-?jdn2{e^P?(gW2=Qx2M8H!@!p`A}2Y^rSo=+#ZxC1yBf;3o7IH z*FVDl{fd834#*!W4|M!^r39Hlb%e@aUR_^Foxf1Ba!^}IdkaIWgYv1EnOPW{Qa25j zmmZY+Pv7c}f&?IPpn^k{shX;rYw4yg7%FT$C?r%dC=7bRagf3vC5Jqr_Zc-crJta> zQa5CjuY9W)03IMA5FaRW1NX}4O`V2q- zumkX;eE-BD2#45!@+g?5E_m0F_LuiiSp>g63w;4qvM{!{b+9#ar2Z-)Ra+-hdsSNt z8%Kl$2#@QIbA$4Q-2Fi>?V(LbA-A2b`QkWmLy~}S4nPj@3%!?u?lBP}IM+c#M}lgL z60ZTg5Z(u8NQg(EBoD-S6geLWfdctq9Ha$3BYA`x(T>nQ;0S062#20#0!RkX20%iP zf-}&X%!A9HPEZNp17-kb0A>JY0A>JY0A>JY0A>JY0A>JY0A>JY0A>JY0A>JY0A>JY z0A>JY0A>JY0A>JY0A>JY0A>JY0A>JY0A}D97}!`^8Xede9r)iqgM5CWba0g4WMH%; zzSBXz*+J@m`#e>X{+mUGqyGW}fObf@ZU-X%-#m|&!1DbC`TTAaK>OcoZoIZ|y0LKc zZ|nFdtiQi2t6z!#kNO*|#_cB0>?_ZlV=47JnhwkNSH$z%asJW%MyYW-NHGHugR`$1 z_kk`S2>L(NXxRS#wyb_7fuGY~ZnpywADp>;<+*c=|6^T-?eDLM=eOhhqy7C}e-E|z zt1inQ>hjNyz2W}(w`KJ!3H+S?G9PO0_gZ}D{&~9$%lB8r^V@O$Bm4Wk{(kQUb~(pb z`0vNzu>JjQS^Y`^Kc~NcvcErQF&JP&!u_YYGi-lF5Ot1h;o3=@dxMs9rsjc%`X)Yjs!CRGXOIH zGXOIHGXOIHGXOIHGXOIHGXOIHGXOIHGw}Z>0|NsC-&bs7V}ELN^m`xR-q_ffn)=c6 z+cVA0&EMQhOH1Gu97|JEUnBlGwa(7YZx4TSjDA;!!|32VItmpGJfEJP-uYb?!1FNZ zTXfj*Hw*|%34b42Qq$?{=J34_a5s03x;YsC;CXo4+&O@ck3Z1)RmABfHS+ROzP`Tl z@@i4OZc|GeQo{dAe_(VGVHcn5EcXRXA zR+B%BI54_oX{`N2BJl11#DMU3{DWs|ng{+}zBQe|)ABDhOn|HO-w;Qo_KeBq!%vEFj-+68z?Q=s0X1!ct!q5Xd(w7?SVQ z)RHhaB;S&nW^QgM3pY168d6fw+5eEj=+eeF{ROiAOZmp9=g9xj&wx$?2j zH#bl&VB?^UbYltVud%io@Nx4E{?-ltPx_lv(j4pyb>_ZN@rR0;o>K!lSRiz6X6A2J z@~{n*G~1TEP1IH`4s~pl|lq!8aJl=zIIi zEey00>JtAa`>UpHJURf4mjLI7_7Uoz5A-)GK0Q4u_%J&MH{Z_Y5;bkhse^}qD8mo- zSNl5yy|lCe+Q|>&J=p&KK;YlsezU*8ICj>6-t?>e1?s{Lb+C}u{H6Yav5=H7)B_(L zQd0688%y8pFNpF@{UPZC@&D0>{}JQs^#}d^zJG?sSN~>eVg3Dqz`wu6C#3=1A&|0z zB{V_?_LqhR>R`bEjf*-5Kqxo2Ffg6K5$x;sEj6H_ho<(>Cn`M$jI4lsL3AiVZtg?X zJ`5F>lK-a8-%48RP)48RP)48RP)48RP)48RP)48RP)48RP)48RP)48RP) z48RP)48RP)48RP)48RP)48RP)48RP)48RP)48RP)48RP)48RP)48RP)48RP)48RP) z48RP)48RP)48RP)48RP)48RP)48RP)48RP)48RP)48RP)48RQhUuOUX0U!Sz3`iqx zAnd`PDZ&Qfh@eJjA{>C*{-+B^jzC6y-x_}=A_jPf`ez>e$!Gr4{C_gppMLEBa{g)v zTkr=-Ugn?$*dttiy57)(BnY%`@<#&q_#xgVaVlK|ezSr z@9ke*eW%0EYo&|1W&@!#Rw#)BR`Lmk|fs6zt1@$P99R3{o*LRq}JLSn? z7#c$TARlXlA!zk3i1VNXW*~QakhdY=#R9l({yLchUnqZ6;QFHt{LQ1^g02A9t*3{# zXow%{`k$3Y2;~1q-alJ^DCc@eSm5vm@Bz3D;0tgEzz@J5AOIi`;4VNAKrlcEKqx>M zKsZ1Iz&(ISfGB`yfEa*SfcpRs03HIw0mK6&03-q=0VD&Y06YRn1xN!(2gm?;43G%` zi3y@A3m_XH2Ot+94~K10V}<4nPjzJb*la0)Qfb5`Z#*3V>5Won)7{CO;6u=C?9N;Q|1;8}`O8_eXYXBPnTL3$N>j3ru z4gih-Hvnz|H~}~VxB$2UxB=V(a0l=J@C5JzfbBmZ;Wv-(RqHpC`laZJCW4i1D;Mf-!$APl_e0@c z08qOL0D#&~G62+eG666E@&Pab$^jrdQV#&xl2!o7KD+{e?8<8Ze1LHP$c{_{KsIO@ z0J1lm0Fdnw2AM)7EdiNAHUx@O*HPbI@}Z`(=}CD$xIHKjG`54v1(osp>mT9&e#Jj1 z2jmZx2ReSdQi9B&Izr_yudc78&R-~5IjF6qy@jFGLHSh7%q)yeshbANOApGes;WV) zB_&C%A)~H=I0_Pg$bkwDRi Date: Tue, 9 Nov 2021 15:38:12 +0900 Subject: [PATCH 2/3] tests: fix testing for the PPT vba sample file --- tests/oleid/test_basic.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/tests/oleid/test_basic.py b/tests/oleid/test_basic.py index e37ad61ab..1c5a38216 100644 --- a/tests/oleid/test_basic.py +++ b/tests/oleid/test_basic.py @@ -67,6 +67,11 @@ def test_properties(self): '949: ANSI/OEM Korean (Unified Hangul Code)') self.assertEqual(value_dict['author'], b'\xb1\xe8\xb1\xe2\xc1\xa4;kijeong') + elif 'olevba/sample_with_vba.ppt' in filename: + self.assertEqual(value_dict['codepage'], + '949: ANSI/OEM Korean (Unified Hangul Code)') + self.assertEqual(value_dict['author'], + b'\xb1\xe8 \xb1\xe2\xc1\xa4') else: self.assertEqual(value_dict['codepage'], '1252: ANSI Latin 1; Western European (Windows)') @@ -120,7 +125,9 @@ def test_macros(self): 'msodde/dde-in-excel2003.xml', # same as above 'oleform/oleform-PR314.docm', 'basic/empty', # WTF? - 'basic/text'): # no macros! + 'basic/text', # no macros! + 'olevba/sample_with_vba.ppt', + ): self.assertEqual(value_dict['vba'], 'Yes') else: self.assertEqual(value_dict['vba'], 'No') From 5f333b04d4daf78ea2c4f129b1e6fbac03452a70 Mon Sep 17 00:00:00 2001 From: kijeong Date: Tue, 9 Nov 2021 15:45:42 +0900 Subject: [PATCH 3/3] olevba: fix typo --- oletools/olevba.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/oletools/olevba.py b/oletools/olevba.py index c59026707..46c444cab 100644 --- a/oletools/olevba.py +++ b/oletools/olevba.py @@ -1725,7 +1725,7 @@ def __init__(self, ole, vba_root, project_path, dir_path, relaxed=True): project_id = struct.unpack("