From 661b97870d0e6a470f1c57d48580e4a123dc4e00 Mon Sep 17 00:00:00 2001 From: John Paul Ellis Date: Thu, 24 Sep 2026 12:51:54 -0700 Subject: [PATCH] Instantiate valid DOCX packages from DOTX templates --- docs/user/documents.rst | 25 +++++ features/doc-dotx.feature | 5 + features/steps/dotx.py | 34 +++++++ src/docx/api.py | 8 +- src/docx/opc/constants.py | 2 +- src/docx/parts/document.py | 10 ++ tests/test_dotx_template.py | 119 ++++++++++++++++++---- tests/test_files/blank-template-word.dotx | Bin 0 -> 23283 bytes tests/test_files/rich-template-word.dotx | Bin 0 -> 21131 bytes tests/test_files/templates-word.rst | 8 ++ 10 files changed, 188 insertions(+), 23 deletions(-) create mode 100644 features/doc-dotx.feature create mode 100644 features/steps/dotx.py create mode 100644 tests/test_files/blank-template-word.dotx create mode 100644 tests/test_files/rich-template-word.dotx create mode 100644 tests/test_files/templates-word.rst diff --git a/docs/user/documents.rst b/docs/user/documents.rst index ecdfefab1..face61b2c 100644 --- a/docs/user/documents.rst +++ b/docs/user/documents.rst @@ -92,3 +92,28 @@ Linux to allow Zipfile to open the file. Okay, so you've got a document open and are pretty sure you can save it somewhere later. Next step is to get some content in there ... + +Instantiate a document from DOTX +------------------------------- + +A macro-free Word template can be passed to the existing document factory:: + + document = Document("brand.dotx") + document.add_paragraph("Report content") + document.save("report.docx") + +Binary streams are also supported. The package main content type determines the +input format, independent of the filename. DOTX input is instantiated as a DOCX +document. Saving writes the document main content type, not the template main +content type. Always use a ``.docx`` output filename. A different extension does +not select a different output format. + +Styles, theme, numbering, sections, body content, headers, footers, images, and +relationships follow the library's normal preservation behavior. The library +does not require a blank template or modify the source file when loading it or +saving to a separate output. It does not attach the source template to the output +or enable automatic style updates. + +Template authoring and macro-enabled DOCM and DOTM input are unsupported. The +lower-level OPC ``Package.open()`` retains the original template content type. +The document factory performs the conversion when instantiating a document. diff --git a/features/doc-dotx.feature b/features/doc-dotx.feature new file mode 100644 index 000000000..1da8f6de8 --- /dev/null +++ b/features/doc-dotx.feature @@ -0,0 +1,5 @@ +Feature: Instantiate documents from macro-free Word templates + Scenario: Save a real document from a DOTX template + Given a Word-authored DOTX template with styles and content + When I instantiate a document from that template and save it + Then the saved package is a DOCX and retains its template content diff --git a/features/steps/dotx.py b/features/steps/dotx.py new file mode 100644 index 000000000..d8abdb00b --- /dev/null +++ b/features/steps/dotx.py @@ -0,0 +1,34 @@ +"""Acceptance steps for DOTX instantiation.""" + +from io import BytesIO +from pathlib import Path + +from behave import given, then, when + +from docx import Document +from docx.opc.constants import CONTENT_TYPE as CT + + +@given("a Word-authored DOTX template with styles and content") +def given_dotx(context): + path = Path(__file__).parents[2] / "tests" / "test_files" / "rich-template-word.dotx" + context.template_bytes = path.read_bytes() + + +@when("I instantiate a document from that template and save it") +def when_dotx_saved(context): + document = Document(BytesIO(context.template_bytes)) + document.add_paragraph("Generated report", "Brand Text") + stream = BytesIO() + document.save(stream) + context.document = Document(stream) + + +@then("the saved package is a DOCX and retains its template content") +def then_dotx_instantiated(context): + document = context.document + assert document.part.content_type == CT.WML_DOCUMENT_MAIN + assert document.paragraphs[0].text == "Template heading" + assert document.paragraphs[-1].text == "Generated report" + assert document.sections[0].header.paragraphs[0].text == "Brand header" + assert len(document.inline_shapes) == 1 diff --git a/src/docx/api.py b/src/docx/api.py index 276bc58c0..300b83851 100644 --- a/src/docx/api.py +++ b/src/docx/api.py @@ -18,7 +18,11 @@ def Document(docx: str | IO[bytes] | None = None) -> DocumentObject: """Return a |Document| object loaded from `docx`, where `docx` can be either a path - to a ``.docx`` file (a string) or a file-like object. + to a ``.docx`` document or macro-free ``.dotx`` template, or a binary stream. + + DOTX input instantiates a document. Saving produces DOCX package content, + regardless of the output filename. The source template is unchanged. Template + authoring and macro-enabled DOCM or DOTM input are unsupported. If `docx` is missing or ``None``, the built-in default document "template" is loaded. @@ -28,6 +32,8 @@ def Document(docx: str | IO[bytes] | None = None) -> DocumentObject: if document_part.content_type not in (CT.WML_DOCUMENT_MAIN, CT.WML_TEMPLATE_MAIN): tmpl = "file '%s' is not a Word file, content type is '%s'" raise ValueError(tmpl % (docx, document_part.content_type)) + if document_part.content_type == CT.WML_TEMPLATE_MAIN: + document_part.convert_to_document() return document_part.document diff --git a/src/docx/opc/constants.py b/src/docx/opc/constants.py index 30b856614..20c37536b 100644 --- a/src/docx/opc/constants.py +++ b/src/docx/opc/constants.py @@ -136,7 +136,7 @@ class CONTENT_TYPE: "application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml" ) WML_TEMPLATE_MAIN = ( - "application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml" + "application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml" ) WML_ENDNOTES = "application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml" WML_FONT_TABLE = "application/vnd.openxmlformats-officedocument.wordprocessingml.fontTable+xml" diff --git a/src/docx/parts/document.py b/src/docx/parts/document.py index 4960264b1..8f0828a3c 100644 --- a/src/docx/parts/document.py +++ b/src/docx/parts/document.py @@ -5,6 +5,7 @@ from typing import IO, TYPE_CHECKING, cast from docx.document import Document +from docx.opc.constants import CONTENT_TYPE as CT from docx.opc.constants import RELATIONSHIP_TYPE as RT from docx.parts.comments import CommentsPart from docx.parts.hdrftr import FooterPart, HeaderPart @@ -108,6 +109,15 @@ def numbering_part(self) -> NumberingPart: self.relate_to(numbering_part, RT.NUMBERING) return numbering_part + def convert_to_document(self) -> None: + """Instantiate a DOCX main part from a macro-free template main part. + + Content and relationships remain unchanged. Package.open() retains the + original template type until the document factory calls this method. + """ + if self.content_type == CT.WML_TEMPLATE_MAIN: + self._content_type = CT.WML_DOCUMENT_MAIN + def save(self, path_or_stream: str | IO[bytes]): """Save this document to `path_or_stream`, which can be either a path to a filesystem location (a string) or a file-like object.""" diff --git a/tests/test_dotx_template.py b/tests/test_dotx_template.py index 14ea32714..04b0f5fbd 100644 --- a/tests/test_dotx_template.py +++ b/tests/test_dotx_template.py @@ -1,36 +1,113 @@ -"""Tests for Issue #1532: .dotx template support.""" +"""Instantiate editable DOCX documents from real Word templates.""" -import os +from io import BytesIO +from pathlib import Path +from zipfile import ZIP_DEFLATED, ZipFile import pytest from docx import Document +from docx.opc.constants import CONTENT_TYPE as CT +from docx.opc.constants import RELATIONSHIP_TYPE as RT from docx.package import Package from docx.parts.document import DocumentPart +FIXTURES = Path(__file__).parent / "test_files" -class DescribeDotxTemplate: - """Unit-test suite for .dotx file support.""" - def it_can_load_a_dotx_template_file(self): - """Test loading a real .dotx file.""" - template_path = "test_dotx_real.dotx" +def changed_content_type(data, replacement): + output = BytesIO() + with ZipFile(BytesIO(data)) as source, ZipFile(output, "w", ZIP_DEFLATED) as target: + for item in source.infolist(): + blob = source.read(item.filename) + if item.filename == "[Content_Types].xml": + blob = blob.replace(CT.WML_TEMPLATE_MAIN.encode(), replacement.encode()) + target.writestr(item, blob) + output.seek(0) + return output - if not os.path.exists(template_path): - pytest.skip(f"Template file {template_path} not found") - # It should load the file successfully - doc = Document(template_path) - assert doc is not None - assert hasattr(doc, "paragraphs") +@pytest.mark.parametrize("stream_input", [False, True]) +def it_instantiates_a_document_and_preserves_template_content(tmp_path, stream_input): + template = FIXTURES / "rich-template-word.dotx" + original = template.read_bytes() + raw = Package.open(BytesIO(original)) + assert isinstance(raw.main_document_part, DocumentPart) + assert raw.main_document_part.content_type == CT.WML_TEMPLATE_MAIN + document = Document(BytesIO(original) if stream_input else str(template)) + assert document.part.content_type == CT.WML_DOCUMENT_MAIN + assert document.paragraphs[0].text == "Template heading" + assert document.styles["Brand Text"].font.name == "Arial" + assert document.sections[0].left_margin.pt == 63 + assert document.sections[0].header.paragraphs[0].text == "Brand header" + assert document.sections[0].footer.paragraphs[0].text == "Brand footer" + assert len(document.inline_shapes) == 1 + source_parts = {str(part.partname): part.blob for part in raw.parts} + document.add_paragraph("Generated report", "Brand Text") + output = tmp_path / "report.docx" + document.save(output) + reopened = Document(str(output)) + assert reopened.paragraphs[-1].text == "Generated report" + assert reopened.paragraphs[-1].style.name == "Brand Text" + assert reopened.part.content_type == CT.WML_DOCUMENT_MAIN + for part in reopened.part.package.parts: + if part is not reopened.part: + assert part.blob == source_parts[str(part.partname)] + for original_part in raw.parts: + saved_part = next( + p for p in reopened.part.package.parts if p.partname == original_part.partname + ) + assert [ + (r.rId, r.reltype, r.target_ref, r.is_external) for r in saved_part.rels.values() + ] == [(r.rId, r.reltype, r.target_ref, r.is_external) for r in original_part.rels.values()] + assert template.read_bytes() == original + with ZipFile(output) as package: + content_types = package.read("[Content_Types].xml") + assert CT.WML_DOCUMENT_MAIN.encode() in content_types + assert CT.WML_TEMPLATE_MAIN.encode() not in content_types + assert b"bG}sSS2b%~ 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 literal 0 HcmV?d00001 diff --git a/tests/test_files/rich-template-word.dotx b/tests/test_files/rich-template-word.dotx new file mode 100644 index 0000000000000000000000000000000000000000..0b70e7f72e9637a7be231ce3332a34359e1c4759 GIT binary patch literal 21131 zcmagFW0)q((l*+*ZQI7QZQHi(?rGb$IX!LLwtL#P?XTBb=RNOU`#aZleq>fvW=2#! z6?bJuMBb0Q6fg)1000040Ej7v4)acELm40dz$PRB0P=UMmXMvTvx%*3bz0|S?*RC*45IdtHw_?B_40|LkxenV&P*D}k?8$oR(WG7h}Dg2YX;39 z5Rlq`4|- z+;rw1pb0;iB@*9UbfTyfiwk+H>a(HXRaO%0kElpF=6K&&93y`{O(rEesvwt)1v^o# zBqF#yf_tComZj=Si0ifvn^l!ZNKor`y7(*j_^z0Mm(WU){^T~zAmJ1yfUG+jLE@$= zONTdwKHGWP$;1k>_C*%5*#HVq{}4fkm~AonJP5z5md)6jC0JUDMo`+WOC(gsZl1W(hwx3_ z>P2XnU}xq5lS|k`Uij_?L@2Kc6j1gQ%YzbPfhBQ$Tn+-J7?mHj?J&QN$r8AKMk9 zR*l|{9d??Iz|()d5k*TyYpZXl4}ZTAgzq9?-{u{JyP~~LUS0*2{pA7Yf0}BwG>+C!dVJy zilwgk$l?0tX}_#!Z=(e;h`K)<=e5 z-^8XBDHyyJqYaF#l3l$kU8}?gXX^w?(hqb*cmDB6R)T=nfNKo{x(ZbQ+1ISMDGGv3 z2~$PMRUI4-aUS}!@vNhUWOyjzesk|v^}0=WNOk$-|7S13ZAIulPzo80R9&(}hZJ5Gu z!yx{rVT|k?P5!n_!n9og1IqB#8+91EtUUi78K892;JkFogvq$A&f9{ldFCVKUbh~g zhz$3|((=`j&zmnx=9g-*8-P)8LMwh~{FT3P1a#}@$I~K_`!!FbvZE#yWb4+?hoeEA zA?L9qf3-pu3>1AHGZLFIXWl{j`&k3wR15N#0*rYL|h`46RrB(NwThJ1)6Lv|r|)1n#~X6{2O-j+i3-N2x`_q)0nXU8VF}`>yCnDkIeM*$Q%4Rm}I_zML>n(P9 zQQuIjc)%k_DQBMRjbG|*?W4MTy(<)vygll04k)YxW((TUj9d{de=mt7ACu0GNfdvL|y#VVSpb! zFeNrs&%9$D1YS#CYoKlAwUmkigmvt8T`+a7%Pm4+h%GEf7QS^*uqFeAo4v# znNWr3zN_=>k$y?PnPckH{MqUZ(ZG_Arr?VbxQ{psN-Le&VK-491yr;PRpiQ|LYXZz( z5<%Fh-^oWS+8HFrMa@s5a;MFZ* zqODbvo)&Jm?}iO^g*<+!*KOU6!#EG~iHRuqMo&luK$q=fLU!9Z(Or{)ipF)J8Rr$t z^)ON9VT~Ins|?4g;I|hS&MT76c7=*!y#szS0P6_u0_rzMYaUXIyuY;=b}tN&VyAy*y4Z?_g2^pH}Ft4}M^fY$;7 z36D0NSJDzKTtt}+DQ$9(1b{U&v$kk~=%+ri>h-X0QFU5;0No%m_84=t6ybkD)wkZr zWbG_1d8+iHY7@*#41%7V&5lw1wNs{`cIB>g+8Khj4Za z)=zp~r_5Vb+5!~iO6PlaN@`UandH?9yYM(cGypsh!Mskuqj%-83bXf{RCW*hjdFJE z39(D>?e<>BYleqFfo(eAtp{@Rm_t8mo3I=miCm7}lLGyRoqM0Y2E2LO2Z*`Viol`S zpi@;P=P1MoD@xF05`_(nbFUBvmLHP=PL|zR$v@58zG>{$yM#YKj!uapT3Nj39V@P0K^Cu*nuBzuyBR)owH^!C=Y z(AEDar7E;!MV)3T2{;r+75AVZ$U4pmcoP|sww88g@}!t|*>jFYfDvcIex-5QnUS1AA*i$ozN^}WE z5YKkGR!hf@jKO)Cn<8tkJN5GGzub#oVP6pX->aAy1ONce_bT@HB>Ion^`BGe-yT?F zvdmvDb?{Rb(HI%^Zc(tJ{JbrKVzWHl_D~`|Vl1&2)cvD6t&I)^8nhWF{cVTb-O!Zv z4Q2Z=Zi59XnnaGN1c*A-tf3A`^{>)13na{43inck2xDk6jfra0=^2MQGwJz9vO1X= z6bGRNJ_gem(E8k`26@_e!${6p_kQLoBghHt=63 zzbh(ecNCJbA;r;Y)Pc2sHsQ8b`CCuxWS2H6Owhd@?Zp8kEA9iGpVh(>lyw6VWma+` z;-KL7>4*oZ{&|=CL=qls*16c|k9%y1x0+#lMDA6% z6_6Gb1b}K-yOQ3?b3a0GMo7Kd8v(b+{_{1A5R>2rB|tfn<5IO>wI2Cd%81PiMc*SM z{sphz{qBj2I}7f}_rA8jG0J^RLKWPwdj_}8&{Yf!%Jud&-ThzwMJn;Bp7*zJF$wjL z!Y2L2)8o zwRALfy{-9l^pjS!&{qw`nK{+m)9O zuzs}8W6I4$wm;?oE121>PY_X!C4`|QI5L_z#n^Mw5=!IklPFp8hm29Kl$_+7r8y18 zRWq%%Tj92IVFKHv^E~c=Iu=a{>;82*FkHZ!j2X07 z%AYUIwGxN++?mH5v@d+?G*K*$W?E1;?ujJGC_*72vq^5x%lf z|LBq*vJPVXXeAgOm!%5a;-Cn)eaHjqBm&aa0D9R@RykOF*;_Ptia5W&O*yXK`7AXs zOfk2xB7h*gGrwD&{-=g^(`i|g@|aJW zv7?O{++!3_Xw%0mjcKp&fu|y8WOx_bw(yMa-;S6D20n||e zL!#Bf0k~EStj$VBixPE8CGhzX`xusNNM0Tvd9;HhESUK_YOKTWPL^BqANtdouf!WE zi&iH3*7Oe*1dKJqHcTJiE?!Jo@1h2Y2Bo3e(sjzxd91sC%So6vf)DkPkc+VS+WwYA zU?M5S$<)$CppBk5r;W!MrJ;rpAum@#0X2~SP}D@SggL(t8$`tJ?v1}=(5$$DjFQ?0 zipQ~%npP9#z;X<|oUMS5Ap5x;q_843DOPBxTyg4;mdKx1A=Z{D`Z~O`Yf)4trzuN3 z`Bt>ZqDY_Z&evO90EEU|&e?RWc7-tP=_k()pt^!~1xkGmnkI10(1P#=8PQWgdhPKe zqefV}BxzDfEFSwSPh@UotKqTuzNpDAWGSG|V6D&fDJ+MUd1>{Ou)y2JBOcT;9-!s&vo`uD*gQXnj56080xAq$jwJ1|gE0R(5eR--#KqS0Hd4W(k)dhe%f4(w(#BFEzJ= z-3-fI^{5x{HSrdbRlTDh9c@<0883edyt}DV+_5rNbE?jaa!TmB3R=ET@gpWxgQFg+ zAYPv$QGi!hQB5Dj9`#+Stezy(&TjR6$n_2oDX8zEmt{jde)!^t`m#b-%W6&0Wx`L8 z*$+zl*}M}#6kI#JtjO}r!r-S}R4U)+wqfaB1p9aFhY?=o6gMcpnYW8hA|I&x^xHVU zf&Uw*NTlx0q#ytQ=P>^fF*unxJ6qVAIsJvyMl~6`H4cQ%t7-)A8xvfOTQQ(~+4z-f zGLa6Q1Om3IpqiqzBa5! zU?QgQ@|B6#t=!bWOy4|MBn(E%k;-oJwy&4RYPoh{WTPG_@E!u^zIu&nh7##Mc{9)* zalO$52mq&Y4kiYb%sAo)#pFQgTO`a3MbSy#sL+0k>iqb6-D2T6c^Hn#qy;8+Hj;P` zS?0O-XNZR!7o8D7Q&jT41?rFph7kcMof$?$xN)ukr!c4IK;-am z$Q*;9T}}S<67pBtS7@4l;3++7q$CTNIF{>mS#TZ&q4g6ABht;1s-kInO(F@7&RYEI zfhdzO3zkU7wnrw586=smLJzv`06pG-_q5M#0P)!nY*)ByTveo^;qZe&HhjMW)h;&IL!syY| z-pb}Bnj$~J`XO)$@~LPcyM<`>snjYQB_^^SV~)ImR*K%msyHhcSx(Xad;y zS)YBcX?p+-k6HP#jh&SgcxI0wc6Zh~zEJQT^A5VOwDE;TU6mBR9dH_Zq7NpHavCFw z+<0&9uN#jczd6>F&O}$P178vyhLuJX=$mYz&m zrO3O(!(`(s>ClPm#;!t@%Z#tNm({Bt2kXIUH_0JA#3rbm%w!7|C)T=!5ABg9K-~$q zHlI=Hyiowsb^@ya`E69R$=Z0hh68FWTx>%w-d6a8V|eSa-x^uk6bq@A(PRV7%dng= zwoytOix}yL>_BSD&B?6mJ46q{{UWER*8|&}%xfInT)M&bSSxFc?zCC|L$=9gVWVW1 zsi_6XBgROjyUp;N-*}Y3*h>7IKPV?%1<}S&s?qWWwNILz-`e9`BQrw1ZVjR|5A7_$ zC|3Pg5LwFBabs#uPwljC#dxNT$GqYu>h#`UxUIQs=UDq>E-Dan#v`|Ob~8pgRTi?O z&?jSAbi1;}iWZGbQ!nNf8=K9eOD9%1x;xaH_zK46;^y!3C3@>s1nGJ-@g>*#0r~Ga zC3sA#c@qo(;2sFMml?2GanUbc_lThE{NMWT5+gBO)B=C z=s0o-0we-50s$hH4k8Mq1njUl@KI8BW0U+j>sn0_<&vLhvk@Z|gL6M1fQVw*P&E)x zi}K|w09nVVR7Din6>7P-gr+AtkKVt$zcW^Mxps%=VOuqqohH<&fB@HcTp5F`lhhNr zzZ*~Z{AY4AO5k_I@v;bzdm;1y0b%lKkbzc_e9;DipZfy1aZ#WEQt~+B!S6U~S^T8~ z4l)_l8-?N0#LQbXr_lHL8PXt4!i$|Jq^-cgP@qrJP?*4{eSUp&*D4?E-_k zL*W%6)PN`=Bul~qgu4Ubg_7?=4DbUbixSOUyI)`Qq`4|Vh_KL6pI+#egvE@87;wUd z3L$_*#?>&1pv52{AsH?aAOXvS@tgRg9R30>mW%}jMJqy~7;sdlNennl%cUF-J;9jh zLnOI%t5ZB!V@t;hQMx!zT#6Tb2*s$JK;%BAnGLOb!QigcuG^s`C!+adser zXV#E4q9Wj>Q6d>LZiUu~noj9uGHH^AV?rL$k5H#dA{<*bhYKA_p)%-F2B_6=j-m`i zjSOZ1gTxmmQi34dN8t8HkbogXl;{;k<3;LD>C3C3fYwftj-&T4x&~5vCQoglShfyg zw-zT<73iY~mImtLWsvDGr`<0bwDRajrPGD>RiK+vhPnKz@*p(1jq!MyYAD&xz91|g zJ%dUthu^?>1pugQs?&%PexS%|;9R2}<%CgCa9hy13PZHJ8pwg-i@Wd`bhS#JRKUY@ za%te1wRq3Z->=!jXOq3$xadlZadS;EU9W<3a(%po*E(@yT^wKQGRwOhh-Ng()ou0a zfJH2?aMXG8`>h?=FpZayzNNz8VQ%_^j9cOt^@pI|@^bJF*>(FX5Z}tPkDi#OtmJ0@ zRnE2HGzpH@$7$|+`mM!~va>U`6T>{IvZ`w4t-h!0=J+n*YF&Xr^@u_0Wz)k(>dC15 z4Ji%`IY+D6of#NE<`TCK- zrZaaFiQQ^>wG+6woTYcsnP^!bOq*lDGoO_tuT^aXFc7Z|5opwpKkh6_7@Jk#kIEM( zxq4qORNLjE?d8qBI-HKRF?s>IIdCvI!{!^lk7jIs8;KQMDVg1Vi{|qWL=Vr}sa-pE z<`1z?I$~YH*1I#wm)#bm^u!xlySAEZPiJP#xCeA%N?8@LK)6P3U&U9dGwXaR^j&NX)!M2=K(jY}t|=~@7w2MYQ5%X%&QZLH)jvt>{)U%jQ>zaNyfswiTkSkq9oQ7`>aK@K3qZQSp3{5WUXWOGXTQDVfqpL0 zz~)$7-XD*?tR1jD!o6$Y@(9dRWZlPXB=-zt35Gi4C7fw7r0VTD7CL~}9Dk}-JI}J` z#o$^@I9!eMCgYxR=M5vhPkDaUvu&{_ZJ}Fyb+k5z^ zbw4LUK^_oU@0bzaYq30}^@*;CT~BkUhWno2U!tkzZ0X2UG=Vt8^tP{-8y_mVYF_(h zkx3eT*>^p4zv$JaPDSsmq(N8ywezu~zj4jak8p$>z3E8+&yno`6>YGT!{A);`ZQqV zt@~Ky_JF=AvBc*koSUEovFY~KB3xQzw$9`ySGO&qe&FnO1!=@pM2i`o5yQ!JE*sn6 z5#=I?Rh4fVix7S^c8b6Hy2g2OyNi^ck7!9ac5!Waa|Z?0xff0hyM>n@>NlI6__}B_ zkP=#u1-QP?ud-Ykdil`MOuEJu6#@TV;UT#=f?H^)X+HwcR#a~NZQ&ie+@6w4M?vv)_4CPH=nF+WXY$BB<*F6Qh!IuRJA2YF{J^Db>6-@@1C_JluxtzGw z-L*+W?(d?mIFW38HX6J-+J89yK{;6l*`xmFzG(EvMAkf|V2ZJ{z8AHlVUh}$n^Y3N zW%D?s5V;A3WB~`2pG6@=J({cMz-^d~`rb$@el(Uh&>j$n5J~?~?Oie=e8_q}s-~;J zCMdRSJZ%)40o__)mwH7Y@ZaQre;T5}i3mobp83g3N76X2?h` z6A;(y<@5NS!;3sSfXdo&J*S*@XokYp;ce}%Xn7D-SOMu1{XQT_5zJggIfb)pePhkF zEtbdN`-Zye(4l}E-|uLUdSEI>>&Qk1e@o?1O9U=JLd_EvbEr2~@(<0jj2nWHMNOK= z$PF<#4k&!)6xtI_<5y#o4QdE=P3-#**8sIKKC&T&SaYg?adN3Vxj|3+$S^ou199rhOv` z#bwC&D{tW|J0TUq>g*^mchsp2*6k<{a)8Yb3T6TlPyrG_SXM!G{et{l18(99CL#sH zZvQpUz$nGa_Kaysu4$8-lW?M>KGpYY9<@I56}X;KoAE@>ogpIO+2LkI+GZ6Fzs2fz z(mj3&j_!JJV8{J;G}y%~oenvBh_@(*V)O#rJUfa1Z=kAPO)BeuZ>efm0|3DPkLTv( z>|t&4cPx0JqvN#3hUT-S*Lx%7im#}#iT0|o#YBI%xM~wjvtBd^W6oRL(d)Mji|$$?S1Dxyss;e(Z2EOV&FysK{d+qUIgH$g9o6@Spu%wfr zN3Yc~@<7rK0K@8Wk~q$C}Z<_Y1YpQ zo)n+;91Nqe+Jm9PKxmss!|u=TcQ%cV$wE>Z3kR5yIa^%|A^oF~J>6!bbO{d9AKyV^ zLu3cF$Je`6osoZ=dmQV;c1>$jXty(M^TdNo@e0)rQw6NqQ3aSkz0vWidDn=a_a92S zRXRis!nMjcs&fDavcPN@pJoe?6tkDp?0eSB4YJ#TgLFD6y!ZDNrk{Fc?GO%tVi^|E?2c_L8C}9%`h?M$dshaK4O5wW zRtA`UAABnV(1xjwceT*>Lvzl>LLLSI7T9nCv1U2IYV#dnGzIrCiUNihDFCC5?44O+ zdSkyk*hRKU`dB>-23Lo{?CgeYu87a=*V;k2)*tbD;F@{1*LIqQ-M+8vZ9~`aIxpOMmd-#jle9N@K0o#k8El z29j;xtbz1=n6i;*a5F<}+l3QPLV*HDdw0}`6fU>DfPE+$pg++!vfIzace$ksHQ><* z4I~@%;6F6TqWZPY-+wO$%Od?X@z)6qRh9y)LWt;sA|{qXpozKgManC=O8eg@`G}2L zAxqsGm+vIop@lI9Pp$30_y&uA1bZwimay=UPg#q@oO*sDAfP?O-$>|SsnDW zzpij^0gANPqT3#pG5*-E^98mcREVVJFGf-g6f3R|s_Pftnc8p6%HN(pYG&&;UZmQv zQ6Hd%c0LDaXOwOEvl3d_m*Zj%|%K@&kk4`Reqpls@ap zdhIQQ7iA6sC3z0>b#J^Z&Mvr7LAKo^n(5u0(^s`NIW-_f|=tnziS zbU;6OLA#Fx3r|sRm3M$FnFtadVgiooYrfoEsAY%V^SolsNTI+R#?8G)QV=rXX5A!P z-dsvlWGvGsLR1LLrl0!$FAqX0g^l>1DkZRc8@KS6kMJ(|K|)N-_h)pocd?#jYkrMx z@Ks+72HzEeKs{wU_(3-adpr2@m+8}Xne8K$zQZ|os{HSpGF$fH!mh2)QN0jyAjIFU zfI7g3KaFYAfD>5rAzU*VN;-_9#oYU`VqbkBbwu|NrAI9~{KUG%L_@#|4Fv-gX7hT> zIA-*VK<@nnOM#ZY7_*_&zsy_|843vbL8Hc|#oPS~RC1s&l5;H>sQBjfm3>Qk%igWu z|Lpuq#sQgkVMG(|xiaR8uUC{Y5T*4>QYd zvxOlSdl_wQUp&|(8+t0U!(5JPN@`i<7ie6zZ3g3-8*=O_ULg@Pl&Gv}(o`Fh5DVlv z^4IQgqtgQI+1B7ZGQp+X53#8&S0cdig~CgEm(FD1QielW+NqYezD3<6#%7}{_;foPQ>{Lw69;{z~(NR{<%NtMF_(5Qm=p-~0%f}z0mIr0U)vgGqSqvZ)Bz6+FQ z8Nxpz|1-vtvxz-J3lg>9dpO~YU@(GtzN{w{>Yu$Js0*7QC*^ekx4a1PAf7T#S3s%0%|0?`n$^YvSf1FV&o5vzkH8dkq3DT&S=O^IS%v`m_iv>NGQXYv&LiKaeIW3iS$G@b-{iV!Fo08w$aTuy^J!)n@C60P;-Pdex z0zzk%nb^5_HtOf@JVYS*5=^k^3XF*uYZ7LPrB{9iVvVv82z3Qu6we~UScWCUcMnXI zdIcd+isjq3wP;NNR?mtOY<^{Vh`g(Ee-(@rt8kAZ?6=g@d0aHZqp}c%RRv)Z?xMYY zXfYO%et8JQw{QUJBEV42w=x;lpt?dV<5Ba!6^8x%9-^)QtAGBjZAn?EjI82;Cc>vl znQ<7lk1C`EuGKIMdJ0u2(z@KxCY@FVfu^2xBw43PnRJp)tD?>B{-UnLIY_{J}R@1gsl!>?+s)vJm=O43a|92+Y%YlqhH<*G$`Hl9zU6p~|Q<74LQ#xWnW zHKSQSUdXsgrmilSo6R&XnM>hP-zHim4@5ev$nVl0VSQ?208-7Q&$_uQ@gxRh~j3ICYg9{by6x%~nm$=N6&SUQnFH#O@+{4(kcq0L%eRf~59pXEJS2tBDh+K7DZSr+ zsWFCc-QS0m&k~m;;W2*javM5k)E1V)Pek!D6yE!QHU$OsTcMbY&sB_pcwrI!W54`Jrzza0&8rFnvK2e?d!rqLYvLVej1)p82t;eYxy> zu?}L~^o@Lhl76B4DSe`g$#e7URasjfn&O+XPZXM9)1c}>%&k%5z6KbelL5!}+j3`| zWtXk4hx|BO-5i4KIWN2-6FWP%7-bSKPx0%3O)li2qNlVx^)WGf30C8V*sQ;|tYy{1 zx>iZZ!Ofw!oT8uqO&awWuN%k!1oKGEOkvx%zIkGrxH`@_^rHH4!nm@2LO$x*Q-xw#be{G-rd={(670E=cd{4`HI&g%-CvfWGN`@_h@;o%Q+-B3H7|FYKd^Av|My@ z;-10MNPkpV=xX_m{X#ko3F)1vzJEu=822>Ac$e&S46b+rg}c4)`C2rmU=A zUu`v_*;}t52j#@GOO+Qu|3nxPjl%mMd;7-m^=^A;9 zd28J^c~j1g=>}!Ywz8>tL)_fgwyiuk#L90Vl*LvramBo)sjVVkXPUaxp+v%dp)I4F z46%6(JSMAYpf4^D&L!5_w0``R*lv9b`9lsxeLxd#M;j zrdLJl&dB)1gM4*6W1&1N6rMd^zj?bec)z71h$_-4#6{5(MQDKzd{2#rV>Z&;{o zG{jU6pl&L*;9>~NdJHeBVE)L%cPP6ut9N>qW%FyxKkSXaTupo5vvD{P_+h&CcG)Nt zsIDhMbAQhk6$)E8UBtz*)Hwd>grFjV7FS#sUk}BU820Xbr^urw|8g<(65F2?;Lc?F zMK=*`6r*>&(e+35bWJeZRBM7(yba|0j|6jHGHqD1RrCEeo;+ERhYEZBp*#&)H6~df zUNcVPxmt+7*!%C)5~-GjU!KzLNzqpk4CHqgxpR*jrn-oR4{66iGzxJQ<8lhr3AcYo zrDfos$t(+!ux>U;!W(r^ioABS=XaFPnTMhjmA-n;y9AH$ZYF)9e%=2UhhnW)Ul$n| z06_YCYxzz2fLe?XeUof1VmRx(7gVxL5#5Ivn%V% z-K~AHGV zYC>uBr^+uo9XYEHQ*%}ZT+^jAEg<2058#xM`LL4raxaXO>aM7&9)JqGS?Y3y*_!r*%Zd}M4HirbRA76+y*59 z(;;HPCCKac+dF#z3h)TT+}9>M7!v&e$Lkv@LSRkFdjqtg#<)`)WFLSx8|4`-N7C9hZccUyeTW`A`amswXDUJ+ zN^QxyEwrQ(uR<>2xu>co!SXifDXl9D>fHF;m!hh~ig6O^6fJS}>4k{tQ-#{u4m}Jr zt9A^N9A`=Kkm;@G&nOIWpMD@+&O>-pN^Y1X+uW|+MC25$A6)6hyWGAh<>oQiqn7Gr z20v?IA|qa!d2uj2X21WUGI~)&h|YY|kX-+h-C<&DZ2L__ z`a7ey_|2I6n}?Kr!o~21YZvYOJM&zVDeIcv-~%86(GQ{{iqzHNL&}f}!VYY#LQfNS z@Au<}*iqP9C^Bspa6HwKHEahqI!BN}&c1awn4d2noobH)RxJo>Ry->QGAJI~R`&+J zQ6JI}t3r$b11dhKZlJUkqEMN=D1{}(hu>PZ_VLgs^;=r4;3SSky+#^IvMIr-v{QNy)(;%qGel6gry!#VUy10#>< zPco+sG;cC*v7>Sqgcwqb>&2A4xo7)ggnGfhXjP?dAL26 zAs#U%2rrgnlX~X0cF?4It?@?`GHCK}k|fE}kdAN}Dq=mPAAT)0bJ=Nw~yCj)TaogJ^~2*4~AF1EJqiwT#hm?)y(dHr?YE@ z!-8YJ;eYj?e9?bccufDr!h^-G#sTaK3D3q{OO$oZF8Le%>gb{gc6M99>S;-Az{Y{r z5=ZmXt@))#k=w@u4Wmig(E;FoL1{%)Q~SQGuODY79XNzW;Zcxk3BN_vOhu>9?BtFp zYO(xlS!Ov)sp%WpVj0+2Oajut;}w2KNuGa`MShWtQuLb@8{xeA>wS(j7EEApSV--M zV_bz4rrI{BCo*H8_fVEl&Zg*GM&+>^hv47T!9s!m+=lJXi_W+gopi{r0L_2{@~=R% zV2iqsP0fTS4z`&y#ITqnqYaJMJR$i5S>;G(z^I^!0PXjH2VDR^>wQ|n0m);39 zpUVX^x^M84sHOta5b24GrbeD|FL6a-VT{WXbK`ut(T9+y;@nQirq{jMXs1PNf-VL7 z%-RM0d*6jiBsM@o%M;e>uYH#cmhrPof{;0VMwhsGGdK>&%f)QkV|B|fE1PyI7&m?N zm*y2nUCOU4jAz^e4FbzZIwanllO%|d?YG`Q?Rk6Knc5c){uQ7J%CqNM`>2Cx|C7!( zXxXLON*ps?r@EG2OtKQdu-Hz7oq-dIkiL#yrrPLvUk-F)?G+>`MZ>w+fg&Sf`vHqU zby5tq`x)apU)jvXo?qqz3|oG`<-4t1CaxOJts0iS#(Bqm>5r$srXtq8WhS&F9gp_| zM612ZSv-#NAjZ%IKns|F%BcJe`BhX1Q~5@Mag$fWBT|lk?|i2A53r1dlU2)e)lWKe zty#P3azf|IYEAStACayHL#IV=M__&hQEtHpUKnc0U8oDjth1>~zQXIk**%U4=sFX{ zxzS5%l<;);_C3Vh8Z2YOx+y0mVMnNFUCu5}-9kPsKK$2KOtmev;_Nqez5dht`3t-M zId|I@{>34^LkW{nEpH_u5s|5|D2QqM^(P(NJ{q#@ndsa1c{CD|HXl{yS4$MZvHqMM zJ~~|Az?axLuZ`m@{1xuECxau6DCO9uCG+|2n?*++qZ~(8qmT0K{Lqj;o#DHMa+pXf zl+-x01dKiR%#KYa?J@!&nWXW12sx6Z8JD*SL;<9faQ1EY2m=94KUL^yGXxbcyx9Lo3V$6zvTktJjA^o7^1kRX7hTasd?rRLtOR+`9?CzWM+^xCR1ozE(9)5Q^ z7gx~wWSxET6rLx*62V92y|kbu{1Hfx9qTAF-s(GjXapz#jzGA6S635tkPbLg+y+a2 zrJh^_Q}BaSeU!f8-K(KgYMgh*0Q|mSTBG;iDavD#U^zQ0@7Y2u z{ij`UlXz-%A@xi-(e?tVK3HiL)$n1gQU9g#>PcG4ah28=P_|H|tTr;~p*;U!(63Ty z9+{6*k*ehSl}etI(U<ICZMSfCpUjeb)Y*a$Tec z=*4E9FBLrkQ5D(o(^t=rbM&hSEh2i)XG~s@uTZTjyen$-M!fx3`hQQ}Gb*kLFW)RO zSfc-6kvW^2*qG4&UH{GaztGf*T^mC6rJwm?*lwSQ6xM+m_pfp|*YT=tca0xLEMaJZ#?FoQF5J`4w#&sDzM&MMTIdu;pQP zW9#z}u7lPviGbjRvKuy3l}6Zgt;vI+l(1WbIcdyFY7B{DKTgDTWV^T_6JgCMt16p6 zOOqftoaN2DbpR0Ps8!c^Je%9_%@^J!kslP@1twHqrlaLmx+}r4Kv-;4!8KX4>d~YqE|+=K6Ymo(~^Qf8M;`P3Q8xVRQ5;(7<$fF+`ts zT>ze4A*L}YCkK_Bf-#nmyeO^)ndk<_E z!0`=3?rsydft0euvzw~}(5|d8P8o%rMJZr8r1fPP@lOj^=HuHE_=BxuocMb88MiV3 z^6By|g5(Zb)7Ah!6Uee`GZq_5r{Cn@?OQE&*2ogy?ON*$XA8O;XnNJ5fA32tdc?|* zku%O2=OAD@V&tPh#_1JO2f;MRF)qD(Mgfa*>Ofsnf*FNH({T<%8<1`EhewSMk;o5e z-A&#gGn5P%`$o_?7p-H*rAZSNwB8uCpfNB~g+P`Q$L58}5KXhu%-~D~M>z*UfYu{8 z*zR&0V#{0tQ=FwRo(~%*9*dJ*j|FiDBrU}&wPg%2j7DWRU@h0?UMEW{K**LcMC84~ zjSe%xG1$O7Ax90YU0e*;!K5RTbk~`d(E68k;j-29kRe1jka zqBjUbaDNYnlw-C;^WjTTIlyCjIpke%V#O~F8`q_@vxV^=)RtOhMwtcU8P4qNtM|76 z(nvfArRFg)g(hP!q|}qBnUkb6eJNp$bRR%|7FCrqEGt&wJv{W@sJXX!O55lD0L8gq z!qHgST46tmBXH`=5`u}5K2TL$GL`JgMzOKkr+tuVhYsvqz9-@EkpaIybK$M)cE6cy zzWTk^`pH{bo^B#*c%1CQ>>mm@XNGEaPwxP&H!e*Az%dmzsf76Y}r zpNKcofGpKv5ekuBMhwR|X?$qZvf=liDi=rT{#(eLcApALNcrjvt}{EQA2e+$_Go`p2ags*$dvJxsUcb z89Hs@yE6_~J-I)>GGNKYt81e=yOp|1Dr{5_up>9}t~y@R+@Fy1$$s0VEU`&h{ot;u zB`%{~wzDhI_1Es$xyCbiQt7)8S4|=S#jg%|Kx$NhT)c z8^+0YC?gts64{QukR{7ej9n&C*$t63Yr@!fBV&yQ6DCrY?3BuqvAhV`_a%|FV=r6p z&r;+3-t*3X^T+p|XFfBZ-~Bw-b6=PDMr7WgOFXf&UcS*d%3n_px0c|rl8OA*IBvOJ z*uxK#pX?o{P-$%(ul9{3RZi@b%R&win88$4@%32eOo%uufKKgPJjgU)Yb9LR2ju+IKSup4zAvm5!p`(-x@Ydm8; z8eprdT7(U$sBOgsHkF>PT3^^4T5YqPW=1JTK7qQ)UC|Zu9!7dg@jU4{$8<9OEd8DB z*Jb>QO);r1_Ku#4rQ(-LDwJHfO7hM_*|N0Z&|t-N4I8zbi-lbbD3Z&*K^LBzm)`t* zfhnnmj8nSzF;+OrNqh=2g41J%Y7x~^;tJ6iGz_0}vxh{8C*UtVw43CkHS`C3mn!^e zX(|k}sg`T=%tU6{H&8>FOwj6vtNp~QQI6>KMw1bu+vbLE8S@IQ%>adL{3=ot7%&qG zXz%I_=AOKiWsjAKG}`tSifh=*E)&V(E%Om8Wk{eNVkoatS+jgn^iiK?+1O!^s~M|n zF7S#&i}^d8DxUG>A_U1#&EQHQjr`(IV(mLLP#2K3QQf<7Gi>6-SubyT7LeaPpbb z@OR{Lj`wiuKunDFur2KEAtSlPT>^%g)dAa210$3(3mZgquE763TR%2qSd9s}^<2n0 zsg1(wOeG?_y4UwKDZJ9yap(mvWX~kLjc;;q(*%2D$w+8e zNZesadMBt+zDpFG%YCAcsNjvMfp?- z$v83D`uri$4CcOXsg=g_9lFj zu_ZlfD}eqDZ&)HlBQP3mmp3|QG8t-Yw1NliwlQW|crIHGzal?)sRh2OTJ zEI?jCIDWaV{-b7^O-hw^{NaphdF<5UqBl{{zG2ZZMranfCC&QAPf9HSGW^CUw}%Tj z4TTH5yi@Q1u+}EsmqbyzVEJId`bY_BS4q#?eynM?kNO4LAy76i6>$0HW*HE=su zTzam5<=uM4O^v*Yp;Q-S_u~nvsJfM;B8UZnC?D)~#C!H4UuLWw>nN6;&Z zgJUMVeOi}f5@H7PY)31%-8N!MHp#6TpOR~NIo-;l{n6lHMzx$hI6U6qa7NVvd-sEr zdz6#8hHP_q%jlU3IaWoj)ben>KuWE#K~4Eq8xQKg1r0BXSGCj6dE{;Zj!<>3~1)2w*t+eN$uw~>m|04k!pd6=;1(7uSZ>!wc&PF zE*YD4J6px?Oc12ebE)dMA1qI$#<$ygDyqEnm==kCcu@=Bdn?@v47e!^;{>SA=sGXP zhZIH1_}OhnWNs|#7>nWf=jydpC$!aIO(#5j%R7g_Fe>99pNGGutS})g;dGmv0sIHGE22y{ZZ(y0>6Ng`YCNULlF>MxLK@xu(m!!-}23QhnNT+V6=%+u%jv8};OlQJn3M&bJROhH;MhOj$|$$?8sR ze2cWdKu;Np<0Vdf_WYIIPSAagz1k&}`0b#uwnM8L@a?d7059}m3%kOoLT&0^K2fjQ*{egL$yXNZ>nVk9e@;2rdCWdl5?PUOTpgqlgkP4c-qE z=;yE_8ninGR{-za2o)4mk18D7$AM{Z>m<-S>c3ZitdZ(y>^~Rw6