From 4826fc5b259cb2deea56651bcd7fc5d439e5db3d Mon Sep 17 00:00:00 2001 From: supraja-trd Date: Fri, 17 Nov 2023 19:01:24 +0530 Subject: [PATCH] Support color and strike tag in to_html --- lib/docx/containers/paragraph.rb | 6 ++++++ lib/docx/containers/text_run.rb | 11 +++++++++-- spec/docx/document_spec.rb | 15 ++++++++++++++- spec/fixtures/.DS_Store | Bin 0 -> 6148 bytes spec/fixtures/formatting.docx | Bin 12477 -> 11173 bytes 5 files changed, 29 insertions(+), 3 deletions(-) create mode 100644 spec/fixtures/.DS_Store diff --git a/lib/docx/containers/paragraph.rb b/lib/docx/containers/paragraph.rb index 34004de..3af2c1e 100755 --- a/lib/docx/containers/paragraph.rb +++ b/lib/docx/containers/paragraph.rb @@ -49,6 +49,7 @@ def to_html html << text_run.to_html end styles = { 'font-size' => "#{font_size}pt" } + styles['color'] = "##{font_color}" if font_color styles['text-align'] = alignment if alignment html_tag(:p, content: html, styles: styles) end @@ -81,6 +82,11 @@ def font_size size_tag ? size_tag.attributes['val'].value.to_i / 2 : @font_size end + def font_color + color_tag = @node.xpath('w:r//w:rPr//w:color').first + color_tag ? color_tag.attributes['val'].value : nil + end + def style return nil unless @document diff --git a/lib/docx/containers/text_run.rb b/lib/docx/containers/text_run.rb index 1bc717f..722bea9 100755 --- a/lib/docx/containers/text_run.rb +++ b/lib/docx/containers/text_run.rb @@ -10,7 +10,8 @@ class TextRun DEFAULT_FORMATTING = { italic: false, bold: false, - underline: false + underline: false, + strike: false } def self.tag @@ -60,7 +61,8 @@ def parse_formatting { italic: !@node.xpath('.//w:i').empty?, bold: !@node.xpath('.//w:b').empty?, - underline: !@node.xpath('.//w:u').empty? + underline: !@node.xpath('.//w:u').empty?, + strike: !@node.xpath('.//w:strike').empty? } end @@ -73,6 +75,7 @@ def to_html html = @text html = html_tag(:em, content: html) if italicized? html = html_tag(:strong, content: html) if bolded? + html = html_tag(:s, content: html) if striked? styles = {} styles['text-decoration'] = 'underline' if underlined? # No need to be granular with font size down to the span level if it doesn't vary. @@ -90,6 +93,10 @@ def bolded? @formatting[:bold] end + def striked? + @formatting[:strike] + end + def underlined? @formatting[:underline] end diff --git a/spec/docx/document_spec.rb b/spec/docx/document_spec.rb index 980327a..42587dc 100755 --- a/spec/docx/document_spec.rb +++ b/spec/docx/document_spec.rb @@ -7,7 +7,7 @@ describe Docx::Document do before(:all) do @fixtures_path = 'spec/fixtures' - @formatting_line_count = 13 # number of lines the formatting.docx file has + @formatting_line_count = 15 # number of lines the formatting.docx file has end describe '#open' do @@ -382,6 +382,7 @@ @span_regex = /(\)\w+)(<\/span>)/ @em_regex = /(\)\w+)(\<\/em\>)/ @strong_regex = /(\)\w+)(\<\/strong\>)/ + @strike_regex = /(\)\w+)(\<\/s\>)/ @anchor_tag_regex = /\(.+)\<\/a>/ end @@ -411,6 +412,18 @@ expect(scan.first).to eq 'style="text-decoration:underline;"' end + it 'should strike striked text' do + scan = @doc.paragraphs[13].to_html.scan(@strike_regex).flatten + expect(scan.first).to eq '' + expect(scan[1]).to eq 'Strike' + end + + it 'should color the text' do + scan = @doc.paragraphs[14].to_html.scan(/\]+)/).flatten + expect(scan.first).to eq 'style="font-size:11pt;color:#FF0000;"' + end + it 'should justify paragraphs' do regex = /^H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T01a}D#-pSs(ceADG+zIL#8 zHM4g$Q1fy$bJ1t=w6i76hlZrd1wexP|F8WYUV#R+QTrYi^ft`{A+ZjP$h`3Ka(JTe zJWWzXB!)*QTGz5S7vCT3A;r{@MCf)gX|+$sj*j|*rEGW#*Z^8K9`!r|mWB z;)iAZC+k9bXpP!}lk7-qr_R1xvn)YN;k&h})$tm8ZoV4k)k;Jp=~6Dbm_jUE;Mo=# zQe=hlUpZWJ`t~xYm&gX0i|CaIB`$3J9;e?rU8EuAC~-5KO;u7PdQ2LmG_3*Obui@y zEB5SCmbA;uX_R5ZN7C2&yb3jkJ`^_j8VRxDeVRtnum<;~A1|DZtitjMzXmE8sOyNX z7!-u=Qx=M4>#8>3&^N3c3YAlQ84&&+fTO$0w9lG{K>aNsmPNM@FU-@PJM=FLd^k$u(H~I@2FEx>`dT z?vn+7bjLioDSMDey>vKf{_+B>SU54Jtk>I21*1u>=b6hXvmLy1(AGuXop_n?DxY>cd*-tn2r_n%weHpm-|Lyi6xm%%^1*|kuZLfFu<@pUo zEx$1ZHbA|gK}%?~*I|?|@B4gx97)&YW_-ZZE>>6h`21qTTYz zoiZWiCcRIq59C+rOi^naCEDR6huTW4Z-m8X1zk=q5edIhtmGr4 zPPa&?z`x(B9P>~iGw3@{YORGWw8*qog?9vP5o^sici*=(F^=*Lz5oSqTkZ$JoH{;4 zihXes9Fi$XfR0I0&V}*EH)W-cc$Rb;k|P7wlPgvCS`e>nhI@|q^OgvNVss}zpkI8E zE5;+H;ZGFtP0$l_b24QrlM=-hPN5kV&b89k5?O8&SoK`M5{Ue2x z37K;M3r$aYp@`F{bJAPKK~DmB&z%Pmg0pw8{juse(4hT_5pee2?(tyhRu~~Ybg>&$ ze3Z5t((ZPLY`(K?E+CtF9z$IptXlpw#UvXIrGR<%)=XUPvd2<3K!Y#@kC1ZEMucdl z&-XOtwifq%6Z&2XYxgGdoMw*!C=O9UNXfw2GQqh*Agrc*vcD}lQ+y6YvD7FRac{UV zpgP4(;#O*cD=kNauF-;gm#ytO@chZ`;%)TQyU=5v%ZD%4J4@zPuid-JFle;VN~&C# zJ)Bpm(gG+3lUgDC2Rdtz11>fBt|y53?hDl9;bd~WF-IrKr7Z76!kmlLLEcpvqI-?# zCi{1=5-rBkS0YtIhK(6eT`tH;p|Q}i5&D-%mHwmTJy@BE&&J+O1RD-iO~?u*HF>DU zT+-HNdJH~abwDiE){kChM4)(s9T9lo1TQVT5T?&PXK^S@=Ua8*oZt?r4_G+0bM6hP zdCBpGy!Q@WctH6MnQ6$5wGOTFXvCq2e&?kohD>d8Dh-(e8Zz9KVe0JzyWY_gV^6$s z&Fu+D8!2Kl*jY^2;*5JmOHWMlS43VaDvftWA?tDoQ6z`?pTgXtfTvUsJ{+Ws6}Ge< zQl`5QXg9Bhwuuct6mNfd>_Cbs77NOIXKlDY?G-;mg6EE3T4*DBi!YXw@c!=lttP{! zD@pV-6awE=!uoZf$&UQ$LpcqxQJZ7dym4i!<#0G_w`)b%TF!@xIy!>Dj}-J49Kmmo zj!~!R?Y&&}EOqN>=r5fD*BXqP=l9*l*l&%>(LCIsHN-iu-rQm~ntLM*#861Az>0cy zOVXpi&`%n!Cc>2UxF8;Hf14dYh{lfB0f9mkU=2NkDgBmSL@IZs3f~QJv4sl8*5@Ou zg{1BzPAhJ4!_!mqQHK+ogljVe(L{=@H!J;w=aIK6r*Nrdl})?jhc|3_q#*m%dv|s2 zi&cWKa+6P$-v}%notrz?`#zX!F)(jAjf-V>am>svTG^j){W;nk&?j4^(pB%}&Ku?#uiuY$Jd}uAi!iih@lc~VHmEm4jT`I{J&Mvj<3@On1 z-`>|I8^9|VL}aatrm@&#B8kHaSrQG5rF>9ss)4y@(whq#jT+tD?Fu~twQ=a3hR;=> zA!B_9ZrfR0UYpfoJ)T={#S)LiTtRd~9Jteq95ba-X)UW6)G(!&>5DB}iL!Kb71DUP zZz(4zy&@+o*Y!&FrK^-z$~MGG%WKWHZ>v2Zd7y4X&&t&kZ~*e+^zNM_3(9WoK6FAh zP~f#;IY}PSJDXP!=VYKGzxj;Eiu!R*RSxpwJEo&D>bXLm zf~(~1fgU;mjs$O^Pn+Y_LN<3D$%~ZE5K)$PW(kqB*sHtKp26YgfA5JbYp-cbVF7?b zLI42g&ppxA(#+0``Hw5>Pq%xdt?01Ah24p^=t1i0U_$Lq0OuC9SPNp5C+xEiC$@@A zTU5#yo|g6_T;2|Z=xs3y$62%sH`0BJyIAzVvBYQl@^f{Kq)Jl1)|(`*#i&X_Am;t{ z!!t2SS;fN1Ao5F0GFrvuH&4#vuYu=Y!pSwqYs5Fqm0nVGSgldcEbe)=}hAIdDr50Ne#~NGDC`UDx%3H!pdR-VlC_`)Fg~RKX zc5jhMK+S1zu|^u(xI{qZ`mj}+@QqWpd-MDUPCehqA0t^~l?o*@wq|u&`LL!Wgf4fD z%ho0?OWlMC{oH$Ju@mOatp}SZLtC1AXHWE%b79fkxe-%4hNzVdD5hFd&}CLK1B>A_CtIFCnt9|izV0G?{+-cJ zWaCKE2A|a$+tE~!@mULQ5AJWPvxUS5(Xw9(-F>_J(z^{Oq$4^}ZkH9ZtIpi{bTm0g zQXrJ=e|a(WV$M^0;Q4zmb?4)w7bp6(1=U0}bI#+<(QtIN;L}s9B+i-qTS>FKgaNU9 z&<_0ZB_1}rh7%<Zd>mI=f+bp?Hx_jA~l3KMi)YY`8EBVFPnx)Gm&U3Jr%_ts-je8s9WvMOiz*S z%vB0cvOQ2ryYXupz)x0Tqg$z#ZmnaqxHcL)idb!`?JX}eMf05qcaM`!=*!PQIuoG; zIP`qHV<&Z(ja~b&eUCFJ1>BYgRLZzk#cJ4QtNjQLBy<6G44jTOg^yUB!L)=X#xf|_ zZY3In9QUm~<1}jaqhGcVxl=}77zkA*JlHWVfogozcgJobMcd&$>Rx$#g5O^;c;9>m zT%t%ozto*=-FmFz@p-=AYNN?v?f_1fvtV1UMK4OMG_0NXRQbr^6PD6aa2Hy&Q6341 zkicH^xoiRZX&GWSl`Ys<93Atz%uz7){KV8bA{-Ireb#2gL^BdmDP=x|^ycGN6;_^q zzN7b!1-Lf8X?snv+@8$vh%-++FvM=kO!t(c1_Y4x5q5GIt1lGHF?SOehgHp$I6Xx;CO9x zELc*b3a3Ighntp&g2J8}3XtWXrhj(E8uM00R8uRcm#(dY?LMoPhH!V)mmM(Ks;H}% zrC4^q;iNC}&5ytn>&76cja(eu^nY2Nt0+vV=aC+jYp`jrpt~aXsh?N2MJ`%1)eZ)S6zmtw?msu*+8Si;gZR!DGRqzA!GL)bm3Q~+~ zaf1MpT3;Sw5ytfcBmtZ%KdH{9|BGU>(#@dd#}_+F&&|9RR_P64uM3w;$S|>QC~y!& zZ*mzj_W47#1XfxZq|-3iFw`+Mi#3igc!9R1Hk;+^D+1Uer6B91RES`H{D2dmG?4-& zZr)vA7dq|Q+hwA=5`GfUSZ<1Lxcuwnl}_|pOEmM=a(#!iJs$^c3;|Y~dIB#EK>f7F z=aK0joZ>ut8aDLvSp%cvdOT-aZ38S?9AdPqWMofpH$rs2=AG{QC~iZyc}?VZo_UcX zi^6IKb+K^MFw>}UxlVP#TkvgbjDk=G+J14D<@_AjBct3e2 z4ool{EiT6~a&UUym`3${<`Ejg8%&=x-DTGHbwwj;huJ`;l9R@gJ9{rS|?g;que1WvT1NgLtt0t7o4BJ=f&|9i=~; zmIHxyn(TIs4a^VbT?m%G$;TnXKfV(~F(otUsy~E0`R)0~q1~Rop>bl;Di5n~JlycA z3f3O32zx(&(p(+BH0_om@j*0%z0JK^>(eRmddDXR)zC&**4;paVwDc}$)uw453J(W z5+D`l{&;T<=gf=kTH5n7CpeT(?lzU;d^u<`9(snb^Kp7Ag>x_8m3UQWoL|VX&Rlj~ zZhh*5wu0B1i&dH@cOzFrLschzO8AR*|)%2q~CdZ$HO%0TJY zg3URWsl4NHbam}(ix|0cotg+|xgwOMS|SgVMv0B>-Ep@1iL8rN=qrI0asy_1f<3%U z5XMJ`nPjmPa!Z|fS3VrUeD)~=t!%7)Dphq zOwK`)oiG>3qaoh`%&g#-5>T@F9!=~Z49{3r(i6z<0ufL5CZ{vGPBBJrlXApQ3sR+g zO>w$3`p|m2-}GLYyk@ML5Vvo{YrEH+%}~!_p2o|H7q?PHu^|AJzan?9JB6xWYF>?K zvXVBn*WmRR744dVPTbn5)}PL@J_h;ae$gPiU)7INWpNZ4>>hVqgGr@gPasB>$Q25j zb;PR;?Z>6S)nOp29WtJZ=*Nvlfn9-<)iR!}VLP7MlvIFsaJudevbi--GJsa6c$-&k zKG>~v-T)O=RFWkdWndV*RX%n04qIM)YIGT;t@Ln;RQ_{n&UNgETGNnzlmj&>ip4?w z3j35ix0*x;6RR1-cPPk4{zd&C*-pQANf)@r!Psh!Qx>jP?h5gZZpS}-;r~bbt6Gn$ z2nVw?aNv|1^Uu)I9DFpPW@Kz@_R|0hlQ!&wSg;39-yOY_I;DnrmW#BE0ljP0T7@F2 zmBLz1%BH(K_Q)M#8e?0N5$*9l2{?5Vl^y++T~R@$SL0P*<1~a=L!;N3=)(&~IeIDHuS5P_lu}H1UzOXCv*w^jvYuNGA)k^P>u#iNz7*S17ZQ@MD^|`fDHwg+ z5Hs(@Iu~rl(hknI>_S_zg!jZmNqnd~=f+%E+APQ(=Z@q;NGW|bEkHtG>iEakhS-!# z*#~}t0e*GZf4(*kGh@|XcFvgiZW(A+F!j{a(VOsKFNsFpJHfzEw=SkclIzaKAIe25 z-Ec6YI~C0xAMoSs{OO_BM`4XHN}?Ep$wRg}G?9!7SK!V2O3?5lA>)-UiRrH<)b zFCO^Re7(f#Z_4xw5>VNCtTkZwI6kDepL`^3v^N@F*GZ}0Hj9LC;B7Mpx@h_Z9788J zo9EgvAa*uh;|g7qe_}VV}6ig;gn>;b$RT=8dd&C7xf_ckn&M*b)#|f2Xe+g z&ss;(;>R+0#tUGFfet1h!L*Q)vxB1xvyr3YPgMmo_5ULs!P=0eD(|qug4~X_7{KD| za8xMH0v#1a*8jP;2{vLSn>RxtWH^bmR;1oQXvAL6Y{g1Y!2j<2J`uOMx}7!-FW=o= zf5O5|J6FAG&b^a~1jMYFGeVBJh#OP?kx3D6RQLWocoBAwHDN%DB{cT%LU>109cK>0 zCxV?xx5}02N|-3jZ?{E(zRl&JNK$q#zv>-M2j(*F3cV0U8pZa3)U)g|U+PtV$=4n2 z8f=uCbwJ)@_70x1Ji-(YEvD|GNlF&sTTl1ASZ6QBa*W7v2uK>^%bn{w zTy@;&$#ufYz(tLF`HIc_!%|N?WSZ%R{1IJfP~GcmOpf;tpC}BCAZ{QY zzsRp)N4|#)Cj8;N^fr>F{5IsHq?GPjka_!-R0Rc{b6&*v7pHE@xI(1H7dHCDWR^93 z9Ysy7cs1vVLAD(DU%xKnp|LoO)^veg?mSOj#J!7;da_(%88}0k7Eq-(-Q?nbI zeZP*im3@p#g|fR+>tj195b$DJTp;$jEQ{HkQ>Yi=y^C-03>q*1tnvTN3z%^xmFj`* zArQv3~BNpj~S>ix`p1r71ss4*-xdnC|WH$ zXMex_roITTZ_2O1nxn~%u+fU7caQqcgv)tDnz8VXZnnp%mD-f<6)%B!q?H60rS)yPwYov zGU~rok|FN7y#*Z0+q?n*(7-GI2Yv72>Sb&8M>OA{tL*}kLigV&e?r4Pjdbf%*@{YX z_Whur+8cSayoV9PFcLAvHYDl)bi=_SN}9WpP!eKP+$q>OaC0>{IeGZmE2S1yjl(6} z0j`RILh)Y2RmkPko_V9qkc=5c9@fpII}O?YLwb!?GREKHQO9^*|l3>lZlfE?%ttE%aa1=RR_hovs)=* zTPf1raMxZG&gUNU$?aB(qkqZ~7BKMIbEa)F${#oJ#j=QB!usJ-mM_MyNG<9k;)oO# z9C=8paz1BO2=xMdJeaKdG9s8+(|n4=2qCQlc}sF)~#j2M<0 zSuR&{M*7E@4Pj5vA{8B!2n0X_8!4VL{iaK?ly&`GTq_1YVWQ3oFvFk}^ zfArT=b5r#Ty8`7xIzdo*7!^o7rJuPLt&*8il$_2xiJa31&PYdO5LG2m4>sUKG#vP$ zVq?U`p_G_p7o0pWPFtdRPM9E*n?cOQYmI=5BZ5Q@ZbWTqH0%5}j{7KoyZ}onZI}Ec z@k(ks=^5|*Bnt2i?G*S10(=AEAfO!Sa2P4WL#XHp8Cj7fZgK@%R^t#1O!?|d0fEA= zqCan)MTimopk=EOXZ69X5j5o7p%3IxPgF2aOuGbXO!-wv=JJE4{Wz%&K5*0LLEYtB zIX#sY96I!qr%VVrZ8nR(EE(3UMG%rhZK?q&c{&$~8VpQS`YKS2@I34DUS81`sDFwx zdLme@#60_m_}Zg2vBe3f+Z zU6ONQ+JXyLd!y=poL#2WKWdl0AWSbHw}fL$W=T~Oy*NUh*q5T;?Q``l%bWOdM`Bpj zox%Oph_F#Og?P7d!AcLROyo@%a`Ykuolz{F*4oE3h(4+{g9}!cPR}haC{wG4$|aqN zZ2~l5Byzvk&#UEyPlVoTyXzq~iD*r}s%}VD?H%Q~Y!2r3$3=t&$l)w#9N^(I3xPHA3oqMvg zhB{5+g;le-YRKCtwGK_X+H>m z_k0&rhF@?Ms8VVe<}hl$lQ}>t3GK)O4#L|Ig#R;y8}+Gs!jBtFj1fdI4b z+g3!rQ#e54f(RK(aDV>aVmKrmwLj%*&7yf>1^zJ&j|+RaZ}H$hw)QnyI)BI`W>885&&$@H zM`~S*A|R^`f#wLHJ`4)%iBpJFV*I&$;McERPGR_SQAy>-CcsP4!&nXIq1y^6`;YjR zWDkC+fF1cRW0&CFS#t1zi&utkqriQ^KYX%4x)mQ@Pz~pl7H+pl*svyrin9(9gBe49 zq?vEq62X$qC5O5C zgU6+68X|p!SFY>{#LXh0M)acR9LUZC?M=l@h_|$~!#x_yfrrlKqQ3->K9Q&2E3Cvd zZ-NTqC0UGkt-i$eV~y)||8wscDCZO(8Mb7w_wv%V3qf2X^-Lo-6s}$cMaER~%keR= z4c}$uX@q14fn@zai~X+NK4ZX*O=tpX3@lL+qp7>^;s_PxzCj&*eyBU>bO z>zU8%%{^N@c0y$?nM2TD1?85{WzKf>|tnNoL`93P2C z*+6!_eCK0s>qOXy9*$mCzR{Oyi;_m3vzZB7d#&TSG-{9xL8^x24YZCv6X#6?7v}af zWn+9E$_$N&Bt_3COyij=F}v0q$Bq|_r5b2IY^r&(`Kg1qqqplnWNM}nw<{q61+M(K zkPsF0Vaep`-XKphGrFav%>aTtW{=E$4S70yrjO_ncl=8cz-)jy2l0}2?50wYM!+$@P`wRXG_22N{ z59xjv@jLzbmxveOgT8+SPrsz}zr%lLZ~lV6!}~Y@9^J)&A$Zfk^Z@Q{|P;nWMRPS@w2)Q O3D6Brm?mg`e*1s+&3h&Q literal 12477 zcmeHt1zTK66Yk)_-7UB?SdgH>3GNO-26uM|p5PYT-GW011b26L2n2TtdMDY<-QDbW z?;rTS^E`9T%;|os>&&U@>Uz5rq@kd(0I+~(004jtu$nhvr3C>1Jcj`QFaggXwMA@g zoIo~C`YP^rAV*zhH*2fsIna=_SpZ0I|NkBT#s5HU{Gd$-3!2z*V3Bf{9*BLvkj3A$un-+kraRZ2?Pl!^Z^oU?5 z3B1Q)U%URY0+qNzWk)Ap2Sn_CsHR4MTWi}@&Z?b;;;%Y6&?4+$~;E7MWVF})qJYj z+XW_3AVkc_Qc6y_M)q>X6D?dp1Vl5R*ybWJDqYMP0f2W$E)ZKrutNNFuo*KiXX#xM z!6!a(%Vqc&GpKC$tI_Sbg|zp1BlZ^%=DC}KJu4Mf0mn4ZHXgCJjnH<>T5Wy~~?*OuL1Tz0P|IZcwi~a9!k6sqr zZqdntBy=3`5HS8laiJYAR}N@2wumEF z+<7ft_k`esD)Rd;@H5}_I<@bb-2e$e&H1cuGj zSe3}m6dl#EQmxyivKRM>Ey9BCl99lQ1xS?^V_1ejaMC=!=aJi5*!?bu5k4FK9q`V} zLtGE0!%2*7 zjhwB)(d$Rp`sFYX;MfK3{oj3*#Z}35vY-XKQm(Y0$)#Zxp_NR+M8B*Qas$jZaw}r$ z88inlk=$Fp9QhZh+Z5AI@2}8&U^I2RGFCD#nf)^yjxZy^( zl+-?nNxirg+a&8Vs5#SM2TvH5GjS4lTLU3&N-qkx==vNX>Kvjp4IpH(9chq={-)OK?>ii~KZjr>xKpvG>a09zKpP!2An98S0cUBB`92!3&g8M+96?J;l6Vh~gjaE*;=oa}unO0w{m`nvU*tBo}0Ccd$ z{4}k<8`V&fwrwsqmfx!S!jqqyE&LYA3;Y*SruC>z@9WtG+gRmJa4JE(QtYihQSH!> z9B*rLb&Dar?nb(MduhCH&TxWeGM-6k^3^ThMOw$;v1j%y7C&s>%{IkYO9dH{1~F1A z-$~{@fUfRrQA6I1o-mVFRRhom``>OB6VrCnL{iubky9R1yoZUi$~|HYBdVWQkV%8W zY}s^Pk~`~$=@fk(-5_*IBDJ`7qRpNH9D~5Id^6e(f$_fiD^kOYyyNh6MeMC*03;%R z!~4B@ab%)$RhX$JcxWwE$%jSB7d^-}6z-}MC!9(RuL+jLO9GWuknMV;kOBy)$@8-4 z>g58v_9Iszk|@MxIr8?N4UIhSd`{51l7(LO5TJ}0~J?`F%ock0O1HfO;zj((t`xKd0S=Cx~Bw|58f zGbyWYw^8pAK1mpqdOeC)dP5$gOS$B21!4}zBvK2z2m_00_7kGjO8XQ)LSg;N zT=X1Ov7ljQXmrmOMUKSzOphSOX(h#5)4biFS+4(T#X z%}XfuSbgJ~;j!u7%E>Y!t`_uBc&P!ZzNQMA8X~SG<8rz9wCYRXyhmg$ zPQY_pZ4{O_rTTS)x`}rosi>j0e2IZ8SDuToZ?(!Iw--blEbV<T&adBmMQ-lCang zh6~3l*MKiDgPL_p^V9Npb$lZ;)~m3UiTG7@sC|{EDU!9dzBvDrX$;JVFnPW^ekOD^ zdg@5!McI5E)fp!o7pdkViYZQNoyR`t1d8pvSM$<^Z{v~=+b(Sqp-ZQo9Y?&MAj6z0 zn(&zU9gVE?oh*3$Lij2YiJky0cN8~rXGE)y?`nyLEg zG1BquNn-R7oX!0^aI!3m&_Tii0C|J}0QRrh&B+X84Fdi=v;GL12b$8hm=Z*->U*wu zhs5`x#Ieudx+9U9pmVwu?1_#eUExNL%1nCTTU71JREp`#J!q9|`BkiAg!Y1bQfgJ0 z5^fM4Mh`r`7)7;5t7PGjHlN=-tVX3*0rfr;vO9?e=JA=k*PW}P#&qpK$aZ{ity$%5 zSSKsC!+6t!IdMiU>XBG4c)v!zqJ;hq9`aVyX8i*$U4o4&{X__ear8W%vXX0yya%Cx zybKzW6lyg|b#HplgQ|z)RKefqji(WJp1>>b;fcizwqv%N*YQ(`0+=BwFREyfIPs=0 zMC6P^;GF_B2cdW%1drmH21JmgVF;NjEClpGcZT`T4K3iU-+eR{;L(*s3*QTt3k>kD zoUydhn`62m1Sp4nvT0b{ok8${_46iW9Co5JBK#7eomjE3<2uAgz-A=*!Jk`AynuxW787a zcf*OHdoD8ak$asGu$n~OhNMadQWwuG0yW}n^6Fdw-uQ=M%SNZ<8HakeIot7}VOc`B zg{@7<)o%?3Q86J(>5r+@HAg8UVY3D_yWMVv6-JHsf1#nd_Tg#tecDC z8kDcQ<^fW;elNmY=XTzci7N_!kc@mT#=5XGPz>F` zAUaBh!mUYgq#duZ?&EB|nwOnF!T9Q8MB~$If4e3U8mrKE271Z+)2y<3GoSE-M$)CY zn|hGT&*mFYm(wrPt>$@8t{kR^ymIw|Q*B3ynIUhFTz7Q&p`B3mlByugGqkj<3%b-V+-I%3ViRyo(&Lw0rD_JtC>S=p6aG*d+aFcpT79dS6w zh2Bh-T|;$lA!ri56x4>DKOJrnHh~bAJ~2dbO+AI&aa$O;;K7fH{LUXAzIK%zcCs?f zJ=8c5Dz;a0@r#+{@QpQ0!*1B--UR21MP*5CDoK!i1l2~tIInDc0g{R0gfp*tBx9B7 zH@sSlnN*T9`-QV$yCr{vG)Tc>ZEO>Ri8HT+)UyG@46eEK4|RJ=0Ziz{(H6Law7G2B zJm}IUx3j6phaokrZQ~JYlZMv0S2%SnQ4VJPc9LFo#vsn&>l+Ppdpww4v$mcMK)}jN z)%Fa(*KVpwI+K_X*cL8tOw@h!V9r~=Z%x0|Bv@~z*~LiLN@^eeG}b=!dJnsXXL)rD zOZm*y_%%<&lWD=Xp&+Out*j6MA}DC_mlE0}xbz!iK@*|3{19+(6o?nX3OHI+T^GPP zEp-QueQkVHWd%D!MK}&of8j#qnCHg&UtL=KHJOgzyMwmE&jgf<7$y&Ro=XH?I$wUY zyyM4`ZIU{A7LbaX!athM`ph}IrIaR<(OU1?jRiA)yn?=L>O#80e|WO^B&A}Z%!nzp zluO-by1-8M)h!|c7q&oZy6xRPASY_>LiF8p^idETYMwMJA+pep6>D69CJ5uP+-Qms zI%tWX8GW<&8D zS20a?bcZre0RVwyQIXFNsNj(B@1U_)c8p8|UJ}D1{cTC?2y${Vw=s465in}itfMwK z(H`}RpCGqfW;_y&|_yPmH8e)rnNhplE=yCN3Gw;WcpRNA_Jo{Xw`A!8{i8^@Tm! zt$8t8c}kHH z-VB6(yb{$<3)ENPFTaSawHh|Tkqy#>%?6qx(bFN6VdS3HzC%QM9@^>&jms&0UhSb~1u} z$zR@4QBA*>q}yTwlA-#<*J!P`3gJ)qx}ol#vS4ZMn$BEs^?CT8Mpyv8H7nC^>juX0N0hzc=86)mMcwNMQ8tEN|^ zV~1>eLryo}*Ct-2ect5BBS2{5%;Ggh?B6q7d1|&nj2Nh+!)O*(ou1NaL8d05T1-cg zaW}i6U*81@o>|WsW_NeM){qvl@IoEBjQ0!E@QxF{oUe=%lf!YYp6lO``@pSfXv`vA znHMN1G~bjTV+)v!<9^6yzCkZ6HM7tG4M2Xmb0U=9bIV=Fk=+BpJ^Y#l&v;;*)aQgx#99qtHhatbSRUDce|T$&>4zu;Ux z&^@NLj4YN0zvgPf@T(R@phmJ&PqsSxgt%?Pq>4Sp-HxkR)8ntrbxEjC8!dll1>0hJ z0y`rZeb#2+K519JdLJQUSof**>rvRX!W{^y#Oe4TC=n$s_H_O^d`M zW)p5naZx`vHE?GoRq*3)FG7jFSGV~xHfM6kCE;ycxV3*Y?Jul6ba*3 zdSn9L4pT8OwEAh3&9UP)sXtx@%^`90F(J}hj)>PKA1(8i4-EH6+E}SIx;fA6h0m{e zIRnKbJ}2lg#t@y8-fiB5*&geuU=jzym^;0S#ixoHTZ&gYMmW1OcdVmC=Pr<*!DB*j zz!Ex|(QjRHDIG9_LqD3WRBC=+=XgjT`F2*AH7Qxmj8UzJe*0wn$gun1yyeS=c->Hc zxm6x-4_!VY+nWOk+JX{F+*RaNhHTwAQtk2Q<7P!5L>jGYbS+b>d96+uK!)ZEetFhn z37J@3zxb^gzv3k%RCXsUg-`t11_deVLITLqdH@`qW*H+!IPq}aQJ(6w9?ftf%?x{i z*&%#D7l)|N9#rH&rsU~#R66GeYeLF(U##qHTEB zf`tcbA!6Pfwx#%w#oL%g=02G?9Z6u^1vQ)C1cqE7nv<%_^l!Vp&W;0kXD39?7T&j& zT?}7QMe{Nq7)T?YNz%z4a}iF^z`N|k9o#NP=RNAKJF-)rvt|pdzr`ep%jkqM)d@Hb z_k_Zw&d9?+d%)7Y7^E#&WsRMHN$DF8;bPA;?t(osriikQ&;g!58E(C$YbH1###|Ay z?I28c;SwmjF98ap3@biEcv|Iyvj1vOs&DkI~Uu~2E^6Vn7Vnz?zE)q$`?FOzIYTGxL2&`vP zuQg8Nd38f&!=0I_c9FToM9SLFO@i8s`z9+t$OT1N^N)SAz#bmZz`S-yD@f*MSto!2 zTa=s77w0u2Tp*MN&iG`{l+#p-Wi70TCft-z*CqGeCJ*TT9saVe(8xExKvg0K){yX* z?>i;Txg4%=lP;ioaD@sCW=E4qkoseGBI)jU=KEQ{CZD$&j{y9Ay0((w4t2F-CcjTE z7%4CeVzerD%%(ZnEjrX&&mw=nN%Liz8RtHSkw&_PAoPE}2m!O3xVtiY!?!iRF zzhgspH|7Q|c(uvq3;_Ii89zx_M<;hH(9iW|bNZsgA~#0xaf8L`+x*gHM2XlaDT_3^ z-jF)WjV?@{RLjsn#xg14K@qFbNgyB=V~d)Wb8bJi3uB&C=>8_v?0vk?-2>0N0DZo} zAQ^dyN!K{Vwn+tXa&K<2ov{MaqPztb{-quXs+f1GrRaaNj_i)!D;vZu2J z>{#Hfmr;f;jLx>i(TaO$V_j@& zY#K%PSz0cH7Cbs)_ak+6?YQ1N8aW2v+Fgoj;`O|>tTH%Q3=7&nSj`h$k$^~y!$rYG1?UkfvJ?cBDdHS9)AxA<4L`oTh%j5SSU9n7!WFYpYW}j9bk*wO zN+Rw3)z?nYWP=Q30l{+bq^!@5e5BDs!d9;Zdt2hfJ0oCX#hVGbz*tgFo1CF6asHA_ zzOz>(riDT}#zc_NIKxNoS?(?ht9>4syb~5_E5tg|6UbnT9<~EY&$u)PP|wdytwDAMt-OlLHP~D*eQ|1;q_3x zkxV~G0vGqum}roOWE|a8jJmYZMB8Uoa$@i-vEQQK!N4M)N%TqC+i_ILZcr@%^&7JZ zdH(pJ1JHmR<(nGX>~({_zh~nFsDK2IV9it$i;c`^Mji6$G;Z`sYOr*zQ?K~6NS%2<`@<+JAevyHd` zLFiJl&O5Hbz!qjvP>Cl-lJh(ZaOY`#{Y2$j6_!#xxFsQ|@zLzVXX+FbF0bUuAi@?= z7K@U}fQ(jXxTYXNpGs}+k^ufF%?!jHiJ}$0l1^*4sb1dZn^JeS5A!+UyRelIu@P^e zC<%q}6Qxp=NvhV-Nh;SBNrCI}tbG2`4#C$IGNQ(Ycz6jIu;Nq!Zxzkoyvc(^Y8C1A zM{bqzp{$dn`8L~yANQ`Bfu18pD zm2Tsebp zR=)$YM-P(n%ons*`A&Zr9TJHvGkcCRs3vIletmh@$z`?_-R~qx%l`hcZqW^ zOR!`&A$9smGjLQ%0Ja>Jge1u$msE7fh-{e3qPKUCb9M>i?d{t6qWd+b0H^m_BJ=d9 zaMGv@#C@eL<);FNxffp#B^9=aU51@_G0I+|HdR*;!^;JP=t|ArR5#LzrAG?csi#!= z7e=0Zw6YHBBs&@yS9?yh{&C0(rUT+=pjT~8F)QwT|66Xxrc-lED;C=4f?P3fd(6)T zR8u8Vy<>RZVvd-%B|Fp?3FERtySrU$LC(2j2u+GUN+PKS`Bz*eseTCr7|nUGc)rDC z1KJj$XK@77;$>6OehCYLJWcR=N>JggQ)pkAUWk5|LY4<<6q7+Pyr6uOPvR!*VtAh) zOlu3q$y1{PRG z7^F5A0oGNWsZQ$9R)q_!)JH9c*Ab;3Ugr0xN~bGrmQXcJeX=N)wa}@XqOS9GaKUWO z`?Doqt{5y-`)3OnX7Ps@{*%Cit{drJB5c5Ylv4i^@&A?oOA61g!G8`hQI3EPtq<`+ zT0;%mX%*LX_zct@?8~zr#j)8K?t4m`#Xkis$|VxCez;FCNhKXqzQeT`y5P#vj$#m- z=4zV}s@asyYZZ}y!qCS_Cas?EhTqGCF7<64aB6&PtGAd8?C9ypw_qx3{W35i%h{D@Q>BMa$JozkGMtgoM*`mZAy2-lDbq)&7B3_KvqiZ)yA5012NOZ+(>N zR}ytn!KvLh>NKi}+xC~6=6g}897=wLw;`P+BjTfF!o`O>C4voQ3)&x-ntHqxRkRB+ z&%eS{)Q^@PuRHdbQXB9>Y#xrN0QX7l9Fg2Fhwm@bp(72R0>a|=yQVm|wr4(M=Po-6 zRCv}(iC6H}&MP6)DkFPM!g6UZv-|c!)DA^4;(910EmOz!f4^9J5Gz-DVJn>erJSEy zU0s~@VXLwKpfLBVi|wF^?L*!4G*P|J4(bbGeX*igt46oAs)<83PpyJ{jPI9rbz2G( z_KVi+ODrVvk<3vemRAnMcs*&!n_RrJf^UlSm_^I#_2hsbnUSy}P0rOHcYXh3E>FB& zc|Q+M*A~I)8rt9aB?CLV|Itg}zwFN=O}X7>kp<}s>YO0nXD)|{0zyc!?r6hr2HJ>S z)}tvhG#$oL(Q{ezvr*NA^7Ae!^2ae#lN5Aesk19;aH0Kf4JPNB!}N9w4Lyf52UXv_ zPGeNz6D$)hQDzRFy<6_PKJF5^fFLK3#FqM0YvS2exxu%~e?dP?dq_L^eU5>Wz;($r zecW#UQW_QId(OuSo@Vk-I16Dc@YRa;&TUWF)?Y>*CzKtL@@T}Myeko2`3%w=mR-&v z3W$kqD$e&@Jhw!U7v(D=rsTo(g5H?#nCOqIsr-_6`7~s&=lT^-3NRB5 z`9{J6DWY{4xM>}{({8vw3VXen#c{Y*@~Cjs+84?smYp9Y$D0hf5&1HdbAM8^A>c~o z+?BkwsPI%j;e20HcJ(Asj@9GYq&%fB*y#UAsUaYlz)Zz|uJiu&`hQ*jL)Eu}^gjjs zvnur$@W(X{>|=kcQT-kG&vL!L18cxU+t1|w|53d6yQJT%v;LBW0{n}Vl@t^qL7_HwW{7%jMB_WRF*Yp2hqULw-Kj-AXpa8%u{okJc a&ly@l8U}10KPsRR0qx*jf^DWBzy1%)Ef_xl