From 60fc290d1eb8c9c74d3c744b92a917154b517116 Mon Sep 17 00:00:00 2001 From: Aleksandr Sergeev <46769243+aserge16@users.noreply.github.com> Date: Thu, 20 Jan 2022 17:31:16 +0100 Subject: [PATCH] test: Dependencies unit tests (#50) * correctly formatted models to data classes * updated model Names and added new phrases * #49 dependency extraction function unit tests * style: apply automatic fixes of linters * fix: possible fix for build error * added json dump of dependencies to CLI flow * mypy fix * style: apply automatic fixes of linters * do the versions make a difference on dependency understanding? * updated url for spacy langauge module * quick fix, need to work on punctuation extraction * removed hanging punctuation when extracting actions * style: apply automatic fixes of linters * test for dependency extraction class subordinating_conjuction * style: apply automatic fixes of linters * more documentation for functions * style: apply automatic fixes of linters * updated ontology to represent current code state * removed pattern without implemented function for now * added dependency README Co-authored-by: Aleksandr Sergeev Co-authored-by: aserge16 Co-authored-by: Lars Reimann --- ontology/Dependency_Constraints.owl | 46 +++--- package_parser/package_parser/cli.py | 13 +- .../package_parser/commands/get_api/_model.py | 44 +++--- .../commands/get_dependencies/README.md | 19 +++ .../get_dependencies/_dependency_patterns.py | 26 +--- .../get_dependencies/_get_dependency.py | 44 ++++-- .../dependency_tree_example.png | Bin 0 -> 39555 bytes package_parser/pyproject.toml | 3 + .../get_dependencies/test_get_dependency.py | 138 ++++++++++++++++++ 9 files changed, 257 insertions(+), 76 deletions(-) create mode 100644 package_parser/package_parser/commands/get_dependencies/README.md create mode 100644 package_parser/package_parser/commands/get_dependencies/dependency_tree_example.png create mode 100644 package_parser/tests/commands/get_dependencies/test_get_dependency.py diff --git a/ontology/Dependency_Constraints.owl b/ontology/Dependency_Constraints.owl index 4ef38f4dd..a66405e13 100644 --- a/ontology/Dependency_Constraints.owl +++ b/ontology/Dependency_Constraints.owl @@ -14,15 +14,23 @@ ################################################################# ### http://www.semanticweb.org/praja/ontologies/2021/11/Dependency_Constraints#hasAction -:hasAction rdf:type owl:ObjectProperty ; - rdfs:domain :Dependency . +:hasAction rdf:type owl:ObjectProperty , + owl:IrreflexiveProperty ; + rdfs:domain :Dependency ; + rdfs:range [ rdf:type owl:Restriction ; + owl:onProperty :hasCondition ; + owl:someValuesFrom :Action + ] . ### http://www.semanticweb.org/praja/ontologies/2021/11/Dependency_Constraints#hasCondition -:hasCondition rdf:type owl:ObjectProperty ; - rdfs:domain :Action , - :Condition , - :Dependency . +:hasCondition rdf:type owl:ObjectProperty , + owl:IrreflexiveProperty ; + rdfs:domain :Dependency ; + rdfs:range [ rdf:type owl:Restriction ; + owl:onProperty :hasCondition ; + owl:someValuesFrom :Condition + ] . ### http://www.semanticweb.org/praja/ontologies/2021/11/Dependency_Constraints#hasDependentParameter @@ -55,11 +63,6 @@ rdfs:range xsd:string . -### http://www.semanticweb.org/praja/ontologies/2021/11/Dependency_Constraints#hasType -:hasType rdf:type owl:DatatypeProperty ; - rdfs:comment "Each parameter has a type." . - - ### http://www.w3.org/2002/07/owl#topDataProperty owl:topDataProperty rdfs:subPropertyOf owl:topDataProperty . @@ -83,11 +86,6 @@ owl:topDataProperty rdfs:subPropertyOf owl:topDataProperty . rdfs:comment "This class describes Dependencies."@en . -### http://www.semanticweb.org/praja/ontologies/2021/11/Dependency_Constraints#IsIgnored -:IsIgnored rdf:type owl:Class ; - rdfs:subClassOf :StaticAction . - - ### http://www.semanticweb.org/praja/ontologies/2021/11/Dependency_Constraints#Parameter :Parameter rdf:type owl:Class ; rdfs:comment "This describes Parameters of Scikit-lean APIs." . @@ -98,9 +96,19 @@ owl:topDataProperty rdfs:subPropertyOf owl:topDataProperty . rdfs:subClassOf :StaticCondition . -### http://www.semanticweb.org/praja/ontologies/2021/11/Dependency_Constraints#ParameterOnlyUsedWhen -:ParameterOnlyUsedWhen rdf:type owl:Class ; - rdfs:subClassOf :StaticCondition . +### http://www.semanticweb.org/praja/ontologies/2021/11/Dependency_Constraints#ParameterIsIgnored +:ParameterIsIgnored rdf:type owl:Class ; + rdfs:subClassOf :StaticAction . + + +### http://www.semanticweb.org/praja/ontologies/2021/11/Dependency_Constraints#ParameterIsIllegal +:ParameterIsIllegal rdf:type owl:Class ; + rdfs:subClassOf :StaticAction . + + +### http://www.semanticweb.org/praja/ontologies/2021/11/Dependency_Constraints#ParameterIsNone +:ParameterIsNone rdf:type owl:Class ; + rdfs:subClassOf :StaticCondition . ### http://www.semanticweb.org/praja/ontologies/2021/11/Dependency_Constraints#RuntimeAction diff --git a/package_parser/package_parser/cli.py b/package_parser/package_parser/cli.py index 82d43d576..d65a6014f 100644 --- a/package_parser/package_parser/cli.py +++ b/package_parser/package_parser/cli.py @@ -23,15 +23,20 @@ def cli() -> None: if args.command == __API_COMMAND: public_api = get_api(args.package) - get_dependencies(public_api) + public_api_dependencies = get_dependencies(public_api) out_dir: Path = args.out - out_file = out_dir.joinpath( + out_file_api = out_dir.joinpath( f"{public_api.distribution}__{public_api.package}__{public_api.version}__api.json" ) - ensure_file_exists(out_file) - with out_file.open("w") as f: + out_file_api_dependencies = out_dir.joinpath( + f"{public_api.distribution}__{public_api.package}__{public_api.version}__api_dependencies.json" + ) + ensure_file_exists(out_file_api) + with out_file_api.open("w") as f: json.dump(public_api.to_json(), f, indent=2, cls=CustomEncoder) + with out_file_api_dependencies.open("w") as f: + json.dump(public_api_dependencies.to_json(), f, indent=2, cls=CustomEncoder) def __get_args() -> argparse.Namespace: diff --git a/package_parser/package_parser/commands/get_api/_model.py b/package_parser/package_parser/commands/get_api/_model.py index 0c52d07dc..ffea1b64e 100644 --- a/package_parser/package_parser/commands/get_api/_model.py +++ b/package_parser/package_parser/commands/get_api/_model.py @@ -447,13 +447,12 @@ def to_json(self) -> Any: @dataclass class Action: + action: str + @classmethod def from_json(cls, json: Any): return cls(json["action"]) - def __init__(self, action: str) -> None: - self.action = action - def to_json(self) -> Dict: return {"action": self.action} @@ -480,13 +479,12 @@ def __init__(self, action: str) -> None: @dataclass class Condition: + condition: str + @classmethod def from_json(cls, json: Any): return cls(json["condition"]) - def __init__(self, condition: str) -> None: - self.condition = condition - def to_json(self) -> Dict: return {"condition": self.condition} @@ -506,12 +504,18 @@ def __init__(self, condition: str) -> None: super().__init__(condition) -class ParameterIsOptional(StaticCondition): +class ParameterIsNone(StaticCondition): def __init__(self, condition: str) -> None: super().__init__(condition) +@dataclass class Dependency: + hasDependentParameter: Parameter + isDependingOn: Parameter + hasCondition: Condition + hasAction: Action + @classmethod def from_json(cls, json: Any): return cls( @@ -521,18 +525,6 @@ def from_json(cls, json: Any): Action.from_json(["hasAction"]), ) - def __init__( - self, - hasDependentParameter: Parameter, - isDependingOn: Parameter, - hasCondition: Condition, - hasAction: Action, - ) -> None: - self.hasDependentParameter = hasDependentParameter - self.isDependingOn = isDependingOn - self.hasCondition = hasCondition - self.hasAction = hasAction - def to_json(self) -> Dict: return { "hasDependentParameter": self.hasDependentParameter.to_json(), @@ -540,3 +532,17 @@ def to_json(self) -> Dict: "hasCondition": self.hasCondition.to_json(), "hasAction": self.hasAction.to_json(), } + + +@dataclass +class APIDependencies: + dependencies: Dict + + def to_json(self) -> Dict: + return { + function_name: { + parameter_name: [dependency.to_json() for dependency in dependencies] + for parameter_name, dependencies in parameter_name.items() + } + for function_name, parameter_name in self.dependencies.items() + } diff --git a/package_parser/package_parser/commands/get_dependencies/README.md b/package_parser/package_parser/commands/get_dependencies/README.md new file mode 100644 index 000000000..4269a2efd --- /dev/null +++ b/package_parser/package_parser/commands/get_dependencies/README.md @@ -0,0 +1,19 @@ +# Dependency Extaction + +## How do we imagine a Dependency + +A basic parameter dependency, what we are in this lab handling, is contained within a single sentence. In this sentence, we expect the identifying name of another parameter in the same function to appear, specifically in the dependency subtree of the condition. + + +## How do we extract a Dependency + +Relying on spaCy's DependencyMatcher, we write functions to detect the head token of both the action and condition dependency subtrees. We assume that the action is always the root of the sentence, and a subtree inside the action contains the condition text. + +Phrases are used to identify the type of the action/condition and create the appropriate model object. + +Parsing a dependency subtree in an InOrder traversal, we can rebuild a sentence from the spaCy token objects. + + +### Dependency Tree Example + +![Alt text](dependency_tree_example.png "Dependency Tree Example") diff --git a/package_parser/package_parser/commands/get_dependencies/_dependency_patterns.py b/package_parser/package_parser/commands/get_dependencies/_dependency_patterns.py index f00e71d7f..5c747d1fa 100644 --- a/package_parser/package_parser/commands/get_dependencies/_dependency_patterns.py +++ b/package_parser/package_parser/commands/get_dependencies/_dependency_patterns.py @@ -13,29 +13,5 @@ "RIGHT_ID": "dependee_param", "RIGHT_ATTRS": {"DEP": {"IN": ["nsubj", "nsubjpass"]}}, }, - ], - "pattern_parameter_": [ - { - "RIGHT_ID": "action", - "RIGHT_ATTRS": {"POS": "VERB"}, # verb is set as an anchor token - }, - { - "LEFT_ID": "action", - "REL_OP": ">", - "RIGHT_ID": "ActionParameterName", # verb is a direct head of subject which is a NOUN i.e. Parameter Name - "RIGHT_ATTRS": {"DEP": {"IN": ["nsubjpass", "nsubj"]}}, - }, - { - "LEFT_ID": "action", - "REL_OP": ">", - "RIGHT_ID": "ConditionalVerbModifier", # Verb is restricted by Verb Modifier - "RIGHT_ATTRS": {"DEP": "advmod"}, - }, - { - "LEFT_ID": "action", - "REL_OP": ">>", - "RIGHT_ID": "ConditionalParameterName", # verb is a head in chain of object i.e. Parameter name or value - "RIGHT_ATTRS": {"DEP": {"IN": ["dobj", "pobj"]}}, - }, - ], + ] } diff --git a/package_parser/package_parser/commands/get_dependencies/_get_dependency.py b/package_parser/package_parser/commands/get_dependencies/_get_dependency.py index 2b6e42400..4c2bb4702 100644 --- a/package_parser/package_parser/commands/get_dependencies/_get_dependency.py +++ b/package_parser/package_parser/commands/get_dependencies/_get_dependency.py @@ -8,13 +8,14 @@ from ..get_api._model import ( API, Action, + APIDependencies, Condition, Dependency, Parameter, ParameterHasValue, ParameterIsIgnored, ParameterIsIllegal, - ParameterIsOptional, + ParameterIsNone, ) from ._dependency_patterns import dependency_matcher_patterns from ._preprocess_docstring import preprocess_docstring @@ -23,6 +24,9 @@ def extract_lefts_and_rights(curr_token: Token, extracted: Union[List, None] = None): + """ + Given a spaCy token, extract recursively all tokens in its dependency subtree in inorder traversal. + """ if extracted is None: extracted = [] @@ -40,6 +44,10 @@ def extract_lefts_and_rights(curr_token: Token, extracted: Union[List, None] = N def extract_action(action_token: Token, condition_token: Token) -> Action: + """ + Create action object given head token of action phrase in docstring. + Condition token used to avoid traversing into the condition phrase dependency subtree of the docstring. + """ action_tokens = [] action_lefts = list(action_token.lefts) action_rights = list(action_token.rights) @@ -52,6 +60,9 @@ def extract_action(action_token: Token, condition_token: Token) -> Action: if token != condition_token: action_tokens.extend(extract_lefts_and_rights(token)) + # Remove trailing punctiation + if any(p == action_tokens[-1] for p in [",", "."]): + del action_tokens[-1] action_text = " ".join(action_tokens) ignored_phrases = [ @@ -71,20 +82,30 @@ def extract_action(action_token: Token, condition_token: Token) -> Action: def extract_condition(condition_token: Token) -> Condition: + """ + Create condition object given head token of condition phrase in docstring. + """ condition_token_subtree = list(condition_token.subtree) condition_text = " ".join([token.text for token in condition_token_subtree]) - is_optional_phrases = [ + is_none_phrases = [ "is none", - "is not set", + "is also none" "is not set", "is not specified", "is not none", "if none", "if not none", ] - has_value_phrases = ["equals", "is true", "is false", "is set to"] - if any(phrase in condition_text.lower() for phrase in is_optional_phrases): - return ParameterIsOptional(condition=condition_text) + has_value_phrases = [ + "equals", + "is true", + "is false", + "is set to", + "is greater than", + "is less than", + ] + if any(phrase in condition_text.lower() for phrase in is_none_phrases): + return ParameterIsNone(condition=condition_text) elif any(phrase in condition_text.lower() for phrase in has_value_phrases): return ParameterHasValue(condition=condition_text) else: @@ -92,6 +113,10 @@ def extract_condition(condition_token: Token) -> Condition: class DependencyExtractor: + """ + Functions to extract each type of pattern in _dependency_patterns + """ + @staticmethod def extract_pattern_parameter_subordinating_conjunction( dependent_param: Parameter, @@ -133,7 +158,8 @@ def extract_dependencies_from_docstring( spacy_id_to_pattern_id_mapping: Dict, ) -> List[Dependency]: """ - Extract readable dependencies in a Docstring from pattern matches + Extract readable dependencies in a Docstring from pattern matches. + Function fetched from class DependencyExtractor, when 'extract_' + pattern name match function name in the class. """ dependencies = list() for match in matches: @@ -149,7 +175,7 @@ def extract_dependencies_from_docstring( return dependencies -def get_dependencies(api: API) -> Dict: +def get_dependencies(api: API) -> APIDependencies: """ Loop through all functions in the API Parse and preprocess each doc string from every function @@ -187,4 +213,4 @@ def get_dependencies(api: API) -> Dict: if param_dependencies: all_dependencies[function_name][parameter.name] = param_dependencies - return all_dependencies + return APIDependencies(dependencies=all_dependencies) diff --git a/package_parser/package_parser/commands/get_dependencies/dependency_tree_example.png b/package_parser/package_parser/commands/get_dependencies/dependency_tree_example.png new file mode 100644 index 0000000000000000000000000000000000000000..6ff36abf1be1db48182d7b20f3eebb3009faf67c GIT binary patch literal 39555 zcmeFY_dk{YA3uIn8iWQZ64g0zj+MO%4dmFnY;lsv=44ArHpfa?8OI*k93x7cV`Xo` zv5&py`8?0-{r&t6-(No6x~1q`*YkSJ`{RCpT!HGU3Uo9qG!O`cPVw1OO$g+SHUvVI zc>XN-&VxIg!Qjgor^kxg=fN+}^A?}Mzi&9pJ$Kf!d*zHab3{QbZSCHoc%950Q7Bud z*LKdUr|YF55Dtjq(?{Cx5=dj{FO1uh&Fh`$SFXEU3U-=j(rFOSu4+6w^W*oGA5VD% z0%5U(xWK@NSwEWQJFkeaa3g-`$^L+7KGhC7b*kG#Dr{sde*fg;%O*W304?T$ULDw6 z8yzF9v{|Zo4jz*#zUY$^t*F7VAQ0c=_CTrs{sxiNdGh_#e}7e%XGHw(d#I=X?_2-R z5)=#k{}B_$qf`)xEK@WbbIL^YeER)}Q}tWc|5`u2XSDHn5b@Z=@c}$C`ikNWemG3C ztJC-~*42Bo6XfMT%QST=NXn<8B|U=e^Sey87+#);pz;>mu{#;Gs2;iQ{&tv*_0qMW zR9;Pu?=~7{>jS)+qDB&C)_uHuhF3K2=p1=%oFjZmZxgF4lR~)#qLmR}U;@KAgpxk>jU0DU6sk!YD=qu<~8Y-mcxTVC{AWKel@l8^O!l4xAX#07O%tm?z~v+e2f z?G`M;p+T{q+ROQkSt_^!xTzq%Uwt1_Lws+((&N>w^n6d+@GrKG^T`!{QQ~z$<1E(u zYPM>f^4M9yvW*PMZHvX;;JW_t*+a?g^r>W(M0ZW�@XM2~I8Ol4US$oU_%WrePh| zd5a!@4T-4z*&XNg<*sQGwk)GQbDJAAP!KUztmxW$&uXEDojlfSt*u`qY;#Y9htGsX zBrba*eXktLMD_roA<^D@u-dk<_xBtGLdr_zrHSi^GpduF1gC4FMpnMm(B?Q&#@c$t zAE;!URS8xw6^^m`Yw>M0O@@$bWTpnQe8Fu{WbAsp`1)z*K}`2SUooq$oQxfpbe%)K z#jj-P%k zju$Oengw{#kv*k-6$H#%WYoQU#L0!;GiJ{vz1|$>bT^`o-((XHb&9E3p@$FozZHRTkHi^C7w|ca+5C z<1If~Or1g9+P$waS-i3I`f%P(C``GeKSNF_H>}COmG8(4bdhEaaOyRop~m)N+E?;3 z_|zd9=8jmSA8Uu1-p>U0=}^Nfh|IA9$DsPJvu|PM2r==gIZLL3=hs7DztDYBKK#5E z!nU_F-&SM^Td^{6iFnbDx5;!wft?1y!l79z*D!aL$y-{Zp)IhO`}~flCE%^ z1BW-?a;)Bp9m$AGQ1vLLr-eY6K7(XeHy=dNGI~lsnw-1J*p_sM>Fv-7eF3Ls+!)b$ ziNC_2e!ku24wKs8O>SC+|7JDkoA|%|0C}<1VlNFfC8}XQetWVZ{T# zJeoUOXGRtf)qX|H77R5YNbOk+rREdDs-Nrxo`Q8&zrZkhuBG~Ao5!Fxl>}Av;a~Q? z3ho-~7yru{@%UUEZkYLR^Ma!XiTUAdEg8S;kwTQ`R}e%earb2TZ>+fSSI;ibAr9M? zkqH~ja3d~7!J}QcnSN>1NNVEfBLyW4>5mAFrAip~yccj&@jeZ6n|7rscI%HhEF6BL zp*y2OxkS`K8epd!VUP*3Wmh^5pEhu=awn`Ofh?|b!j(8NON<@14wWU38XY3tTwXqV zQ8wsDC-}CS%b}Y|&}C7sxxX-)yb}f6y?_mil=`O!ovv-n?()kClWyO2(?58YYqik>DX#%NSrZ!)X-#d83sKKDy3kqqMsWLE z%h;iMl?OXQvDiSAN$v7ito@FKKkX|5@R4cLW9sST@LN$6>Z%pB#GUJ0nFIeY^>=bFKk@~?Jt3^w%jA3rzYP*X+YiK+=>3eH?=rHIhuQQ*Fx#vjKSTH2!$E? zE)@p${Z>6M-t!8nG@KHU5xxI{uEoiMOGk99II_O54V3>yuyj z_-A<=mqj?b^O2*+3jgM^zatgorz@rI>x6+O18fi9BO3Xa+_OV}%TDCC-1Q=^NIdJf zbx0tJ1;J4wQS>Idqbn23@Cb$f982n{Xce}CRScXsx?haOHP;E8JqO_sqnOyyYOnwI4RZhaQ0n?k~E;5pX? zPk$$w*pXVY>)ghUl;#O*INVUuB>N;F`lgr^I`XDogC#p*%qtmV{jqhH+hyp3#&=9x zuq*jd)&8pneKz!a(m@Q3w70?}@bW7!DDGAEQAJY3xcg&d9|kw#o0UbXs#iY#c4gYRvI~Q5;TJ+vmmePUSj)&};)jd}s5Rs7V?TL8Nl}ixFGmK4^{SG5_l(E)* zl(O(l+L!DBuCMMzb0=NrKRvj{nXlZ?D?sxn6hrr<%E%qh=8EwXP$Mi$DPw2&V7s); zZP7+0JS=d=vzR$A%VC|p8RvK`FN#H!+~LyLWP(U|DCcNY<@JfsYj=gsL|CDrQ~-IA ztkoo~;aO|cDonR53>(;zpAdJXzK8^YL(=%uKsb#1?nVvK z6&7Lzyj6G*l_R^dRmTjGJ!K3%4}EW%iWO+wUl*Zful;U69@5QvQ;(96+cM8pC(H!P zHm7MXKxAPQF#7vWf>_!+bfg$+ppZwxcCkOM$K&-DHqXEZ@9p4!`ym=SbV%_9X+?AY(NLm+);!4svtq^|R`nr5sK({BJ(-bDlo zFLW)vMKBI%S^kksgiW`Y{tk9Y#qyf?8MXyw<{c8k6_78{Vv^D1Ou{Ji3A`AlN=Qbv-NcD8vtM zhi8}3pCsX7Qq=L1+eCVC<&~7QnbKtzr)Lm|w=}5pKlxw9@kfvk(l%r~Ul17O&KdE4 z?G}1nIr?zN+~EZT2KwbjvrOT?V`hti0xpRa=Ru?KqA1|$&l=ni-vk9PL=S?VcK>a{ zQN=AiaStTkEK^6J>U1~;HxUUinfb-@9CJhJ0PLi}ANBk}dh22=7R6#cemZP?y2-Cq zuh@1Q*uU6dG!Qr~{FUV`}AQIO{m52z(56Cdq{-+D^e?Jr02j_26#+RdK_Y4%d} ze2V`0QvjOCr%lv-(RCcOngEY;b!JEA=>|sN>=_8hWAH$GW@cHYiz6Eo?k^9;M3<}O z>}+rF}c;0?@-WMR~I;TOR&gT^H=~aR z*ki^j<$;+*g02PJl=M^kK=qsZB9rG)ep6BC-HO%s8{S^n1kuFl_H&Rd4a!}M{lCrB zuYd8YNRHqg1f5?+A1_5>02RtopTRfbD&JRLvi~8IGV9%;`I)>Cb5rfSB41ue$`ycG zWa(as6~vH-?`||dyvxLd#3;A!AaA->k9yI^-Q=A82w9sZZBP^H?34Wz3zf_`6dkK~ zbf#K_h$K;tS!amvVhBKTZ#ZzSRY!4TUUDrthG%QObQ!U_)-$uidhbRMBSa_IsP^ee zD+9rYEQjwzBF1mbx5yBdU3@K++dx9}(Sh9R7bSt%h^_N}|zF z093dge&2AcUS@KVgmC$ko04bmX1qx>4z z;nXqkd8+dpwZj$U(M~7N@c9(^A_Gx5t(z0xsTRM3dg^djIE~<$n@Iwhps=7o)T*=X zzu32X$VbjNXHj8;flA~{;iYywt7^|S-=v2il8x$-C*+mD{xC$+#{3RT-tW&!7W$>Z zVmBcv$W(PI-^Jhh)a-TXlzvfQ#7A)*Lf}Zvara?D(<`dpcdkv3QOUJRpoXR`$Fk{- z|4bvYIVDjVSu;4mZOQ>u&Ln$tkQYW6`A#%378|U1sVQf-CkoGu?*RWq7&KA~#dvM# z`a5Btp2N6p&`Zb#{!)$ESp3aO4+;q-0+=lIcr|7x>){C!aLEY0%q^8ig8bw5kcjEV z_^4>FSyuqGKwQ+yBX9cr05!%U7X|qlPC0xILMxp_OXehRE5Ky9-7dJDJCYyQux#zk zXGcpyvNS;ff*+EMzzzllC{xvbRo+Lwv7LKFgF|fjAtM znW;a1S~_Mas22E3Ee<`%4&}c=IeBbjRWjFMOBpQKOX{s8x5J`~qa^8;lORNv5A-A7 zo6G>IgUj=QyFl^FPAOM7P2fFQZf$r-%GsjtM-FL38IL$ptO`Z|c=B=J<+v6A*`(MY z92EL7B8`*-BRsH=0T4?Oqa0igW{~`Z0xxsbvk;MR-a!tZUbc-1Hr^q1(50?$8Y0kt zyBriwLw3i|7@+p_jvZ37jNu!)obS;_Cy?=mX_-vdd_L_zASQo5k!rhQV8t7+o{+f3( zegh{S_OU|)T0$4e#l{T8TOM03VZYQ!WhRwRhGdyHd-- zxK~r6qQz$)z~hv?6!J7j8VBPh6sRN;8i|U*h7f6 z7MKmAt5zL{RJvZr{B~e&kviJ?q6Kb9OS$1G(Dpzoq=pTI^TDmymC3)jNPlgVZxpKF48D`C^ESGi>0ThADzc8+o$e3Xb)X;&I`A zg3t10N&%tq1dtV(#8qWG+693~QHVOiH#&gi>x=o1k{Qnm(tSm^tt>lA z?gmNSfN3Tms0bjMVE7mpDk!~X7@6c+J6cO0CUp&xauM{ol!T9)ueh8>hA1B8&jzKG zNGBz*@*L2Hs5pN0*#cTdzC=#N4f+R<0;38n-f%&*FH>@z-jBgVbGD)W*`syFWTn-( z5~sLIb8xf7WR0Cb10o1~41oT*L~62y#a)Ot75L1W(wX! zdSFu|C~63&i5QT5J?SwR=83zRE}4|ed7l9fN8$h+K>SFDuDIPND1L12JWQ?r{TK_d z8q`qOAl{%OVysjZISY5&$#?W%zXbgIlYx?6Y?t^FnQP~bDl{D*!c?mtkN>^w(0mG_ z?cjQxla*&8Y#=BfnAQ=A?tMY|wkHEWu*mRgrEle1A`*n;1j9fOajX_;O{-EvvTl=#sgV;0 z3PU1F8QQ!VeANK_dxLxVvUE~p8=@efdKQ*cLkNug*~ERc1{MNA#8?d(XD=zp-PP(g zh^d=#2D48v2#(%&A>erIrUN`$2dh32MrF?lxoN#K3@rpaj~h~S;bXwUk$a@5H)(>2Qzq(lktvG>7Leu1DKKL0|WPot^VRUm07&7jjn!; z@VKJtW+F--jp@M(8IWVoS;u%0S@u^Sa4LdPHHR2~7d8+oaUIgj1B_A>YC0^ATB%c~ z@dV@|!fpQp$fc<;YL0=u8~#djfZWctUmu-c!c-Mo>mAiJKc@7{p8 ztiic;r@b2#M(u`NiKgq=PMQrMvoxOtT6H5;zo}|8bXP|yFNHbkuiU9JZjy<6 z^T%gh8kLMQzz|8&ve~pN*rHRuNJ>OD`K_nLxXl-0$|z8FvHS3y8I7##kRDB(SH{|s zL~-z(T$-9L&p}u7m$ND;aJ`-^IbnTs+*EozI9E(`-9|Jc??g1u$Thy;dLSe$D6p@V zF7Wg?#%0-9^~kB_(hIhu3(~iA;>aCN6t2)^cYlG zLMm+V0IT62_$$pS8qj*L2~Y-FRS&|#u!8Eqxa06@M``TpWo7olHW~hiqY&j*qv+}b zhxqF4=`dWJVz9AtcKbJpG%}x2=q;|0WO)Q!@gbr_>_>R-&0x zhV!Xo;fBJNhh;J~=?SsR6*pYE6;+q$1yu~1nXB&=edp^ zR_9>E($!m`rr^G|apRiC%Y!eQc@6JtEwFlXqk_QC3W!V$8ae-i6zb-0^{^K~Q=Twl zbGieWX}8tSwC{(4CzgW|iuW;Nvl(i4V3}GBRk#&crh$wE+m30q312IgspI%*Lms}% zXP{7eqR!O8P(lg~=X*{O5GwwtcwLxN);Wk3O1IIcv^=BjWELYqDp@%IV$|XLi``0jB)r`4{_*@mFI`nqOd&LH!TV)RS(z zvjkD60{yaAd}L+z*H^f#i0KpXfN;md97y?lM!l#FuGM|C$jQXI%5+=vKTB zS%=08)>#Q(;i^~ex<*}+iAXq(Y<$5EKRQste}aj9yO&P{BVENr(Q9E%k!x-5)Z(R1 zpw#aHbd9biQNbgFKyYhwQ`{R324sK%43i>EF zI1#9S-K-mnPwl>XFhq{LEzEg1W@i09IuC~P_HS%*O7nO4R;IhR%}gWXt&lVEd|W!f zPVb8UrnJWWnYTls0Nabj;wB1bN>`w8{U`VK)?ih*)il8Bf#i-Uu{Hs9=Nb0VRhViW zqQFxBwoQXPDBSQbqPh*eKSp?+tywA}Mpikhyy&BQ+&Zso=_Z&CKS!-pa|~-%9gZW7 zJQ*@5hy}D;5qWK_A$+K)Qh6U|kpSA;UR9&|WSb%lwkF$j@%d2ul9DaZY+4swWVO>t zqAA09A2gjCE>+bAaD5R~#d@0qhPy>-YnMjm27hKx5)C#qvd7B~))`dp#el8J2LKwe zo~s2^L?%`COw%3hnK2PvkkpiZQgrlIdZ}+ zsm3cj0=>5&Kt4;*5Y0FJbJ+C^yD*)R$_o>t(2F|{@3T~OSLu}@hCl3@XwSaS;&R#@ z)Wa*ShD%(AXtVcC_nn0tef-zMfNYKS{>7!`n{($pqvy$Y$^>`xF2SbZ59XV)_Y=Se zwk&%@B&;06GFeV!5_9r_CPBc>Fu~(9+Y;yC*AGiKR#>=a`XWn4#tG6}1Au!iYmE_K zcXay@9!gI_rOQOHgA#C!vbH+>p_Cq~&yDU9FF1n9UF z>0Qjk1GqTLtWoJFFqt%PJ|<;vEx@0G9vV&Vp9bT)A=W!;%5jE6!pK8!--mnjI83{- z6LGjUk?KRcDro{LYo2b#Wyo*;$JDZA%zR(-!8zqn$ifC>l9NG<&-;toXxDbZee-19 z``%kScQrsfjd;8k#+VLx_mw;y`lQ&0DQWhGX}N=;1|^n<0ijwUX3dL3MKPWMQjpYM zMX_}(eD9x}e=9SA@9SOv?<6s)$-Vgb2V=X#E0V6(?;G8c5mE=nFx5)!@rY^eWr;tH zN`z&R=eC6nn*X@>@+uAEMO9s=S@zA7Ffz07czHkvORKI>HRF4&8PSVuvvkt(8$twW z*EEp5(Ow7a$dF2504daGz_^jsPs(W`ggoFKmM(VUhjrp|hwG_M=kQoFf&6UvlF8(G z@Cg4h6>C=V+Tu~YnPau~@#WJfjGn=(kp(3;mvsAYa=Kb&P(@KAE-fjOlP{UkUW@FG zXjTr2kjfzWq9HFFSrOD>0d0=KlXWGE0DDcsJAN(OA5V155gCXYaf%pC`jC2ALx}TQ z9Je`YAYU7x%NVaoGI8ey!ft*Y>-+t7jE_X(9C*XDh8n8H#~NtZTA0E;K!Q4crrHR3a?-`exO`ohT`bkE2Patw~#F zqH=h@4e7gc6qegm7j4Z=J(dF)Z`pI7jMEF8=8Hi8#bcm2tHfxPI7S3mO9&*Q3(PBQ zH9!%z_*$-e@bxmyId;y>Un@*IHIA`MgfVlIDi0F(@rfPCYF;pqb?J@*a{6DIn1#Me zgqZV3kY-#r;MzLx>ZP^HO+Orok#kAYcTp^5pRux35ZCjduP(yB>AoUbQSer;U0!bt zgI*PLovaHpXdl43jLP1*7Kk8#*H8i!z-2n@;T>6l+;60f09Zp z>M=vRJ&^|j-6j0t%K0D`?(OBv@G_W;!A6>5Uzj{bTw^`*!JIBC`5>TsAc>>rrKQ_1 zRqeq71AKY+y~1+k!<7+}yGGYl3UhSyFwx>Go=irLS$@0nt!&QDP15y<#!^7{trqA4 z4Tb2lMiDW%4JFl1DlLiO9`dSl4`=8eKC+!S4dcIz9%Z+@2_rk>y2Xxk0fA09npVy@ zIYiv_;10*z%I^&dsFV6WO!0f%Ua;QD(l3Qut(fj&i zU#|e5KywlZCacAM2Ue5 z@MM^D0Gww4tbloW*A>{$=2VE6o zmdBl+NwM!>%uqks0Ez0d zh?hEY24NO`B^yw@0`TEfQZ7TQ&v6$fF&4;g0zlWky<{ms}^fj#BQ5EE^T*MTcVIiRqppAxeG1079bIo<0FD5U+g z)fjRI7yNvxi0%&H`_ekwvm*`Sar`0W0=pQb(XMjLFg*)oO7{Dy6l7~ywH9E*<)sb` z_lp2_nhHD9dmc=NsN{NshC_a&8HYqc&3gqrt2cedy|vSn@(w=HKom<8(XC0ZIjztl zHFc4~gNAXUg0!9cG>WTlLv;NB8|++!aD1PR-Vaj$HFn> zS)ZBu4fUAk7FV-q8ap|;4!7RYFttMi5Wj&XF2n}dmv05Y*m0wHRPDEKGtlL&`AZ602+yG%oK%SRj`YI z!uad-Y}KT1pF=zbIxmX-C>U(oborH>BkKm5cYvo&@$)i?jDO&i4hURsnbw0Cq=|?j zXg3KvW0YjZEa|w@Lt1ofU+zf^{AN1^@utVwyr*n}_HY?);MEs;nWm}@q$)nBps7BwG% z&cN95?RLfCxL_zcr*!GGET1`n!548`YEgBcUxo{&NnqW_fPF9rg;P0n!0*8Q-vO z>P1M^PYTO)6b(XtzwiN65t(2QN71Mo=f!{p7DV+?QI@j9LpO!Q{NB(`Ei6Rh_fT2k zhOIa3>*AXbzraGc*Zw5f0MWI&fw2sW)-1CC+!NrjV_c0uS}5;RMT`_%W!N3mmZH)? zipLy{^*L~!%Av-+2^6eI%=njR3G@0f^SUcL|`z5}gO1fIT`UcNO54nwO^{dWzM?5g-+{ za|;07$AZ3@qQ7S1^<0jbJ>7o%B1o<;o6*${r3t!hfO!9xDW15iJ>Jfbm)b&O($`8Z zAgW3C0h?C1W{m^V?TERIqUO%~Tnk!J-8~U1jyM4jz#WuEGElL&M%O}&SAD1zDtDz2*oQMf~Cu;Y^n))TCLy`k0`$A}gLx=uQb(%?!+TVhG`2{?Akw zELHgSe{;Kad-fUJ!cLjN=);3nPTV{t%x zA&fc&QkKvdDX#|n_i0ugku2I#TH&~`S^g;L{Bj4ME8{0wY~R6 z5Izy49ZCdu4e#vVkie0!y>y+eRyb=Q&uCxjNzLCV@X=lIHBrQXof!3lPf;kbLT<8k zUw+~58)AwWzwl0?}FavI{u1|UMhRQ-`1*d$D^k^FDc5SNXypcUhOxFNi6_uwA< zfGFv*J>8XwhvZaPBw;MaQh&pJA`SH>Yi>~L6u@0G-tdZMZ-7kiDN^_^q9x&&1rpH; zpbqgOMW*F{$fbxpntco;35so!z%FS9`GFzWu7gfM7ipzv2}UQrH73WmfnQ%v0kXelDLKZfu7qeAQ?-gjDU4|p4BX$R1Hix^10~M{ zqyoNK{Ru!cEf*S^SGm9<6cp}oK!*{a9QYDoJ6CK`E8+?SM!c|9Mvb)sexVKxto^%9 zc;bcIfQ&)$y?F9Qea!xDAEs=^l@1)pao9Pm|B=U@-Hfa8|4J!XPL1{=omIq$?Om5x z#x>tOpY<4U%T?Rq8zwbs#k#5kb;z-`g#V$}2yW1j7YP9~^be32#t`;=pfJUrs`u=$ zQ^p6}{vQuvBt1v%dlRf=aJUXJuf!SQz}k3S%`|_Y6umlXu(2IEv1UM>?8TM+uKgo7 zdu+BAKhV(}!=}014(O0KnN>P3+^f&t%J+#Dl$&un*cqE)TVn-v;0J5#a?Stz_nT0l ze}^37ql5vMjm%DD2W8+*5$KishwPxV!>VkzcEWm9e5qje?$T=rcbHHU6|Ktb#&nF9;!H35p}KBYD;w?+rA@ZKOW zKxCR&9cw_D4ME1Z2}RePSPZEwd9S;vEPKLKYm_m>`t>ZJCDiXxE(T)k_q~K|KwCwD z)z{N|R&xHx@CRk3$`Y%5V6fe1ZC43`R(*UJzOXRM_03Uf~4u~}piSEev zg`_C4xF?#B79-H^UT(Jchpvp*2f3aDn-Fzytyv$0L=%NRaL7ERE(a===0>9jbRY`g zjRkA92%{hK%*kR71c0v_LUx(>z8(j6o`X~cf%?eIgN^Gh=)mh`6#IkDw2XpRh5q%1CU!GDJ1u@!JFWeWYr zv!V^jfoFQ5VTGR0f${~4?ZQZBq@QU(XPo$K&1=r@o%ik|0R;fK`4mlRq499}Oz{F> zB4%(LG^z(lp3dtQoatTS(t>Ddc_A^nxmC#0$O#0~Vy0(Kh@&^5~=xlWw~44X`WI z^vM)9s*5Wo{_2g4Qz^q>n@HUXj4s?q2f?qM2^x8cr;aX>`vO2);Rf|<%Hm*PhA0~lBWah-pF)j3z?mFALM+<9Cwx zp7s@|AZteN_4_7vf9>TnA>f^fbjm_I??RPlt@);9jH2|!o z0Y*#oAZux0+HIAZw@?IPa&Bu)QV@F3 z3M?;=Ujz#>u^!TpEM-tJ5FtkUWsUrqphTVy3znb*7cu%+ZYBilBxe%WIt6`4<8pDgD3x&@X@|hwpK@ily9zmDSY)p6obq7e~ zv-f3fhioqo_t-`B6c|uOX&W%|A(K2~pz!N5)yhlR?@oKeGTtaI3-Iv4a#KM8LVBafYJnJaAqn^6gV+6^{!B~!Rf#t~f0WF7s zun0z8Rck$-yq_N->JBxPr&Cz)jQCeVT{7uIrP1vz-kY__F*WJY&+t%9O~C`{gQ`6b zZC2N1N5JYUV!)EnpMksu0WB*5Cmh%W>o&j*|2 zWfkqMdT)L88CgZWU0*u1*mAGm6RB5B&)FrP&g$aQUMrzU5_1@O#g3KQHmiPZ8>zDZ1T~P|u{sJ8?ISJ1 zcHAXeQeeU+?Bcag0WJmX>_!!Lj>Eu;*37a`i1KEl&xXUwziCFky>DQ;Re$*#hG{j3 zdQSbGG>qz+IMh)p_ZYL&GX9!WD_G{kz8!e|ZOZUfezzWb8hDpL0!OC~xILc(frb2G_YQ9` z{$eaA5a`t>+|r!s_d`xr_!ISxzSi%#kO^{{YqZiF$FPt4XE=@w|hVE;uOK2&MRXd0&O^=UcUch=-qubzZZL4WdaK5L;+`9i$GH zhM!lfQ{H!ZJFO31|GJH{C;%E9d%G=o_YLfZZhZyo|3F0DIO>ZIwm->4nq18f#nh~s zIC{{X;F~Sjt8`B)HGoK|wMZaauGUQ_WR*k0$SZBo7w$3Rx!u7j-A!jT&m5NMZG9i~ z@De4ZzHA73DW{>4Hz=F)8OeM(9sT@yY_a02**ckf_~N2y|MrfRSx*^u89qEzVo1%^ zacBKqBcW@fL-{^HK2O0Z*ta+a)H-(_Hb8?HIyYXkQp)?`+ zSoXe04YSD=#tW-u&}Wvm>woqP#J*SL1&lQxA7*=N^evhR+kP0z5t47^6Z{T%AH}S6 zj#~3?akBA3H_#mx&VR7A3^Z7?-iKGx%(z1ic<-~6KgjBCPyfqO>k41NR8^8Ynv4X` zp=a(C^0(g7o?-ctU;VOlC1~jAxt)@&2VA ziVV&i>Kd9!pTD_rMCmS+{&kgM_Y1N8MzlKH$W)d>O_%PZg9G1I@zI#z^AjSMd`rzH z(hvh&pYI1hterJUkce`4<#FLDsl~WC%P~fPrTq8nzo*h3aclpIHGbU05Xm!|v01x* z((P8MG@B|`FnlQf>-XzHL4k3xMUm4PG}6YmUqZiQ5XG*hYR5E|1m?=%lhGwxog5xu zyz43>X2Nfl6BB48(Caq*RT~3#;+vUnCDI=E^<5hmN7;qSMUtQKCH@G^yWRZ3^}^U; z!Is+PQ$@|S@>^+^xAW7{KR6zK|M(11>&CY8G28*`^KEHGAV<@sZHM!nd6Ij(y3QMB z&j_~^vBD;!x=ZL2;e;3UDPnn}OJ5qbYg2`K@YUJO7Rwy=vzPLE3Z(y;H|{2e;+&;* z>$%S-c$rf@eeqyno4bfJq#^!<&b{Yr?TVhrqIvm3SXU*l{PAoSvd`=D#=nK-8{-y> zQ!gq@I44h}>5#*U0=}BCR#Vr-;Gwr1;5H|}znmg8onjTV2rr-sj_WDNNLOV+De=Tpe z>0v8z5z`JmIBAM!*qSXf?rRu@SJHZq;rw8ifSDO`2jsH8(s>1Towzb~?cO@a{cN~s zeY|_^m`%p)Vwc#8LQJ;oaBw~2vVhg2*5Sa-rHXM&pH9UdQ9>FXHqr*UL`m%Dek2 zAW9%ydfnH=RxWWB})S=fR*T}v!dt%H=j-91H5fGrhJ&G#wYmr5eNy;?7W z6U(ffbOZ6ksGK181vk$?GWj#5e2AD!x6)V4n?5iteR!*6U*MARCVvZ5Ng1npax?LV zM6=gy7pIvk>+`i_uSiGecg>Lb(A>}7J6Ae-`JJ5SbwyZTx=6IQ_UmR%nSVU_%c^Il z#u6;#X4r8?i{qoqQT+4c0-k<+hTl}jH{{+rcgBtUO9CBj?4KW?A9Bgfzwgpy<9sUZ zIHwAe+{s7~+93RV?Rrr+&KpFXDqi}Hr1{mIy%M=-?96YvZFz@>hk0H)%%)oyF zBfHAA%K>G6-kOW8t`Nth@H< znZ^vl?AE}!5~un*T?`p1AnSj}A4zl+PP~e{p#LcEmZfQ;YYbGE{t0p0!{MHHklR+^ znL?iqO0Cm_2IqZKePn6VxacPOUTJk#>dx&T>bcIq!Q}834X>Oxz0He~mr9&WwEc6W z<)EruMZpnY52UBuTgUQid{e~G`PlI2;4sPjVSc( z{PX)ewb7iBz5>eK#z|8qPQ8x_`^z4rAN+HJ{UfjcHY%k$FLLV)I7}LWr)^H!lC#-Q zrhUh%_x$*rnG5TA?2J=Hs(9o_wT$hl|{{`wWx1opH+&`BIKZD`bBlLf(`*AE|&Vzv{K>aHnuQ)VS*W->f&==abN^ z4ev1KGD4656*!51;&;{%ByA-U?~!OB$P1d&4^?Rfor2Taf z;WYyW)ZiWTD&$h-hMBg2aUu8b_w#MecYb|>T&kJpD_p3!G!-!~q7+zTe|2ZBFtsA@ z+)taK_GyGvLPTST$DvPBhYN;L5zr`H-V;j9M|)rnh=% zb4MWel}B}g%?u<#X4#YXE~Lqy)}HygzvC`pjC*Pot!cbDilVLgGkVBk0Qbjj*lp$b z)Z7whQ$-?`<@|9rRFRei4ZzawBd^qHN{%m_33xCqax*q(@w8?J;br-1V4n-*Bidat zn{CA2^4L$v?Pkua(;+!7NAy~Z4xknyOaH_R$F>L!Oz|Dj{mo*bJ8x`%uAy~hx44(O zckOSYRFgsB(2+Q({Ju=GI(e~`G8;#9^KHD~_tS}*iCnDP$yw6+>UU%;b;jqgBlewe z_Qz1#v`4K^F8*#hafjx}e|UoX9KMXQOZ1e^d91Ul-g!6ktNXL==O>r(cMiHro*LJ3|4=C!s^)I6 zPHJ5AsInWWUCd|wG2wINFwN4z`{cY}g{kn{bI8kXi*L66=mZ+ymUN<>962<*W4zh#}PST)jO>k`=>if3%jgO?%J`ByV?p5FaTnraWxXYy(BXYZq% zT^dguKyCH+OB@jhUk(+TmP)uWT`OD zmku?SWLSb0No1d)TyeA{EyXTw%Ihb+ndq z=i=!!Z>PMgOL#p^!~U(YaaN{J;~`O*6A^$rTd}o z9scoC1y9!eq|$F1e17sznf$4xXW(B);>BS(okF$wgSnyu2Bf=_*KXm&-;s)!WZ|## zv=x_*x8w$^+DG8$KVQUML&n1FS5&Tt>YMwlL3186g-9yABtJNthRi3eHYAP|$#`AP z9q>1PjB4bpr1ja%5plJ+1S*C$UNBG*b~vI@^zd|=?sR&c0u$o>(9XNIFwQhR-bZ%& zAB-z5f(}*Wa#j9UY}S#@ytRIc$jXt`{EW|X1yW8Y=hN}_v(FZ0?sWxVPbG5yX z^F`JU%*Rx(L)_cXk00Fu{SP=>xnpT%cxCy@_O3GjBr}<{X`W%I9 zP6s@HsM@^mbSm;P`byg3ccR83)a@V}=#oa&w+qwTX@uRl7^6FVJy! zS;v`?w=N^CK@r?2lT=PW`=V2QaCunOxoy+<4y=5ok2IS6bH5^$KqLqD89iV{j|)5Z z)3=3XnhL+BlC>aynC}a|V7$#mYJ+b4sSRA&*DVajS1)UCEy4hdtG&8t?9X+ybxJyD-k&<_V^uV z|Idc;AN5}0LWj)S`-tb9i2*p%v+~RL_6I(<(wJ_u6Pxz`c!@h@z9WzIGvuz$oH;Ow zcTenLkOlb9NRl1$q#Sz{-f?S}<>{|1MA?0*-A$>Rw}TjK&0vvY|A)P=e2Xe--yIO7 zltw^GN=h2(W@r#;kZuvByHn{D5GhINmKstzB&A{KM!JVMi}x4Tb^d_!?aT+RQHGh> zYp?aJ`?+K9{fp=F$SC9JPcGRf3zMHs?~@Nj9@yXAkmjh81-dnd8Nwoa73)mNXYi^& zxt;d=am<~z6)ceK@N~I5zbg8;J{^=}{MgltYYyS}$^%sQtPgzD&WK%O5`MoMCG$(= zZ#`!ciOdn)7UUb1%~)$b$Rw}H@EQ@UX=1)FuiF#0Tm~xrZg8z;wNW06h0QeDv@|EV z9A8Zv#X!NAzjNTxI*4!*d6W2R)xexREsWa+StgY0?uMwveJGzx(~XIQLeQ90B| zS-dGApU(3O6i-BsNx}Chahq(ryO@!5TF&Slf9`d~(?*M2k=t~>jRUdJtvQ^WaX#bw zLu#$MfNvBkNNsz6(QKBV?AgiUee`_=wvTd^z9TD-i{bD7Fi#9?96w|&h}XOg|9DIH zjuYwr$_&3#{*O8<<68dcUOgNWUZIzTf95swKA_ln5p51*KxLmw+r3jhO<0~L5Tm!B zxeY@p!bPJEi{kBEc1*sPp8R)P+0%+v7F0A7JK}SI*K|F4qmmEpfM$>?ttASL&hf6Y z8OdE%4vgyYih~|`HW_88l_JMPF)}F~UEiJ9^H#y0{NQ)iZJ1%2KetVGodwyC4j2dX zRPX+Fc5`m5YPIUQ4NC|Y;rTF?+22nJOM}z}Y8IeTq_gk-6$U3iCoaeLxiw^WqI^o= zyCiHkk`Qd^d_?f+FrT>DrE8Sq+=@NU<$@HPoRizLaITA(OyEU~iJfte8#_HOonG{V zh%cSmi1%ri;GzxOc|6gryHKH12Z%iO{4XB>%8VnWZ#2)Yw@%Mc*br2pA$aJ$gp15R z7QWW`X(Z)*I==VZ`N?ut@{-ae3I&|hi(oV@k=Ru@YlU9d`C71Cke2r)*W5XzL;PL{ zN1xd33|}KXAN5R&0CWrq=hMU}L$IfsRZl#vUdH{rS3C{+i6145qsQ?_F%nNvShnh% zLWRuEu{-@t@vh00+RE?h@v_&@X*`pHiK|G|i29;&y1lI<+2e8}iPO?A=XatR`%6pkTYwv%jzOtO7%oX9p-mNKa!~DTl z`trE*MYf&D+N}td1Fm_Ew%m-EuiT~I{n7J^yhJ+t{Xe-+DN<`TKA#Vp*-w?z{Tm&| z0PSSfoS{VGtEdx1%+_G3;fi_PhW625DSWHcruJI@v&fYbI5G83FU@Mj+J!jcQLX8# zjTp%h$P52?Dd4E>`1OjLW;|kSvie18Pfw#iZ7JJ4v_1h6F}VC@=mGchfirnj`(o7` z(L3LQ7v=VRx>ag!(L5MtU*E^O43mPjoK`dS>OaS(A2)CSVrn(@$5jZbprA zd_y{DYv}XrnZ}?^gLzA04L+8rybTi51g|6eiv#+WgRdHQ0L5C>DSlz+F!J z@5mucewKX7M3UT}P6IPl?ir}uFS&9+k|l8Hmz47picJd9_!jtK#1J>Q#=%j3 z2)uDrvEKY&Z;RiAm?3_iFZX<+UyefZ1$|hJkY*WvmKVJHx&3R#M{a%kzulg8rig4G zX5PFg)&NXM*g|TWSi~ku63h`#*DXEcviTiDy6h}%Cec=zeUZ$gK}suJk6Te!gDC>5 zNp_uPcA0Xc0C-B+Xa)WLn1?`j<0$7afycREWcRt(k4h(m)%4x1`0 zBmB@&TG|##sGYv_WV6-sAPJ89E}j%lG+Qhy(jPz<6;09Jw0S@c8!2+Ey^x6)BM?(| zxacP2E>F(a*sIJ8T7MUl&wN@kPWL1o%B>{%=V@-F1g$!k%h)^Jk8nXB7Jc~?5QAwm zt>&3&6lhi}B#~MMBV=0c)x5Cbn~#QHR1X*d9_zbI-0Lb>2p$<3#@FOIpR&XAy_5u# z6WQbTcdr4*0vWC@(qK~h4QN;wrx%;6^;{IFT08KvN1QBGXm-oSo2z_T#Fw&R7}%tb zzlq(1n@r}Ek;4BHCN zcT4htk@LM#IQ^^%cbxjP4To;quKG2zQfQW~*xsMxzuF%|h422GWgV?QbnBhn*1IR) zUBg0OK(H0*Tb!Oh`5lAv`)yo0%(F{V%OyF zr_b;fA|fTJ#B#~CkkpD+Zwk#k?Dk?xY1DE17K#wnX5SXxKoPLxxD1v(vQHj5sf7V3 z4)`t|3KhZA$G7<**aw{k`~;nvM5*c8**Tfi*LMW)_-`Lv zn?$UX+ER}sA`dP>dQ)_XcvhnF* zcSlcVSQYYCG!;Ee_|wlmeU^hr|bMvIdpN9)GP^~Ipdj^_R9v0^{vfg&nroQ6P~3GXZMN~bqbx( zFKloF;>V7UtVwKXNtyk6Y~E=q?-QVqURZA4!6!3SaL&Igytb9HAE7n8xWF)LD%}%2 zYcH7SEavGOj%)<<@EO*ARqNZtA`{^4%}tcF`bgs~>sMk(YyvnDuj2>00k`QY4|-A+ zxG|Ku&l)w`LZtBZrSmEliLA>Z{j*l{1!qjpRc7R5cqZ)(J(L-c?#gRjdRb6wg(i;C z3sP5V%<3(n7}FR(Vn~jzY~Yk=5VLywW`Se4?V-z_tLXcbJo)@KeHlQ{~;M&}L z!JR7rN!!F#jMmSPHgm?PNdfdK5RMP8U%De~1Uz@wLx!fIld-E3u;6{tM6-C-c9$6! z3$##kyrymXLDPx|Lw{GH z8miCJjn35tn&4AhK|oWcF(Ej;YA7YdtM#)5UX?0YRcs0HT~ldOJM3kn1vEgjCn8${ zpINlp?uD_`3FkRXh8EnKMCl1aDDD~fOY zvkL!OKq9WR!DSYfJ@IXrOMeIoTYU%ML>bfe(7`6Z+Ufe4Tj-45eIiHxAC5L%J)58p zg)UzPbk@x1#|Pe1p==*O--dzu={`WlqDAlALsqbJhO^y3(_z<{!by2D4M!>W_|V#; zBQi{FzwPsdps}^e71#Ir`(AqXo93@=ezr#f1t0eVNw+>3Cid+Ut)o%{jX}q!yiM?K z5ZPy;$uZwoek~E!)Sta`);#QsbYBKtrpF*^eXo3a%TUouf$Bec!!OAvyy=xcYj8&l zr6oB_-JHKJujrc%gPETj!jP{dtnvvwjz0hdE5U@kIUhQ)>Dbz#Ac)wl3-vvulUbm} z5V;9kTt;8UYWBp?bvs4Nlk?gk1C6xr7dmKGj+>?DVnT!!lJV2}?`@<~-qA(&p~7Ai zLpR&-+Df$s|$DN5=|40ksEzsfocVji?mgjKQF@N$Ud@xWn>jF3Fu_oCgI5qffq5Sp zN5sfO%*L#NT&(DKT7?Qa9fwWjpikR?bzgsulV)ShroNECOPl0@LTlYCSSG%6||;2{fE9^pkQrOh}+@* z?$HmO5}Ri$v3s-8B7JjtrbbajA#xU;1CM{>WW*T42m`HyZN2D^M3_v+6g;X=LK>Le zaf%fF>1ejcElooW>u2U9`C1m4vL#U||Q=qn3h7Kly$EqJ_@AjPDUJV$4tGnj3X#5QQ zn_HK+dM82vDc%*&%)!gXbujo1sMK4x4DAMwKjS28!!dWmGPnZPd?~pu~ zk9Lr>6fsFUn{q_dv_`asGQ~r~fxQ!OU8b{B}iqu{oR2wx41CFzt zhTW_hoNg*P$vg;utB(rk#~~a-Y0$&|FW%8|bm=CzP5T0NGH+ne&x@fz>1)mD=d*2+ z1bsy&E#7acp|1{b*Nb1N?iQ_*;3{Ne8%v2eCSVDH!LKUB)NGo$t|B_|HnHXrdIr>O zXq98Sw_2i2wn7q8n?dahqtzkpGR3v4-DdjH&)ZQ*PS!On;l!Gyl3S_W0CiILx%7zJxkfgW34+^kT z;VIjRRq+PlEYKo{e2?|*BS#l%6adQ;bTEnQm$2;w(&R9T6j%e@qM#4NmJT-TagEm! z+VjU74nF>S7GJ$Y+=7zCm){gXdxT?7HlYx3s$M=tsE4ZlWCF-7L>%31LJTatu7g-8 zQUVLYJly<&HY6tlT67lK=OF8AibO^^>pXP$`E$_Lo(?I|3>#(IFd(u!4Y+y`)ZacA zsV*)W2OkE&D=^&(weu`o_Ya(SBnhz}j?njz5Mp`3UGb)21dO8u_Xl1Y_uG>nguo;L z?IG7UyMszvoU=C!?e`R$xa>9QP1j>t8v9)dLV!e1H<}R$S}tIbAUqW90g5L$i-dIY z1$3%w6R^=#tso*g=kW;mq%qApa4w)5UXU|(kQsX)H!V_ABwhM<7fdM?l|mK3mWJU! zT0sOhg8xjv-q|>j0F4}^cE$Z8A(~}^9NnJIe5~{ODf>+ou|u=(HD{g`{JcZuUUseI z2U8nt8R@O<8;_cOSilDDnYa}-i_5?3*(!xE${DjAGIRR`l1(KX2J_Au#tRFi(Uy`2 zyF>&~&><-7AXJhQFpP&GMyfoE&ktPfKqccZK$0;@T!__5LWKS`SGj%?yDlo(DQ(!& zkt&Xv??E7^HF6Le9D{6y-Tr=Ta_-Glmmbg%u`fwZNXi9DMQ&4@_Z2k?_6A?+EB^fT zlIups&TDOK9Rq&Yq{Nd~ztrWH18_ppwV0PdSyYnr5v|{u{12dE;@e5iHBedd%^*qo zyUc2m{1M!+_E#n8n&MEDdKVWC_{^=R#Sg1x51hKo;gm~^Au2H>+@>8>fT2WX>AZh7 zb>9>@dpK_-LD}1Hfu@fKxhOZHZerOS{|En8i_40r>}mcCGyYr$TXh-E2A!G^-Ey6H z=tvYhD5%ZWuj8in&xB}HAzuiIs$8S{WZ#XOLjeY;w4v@mm|8D1cSQ&$^I z2O`hLBrC>acJV#7wMN(gtAq0R$vGIB-fumpzlA6Dx}SMma5`Hyf(d0FAFLocrpIR* zp^rM$h^={tZvQd+K&)ZW?9a5vM2d)YIbsDP@%P&-)B8hT8UaF} z$8wkp)15!#zju{mK?NAXPrrsQ7Z<@`;6IK z?9AphH-0o$m|ys-3%tS}gUi&q+C@xL1&=y83)kQ+ub4;1wZQ(g@1FSxKSb*tz=aEs z{ZD#S;2zFYpbv+Pq)uf|u?~0`HF19GwmeOGDvxpY!~9KDD}IgOpP?IXwlOg zSRv=ZoN&y?s;?eSSN#C-iqaLbKM+$qNad-|C4e4o{6m}OgWn0S=lJtXT0#D!6zYee zQEl=IpDD?CwMoeI=WgQ@&>)RbG4!ti5W)*d^O!Fr`4fYB$opwp_MTre-!!{X$hSp# zzRt^R*5Zy85eC#Bc;y309B^WL#)_@Vqr+gd0POnX{eZc|A9TW+`*vIo~`L$yXA+%DD1XxF8;9m^SQ^vqA8HXjhFmX z6N|3M;}|gmlSLr;A%@N7t;&L{n^W`G1qGigyK6-Mo#srHx82?OKuVnKp0qRc1x z0jq2E>@Bb#=Y^8=ppRY>1hC(X!Y`klGc>yg_{FLbq!758{M4BMP23__;W*iu?sNGm z>DSps149feOP~On*6uxVr#Qso=9~2YQ($QHd@TIyD%;Hh0(6!F!x3NexOsuJN9YeQ ze_PE%rKb-VFAD@a=b$sN4)mUp07~q@$wC%iIfme3;=>bv*v4XRPb0&FhfU1)aja+< z%`mc+0Zx9HVJk8aIefp+9;fINQM?4cEa$yW+jP&c*7i`EzC9mK$bM5HVo`0x%JbwM zL?drURF($X?qsI-IaPV~iaZSWuCmn+rzV0~5AWm~9K28XcjI^2RUMS~hWpJLN?18> z)FGg|ah%U%_FBbhwsvt`9SphsGiUf@Vi)k@Wo<@AgrAD^^Ew5%TRtigQpLX&P&&Uj zKr-gpWt^jnkOCtSSp+VP=5+%Tm94f53s$g@F9`j+dbj&@FKYU^FST0q>e9_6H3Z0h z?L0o%a)i?0nFJ}o5Du2N@w=QdK|1AM{VwDRIvJeF(VAIB3LQ3Le?9VY{J0v{l1x0m z8*bVqc%}xKr+4z%eMA>8h0pv2*loJ6{-M1%N2TthuJSZM@fTT6@F`X^KtqXlnQu?tT( zMvbl_xDRUL+tKF;m>ZMPw!i#t&6fOdUN9@WbZMqC4y+>+rbPh-Z` zNnIKEjUf%o|MnkaW>8cTf9OhL)WtC0#teh1bGxL>aYP9G4Lk5#Vj7qdpKQcMrpA8ER?a22DuyhyzL=4X`~Z z_m#gLP0_R8R7P#en~_`trZ2I#n9Uxn`@a`~t7+|#d;vM8Q25Ez6G$Yl$W4?qA&ZP& zIdKf42gUEvj8r!Dr>>oH^b@TxvjQ8h1{`#impbPpX;^p4^I`Ykn7mVS!L5mb;a>(vHA z8l=AZyrn=xa~Ju?)cVJF#mp0jwu@;u!3sB~Qy=G~UM4_WxaQ6vu8Ol^G|J$Nwnb$c zr&2KlVa1h$j)=tNJMz*7m)R=u43}g39vD;mSFfx~ofj-`iLqt;gL)Kw9))L~QU@me+eaVFjz#iYSm%+#q4p*1*>D8Su? zJTt%z`Z^gsJOAZDW?|i3ck55yFKD4fq2S~RO6SrvI}mv;IJV8DONQR8vHFCbDa@E{ z11^rbvUql1kA>l-YmJPZJUpZTG5iXkcDq778{M6k$H}TN3_v76$P3k&jzOuG_57y> zHeARzz)%W2S0(SVlAQOuJ8c=nLV8#x0OzbleK@;$3Pq>l_j`jPKJnhaNPiq`at`L* zo_HIss@57n{;G#DXecDfYkXmF+Ff(ENCI9Ino3%zZ@7_cW5|1CP4eepmsIr@$y5DV zxaUd}|NH&OSZd1XbGLoM)()iHFX3_qGepcT08WJl5*sa29k@_~rj=*ah|8*6KKIhY z?E)ljXlrk{QoxiXZpi;AN*&)Bny#IGHQtu^FCl{K;q7U%@b!|Yp)Kmn2s%BIeh39x zdJ48bH3m_f>8Yn(gH)45HZD^~^vbJCqS)YYIm(=URrnZM>BaZLmT~@BIPL36bTjH+U4Y-BB4FnhGM&FWhZQ#ihEyhn92(xVdLlnG~KcDQ|Uu^X% zS8pU&Nb(9duS6z!YAO+KeYhQ6wPJoE0_p9>%(jL{u3-btG~x(3>P;KAJ;;C^5Vz@CsAB8zWtY62K4uki~SVa2{$3S z719sMcqP0-X*Aj<*LId;bKArn= zu-aK+P^-zACK)n2O2?DFCPV(g%}ZZ|jKru%ePq^@OcvWbpyKTvKU~G40hUZWi)g@3 znJ#mbbp!`E^#QPVT$9;Lgx|T^E}z7L9gUEHok81zao#$@3Rse!NP=T!}e*lSFc$$fZiBOJi*%+hlQq<-_dQh;7Fb)(x%CitB(rg1emZykuj67Z5+aq5l7`+C*Vr)XiTFU}I8J`Uu#;#zPvmFT1l)AoK7a_tf0i$9-X84` zehmPEWVPUnGG~Fv*|8e+H5|=iyb}Gd-=GRng!uQ(~&}6D|gAn1MWE^U??ILSmf6hWF53`eA>)% zsDx8?|AD@XK8xm9Ia|_V!O_kjZ&_VJw<%XE=_Yign0xdl_W@$nfv+hSl_3&D^bM?y(#G zIU;HHSP&ilWB-2BYMX*Ce&t0s8L%-__)%65BP^O!-TUG*`GF8wB#Yx=Bd(dp3&8on z<_{<{_fF^IqOu@E*xy!h^S&6yd{C^vxWIY!+`4u=-iXT3LEAZYc!eW(uZca3O&i zuhI1Zvc)>1I0{58pwX<~_F=EykW<+ehHK(%A4%>-fX`(IpG$4ujTsNx``5KGiM-hsV-ARYP$ z-0))NKGggGZdSAPb#qg&6e$Vy&W@iRwI>aLbM{TV9vnd%=hzr(U%&|bbGfi zh?uiUxMM_!sttx8QT|j&P8icuEg|0p2>Z9^#KC=f<>31! zvMyIrnl22C59qh{q<-B0c*J%KEXGDj*P(0Sep!fyHCfjyJSH0ZzGk#nT~E{8Qoq8( zSJq!Je0ey+`~?a*x4i0K7Pp{OHv!;9&{)cdwDL z6>`6K5__8H920z1c%|AzQ9wBLae=6M*B?1jE;JC>XJ6WHxFDJqcRXreo#FN6JppWZ zrW@5sCqA=yKw2h2A34Bwbn!H6Tx6_+rRJuE~m=l0N zIfw7MGBp!*rMvW_HfSwS?z?76lD|sSTda4F?}{cIyb=)I0EK|24~(ieKs*pfy=$|x z1`Tk~$g2Fz8cppX@!;3eC~R;TA)oz`h?*x$c%6^ZGgLOew=ZL%?Y*UT`Xyg5N6}-~ zPEKsgS(L4%C1Sz%GJgD~b;HjWO|^jZrOYZXKS7WGB$!DU3;g6y#t(X-%oWJM-3JVh z9R-GqnI!sXIlfqt&w8=|ufy<|8Z#C%KZ{wr2YBk+=4!ct%}7+19(r7;whj_X%R}GM z{Xwb&8MKlD%yC?xVUoZC3f)@^mTp__hui?U2M;j)_KAqWqKP|HDLC|;`%jWqB-bVk zGdF=JEsb_HDqAMe-KquLHzK=@@~k7XoW3v4kB$RmQ$6T|$Oq54KslEXRtP2df}RS=|7Zh8l`AGRF;Mw*Wvxv`XP+ zi$7R30ky(oz3Ij%xu!5Q3@rb{PNOd|h^T{cCD9*#gbK&!*ZkMhhktv}{olU}4*&1h zfp@2rmz4g`-#q-FiJ{A)`JXod?s>3g|My*bY2^$4_l1&cadaC0`$FntIeg~-ec}KA zxc?g6|0jdVJc&W%^_#@iV4A$yvT!jAU9}+OfIq5tJm?l%D)bSMNB)#yr2^;VH=nsd zs@}#1Vi?;esmqpXpU5}4-+Kq@5?ns<85!z5h@IP7fDZ8SxUB~)P;cXoj*%H|m%8ny z7j<|x_@8MPlaohxn>Tkki&^1P##a>n;IJGj0H4L7=PHxPm|o9%JsE_{ECDPvs_QX_ zoPyMt(XcI*G;1TXvzE>&evLmeB!3?ETciKHC(X$>L!kN++`AGh0XH)Zuqc2<#bC<^ zxItQBhj0IxdD*=j(R<>Dz1RY_nsKG$ zM)yb}EqmzhKFQJogx|S0kCUTiMny|-mG$3=Bs_F?DFB!rnSlNCD}!k@G_pQu>1-I!XIH|RKLTh(>+Y<;ul75} zNFJCnz8RpIFJ>83+4AG%Tvd8SiJkWVx^WMKDu=I3A}_I%zbJ_BS&YvOkAB2-J+CTI9?DbCO>dlE2iHYbDb48m5d zFHV}lH|d>~KkfMGV5ux_^-(6VICAC=1yF5h)_FJB+M(WYE>7%#{}|oXUKvb@RQ-w3 z-mVhwqG$&!Bwr>@(mE@LB9DONCb!idgFn@Z<|XptSS4#W3m?P_fNw!kvrrj0C4dov z09bRY?%de+`=teZ=OL@0*-QzfD}ttT>$l;(>i2*4acXRYmeJVTuFmvIe6?{Kx9NfT zIkd$=?0l0Je|UZHyWHBg%?}{V24w==MnCFC)niaMn90Y`X~OZ&h5i%-%9H?PLl+Tz zrk+F@N&*54&rEFii$?2rlk6u|p1-RhmR>Ix=4P_|1b(TpT4V*FyZ zwtfQh5uNiK3tVSw(Ic3u6`vffTG0=g7>*%+`28nHppZa7==Jx#5OFhWdK;=6?#;m} z@I-_PbCX!D{1h-+-HZV(1it4b0SEy<)~v-}mSt-4tLW`0X=-JwJJEw{3C$M@xYJuSvM9!wrdox%2Y#2HXX`o!CJ({%aQ?vj5td zClVQCsDQRW>pW)zq-KwvnmrT+JPIM?>Kb(3d0}(>-xbX1%hd~^@nffe<`Zc_k(9_km zhtbR?pH>V^|As`$lh`2H7{>e{z=8}W1k?#+P2jTgk_jL}Y5VAhy!?gj1xP!5OTQL> zu_jWcp&K|Qobqi3$MA|n7t71U?+z0zK+D$67Hwn7xjC=0+J#ZzAqQEUQ~zQxHtQf( zh91zaLU)aXGDH%1GGJBjcY`7_1hrcX2ie5IeJk90x}-Ggg{PV=TyaweLR*UofYn&! z<^-ATy?Ls`B$UE~l}?wQ@<#tQ8>nlao~s zSPR%{TQHl}Y=7py*B%jcfQ|l;9%2aPqkVGFe|8o1nU!;gGSTe3H|3JaGL>?y_buVO z?l{>Xq8B%ZAy8S7z!QW@fp{!Xc)aK<{JGtVF5JfUNbJ)({VZV_#x@rsfDFL%lcIQi6b|*F&GG{KIS4HyU{?z-k%9ZH2$|8uH}!;1S3L zkC3KA{ZBysU?>|a0d@W zRA&(W#_v{SLA`;B`JpyDBqnPV%;0L~OWve73h#+;Drn}@00m)LiBfSX(#HN}3~GnM zU;)*u-AiuOEc|H#QD7tyJfFsckF6679bFq1>Th(^+MSs)8hMn%R#ustxw#Rw`j$+Z z+m2flqyl#HC-r0NP4@>L^ZUaDPu3lCkjgF)e@Rmv{cKr6nKf-QhgsD04#U4x*zo>N zxl_*m5?iF7(55@(HK8p@NKhm>A>}zQVSp3rtzCf6%zRE?T4x(PJ?NG8W^w7Mf1q`R z4T8G$^F$%eC{9La#x?z3uefGW^i0u702L#Yi?Pkc5uP-#Irn}#d@0sssj+_GnR`@f zt1p%$Jv#RDaAsZXq6u35%dmN)d{a%00u;uOpssgOQu!QQNkWUGh+|;G>*8ll zHjp&c#C_Ns4O@weds2W2T|%=QtG_Mf7-j|Fu*rHJafv+#`$@+W(wS-*pvMRnjNa|mALh1*YV>rsn{FP zsIQV3m#-ev93iF~F+TA2w{%omTz#Id6GsR5s^l(c1ZaUyKTZ739)omT>}0`f;3;XP zC8Y7&yV4}M-=C>g*(w`M`$Exq=HKfV@}Vzgv_|CHv!S(Nr};AA?-~65ZA;EiXH3Dw zW#_^D0Q@&G6StA`R-VC(==2IXd?o!33EXxcqW$JFo0R}E#O*`wICM4Tzpw;ueUKo5 zaD1l?VbxNuQW@aRIr0}4p|rIETI-=w=LHtJu5 zdy{=Mfj~&t<)IQ97|xug;z}qIbj*Qt(zqy4s1kb#%@6}_!Qzlbhy)$q-yTt!p;4OE9(zJyv|W#bWI zA{TM278>RBR>$^NyDdzA9pQztWp6+9YA&a`CzW)U62YAP>DIju2IgP8I87Dkulk2` z;S@619i7@k4{V#R63o9cF`SHCH_VCNGg_Hf(4p$__UZkSn;d1xr-JR;{qi#48ca*$ z4l$veVQyN~yAg9?_tnPCzW;MHMf`EDXpd}mApJTp*C40;4ZphU6iZ&4cEx(nt#^nx zCo|ET;U~Q1igSBDcdD}pWD%Sny@@4w%Nio@sc1RN$>;&gy#kEmxE7!YBU5nNxFA^$c~#Ud<|% z=C?B0HBCfRjMEh|=hh~UP?)-%2Ub4w)rdtEOrNcKcKLY9m(^-zoU3@EUw)Ew*Cir8 z2myYbSEX{mVquqjGRYlJF-P?W&3{F;sKj*hG?{xtHIGiWR8U^xh1(>_Rq-<>_&uk5 zya$xP`dmlA>`TAxl)8fDfB}az{I_-d*Mt*VX4oecfgH*t)n=`4Xe^+2;$3#mi+g0j zYscOYJ+GV7F;B-Tq|i?hvf6?OFG>2@|6xYewLCTP`It%{0@1tg97m|wn~KQ4nP4G= znHyib`J7|tQ8q$dlUeAd;!Y;VxvCWU?qpkQY#bJS!G$%-qKl(RdZn% zF;&|p-1>xxS8`$(FrI|wJ6c60s+Pq^GQVE);gY@M%gjw=**bxQYlUGJ$f=ch`K4$U z4WtVw6f#)$_A;|pw^vq`-`5Q;dgJOo?~e2`)IS_{30Mrii~3scQJ*H?u^w5kEph%PWx|HZb-OL?^?Fnl(N_`H|b1Ta5cIfMaS-2y+SLy1l9behXY2O-rkP+LKxZ3NqsCd zgyr^6wZD4qyd=V viTxF$wsKDFWE=WNFv{ZB)(gA7 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