From 0698727bcf762ce7a765098dcf36be5cebcca6a1 Mon Sep 17 00:00:00 2001 From: Andrey Kuleshov Date: Thu, 3 Feb 2022 17:46:45 +0300 Subject: [PATCH] Github actions integration (#1205) Gradle and Maven plugin updates ### What's done: - Support for the SARIF upload to the github in plugins (gradle/maven) - Updated actions - Readme updates --- .github/workflows/diktat.yml | 2 +- .github/workflows/diktat_snapshot.yml | 10 +- CONTRIBUTING.md | 27 +++- README.md | 117 +++++++++--------- .../diktat/plugin/gradle/DiktatExtension.kt | 5 + .../plugin/gradle/DiktatJavaExecTaskBase.kt | 25 +++- .../diktat/plugin/maven/DiktatBaseMojo.kt | 45 +++++-- example.png | Bin 0 -> 38427 bytes 8 files changed, 153 insertions(+), 78 deletions(-) create mode 100644 example.png diff --git a/.github/workflows/diktat.yml b/.github/workflows/diktat.yml index 97b331ff2e..0d04f84ae8 100644 --- a/.github/workflows/diktat.yml +++ b/.github/workflows/diktat.yml @@ -1,4 +1,4 @@ -name: Run diKTat from release version +name: Run diKTat (release) on: push: diff --git a/.github/workflows/diktat_snapshot.yml b/.github/workflows/diktat_snapshot.yml index c194575cad..742ab6255b 100644 --- a/.github/workflows/diktat_snapshot.yml +++ b/.github/workflows/diktat_snapshot.yml @@ -1,4 +1,4 @@ -name: Run diKTat from snapshot +name: Run diKTat (snapshot) on: push: @@ -12,7 +12,6 @@ env: jobs: diktat_snapshot_check: runs-on: ubuntu-20.04 - steps: - uses: actions/checkout@v2.4.0 - name: Set up JDK 11 @@ -47,4 +46,9 @@ jobs: mvn -B versions:set-property -Dproperty=diktat-check.version -DnewVersion=${{ env.BASE_VERSION }}-pre - name: Run diktat snapshot via maven plugin run: | - mvn -B diktat:check@diktat -Ddiktat.debug=true + mvn -B diktat:check@diktat -Ddiktat.debug=true -Ddiktat.githubActions=true + - name: Upload SARIF to Github using the upload-sarif action + uses: github/codeql-action/upload-sarif@v1 + if: ${{ always() }} + with: + sarif_file: ${{ github.workspace }} diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c7029e242d..1e7f8f390f 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,6 +1,6 @@ # Contributing -If you reading this - then you have decided to contribute to our project. Oh, poor you... +If you are reading this - then you have decided to contribute to our project. Oh, poor you... Rules are very simple: 1. Fork this repository to your own account 2. Make your changes and verify that tests pass (or wait that our CI/CD will do everything for you) @@ -8,6 +8,29 @@ Rules are very simple: 4. Submit a pull request 5. Participate in the code review process by responding to feedback +# Technical part + +Main components are: +1) diktat-rules — number of rules that are supported by diKTat; +2) diktat-test-framework — functional/unit test framework that can be used for running your code fixer on the initial code and compare it with the expected result; +3) also see our demo: diktat-demo in a separate repository. + +Mainly we wanted to create a common configurable mechanism that +will give us a chance to enable/disable and customize all rules. +That's why we added logic for: +1) Parsing `.yml` file with configurations of rules and passing it to visitors; +2) Passing information about properties to visitors. + This information is very useful, when you are trying to get, + for example, a filename of file where the code is stored; +3) We added a bunch of visitors, checkers and fixers that will extended KTlint functionaliity with code style rules; +4) We have proposed a code style for Kotlin language. + +Before you make a pull request, make sure the build is clean as we have lot of tests and other prechecks: + +```bash +$ mvn clean install +``` + # Hooks We have some hooks to a commit messages: @@ -20,4 +43,4 @@ Brief Description 2) Long description ``` -2) Please also do not forget to update documentation on Wiki after the merge approval and before merge. \ No newline at end of file +2) Please also do not forget to update documentation on Wiki after the merge approval and before merge. diff --git a/README.md b/README.md index b8d7429acd..42f8afa871 100644 --- a/README.md +++ b/README.md @@ -3,13 +3,11 @@ ![Build and test](https://github.com/cqfn/diKTat/workflows/Build%20and%20test/badge.svg) ![deteKT static analysis](https://github.com/cqfn/diKTat/workflows/Run%20deteKT/badge.svg) ![diKTat code style](https://github.com/cqfn/diKTat/workflows/Run%20diKTat%20from%20release%20version/badge.svg?branch=master) -[![License](https://img.shields.io/github/license/cqfn/diKtat)](https://github.com/cqfn/diKTat/blob/master/LICENSE) [![codecov](https://codecov.io/gh/analysis-dev/diKTat/branch/master/graph/badge.svg)](https://codecov.io/gh/analysis-dev/diKTat) [![Releases](https://img.shields.io/github/v/release/cqfn/diKTat)](https://github.com/cqfn/diKTat/releases) [![Maven Central](https://img.shields.io/maven-central/v/org.cqfn.diktat/diktat-rules)](https://mvnrepository.com/artifact/org.cqfn.diktat) [![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fcqfn%2FdiKTat.svg?type=shield)](https://app.fossa.com/projects/git%2Bgithub.com%2Fcqfn%2FdiKTat?ref=badge_shield) -[![ktlint](https://img.shields.io/badge/code%20style-%E2%9D%A4-FF4081.svg)](https://ktlint.github.io/) [![Chat on Telegram](https://img.shields.io/badge/Chat%20on-Telegram-brightgreen.svg)](https://t.me/diktat_help) [![Hits-of-Code](https://hitsofcode.com/github/cqfn/diktat)](https://hitsofcode.com/view/github/cqfn/diktat) @@ -35,16 +33,15 @@ Now diKTat was already added to the lists of [static analysis tools](https://git There are several tools like `detekt` and `ktlint` that are doing static analysis. Why do I need diktat? First of all - actually you can combine diktat with any other static analyzers. And diKTat is even using ktlint framework for parsing the code into the AST. -And we are trying to contribute to those projects. Main features of diktat are the following: -1) **More inspections.** It has 100+ inspections that are tightly coupled with it's codestyle. - -2) **Unique inspections** that are missing in other linters. +1) **More inspections.** It has 100+ inspections that are tightly coupled with it's [Codestyle](info/guide/diktat-coding-convention.md). + +2) **Unique [Inspections](info/available-rules.md)** that are missing in other linters. -3) **Highly configurable**. Each and every inspection can be configured and suppressed both from the code or from the configuration file. +3) **Highly configurable**. Each and every inspection can be [configured](#config) or [suppressed](#suppress). -4) **Strict detailed coding convention** that you can use in your project. +4) **Strict detailed [Codestyle](info/guide/diktat-coding-convention.md)** that you can adopt and use in your project. ## Run as CLI-application
@@ -63,7 +60,10 @@ Main features of diktat are the following: ```bash $ curl -sSLO https://github.com/cqfn/diKTat/releases/download/v1.0.2/diktat-1.0.2.jar ``` - +
+ +
+Run diktat: 3. Finally, run KTlint (with diKTat injected) to check your `*.kt` files in `dir/your/dir`: ```bash $ ./ktlint -R diktat.jar --disabled_rules=standard "dir/your/dir/**/*.kt" @@ -72,25 +72,6 @@ Main features of diktat are the following: To **autofix** all code style violations use `-F` option.
-## GitHub Native Integration -We suggest everyone to use common ["sarif"](https://docs.oasis-open.org/sarif/sarif/v2.0/sarif-v2.0.html) format as a `reporterType` in CI/CD. -GitHub has an [integration](https://docs.github.com/en/code-security/code-scanning/integrating-with-code-scanning/sarif-support-for-code-scanning) -with SARIF format and provides you a native reporting of diktat issues in Pull Requests. - -```text - reporterType = "sarif" - output = "diktat-report.sarif" -``` - -Add the following code to your GitHub Action to upload diktat sarif report (after it was generated). - -```yml - - name: Upload SARIF to Github using the upload-sarif action - uses: github/codeql-action/upload-sarif@v1 - if: ${{ always() }} - with: - sarif_file: build/diktat-report.sarif -``` ## Run with Maven using diktat-maven-plugin This plugin is available since version 0.1.3. You can see how it is configured in our project for self-checks: [pom.xml](pom.xml). @@ -256,7 +237,44 @@ Diktat can be run via spotless-maven-plugin since version 2.8.0 ``` -## Customizations via `diktat-analysis.yml` +## GitHub Native Integration +We suggest everyone to use common ["sarif"](https://docs.oasis-open.org/sarif/sarif/v2.0/sarif-v2.0.html) format as a `reporterType` in CI/CD. +GitHub has an [integration](https://docs.github.com/en/code-security/code-scanning/integrating-with-code-scanning/sarif-support-for-code-scanning) +with SARIF format and provides you a native reporting of diktat issues in Pull Requests. + +![img.png](example.png) + +
+ Github Integration +1) Add the following configuration to your project's setup for GitHub Actions: + +Gradle Plugin: +```text + githubActions = true +``` + +Maven Plugin (pom.xml): +```xml + true +``` + +Maven Plugin (cli options): +```text +mvn -B diktat:check@diktat -Ddiktat.githubActions=true +``` + +2) Add the following code to your GitHub Action to upload diktat SARIF report (after it was generated): + +```yml + - name: Upload SARIF to Github using the upload-sarif action + uses: github/codeql-action/upload-sarif@v1 + if: ${{ always() }} + with: + sarif_file: ${{ github.workspace }} +``` +
+ +## Customizations via `diktat-analysis.yml` In KTlint, rules can be configured via `.editorconfig`, but this does not give a chance to customize or enable/disable @@ -281,7 +299,11 @@ Note, that you can specify and put `diktat-analysis.yml` that contains configura See default configuration in [diktat-analysis.yml](diktat-rules/src/main/resources/diktat-analysis.yml) \ Also see [the list of all rules supported by diKTat](info/available-rules.md). -## Suppress warnings on individual code blocks + +## Suppress warnings/inspections + +
+Suppress warnings on individual code blocks In addition to enabling/disabling warning globally via config file (`enable = false`), you can suppress warnings by adding `@Suppress` annotation on individual code blocks For example: @@ -293,9 +315,11 @@ class SomeClass { } } -``` +``` +
-## Suppress groups of inspections +
+Suppress groups of inspections It is easy to suppress even groups of inspections in diKTat. These groups are linked to chapters of [Codestyle](info/guide/diktat-coding-convention.md). @@ -305,7 +329,8 @@ To disable chapters, you will need to add the following configuration to common disabledChapters: "1, 2, 3" ``` -Mapping of inspections to chapters can be found in [Groups of Inspections](info/rules-mapping.md) . +Mapping of inspections to chapters can be found in [Groups of Inspections](info/rules-mapping.md). +
## Running against the baseline When setting up code style analysis on a large existing project, one often doesn't have an ability to fix all findings at once. @@ -318,27 +343,5 @@ java -jar ktlint -R dikat.jar --baseline=diktat-baseline.xml **/*.kt or with corresponding configuration options in maven or gradle plugins. Baseline report is intended to be added into the VCS, but it can be removed and re-generated later, if needed. -## How to contribute? - -Main components are: -1) diktat-rules — number of rules that are supported by diKTat; -2) diktat-test-framework — functional/unit test framework that can be used for running your code fixer on the initial code and compare it with the expected result; -3) also see our demo: diktat-demo in a separate repository. - -Mainly we wanted to create a common configurable mechanism that -will give us a chance to enable/disable and customize all rules. -That's why we added logic for: -1) Parsing `.yml` file with configurations of rules and passing it to visitors; -2) Passing information about properties to visitors. -This information is very useful, when you are trying to get, -for example, a filename of file where the code is stored; -3) We added a bunch of visitors, checkers and fixers that will extended KTlint functionaliity with code style rules; -4) We have proposed a code style for Kotlin language. - -Before you make a pull request, make sure the build is clean as we have lot of tests and other prechecks: - -```bash -$ mvn clean install -``` - -Also see our [Contributing Policy](CONTRIBUTING.md) and [Code of Conduct](CODE_OF_CONDUCT.md) +## Contribution +See our [Contributing Policy](CONTRIBUTING.md) and [Code of Conduct](CODE_OF_CONDUCT.md) diff --git a/diktat-gradle-plugin/src/main/kotlin/org/cqfn/diktat/plugin/gradle/DiktatExtension.kt b/diktat-gradle-plugin/src/main/kotlin/org/cqfn/diktat/plugin/gradle/DiktatExtension.kt index 0adb9e78ec..b2fcd797fa 100644 --- a/diktat-gradle-plugin/src/main/kotlin/org/cqfn/diktat/plugin/gradle/DiktatExtension.kt +++ b/diktat-gradle-plugin/src/main/kotlin/org/cqfn/diktat/plugin/gradle/DiktatExtension.kt @@ -24,6 +24,11 @@ open class DiktatExtension( */ var debug = false + /** + * Property that will be used if you need to publish the report to GitHub + */ + var githubActions = false + /** * Type of the reporter to use */ diff --git a/diktat-gradle-plugin/src/main/kotlin/org/cqfn/diktat/plugin/gradle/DiktatJavaExecTaskBase.kt b/diktat-gradle-plugin/src/main/kotlin/org/cqfn/diktat/plugin/gradle/DiktatJavaExecTaskBase.kt index 6f983e5861..91ea183895 100644 --- a/diktat-gradle-plugin/src/main/kotlin/org/cqfn/diktat/plugin/gradle/DiktatJavaExecTaskBase.kt +++ b/diktat-gradle-plugin/src/main/kotlin/org/cqfn/diktat/plugin/gradle/DiktatJavaExecTaskBase.kt @@ -157,22 +157,37 @@ open class DiktatJavaExecTaskBase @Inject constructor( // appending the flag with the reporter setReporter(diktatExtension, flag) - if (diktatExtension.output.isNotEmpty()) { - flag.append(",output=${diktatExtension.output}") + val outFlag = when { + // githubActions should have higher priority than a custom input + diktatExtension.githubActions -> ",output=${project.projectDir}/${project.name}" + diktatExtension.output.isNotEmpty() -> ",output=${diktatExtension.output}" + else -> "" } + flag.append(outFlag) + return flag.toString() } + @Suppress("SAY_NO_TO_VAR") private fun setReporter(diktatExtension: DiktatExtension, flag: java.lang.StringBuilder) { val name = diktatExtension.reporter.trim() val validReporters = listOf("sarif", "plain", "json", "html") - if (name.isEmpty() || !validReporters.contains(name)) { + var reporterFlag = if (name.isEmpty() || !validReporters.contains(name)) { project.logger.warn("Reporter name $name was not specified or is invalid. Falling to 'plain' reporter") - flag.append("--reporter=plain") + "--reporter=plain" } else { - flag.append("--reporter=$name") + "--reporter=$name" + } + + // githubActions should have higher priority than a custom input + if (diktatExtension.githubActions) { + // need to set user.home specially for ktlint, so it will be able to put a relative path URI in SARIF + System.setProperty("user.home", project.projectDir.toString()) + reporterFlag = "--reporter=sarif" } + + flag.append(reporterFlag) } @Suppress("MagicNumber") diff --git a/diktat-maven-plugin/src/main/kotlin/org/cqfn/diktat/plugin/maven/DiktatBaseMojo.kt b/diktat-maven-plugin/src/main/kotlin/org/cqfn/diktat/plugin/maven/DiktatBaseMojo.kt index 617e8a4dad..df2802b59e 100644 --- a/diktat-maven-plugin/src/main/kotlin/org/cqfn/diktat/plugin/maven/DiktatBaseMojo.kt +++ b/diktat-maven-plugin/src/main/kotlin/org/cqfn/diktat/plugin/maven/DiktatBaseMojo.kt @@ -14,6 +14,7 @@ import com.pinterest.ktlint.reporter.html.HtmlReporter import com.pinterest.ktlint.reporter.json.JsonReporter import com.pinterest.ktlint.reporter.plain.PlainReporter import com.pinterest.ktlint.reporter.sarif.SarifReporter +import org.apache.maven.execution.MavenSession import org.apache.maven.plugin.AbstractMojo import org.apache.maven.plugin.MojoExecutionException import org.apache.maven.plugin.MojoFailureException @@ -34,6 +35,12 @@ abstract class DiktatBaseMojo : AbstractMojo() { @Parameter(property = "diktat.debug") var debug = false + /** + * Property that will be used if you need to publish the report to GitHub + */ + @Parameter(property = "diktat.githubActions") + var githubActions = false + /** * Type of the reporter to use */ @@ -80,6 +87,9 @@ abstract class DiktatBaseMojo : AbstractMojo() { @Parameter(property = "diktat.excludes", defaultValue = "") lateinit var excludes: List + @Parameter(defaultValue = "\${session}", readonly = true) + private lateinit var mavenSession: MavenSession + /** * @param params instance of [KtLint.Params] used in analysis */ @@ -106,6 +116,7 @@ abstract class DiktatBaseMojo : AbstractMojo() { val baselineResults = baseline?.let { loadBaseline(it.absolutePath) } ?: CurrentBaseline(emptyMap(), false) reporterImpl = resolveReporter(baselineResults) + reporterImpl.beforeAll() val lintErrors: MutableList = mutableListOf() inputs @@ -121,16 +132,30 @@ abstract class DiktatBaseMojo : AbstractMojo() { } private fun resolveReporter(baselineResults: CurrentBaseline): Reporter { - val output = if (this.output.isBlank()) System.`out` else PrintStream(FileOutputStream(this.output, true)) - - val actualReporter = when (this.reporter) { - "sarif" -> SarifReporter(output) - "plain" -> PlainReporter(output) - "json" -> JsonReporter(output) - "html" -> HtmlReporter(output) - else -> { - log.warn("Reporter name ${this.reporter} was not specified or is invalid. Falling to 'plain' reporter") - PlainReporter(output) + val output = if (this.output.isBlank()) { + if (this.githubActions) { + // need to set user.home specially for ktlint, so it will be able to put a relative path URI in SARIF + System.setProperty("user.home", mavenSession.executionRootDirectory) + PrintStream(FileOutputStream("${mavenProject.basedir}/${mavenProject.name}.sarif", false)) + } else { + System.`out` + } + } else { + PrintStream(FileOutputStream(this.output, false)) + } + + val actualReporter = if (this.githubActions) { + SarifReporter(output) + } else { + when (this.reporter) { + "sarif" -> SarifReporter(output) + "plain" -> PlainReporter(output) + "json" -> JsonReporter(output) + "html" -> HtmlReporter(output) + else -> { + log.warn("Reporter name ${this.reporter} was not specified or is invalid. Falling to 'plain' reporter") + PlainReporter(output) + } } } diff --git a/example.png b/example.png new file mode 100644 index 0000000000000000000000000000000000000000..272f8d44dc595861c1551a775c63eba772a39c60 GIT binary patch literal 38427 zcmc$`by(D0*DtQ3pdz9mAg!dt&>^i-N{Tc?N#{^QmxxG%bPh;JhvdLef=Jg8Lkt5* zH&R2xZvefY`+e@`z0P^hb$-{GKN$FacdWhk+G~A2Ywu0qYXxb%+hn(|T)Bex>ZQb+ zD_3wtuUxrWeDfOS$(NzorYl$8U3n$(T*XCqweBR2^2gikRK2~)sl^&oqVj&wep8DR z!qx6+a|vN5BThtf%k!{bf%Hh$ji#&Q*I!c5>OW_>5nfo~H>dh(HBgD}W~D)`{@&&~SbyZPURRa@N(0NwxVW7@GDMdF5yU-j?LU#9~l z{(P)j0tvJ4hR9(=0WUsNl_yIDKVAx$tPzM?B>t-<^6jpg1^f`XkdV~wTmx;GK?4^Tde?_X}*tKh?!_kZfLjv@AcV zb@c1(pj~0o$bIX~?Cjn}&jsn?I9g98lXZc4mfLhN)oSa?BL5wX0_@Q8r|iexUZn$* zDe+c{=tJa%Qc8jNfWEF-vjJB_x_jV=nbjA|EoFFW!u<W{xgs<|Z5Tq?_okoI6cOFl{0ZHb;=p64Z+!T1;p*!*(X zWYU!gC5lE-GaMp=J*<52;s`=-L1?Nc)j%QzXG_g~H%JD_ zd%va)3{8GPcTmL$%6|L!qW8UMPr2Lm(qZ>>yT=T5x(~|BMlI9yuFb6{yLIRa|4Ka8 z9HgkO>R?C*7UOob=zbiXqz5`~Ll%CUIkM$ty(`ihTCJ2W{ia25nLk{w?5C=Wd3rbzL zEM{}!(8`)>ZE&s{N4?S!&R`H@*jbI?47||#xygN@%uNG;iJ_}RnZmZFOx8=147(s~ zGHQ@Uqo->BQhhPmVwicAd`V|8g`mv!7CiHFrbgC4lDQ^UmPGtbq}CbYG%j#HZjsxtz@?@>LFvE!4bJn~Z=QCmy0#1ul_ zRoK_lbPe!Ip~RpSu`?~mA5Qr2z>wy)mE+0|yQY`ZifDTh1oA^W#T-;lMqIs_to)Fj zSXJDt8hX~x^04=#uA7={5IdAoh72pE{BfORH>c8`^>g;y3h-um;10v5@Q|Xf;}u_v z^!tsg>pqiwDe~iFm^g}8fw0+BqaGfOtb!HT$9wW>P8u`kEL_c76M zf+rL-t>5%ltz^<)Gh@uB|JR~3QHB@ZoD=lQICI5V*UCm~@4Ep)6ho?AY;o1~ z9lt@Vduvu&;a6HBMD3~hE?m9E&vlC6Zr-@^tbikx(Zl;jPa;%Q=^YbqB|;8KX=BYP zl63B8L)3m+B@bX3%QE~ys6R6uP8RuE6CxI`CYv6nT2WZb6wW!6og%SY*qm;F zCtwO++e>xfGKWS@TsTYeq@J`SHPK1FY7=Idd{JsG`rtd^wadv+2a~@dK4xXd&3^B1 z3Opv#@G2>IQ2}1jc7pK)w3l9?MR5?Lwfx)08|C^|>+&LnPr#*-)Azq_-859E+IcYl zPU`C$u$5bMf@B_N$xO_zKEL-Vw!Yh6nH0Gpn<}t4As$g(sSL|98Wolsond&bz_j|o zP~0yiRm#KnUPj+$Pw)g>`wkj1IbCH4X(aCzl6(tZq*DFWzuj84Dr?ifR^Ujq%JODU zDvMlHZv7q!&Ha$@p2cIBLy}SK6_3Y^C0906HvMyT&Nw8MP*_sCF4{ zhcMAiUJ81^O&FqDq6uEPQKMPQ;-yhY0QCHoJ>lW*g%j*bv(^+Pc+t{EVl3 zV+!Crk?Qdavp()KAwD?}qf!Q*TgOi1c}o$uBX~)J8SsaPQ zQ2k1{b~yavOVFF6Lu@yty)cWZEXT>~<9X4cdch+}&qggDx6p|&_iN^FS$W(J8yd>W zc5==g>xzrav&Bva?jFaER1{@nT!$EAROF8OXk|M(b?wwo595Pqvpef5E=lYY4Co|6$&NX}xmoiM?5UgD23@G)HSNy4S zv&{B0$wIob3N3%(5rclnGf=hVTb}QA>pyh|tBGBY0ocsQIUU>;a=D_F2$zv`ZdHsf=TP-&qz6u&3*dFot+-2xEwqmO4 zHE)bCX%PW=aGOKu3!AlcO)1Q>^&2-sbU_(cCz!f?cxh5Rc51DZtf9qLV<|j1V4#6+ zO~F+KnK=Y?&AN{)F^t&hRmN5OU~QN9q1E~DMsjxB+o-8I#riDEn?^sE3xbC&TvDmiJxua)yKVE83VJSoVji`#1nX zlxO!GrZl#-i~!C;E45E{#IT?x>MiTQ(=4wU%z5`45WS*y17 zbN7P9Xb52Z_%^)octzQ}VQinE_Tby~jm}M)S=6tp4p%+oBdR2QVS+|BD`9+R7*#xn zP>(0rT|snliYC>@eR_6@wNBpa<>^vfBOhmSXl%a>w%*+$W&qbiQNH3Ns-Aacwn3$C zaGL-Lg1tqr!*pqD%vc#16geoP#LV&!T*l}WZ8d!xo zLyzRm_o0IFaRrTwl|SkNcm}k7j9bw^O=>~>>WcY)66Zv|*7lm9lV0086Pgf!^$^h={q|VqWsF&SWKIq+sfAQC+HoxKE1$DF%2>cu81}gk*3Yuf1 z{-%JExxZ;z;{UiBQW!>gwzU?x4EByeC&%#24ODo% zyo}aEk^BFW=+hcGsw49aE315J=r4oTLa~v@kuniEdD2fp&i2u6@H|tLwrWmF`)dXg z5C*9U?zV-Mll-7p-Poa}rCKBYxf?Dd5uYT=^@5?=m@M#eCNVz;tdUYst||(zc?2@m zRkaY{Su%sb3rE2WwP#b<^Yr+AH5=8SIo`=7Cw%;+z0BvW-p4uGHY~B-MGhTS5VT5}<991l~p3|I*3 zP{drtdoAyds;NFCR|6@8HI&Hb81!w1OhQCAJ@l{AWuPM|=yycwwE@>JZXaGicJuIZ zs2cjra>hQ9*xlZ>x^7;1O`UDZQGNF>#Z0e`A^yI^E&rZR`X4Ou|837;8U-(`xr)go zUin->D#)=6I?pOzF?$;TI)C^X@CbGT^Zm}^IT-i+h4oc9;QU(!HywEXZHD{1pw>Oq zdCh0QXO{(s-Y*iL7Z|&CSulqf@BpQ->bgS?o!kyB)LFlq^K_=>ZgI7>!8l5rb6%SL zyl_H7AgG3qk$VJ5?TL=B!D8+aQe+j`mk6(^u;>cc#S|%LFC;*rt?Cv|MP_K~3NaCB zVia1tomt~}`pBT;3yxoS!^}F1B$qTrCtD_=o0AAtvZ$87#FMABY#XAUNvlfLW&0PR zsz8>)LE$2vXKU@vnU)Tc>BthtV1HdZ{vKKhIi>}7|5VZCbrx~1Nq4K^nnOLOMOW~2 zNuNreXlDHT?<)h`Sy^*mdI;W~kMi?axePe}5zHE|BP-`ev&EA(T|@u)2Nb%IrKT7y zzB_2$k%lr!KmpH3A5_F^;N2LtT)h|d{=4iOG%IFE92;f}i*volFFi$JUqPQQ=}! ztL_=X^<|}#{C$}0ohG7X!|kQdLS-Hcfk=iFuUfB@mJURLtJ|8m*-)WXc+OXrLhbz6 zLxyhKF_T>$A<1_|t@vVfELATWb?z4IF#vjDv4z8Jck$8biw_v4!HNMBU;IwOa?)N( zJ>oe%a9J*g9amt4zY=$FAH}fUpGN66mTQvMvQv5#xohaEDWDva*UT3Tnwv#H63JSr zsC84UcNSpt7-@5(Q@*tY#tPYSErf2`xZPms3hT~x>S5oHN|+$5+40~~^VXM1mQNDT z2N}CZ-VSZgYO*784d0}R4aK>1`h?G8NKR%an)MdHd0c-f&Dy_zZVBJjv>WJ(FD+R8%L#{;){Gp&9nS2i#Oj;ST+ZLMh zjJT8#{sG@{Nkr+msSJyv6zrOLo_4 zNUL3c`qwP6_TTkGcHrMK2Unt;P>igms zT3w;^jLK3arJ`fe91&c4A)d#)JUIXRK%Ws;LRFS4NZ*DG6;yE}ZC{m|MIoZK0wY`D zkpI5J3`NAcE8#=ZgD=~$;H{`$BLn5!M4h)mVhiQUojcn08F`}#_r|VgH8UZ~xgmvt z=y>B~an`Qt)EYjT4_)uK>F>74^@_?qfpxq842wqwPxW6-0x$MAAykA}?j;suXH|si zoGD=x*Y8R2`VcXt62rH z57Xd*#oz-uvN9SCLqGFDuor?|XRenGzSbI^5fx(&5n?ZtoKNPaLgg)}jS_P3Um?1m zC#p`E4=UqAlf6HL7mh5>{UB%{!6YiCBfl(Ew5rKFZ&#P=S+`rBdvQ^W%M9v6qusgq z_iApKyc33Xs}UQ8^L`>kfQebqAF1Q@TPo5F#kuD_h{P!jVX^-4URvr;aih!lGrqp0 zgG7!pH9r{8cs_+7O{UCSn`hekq;mQ~lnjL)+16?l>WRySbqy7x^MKxhi^-g+X+dT2 zS98cwWcgTwOhKkmjk-5$1-B8zQqW}$&5`|8JEX*L(f84D!NGy_3;A{vd=@J$%Q$^c zS`M=r$FB{9-$yO8yUbxET*2d?mTwZR?vqpou3gq!o?XTXVh0wx4a0XKAbJOZb zNp^QG5EEiMG=}2zvukkxl(SjJRufi5@b={ z9Pccc-If$VNwp#Q9d0f9I(#jWBizyLZH0i1?XL^l@ich^gJ5+nkQ-giPbnxOn|R9_ z-ffaSk;oQVx=LD~~wni0JW#Il94Jz~l$3 z`qC37NoCkL#pm!~@Czn3Y1j+mX-u-RRI8*tA7`y-PxvI_m@nMZTz9{K0-?EqDRw2s zWI_U3G7BdAO7%+>O>P+a(>PcD^u<_WwJMeKi3FBL)IlFi9aAvpi3F58=)k}8cmpDj zi(nr~>ShT9ITXy@lJ^S2ynmFrdPSQVstbIIxgb?GOXB`oq~TXJ8HNRFTT9%^20)fKaMd0rx2G>=YMuxDI`QWSu;Q{z$2+4Lpm~0Bs>y%9*n=;fiuGk zH41Ir*}P{jkY`pL28zwawS>H4^|mBAub&l#S$h}nOrkOGE`KBVA4AT6*Y^K%!V^P5 zI5_hoGtw8EpPfQr{T-A;)CHhdjku(^$QPHyw;=YCn2!)&@@|8QOV-<5`RTG?{_liB zrQc;i4ZtOfDgpd1XfetKw_e~UVbxC89$s48-JPG7hndRn(Ob40uZ?8(7RnY)H5?*K z=!Gli4sUcqDYh#OZ&gF@-)CXJqzG!A7?a@kuCx2mWaD&zq^zrUiRy6yAC32QA-v)B zCB~9uiId2=jlzv7^xUwGH|McPq#LbQQ*+JDVY7vj;&gg?U6z=ijtwvJ zL30&^L}Vl{^471;*ynIEv1YL--ZrBD4skqN(g{vqtQ@T1VD4SMrGtAG6ImfFqLxB$ zYm?23q@CJ(QP*6VX_~OEC;5oR!0?YXTBR-WsS0zXNw}?a|416rCQ3SHZPL77?X~I8 zDEWY8I({eB+=u8p7T1@dz`{0LRR)%nx<`8*p@Or3vSmKpVTl7rb2`TNmBQaUwlaie zaKC7E^y$)ml2HaQdMdjcOT_r;`Tf+NAYebPK!{}lNGN&4^GEEp46hm%Xn^!T%e44O zogC2LOdfnm7aE2X0lcB}buHIn>@Lp$*2L#EQ?6YrwD8q5s+3J`(n(nPnD@~HtJc7E z?f?^MMhS*#FuR<3kE82|UFTdm&$Qx;qm7F5Mn(NxxkpSnbsrsO;qAVd-!K=dyDu)$ zJo@`6LcZ~eB-EE3boL^!L1n)C2Y1=7T}j2KY6WmoQ7q+Hh8jEzUbvsln&HJ4Ihs-7 zLygXTs2;~&)bNtuEGkg((Hs*g3cE=5^4~WtwGMWpq8UlyBMT;c(MfWCdf*myEqiSF1yZuOuLPOycu* zj?kdOs&3IK7L(sFgcrKBG*L)F=bgXP{?vK0$z$n2Q$`vFinAH5Z}CLGN4~g!P>uT# z>qiqdb{<$;WAHi4H-N=Q5|WQQGfgkI#}^T6ahl>gRJO`W3qczBpdZ_u$#%Ai0EIYo z69o@cL#_Ib#(<6=#F1Rn0}!?#YapwKTWp;d`33_nQ;OOvI^zOBC%V`9X=tX$UtXp{ zhe}n`fhV7l%>>nJQxuX=EU{H(zfc^8fL10We7T#_&?V&uLA*^B!p(P#6m>;on4`F8 zsR&9k9IU)@U{!6a#6j%AhQU#mm- zg7t4_OE=U6pnk|93^DesA~h4A!ts-7Hjuie|O-cf2g5F4rw?`0N2&x)`(asiCn2gp95FxPeex03BeFvo2`8 z4nmcL@0CNcE_>(x{e|C$hYDgb=$Ws8pTtIc(+GKN6A<{Mk^?sMW9uH@q}fSA=`(cn z+4Hi#2^CW5u}*W`QpUZNkr(`Ia?l(D7=h<%5CBM%Pbn(})$~=ja%E#-D65vM=Iq@v zVjy=Rd*@Ja?5m)5-JGaXfifHvI&Tc=&WlVel;O{ciLd)AJ%TdR<`sHhK!U&l9O# zfBdiZ#P?vro#)hY>s}CpZGRV{n{R_^2IXDyf}Hb_?HZh8A$xe#ZmOh5AVCJAADbvD(0~i5`U89WZu|GYOq13oEn# z3bd>jf!0q}&B{Yb1n?76tpSMv0X3Fry@!}{KrckN-!`RI&|)eXkpIpm4wZgMN2V46 z_xV@W_sNM+UKsg~PCQM(N0>3~tqGih|84JKXy6{&;=fb{k51w+w4EmrM)~o!SrV`5CI@O*&^6UN9?WbgUYOe%h!5;^-GDW zKXaShm?R7X(Vm{32(Mfm4Al7z+q5dR!AbjYax6`-`+!*OPyaGIo5RMdq^K~$iwzwE zhQIm=105adde`^jo6givIM1HgU3O9a$KFRH;cK4*K-t)b>}?Gy=w`*E6OYO^#uO1A z0Y104$7{J67_&&)UyK(rK3^!!=-+1!^NoY0pw#V)XkV|*t`FOub#-UZjTUd0nJ8!c z6KGBO-YWOWtml!EKzn zv5T%n4mhZdcrtAMdOJ7TOzS@>Vn16K5#f-L5oHq|NDmbTTs>bm)_-Zl0-OY>9a>sD zsMjT(3c92I)Luf6hJsRnU(nu*wcA=O{-I*r_*VJ#^VL51*Q$gsR>rc|$`2s-j*b}g zNK)cB*AGhIUG30Tf=TLL2jD?8Fn0Xh$_@TFpH7nuWWqv5IDy#VukX$H*;!el`;Rt# zaY>qFBHt)e-xiImBDzRF3vq+>2T|A0IYeJmIS33KShA)%m&}|7+SaD#UpZTO{%-2U z?<{rtmkgjJ@f5SDT$FZUwc-@j-SgM4X)m+hc}hNueBvfmY9aaekryO{<_~wwd2`u9 zAJ2bB7U39le?~Z2b&@i8&f;oJL(~z@dZk`nC_%j?9jI+PYvbz2v2PU%QxsI=~`};OAhA=jlSN)-gS?2DJ`;An*Rh z8~EtFZe3F>Al+O#aOOM_ZQXW90xBQ^+^EKo%o@k6_{~N1Y?vyymbZAcEO%7(q@4dd zV+EzxElD2(7201Fa93C+^u*GnCNfZJS6S4!-Ee{6St&&agK!zXoj3O!DGlXTkd=gf ziTC3vI~V0cHb`=y(d_}mxUzjLwM)+t1jKbjO!i;t4kN%Y!()90%)!26Cx?cb3Rt-c z7#ODclDjiG{j*#nPr+!ePNSv?CF*nr*^usl)XFJ4jg>NUipKObk5%{pwT#2ig(y%j zP+P1wDk)i3Yc3F9i3H?-bS_YI%DuHR0^3O)jZIAM$pfG|g%tDTiwib%hs`hGzxHrc z3Zn!%cyD!hb%K~v61b;dYCMGQ@sC`SOfa;cg7x$eEo(rqu)RuB<XJB zZ90dpt8dT=ar`y|Owm?i3<>}kO{E)=Eb?KFK$_DO5 zNfc&1`cZ+KKe{8DGuIpa)#!lzqlQZJi`|GpDb*y-f$e#L12D_b{YA|82z;kEJ=M?7lV!7Gw~cWdGO=gg5&|9vPg9F zg!!w+XbkE9?0KGYm>C(^n><}ClRs0aeA}g3V!)Opry)5D!|c!m7)XvJo^k^oF&4M8 zK}IlZ(zw)s45DBi>Ueuj4aE>eV9IA`b)S%xlaVm0+6YaXW!cW=?wS>t{Ao^EihHTd z#NYl!)@g!OFGIw{3l$+nl|q8D9Iy-|hM!sSu9EwAmTR@j*I#x9NNJ^6JgOlgNF)rYuyG$yw4npS-*P18jbTPedvPVi6wo9gBT1^EO?$y`UV3kx@1X74bft z(MJj6=FG^o*kMF^{7K&z`E&p*3>8w~{DrEeUW7JZ0&zZu(m0-z!+5hmlKxc6rr0A3CG6S>Ji}MA0=XM2x28K!v z-dIRLN8`Ttrxv>Arc5ty@nK-bw?P^XX&F-{^S9ph(Qm0%=-pZZF)HEjzN7H{n(45E zf^~|?A+A>E^(;3TZT{})>sd}15w7=zNF$` zPlS8z7SbCDZ}7F4_=4V%C#;(Ua3O{2#CVAxvOL$fFpWztTSP#X{gtw9MeVK&uGqYK zd>%b=#PcPfgzi*By)a1kcqKvuqbp|yTylK5d*RA$RPp!1Kv-pO{S8lddiE{es2_Uf zH!Z4BP~DYs58Y6`B_jnzYj+n)+)M1Oj^ZQV9-Ls>X?e!(2HD~Bi0uRSrOXmZLA_*W zvu|v(g2+`KLO}QZRLj0oV_(}Hu2o({3pu}^98FKi-_E5yj%Yb}fYDc`_X7AlFy(PD{+C%0bY`Sik<3Gc=O*a;dk z<;=&U9v83P$84eiI$`3(?C~7+F~iriAEj6&o!!7Tq<>G1I`sbX_<~7&yRI(kDHnTZ zt^3o!qZRU36R}{EsGd*haBK8QmeuW;VTNcw+`>pU!KW%b-K#JF9*ELwc#vD(JH zM(H6YM{w&Wb8_J^+rrxqaDBb&o)4LK;TE>wXicXm*(ec_rAn;=8u77~f($bnZ#O8< zJNCA8EENp!YIfC*YZ~4b?Vt7MKDmK$wno_LNP$PGK$&g!4+n5-HP$3QGV($(<#`2t zixw4uD)pJ(fLcJP1QbEnnk%1U>eh(K`7mKp?AdP{N44~~ta_@t%!Y&{0fV>>V`@+F zaJ$sSA(&*cFTk!h2l^6M%;16C>d8Sv^G38Q>Li?M-a|B>L)N_vaA4{`)k)H0E2++jH#kj6*CPSsITomxGPICWm=&Da-LPbVrG4LIiduB5hf9n_%mgQGCT*G&7>91 zi&IHBtzq>J9gujpo!^ZMVH)Q(0k5o|ZxCFG2Ze9(8pR+>LIdoBiTak*=tU*xh^w;l242Ghmp zG0Hlx)I~(?xudkv_uM)EZ<@&eJ#hkbk-bt*l9#NgIcNzZ^yLI{_)Bb!wiVs{O{F+d zOn*u7>7^+7D3Q;lT3ND$zWf&cnZxRSwvL|e#WkWkiK}BLtL!L4VVVOgBlYXQc~AU$ zw3_%OnC&h(&gY*jTaTbTD`zn)U9p6Y&r!|XZ#Si_!2sV2D>$EdvfqjLFv}uf^-QW$ zHITQxDDz#-5bb{>c^}24%mD+RF{1Hcc$OHK(<%-SRah}ra(0s8fF-`JcCMLtXCwHU zwKK{_bWTl#@%MO2qA?Nyk9@ znU3ya*q7yPG`BNqvrEZ2pJ9|m0S@0-f4MkOpg>vtmOhzX3wU(i-uY+! z!I9;N;^#aQ$arPYF?*5km7xVP447T^i|fuFXE-ake|ah}b`a8Ukr)QD6wK-FNA9FT z$IatzM|mK4MQ6jsj-vNn#%FP+%pSeT>oLRQ?vQNuV3O8bQv8J=IdLifU!>ab%eY~7qcza6x&Q*>WWr8pFdc~UP zx6yq$_Yc7#7?svpKZ4?UR;ss!*GyX$8Z4)Jf=ToSoTzSo@|INh5bn8lU$ehJAeZB$ zv@l10I6029{#KF2O-bz1irxUjp`umXTAv3DHu04FE|7jB@d(dB{5bqO?`3UOR#cLr z@Dy6helmO!3&5V$drKSgo4zRI!RLhYRu{zYcyx3Yas%dJS|#m7inOhSAvBcu|-f4U^g?e`8d$1^Mn5CJpHf> zzT8u%V~NV&H!3gIEjI*ScruQ>If|p>zvElCuVm`f(z?6K?a{DZ3oj2L+BW{sGe^%0 ze<|5=UFz9q-1yXGdYWAhu?17}L?jcI5SS2nZBE=*|5Fyg$?%QA(0n|ABrRq#lgDHi zyOoamURfibE4LAI+>bXP>y{~Cd$8kkN0SG|G6rC=1|HbfYcR_)kNC)rsVACeOm@!% z(k-+;uZhs1V;&Z>4Dp(a>C8|OnI;o(w&!~~uk)a`!*%X7SaPSwCVtdw!}txyRLc)$ zFTm^!Vbz?)IuX=HB_p@RWnLaY#+HBN)45#x_yI*yR4RNTX~+;yNi+|>N6PthN$Mb| za^vh!$8x`tlg)1I<2On6Jmz0qU45vojvVTOVUuILX3|uiFOEWQaM6+k7P?M$+clCE z%nbseLZhT-QxkU@eAAHF`V*0uW#%My)H$bDH;P*RhaWyS>aqp8r@eKdQQi_zPOv+T2xkVxSG^V3uh%wq~_nv-pUFQo@L8cU|Hy}j7p0cm7nQf3~70I z+jO)-seZrKHR1JohIgglqO{|@eEeBK(<48tXI>eC&JoUMNpX*!a`p6SVy)|OL2G$M z5y3yK8~|d>pQbh8h5S=n_YCEhYl#cgOE@1%(d)uY`FZmjZ_m8&wc=@UOZFpN&ZS0- z8=FE9keMF=JrlL|4gsYGC3~bo9y=2r%g$@*pd>4bE|Rzrjp~9_miDuxW&%{4LhZBT)HD7FF zAO3rUOAHPKK^BmFpC;-pywv#_?+LqZhDHTu0&Bm~)8=oR)zftZTNy;iD7pMp<}bSK zk;2~}_3WX_)0=N=@6hX7e-z1VWC+x6TGg4Li*WkF*v)r1{L(OaOfgYnDssKzT4UyE zfu)ZqF=HHAUvQuFV?s^Bbv>Xa+cdNYH zyHX1~>PR}_OF1tiKBNE$eNJdCf@DLmKwE1 zW8=vLC!7I;#u6FtN*k(;4s3V32&nv6N^R~bp7wn0y6l@;oe}4Zk^a7O-F2mk``;{$ zOG47s4ZA>=lXdp!DSBG=O!g^v^k%MX$HU;(^7ECiN~lj={A!Dr%#ujMUSgJiKCSV!uD zgM1&0`QqYLd6STeA!Cl%iOV=$=kTPV=t<)IBdsT}xz(M4>a|cI?eWLD%HjeU!zbU2 zF*jw3H}fFVAxjl)((D^>B%1mOH+d>#kmA_}%{+hFCi~|f@`lD4UuMbz0~Mb4mFtz)~)6W^Q-W8Q;(U<4QtnU9Xy(KX9^i=1j@uqEh#6-m-H)f zKU3b6f}WwZdK1J(BjYOnojmTFuB3IHUCLW^B^KPJje(~LT%&tdi)wkPC--H`vcK)eXWylh z9~}uQ;8WBOO;-A(mf|cBO(z(z4H`5wli*m=$6m*qc|n5N9V=hoF%_$kJDQfXSxz;d zb8a&ZN63>uOi1(;NWQwak$!9{_GU+ywFLlievEo@+l4*q+dE{Z)eT2o+%#ZMK3&6F zcb|M{-XXVfg&@38sIsv$5zhtfTkDa>nTMAb4&zLMkjzu|*1l!ejr|@uE{o2Qnluf$ z&w{D2S;Xss%%m^e!<)%#&x(CoeBf3-;l)0UM>lC%zncIl#kbP~`8eNl@CadhNXc^- z9>-MAk7zuuyc&N-=X@lBFI+lfS`))uqJz1Jje*b(TV);ACsxCc{{eF4rJ+}dnr`Ef zx7@M7wcRej{>nXRZX(6f`*itw9A0{nf^ST8)swQJlV^+CzgRv*#`~DxFB{^Gs}|fy zem(!<%C}-&7uN%In;x&u^fzO^{?etPudePr4F3mv63n&j6aoR5E zBA<7p_~I*Cj?TbN@FdGr(}Y zKWyi5ga=!@ZxjUo?u>rZlz8#~SA!|MhYAY|LqXStywL~7xWsI) z)jQky)axEUzmVvS)Vr?1bXp-?_qF&iN6ZHE zWZ8ig4&$ivO&1Qme;81=wj^|v7GzU1qu`v%z%s*DOL^LwPr_Ec+*p^LUC=#eK6=5z zKcoJsq4TQBpcA4B((K-3CF5kq2`3SkAMZO6^$*quW>0nS3y-@t0} z_TCF)`C=)9Xm|C=GSee0De%#R&)S|g3stS{Xm+FytrvyI{!&fDuUuJ@j%&byUi?7LbmBRQDBXo8#{+gSo0FlE`q!BCW5sLr&Gpl{s?O z%looPYPs0OBgZ>?4W&lsn>y_x=ZcN_59UCG%9G=RquvrSJ9)U>JI_2UITlkAG;f)jBwX(>7kR_`Ae?q-zI|aGjyY=h zQI_O%sb$#lVB>V@eJ9@t{+mAdnw@68#vU`&W81HZlX645#I`+1VRKc7v|*xL`DC;t zw{9h}UieAVWcr#ecqPv6&}B+moh0=9nB=n?|ItLw7lKm4YVY20KPvm6dqQ0$q2aVY zF0`A=bPbuSm2oIBXpp)fbwQa`S44~yV_~t z=Qqs<7=vhagzB9wsI#9?YGMvCn-HPL;MV#zBq%rI@iOW6Rv1a%-M;tljw-P_=)%Z} zV$N6d4Ql5kD>=*(@`f&BI}FbTTe9m^8U3hKa>$@7Uq+Yu!?L8HdZzP9rcS5$kf0z{ zs4RcI)BH|**DnqEuzK4))4_h7JywHav;NeHx|MGwQKk&|LiwP&{R$WNlSMVQhB}_$ zwCurj{fjhC4)Z@}DSr_i+L(3&H*Vai6~g@eWO?{hx|ALnb3CAZ>nN$Ncto1o8=WNk zgKMNg=O{zRUC(XPZ!NsA-aRfrX4gUgM;Qo5a5xB~E7RdHs~V@qCKfdh=Z(|vIJ$@H zDD{&P1xZGC>eH@B*@myrMYGTt(*wEgll0h+O>Bt$+Bx0i&Thr|L47?+QRkECL7gT4 zT~y`Ozxs zJFI=b6sIfIF6eopS89w9A@1-L$ zHx(4_`F1xP8&X1sN?AXt%dbDJi&H5Qa?G+sS~$i|9(2hg@rNxo@Vva|ve}3jbxtz$ zK$@JsaBKS_EaXNt+PS$}&H7lr*hRmoBm3eY?C11vE?iR}Kp`s8uY&oT^6UTAG zUg*!f`ieWUg-+fcs41st_n%X{D$&jg5KqIi2rODcM#WUmvnCvB&spMl<4A0}?w4dy zJWS>q?N|8!0SPV#t!f0GZvKrN|EyJ8a`y6deROyn6s zS^Niw8Vqv(IOrPZoKi5Pu&!ZT**sEZ;i4VQ=Z&DC)&)`6w@=qowsxaPPfJ>eRomyV zYPx&5)2&UcO>vy?Pf>4NV>@fa+-Lf5|G)0OJF3a@VobDsU|R(`CJPAA=wCfX=T0j&jIUhwwPBUbek*HBEi#6qFpya;G0vkxmMAwo2x z-B*-J%qBX{)3SCFPoq^^;rh*-kdu>-U5gAK_GYd(T&}XW8JGwf)Du?QDP){{cvt{Q zjb3+DPhz@VXD3InbnLWLCfiAT$mPISJM|2+gsMll3fZZ2&Y}ZV1z~*jQCsHt1${tG zDgWjZ4jx&pHga};oHGldD^+*0`*DYJWij`Q2QW*ILTjut_XWuCE1=otlRDD^oP)B8 zWM=jF7`B-MuaD&ByF66cQM`{~p1x)mckKbbfF5!dv_z|W7bVVmeDQ0wcABFBd!{#r zT~-+%W)WN2KaJJ0E2so!x^|a>s?YO%&iFyP*fW6p}3b5tEo?w?)yM7LcheI5TDLc%oi;f>3-pWpgCl8D{jEF9TpJ1N*C8Hu&$S^1g3E(5v&70wkayQS7W5u4fDgaduYV1^ybSg`FXl$*}Y1ZMVp%e!^|M^cqG zOXwywpT*xZq*c=Ts(fP(=s#~wx>EkJmXvo;u>2hH zpspIyKYx@&ahn85gMyp8vD?nQ1`s%p(9h;AxR}2*7n_tBui)Q%NZ}38lxpn^Ukn?c zUg_=I(w^(icP^Z)1H*pT@Nvsr%kyK&Rdk`!F>bm0Q~yefNs7c#!Rn+x74mO7#eu1e zalDS|sSO$l9^|5RhTr;%9GrFLE|G)-IGW6@Q|H6if(q57!mzH6gsHS<ZOF@=y)@H^Ewf9lFHHYUx36`S z-KFdYByj`f;r_fN=yo&bvgX5o)c8%B!m!y5$z75gC7A3sAh}{E!->7B3o$%!RUetH z4M-SI4T%Csp}yK<;`y!H9#&6IN$Mj|n^gf)u5&KZ$oAVhc6%8=jEwb~P<m@>zTk}T`uk~BY5FMk+t@B0LjKTfpN2*ChUzUZ zTvSLkNQ3*m6AHDuh*utAx|aS%)P3EfKUdXHPf>LEb2q-OZli*DH2xkdQux?g9|ha# zGa3z++$%-P2)&RjHsEzSPCpKR9Nm_;elL*Zocv!UOnQ5_wiTD<=9q)gRePiyJfwNs z(k>9)1@glmNKkn@#l3k{D5kt^b`6dnii1l6RZ>>p&QILiYh4 zc~A^8MSQr0u&4Z4vCoIaYYq^#A#?Ou;Su()SgY=|c`JAGUNJ$X1(DY^EI-0b33v?OI3jtU=k3OuL$>J$$7T*Yqpmo_ zN|$e89P!IJM9RqOVLvo)aGSuS9b3}H>wLG;!`bhk3oZlMv@O@-2hq1(wpRD%tVw~s zF2)AurHZXDzjln?Zanios);iH{Pj*-Y$Hjg$u?|}+ zu#E6KWFEo5a^#}dA+E7myy7uKJP;B5Uj!88WZVxvFbH~{+&#=Gv)0`sqDrC`tpZH$ z-z3ttOOrO}?=`QhFd=jJH3r7*tDP9n#&+E|46;Sk&AGVgnXh>g`h2IDIdBH+Yo+z= zgfoKh?#mXklDj1QVN3MrW!cic9br0hOv$3=+kHZ_zkrGq%^yJMgEGniz--tN6tyLNo; z=B*cz=eB^KdLMnt(OB=7eyMWkRRuC2vgo~%FZM>rZ{)J#8%W%770Zag(BikGn#z?A zDr;4Ayg0%bc!0w4FyaT$8R0!12C5bCoQb9^Uf=1+^mZf2c)oeN8=!8DOSjxp-$9K$ zEP-rd$xFUgN!SW+mQV!l%d4+IeBO-DBSUl;+pcFS$57UK$qQNAt|Oy*L&_W7WFgyg zaZXw``Le6a*zu_JdsKz7ffo1SgEM&b0%>P#*Z5O#ARgf@z?eu%6sos12HqvjaNf3w zF&cXJGrJR8?b+89jYjPR%ZPlbZeLd>ah1KbAg(!o?5Z=V2bdjp1xYJLB?ii{Z$(g= zKq|9|{?l54o^yWu1L(JH5_CHS2(XTEevqo!Xv0V{^=zX8Q%v0RO`4u*_Gg3`N<6)^ zq)df+qGsK7bv*s6`||Q4U_?XoUJ~f-VMA4T#v@1C@JZg}PE$5-j|ZFWnP(HWnWTlJ zN)&5`Z~CfXgPj4_7{xsnzSK+)hPQS0gXb>~w?3UQOwq~f@e7lM>~}?0(}kcd5~ZBB zrE#{&go!&nE(qAQ@j`EKc_=!v3}4w24kKlOpuA--@m=f_R?ywOy!d&8&mr!)g-+k@fpO%asOrLe^#Vt9V>LS^qimJ+Q>ycrk zoLy2YWv1?)GK2i*yv2IE@!30p%0^oBvr9iQ%^>;t!cCTbD8xFzMDN(Zj)b#b#}~SU zGAdQ4)O;dyqfB`YT$pQ7t9N^`E1w$wu*jwGru5#ObW|X?DONcVhcyz2N>j2xT=oIb zXOgPjF|gcsd+O9UJ-7gvR&&|K?s%`r>qA{Au)by*jiRM`QPGEX*bp|sVI_Q0MZ}MB zL=sE`e&{^JNqGDVhH~@de6`8?0<;=rwU%x$s|N=KQ#H!{mDX~F%wJ(e{Um<{{>+w9 z>+EgtHVDWH#k!geW+^{|dtM2u|HV(XTHju2{klzaO&Mi#W zm49Mfe8{$VJRwpXpvLzZ%8ay9Ko%WTcvF#B3x4{qC41Yl4n>>I+bdOKb+UT71T?rI zcI5>Wo(`Geh;jK+EmD+rCh!XON zM3pofDsl*F{J^u7$}q*!^zXIpv^rZ2cUg>4h@k_HX`88mr3fd=QT3OFR_V&Rbhn36 z4)In5s@FI6YY>>99{r^4A=q?_!z)2fzU$kYb3?-vjB& ztddLXA3*k9_N=?}*O{aq{DaqjcmfFenv?iTi$s$*{%+E6#>w%@92c|0pnWNMP$jkC zi1fSwg>9>T=-S7#XZQZnJ|C+$ua&jaq5XVZ%i(OdQEHmn7Eh_ zU@6~$M;!c}=BKUxU2H+y`}?xz;P6)w7qOao3WE9kscu0o)!WS-tyx8X`D^N;=;*)Q z^wWB~MSj2sLrm;^HK-rAFI8Lff3s1eR@}gO*f~d|To5lQFpY5^QL8HgtS->jrf8v4 z`7Q>m^T=x92%J`7amSwxC-Ut9Sv{>sW zfdA4f@4Um+F}e^-M>-U%Bn%=$Mwt2|?m2VZd=Yn!*JQY!!|185M%NSX$8~cloRU@Z z`VYw`YqV`f_i7hK#&6e^$a8ti3{sFJ<+dxO?xzA5gsogt!*Vf~>E$9aBF zbQsCIGia_|Tto5-6^fH-&9w=h>jLYMG*+>8iKF4lVpenJK0R&zp|Ndu zVOV4@#P>ZnOTAoOjrsDYH%lMA6Xw+;bwbjc-&en#wM#Y7gmoLm>T{#Xy$S8)wfh>n z>o-g%#W~Nf@Lz0GLOluIxYtW%94AuudUF!hp2rqKi|X}gWYL|hH9gcd)3nubKil>l zRdbNxFpZ+9`3N0#-}KowF*`r{6KLB%3=i=Km9~APrwM!aNN6iS+T5Vf1+OUgLz~ab zC}h4RW%(wmM8z08_birb1ttAyxKG2`pwH5OZ{*hZO038OrPTAKAtMp0m7|(dAVtpn z3@ow8#RD@me)gW@joD&CVcqR602SI(*P*$>+Vm%n#BM(!%Hw=5nHo-XT)q0V6vA&<1!=C$^kp1yR8s3|&tGQ_Yl|JcGT%?P050*BBERZf z=f=6oFkrRBK4HT3xvQ$ooUW`&kw|Sn)KllX&$+DqJ5c5uoXo=2x>7a|z2`ESsoEpZ zosuov1V(VFtD|+RL1AdJw8uhI>5OKCt26kpA%K^qP+Z&-%XjU&LKt)ZBUDXUo-*%`3PIRBBjyillat&9CDWi{DFi8eH$#weei0e_IGf z0(w8P`uVIDxV^Ez0e=|7Q%>7nlF8v|qZqSN%qpoP$>N4f%++$~fvb7Dup+pkH>IRL zEKtS0)vf$9GZ0V|*lT$81Ld@|;hAtJ*X6RnQGR0&FIhRjEKx`tE6ntM8)3KkgbaB)uF zk6C`E36r-<0rwyyfNCg5kGvD`$})l<@~ulllbHK1AF74jhf;ZBtm(S%DNrr;14gQr z^+*N5Cg{r7+!?VMHcQVX!sF%kyB|^?UlSW-_Rd;zYNs0x zQ*HY)6mAl_lg~UD9Dcak;>$u~Y~aiQaNL8IcUvPDpc?6jF$RC|C%A{o%4FrTZ~a0_ ziKB*r$8{Zi#=6Ov$nMPc+`w#GzV-a{3{>`LBUN_ajq12pHcOf5kU*4N--kTE!6r9d z_1BM5AVA505ed^*XD9BZ?=1Izsoh99#>t|}h@0H~fEU{HHkWvXQ?!F=eqW25c5p(| zHTwaY+6Q`_KB1d*F+inmy-KId-8h0bffABT6sidY8jSO%{lGlja9Twx*LO_xL#EoW z^D|^}7TwGyWp0bxRwj(yOC$Y6Psct}g5=g(2OKV1TxYPp?#p0Q>y&w?HESqyuUI8l zz+D3D3fQu}yMSmSSecwdRm+NdZfmVy7%z_Ks_peKGY$r_dj{6I-C_6^OGW8IC;J!C zFdZ>FTQ33hX+s=7@dn8Rt6L-0GYRgNQwK<`V)b24JbcKQam9|;NWuoPKl##q*U(2k zlShqFxmR?f5o<0Q{jEe_Ag zg(yE)qua!W6?W4Rr7$7a*-51@OoRN;pD_HbI% z_!~$*4->o@XF~s}-08Av#2zNAJ0sV#m&RzRM?bcPH<8E3rD(>Bl1oQ;hD2-uokzPe z!^orsG{b?_d_9TI?2jDE`Fc|%F#@mabukJR#;_ju&n3Z^d3(O9?Z{e zmHNW;#u9D=rdrz4loy|%(tAWW=6}5(9Xn&ZRW1kbXNyJar`S0&fYTqqjWC!Xaq3Cg z`FSjC{eJ#r&^G_F?IgI!d80E98xdW;97PR0T1=tBdx$@ToB17~eDVx)$?es;G5O(}de4VCBFOo4OK2HfGdP#BXvl5$j^!d9=GI=zdzfs|hU$pcUNbXr2xCJf2O~H|5 z7f`F-CaApiWKihO!Parz^->U^k?mV5h~LCo{X$#v`;uClC5GnB zNo0aa&$E=oBKqfCF)u;Gld#N%Ql-e>$Pp10@l2N?I^^H>92DI;Q*k!7ELy%tMEYvu zT89B}_QfI9duZcRtbZ7~->(t@+h^_8(JbeG*A9GjRKoqHp}D2G{>Q@n<{Og#@_+6Xuoun; zQ;s`fv67zyLJgzk@|?EZ>!y*(_s*ha1?vZFySK04$E4kXj|*z3)S;za6be}0 zWWfn0OLc4ed9EppM`S%+?d!IO`^!j3dY;>Hv7sd+4SVjC`1XAgbR|ULPZ^C#^sh9M zKUL&LNeGHo?`GV#f+}4@^7VR^)kDzjaq}G)?H6r#!bT%P3$I(MMG#k48`^P>4u~>p zHdy;ljKYN-mqM^^@7*fz+1=etZmrk?l|&hd3O6@m!P$GdE8>-2-WF)QZ$yEtjr1rA zmhLet=+u?f>T8@qV=L300q_!sBEk@;|C@yma1$9O&+QDKbt`wof zO3hXDs8Eh#1?6oOps32b{x$UtqNqWq}UjK|4a;tv93)=gPU)&s*E3g9iXCC&8x3R zZ#Nz)CERVh_)2SS<0nZG4cqimS*Gw#=;y(wpkD??#tXW=@ z37EFoyQ+9}1A;ihzoYL)9vy_MT}ZXytOAtBbTQ_W0g=G-*Dy}YD;?QF`Jrx2-&P`8 zTTqf?^_{Nyl1>XU9#BZ@ab#!6x)fJojlQ@27kk`2wF{Dc>9S?uQlzBopkXDf+L(c{ zLj(?Csu9+dc-k@Qe^hM=7~f@ifvD_gLvE~zRL@p7f~4&GQyqA0x)X6e2e;kv^t5zXWEU`%ibFwk3V zwQ`g2aOx6Bgl~Ej%;EIHVc%<_(y;hX^GAtqx&{tVa z1h=*Z8opyNs!Wqv9N)57nt3Y_4;i-mY~dh~an^fkuIZa(t(!}Hk71pF{f@n^exf@& zVlvOE*+uiA@p=Wx#L7=AJq?mCw4NlwZb7}*7g}0FtZ`Kv)1|?Ml_tmyZ##=WR z?{v`hC>b0;pRHPsVpP9Z70u12Kn@b~e(h-Lgfr`iGGT;<0(%V~dY}!Y_q?m4O{S@q zG}ao5wL!r5L%JGx6!v}XFfCL`)E&Ycs)iNb^I}PnZ>GtITRV4EW-8^4? zeQds2bO-SfI2+hT%4{=W(d~NX&Ig8`k`?3!Q*FckS$dBdNHMaNq<>u^4@41oiMXxy zj+vkSn^~(87i5b?4|NLihpgR*xK{ST6jgHd3l3^9{0{25QuonNrkX`rosH-G&h0dQ5BRoFMAc|wJ*y_GPjk#l<)Syc7cueff-n7yEs<4bt z;)2XB=M*;aAvFCf4LGuWx8>gY0u+~j&<=kR{qgj)ujukwirk+~iABjP&)|!-#l9k5 zo6NfpWTt_cSE6|@U+c`1fM#nC-_^PCUCs476-7nAw{&gb=(QlAAI})$yvMeyO#HY} zajSI+B1|^|xHA2Wp|QX~FYzE>(EI)4t&Yh3vFdk)y}j|(KLwiN&hl`6B)@&$%Za?Sws}1Y*KCW|qgauLvq?xv#3l2f zpdIT4h_SoNY#~lr5`G9-3V|vk4|mI5l9|=VqSSfQ5tu>5aj7MKa9rw0PC z=emxZkbJchVZ7yuka>Tv0qCA?o$5Kiw7>g-{pn@_BHy`r(n8vOf4@nx*{IATDUY;I zUSlCu6~F8LaLPq#IV1GNyo(?Ttzqf~UFxB#-s=TNM&E^aS89v%8b6pV;4lZ>{Gmyk z$u4%x`{VTl?C#Vi@<;OY*+S^UDx;f_ymTVenEIaDSL@mB`eA7ou;=lMoxZwJE>ekb z%Hq@K$nFFYGr_-RCg*X2i@1$Jj`sRCHdCd zh9A8N5fprrwG-Zrn|`4{K*}=HZa<0IxtZj(1Tow3v)fyOf7(+Ckf+ftFGAD#UB${uL)IfIfO6kgZv3oMrvd zx;g5;V)T<6u`8v(lb9+YFf9PuFt-boAgjd)y1Nuq@y*Q6GmkQJy1BS#kvI|mMNX5= zUBz2xR=+c~T3Os)fE<7Nq?S~+Te6E7RJhQcF6XvG0E-?evhI9&7k+%UmHnV*&JNlS z$lIE7+@BoKy@1BW)obiEd~i-#1X)}5zV3z;FC~#veI5nX+8Wn;&5ihL`7q+Q>p*55 zMup+qoc#b?|5VQATFwz6F-{2G#4iW8$)g%eUq0E)wPtl)9yCX*GvE5evzV-ul4R?- zh4ig;ePkjd=Ikj}YwcmV^s^7QeKo~UHw`h;vDpMB>xO};!VhyrT}J_jSCwPctQt2< z=(`n6@4QJvEZ@dqAxFsR-oRRRuBJ4E^~%bNmsJ9;xNf8#QFr+VAvju6SH7f9Rju@% z`O|i*5W$oh$)aAJM#>+%-OKU8Q2V~6C@l&4!)iUumkj;jp;xx z>U*Pd_BAI7@@uWsKa-ydm2Qqskl9UMW(bj8M`jvd&3O{9F2F{ZGPP1E^m(DCGZ{CZ&F~|S7{8!!eqsCJy zylu!Yw#uRZb1D4)g&%#^S%~ch%Ibi<*W79lsQ{A(VvJr9O;t*~N}E z3D@MtDF*IJMgnNs*qHHpSM4ll-zME=D$5RKT^vXg8q+R&YM~uwW2vG`cHoetam%jS zx;89QM<(kEdk&#T^cy-i~;p%l?}TE^-n z*4{jU=mS0Pk5Q3E<$@*+mGDbJJHu9Qzz!t7WaAzGQi%n0yf&ZH*b|Pu{1+L&OEM_5 z)NB~bNe!zo1Fx0W#k+h<_+ zF4_8P>Zn9dPTP#Qw5Rsc_wp>iBpBvCx>eLdX?s?ue*M_@eFMDe=@pjlhk(sSJX2w> zvU%b}eIQ4}IrRvVUA7?C61=CNXBvyLg%kycKTAh?wpD^Js%4WxEB9p=9EYVfWB=u&= zlqQu-vt|h_s}|r0sqT|KQi(JWH(^RnliO(gi#HcQw0>HN8#vi=$#ij3OU7R54<5g~ zIR*o3J02{q=y4B1`1p&O1L;YNpo*T8P&491-blL)6A zwqukE`&{hPZTwtPUh{$W)^VqJKY?sDnlJUC8&l&8L?if-spqnynMHu%sB1zl~_Q3sZOA!}&oT zVlS+_1N!#^Nk@Sc>|^z_6PF6v9&glc+!x?@tV{Du%^m=H46aS5%Q6$=h@{*MtXL9Q z`{?@qhcWbcac)I$JA5g-LccTNW%A4ZD1{nu)9591$|ywqWm)Z*VwKvS0GuHP9g-%@ zxgDdEE=FNbT~kNF%{&g-yv#-QY!OW!ayxQ!iyVy5J*Myvdvxl|MXDbfr1oMk0`eoP z`g!6gDl30I@D;&4%k87%yX)VtpKo@Q{XmhM_5H${)K7x%x1VcP1<?b zikZ(uQ{Lh!T)z5L4icdFEN_V;GP`pML#d6+$Q$?W;JfTdR*yK6^*fZiu6X-rf8p&N zukzJC(>I?LXnoFG;9fkdZw@He{=m-^O`G@Txx6vJ0mj~WuazR9=#w{RU2cyy4flsQ zHT(SG%N8^Uo#Bk!o%gvqE^CzbgXRPadyQNP*XYtb z&(z0;P@t~a(Oh2|Rj009Gg}GK9Hi9mOTBxr7C1%E7Z?mXIHJ#kPWC~m3l)86+4+}w z5%{Z_8#Q7&Uc@!-Y^kdbX4Wq|@q&(9+Trn1dwENS#?&G={>(4TH=e--)>m~udfxyL zv|s&vOY*)U^jY8B^FjUSlwRwVbf!(0;9(`BmrE21_n9AhIF}t;v40<05tmZ(`S_yR zkX`o~Q?rjnxh3w!+;Qn@bABRbF~`iH($u(kwZgHyW@6#zB`VWcGF&y~=9Pl-FTvDZ zY{Gj1&6jSpJL{u3uj#xxXI&!70@VVm*SX9YT_ew6*@{TXGwyBOrgk--NG#g(fVagr z6=Da1kPE1FeD16IS4{Lt0~Z52rPIhMN@TokU^h2Q%MaC93PyreS%zJ!gA=8S_rHvg zM61Ua*jD^31*7~VjUc!dPm}Jn@*!tKIN=Rl(o~p{!}PPALX*dP)43lLH3R6jU?whc z4Hr(OclKLYSdBGdFn-tGp42Rq>UwkvZte-hX+y%K(n|xRczCw5KFDLGRV9)X7cy!x z?)Ypn0caCMK3xo1J(8bQw)x9(NtCadf;&sFhZjO5pMCf(NbbYfSF1}11uc0f=3+vv- z1(z5?{>)^HhtmxX9C{8o7@CYT-!y#j+)*5->SgKQpu7bHQhw2XA=GN0d3)#ur9jDS zO9H*?M}RqxOeY7Vrq?7e%;g}IxhxtmBiy}QnQLPlSRs4#rB(Wj5O>FDXqd}9#%W&A ztN*UC#MLX=Db_)~tH&v4jqq;;ZoP?PtU_hCRR+skI^gOms_$@zdVsP;`*OZz~y{2*F=mhvj z4xd_$Sw>F){Do&GEv8i588f|}ka|~&UAGc9Liq`zDwpiSAYPoeeWOg-SYzC=Ivnm( zmC|vyph`uGq_96EbKUm$&eEmN*z$s2IK0qKl={*45=vc{Q?TQh4XplgduC;TT2tUB zyy9@_<48tyUAgN5p}@QKaB#rR+#yG}+Gs_TGC^XEy{l9oCi0WySAcGrvXvXee8gY%xR#&nNy!rDbhkb0@Zio1{T`yFR^{%<}9>=-p z&8i*)KG{ZVOz3!}X#9MzNBZLS4NA*JDK~{3iQKWE+Vbws)b%48%ql|K+f?0ZjG}j; zR^Nj%b|X?pu6a&;k;;3t{9Eh$eibUCTdh+9T_M3$nX>98YLUTyOfs%Np?3t5#$E-| za;PoNoWm|lEOBPP$ED~WAev9T*4nw-Y zJHvnFpGP`gSrgG_k_w=Nz?P(!i&3mfy-j1rLcpO%-~Qap{$>~rJ2l*|${me+e_p(i z{bH3GlC9Vwot4p!C_a1q^3+N8@BUrFr?Tz;?brS1UtwR3b%kM8d!+eSmZc=Qm37R& zbpnRn?0c14FLdSEu^W3OF&>U)vRc zeQ$W?&b~i4AmS0Db52UDiVg$@e*^$N8}vM!9k$ED{dCz6r{NI)JWr)_SL>*#5`m@@OlQW z202Klo?ZhgtbWvoGK}LDPq4B+b{p=twK-#p_bMY#cQ7u-G)hZ*%;|nGGd^ci9}P)U zXUdF58Pf9viB7)WnKY-0zs-GxKE(WdKcIi$LH-ro6!Q>x*)LE2<~g#bSJ~d7QvG(z z-tj*vLHPk(#!`nI2V! zv3W$t(U)|C`pkL#IRDWLhOd?>F|ijGjny8U13ZKKe2E(!kDwvj*NFgb+$ksB3q*F{ z?hvxKCTJ76)~bOa7#cV&Qa&LjYhe1Kjq24cm#Ng_3zt;et0+S{qcud+H`DYVrB3${GMLvm28l*gz)_A+A&GI3qPC?D98R#bkQiWyq z>BFw?SQrfht>#OYDlY1R-Rp7g1(H?KYi4p~x^)LHbQ(}7j=BP4nMBL5{*^~-904kD zAD!aO-fw^Vyt#?19nnuWD1DzT537>|?p-Yb8K9CIv98vOJsSNkk8kSJBdw530TX%h z@L|=?cIu@LH9k4G-R+&2QKR;Sf?lM|y`z{CeeSt^lD)W`_OLX_4#{&HD!GXT`+4mQ z4-7mnzB;T-#)@3O*71g4x~dW%kw7S&xL`YgnqF6Q%q4 zh;PY1G@Ed*oEa$mDbftq<^89>s}w}}v(NR1$e%wKNPde+z6FTbJXWPgPE{R!lBOvnH3UD955h^4CRAy5uZPbkVDc>yNvCr-lcAZ;?`+a@BuT^<2c0{s?6usMw;Jo$8U>0?o)!Y@5irZR0OEZAO^L6A#_Y}lk ze-^^v;WdoIKMA(`lF$y0gA5G`^cC({EdDQJCMeSD=%r_2@}*AA<^Mf&%K zk*BA0kh99@uvr~QG}GZ366jM6)mae{92e0&A=@1DJeAA{%fX?QC`3IwwR(c@HY8d` zF7=}T@-zA%L}+Ep44r{xUu3L?nm}$@{U{YgAGLQCc5BM7NVNB?sL2>{=(M>eFn7M3 zqO*!Rd}QYTw*hg}hDuP*IYD=LWN9?TDj^H9kT6HlOKq_8M3UuX!ZD{%IHcPc;f%*w zoyGvirL!AZ@$VWx{=)#Mi1R9bpAS#pq

E z?hYsYxEe$rpAx@x)fOHEkgQTwwzig8Hd1+NP#ixk{tP~y1Y^p4B$8(?1LOEp`4v=8)JA42B}#)HDbM`1uOvcgcXhCEom4)y!=Cw7I|9hf z{Ph!|Rmv51yV=UUcdT5|E+;pfC5nQ}#9uQclitls&X zkaM0zikB?OlXQPs{`X=Ee(yr_Sr0*#L)(zU6wZy5xKAsC;ABu;dti#rq>I5zMfnEO zxMvJ#Px%7aFFStJ{r?co>i>@$l>fS~$d<0E1rv_PnsiMjYlMXas+v`9MGNuTe6v4M z=rdxc68Br_2(+{}sdL3})6iyPW~&K55xBP~YS5LTsW`~SmK9~i78boicJlBkgl!Af z)qW-~u2NFnXQw-AKFb888TFl&A~7yW{T4TZ>f{;QKhcXu{VPcDPW_?nQahoJvo*<} zHzQ8b+{5vN!}t;XDV;08x-NGX;$;navJwr352$WLv2~vGCq6T_eahFl$iYb;UB0=i zC_Xcp%NC{@&jbF)S0GNsB$Csm3=56f=!OCYEXMyKM@BIH`Eoz3YvcWYI#h6+8sI7t zNb1dVG7-x^MM{~5pdj^WC;jPL=%49qaeF$V-Q;*)S#l@i_}C6|G)UY^*lV@vuk9qx zV(Q}~aq#IXQLo=!`8rO0qUuMWteC7D$OpLHvPV3&h7@5W3CSty!8eF#b>b8i#QE6R zBTCzFC!m+-pY7_u5a}gSQ@75&&ygwhl^f*|WOKG*q)vMOa<=_NSl7J;bbTeJkKelf zcxf^<3GCxJ&Qr6c&Rny{&d9$qxsk-|B~y90xgH2MmN?wlAZ`>wAedyd?BV71fqOKH8(VQ~hA(j5`h%NlP9K1A(DzJa03lr#yCsq`WH9doaiR+tf>5xhn zd>=|0?XfbpSE;a3FR|UaxKgFf5VK9aWi3mbuZL_@|Fkgm=q~vW2Cv`SMK6nQMi@IE z?21C*^|O)(#05eRS_Sf>3*`dtL5bKoqGXTfL|q&0WJ!g)6GdeyTymZWE8v0fFIiss zQ$y1A`d8`=Nwbk8?lUjE$1r&v?V`dqWQqMLE?%UQh#l#eerToKXbmZ8&!m`7$?TY0 zSOgqYu8jVg=fgjBC!FmWoH;S2T2xjPJbTy*!mo&Jc3#q&V=u~yl|3GnB(5`Cja)|t zFtiZ!S5Lk?-VsswtA(T4zfzW+SHxAcE7L)sFIZ1=t!-jMcK2-QPq*Va+2dG_a?)ig5BI@|qlT}4+UJjIH_$mrU zwRCKsq+svj|AaP@plK^`G#@{IZ%;RxDP?zN0h$`w&ucZ1onfPR_CI#7BJ&BLIz40K zW6zM!LSYyZg!jxDj#KMgPU1x*{S+mg%Fh4m;>!OvmO2Dff8_dlPPuaEcd;$v2?<~R zJIOYZ@;sbdh!u3qA%VD0S{}ju|2uBGYS(t5=dhOSU;a_Q!inJP*m<(+_~*Hx|NdOq z90FADy}8@2E9eIF5ii}`4dU7U4I~Gol5qKlSdqBfCylyT>NLpY>uUDqL)Q~OB$9B% zCvD9t7)c=e6M4St{!O|MB%l99y8qhgH#z>vH~d46KQ{RbnLh*5_|2#SwQ%l4rAc$^Zrd$0Ja_VYQP6Kjd%$1+Sn(Ml@?TK-v488pTl#zT z{`3D3qDqV0_TCni-Sb_u9<}TzpIurzW^A>d8-R8^8a;t|%nk5%jJ#PMd2_N={yybT za^9E-(DD^n`2*KCJ5!bCE8RmJv$8f$pdW3`22s%dF=+qEL0osk0;$2S%t1m#FX&K~ zz%Nx*E3$1fv