From 6cbf8744cebaf7c6b4ff2eaabd1114fd94a69277 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Lafage?= Date: Thu, 31 Aug 2023 13:53:19 +0200 Subject: [PATCH 01/13] Automate wheels distribution on Pypi (#460) * Add initial cibuildwheel action * Skip building for py3.12 * Test upload on Pypi * Bump to 2.1a for test * Fix main master naming * Trigger on push on any branch for test * Upload on Pypi only on release, skip 3.[6, 7, 12] * Revert smt version --- .github/workflows/build_release.yml | 59 +++++++++++++++++++++++++++++ .gitignore | 2 +- 2 files changed, 60 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/build_release.yml diff --git a/.github/workflows/build_release.yml b/.github/workflows/build_release.yml new file mode 100644 index 000000000..034ee488e --- /dev/null +++ b/.github/workflows/build_release.yml @@ -0,0 +1,59 @@ +name: Build and upload to PyPI + +on: + workflow_dispatch: + release: + types: [published] + +jobs: + build_wheels: + name: Build wheels on ${{ matrix.os }} + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [ubuntu-22.04, windows-2022, macos-11] + + steps: + - uses: actions/checkout@v3 + + - name: Build wheels + uses: pypa/cibuildwheel@v2.15.0 + env: + CIBW_SKIP: cp36-* cp37-* cp312-* + + - uses: actions/upload-artifact@v3 + with: + path: ./wheelhouse/*.whl + + build_sdist: + name: Build source distribution + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + + - name: Build sdist + run: pipx run build --sdist + + - uses: actions/upload-artifact@v3 + with: + path: dist/*.tar.gz + + upload_pypi: + needs: [build_wheels, build_sdist] + runs-on: ubuntu-latest + environment: pypi + permissions: + id-token: write + if: github.event_name == 'release' && github.event.action == 'published' + steps: + - uses: actions/download-artifact@v3 + with: + # unpacks default artifact into dist/ + # if `name: artifact` is omitted, the action will create extra parent dir + name: artifact + path: dist + + - uses: pypa/gh-action-pypi-publish@release/v1 + with: + verbose: true + diff --git a/.gitignore b/.gitignore index 9b68d1eae..9bb3e784f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,7 @@ *.pyd *.pyc *~ -*build* +**/*build *.egg-info *.so *.so.* From 8abaffe26c39d7b8bd83d44d2e9915edce9ba1fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Lafage?= Date: Thu, 31 Aug 2023 18:10:42 +0200 Subject: [PATCH 02/13] Prepare release 2.0.1 (#461) * Specify wheels to build instead of to skip * Bump 2.0.1 --- .github/workflows/build_release.yml | 2 +- smt/__init__.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build_release.yml b/.github/workflows/build_release.yml index 034ee488e..41e1fb2cb 100644 --- a/.github/workflows/build_release.yml +++ b/.github/workflows/build_release.yml @@ -19,7 +19,7 @@ jobs: - name: Build wheels uses: pypa/cibuildwheel@v2.15.0 env: - CIBW_SKIP: cp36-* cp37-* cp312-* + CIBW_BUILD: cp38-* cp39-* cp310-* cp311-* - uses: actions/upload-artifact@v3 with: diff --git a/smt/__init__.py b/smt/__init__.py index f2dc0e400..159d48b87 100644 --- a/smt/__init__.py +++ b/smt/__init__.py @@ -1 +1 @@ -__version__ = "2.0" +__version__ = "2.0.1" From 1888028f1ce70531db961db31721013d1fd889d3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Sep 2023 16:46:16 +0200 Subject: [PATCH 03/13] Bump actions/checkout from 3 to 4 (#462) Bumps [actions/checkout](https://github.com/actions/checkout) from 3 to 4. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v3...v4) --- updated-dependencies: - dependency-name: actions/checkout dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/build_release.yml | 4 ++-- .github/workflows/tests.yml | 2 +- .github/workflows/tests_coverage.yml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build_release.yml b/.github/workflows/build_release.yml index 41e1fb2cb..0f2bfdf42 100644 --- a/.github/workflows/build_release.yml +++ b/.github/workflows/build_release.yml @@ -14,7 +14,7 @@ jobs: os: [ubuntu-22.04, windows-2022, macos-11] steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Build wheels uses: pypa/cibuildwheel@v2.15.0 @@ -29,7 +29,7 @@ jobs: name: Build source distribution runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Build sdist run: pipx run build --sdist diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 9a3f83606..91e8fa507 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -23,7 +23,7 @@ jobs: python-version: "3.8" steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Set up python uses: actions/setup-python@v4 with: diff --git a/.github/workflows/tests_coverage.yml b/.github/workflows/tests_coverage.yml index e88908b56..0a254dffc 100644 --- a/.github/workflows/tests_coverage.yml +++ b/.github/workflows/tests_coverage.yml @@ -15,7 +15,7 @@ jobs: python-version: ['3.8'] steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v4 with: From 6fa965fdfbfa6d23a0ae98b4ed578c3c4164605b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Lafage?= Date: Mon, 9 Oct 2023 15:01:48 +0200 Subject: [PATCH 04/13] Fix for expired deprecation in numpy 1.25 (#469) --- smt/applications/tests/test_ego.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/smt/applications/tests/test_ego.py b/smt/applications/tests/test_ego.py index 8567edfd7..2622989a1 100644 --- a/smt/applications/tests/test_ego.py +++ b/smt/applications/tests/test_ego.py @@ -854,7 +854,7 @@ def _evaluate(self, x, kx): assert kx is None response = self.super._evaluate(x, kx) sens = np.hstack( - self.super._evaluate(x, ki) for ki in range(x.shape[1]) + [self.super._evaluate(x, ki) for ki in range(x.shape[1])] ) return np.hstack((response, sens)) From 43c551534601466f4cbfb2ea4900d8f283abfca2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 10 Oct 2023 10:47:20 +0200 Subject: [PATCH 05/13] Bump pypa/cibuildwheel from 2.15.0 to 2.16.2 (#468) Bumps [pypa/cibuildwheel](https://github.com/pypa/cibuildwheel) from 2.15.0 to 2.16.2. - [Release notes](https://github.com/pypa/cibuildwheel/releases) - [Changelog](https://github.com/pypa/cibuildwheel/blob/main/docs/changelog.md) - [Commits](https://github.com/pypa/cibuildwheel/compare/v2.15.0...v2.16.2) --- updated-dependencies: - dependency-name: pypa/cibuildwheel dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/build_release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build_release.yml b/.github/workflows/build_release.yml index 0f2bfdf42..1e99fac0a 100644 --- a/.github/workflows/build_release.yml +++ b/.github/workflows/build_release.yml @@ -17,7 +17,7 @@ jobs: - uses: actions/checkout@v4 - name: Build wheels - uses: pypa/cibuildwheel@v2.15.0 + uses: pypa/cibuildwheel@v2.16.2 env: CIBW_BUILD: cp38-* cp39-* cp310-* cp311-* From a217a3b1e1be60dfd544175b272bb2326e4f405b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Lafage?= Date: Tue, 10 Oct 2023 11:45:13 +0200 Subject: [PATCH 06/13] Sparse GP (#463) * Initial FITC and VFE implementations Co-authored-by: hvalayer * Add automated tests * Add SGP documentation * Refactor and add comments Co-authored-by: hvalayer * Blackify --------- Co-authored-by: hvalayer --- doc/_src_docs/surrogate_models.rst | 1 + doc/_src_docs/surrogate_models.rstx | 1 + doc/_src_docs/surrogate_models/sgp.rst | 371 ++++++++++++++++++ doc/_src_docs/surrogate_models/sgp.rstx | 76 ++++ .../sgp_Test_test_sgp_fitc.png | Bin 0 -> 106589 bytes .../sgp_Test_test_sgp_vfe.png | Bin 0 -> 107900 bytes smt/applications/tests/test_ego.py | 4 +- smt/surrogate_models/__init__.py | 1 + smt/surrogate_models/krg_based.py | 2 +- smt/surrogate_models/sgp.py | 318 +++++++++++++++ smt/surrogate_models/tests/test_sgp.py | 60 +++ .../tests/test_surrogate_model_examples.py | 107 +++++ 12 files changed, 937 insertions(+), 4 deletions(-) create mode 100644 doc/_src_docs/surrogate_models/sgp.rst create mode 100644 doc/_src_docs/surrogate_models/sgp.rstx create mode 100644 doc/_src_docs/surrogate_models/sgp_Test_test_sgp_fitc.png create mode 100644 doc/_src_docs/surrogate_models/sgp_Test_test_sgp_vfe.png create mode 100644 smt/surrogate_models/sgp.py create mode 100644 smt/surrogate_models/tests/test_sgp.py diff --git a/doc/_src_docs/surrogate_models.rst b/doc/_src_docs/surrogate_models.rst index 324c4c5ea..11f77ca80 100644 --- a/doc/_src_docs/surrogate_models.rst +++ b/doc/_src_docs/surrogate_models.rst @@ -18,6 +18,7 @@ SMT contains the surrogate modeling methods listed below. surrogate_models/gekpls surrogate_models/genn surrogate_models/mgp + surrogate_models/sgp Usage diff --git a/doc/_src_docs/surrogate_models.rstx b/doc/_src_docs/surrogate_models.rstx index 43f8f8c82..6e0b640f4 100644 --- a/doc/_src_docs/surrogate_models.rstx +++ b/doc/_src_docs/surrogate_models.rstx @@ -18,6 +18,7 @@ SMT contains the surrogate modeling methods listed below. surrogate_models/gekpls surrogate_models/genn surrogate_models/mgp + surrogate_models/sgp Usage diff --git a/doc/_src_docs/surrogate_models/sgp.rst b/doc/_src_docs/surrogate_models/sgp.rst new file mode 100644 index 000000000..07ff82c14 --- /dev/null +++ b/doc/_src_docs/surrogate_models/sgp.rst @@ -0,0 +1,371 @@ +Sparse Gaussian Process (SGP) +============================= + +Although the versatility of Gaussian Process regression models for learning complex data, their computational complexity, +which is :math:`\mathcal{O}(N^3)` with :math:`N` the number of training points, prevent their use to large datasets. +This complexity results from the inversion of the covariance matrix :math:`\mathbf{K}`. We must also highlight that the memory +cost of GPR models is :math:`\mathcal{O}(N^2)`, mainly due to the storage of the covariance matrix itself. + +To address these limitations, sparse GPs approximation methods have emerged as efficient alternatives. +Sparse GPs consider a set of inducing points to approximate the posterior Gaussian distribution with a low-rank representation, +while the variational inference provides a framework for approximating the posterior distribution directly. +Thus, these methods enable accurate modeling of large datasets while preserving computational efficiency +(typically :math:`\mathcal{O}(NM^2)` time and :math:`\mathcal{O}(NM)` memory for some chosen :math:`M, , , ] + - None + - The kernel to use for categorical inputs. Only for non continuous Kriging + * - hierarchical_kernel + - MixHrcKernelType.ALG_KERNEL + - [, ] + - None + - The kernel to use for mixed hierarchical inputs. Only for non continuous Kriging + * - nugget + - 1e-08 + - None + - ['float'] + - a jitter for numerical stability + * - theta0 + - [0.01] + - None + - ['list', 'ndarray'] + - Initial hyperparameters + * - theta_bounds + - [1e-06, 100.0] + - None + - ['list', 'ndarray'] + - bounds for hyperparameters + * - hyper_opt + - Cobyla + - ['Cobyla', 'TNC'] + - ['str'] + - Optimiser for hyperparameters optimisation + * - eval_noise + - True + - [True, False] + - ['bool'] + - Noise is always evaluated + * - noise0 + - [0.01] + - None + - ['list', 'ndarray'] + - Gaussian noise on observed training data + * - noise_bounds + - [2.220446049250313e-14, 10000000000.0] + - None + - ['list', 'ndarray'] + - bounds for noise hyperparameters + * - use_het_noise + - False + - [True, False] + - ['bool'] + - heteroscedastic noise evaluation flag + * - n_start + - 10 + - None + - ['int'] + - number of optimizer runs (multistart method) + * - xlimits + - None + - None + - ['list', 'ndarray'] + - definition of a design space of float (continuous) variables: array-like of size nx x 2 (lower, upper bounds) + * - design_space + - None + - None + - ['BaseDesignSpace', 'list', 'ndarray'] + - definition of the (hierarchical) design space: use `smt.utils.design_space.DesignSpace` as the main API. Also accepts list of float variable bounds + * - method + - FITC + - ['FITC', 'VFE'] + - ['str'] + - Method used by sparse GP model + * - n_inducing + - 10 + - None + - ['int'] + - Number of inducing inputs diff --git a/doc/_src_docs/surrogate_models/sgp.rstx b/doc/_src_docs/surrogate_models/sgp.rstx new file mode 100644 index 000000000..03f9c5f28 --- /dev/null +++ b/doc/_src_docs/surrogate_models/sgp.rstx @@ -0,0 +1,76 @@ +Sparse Gaussian Process (SGP) +============================= + +Although the versatility of Gaussian Process regression models for learning complex data, their computational complexity, +which is :math:`\mathcal{O}(N^3)` with :math:`N` the number of training points, prevent their use to large datasets. +This complexity results from the inversion of the covariance matrix :math:`\mathbf{K}`. We must also highlight that the memory +cost of GPR models is :math:`\mathcal{O}(N^2)`, mainly due to the storage of the covariance matrix itself. + +To address these limitations, sparse GPs approximation methods have emerged as efficient alternatives. +Sparse GPs consider a set of inducing points to approximate the posterior Gaussian distribution with a low-rank representation, +while the variational inference provides a framework for approximating the posterior distribution directly. +Thus, these methods enable accurate modeling of large datasets while preserving computational efficiency +(typically :math:`\mathcal{O}(NM^2)` time and :math:`\mathcal{O}(NM)` memory for some chosen :math:`Mlq8Jo>ARK`@KG)ZL0EOUlL=9x%k z&Xj2%SI^V)ee2ubUTgog_dj22z3X`^-S_WzUDtV@$9WvbdHEbadU)e{=JgZ`WuuC+ z!bu8cl{1C1Tx;!W{7DlfFbMyVbWqfC(6Bafa5Atnrl=b@*jQRSSehH|xNK}^Z*F}_ zgnu8u(B2(p4h}ZzQdg~ovVZ`m`sr{mhjx}!ly!Nu6p;J{u(ol4}P)zlM{T3zB`;5|B9r|BJ)bUzMNt<#v zSSkv=S*I8|H@!w~*yqNx8{g(;oky9X?PDe~sozF@aP+L66k-Zc;$Z*pSIEzBF308n z{g!?F@~N&Zw10o8B>bP>{j(PTXC?m6nV_Zp|Nj)+RSE2ycdPdz(+ zl}|g3)A8JYFm)fLOEU8F4=i7? zLS66n&6{Jt1~on>sQVS@EBl{P{P!QyMc113HK&+fC=XdBBI2ldw^8G&W=K({{lK&1 zkCrc6wydeOwYR6|(4#{)4gHt8Z*OOkzHG^E!t?K2gg9L4%vDdbYz~pysIt2L@xc&< zWi$$&{<1Y&R#sL*Qqp#A%8Hehm2QvKzi$@2^6QTu zs#8Ck$EK!AYHNiO>w+&FSf%SCQ2+e2Ut6ZVi09(GMDg73-#y>Hc?SgrtXag(01WruvrU6|7T-tdZiw#(GdtriV04MsY0EZg7jOVs!u z>v{(3sxaMEu%ad1I_T+B?!dr6`aNg-UumbG%(^@je^mYNB6FTSaaEJ9{js7Soz=@v zpN?OWkMT$U zF23xc-J=z2cpqm(?UY|_X=NqEM5PiF;^tLYSeW57!uH_711#6zfZE@^idmmMUa)TC z#(i6y>JrqW>Ici#@Vo#1)t2QHbmz{dy?ghDNNxLfO=ruV*~YusuwNN&X=&MIyK7v? z+pKC6Gjn87g!ezc%1V`2>CWm8+PbJv{g(W9HG<>gmnZ%E1K!@s!cXwK>=Z@;-A~yr z_SiH*CMxnmXZc;Hht}W_*Sx(@ekj*%mLlQsZ4=j#u>6*m$j?tyd%u78Ezs}!HCUHm zB%qUVAm_^DoAh*UqZ0pA>&^$ILEB3s>s~xR{h|avF*^|Ji3K?I;>^aidTy0pzU(_` z`TSI()_VtDinw)0k-p#?gAc2pYbFK0dc{}l$2c(B{UJC|(s^{p=@(~;8yfD_Cu(Rs zJ-RJBJKL~Q;61~}AB{;*ZMqA!&YlexF+G}aESAmOKU&gW*tSPO%4t}wB8=D8&d#vl z+A7=m#=pl^MG9x8w7~4fj=Z8JLFV4Dj$?8Q3OCnp`PT4?1t-S&%9W7)u9tCy%I@*8 zSTw%=T6lAVKl46c>%4_~?<^XXq&ym5pV!HD4&Ekx`Hgwqt_S;Fl|J0s$a^l8=jqWH z!?p}ts%=uDpM~&Qr(T`AOUHG@rl)9K+NJi2>uYGtzC1tuQZnZv{(-}fhJf{3c6SX9 zmfzaQ((x_Uq{y3=icKcG?&+~m0Xx`>UdE7wGGE7v9v;*499>9PY?bO~2HxR$3V&egEW>BSP4Q zx-{%#DAx0}P9`}$kE;exn}3ckXlR&vrOiR!76*2P;N_oM>lyhgvAjITA5w5)A2|$u zu8a^VrPs@_F{m4`Ew?W5-&+6jY$)Du`5mkdzfMLzj>BM6avbk#-JC1GzJJ-^g-{W; z?^l}|Zdbj!d{xIxhCKL{n?zd#?{re?y!Q;1Riyrvtsa;J!dL^x%5{?EOVY2-8tGx z)!}42)}y%l^mBT1?I%a>W?Y%v{piu7+I|B;rm`^JP+pq9d3yS;2|0U(Vs2tqC;jKB z8(yFP=(TJ`xU9R>mffdz7*~X;#Yo+aI~=6so08%uquOL9YADF`*wXc^mKM`S7O@K` za3@Lvcv5pWTrb#UT-nvt#be9Bzz`hhQ?@a`q@+J)!u#WN&leeXJD)Q7e_y`O9ZATI zmFkwnyCcd+?%lf=Y!bHoXJ=k4ifiP#H3!;E8X0(wd)?imNyo(GefRDb3ir`yZ+eaA zr+6EZ^o~_WOR5C3|Gt0io1O0q1aa@+p!x6L-@m-bb{^{qs6O#hOX%`Y%a%m-;;4R2 zoC0cAiB0CM*om_H0^9rh`>n%*{ylVMb4q;73LTpz?fd(_)yB1DyM!V?Y-V6kdLZK> zVcWB^HO;EG;_e=QR>_dw(xAL49jn$fuDyHxhugF4vA}6ottF}EbzVy*<=EkNi<_Vf7JGLoYF>;h8c)dw@4xcPTUd3<@fOYY>apI^ z!7ncuO=})}MfxH~l_V+2yo1+QCtEb~mjtksVkxxJEVrhZ)|iZT6c2UAR{%upAP2ymh&bynS^NddT>fCc^y%lP9$^U( zB~03_;udFvaqiQsJF6o^OnJ1^_TtEN)yOT0R!Ib^df?m{4z;{{c{b%1K2PvsJx}h^ z;+*n^mp=bKJg4SrBZn#;#SZ)2+*}DMsh-~6>({T#$GZcgWMpOa{`|>m9-JK1jtv;B zPuvWsG4{FjOyS_bzty`(!*U-@@V94clFHV6Pw({L(0r|Pp(^sOh-tN;!?)w--d%js z^ZM^Xtx>>2(bO-@O>f03PmgqR+xJ(ZpoOg4yz760aCAXvyJin;+$wxyr~EBWN9Moq zBg8AUEb`wE`&&l;{`Q}u`v3ZO%EHM`Bf3{QHN7kCrEuxv~oi-tk!Y9Sr30^3|(E zolIezqaZq`(XNBOi~@o0-u*cW$jS-sNQ#dQKHQ2w8pA9tElm;~5|R4c|F&F4O=-S3 z6CmsUThONK01oJ3Z0hX%M2$HBOFSz8lgfSmZL0V7F3UF)6*jJ*xBFUgGaz6isg^-< zi{1|8qstL_Vq#*al5}ID#I19uTm<18g!!$YCa8KU@~FuX;*?FbU`n|JTHu#+U_ zy1Mi!_xR6OG$k7$M5+G41$cyI;X+2Mkt2(%s{@e^>t1LIJdpETY>EE6ARXMhkzKiO zQEe?miad+ZK_O&6_CSW5ZiK0l?_7VBb-0)nGnR;3{uY(!#rm>SpMJJyiC?{X6)z_j zE$tMDs4=p(rtt!RM7e*W;6oQJVS5cAavaDK$7{>r{KtEI9E!g5tTN7bW+w*fUZ0m< z{QV+A=rzjk^q8RvT~a~msW{MnjLOvb{X|K>XF)2YbR^q|P3S>Ern3UbwX}dU0_iy%h+0Nvz z6epAzy2(Z3|0x9h-@TiZ4(RRgzBy+k7hTtU;xq50bj%(xv?Dk@k$`8P)2y_2xZSfv zS|04olk0Sw*a#^3obc$?oE8==glUi{)~SnOL1VM%nwuJ`f1w$K;~2uHEk*$vI@12$(bm@XkxJ;US`Psnm)E!o^#GTk$0Kj`7^c)UWIlQ|*H8?Qs|RZ++nl z-(hq<&m#t>85Q|Li;023K`cn7^O#|L(|x~ZKp#8N4<&>nc=5@{kWi1lI`_`3BU`fA zcgu>de`4Z4Vwi7`FE;otGb@z{y-U7Y*C#FF(Ai5u1Ra!dsk-r1}w~U8UPS`>>iao{Q0U z?%a`BSl*UmO0${!Xdlkm%_Z0*P_X4q&CNMe&i{djtLH?$6+Tpb*mKgBQNJUX zCBwy;tIU~p^PnETmy)HYqqYOP;rq)&6{tC8ow@r5s$=2^ii+H~VXd_b!Hh>^Ww#A- zJg%|2@y$01dBq4nBI7o*NmEmkq%iID*Mr#<&!q*Y_zB$%n}Yh=(^hQs-oxRVd5nhx zSs$rKiPgW-zK{QO_xG2eoatssv>`s9X(q8DDh(EXPe#kQgy?z9uF9_;KJ@QaaY`P) zs>#Vb9JJ73HkVZq%1r|Z!YW~tpUNj85sueB{zkv=><4^-ko)l0uf-_7z<^%n+UPk4 zYvb0ih*|1?dU%k4H7|h5F`SYRfPEmL&4ay;B4_rTd8v#aon4sjJez691&*NT^JhA* zLpRqO7#rWbefx0O1du>G{e)ddlI~##9NZhXZ?BmiZWpnVcAK$@4+km_;W$jKt__7otI(VX?~p7b3;oimeo>X+NKwQkDE z*wplJ&4c~3$aYQd9rrNu>pav>zXYIkjsN_61>c3mxsm2~7K{Tmu}_Uk1LIZiSJwxn zc`hwlwx(@#a&kHvBUKEnqrR%ABgb_DYy)Wl0=G#6lZZFvx=Y6(OP-{--!0I8h=fPd z6k3qcVn)62sV8a?AqCghi0J22?(u1tO#WyD^zXf|=V5@ePx{?(TxfeHIxW3sQ1R^CJBG{K1BH z{gpmhS<=Yp{XkJGSFa9{cDjTXC48R+gZQO3{n_!acqoAexBm*mVH5_1xOk0=S58%J zG1snno=NBM=p6}pBqgu~#}ZFI$+$ek4CKe*_`Uu_PwwJx3)$Je%`*G<&;CftQ%f{l-m`CQP-@Wz0pn5Q_;usQL4MGRq%`Kyr&=@yZeZlU zgT6^Q=h`v?>Ykm5n*sg8qxEJ7zR94sBmj*r!o9BuHLE$pmIGmG+L7&|7A+yvFjiSv zX=7`<6Ez;4z~^@sn!D7(H}NLe_LfjF33{PCAAhW{j(VF^5$Xj;v8Z)NbdBtsKMG5z ztoxNSNxJGjbX=rtA_*oa2eXsBu^mnHyUrDVkIr;J!HigykYb3I<(?y}SFY?D9u7=N z5ou^>7!eJOy3L4yu{mmb|6%cYmE4|*zbK3|E%LUq!%0q1*&`_-M-xvs{Ux!3r|%&@ z{P&Af155w^_3yH|*<{_yH1*tXhK6oFbLPy2iZCB3$L}^XquudGhhDYkdB!H?Ek@#a z>04Q;qrec@grePxwNJ=E=Z@L|f}p9T9i(_TbR}Yt2FJB5W2h5L^Zl~uvN6*5-0*X-;1!;6*LS$R|g>t&}412u+ z+*Ylp*GG^h>uMzF=HN)JLSA|ZphVan5Ne;XEQ^bC*3789yt3#d$=YL~1wH1S$NQ`N zUcC4r?WXx3app!4+nS$4L&@psrC+|>&Ck!*GC~ek!EO-nr{^}d3KdQg%$4ZSvHvX& zQj#h~zpj;anGdOD04+-!wigH}x;jRhv}>dbC!mTsfI^THEr*hzLE%b%-R!a=pUqn( z?Kpwv{KQJRk3D$fK6m-b^l(5-%=uKI)z^16{76kp3p^Fh@OKlQff$ut5Abxdrm@J- z!eXxF(5?f%^t^;Q0*o+1*oN&s?TfsI#bZHV%fOq4YVCl&)C(b-Y*b2ZQWa?&d19{J zsWZY5y-4}PgV$$JGPVj|@HTe^<@)iy05_;WO0<-tFStOYKBYibNea)o)MvaN;B?et zWn=Ie%esF4th~8_F_;Zjmr`6X(&*uq2mI%ymM>pU`G$mrqY`LmsjR#f z1*!{e063V5cb(FIUnwX8T;vI~(5t{i_{a`V4AdA!7yNz>_^y%X;ZBIZ?hm({QANOp zbT{gGK0(Du$Uym0ka~^c26)u+YjV5id;uUu88*Usab9xg&Ycnx5(-kgu#*Wr{0GK* ziWASK>;iUwg4*Ktd+=$hS?x8T@`-P?9E5nj&wn1YSJYrQUYT{uJ7dh-`;7v^gFXnEmi zYGSve7=nQF8Wr1!z!r0lmh*goPf>_MPvL?Dp@V(@Jf)Lq7tDQ(&C=5HG3!K?c&7~- z?Mv$^!j|3M9d!W zZvcQ%kOAt_tve;E43DBoa~bdRshj;9ah%a)zwzw0m+s!7$7>wI@dsfc0?^5Ua3#GC zuSUYB4BKAiWTX!Q-A=vMi2xk31H-|VQT?jOePO&BxAK-2Sr{4bHwJnF z(qpfRpT>F|K?^2v;#Fj+@M)rZh?c5xB1>B={&kuW=>e-6U7Z38GveF;Si~ZndE)?NVr}@`^*#mFFPcH)z26~_r1vnG90NM6J&4U;$ z`Pfi;r;;zg$X+M}k3cw*XYG!K#){Bam}Hynf%ifnyg@<(?wUbUik?jMd;MR)r4VxWkBsGp28(&{2bb!-JK!gdK9Etl zyZdwq&z}FDvG1^mGgtZS%naquF7-&x>i<4~(*+VuNLa1e1)Oqn0Kp~|F)@M}OiHqj z52C3;GxiOQC*lNz<1OS`yZM6OE5~(;I{6@pbFh8-k#x7tm$JKOjs83N~rnajYl~KbwN_T-ghXf6ITF^a;P! zDkqVmyTL)Af7sEGK^6|Veb>n|DsiBvNtQr68_K21aOS1fLDbL;o9^XjQ%s7@L_b5s zfW9*WuEEyEMjy~4feD97>{449ss;hqIJHk8E|53|$=EYARD}+w35nIh9*_DM`4jl$ z7ODwJ22gS&kUGH0#Nmxm&Dp#2c>it}-Ja{UW}>?s>Beopx26lAmn9Sj&}Jz!3lo#F zzW&2O3q3tObl-tNK{U`dgAG?KUvA^%R0@5|!s5ru^8LB9b913M4~z2?#|Xk`(FNRO z7B$PC8S4e=Sr3w702K!UCzBU+G#s0J^sR)@Ak_j1J|Q9tF?|6KNOA?53XM1V2Uk-u zjkdTYs6`Y)Sdj!Tiu2*0Du6Z&>Jf;2lC{B-p^q==6z7Og36!(`=bgqE$0sL?p+L0| z^eK8>lP;##EZ({^HzOnCjnha+BZJd2;FvdW-(DF=UYMUZY%{%di7oK}qxQ>)h^?Ta zl1o~en~NorP-cMGR0>%oH( zlkJ|KODngxc67*=1Q8*?w+gZ0pA3Q_fIbQ=CXbLcI}$Mwn(@`PBOUwksArQ6R~-&w zE3T{C?6rK=`a5V8K_Um#vScg_xFjDv=J1thN8FPR^CP_^j;OegCC}9*D+t?LY}*V`Go-au=$jn}3Y~pK?21 zRJn-03TBqKCRM&*=Seq)?ytD5jdg9TWEM1HBCSBw29swDaTYClBmD|NlS(GkrV{AT zW-Y0_1O%UXbq?!A@L-)~Cuv>6{c6pixpB_y`!C3{NRTLJqfQBKc@r=yOWDqgnA`juOiFAdYwxqF9yv0KnZ`s>Z>^I`3{x^_9-arQq zs)+hktp2PiBl=@?HMM|%0FeQ3s2>-B#9rS0ivDP{L; zIy^;MNC?L{Aw)8f8c?!SK%am~S{Li_+dOQ75BL^k>eI6m928X4BE%c=<60c5cp?%2 zLA2=no*p@d4EGFpEN^~%gK2eiH`>yd=df6m?G2=d54UN+ z(nuqR-ol|30fI&vQzPOc6|2OZH8gB@B<)S49KPkF5si!ffp!QDY_R-o>WH+veA@S* zYMcO^Bnbiyi(zGPMFpwTf>6oOUe!R!K$U$0tnlkcV-QL8BgKAh7Z7&M$wq6SC#Y>jF^svf^`CRAZ1iHt+RJ{?40 zP_*9YF9SRW@o3kTzYOA(m!IDTfIw5k>^$l1y- zSU{m+dDyn?zY+$vVglS3_^%J3oy%jSr?q1&zI}Q`76%*^IG%jx>OZ~~*~@tgQ!GHk zL8$3pAIAEg@&O1>vcJm8$}%RqNz8BGfbc$-YIYF#)vPXIBT_8I zVWeXl_{lS`b;?1H5>g8-NC9vvp2EN+;cc+8-NPjfpzNN52M%}*PLLkl+Ip#aK=hxU z9AyKxAQiscUE~|Ae`51U^9?bToJl0@t2b{drY56CsYM9iM6`+6_7o{#0Xy#fd4mx% zj%6@aJtm#1YbxU3u7)+ zGZ25fsXl6tO;0}s*)TIZ3lU)>xYFPqy-ZZANga(-3J4c9|7>BZ^CysA>gGhE_cnkW z0%WBeB{rlTGk{7qfbSNb99V#4+bgMo?*#))TaAsx+aAF(BfD~0cVy4w2TxSr7q`|$w@S(ife8A7T|-0LdM6L>-E}(s z(s}%i&E?A`NGrjH$oPi?nD@O&PTq;oMGV9sWkpTpwLB*1faGcf6OcPI`i3I#jO^!G z4&d7$Y$hbtL`%w}oTz}b0k(7-FXzTWv6r-c?M*eUVPoLe@kR(D5u-=rEhu%HU24D2 z==cXfxts=(-kjqq-swKwE*<*A8uD^_|50PUZjpWXv+ zuPPcgv&Prku;r@?=P2o*Cy?PuC!hQK`wI!VG+C5`NO5bTdC&Ct3Ctj6L&{;NKzHgQ zd@xE0tDHwPsm}HTNAX;ne@Ncv)4mlGvkk`{c#hX?X<-^hmKAHQ<(9nxpN9Odu9psi z*s}Sp?fi@_d0zOAIzCQq4RHXos4nMI30gAB#{&wZ$fMef_Ek5_{dcbw2kee9N+c=lb@82i_01P!ZielavDw`fMWrGztN* z0PTc|goJ4R>ESY{cvUPxLMZOY(;uL}@`9xX5*}!^&I_0f2NWSr2QW%(yI{?Tjopr% zutFcK7r2sG@ZTX=cKl0u{BduXDj^ntq>;CbKwRN`MxqCbc-`398QbYG7l0~%{9k(n z#0(dZ=>7wH&%9&;U$YBG)#2Nxt2oRlD570?Q=381v!ka-NZKzW^X&8s2GEc@@KZ#~ z2Usf|WbW(5DON{_setnUtFBs~ym9pkNFVtS|Iko#eQzR*Htx}y^sD3SIN9*cyt!m+rAA)N!jMuRdR@Hdik|N1E0DYRVq2_> z#Mku%Hfg*T+KNW^}z%A3%-K@pb13ke|vILrUI6FNwcLb`_&O{BNs-A#vJNd{eZcjoO)EQnx1r&c5tEvo~hIW9Co<6M0$Vd6-pC@ifv+_d^ ziS&zD*h!mCRPSTJYmmC1|nv>iZe#3X8V{IP#C2>pwVud4vt z>5OG)eZUv9CvTP5q!dKGG~!y)(eZ$Ii@FO}9l5u+98?8FJG*#Nh~F3%uNSlKP^*2c zcsA#XV_4y-cNf2C!PD%yFv$pe%R?}ktZ+oVny|ZknF!MQFhLN%F5suIVbNL&I(ftW zmyt4wnFt1gWEfF_zf?f6QAm@CJSXG+I}BOx(__UA7aLxdgOTZ!()0p&NdYqjV&f?2 zR9K`2(7cm;;x;>8i+oQQU?jIrb5@l_Qio6wkX{VypPf*Np+?aZ^>ae&59<`c^<||T zASSRUD+Di;-H}K?W-~Er_#sgms&~$p3>4vI`XHVni}!>SQI$BE2l9p}pc}Pya43S0 zVa=M`%5z}i{|BkUS#exf3<(y9rF5t@-N>JqfHE>Z0bv)Z?q&NnFx1=C+bfTj!5Iz; zRC3{}y`Fon*5q5QiaxvX9&bUSjKpcLpT_wuV*y9EFff$hMP^Zu%A&+aS_e4EaV~El zuJ03Zt4&Nyka#&h7uE|!{4eGN@Bfs&!zxdk7&lK%Pjdqj66u8CvK-fGr(A}0jM`Q5 zoKk;)+3YCT*4tR?J7QMnsM%!70BAd3?bsDk1O~MLR#9FUCb65&S)tDD*NirF)mv}+ zHrF|&y=HM~^NI_5m*1U}uVpwv9W-pxT3M-<@{thIvUZRJz5);FWIGETEj}+!0~5`8 zFPFJXqxs?##&p*ND_X_QaC9MpmQ8}_Tx)Ku+f0}ZNcYyBJK4t@5SziyPOue~1Z}Uu zQxKmmRQiO&<%%IuaQTR!!KB~|4*SvzEq(XDTq56P-y}+@URqWnNO^tB#IPdgWcbXI^~Z9{TZj5srNBoVME2b7p?hK3!o1c*YO`2Id3yqXnZI(X_@|sieGN$Qkd1B zr^oqDZW-@f*!H2}QTHp>=Ts#_X-=tl$lT`3PEG?v6aiubea*R;w~icz@eUWrF`%a7 zK_w-f|Mc6qdQeyHqxiKsqdct*+2}S1b&cLA!elJ>($E%KAJ20aV6@|8Ku#Hel5GNZ zJ3K;h$wK6PX&b{(*0maIt97}HG@EI*mQP1Qghw^jj7B}CZD;uf!e^?@yZQ|3c`0Hq@eJr&7aRE3!9w|s7tUT zF`0FK%Yddlcw(Psyj9f^6CW`#{^BkqwO|xWfM8oEC(k$?1x^n$LU1eZ1&LpV{J~^V z`64JYg0@7>Pft)s`p|W`<;@;^Yn^ZHytzfprNU72*>17wSbfo3bk5Us0V1!Hs6#W?r5gF`)m$zs4Uu+;ajZC>U#T+9pOH z4@S#VnARE{@m+Olyi+yj^kQ`8c3)W3^{AOYCJaalrTEXkKNWZ23WF2X$oCdR5uUX|{L7|H%=c9JWV$U#mp116Q_^ zk)D3#!<(;U4|s@m3&?o%pvv_+B76 z>X1X77XOe}Wpn00f)og^`;Hd3e{1kF(=2)bv(0#4_2~y4In{S9G{O>ngGvgs>0|Ke7RJD8O`Zh*S#kx+tE|#@t?fVTn#vMhU z=`8oYVzjMYO~(t`BGCn)wH{kB(5gig>XkpVbC&ae zs6tK}fD-Avy{CJmCm5mvo0Q1wGvMp5my;@2azUWXBFjuU)VGc7&* z3c3R9GqoEJ=^VD18x*Oey2JJ4s;HPrQ?r(#vDJrwHM!2tHwBF=g4!hB1ZP^L1@pUJ zYLm$}l;9`fmFPj2=&Fxb9O<(0}JwI@8<3U`0A<34Sys$Qe=wt3#d6Im(kzHqCqodb?nB^DjE3ZN-~EFp=Bmv^ z?Y`IZQh?=Ho*J<;3~ZFi+n8jPw~2}FR%qPSOb#iHq*7-woppv?@9il~E9Z_6bZK2? z%_`h}`*li^zK2N=i<<9qcU|eD9hHe>HPMin0F{Es;AF=*#RZk1J>JTPFp@wNfH)8( z^XS@yN^;sRJ<9HuIrzG>+m81}WrT3ZrTxwv`ipB?zkRR1r?1U;74@y7K*G%T4ETpftaT+<9;XZ$!UxS>m5Fxa3 z;2e6}cD>fTFCdXId5kLGo0)n(yGKC7mT^&AaK>2jMY>V>1Jz&Fr|7(r<@n;<`{#lU zBkxug`kyJb9Xwr|`dR@k1R+n*C!jgb`*7N~Eb0$4+P72%`wf~23{WXHzpbrFYq$AM z?JBU;*qK#(eU)0vER$ED9?jG9*O}{i?#Q-Gr`)(%;=Bz`J|n=1`SFhew%K-M8(ccU&TNpA%WGVd+ZXgMFU9%mb|y;W z>rAG+Df(4=>I3M+UtT(>bLDjWmBrDyruO@6wRVFp!VcPnPjA-sY_}{ju4sJu`>l84 zGwC=-mB_nDfxM}xugl&*6gebslxw=>55ofVyEF%T(piw#Xgb})+y!dV7R(#>QS8>} z=)d|XcBn8v^T5vB@6wyRa`%lZxh{Gynr_N$ntSU#BrqZ#9ufLl*ORKB!7`V*(7N?# zVL6wOZYdfQ;x`~|J`c~geVTt-u<`=9wG=UbI0MkpL+=S!@O!7BmHDF=dCf%^DDhR> zeh4M;$BQlHZ_8aU-WG8(a%^P3+&yaZEmkL{jbR1lQjZjE%XN>!$CmJF(z=Kv8oa&d z<@W5^11eSt4L`e8(4{oKlH-MG{-qyEmHX?(+$1lpdt!G(z=NUP=+gcd{k{$y^LEM8 z#{l= zM<-*{q8CEX%v&qf><6H-v}N4onHG%sO7^yoH5g^NICn2L(F{0Tu9f{h^?ecf>m+=jl^eUn zhCOv&W$kV;0`q$w~^Lg$tarfMySnmm$ImnFdlH_H2EmIjZIE+!NNplU@x^xK@p%e&qL#+KEUdm z%J*T>hgHtOJ36r{(`JEREKy{aNrl^)7tF1fhvH1lH(aX!?W3ynlt=svqzGcv0}6jb zP?f0JooAB75~(~-4!c=fh7bx;7l1qQ3^L926mO8_J>jpanN$~lV7=J97>#@czqP2Y z!{$xw!#;j9Y(1YswvVnC99N0iCBt9)#UWZX$v1e{Hl19z2r?T8hBgJ9k$Cp^ps0&% z|4J;f7a@QZw6;cpJo$t&$1|rlq{z_kcw6K!%?d%IPmDTOOt$vMnXh}II9)*5dwD~G zPu?C1?CjoQ*Fk$Az*dp=+~-~t9vowy=-ZZk0*RsJmqn3Ni!OWeqOsi4THhe)JCp3- zuae%o4o9{b?|kR&+A~4DB~kAQ6D6I-x`c_2m21~E&}76+4U!N-^FYAFrr-?Fl;{S} zEiNurMoVt?0xU2xVVG<*3@fg_e2j~yUU?|HK}VqBc7i>%kj>E6$ZE+VCrX% zXI8BF{4Q!uZChtPeHSf;GX0dNGPo$L*e^mu9=I zp)fpH`%uMZ#?T_E;}lx$t;dcXtNL^GgGvI>-v?BZ*{}EYc(eq6v!&A}s6`e{FfI$L zuvAKUz_C;PwN`KEsmb}lWut1rH*0n?tY4ZR)nk&s&cVkp|5nVZg)#~pUuwb6PDl6| z_VE+z*R3-Ec&C6k=V>Ty$2>w=Wc3qeTYWalis$i#FZwiVOLC?B#CC=`98q67`bs5A zc3aK0{LUePD@!%J73z+#HDYc={@TEw%PZEw9w~#_#yt&8cy5y=;SFB4j-L&97#DKB zw}yjUKuj3cd_7D-U3(zg+aKKAk|lZeY7k>2lu;qml{R?T%20`%NCK7KW?oR+8=rEc>G=KBOIys;SH^B%jBn03reVO-xWB{BdvH*6y41sAZrBvBJ?cCk z{UlEb-9T8u>*V1dW zVIzOeZsEAowy6C6W3{O_Lf948=WZ3I_cD)4qU-bEY>@yVi=IUbQoLaTH~ZLLP+M>w zLsfaSbrwY@gCq~|b~@+JgE(+W6~f|KN;uwL{Gdcf&wA)xbbq~B9gAg;b>Ts^V^1ZY zrhM3SO!3w}eyaQ;l~BXz;#NqH754>>fufw8Q{}wMmt!j>K_xp6vY;q2$6 zUE4fcwsM&u8^P|*3N8G#US42EsspU=p^`TTx4{*^TKl5u$=hYt^sq0AJRO!rHfjL{X4CXi2OO) z#4d?hb>eaAt#7pKxv_5L%GDap<iFiTc!GE<>v#1DBXF&MlchLtWX#z;FwV4BAjK46)DR zjKywN*J3XCP`4>XBZl2&ymz=$r z9yHyi&=SYv@~(^yJ8_pPAV=mVnyi zC7wzun{Q_}Xb&eIyZY^$Gvt^60j8VebmG%R$mfTOFiXev)T{!@L_Rl*E;v63&Jg1GbZzI z=Pi0?*1S$n7bkOg*tvE0o|cvV@n6oGq3~{HWMrg(7Z`7Wa$UNao?dOEsr~bPKUSuh zcQ{v~(|rH~j4hh<%Brfw^I2kG^9O)~Ny(> ztv6~_Sf3~wWAA;{qUMuB_0C;ZnQL!M%U&P7yb)3sxsrew)xdSYZBv`NA2W^qOhVT% zdUG<(@+{ce8z|lwe(tM`*o=EgG=8EV&vcs=2I5Kp8BQUFKr*8OOlzie7xzTG1;@T) zp7-Vb*aq)SwTz9^8GD!lM9c0k4^rD#7PjB%ai6&P$71E_D7p5JhZ`#*C^L>z^-Muz z0xw3&(GV<>PY6~9W4E-lvu2=uHpbN|gFxef02J?@RDC4}hFy?EtMzppEqFSAyeeT8 z)TfZ4VY~z3alna#eRd)SRCpXXilI3&pq)oTN<_y6`OAMoqWUiLiZ?%s_Ps1z+(TW{ z>a;?fMgZ=_pqn>WLGSBAL|HrXvBTvy(@R5S0m4pWC?2BYkap}Iy<9hVq;9}sVUG(; zN&>g3qU|6C2$0GN8TkGeU3=KaAFSW7!3YSH;)beRTY@TCb^pod9!~>t%8Cl@?l~3f zx}PmKe%ZNtubo)TRLQy5&G#W~yJQWL_T&9&fJYRdtX)T6eOBNcKAA0x-jj0{^e`K- z!cbs~3P>IKa+BjCy>d;Qx(IH(_?jZqf9mCzwVzAem5QJ~kxL&akW`5kB0M5zasL-$ zv49`rbB3)E7DWlq25CkFI;i)g1QtLnQnRG?H}~-GTebNgZrV$>MoeYNO=0Fqj9i`q zErjjKo4xElH5k_g>$;kT&GJewjBlr#niccT%|=z=`>;=j@SMXp7oHZ287~kx#I_6G z^AKF&bHyaJAEx%&*_d;t;avO?8<7F*Ag~eZM18No+|-^$w+cGAhRI$7O4}w=oUk!(#gd$B`k@htpa~2o1Vezvl$})z z!~LF1H(kKd&k6@sA98UrTQ7PK`Sp8z8L9QUdS++agQpJ5l!(Kqh!?#U z7iSbbK^r{7$jn@U53Is`1|~;{-x*e&B5m7gV}w(@%7mV41PW&`uf{GiYD6P9e*kF~ zql^4dK4CN~nwtR%Gl7Kltubl4>(tMJmKLd&a8Lst5&JiIu2fRaH0TVBo z1|xTC;9wBTF%-rWI0?*xd@_>UPWM|@J1o3hNm0GG$S@R1clq+=bBu>LuR_yB#m>gX zKy^oo$oz1s!27dnJJx7kuT}1y=jAz-y0Y&X6W1;&6yrExVlw^*mK66KOr4oUN)AE< zkV!(^VxpE=%GskN{Y+Vd5~$F-8ALX{2(5lA_ojrd-@DzgGMR~zt z^U3S0H;zK(03`^cGD}=-89ZR-FnEH@CgY<%A-6&4=fJSmrsPH>uHo3+?beQbS0*Vw1180pIj z(g_VWH>ohKj$@8h7Vi7M0SYQ-XJ;Zg5?d@(ZY!sM2=j!b>#-eQI||vng6s5}X|=4G zjaeq0hh|4Q^N!(=WqK~jB4kYvP3XR|HL78HBPJPGuXmlSt|hXW{j~0fiz=$GW!J~M zM=4Q-XNw-OZESCk$y@yGhf7tCL)CPuIHu6?04_ z5{*V)2W&hT6nUU5;-#p-*-bp2WDp#sN^7b56{ZLAJJaKOZ)>Y&!>Tc z`!FCOBSEIM)YQ8K1vde~X;h+qkP8i9-ZUU~tB&jM|7)q2+O1dTJk)zfRVnrJu-}z0 zXQ!R&mnY-dpo($>?qM7eldc64Ul)^4kV}`=XNT+^EIz8xqY43>H00t+fS8+ z-jdghRq!E`r)16^?5E(XPe?nxP!)q0y**+9PzXnkDT?(sYJ{tUIo9A-hJm_ca!;V0 zi<*7%A}ep3fRp_i`okNfEu!o}SAHBo3K!B{K1GM+&OM#Yudh}8h;3+rO$ZMA9w@xT zM)_-~RlH#a_HGRB8T_7y7#Fr@`gcU3si&p-*fNV`WrLD-*J)h5;vPnBd`U6>$Uv^P z0w9`ivG?#lHE~D$2{CbwA9Mx&eL2@IldV?Ve#bOOeZk_kW?J7{jaHb7@sZXV~lE&0U0Nh4>dt1-|P-Ue(DP5!l28|Z!tK@W=*A_az;mB~UU z;n3GaZO(by?@#31w;OwsQApUqK<+?R+`KO2g|~uGpeZzPurNvW?_iqG()F}z<0(woG<4)&y{f4Z?ZxR<5|tRT6GDpBLGT-Hv* zt8b5c>OF|1*5h+_Hs0elE*enh?~Sp@w;)zA_Hck)Eh8|iiT9v}IS=x06YLc)lecM$ zFY8K|b2@yspsBF%8g7E3?|L_YG9-lAC<0?(wk9pAf70QRI8Zo(SALnnwe}HckkCdixJra8Jb)a~?G#K* zWUbw>{^0>Bk+)wf%b)&O!IUvYMSA+r_xw%-ZrHFP4(4+lZw= zAlzfJn_QPe*nz1Pm6bEu^4ykuT|EI1qUk1m-rmo-lC+!M`tTn}xMOR8(yn6T)pPFOsJ%zT~z4n-xim2^*+ON3||4QfJ-Tn8h(v*ZucVnT+8!E z2h*)pjEuS-IPH+u(LCI|y*8m6`1+{#DaAf6Bv;X@>{txl!TG7)ZpH8~5quESvhqNz@V%GRFV@YcQ(Cg!#UEGpEr7*o%CzT(xV~2}x2^ti zxB3(HsC!6n#ES|gQ!gvTwhQNZKjzXF|h0tPOPpD0M?t!aF4x9!AoLb|((nSxqmD!9D7aK{0iu8+6!XK$Wx z7=L71iX~#|nrUq&sCFJ33HeNSjv=LZU#eYL#(nLeWf+=(Ke`6lo_M#Uzs}?>Ed;@j zx%?BZb%Ar8)!yd4jKizV9s)Tg?N^X&8Mrt>@sk;A9P*;3BkBr0NB>zS^+@_$iXsrI zZr1lXfRC}UDfVMh8_v-mS!SG7%)A7bI@D7&_{KABx({W4otJ`~jTs)swKbAyJ(hm` zRg@X~5f!96_MwlE2a%-;KYu>Cfy;;UA-XHFIWXTP;Nyz_o?} z8!`I^Cklm%*E%rMU5ck(qQQs^**=hUKZ4P;P8YGFsOK;eA-Qtz*x^NdVkH?Bd{;uM z8}c>s^cS1AzH1x?esRW#skvB^cM*|WF#7xv5`Z#X)F+>Ya>B0x2bQ?|0`7-+7iHPo#B{bRsm)c6YRfM6G&1_PD|+ zfu&CqEwV4VQzKDk@}9^D>fWl}Uyx5pz94u2@LH(E@m2T(#oOEKvZ_ogb#u6AMd*Xq zVjK>ZQ$us}i26iM>H7kD{YXh@LU2Ps99WA=s4|Hfw81o=P$_ZD#7IxF zj~^4aE+O>F}p^ht@RU42GMW-iq`DYoq>Ifryqmz^5dL(ie38w6# ze6xrbZ3l{WHzQ zsE`3>SlYmzy$faS`S>yArrzoKx--%u~pV9gr3muiUu)imP2N`GTgF$}rOhQ)-2Dx-sb75^!6f zr^AhV`wGTAHH5YZv-Q1HJ)-K|HFWGluwNYgD}W<%LCFlb&CML@!9gV;!J2W8&Nce2 z+*X;&b&|JHt=0UkmE50!Um~7uJ@?5inEDd6qQQjmhYu@|o{$m_VfdEZhKFVGxoohV zRz(6cu5Irf{m{vBIqohmgdS6lq3D;>hM+`yuq9fN@>zywj>jwdC!>coK>EQIsgVtF z$~-ub`1{*1xX>~&F`?F^R|4)-Em|Xhd_YTXhqroi>dz(L zUb`noKrK2#yh^k;n4}2b2y_p@nJfU7!CFLp61w9t*_0r!P1wkSg54OoaKXO)&#j8P zPaM%_sFn}?&z74KU>&|;^jCN)b!^+j-3zU6vZM-~+n{?XcxZuS=OZfWw@{T!rkE#j|{&;Ijq2ve)0QJ~t?A;_aFoEH$4n`-; zoCE#+j6auvYvAKWTv0vz%*Y@^%-qVXzy^=C?p{8(_FvF-n$Kh_c6Pe(q>f{);WP95 zKQA9R=h<*}#Gd7x&YIJ&d>p+MUU-)pYhOdk$`iQo01QQa;r?eUxKW7%fb;-f5I^$u z_r%0Uw53$Pj9QuQ6b4Os08;)@d6ODa9C45NNt(t53n1<3PFC_ulgFamTLPUFhu=x< zcDA9Wx>+T~et^6JOs$rT0n?U?>OIuq$}5i zmW-HYwR}qicK(uyIr}Z)H6=TV_3Sp?TPYW4UCwLL`kcBaZPZ0IQd0TKW73kl$W_c^ za6hbU}Ek!7MRBSBFN?r$1z7)i-JvOio_PB?mjaFlABJ3fs z%2zC?Wl!96UG)n!_3PVpJaPla$D6$k=lul^m~#Krtz-9KZuR?eG(~XR!2tF&=VNo8 zCvOO*Uh`Ejy<)goW27qn&lRs4Rl{Fe$jO0$s;Zi|^u;7>4n&fIV-M~>_puR!t12{P zWc($*XarB7hf_ktj<{s7(WMs!1?jlsiD4PSe*DtGc%qm&iD3SC@@V9JG*iQ!INDt1 zMoNrD=2tho50;|Z5N9<2k7*@}IlNo0W4tv}jZm84lUXB%G+cb{M8)1)zIw^3PwGm^Q+I7-ohByfK6t0=g+Vu)b}ZCV|74g#^3kk9JK6kg&p@ zh_6BsRq+B%o93rZ{%CO7b%_$tdZui@p?otUJ>O(*jFl(J&J;6o6CB<<|ouQfvpV2mI9f)?aacjP8b) zkBMr{84c|O?)NppQ8mA})~20NzVvF(T__+nUY=ZkQHbhu#Vs$(#DPnKUw4S;RS&$I zR27Ih!!By?ALjApDF_0Xj%zVtqkSi#AkbuIwjT*E{Dg)C@1!0Ni0$B&^HJ5~S%hiL zI&Fa~k9b6ZvI19LRv8iS5Cl_k3||EC5W%b2QjcyS5{Uhp=HdNg>>wH61EGn<^#&Kd z`n`DbRzhb$p^Q)00B~z+vYmek`<`&&{F{KOmU6hI?YxV(p97#unlzxtLE!~&)?r#! zV*=Mk@{C|G;vlwW;Ns6?S$O}PhOSZN{P~@@&6COaRj(wwXLhF5+n~@!hT<2zNV#%A zZ#s(+=s)pY!3WtXr8nzIVjPf1u&EL^K+33taea`s&Hnms%9b5RcsfQ*QfHYHJpQal zm8xoJ2q5gW%{VW2#D6)H<(}@~V;JVBj~zRIO#0yB;g~d^YjTNw)=!#)8+yy((D1{& zEpFY)NA4n=>llew+g4Y~{Nn`X0QN<%UYdxDJ=&z+>~dh^(zd6Y)(HnpCQnV6Rxa(i za>H`T)I;Keo!tj`=SjpgeyeJj_|Vhof~1|HW(`V#L02!B8NusBA`XhF?-%jhJTt9$ z46SDW_wRo?t0w~llk-m#ER<~{9>^=%C&QOdG;zu7R83?1Xo-6U@G3fqJ99>+4fXZ) z)Ab;iBpYK7*pviqzhI$h$FW9qm0HOz;7hXd{PH|n0Oms$;aeiAo~+f6pdkrTAX`%| zuR?;iYi2ws2#pF%=^#p;82i0Z9mkFP<8AZ?D7J{<1(hwO7WR-9@O6~ZE!p)$mFh1q zYQB4v<12P?@2xIN(e&kgi<$N+58FkwArywfC<*QLdM`PLn*Zyx#n_5m|6clZDw5kY z&8gUTw3JbOHK|X+vDN>0$>Q{|A6RVMzv&Q`2E`P=38+DG7T{e;4Bbd|Cd ze6Voydy&K$`ZufW#AuG+_!(xxx5@ika$mko#@|SoKlC^xd1ckfkpyB0Ax9w5^~uXA=i%DfXyktT#W#iVrV-7K4cwRZ zzf(v^rfQzwCb*#diL>Qt@x1fQ7N9oqn9_-5RAA7eEEn^FF7R#~3RPS`DWeHpdk&X< z=}GdKTH-q5DYRaKCH#1G^|z0`S1z%}q*Zp92^}6cfM$9l%HSpXcSs^^YHC7~Ml7-d ziQNyW1`GIalYan6tbyn$-3166NrNTf9jF8-`kVXu=V&&+_euH7Bf_?E@MOBiyohPn z{N7eR0U#a8fG%<3f(fOWA}A76`WzQw8*Xb@cL2 z?KIv^A|uo+?7sCXz(32q#i9N09b|b#5|bJE16Iw6d~c*K{eKhUcK%1Y=G_NC-0C!MiL)9TAnOWN3U=DVcHWTF%8=+nhHI%4Um4ZY@jCb1tY7l{w$*)QNK}~IgwgA;o>-Q(?q$V1{9`=GT|99RsxwKcD_Ud!4 zwRrvT-;$Rm(RbnP)6vsQEN@1R)_U;IsR*f1i+}WHaR6mL-M0(S%s_t8hI@x@%%}XL zUb`_7`S?>_D|5;SS6J)UpYO0+S@v^h`W5=i*P`we6m6J9JKaApP=gZt{qSdJGbs+C z;iyBp8`d7HTKh^wDnKZ}*I?VRn}xW1$fXZ|UsyTZo9Rc&FJUjmpQ9*nAYl%F;XSUF z@#*@i=?RapfPIRy7R9d&VmOaasVyGQVtnvF9fRO-)I*{@z~=`pWxBrXXRm7PJLwEX zCr8T4ol8^nXt6Oi6kk`%b64)IMMD=Wc3}k6Oz%Ff#HEKMUoTLG_wD z5a@NIlgF>R1&1VkhApBK)bs*UtH>4o>5NS@%;) zFqpyaGmP0DUPGy-sawag8UIX+I?c{5O*XFfiQOOPvKs|T2#e!>3Q#}Sc75hhv}jNo zhOVR^QdQ>IN}teJ`j!7TH!EIwI)IWEZeiXQqR+#{=`q*i4Eta0SR&`*x5>+t*^6Tu z3;P-f4GvF7BR+=tsRnMuHntlM=_8Bs+zeOswEW72rLez3SoDAn!4g0nDFpx+$e((1 zYEz+`_tmEzR=&^Msw1;rJY_AfIN%?!tl_T8m572#Kz-Yn_pmD&0B_*dc#(cMD#nvatXTw%({6l+ya@v@PhHX5;rrO zIbkYDR8qp1ke6Sde_KsB;QkqPWev#^djkyD_s3#7f$?!ukmU_2WLNpWvU*;-2qz z9rEavMtu$c_naEaM511ypiF)(u;WCm7}Ynx$|)GPka5B9md!iihkQRV^i~vfKR$VR zj=rH5c6Omik3nxXh-Qu$TcLxb;oO&7TwHt=hG=k~M{$15Lktl-K{4H0Sb4ATKu20I z(*V-MAQ4_WX)+^X|Mew5A|DC<0DMffb7-)?PJHB!)SGR+Lf7G+Z+UEvI!~-Xowp*D z`7RMX{qdKMBVYESW$;G>gcKR^dSzMPl1~<#u!NAVy1dxo)`Upc-ueOjKI}*U1xIe{ zk?}YYQ5dWJNUQ`#k^D%@;FXHw%XF!4+-&cYZ^UVa38-?}q5;IzK>&KQ4ABUY4@3rx z+=mP1e@#msJm6jpyVySW%`-Tt;rZ}%8ws5wOAeqcx$DF_Bh6|&b!|m{{Nf%XQmDuy z0Hmma*2=zQWMPv;eKJlu;TxBVsZ*;SZ`5iUc7o$ zizbX15$0op_|59=&<4Y6AAqz-CI-bUgxQk!+Tcb@lA6lc;L*^;|1Z4pGVtzb9L*GODvD`rr(3>6ZVV$ z%cu+Ap)*-!2rVHpa-*## zgqes5;4C;sP?*HX6m-B|k%+m4SG}it0|jW3nZ<<*)AMA$w#q21xapW-cn78+{%GXJ zh64TqltfDZ@@+u&yUG^kxeQ0+>CGM1qiao{c(zIB+|Sa{&jL+K|L@TzVOv1%eI_4Y zX>napk?0uNu`iozZK7rW>cr2}ubE?FRb@!04=nl?x-Ee&`S1UmT&rtpcKvD6|C(ta z=23tAO=wE`2gWb~?|;@VEry8YZjX~YTpDH%<`=I0T?~H*Rx=#B{p1(FjkBr*g!YGV z&LKtx_X`y7-h~5K_nLgkJ{Pp{gK9+az{ifkEIKyVs|!0HYy6wKQsc7OE&bbxl>Gh; zxfa6IJS$gzS;m}YJK#aOS1@(Ji)Av85{Y- z%E@lws^DiIRhI#u8N2`g^Y5NeT`wo(3x^m0|7C z!Twv`_jL_oZicn%`6l%4{|}}FkwPI14FV*zKb0y+L_RokaN=uThPAtwyB=EXvxYoE`lu zFIP5>cSp?FYtxOtVDHS{v~T+M+N!VnU%WW9bdIxWnTqG8!y|`~=ORoejm}AxzD0wB z>PdFgv=xw0o-XM%%HOLo#o;nw=HiO~lzC-!#j`Es^AABOsZXCCCjnLxFW0$_3^0I} zH_Os)rqhZf8cdI|Q@{*2fDV0;7rYW$mI|w)W}XXNo?Jh*>OC*iSy7njaI_>jaXD`@H>wT2_-h0AQqves;u+e-$w$f${XG8( zHb8a#e!8Isvc8BJk>|LF*Yw+Qn20KX4I1!Q7Fv0*%VYNCYG`D-XVdT~M4Jp~!})ja z-1)Ye4Kxf1mwIWTfhp)1Iw#Gpl(?gY)mK7GrSFShF{B7g&_o~#2$>eaICH)~4*bu9 zc2Onkd(rgMH_fkUO*!Z0eid+a{C=zLJ(_OPb{dy_uKS!l$=bRbFT-B;hr#)XA-%El zvD`1`FHt$)t@imiEO0l&aVn+Tzwh_PbGsbdo|%1)RTz9s2enzVNAtxmrnB13XR|Q7wLQ}>5R`N_ z4;IEW;PoMEYVLL)Oc<6BdV;^F0~W)y7WL#4INAJx-XoZBxTzv6XImQ^Mzx z*PApy)U^HFE;BW>ZwXewz$6AnJ>lTmm`2X_vrV~ViX{=Mc+^Cv?&8YdyYXUp?G=P( z>g9@OZYafvpN!3M0y$(Q#PVXJLyIbq91_gxg$)mv?NSPiC}@glF+|d?RLC6*A3Xn< zSG^l!6^Ug8-J;eU-**a4E~Wu*LaSn^ik9XUX8dh*i~j4XcXic_c}w|b)%R;mK)yht z7UZ>ww=uLT#;A7jx?%mYmq#OihoR{Qbl(|0uU;O#{vDo;9g$3osj$TNM8W+xR9!YTC3PrV>=t{uZ z?a33g0=y0l5V6C@!7?YW^6ly7sI&9F+p1K!gbR2+uda+d=pb7`>cnbhJrR=TkM<2m z(E`Hu^fA0)SjL-QsWCs@rmmg);;(_xSDKHqyS7i5$1*l7okHZt#XW1;>3vSAABcZl zQ<<*=Fzg&_#@Wov>%EL8`zpd650yyo8CM~_D7unC^z$T;38I%cFnR(C>AXQXC{6^l zhotufddt)k0YEf?Cci_?$i&_ZKq%^8w9hG9LJ>wJ^bsV-N!AMW)xd!Ae?YFH40dIX8pB^ZK$P^tTdFn{ckugGY9 zU|#gooMgx%v{^n=k4fzSModNESwcF=N>QHScW!^xV=PGAZP743kZQ^HMdnUq(&srg zle6Di($3Ts?h)HvfYSw_uo|5jA_b18dV-#15j@8w@3-mm%UdUfd(3~QPSsXPi2M%X zdNg_UO^uE7VS5hA?-$jN3$Z@imv!ysyou65_gRrm98%xFG^J|AZABs=+Qaxy z)B=7m>Gx4`1a>{zc8a>gKtNQ4{T8xrckp4g-zo z$Bi-d`naWHF?8hsj*+l+=ueyTO7GI)gX@$B=gllE>LBz_eiYLTc-w2?=Qd=v)e%4- zFjheBv+NHoLT5#oj4B-=Yaoe(7V$eGCy36I$aC?`rUsf%c-WQg7?r5>@#azfQT_nL zH_7P1b{5162uPxY_!s%}5hXnuP2N?Vt8;v15B1NF2c37D8LisqIEeLipsPu~D1;)r z7oAvnr-T400)D)TSpq>I#{qb0F2dNrmN{0L`aO)!q$_fBHdRMQXLv!I?EA5lt)fhh zUu-;z-RFq7nlvUD1W9C_U3|W$xk^hJv3FEDmwww?Ue-RagnSU};~)+e zsPYzjKR%qBoh9M-_+aV}QO|&8L%F#i#Zlb*@v)JXszUw+o$p8wBm7JZ)N06G(^Aaf z-UqI&5u7L40EuZk@YTnnC!34cO;q-D1)^Z!{RCYr1?ENsN|?6r&cew)m$$OR|JjZ} z8Qh;X6ZkVl&Ja*4@Dj{t&a@w7<$?uR106JouuX;K`))3$FoUMjUp=6H86Xv&DT($$ zON-5KF$@pF`4FpEMRp@dT%^PKS#eM`5R5xyncn|W^~d}Bv79@ccgg)eh|O*!R|o%D zTt`|=7e)Vgbpl}7Z}X`V+fQ(Zk#6^gFqB=dHJ`T#%}+;M~ba*?8&XQ|eD_>z#&^UB@R}LSifvY#K)WLG=@bKu3<#E1~y2-vWd)orkoB^9I=olQ9KV9)ULGHh-pwI zT)%Um7mPimxX1#{bNR67$uLE?fTK=wxxAH)Bpsi&KMVbQ=Tvv;KqI`Yf(DZnUr8G7 z1rSDr&Vf&XRrtqhN6E+w!MuGw1AXkbMROUH^%+=840B6LN^U$iE;(bo9BccmCm(8~ zXKU)uoliESVp9Lu-N&65a@WT0C@DS}tDcY6 z3=YJbs10|s3mGR1re%Ffu^MxVF|bs>IYB}0cOHr?teV$z9>57nk@sli9&Y%KRmM<^ zA@cXG>9x6WuZ}kE>NS;bm^fC}-#S;@o&8(z;DH_X6Ke|hPfnb8vM9g9*39A8zmB##=RiE=c zw(HwxEktE}&;IKZBYo+Jx7M;gNcc9TY6m!bpp+#FSfc(N!pgcw1JGa^uyHo?R`9Uc zZ#Rc4o(?B_ot1`FD*x@}Gl8&eA9*XMj@_Q&IGM-0-PpLIbh83m&6 zFW_sXAnAORhvv`jUB!+WD~Woie#_WS{N2%AamL{dzF%p>e~7A9<9@=IMg?QZ5Zpco z5&dsH>}n>b+z`-}t4={`iN|jhV4?0UF~fw#ILd&Xonu z=EuHOPlIGd7?2*xcmpt#0#bq~23M%pPFA=EfA#n#^LC6ZFGZ4aik zcZMqq6ajD!Qu(X)S1XMvrF8$3NJDqI*H^pj%a-rQyQVH4Df3u}z|Dy*!nHr>&PKHE z=25dgiRB3tB}BKY2k@%tG9kv`?#WF3H4H#8!rG6(Uclso|GV0K@gUD`gY~&Z$qXD? zA$DbDWw+4oQT*fL49x-(Y!H~CPDutRBVI4tu$93_Og|G_*YEXq0EVL3NfvAyC8_H^ zJ&izNsz8V+Yl}k{^}MfMyXczK{AC*hypG4~>GZbEWvrM5bV>HFe3Ebcn5L6eCm(Pi z=)&H2K}N%yXjeT~slpHEWg5sPB^0?#oPAlh%bx+uVYb4`z~TdO2qV5`jr)JqTMLoi ze$NGXTf6kMw@B@$%bm8*^73wMSw}+?2%b?3R=;D|DyaLT>5(BQS{*h7ud|aD!3fL22@Z_^i&p_MeUPc*} z(RNR*j+HPmNl9j(qK*%mfioZU#D1qTb8zf|-+^W)nwwO47xOHGzE4W-au0{!4Ra`W&T=wm z&<(5hyQA6#*4!d(oJXv8ZneV|jUR~Y0l)yuym$5!@gYLcNT`$@a;-V5!$#RVira*P zLhcaDiko?hr1w7bTzK^_>x9)ZNj@78%wtI>q2_8hSSY+_{BOe-VYetmc8K0xim!@~*W56b^!smoQTiQdqYf{9bS zZ;Yvv6&u}44}Tc-V_tG2t^ftY`gb)o1BMA+$s+(!06ASi*!%1MJ}2 z;>DSDkDlsE7xJjnDwTUG>Ngvf_5ZrI9qlH1 zVMZ>l_qci@g|Dlr>;2#Tg?C0|n`jg2OPV@ytVjej{Vm^qE&5|Gw!~Q8R@`fTc@dWd zt|t0QKv+!sXFu%*=l0so65wVl_w}dh+Xd{7B?1}xy$N+{12mj4Pq@MZ`m%P9T4ppn z@(?f#V1z;pL2YqQQiaO3rErd2(GkOrTlviWt=lu+Ma!GMUfRpDb}frTb0~XB_mtQ4 zy~duW1LvRD$}4?Ha~zs7{Ss^J7~nY5(v`zKde{QQKDuNQK`+Iz2?FY5jBjdQCTi+W zP*eZl$HjVr#sqoqZcY;;O7FI+H)|e>@`&(8K$JiV5$Gkdl?_3|=Ya+w?EWrht8ECN z$F9^+kP#67X25w#hAzD!QH87<=S|ObrP_H)(oLQ?*$o{)8hjt*oMR#D5$GCc9z`5Q zd^Q2ip}uI9n{|~u;j=|LjH>zhi#4~@4!z;bTdD^31P<5usjGb-iK0X&aT{dIFdj1B zv2mtO8fk`qZ?vSRt&2C`QcTK{FGXCnYo2C=SrWsaeaF=OpdW)ofw&PNWsKUa8j;F} z4OchA!*xmv##+-hU~){u&pi5UioUn|w#`7|9|!RQV}wW%jXTOMVn*egn(F26V33;} z?>UTOoU!_leaHK9`?J=shUHEaBiFZuxojC1rWWRWomvU%a}j)=yv+fv3)_nZQw9sY zdSVvZ-$rc~`W)x=%RYqNu7xS9xaq{)P)MK0W5vhsimwiHIrk~8`4;ivPMya6@12Ps zoD&9Y{TW1nGvLvaEer%u`!N)i>Q4lgfLbr&QNTXWI~!`!<7;v1DD(Qz)oSA(WJe}? zw{<>XFeMNOf?3hLrw1A(lu$S+*C4A~CsUuyrT1sDYJR&-&Wd(y^?fXGl(oWEo`U@p z@UOjvK>t@~epYt6ojN+Wt0sDGE)^-m$-%F^RsS8Sv9vJV7)Aehi@1Qs&unC<^&U~A zBir(z^FgC{$65Z4)X*nx%|}az&9!gorJa`ZiYznw1sFU)u0_W5s_=G+zyjoE7h%6zfOm`8ZPxx4tb!5ry!IMwjL+n1=hkAX$;ZF^_^{CwlNAzWKgLm`BBx6uSh%so=O=UssKCv*R6C^aZ1j6n_NuYRV^fi> zQ9R){pe4XJ{S_w&&W>Qo;tj;2jy4+`U9|}(sH3BUzUlUjuDN3Y+s{ATVbbTDC&|R( z4Fr*F*Zf~=K9apouNo#5DxfXlol(xEnBpkUhoNhj*+z7Ojg3-dcNwA+9GCId?2$qH%XWX7+PbHzbQ~zfL<6kJ|7ZMddV{?X+7;&Lisx5D6Y@8h29An9w`cLXyflXb&7H%Th{%_@k zJ3oamchJ}ni6e?1$k9vhO%02T&OdYVb9DSx-1T6~A9i4501DPs!g1sRF2r|Mdn2~S zyibrP&jt>jNP|N5v+cKxm)}aJSbJ^cPFR;{$Vi*&>_2K@cA0xQ&l)ck$tG%B-LH`- zQrvlIm`46le^oyzm9fcbD?O@SCH|N1vh`?q#rN<335yNMzzy1UKlPRJZn!fdQuUA0 z5z7<#h4Cfco%7mfT7D5tCk4Aw>32L@dy6V+jB{ibs9F*p25B8I77D2RvaSZKw*V;_ zo2<)=6`vI0{PCk|poe0M}DcL(k=SG?nGmW%QS^TXu|U#Y#W8nE=5 zlext}h#Dw1;dTp)jEwAc!L|Z)EveWmj#Z42#9%gO-zvRXL$f8+vD`UsKJdiT_tvNU z$@3`E;M|(v64Lc0Hmb>9@%)pAPSo|yNvGGZ>01zZD^oFuiwwc*xfg2Ik`e>RG4f|= z#B?SZMzW1JD9nwEpOK^bw#p{DuXV*c<<>?Hxmb(>WHA|p-o)X>>|sJpO^rsap2##R zxy`-OdgC=lbsnrsy4~ZsQ({_JwME)#ltkZFqj8RqV}E)&i}-Z`+Ym36+l<+l*3i@M ztJX%g7f!k_-hO{tr8725xwGDij*Eq*w!p6Qc2!HhW!r1q>V#m$SPQhWw}C2+ieB|h zk4P`E5x9ontdTwQZqvVR2EUtoFcqH4edk`Pl%SZ{NeYH~v9x31d_v))-Nky8YRop| z{^(uYv_sZ_k_;W7V&3x-2Ign}9bfjZ-=!4?huJ<#l5S=#0CV~ES9>r*Pwo(p2+%P6$7IWYEZd$@V+ia|v>cWI=ExYFA4t<2|G zwyNKnb&uKQmwC|riu=p>MQAm6feF6u%SA6A_~glxi!z0L>v?K{Ecs*Phnt)k-C3@~ zD~A`eoi@gLxk!tnqPwNY125`S&ychGcY$Yb3!2MrTV%GLDCL+)lGNFrAz}MP zgo+OKh$$%Ba_sw%5JDB$_mH?0Tv%N>DkW)}rn{rbx{y-x>j zf3A7sO{kX|LzQlD&aJ>KXoS}yhIR%z>B=YH4Nyd{`bYOpubzgpz3s)!7Mp+ zR&n8$YAbErZC1gP3KTP-Rc>Lb&uw`mV)oGNJZ&fcM0&8lpN9gGrYIQlNJ%3#^{cCk zeXBG(u^okR=)lUyQvc%c12R`HzkBI$q#b&qTlx9M$qHfQUzlC@N(QJRJEL0(a}GvStLKxzPNfZttBuxOMp(5b8PNp zrb5U>*SRO3fAh)D;5aCO=eRCE2TO4f@jNZK@(VqzsHiA{JA2gcXpaB9TqF)s?J_eb ztY^0d8hSa>-VW*ha&~R!{7ivnOwWT zkKTq6^5QiNXy@jC&mK8)dufz}!f0RhePI8qLAt~rD%+){!GP07ka>F0F69_tpZJoAh z)3KN3M$tUBEo@y!us;|rN`2@2cgq&60NXj(TG$pY`svE2Fa6skEalp^cpCjSh9(nb zYhkjV?8Z1=ex6^5m8>14>^=7?&@t|(_tM({I>D$9@xS-Fd;Bd1PjeJfbClOhxMWC# z2=0rM*+w#OWK47H*uz4PA43`Y*ka+8#5<~kkOik(3>%4ioVbs8oQLBWobzbhfVxc` z*JZ2I-H**SA8=buc*a8i_D1ZR8_v?NqdxkoR89mJHa{udK(*p!+Wom^ar@z(1aHS< zFx9l?f~zH*GW=2`^$J*a-*pkSe_KJ}L}737Y}GsOn}_1Xx|m*Z9P&e$1lhj>)mMVx z&|T3QGvo68Ta`yBzLD?t za!e~Ofik0LvMmVHhu!GB`Nz+!#|v{QK3iXi9Qo9{t#u%jp(0t>Hu)UQy9F+}eI5Qi zd0Xyk`-n-7{+`TJS@-Sb)&89&(!8uQIm!BaAmdki)}^GP^x~VtSU@vRkKqXag@I!p zt(q?}Esy~aNCjEL4xa_n^=Bx~Bxj-Q#0X4YWcfIdqQBVr(myo!^Wx8sO%j%jrxRu_ z^}JAtdGf82Ra<@Ao5t;P9U}uLS2$q*a`ntg3y7^T$Om zT$*K=WVx%YIT;#7j(XPVy&yfHPCgpZ)9pR;n-$(gnD_Ef|Jf#}5*oI%vuBn#Z9l0= zy+`j&-@*E;p`oEkB$EpFYsJlkpsK> z`O%Q&DSR04J7X8>07e?00*z(Q3)+BTD0JS#L5D`mOy>UmqM1Mmi#BIlgV%c|CraZsqbBH#H5g&8h9l)!lDIrz6XEkW_k(=k8DGooV)@* zN+>qTqFcw7WRaGpsTy&y)PWE=qYkl6>umW=a(eaBJ!qY>O%e-Z1Lh7BFl(+OL%N|{ z83q<;2REyzsQ4V9I)g2Cux$iXc>j^|j`Z3AP9X&{Png=pXE$YM`vji1R~bCtl1@#z z-0|WjPRec@t`;qZp#tH??CpmU5lL-7-p>9jTWiTCJKOC2cdhlW!;^J0$s%Qp;JaWO z2aCzqsJ<4#H6V6noJQFoJ9IP8?V)sHzDFNcd*BiKhrd~sX*_I(^{z{V4Rw2;d6Z~; z;EhGs)z&~Wk;^P#Ej#gJoA)>zLS%a&f(l+@7~l&tjL?%gmDp|f6*VRriVfA1^@FgpHoCsr!?g=o=z-XbgJnwtJ7(ha^}-Qcqls(#@z z>*|R=c%zk{KeK|KfdW5TaH<}mZW8eCJj4&J^U6vGgEJdc8*nhbrYT@4`Tkt>+E};v z)1L?G^z@F>3uZoXwjo-k>g}DP|N< zpm}4-A(d!v0J);OAuGFKDLe6slOL<@UbC{{n#Uej8AH@o+SJj6Pp|JnogPRn|-qn~^ zFpSFkYTkN!^~Z1O+n?U9uZ*gTvoNctQLU zfPU3qIUbkKfGUicom~x>^wq0ZgT%eA4~T56SvojsUKjp%T#$vHtVI&Zh1!DbrlJzN zUbb$VM^uzfZ%X)|feB9!hg33J0UkMzkPJX!WJLoe+dkGl6eY+WYPSjOuH9-{+a*wB zS{!)uW<;;D)cNR5*NW>q>;Y5)70d$z%w{fshb+!PjXPIp|6KmOjUTV!Rdn6W0qxVb z%@@nTClI4EFeox*q5D+ZiUQ~)KbK)d-jgy32tnKA@Gxm|@B^o@;>GX3`UORoovB6- zF>TZrFX+R^Mv|DZff-<}hjxeje?onT?=gd44-0)ZqL|_I=*iF2=b3Z=W~14Hx@%ri!#-F9TPn8eDu$x9 zQl=Kwdq*SomIJ&#iO5vmUA$JWk1=ovu~`(Ymwffpg6Y~Wel#~+h}A%&0)cagI_uwa z;^iyLbEbse$8ci+UjRO;T>EW?9#!LuR92@&n7=-YI+?sdaK@G$PHeK@E9rC=*)}2F z5SuP@YBA=U=XI?KH>rY&EUXv61Zry_JY|5xrJq8WUF+L3$_HEj?sCpV~EieU6@#3;l9>qh1U0I zrtkMhW}}4&js?I#(*589@F+Fc2=-^d)e(S#`FqR3(`hy*SnKzkTvxvPt+rvtiiZ3g z#=JbQWj6{!Y(yNq)a3X6-`n~O=@hvY_e2xFmE=+5A@D&rwhdK;ZJ)}WwT})LzjV~+ zK$0#(tnhEv`%qCc@vm?<4&}dnZ~RoZ<>;bk$n&I5^ljvZ1IDa%f1Xc>zZC2g*qKm> zYoIM;9ywrmdf#qY^YYxJrqprbH(HO!OA1cSE-T!k|LOA6De6+)n9$()$RBDsxS~no zi7XOeU!1==zTAd|w~#Zv`%%iW5A!sitSrgpg{Uo6UXbSNxX8M158668=>`{!#oymE zmUfpY7`&jygZlwJ?i!y{t29?J;gY0**qmz5BDS zXU6#(eVR`FNqlj~^lJp(njY*bB&Zlu0rTG82@5l`YJdg?#n<@ZgC#zFgnQ;;Hik>00_%rFI|G)bbm&gTh0t@&5E0LEY3qlb%mRy9L1kF8>ZVtF)IT zBg@Cz{%lMTV4QG`-(@?$t4S`veM{-lq}taWoDW&wJuL}hH2nJ_^>wCBj)@%BTi<2y z6kw=Jh{QgqD@bm6w;#FD|0bSoPp~^Yf|gE2rO|8rkxy08miX9w|8! z;l%=x7454{*=CM_E=89YX{c#mO?2<=ZTJ9{BN)hJpoKw9mS#|^Tp#(e39=_hfk1>X zLWe+>IfCNdlUAc4es%vfxBIzkRGUoFY=^H~(QM?B30F2>0 zr|5Focj|Oi=s<3)o(OtavL2q|Iv{3v2#nAm@1Tutzsf9)5!ke zJ8O2Y^)7zVTqul?^^-22c$cr?-7zD#t+%?4nf8nt&(9Z5rd0%`60s&`Mk<4Ad*f5K zq#v%%zwbKAY+c>PL4EM<28l+bJOt0nZ%YuOf`e zudwtMmzTh$qKK&9Y2#U%XaR=*j>g^jK{U)tLmeqc?yh3RGbgL@bf~C)CtW zKm#IxJ*H?M(38Qp@ceY1eT@p`P`e<_{Q^_jUL1ZwEQReUX)wAQM;1DV5(h8-)X08D zK$*-qW=ViFNG==#X<0%fhCO=)*H3dU3qH#e|2`3S`PV5nJ=RjU>j_&p7nxb-*BfqYQ*Gs$G6>|7u#pB=~&z|w~D`}i*d*I zpj~g9(fw7vFWzU{bf^E|oN0{-PcB(;prk zudwt#Qbb=F)7r1Z9-|n3Aa~qxcJwT9;oy;0Onpt2!>Ei+pB&Ktba!_j*^KY){@Kh2 zP@?=>$p77b@#Eu1NLJr{=}AP??l&|!n02FmAd;aHFQx?v>Y-RK`9 zdg?7cxa?~G-CV(kE$hv!aERIJQ})odFl?GkcOScU<;wA;^O02ZRG%;?>XkWz#dIts7`p9Qv4EWXsRk`9;bO zvvML(5lCATK1pk=LBZJmCG?iR|C@iM@{l%(0ja;6k&)3m(DH$*&-h#ewfClmQbip> zmiIBTJYV`2a#pnX!pTWG>}>yd-Bb2!d>c=!Zt*qs_H3YeSy2(xuz$ZA4 z>gcd+Y-41VPuBgu%li7SiQlfoLBHB%Y<4qz0eR^E)9SKfqnZBbYE+{nr0d)YNLduB2*H2yg-wDAFZvk;npZbCt4lztG>c?|lS+%w8ZbyYbY%R zrvpQu`^TK;uYH}aXeE_9o(D@QRUn>gAS8(nN9I1B$71g_3`hrR;Wp6GV0r(H#Rp?T zaPLV41s_yh1|Os=s!6B_tEp+Hw9o-sV#Ep&a}iKuF&v!q3Pv1;{lN{cGryyW7Rm<; zc8zs!#R1Sxt_8PPhl^Gj@F%fcUpFTkF8<1GVt_!j)y^H*>ppw3eYvLq7qxgjKHYt2 ztObyZuosk5__IDgHYpB9k1G*Y_f*q@9sZ=MRgVQF{2$Yzo!d-^wvdnznw=nA1rA*9 z*eP|jG)!GS9e)?S0zxj2)A9I2um)<(i~J*QHhq#&{EP0zSIsNq_Q%~w zYWUI`hJr!*{=@GTrFJZ2#5hf!P!HI8?B{DO+MR!f8hL7Ig!_+V7rhZT`;X^wC_(po zhmbf>*raPF3XS3go|0o!)W&xn{4+zl1c(19Y1zN;!JPYw{PxLz<*oLYQuNEfrgJ@`5x9`edj~rY? z&XDmBqW6|Gjcw?mm_6e0<6J|3NGkG+OZ*o;dYpWk*fedxsZYlfBjdQ6LT20A+8-qe z@4}t|HiEOe1zy)>D%CSKGLHxQq#4l!>F2Z+pum8jN=6ofwbR#PzB=WkleL#+rxWni zGjr@v>)ojSR%-N5-9QMp{A1{xfevTJdHzcg7ZXc_h@P+^^)c87iaI(7z^v45h92sZ zvY+`0FMbN5Cg5!KRnzBb2j{x?fcc$5n_s~j(R7S zoRV>FVlh?mrgG2J=!t~r3x4aw=B^za*sXbf@JnQBmL%J)xA%@@-wn}B=O0Ue2xAKo zECHA$87+X9Uclami%!J$)C$cfoBiuHTg7=QR}6V~(!7YRlG*I0(!Y3weq@?`;Ic$) zL^9_CXtQrN2b^&on+sW4R}<55d6U-1gSsUO_w^+s=TPwC`;hN} z@Nw%?(C(q0S>O&P=^z+aDc=w)58j}c=}QLyaGk<1#iT^^UQ39a0Hh}1Iy#lsVrA8y zy&cZ_DuB@c7p6|b-2m7M#g8;gr80T!PdaJ5OimWae_Gh}#S`{Gk_m(xt+K0&lQZtq z)ue<$+2YEUtNBmLc>M8&{zdDN;I@!B?FbG+(A>I{?L)pIdy~mhfc(=qF`L4|*&0g` z5|a=AZi|%^5s9Ih+JyN5a3UA4S+EcA$!J7owdzhE+ZZ32ggvPb?c6*{=D<)-lLRqQ^jTz?ELz<)(BPlR zsYgqSqru3)a8Ex;;0**MxRN$N!HtG;Bo0Oe6v-O+o`LeV=J?+{P;7gj(I}vyI1KW6 zl-CS2eDa@Z&nM^YQ|1@Y2-)-v_ruFC+0!*xPcMYwoD7AbD$M3fn7QK1=C{x%nlInE zy4#rw_p~x;nOc%>X^!s}hb0nsk0P*pY-oQhTD+mNT{K!fO=Afx&m)ZWe;|tD3*vvR z6Adb7j9PS);N&}%g2KG2PBz8IeGSgb=XsYO4}XZ)veaNZGliz zXlrEDbh70Hs8qwkJufE`wr5AW`1m9J{>M#>E!@gzJHvKktA zg#@z3u_fglzB8tuG9HKie(q>uAGy}~S=n=oe+&QRT_;ZeR+9NR_h)*Vc=RYD*-4>| z0^VB=%w;j9@bsYbp*%4x9M^u-y@`(QJZz^#NL&&7Q18^WR6X6wFLZc5DGTUn6V!@- zGek^}U6kVx+KXdOJf+ng9R`%@-d+=&`SFr4cOZ890R6tq5Y<5?tOC68xM7`<7i>U{_S4yE~$y}*?ot~VY zQt-w8@{K5IyG}kR`$e&IJwg+r{8nskNTMjgW@WZLLCQLUqNJrt&6Az|@Anjdj(rd% zKI*ujzJ3~;`pDFWV4Mth2Z;j*wgP7hIXf|RSo5%p>X~;^&?>)nOB~l;R{jtkT-R9s zRVn*==bTh@ZjeFg)icSD7Tu9$c!%fM?LeHw^y`AUOu~rn7;V4A5lR<#>bPd6%~D-^ z96qu(=e1p5nY#c2_XSM=HfenvXsg&C(C4&1<$W>D zPL82d>p$GQ(0BcP?N;NFq9oh(WBDV~T#Ej*bseG-61sDp)7G2*Cg>O##E9+R&+1d; zI27sjmXSwMvq|K3bo-Yr4$Y-nciJVjPy8oI(417aj_}BhY>oI;OW6rs^*&UEIID&) zcwLazR@c=j>%$DM%t^Qr^*LGjvKVc_{BwIrUqK-fRUW6gc9Wg^GDVa)ti>MON6l2C zRKtskSQZbigYw$%pJgsr;zBB8Tf}aZa}+Z;k{a2bqsje$nELK`tot_XOH_7+vO+RK zQCdW$tPmwpMk2~=iI82X;_>QIb3Bg`Y1@V=aVwXD4<^LX&YBaTlxyUKNaW*TAd8$|F?B7 z+GvI&kkd=Hlt;>i0|8(-vO_;h#ohRdsm<%mP>N?`jlMKvSCWIkk7L5Nyjt>AEKDe3 zREN=gsE6#L@<2vV1{76_SIlBGMUcm{0RiF{p$N~DNd(-Zj6~!8?BhkKnqr4Tr$nP|epDOtE?WN~ zohnXN+%u|Nse#vV!V(_JSEo7Qy?bZE>mu4x4D*$7>)$?aHejx#?74PmXLoe~4mS6?%;Cc&~~-O(hr6 zg{W4;JqFOpZk%HfelL}+IozcXuSEjyJBxvK)B#cBT%~utRm@zX`G zyM*sJOK-jbIWr=|V& z+?u+GppcIkRQBI-W@J&Zi!J#~a@fywu)L44LBBu+4`iUPLrU4FbHzoUeQ!#|V~jt% zvpav;`RB!teAJ=ZWgH&ypPrq{(-sA%GJWXe_6AU$ya0f3da0u9%!L?B?Y^K8%jwgn z4Fk^e++^$c`jLK)mO^GcLqorw_1nn8B9Ed?6ow<9Ls}22AkV`EFS*sKoCf^^xvB{GqQ$ZsXc*+4D4E3d>I`rp zjgOC$_!h7g7}IQr#klOLI+BcnbMF{H)A?WgHWF#VC!SZLc_tRzcj?!B43{;Iq_bMt zFa+%F@SAhFETDWK_t`8L4yc!^U6I{_mGgM*;hqeUsPMA{7iU1U!}X$x;@1!&|?s>umN>l6t+MZFKh7qXVUl!(Wbg z#VqeAUy%$K;Hjy)oYLL(Ek{%@gN!k%WrU|s4gkbJJw!6vp!$kB5g|i7k3_iwW?YN@ z$j*+_7r7OU=Osi;wnI$l$die(6lM~|FzfOKcp)e)9IsV{6YZwd%;M}=1&Ui1m**DH zT3zla@TnO|emAT9@kx&NgRMG&que?g%P{1{QK z6$<^B3~hcAg0iI?STzCFpp)4wYwr!arut%c_d?E`u3jt^Vl0oh+cz*!1|AXpce6u< z%k-eeCW&*jC4VIgCG+xBWb3bgXP0fMdww7Qq609(QTdBIh16l>gvK6G9BVPEs4FGV z8}o7tbj5pwKkz!2hKM#mze&OB3MimTxPi9jB80l6sz;sy8RAFFd9x36)*$}8C`UA# zM)H}lyiXNpB1vMVW5+wM+pEH~B^X0OufnUh;Op~;7LaSE9|vMIrkIL z`j33e*@;1-wafWEHwT}7Km1}R6Yu}D*hohpJne%#37Z$1(H=LJ68Bw@l3Mfi)RzX2 z`ubgf(f3v1n{K^^LM$* zd*M$NUqxeoVxVO_slouH25|SIiP{jRnPC?diAs3MzX#dIf$4KneG5oS{|Wb94Z*;s z{mX?+UaOv+XS(p|UCR@1DRqcqY9NkC&(6Md)oZ2ND~OvSd?xQoum0*SmYm$&B;Bk# zb2pQk(7oDb%=O9kZ0U_>A6-Xf)1`tpAM)RukAa{V*i#KiO_a(fAC(g*9t{~0n?nqx z07M#@nc(W?G%8LfHIsBOVtNP{jc84g;jfw70LNgW$@T0T079hR&(_zNe(94ql25;0 zGmE-EiEqda;@b5%<0K5ertyF8GXi9&OYF^&#Z_BVkSAz`kBh|w>nALg^ODikXz>$zrAeA2sU->KU@2j`G~3=B8&P&jE+ z{+TbB?!2_#XrEQH$;_4?-d`g>NlgB#++8>srePJ8t)&bVYL>SPXGNg zA&D~TW1ui=zl5cv6jMGa@JcJ59_Zymy-(lM#q6J{Ju=Io&=fwuQ|uz3;qRvPkAVt& zKpGk7~Ng!z?o)6ZZTQFXZ zKFk(P2qg2$$onjkEr&TzH}c0pEbG>bP}3Y-ZN2u@^g!b#Qa}Me!JRZ#&8X5Pys!vy z@PSVMzHM6>o(_hJhABDc{#uB13%!j45GtROPq!*LA_hLA;&~WsBZv$DzQd2fF96Ch zM=J!g-0LVly?wIxNqMcu)FLAzqcqfXsH~oSraJuu4n+78Bn2byrNImRoKptQc}mOg zKJ6h9a#-US5fD4OA?^YM8#{E%+FL9}M^vbof!u8x7C zR)woYEgp>?v)6vis`MvpZIvZVyC8Xb{mgkgH$y-SUA9=0n%cpXISg99$*+lhFs3zn87s=<9}mVM>#^g8(Uch2nK zCoYz8ssWS`xz}s$Prjw5x5(4IX8COhzQ^+jb*CI~mXd@d$O~5kcuuY@PE|ImV>XMO z8Y|W-c+vV&TPz3{G9swvUo3wt#yf`Sogj3WO}PR0bFkwI*pf4EPm8bt9=Z=A;3D`C{5v9o9PR?O=vqaoJ7cWNrT+Zr4F zaZhJJ#-c6O>>#Hjdh3>x6G=Qrm7aJi_TKl9x*(p*#jz1Wmj1CKYlJsR;x$_VokD~w z1@{z?#^8$@cZsG56&)QN-TccX9kGq>6NgT$v8C=X^8Au~;XnuPqFZ)Nbxs%{Qk(uDrLRE*e(ew(-NY9e*z*r7NQ}jNSgZlBb{_y|~y4wVw?eF)Dh~Po}cH-H) z__$!?j*_9tMTgHd{B4mhs@h(^HA=->4pe(}knzjU#Xm-w=g$4Sdg6A?ngZ9wXGBr} zVgTYQcI!jkV|6p13S2~OX2ml(#KpyLRvAKwftm~RF@MUpi3uePf6d33u4FY|$U&K! z-}&udpP1d+KFsTvBv=It$PmOp;~8rN1{tK|)kcFs1%4_#$XH90RyR;nuC(Wr=!Gx2 z_tnR~h_vXvw>i}MC(n5<`{NHvq#zQB@T)42u%qCy1CY&co zO$_%SSrK)IDduQ#=It%_jsTK>!8G9AXGVm{-NuH%%)pLhPOq)~;uoveHkZ5JG=eI5 z8R5(DAlPaCSt$NoP-3^SMh}IBuLfeQxeg0_G-g%8`;kAJ868!6aXbwlUQVRjLn?88?NedaLwN{azyKueln zEQGyzZwvn&Q%!7RIXh{&X>K1>(gX+kyD*kI`TdyM0h?#$v`!CKV#Ck5$5VN+>>2Xg zp3y6I2r~hkvi6r_lD|Ll0T0Q&|MHP&&9oZ>YA|5>^SR=6rzI_Sxr02_xU>^pbEurD z;H~0>8u;q1hZnQp)~$D(ZjRNT&t13o)RSUKHj9@zS7yX0(Wj=D7cNl3-cE>ddzM{5 zqX;4UXtE$pNut;qwbeJDXA7m`t_WGxpsF?c-@EG)h0DiTv2M6is%3;SsaBPgP{09$ z?>s>Q5YXL&2UBhQ8tN3!nHN|p(JjWIcjR%iu?5RSpJMC&prS79rxDa#KiXXzFPH6R z5Vn_iH`r7={^QV7cs}7D4D#pq3gA;LBY_Jc$1yX=~^x z+H$TLHAd7Qq|WN}wzg&Fiej-j}QVLP_i^+x|6QnAuBm*O!(@KFKqL4Gy?j zZVzu*VrWP~8{+$QvjmmCpTXyh$aspQ-2hEb@c!ZQBD^9gb2?8uEavgBFb|j?3bnGJ>?+!FW;wjM|o^YD%rn+1CgFS#;DjWBi4b1 zP^+*w{j!t2TUY7qeW{s;_kZ>be>Fl(0!kIq&2;p<1k|el(G-x2cyL?@&~j^?R0|Zj z9UlJeq)~U3{SYVWJ~XHU-%|2mYWwvv)3q|d>QCe09`IvOp-u>;DXt;6Fl`n z=6|wJZX3)JW3e9Dz)yp9%8#lZ;vCUjd2@i21YSe4R!=l&A3m_SFs_?$7%%v#Fmk~l zv{ToBVP!T~yh+n&F=h95@a(bRFo^FJQ0(g_Ush!}r!+F}4`CSO?CY4TZ^@?2j5MD< zapKP%kenB+tR4Z;!W&zbHoi>t_4sMo94biqaee*LP?-D1SkHLdCU6PKD@SAeq-)d~1t|DPXcPr|;G?%1(osBj^Ctf{zt zE+tQwGNzwKB=jpaNY7|Vz6154JLPD-OE^NyOqGXE-g>a>);J|79`DyB=Z$?6& z!FUhm`-zr)?(F1&kOfOf}>M%(u%2qTQfk4#?QUYbPT-@7e!O%Ei}b~ z7{^;8p=UKM6umw(d`jZnyApIpV1JJ7R!T9{d5g(QlFWp4#j*dg?w#K&Gr~%-K{@Fo zX%FahYACt~tbxc&-Y(whB=oK-?8OT{)aXR^LZT}IjxnEVvX-D_VzZ)~=Pt`l)lUY? z#0du-97O?9)618^nZMFJYQTsjC%*B)E7}i{T@5h9us8t};U;?@m^qCW$AE9>8ptFH1vuKrG9jCAaadRTpauW{ z`9SedO5D!8g9_MPyWm>O?Yy**Eg{<2QTAkOvwnq&8!>&ZtW-f;?{W98!W4~oytIM> zDOf+CScNDBIz?Mk;xy&v957+EHQn%^0$#-%Zb##@Kco6qL3|-DgZdiwY zfog`e0JcIQOZB`SgSG7}`|dOIsa=mb@9%c;zZ27kV2!{%Lge58f8XB>?V~sD7fOAx ziIe_-jW3zT9hL>^wZsVzcvD6F< zsJr6CFMvK|PysvC;(Gzn2dT{1LV3Iq7zq$6(!9j*88ynd=zbd(emlj8VFV!3n!A(y zH`mVdyQX0H*D%S@3Jy_2aZK83Hvt`>n;U@1H{PLMDyOB^)PtJZ6#ubF(dF$U;_4wf zgW_|Gp$*YaNAaUDB9Xc^H5h+kk@tDt|h(9N^Jo#bL%peQtVsigR39?03VFaWnyOb%w&6$Rcp#;s5MAjg4(6Ojhk#b zd3wgTKo|)hyiY2R9INdY*@~Jw{9`9*~-t%6Q=sG|PD}&l1LxbQ{pC7(;=T2SA z$Dp!yAFf*J%$dnYJ4Kxh{;ELV2*22dC0@DTOC{nxDjvHMM%;CdeTY0)F&$5Cx4r+4 z$%Qpw2Z--D8UiSNpEmZyy?Pgx?gBc@AB_t_%}zcXH>Mx*a1}6D%L(xnqv`^96V#Ik9wAZ3^x3(cJJ=c;#j?7}Xu1IK*v=|>NrQ9;9SjC*G=AZm<5OGhZdCYM2PQh%YrMRw9 z19#5RucG?9)}4C#bi6Cee>9%qbi$Y>8F;aa#A*3p5N@bobWtvo?9Q&)zj3A6K;V$- zvT@JtB;Wq8a%*${p7VkJ0fLqEpQ&K;eQE(e21}dI3zOJKA&W)nYg!jGx-S<^(#SUV z*vm0EZE8*FaGbF5xEFMs2waFOB90W|nToFmj}94lM}W#Vx*X z{?jXlbQQ55wp!#cHOgw$$WZ(SQ$t!0?|c^eW5Wi1m|_M$_dS8XnhSW<#I$R&_s0Z~ zGy&Z-&%yY2> z&UHjsskWxY`{8Ig%iXs-tSzb^o-k{BxkspEf(h@@3>OKUD_|{pHf;YDkb}oGMc7ER zB0&hJZT!&3iR-IC;|L1j;Tv0*(k>0Hbt$0Q&iK#We&N!qzG$GE@6 zIG?5%n|5uo#-MXm-HXN+JPPJ9H&!NgG2D;Xk1f}Sx$Gqr_Mkf z+sGeJi#ltsp`B!TU;aW+Yxs{npfU#Ew3U8~IGxp(tYN8DPM0_SrMBDWKDeUO7y*F_ ziA?;=M=Pmm0|YZi)#|Ay2WmVDILmLcqt_34h7T2-tCc4 zB_;(IjP#9GR^~~d5xfTi66abucJHOnMHe%!bsffliXyZ1YQJM`u^h{^jE5!OpG|6p zD8Cz#Kd4D8fh^K1Z;#)Ek;r&xETCTJG&MCvko-xg^jHVlF!#R4Zp??nuMQp{s8IOD zo`3t6(Cg?R`SKC%)_wIW%7I{C@Y9MLx1{GTLX6GePF_aaIafO~(JB zTeof-h)m2}5HD`Tg8fA<#xAknp`X0Wt$=1%APUp;kTQ-!I6?6MXzzoQ_sN%)#g|bK z6L%Jrr#4W+*L*g8k;wfSsvmfEKG`07%iFq9$eg!9<<`^Cd&lb)m2OCs(w+Q7?^r~A zGIcFbEfxSL7-$)WXBdkAUoEU}?I>M~#+R9{?3YhbGxBi;bH4X-+j_WXqo=x^ojvQ| zzSGSfyCtsVt=i?n*q5_!*C7*U*ld2;;-9A*PVGj)d6RANfnZU{yz1XSl0?ENeqoWb zY&P0fbGD>!QY(WYfmPc|&-O%ZRXQ!}thdqy~V& zlY}YK5|8G_x8b~a3@mw1R3JZtvfZ7*?K9Fe^zf<rb2<_)tukgN1rBVw@>A&JSlQNsUj-&K|%=;d5W{>@JJ@+jcTw z$a^zmgY}W;J&z@18%^+9=cL!r^Sr%#<#uZ1G1{Y$zY@(In(@|sbkA7c7sSvMxG0wE z@o6UQBO@&5a!p!3ogDl3_Vi+oVw9AMaQv|3^#+Osve;Vfen3p`Yuo)3rPPL1_c)zX zHl$r)Jk`S=m@O4$4l>M_?ssqDYH`(b90&Ck(1WorOVOQNGyoyc9p zXhQ%(W3iB)zN%Q(s&GPKgrN58c6M>Nq2i!-bmj2~E(k2O2J;y_;;)qMuq@u2E!;F)Xzx*!wk2 ziqY&*rzGzQk`@q&{iVBZEd0X`^R^bwjx*K)`SjG+-_RfOE!&>UaJ|2B17Y$L6Gu+2g!UM$ zrlBGK3Is|rpz$C(VS2H57T1KAUd6u`giP+vSv5&K7vgdc(^kzGMY^xz=hRp;%f#Ej#!R~0Mz z6$@m78Z0W0iIPv9NVHjs`tn)2+R)#S~V`s;xZ+{)aDN z`UJldv{pxb<_|sJ8^ZljL)5*n6B{soiVC&7zWxdBFyfFg;Z)R^vj`!;(0e-jj^_P8E;qcs`DXE+ zr)S)#a3VU6rhWWBAoGWJms`Nzqr0V#F6lXD6_kFRN^%TOJruIk%Dpv!A#jA@N>0gx zZS|H?y6y)gc{OOG^O;A#<)rQ~nDxN`pbEe{6XEMT*%NiMH!S4@pi|wIs}K;Utt#vo z&j#P|O<*P<4Kl@KOB9d*T(a!fu1y3oYxozv!sEkXOLlc2vyjf88HJ&!(cGJU+z)6o zHuHMdO%LgEe)Qa5Hf%m4Tclg@^{MQBY@2v+5)fvIB}U$1yN~bc4_0BR>*m;Hj&He| zLPHfGC!GKM;xGO?#Q%{%@Gaz zv`LK7lj>}=vF(xWUv}HMALpk#{M1B&LIkalbQlBOaVq{cc_nfo7t3V#)edROJ!YP; zL8Fy_Bb_i`VLpO3b*6mPRo>o?(?2dxVS2wJZv~DP>6w|PAiPz%haKR>y9rhJ5D0RF zcZ;3!J@8NOkSm`MARL%?{>9414r+nI=#@*aWO=4qr~*92{p8T3Vpf*u4_ia@)KHsO zQ(d3zHNRwaLuZYbzth)Mlpk}ll4pffwDg7K_Nj=H;X6B+y&&GW8?`m88B}rB!-mmD z?Y^+8(IqP@t~r+9FEnS?R*T)r&Sc%aUS;4h^`D`)Qer}HIGTM;1pIcT>v-v!^Oo&9 zEdt0D^gi+JH0)JUJB%eMgu!mesyDE(OxbL4V6r-3>AqqLo8}#QEC9n$*y9VHyx|o- z42fduqUL^hX$e~2*z_Xw)`krm-WcTglA&W&lRtViYu1b&7IYJR|E)wXKAdMJ5lA)B zR9@|Ppyzzf|8Ofj9Xc;7P%z6#u9c!bU|^&7P=Ev88Tjx?G|xcYpR(1dEZo7eBeS7{wGl~O6lt;NvD;2W zZ|d$He|3dx6S+fS`5N|``?jn8YZ5@!b?C9w+phUC^TJ8T*!h$`Y&)cPkO6jhWG$wc zF4e?@i&d!n3VV6?vXDrK-owHxPIv&tNtf>nE{Twn%^u$w>4{~!GPp34Lw0`m4^)F% z?lz)dHf-D&)EFJ74>zKaGflz29oA$F7ObNb<~zg1t?3YBaLJ!TXpngwS^RP4v# z;NdoEW-lrP0}j-2>o;tOHj=MM3`=3Y=H0)u{i`(^UTR|irB$1*nS^6+;YN{`krAFB z4^RDEBa1eW*y7)F`ztu zN~XQc+Zxw(qqIb^L{f}wx=U{NuiJ9=(y%j?l{yWzX=Aa>r@XBzX%0WvqZa;vEePi& zM(1_q1(s`VS{YWJgJ(*43T{4g=J;O~)!O>{^{Cl#q`Z;qb`7PT%bIAO<=*FW(`eng zb(lH>)Ds5+S#|Ts92|u{$ zd}b|A5|oFp&Z;a%?)bD<#UG8fXh~};d$zt$a&q$bK6LDuL=bCn#b_=(+8Y=BiLlbTTp~%Q}t%P63ZE`fzhg>;rO4fOtKa`(w{cE1I!+fK9G=Tiwkl9i&4i@>E z%k}RLKodBEX%2@chQ}Vfb>(yA)%Y!#aBW!_fjSn`y2?b8x?@sU7)u!XX{Hi9R7pum z)doiZWU6SZutM*i8=2yPGM};Zu(OoR$Qj{qs?cQhEyr#ZP7bf}LyCdQjDAg{A4YDB z&CQQtQUKWEMQrFQBctyn>&2LFA0FCbph~+g?m~%LM|ohB-9rPb#VsSka4Rz=& zE}%<5!}tL0#!EYCh{=F|F_!=Wz9`;yZHs5UkRy^IxJ}Qc9#r_f+c<8e=kUUuw3B_F zppYVT6Vj-KFo>l{`yO$G%8=(1qswLE-2+}%k42RW?%K6AY2v^MsmXZP*iq02fBnSE zCn}9-v-k6dJjt7naxH8}t_^Od3Mi2hBfVxg@urD3s&lL(Atkco{88ONkWZH3~)UqD;67q+H( zkG~IJeb?yzVO38_YFf&MwW){W=3925e*-;mCe?s%h$-B{=CiNk+_3QfxH$Mze7z{P zS|{~94{BHty%2*8RNU@pPF(V$*?9z7tJ_(6FUime)>8%)0jbNp+ky#R)!ki!&8nLt z@iTN%YaCm$5`I-sd4OLT{RcDvucvSg`shWHi9u)+xr5Y{Fwx{MZZ=Y3a`9p*iil7c z+rt_a+X~3!YF-$c{C&^yDyr9b*p+$wkulfC$_10wknahEc$jNl_w;AS<>jAecC_Sm z)8VM)H*XfYiy@~pSWbszx8F6g?VdVBv1)#`!Mf2E{WY!}e+(x9Z+gbqARLK(A?f(b z7=cg=pJyHWPBX|A0aH)_A_0zaT#8Sjk=;CYAGJcI9^D>=)i>1+P^aPh_A{UK*V;Ir zsHbKRrADC0DS3Bgj&@Fy28ZFp<``=V3JUrjEGTsUA?vmn4C!E=6cDaDj+V9j-Q{Mw znk*?P-M{XNgkAO7A}@})i`5`d6yvpAXLs3r4tsaQPAV!wX>0M2=ytqddF+PN(ViT5KFT5ot+vWbRb>~BYAU89JE7?3Kgiq0ud9FCL++;L< z-B}oF`3m=h;2cj~J%a~yXXMq>SdJ|WZYo#4w`x6Qu6;cN1GAGyeUu-3omV>G3^Pc)?b5t!h=SX#6e>-o5s{=(hN5TsbH$&Txp^%8 zUc|$!k3Sy7=Ebm)4f>W%fJ`8zb(xj^e}43s+<=n=12;D})dSq9?zZ0kMVQs0J2JD~ zQlu1v6R%=t${%C+ijofJxj;J21^!#k&W`~AJ_1x5Zzs~;I^+I~K~l7k7)j>x&jZ3t zq$mPUP;zwqBgJD6!S<^480+tHVH_Dl)#8+9wD;_s9tsF+$Vdz zkk|E^2;6RXh7UtpBF07!Q%d|UEx~&@a>y_*)dK)=|m<}x?%Ch$W1&Q|!D$01&7L)CW-=MX&wuX3n;PQFV zDuQ!hn2e{F5#ly1!7yhyxRlK5`Caa0>9>URtHImzc|IGwjXs|96LvmZ%HLrK3UXzRzDc;` zX4=kg1{Yij`EcL4*{vfC0KWF_-P>a3BTtLWipj~z9!=*xqkFH?iMI~>V756D+b#|E zHDLIl6Fx2%f%Ay?Wuhnx=pTACduU-q2>tc<;=wpS&e_&t*y}w9fba|WScUb?T4G65 z6(NfyU2p*(o^iAEF1pBvc0hAMCLBdQ{%dk_URPfw_JY!O1E-(A;?*1ep8NeSBICAj zG$y$av!jjaX`+vPRvdkji37UKD%J&-Us6=N{0t^f&HeuXcp;t!%#EC!b5d2a?*?F#|OPG>L*|FLqsoiX3ci0M;We zcmM9CLj_%vL-z^`&Nus&OmjbUTx1Jku{yw+_U1MncX()HjgnU)J+GW|)tdvhqUW=A zt+l`AXY*#~zAewCZMJSZ@f?QxG(_46ZDmul*K#0c;ZaqGaC2)4B^*Vej7tc>S2`v~ zLOX)|n;^ynP0OM5i0uL@G*$h3LbY?ln+Kv=In%bQWxwGcw=(s5`jj8m#|gOK>3pji z8?{=CyKx#|!gX)@i$|puQ;a~-8dJGfreqdZm?%+h0nbF&>rI8?^FRqjV$?YbE*S)!ds^7udu(p zStH;4e2t=_rA2$p#>KZOt+Hp%G11yy+FMalvZd$buWb(Cp;276w6sW;$CyX9RwkAz z#y@B<*6{Z~4j=kgFo;C+Ph6$6-{?LC-7K_lt7w7u%B8gtb9Y=tNBe2bt+#L27NaK7 zZ-9bXJ9Z_L+r9GXT}%$cR_aly6IbK5!y3Qb#Qy%=;48O~x_tFx2-8+%5T3*+h5G{? zD_m6I0iHqxhnuScuf%_#K%SPkSi+UaFi#Ut?Baomx>ufkS#EHEcM)UeE$Xt|8knU$c~#{=4VUlH(M>AaLhSv_dM$! z)*@vW_Ac}jn@y|C$jd=j&IHBuYBF|vV^BdX3r5@sQHkp6{?N3>OW^?5K(l?nZ_>jP zsGccpAjDo@VcdVInhl4n=(%^hfc~icTHgL_r}knwP|KP+XTfSc{ElIB^_MnLe+}_BP)-mv@#LOCp=wrqzxtQ&joRP*B_pMHYWMmBLEHl{nKb&NXSKQPYv>HI#{*A~}`PH^t=rkZ{$H2fS(SP1+Y z4)oGndo&mJ0}My@`xA_wnOa*f+HBeJgqr;tm1gRR9~`aLTt4^yiFz^y{7x4|gQq3A zKy%l8lyQIV(2Ap7%e;Au!aYV+x0Dw;kVo1bV!*B}1!sn7^T-3qkJ4Tmi3c)YqO#Bz z-nIppf!xmji1|{~GO&Ez1yKsdKBVJ6s@naR<@CILb;huS_rHM@c|K#Mn{86G@=N@- zZo@Yy`fvJ2m)Ow{5RXJ0JtQQpDCF0Jy77+|_(nvR_)1$0ODy*6=ux#pM707A0zY`} z-SwWnBj24cnFpVn)!>=)E`Ciwju@e?JeC=|waElBygamkA#r>%C@uvFCZ0cIQX~CC zz`9QQ z#$wQSw}zV+jvD0aKQfpZ@5FP%r-+uaM}G!k^6HF`C!P9qCl=`7@{&FK)F8{^>B0AE zjqZTtYXJrl$pj9eIH)}z+K+n{95cOGJFE6dI##0Q-6OTpp?#}vvK=p9*WKiEfAVkw z=F`bo7|H-S?cI{uplD(7b$UW_a+q=PkO0M^zTk?t>;H65D!~$+>kQ6x;{att0wI~I zma|9tAzuE;nLag}$3G9PH*|}|$oS_+->i-Dr<&G8B`W+287lAUlDo7jC@xTt@U@JL zY#vazsE=sI@jcK_-UL%KRu3q;RKWHOzvL+pxZ&NFx)^5v%XdBhglF6IW7No5M(%A4 zHkRq@Pd$~V<;PJZ@y}8OJbM|M;9l3m|6jaS%OuXIM`(^1j;KGEmXwT)3G^iH!W2nN zZY|yRx}=yd|GKSWc^WPO(OQ-{NUl41&!TT9=A1#QD?+8$m-J0}<;1%0;}YXxKBOgi zBlAq&k$34g$M<5^AJv!GJ$9YqubvH!nac@-qd$lHF~EKs=)L4Ay?6y(Em9vk}u?a%XL<1Fmu&o)vC>`Xm1891k;t=;5Mw#AjtM_FL2fPg7ae*UXi zis#enBj`#hIQXQmBXJngJ}>Ye6Ms=w>yxQWe;S}pNTUZ?{(4LMW^=r+*O@pjS= z#ooRYo2&b=#pEdGb)zKLC=2I5WlYt-`FHGo1dO{LXft|X(q@ys2RtGc-S>!DT>$L# zIG~{WC`ayV@qDgom4K7IwYQno{Ah!S-&^Ku=Y%*=m*32MtMzTic|Z}6L*hF8#h$a6 zHTL)I9w|DRy=y(FE`2_rXUD}`E>!$(h23=5$%?!$k=i$_RCL)yd_N!IpZR3ya$af= z$y0by1z@3QzC$hpQ!c0rSC_siPJ&+L=C-lHGq+t;uXHx7z|Mhzp9YnJFgoTc_AEiy zauk6%1&1-30#*RW_vXz!JfWzjrBe4Vv^(2n!S?N8$rHDycYjG$e~3I&&XE*&uGsD# zN{XfM+9ljVipksmW-g#9sDjo5$Dy~RefI-<`$X%J50YngTI>zubMv|*A8ia?A3-n} zQsE=`hsbPGEX?NXqXCy}E-5V)EU&Q?9Z{_7#{DOThIipE=d_2$3C&~mS^jTF!ghSw zvgG|QAB*mRxA#TB$P^;=CV8S>0&3@82;YC>Sa0D$UkK&k^y!v~3go!2k)W_SCF0?*To)P{Y)x|aj z{oa{2r(8HWLem^O?cpoi`*BOPvv@tXU-DJ6nT#J$NwRL-IBPhxvH?;Z42VJ&^Ek!c zC=2-26!?M~A02JGU6hKDS%;nq4L23bfd4t-09S$)v83ByNAi|1o9w@D=VOVH^&Ucp zwz>03Q_bnyi3R2k< zUuMJK`lfe*dq9H-R88%y>B_M{j9Z_GJg5q-8JVjETYwbGgf5qZ&@BV1{`&R`_kY$P z49MkF^wwP<)C+jxBbdLz<7(#97TMzWTls3{!FKL`EX|&e_b2lA2gGG5|8o=dz@F?L z7*GP(#VKQFK@P>30EOm2j05nVu)S+*;d$ruh{4ep(@$cNb_&*11@{lpDB>>N3`hzdXFzeH28`g$o^c_8&+nJXJ=`T zfJ5jW5KN)UI}r>pPAlL33Um~`I^h#v`jg+sZ!GxryZi&~=zh!614^P>ewHiIJsk=Q-gZ4tMBlXHw56hf{GH-gg=3lBIez zXz?IjE&8l`D@C=b+fMTLn?BC9viGoB!Gx<24JivF{>_Jj5i@sp1QkgXQtz2Ie87jzDO_5;=FKs)S ze1;gLLW~sFJ5izf8BYUkkN>ulybvv`k%@B1dGGiMcoH)lFk#Hd4k7tBAZ`M-n21WC zAApM|nEI%E-sWi|p6~KKSJ6tr7vZHrqJXL#11U~M5)v9LK*g@103Lkb*ti?p&!uc! zUC%rxLPt5X@(pcwbh+=Q4XneXUugW!_Mng=EH?qAiM$Mi3IGH3nNS{x0^#FK#jhB{ zdsdAX+p`~Y)1Y{M_1#sAKOcH;=S`Js?OCF*W>V!DJgX79+Y5it`0{0SOn(*S6-wM% z?6{l2o<%qQ{^pI$hS%J`yw)gn88;PZNSmj34>%u%1-ni0u|Obr>@6=Lc`G0R4bAqz3cU ztS;U#L`g&799SOUehE;*J>+{eqk|jlV|BII@AsQGB0^88(jcs*>6z`5OI&d;d`Jg3 z^X0Ty5HVzj0;2)Wvw_UpCg+{rS958*B}AmZ-TGQ$cI(R?i7fV|@cq}~fpQ}viiVYy z6<+amxSJ~>r;WMC?-_+&6hfd=Egc%M7){u)IHB}?VQ)>+s%~fvVBF<8Db3}xhL7(> z9PMNhE?wC5@KPYwczE{K6C|71iJ5)8?|Qm{*5Xv#W~HR~8Y>-dRP+_09!r~qU%uR- zpRvkgV8|%?@a}=f-~2cvSK(T~@M4IC7mW};njoKZ2*@57r4`?bzfu9*5rM28rV za7OJsS9~@fh|N*es*)rED(Ds<2`+)3D!MCwD33ea_}u@#M{~k5d(Ub{!(aF;Lz%0TB;C} zDzGQSWQmOE)cfU}E;sbA{wNGJK^Z$v3}su<79G9NeUM zY1m0m8#NcF)KO&rEaGR~|)_z55vU2Kik}t8wNPRPbR)7b+rwSoy+!_v)cDC^Z|rq8E!mF zFCL(2L8?$mx$xMviOQ)uMsk<$sH|2>(?!`VcF5O7cBxe^lv+*~6#FX@$b-u`XA zAG72CvphGw`U_`V#%o!yvX8(`3)_172WF5OL+b(BU}(C`iR&Ft^+^nJ9Ew*^;d&aK zmb7#HC-qalE#^Xui-v+m@q@I{{B28=!`l~FMsIQ=?-RfN9X{#ujwgzCn0Nfg1`-Vf zNQ8j?gIbN>0AvATGr^6|$EVGS%<8;sHr?Q^Db_u~sUUJbTeWfZ{EGugZv$#O*3Si7wfJ25lxlG3f3_7qw#0j^ z>g)BDhbgMix4Ird#Alm;6oqSOdBS;C_3l1BR_%oi7ZKWta{{9^BsDGZOfqDfP4%fS zB9FX~^7oc6tFJ8jd;Sxb^Y+#M^Vgk}c?L44GtcsPhhTrU?t)0lLVlgZL~pGDliF(S zRGnkjcF06qnwwWZg%Kd$(liPZ1izjKIi7$dKjL5u#rqLZ_BI9=iA-F*xkxKZOHuCE z@vCtCVE5j@a5&UkT(;Ch`W~wW#=@3AKw55wIvP8c|&! z34#XKm_lqr94hv0zYe@fVUXH?Tb@p*LO$V;@ug!5Ynk?Md)e)NS#s;vK-}HLCKNI? zu*_=y*C7qlz*C36RF-w?&x##)Cs}VnT8W1F@mFa$I(`#|GZ{ussJ{N zaz$#kp9Lll*jtq0u3|X}iOKCr>p3^P-?@}koVoN`Ml)l~Tk!GZ>9=|rzdogvlq9B2W%~Uvb{T=iMy^zQdBi|j9@n$%Ffcvhh-ygT?N~jOK1Znwcmv+84kjtUc zl|8a%TW1lzd>jVGj0#lwRTCrdA|SWu!`f!#*hRtQ3Ct>qc{Iz+WJ=6-%s(( z_p_Tn_AazHp9C-KJLfYEQxq6BfO)of6f~}ygs@p~^WZ*ERWTV(tAMT8ESt90qjBDL z*zC1(KFV?QakxCS;H(}wMzPe%zTmu3qAQr1g)t7M{%#kI`o&byE7)Y}l z(YlrXyj)4@I}x00*zlsp_j-zI)th@4GqqvJ@waR@6P_U&0pzN_7aUty&c(DW3<1<2 zT0+xvqhKyv?(I4U*E^LLQ@ZEM46-!_{8f7v4AVXvD;?pun3ub$zE*I-ML0q}dJ9G@ zDA00Ce(gP;j6be`OeA26@hH*rDvq_>yl{qzyJ=!+*FLSDurHM7ue&FAc;INYaUUf! z&bc`6#DYc{%%8+%@x$*NP6R|~1SYHC?N3;ErP`gQ&d z_>jjieDUaSUD!SbclQ-G-{Bz=lvRMtUZfNuUn%$Dsjw|H=M1T=xq;;y8_+sM$OmNZ z24J)mzyS#)hkSvA3*eyT*kw$?_=qZ33y$Vo`yX8RKY%%hK7<+{x8hUR#(eQ2O> zQT=)G8jlfIZqtASbrxlgfYWBjz16bUbWdzgeI=HasbdnZN&*Nd(B!FKym)bHbtt`3 zu=y)=@!s5OCsVA=<{m-a_dHpJPRk@LD$%%SYJDDp}0%ws9&gF|Js{yCn z1+_iKrF`2yNW%qTFCS9e1`@-hSSi~k3gbt5KmEP5FYuPn?tt&wx9?Zng!+p+wGS7U zhJ&q|+Pk{3t?Zl5KX-g(c<6MJ<=Vn4UhDJ1G7v+j@|HtLG+pUmOKdfMDRDXJ0dd~3$nOaYuTXy$CpxMEJrVO?`Y;iZ zdd57yp2ospqR&O+jxLuQnwC!h8{4w2*@Meug-&|%b&#HuXcLH-||5S%_oDGvkwOVZ%y(%{OTkqKtcsL+wnX*JWkiR@1p2l=&@=PYdS&5)N+v>;en74eDKJ z_2rJv=AZ0zPnw$u4enyqGNsS7=A_;=Kc|Y>|NU`gbt}it}jJR( z6!Topo!29;R%}({z%~!R%v=SSWU3796fmDqle-UbGV~tRaM~J%jYGki(=L(P-h)?l z?w+`!ul3=C>aWFh>JQCDpX1Y!8V$=Wd`HrO#yt2YG~l1%0+5!|G7+){MU5T zwUGK?BlN-a7p}|dR+JG#ChE}O(jd8=A1?1h-)lKvr$r~5R2yXe@yQCGm z#sgLoM9K+{GEy)*6uJ*sta9V_Wq_^TnkpS@g>QL# zM~HI~*Y8@s6!9vS$ILug$8P{IS^83Y?-K@e0lkw703))6>F5wKLGtkQrtLQp&a(Xc zl`fFC@KJW_c`Ns0Vf(Lo2re-$*L^p05TyP5%;^d+z*GwxlEU)Gp*{MFiys8q~6OZipA2$D4VE%hwIY9J~TaRi7`2*+JzbxCFXM( za$N3IUX8hXvsJI1E4lXZ&RsvEj%8GYJ%PM*cT}<2smkKtoeB?4d!B&S_!o6|_wHAi zv{~H?NkMbDuO)vCGf!hpzm3?NdFM~26LA{8G;(=sMEY~KD=FOfPu!HW-cmJQOA_)0 zSOCc5oWk~}2fY2r_2$CL<16XeRM}Vd#ha?zcDD^VaBXT4I=I!}M$S)d*BVz>*L%#( z9r3#W?Xu;E3uH>W=-Mv(OnO!60rw9{DJi%+?<{AGV1yOFS=&)v%8bmK z)teh-Vy@jwNZ1BX5mA3_wT-ITtWatjaqTy3?mNTS`&#;& zFaoB4YjbjHDhAJpz#akuvD$tLam-4mOx&4Q7v2w5N-U@ePC9J0X@_oPGetToNq@2jaW?k_X znRlWi=x*9{4K{G`R*h^Jc(w1NjxBeuJ4zr015?RtvmfR(k79_e2!OKcBIfeF;+L3B zBRwMdQ_dG{K4|}lVNt42w@(%t&u1+?^iM~D(Wql)1Rk->z(I+UP*yfydNJQ=zIT5A z6Zr!gu`kvM2>c(a-aDSlz6~G$L@JV0goKDfLr6$bA}eK8B9y%;vy7yWozapNAtBkx zDl?mmjAXBD+4FZ?_w)U|Uf=H@&+C4k=f1nsb-l0ieV)g8j4yLGq91GXecgwy1`=xk zr*ROQ?-&?JBS;pYXyx=^hKfA?JBt2MvaIO&H$O zaI zkOysM8m!w%nD6)GADmVwCSPx?e(80v_VVZXhSAeFQEX-muzv{tT|3a{ zO!G$HE5?7XRy?~r3IY%+8n7f+J~G{AlW=_xuQCjD5pcRmhay($sKb_c8jFh6J02>_ zS9n@y0@YVbuRjss8mtWQn$$X7IaIXp`|x_%s;W;Q%gkp z1>(@@8b`}?Nj_Bid|tV!z^~`_O}? zkM7s~e6^Ya&fO_=y?ORUOa3<7(Z*xnZ5{%kBXqBX6lTdsCMY)oh7BMaQtdx33ty(# zEEdssiF|)P4>_3Z38OW+42GiJ4$1e-!9DaGC)SIukUKa$*6_#tk8d>=gtwVb;(U9L z!b}0IBz_E@h@N5kcVpI1N_mHbP>4{-LuK7}5?u~n(?9v>v@*u^twf$X7rZ)UdWVm< zV?cJk0rSZ+T+@m2LrD2?&0zm1*wRmHQUd82`lrj?>YvCbI_{0>NfTRBE5W^w*pPRR1ACE2OIQeS2h2Aqpnh9mu$_9vbish-#O9 z@dkM%_vU<)FHVU%D+r3d?_HdToj~AYCH6t}D2Y3$udMrqNWKrn-UN0*;=srwTHoym zviz^$tF`T+PIue1nJ$#a^aT1dsPRvrB{f_*7VHx<4RHX-F+adhk_DoV`jY^nSBE%E zyot;b*p)y6Qw2GV2$Hfe0H$p?-9&3HT=>CpfG=|H8 zSLy6n6$882&pD|&H&yU_bHdf|Jce#l=Xv_C-7h~)2sBGztDddJBf zQ^CgHdyS`>EEQdU=pR!!)Ocq{0W->YOM%cvBeaZxk zPEUmC`ow@3=)>nHZnJvs`)Y25QO?YC!GZHE^mcDAOHAn?(f}VWOmGLRX6tBz9zexS z(1;w(Ja^92DnG?_v9?Bc0r9^IV@id8vj6x9@F&F_T)U-ACyfW-ql+$&RE0ln)0u3# zzOk_+KSq8@;0S?arAwGU-ey~&JxF#TNuwDb?Jg?Ho&u^#FDRH{?BeI|{{qu%-1peE zhY0PfS`*EnPda#{qe9OlNcxSq%h$fCsi@Xo6KoOX0cVBXM<16-BmF)d|Au331cBkT z|LSG#W15USZYt^ea?&X`j+)j$)4=`k;X^n8S^ie1#NytX4d4V9+_YC+FqOuzT?(x> zJHqW2qw?-cqy%fqM0wL<)xubPDD$=MqYv}pQ)CvEv$C=R&7n!AO%r;Ykb|)?+*R1~ z(O=+ikbcnrQ>;}SM9IbtYLu{5>558Y>={o>Fp!fYg7=VyCNfTR@7#$d`BWTIm42hF zro6Ga_~AwpJ@~g2N()onQTyNR46+25<@y#n%p!wWWKb>?&CC_3Sl5V8{E8~+;2rV| zv-$J&I%U*9IQGP2&(En;tmS(!Ji0bYguw`C>8M* z&OC=;VukrX;f&l^Pfs+K9#YthJ-NR)sYQrzI||W_RRJ;&1y;cg-!3(5rar)7I8D6xRta06f(Vc#sX^U75_#7QxfWO#meqilg5hMNgb>sa5@M z?ArHYTz;pw;vestvZf~0Ep%F1T7w`cH!??QU3ad~SEjZVdQ@U*Y3a?nh(hO+mUho? zr}*aJ#6$`<^7633NlM3-i_e+PCx*s3wfXq_+|R8kl@2<{iVD`XW*n`(Fra`CS~&6Lsxo^6wuUo-~n=zRMyd?S87?cHQe~h@8eDuAp_lmr?(SPcF`mX>)JI2+ z>(f+10R|}vb|O3+s)OgGK0e=?`s2AkOXbPq>dNsNCc*jF_)LX&!xM1}9Rd~xfs~jq z_WTk<2Efl0O<}ItO-gfVYkJ}cJ`%Ux}ro1em=b&c!F1_#XmFnbkNPob#%rbdZm^22rf5^YCX>t^c0IHL;X zA1n;q3tohNMY$u}A_!O^3kf4n8M2Js9s|SV6e?c zMn3Wn(2*XH=9a30M93#DE{=?w0VY$9Uew(G*IVhTv~*&t^{OM+%Y2KCXei9rdEF3G zA99*{vbx~Gzstl?JF_K3S%K?)CblTYaG9y#8p)JMDi+-p`r?FNXakQ2-Qco6%(6Ri@62L&srkC5#LNhmR~b-(SN8=1ay6C76G^!))Zz)&vXS}r<#9xC{wBb;%wbcE6b2ZcKu5++evQTmMj+ zf5d@qR(dm6Iz?qY7tK@u-@&(i{MZ>cCEpSR&y~pHgu^b6>y@CwEQGE!9N*Zhr<|ES zVXPq)I9|?+BSheD$$DQNE~oc!n5vql3nDqs-joRtzTjoB!{z+> zza1m)20TB4nMq(a!76fh>FrF}9W&mEi97&w%6|V22iI;I4~o;(h=s+|Z*`xli}j;9 z_a|aGoL{Q(iCa537*z(pj|dS=!aw;LVUVs^$<4 z(J#+FrV6UUzK+^>|2{fNH%>5X+KRHG8yLqtw2+G>TdX&X3Zx$0v5;pef|e(MrCacB8EL#jaqG-*v{LbnO3XE2I+OloRW zOaTRg+0qGkQm2ca*Nn=3@0L->Rs@$C4C6QbB_;6+`# zPmTG#AN?K3C-Xz2Z0pI_}_@7IoOIKV(>bP?vu+_y!Ba&PRIkweNZ!L`IAYtn90NFKj_ zmOnas=zLGqKAEF!kG_#=mut()D6kHAzx{2cR73@Khji<@@iEo|vs$DBX96C4@A~nB zKu!rp3hzCtpbikfE@SdX%Dt_I7l+i>LzLR=KgrKu;%=4tw<#tTE5vl*fa&HV_#P1{ z6zKVLaY9TlzvlLdX~?x9oDQGiSmXH)0c%r30B_1AUsaW01)XZlQl=-wnm(9{F05sQ zKkqp-+x|iydy+3H2QF%MOOIUMD*3LX!KKLlW&0!gDwDAH6P4^3p5aVp9C8Z)a>ei8 z=gI<(3eccU-dO72jk$x-sW|Jl)3%#uE?nD=JEjDptxQD|e&+Lk-2*!N8Lk`<3|;(A zRhD8Clwml`$>PxV`7V%vx0sDk^eA9*KV8P(l6)%!0xQBB2g-+A+2*(0SE0oA-z#lS zN#*6=XAnh}m3%%MlA$szVMO zJA!1fY5$F!VSFD)EM)MR`A7LYJ{g`jQPzHVwQoWj>41cfD1Zg@Fgkng4NX6AU$iOQ zoqE6h*j6`Bi`DWrD~$E|aMMI_jdOl3`TjAeY&Q6zft-dA)7eR4I-8T!jK7>FloZsorN$^0DKYBm&QTVz_0n|A72 zSp+5Ddo+o$@6P7NIwKPkA#gD_H&+=~=ja~=CmHSDQL|R{4NHY=&PR30nJ3~z8Jxv^ zg|m!eAGuyMD#^TfTzr$&&Fv#OQ&#`g7`|D=3lU0d&_p1EyOv(Fk*pHulYOuru2g>L zZ}JIGW|wW$+wPRj(|*|_NEwrqRE^&R?~92D`2EY+6pIhv210K-Y467U2M^XDK!#+^ zOS|LiHl@#D*)DiA0B+r}*h{$aMN;1}K0fN?k#4-C=g*%@O}t9Iar2>CHTk#ZdlF@x zH-YY1_go+mjs;`?RyBM3`=7v)7khrJ>5Ov#BBkG7c5bGktJbS(*M@^hm&O1)Kfyk=#UX~C*T$OSZ@uZN~YoFXbYa1!o zTD(xhuP)EJ=n=+Z>Q6Ro5XRI+xzwJxRc!kWJ^Rl4;|JCK`LA*Xa}9mLLnix-Rbt`l zWFFo5mp}CV(k06#*XAPNB7#;7o=jx2UF{=LIt`Tx`9tM1E>gToAB_2JEyQcjU9FL3 z#R3}*BH;^t&(`)zHsf|`MxaFGrdbDsg>$y90tTTVcRBy5NU8s;6Q$JU(vgsMiMIN; z!hu-lpL%Fp(^-go34$bd)*afbz0uJa{)|c9%T-L`Y1{L%fvl}JH2&S zJ6VnQ^0n9Q0aP?vPEW^{_s!T(AxHSgkt0yaA2nQ#vO@nSLm~{(Ftd`0YbBq%x5h~l z-AU(j@2E!eSTb$5JNg%NvyrWLcLWV#V3K{JC=iE$ZIt;nwttD-)Pv96B;3yDZK=^9aohm=nj9RpNXnR38P+oa~0qQD;^ya65_9a$Gx~@xOOcPxWb2U%Z0ND>gNWBeU+A z6WSzRKfMj4AUA zGHdR8z8#{IzKerK!X140a$feiOFTOjV>-_~c%&ogTn)C*4k{{LbW+~pIc;YbqMtnB zB0UOVIcTK=D=Z6^nGe7GtQvbu!u~yMmVBcXgN}lE>4ACOK9$h^7X%Wq4MtSPl5CKFa&V8#W3YK3Ktq`o+MQkb={xPdH>IMvAMtGx6Qn=4|Z z&bkNIQ=2s0XYDvQ{@hYiSSXP0@0%UVjHpTNv6nf;NYm3!q;gfFp7JVMk-|qth+KY@r8l zmtZvjzkqKQi?p(F%SU<`i{Am%(kOpm&HUf9OYud@vcvT6443)Gowknutq^?J!6asX z989cYaJ%sXGF?DE0f{g$Pt~bV8G64Gn0egt!bKZ;V)X#IT}OQLYkx~Ci|=k4t!=+w z*Ox4s)+qXqh~Jlwsow%-xITD<#9auc?|b#|C^6SH5%ehm8C?KVcenfKzL1b`efQa} zn}0g+!CgMnvQ;dn`X(kKbZ6qTKeXq;yQjExKy{SjCZEpB@q%ygBx-1CDoeW{!f51m zF3eXA(0gfFnFpYeqbGT|o<3^F$AEc+>bHZY;y|O9y}tr-F|{+kBz`l9Xid2w*8|{2CMT%RsIQ6A(`C-K!m-a z$)j@K7xE_Eg$4I9aK4T>e3*W)RIPT(UiXIdtu8fXvOkmt{6?d1A#LcOjs(IE>Ts*&15(7ZOcUlDLP5%Fk-!^aJdH;4OKA zNg3TR{ROneS@xRE^;}L*w%~U>7OZ1a*Y#7Y(+I~In9a%CBD-StbJ*O(b9mO$s3?SuE{F|8LRE(=*4BDhuOSoZB{31h4KLN@ z{pe*C!`-|-#dvK*aRf222OHUuzkiA50_Y_%OrZV+6skUBGoPeRNH8hfv?STKQ^t#` z_B1*d;0H3Z$^&0t1P!YR^Yb64u>PU>29QW^N=c8gV0_mpK{vclYpmg#cTP@Ry6hM6 z^bxlj@7q931G5=Ba|Tj1+ZcQ=3r>i1nzuuGoF7Wp>vAnTc+)K zQr$!8*@2}4&kV|zKWMy6Yn82YBX|s`+CUpS+WVt6Z@aT;QAEF--*i|?K6gpYLi^~^ zgyx;<&#rs~Q?mKvb>HadLofw8IB}c)m8pf7N@GXp^BwB^gB4p>C0tfQvG+0=Yjiz^ zpPylDp*L%`e`AiEM83M~*^QwOFFhpifpTK2r-m&eeJnl41XRC!+{S(tjb~)gzPWth z=xdK9jyD^otqbB|Ofq@fxH_NXEvP_0m52a9fsO@CG%{~TSC?PO$EiSB`O=(UU*9xK z13HdqA_HflUIrP)cnX2DV1a#caK3+0+3;2Cn)uOSl~Cr*_u36Q7gBB4#-2-UyN|UGg%bRUUqnYow~6Ius(9XL{k^LJIeN{M#|0$Y#iRYmxX<#2Rx|J& zdH4%unD;*n~b6i@sr5r_^~zZ;}M*x__cbf!x9p3zIfN8)4h{U<Ne3HzrRF zui#_>m%2-wVsD6cjV`OLV}gZth5wdkCbF|2p6v+pP%hluZ~_re9v?FkPA>o#1AO&3 zrR02ksnofS8uwM`Jb(>NcR6%peOii|%#V8s3n@Y=iX#f8D6>t)4{MQ`?a3x&uG)9* zlAqu0?vkMPh*~ZUDL90IKL|!d-j|M!M9QVTOtP4(;9YbCDlG65OaCO6TYI`1xqS*S zw3{Y)*N(TX7OuV9?C2!&bW8!pa=Q zrx5&e|0Qj3%l>qe{h#1E2vYsdOP5NF9TIo27v6?|dwOz4KOGOvk^JpR|Wle)XFZjT)khAl$*1MsMl#r10@g6-*~FUrUqEq6*gyqZnk5G~1W zYik#qC0%=eITX{Co4W>wTBdJ_izv zMYLz=63TEU@kQ)Led)Hne-i;^VBkYiXVRX|1(<_CywLg*>>ePFY1!EUF2fFicdj26 z5hSM*3LV?AUT?C$aW!yYiRB3V1g%_GMvsyZrFI2>%AaQr1@%HM3mH2R3g$S&F{G?9bHQXUN;&zCCRcR8!9)KDF&a$qGNiD2wQQPVDg#FkbK+ zh@u_!E+{ClPY(`$CcrPLe}h*#atj)O#YJEv2eA$#;-*`B-~0Xh*E^E>yq(x>qp z$S;|~MeAmrvl$_r1BEvr00Z7cxR^LPI+BQVG_>8sS48anoQ8i`f61r5x=wj_%N>21 z+Mx@ht!egwV-6#K2YrV-FHjAhR#emK86Yy`@!;JG3&nAX$Sg`^NIsRNM)`vx_SBg( z0eMXYm$rVgP^c_>?6{l=8Q+ymrjM0JIQ(|GR5zH+yUf{MN9uaSB|iUP+ezp7zx1GM z#~4(xrDq?xHTihzo&&)QRTb*0RK+9p{)T z2tqb0F%bHg*bvdwnPWcgFS2%t|Is!dGr2TIHuY}(GWVx91u#W-Mjfxj?U==o`INSD z7%mu~s(9meL<}n^jSP{C-0JT|dV{PjRwa3}4{ZGw!2Ac_32TbgbgWtapEIb|I{^U; z&QpW|S_#H*h1CGzb_vs)j%;D=-IZFOcTn~Go3fkTA96MiZ>L)dRV=Ayc~bjXO|-L2 zL*sU~n~wJcJNz;>>&!{&4_EGeeN7Rj?BV5=fnFL4o{Q)X2w^KgT9AdO=SEct)O#r; zFVg6a$u1Frt0BKnsFSZm1q$Xe|C+LHGrT!*!u$X5o9>I(IMScc2n7ux&Ft4nxk(>B zu+{fGy3Y`8eE5p*FTHmm>?HKheZXBSS$*pRW~l!-vbpJ0_(@gX4H>X80zT4oI(O$O zkj`;5_UV1Ucy@(6tZW=HsXmK(2vNiZ|B zP~6bqR-W7aSf0V$)VR|Ni+?zhF`YJ6GW9%ODy#>o384(^c3nO3z3{5XWCLUKW6z5&T!hxH9c%hoif|g7{HGv=5K-d*`(v_Ly1yQz;C@@L9-Ig9bxdX3 z6z-&&D>kM^I$GVL!WuuVHfGw!0v{Cax>CDC&;yer#>mUylMop^VD%6;|JqCi8{F3J zYWRL+rZnfGG93&b7@cC}DZ2UMALQN^VfckqXLrnJ(yN+l2S7*)Kljy3ynncdnT%dx zzv1|Mo_pd`8+q#xmg zl&haP;S&Q&nmM+6FU?cqB=tFQXAx$^xLD)txFz2+$xTxQMP6?{o_%AWWsBeP+{Lwl z0$~&ei}EMWv=HorK`I_J=Q*swF}MNQ~zlFr_MZeS-Zhqv#Du)*<&^r0t) z8E>ZapT5}wKZM61mATHRd0E&S3Tqo@8)Ru)pB>@W!K2qSjBSws&ifpH)7^O zQ59!~qaKxaNSs((yd++F#r=b=?LFh^^Q4oO->sdTlJ(G12SPNLfl-OhTZoIufq-ch z{1>9N)CO&oeOHA}#J^#=8gxyFHwr>caM3@O@|5QM&6_HWMb!e-KzNjGT@`D#xcnmK z<{)~MhZU=JEzm=3 z2U$s1Yl{L~?XjIl9>GNnHI%z{DZWtmkiABz7cc_gEE^H9d|1%dRNB#7@6K+0O?N1X z_qF}kgczZgW2^&p58}J5KtjNt!tbx!=A;vClc#(QeXYIcb|Z@<%2yr`Dq5eN9YQIbu6! zxPTB5)_tZ~VTAW_SDLL^^2Z##`z(qAmLMwT<6H0z6f@5__DajD&vuo;_59!6Zqg|y zpBhwdFBLyFUNl@sL^UGM1_C_eU!S@dDuVZ7sZ9_>K>=;BT(#P(|0h*~?DMMjR#%2! zWoH94Qb0@=24CrjQ1R6pU`LXo@vq_D~ zv!#|ScdEO>WqSzin>WNF>@Ya*chQy3=otKJ>~&doCC&Zn^kt7SJVu>(6LR`(d%A}0 ze8JTzBf=Mm#pS8HWPn6U>goc($e12!JPiKSfko!NXG%*B66Sxm?qvBk!KUQ(L{X9T zj7CMk>@n+Ifq4fn-A+6IZ`ak&#H#{%h!K~0^ewyPBD+6NmkvN_M-t~6=xf&BcIhue zj58|>s_f{mR5n5?Wxu{A%A(oH^Xrj`jn(nkMH9=e`oRXe!(MDLweEoyH`GJ1zrP%C zkn$VG)X!P|k$nEevCc#mIiFp7$-pFC2D4j2i2WdTwAZ$T#UT$X1J#kwS$(H_R#QI zb`^EV@3OcIFeXIZ*=#NF4B~scCzXsoyXL?itL_?Y?J@-4K>GL@hNN?IbGRQmVsgh~ zw7tU_4XasFCeU(`u#!7vM@G*Pf$XP-LMt0k68epw%Kk?r+(lTxVM<0#d@%%1l`IU7C!zWAn9T#_pGw9qI@riA=pY(ZwT_lF||9=;WGloo= zxxXzt5y|+P{6ovRFV3X;>*u{+TW)`Qwzz1OMByX!Si9o&OQ&t~4rBbzW3`-o&-UMJ z_jp)l6Q|MV3cDBFqJ$(CiLY;UEB189XIpf}#Kx9jPJzhn-ftHF6AfksPX}xL8n1sx zjW$N}{P=NW)M4fN(J%WCIWNo#X|ZhMAT&kSIrFWAJyxTAEp!roKs2yengo8;&lUObH8)D~fU9L9{#wHF3Rk?OGsY z7&dtIj;nvi#ss6CoJcRtMakZ6nOV3AOGAc}?~^n}6MGxvYFViK$E2d#nX#}LZ3?U3 z0hCRC{>xKYK3=tkc+uZ#8GT4G?nVE=Y5p!Pbav+RV79Q$8^wdvD zO_WQG#T3r55m=0rZ+Tba?seCQ>G1A<>^+=;N>w9*s4_7S(g=CXjA>6ct&1;?9cuyio^;6 zi0KdpVJw$~Tg3@xhJ_qP>a?H)V+%TY%Z!-!?AcA;}(O4sX1LpU2YKo{1 zpJuk2P49Uc&`ZA;7rUd38uR_p-v$7|2#7ra-}84|HP?}QdVtF4SFCl`h;OQNL}QVCzzw3p5VOqSf0vwI!3 zd;bmhl&+q+(~6@W-+o0KZ9OBDt7%Saap_SRyDg>O;T3CTEh?e2jloxl*H`6kJkvs^ zD2HVz0o!8MhXVp1+cqhmd-nD)7^8(7IFa1&$jIgJ$Y*cff_R(498rqe>*pMoo|#@h z_{Cv^wzp86yDH($2k9qP_a8W)plThfYa>sk^ma3x|CnYo#Xgjo8vVeMOCWbAeA@}P zEqJ8e95>MXNePP7#CRvJ;nMb0g`2h1e6Qa2a!VwdX}-uZKuIV1Z)ms%v4P=)IR|n1+#EAmqo7A6xn6=GlZO zNw2C?mmSBH!q*8aFU%e|8iV+rFx6hJ}bFiT`5F=NQ@i^;MoOQ-8cP z(RSqLiB>(%8@Qyv@EzTVAw+;YFn7bk9-qP;3k#OmK$uZHxUac)?}769@41PmhIvM$ zb?i1UG9isB42$>*jixh)6OqggwT9t??vHboPTNfbAAc<(g;D$?3~q{C*VQq&9gyKI z%`rl6PV8%85d$CnzoqSju}l618rCJ}JGZ8)=GIs5hr6(ye<%gAjuM>*mQS!|e?=CQ z5DAstbJ)GWmJ$~AbllS>Gw4@8XPq9b?7Xv3cR(_u_h0M;^ZxzB-je&~Ct`L=Wcf-v zT7^aw=_}m0VnDZuvlG$b5*#`wRfSp$9_hbIOPDEu-uo0AYFOXh6P%=9*;0@!IvSf7 zcyEQ-F{aMns{UVF=YV|H7hT0-&ISp7xu5S3Zsyk8Xm^QM$^@#Ov(792WG23}WEL#p z`L!V~Sv)q0S&7r@B*|3kuy~mIJN35bCv=oQb8l_mdC^`oUW?}L=$oS*GpoO{2Z!r} zGr;#fGC$1mbZMZdKBGR$YceqMUB)BMW5VNo;WxMD=p<3DUrQ|W@vxb#E=_dqPGmTH zw!2kPj@YWz)c9d>r~+by`f8?GC+7AXfn=X888;F*#q(=9BaS%#WiSR z?+@4c$8bAth6k>BZfO|fru#ts4dkCT&;n3)6R>zpWGSTW&c{v`m($+x@bJuxiGBg6 z*?Pa%OAHGSY;#=~_wf3<-&?Q%b&uE$0$3)zH*-s_UdJ5}kH?4=4J*8pj4c)|yP_T2 zeHcfI^D1&qWt@z-tW3qOqH0+8;8`d;rFIaz!9oZz17q3+#w02wB^CWsn8VD#=)TzL zUdh&|%6BV2uCJPiWL}9l8#KdpH#oifQOJABBQl4JduHT5v32^5Rv#N#62JQ=?o{g+ zFEgXb!86wzQw>?S<$SvMsd!L=>)r|TZ^wm81@`f!RSws@%%8_>ha>wxdet6|Kf}Gf zVtiS{0rx+8&2h(F%Fw-)yEx51$+|mtbB?R!z}cqg{^-;&izIF;xaGXV)4`lBp=`&| z;Yu@A_wIiwlDZf&R)(t!>^Lg{mDYx zUHJ^-I-_mh=JF19mH)mra46@q&&Y~Dbwn4P~F!G zQ$|lp>eIsMkx+twMXOZ!(}BB}eJP^*N6Fx&5xaKJX;}|}z*m>_t5TgegtBb=llYm3 z$;|iMwcb26KE7LUT&XqZ`{u0SWvfD&8IQ-u3*+S`hcauVM~_5Q{(Q7=F#b0C&8ZV% zo%gC8NMpRuxvnKwYRRsVnJl#K&-{4j1y68Z^sVvtXq}PG!H#8g_iI?d3c^O&*p8zA zA#3E<#j_ov6+v4(9W%aJ-T3H<_$|WCaPm}9SPVDezw|7xZ~$FDY3Wbz=HMf$ zUm*jZXh#W;6_6pe$y&!-K(%5#rncQJ&P@1{qjk6op3fEN%T5Uk6EQLf`!IC^!itfL z{F&XJ%1d5>q=qjK=f2KjdM79eupx7H33=qdlU*PN3pN~&GJsrCAb1~)l-J6Cu;RBDYCHKZ2fz!|4T3Tc%=Ej z__~8_d(v~OtF#iVRD+Xa)@lzuU$+ah>rBO|Z=Bkr_jb0?aB{+SUar}%j~mB*F4cnB zq7yLE8^id?M`-N`ahJY6Cr(>D)OIE;!As@frxEOqEn#JRhbD*bM(Dmw3kdqna0d}4 zwJ3w1)6;d)cUGRYH-!L+5+vn!D5$Up6420W7X8zr6f)N~y61aEHM1^@5o|t4#459^ z)}0t&NLUr6{c&{xxB}>tTVM6L0B^1C+cr_Mu+kscs}ikWQ9K+O zm>9M7tBoBoCoMrw;k)#LaW4lK7_ACvG4LidiwrS!)S z?h-yp4uMZtsBZa;mfYFd*{v^8bSn%EyK{? zesy@*@kzckfBFwa>#gG=&QxnIx_+t{_zwtM`o(a=7l!*q%r(?wMr?z&MFX%&TWEY~ z^g&re^~F&KCPi=79=Ml6v4010SoB3IhxOT|&c&RJKLHZTpT%VKRvS-*QkfL4iAz6t z$p1YJ(6ct+lFqITjjm1--MU_7u1^D+GEKT} zlkyz1BGVP@@0KiP_47CE^x{=-%o-`9O70|rHlRC!Gt_nnXpR)l?+ekeXXmMGSPHI) zv|3x%9zIw>eVL!znn{e$N!j%QE!TdE*@|{0?WJw8KZRp97Fl5PBmkWeeD9xkcQ_}U z-_S|XE25ZEFkCdqK9H9ND!MN6b=-!Yyzuu|?AXRxcnj_Rd%(rG!=)5B$`{UE8Qpn` zNTUM5n;->ad2)2DEinanC<*NfS(e5wDT!A}YP{46Ci45&Yy_z-tpe@BL8B-84B<8c zPE-U2q&mOa9Ro*+3+ggxT*{3xwirR8NfKdL-PB@{7Jp$R;y8UMItMXh8UBy(4CNghAkV)o|4AIRjOH*KN!||Bw{POD3d0?OUk`f4768=Rp4Zm002%=51&`t|ek6+0bFbdM{J8Vm zOhwQ+iT=G~BIp`p;If2Sr?+pfQ&h7(oZd;`=01&#)b?Azu7pU1wF|?s4(2P+L`9r5^RAFq zrXzxwfJH(cZ0NUuA~54P>Gg@~Z_XrB$^>CnC?%x?YzC>N;Tr5agV?DLoZf*|>@8zO zXB&cWx^3_EU-nql0YQvzY07*6g%&yf~CC88au@rF_mx;(-eEsmGpJr-H^v~}NAL$G_X(~)V z?|f--YHOMD; z2+~0JesX#a=$o3#qfywh1oYo~i)jKS~O`l57q`n}&y4{7^>_iLM(<;ZYcop#DE zy*VA|YXFJ&v8=r1h;#3E76^7a)#}!1AYTW1C*arA5T++NjQY!0kGv^wU zGV}ddbZn66>9fk>Vvg^5Tc7^$QC=_e%`!vVRhTQv|+*n@R9=ba z4+c=*;Cx))zaf8LPe?uG(!^h^$LQTs>YY~yif zzR)$+j!zV)<^H1L5KgHRHHPd`E7R~jgzsuGZZ$&ll|OZj_f>ZP-w2ttmgeBbyr?IZ zHSKHBqDMoI-3&mFHS<@LI61!QU`2^*H`iR=Qia?vgW$+_Vq%sHRwZF8mepmn6d{&fD%5Q0}IfQ+zje zl3VFk=g`ztJsv(`_K$JPuV8=BC)S5Uxs5_u(I5Qj?IwH)=_dN7EG@v%*aeP_RfC?9 zrNgJ4-vfGEM@L|kV2jsBiaBo8Z0Zv$ehC`uhQA*$aaZ1Em-^_mu_g+Sw-}sk$Yax0 z={%s-=)L;XZ7INy2TPF`saIgM4-yjzye1Cam1>&Hd(z1I}kCRaum`1z`MeB5KWN8UHt_744rS{qrUS z(pSPMN|M7ktu}o4SJ0|~DgqV<74E$7Jm+0EZwiNgUNXCT^9&`$QfX5ZYl5WH(P z*QLh<>ARf|#4G2QqSL#n3@QR&+>3M)tt&(m4DskR1Y@uW9>KAce;Roln6nJvnM#=T z@aYu#ok=9SvlwsZ-2IN(BR$b^Zh(pR-+3X4l?^}-Y4XJ}sS2hmqzTjo_ckPPzNa?#B+qX5JOg>RE-Mx38 z!ZnF_<-~IWA;NF4M)f0hCWNp`$jsBjW6fE5r60yP(AO-FCPZ1=+h1+e!=>eetta-A zvVdh(=G0B%KtG{e82yLr9CBbrRYZ5uLvP<>R|i_S#3Xw z67^D&9aD#>I(g6XnNzLo=eoDay9+bn_YKf_)bhK05gTCH`#8%eD#PF!5^6~qnF_kM zZwQ(Ve(G(;k^8vh^(XVT(Mk6L08gvaAfTc4bi?lzn};hFEZ-^ryA{nQm}U(HG2sFD z>C;I}^a&vUChj>)g551B*ntFyIWRzH7KIvTJzNJnhdJZm66QbTWp7P8>7|3j7@o=w z1MFACixjaLqQ+A*g5xp&3U%jr)zzD9+{4tr0@H@Ix3*k8QJkeRDAFxPgVZG~DOKR9 z9O}A5=Qw;$a8^jh43%rQF_k%8(0T8>N4-OmFz z`G0u`jd33pYp#0Uif%gdLx)mQ+&DNtb+UY9f2Vl|H^f~>!ma0BsPeXdm)!oPfQ5qo zEyrIaVcRnbhc#(^;)mW8P9~^cxt;NRUs%NP;2~TcWiZc%^DbOsyEAEIo{0d5qY)Dm zgX)IZII0W)7YZX>T5$Y;HpDB=8Qwrn5#6yHevq_PbcnAm9p2|IFK42o)rOZ`04W6GhZ-sZeK@`DX_cd5K!(psB*|ThwIn2K-j1)Ft2`(VM4q_nU zVa=fJtKP+WjpSZbH9>V+?gONcR`AkkSu}>v>c{?+)#1v{54V0qDX0nD;tYf042JyVcW{N= zAB&Xzh1>DgS6dzuF*ZVXUFqrv>d8GUh>5=e6)2=Y`2Xfg!T7+u1djd*VmXp>;%{-J z9FGhsyL*?+RO^k~17sD2d)8fO}|YQ`3uE~y_+rrvsL9$|JU z&L!}O=^BRq8MMgy-a?|IfB!iu%%z%u z+7*0xZ$3v0;U*3?&RtzyNmSIIXTzzFe$vQp6o1cb^yH-2yKfG(3wr_--KA-)owjq! zhi4d$(fJy%hdnzr-G;UM_xxFF7oiV_zh$4CJ4+Rjqx`$jFeW%>Gs5Gb6&|hkf4m^N zEDc3Cq$WayrQyXX`vVwODv?;`59O8apeB2j8lCRVXkeifYw}xhU%QW%$ z%zWivG7j+t+{?bb)w5)EyYTdk>wz(K;7akR24DdTdN!+vIA97PVUXSqzK#0o($bRk zXz)<$;LGLB&995M9(aN}OdeL0va~;ZpXB@V*f{}WEQ3e#2XtYX*_(wog?Kc`_vszZ zU#FiO*VsxK9s<6=6M%nk>$tM;MYSXHi44iOSAExp&CwEcfh45g-u+m?g^%AQWNWId z9T<|(qI+Tw^xlq}NyRzKJeEJ(jn(Vh119~-?QHpXG^_xJteN>b?N(ohINu{7X<~c+2S?x*)yj5(`$Y!YD3LVm?a@;5_@7l z;`^6+`@aP1imt8*ECr8regS962y|qaQh32HowM`Hs1{+)tLWd4J8EL#gTA+XTyb=0 z{L_+h&3B>y#8`*bfguqQ=Kv*4jQrz531ugon(-MDbi(lUGZr0BW4P5)RNkzyoisbM z-zwfBP<|T!@9FF=58Bb1YZB|F_^I?lnU|&_ba>CZRJEE>e*3An``fBUem@E&Eh}ps zW_iMGKfPi-4*TI+5Jqs_1!S%FKH2_z{-IYS&1uU{L5)sa7`gU}|GofJ4ev|C_4Pwt zP2TiMB`wE(Ow7FrQLcTsx8?r)>h5NPzzw!KD&}`1=c-z&8HURkbj`b&x{HnPKDNHg z9v-!`_hLtF(8KbjH}sb)uZJJ>{I*&Vmil~mQ22ioCX;TU(L^Lvtuhrm>`35ftQ#$s^%#|y7%c+o!-5bI%IybV%C<;Ne zJ%9gJ#mu-ceaNFs?<{`K9IY~gfdayIWjYFUu3*JI*TsWS@k)Bd7imR~Q7QEJ-6;S* zJ9v8<`xfX9eCGe-0@X+j>bnW@0YJ4-h;Zwlnd}k+1r2uVy?8gsdKSDKB^vU`aH+J& zIoWX@(v|Z2cq(Azi7_hywXW`6r?hH@vTQ0s(li0*zv9*(@*R+E3 zMsEW;;LL?_4kogGI6K2St&sOI6n`=+i&KHAQwhOB-75DPP6y_oHeRR^*rn{CaeQQ0 zs(p4)`Pk>xniDV0yVx=!S2z732SwjNq}b6x2~H@A{tVz>>VO{`u1JB|*_%b`xAJ*D zsJRWb8b~W+nHSFK;PK-E`V06f!N&Sz$1-zF_cGxe^+col9qEzP?_H0r`dJ+MO1+`s zA#4XAr+@7pc<3IX`jwU4L8yUHAJP`uGZa*Pzer~VHwNcTC!Tv!^M_t?#~$Wek7e|C z5E{~=^#x50uOQ2{aW(hLakIuor#Zj=zSx@IFtC|3C3D#=^=N+K&eTl`m&3JJK8$DI zxx24lF-|rLSzK7nP$JEl(qTVGgi4~C?d0!Ut1ga?BL4@!@@7Ta)oU>EY+$TOxXI4+ z-+RUSV;s?0#b^S+uoJ`eR9spr)oEyD@fh5?o0<-N@o$+=3YU!bTfZ#gIQw~SPVc~r zs(lkeT)0bkG$MPU03g6w!eOM%0YW~Kh>)dJ-Kzv4=D2fDXx|hgGK?^v?{-;a!KW6O zp|i;*V>5Tf?8cuRcYnTUVQglhH|j>~)c{`=0!qN!Y?`xUN2dg;5m{I|-N#Lx*DJrV zf)X9u*x@#m(phHA2JQp?Zai9H9_D1|wyEU|r+xJKO@4B!@m|l@Q5K3VEQNRh4p~jE zSjZn|imiWL`1NJVC)R=EWL%o2hKn~g_sF0ARr9k}sEOe80iscY%a!laVw#2I zz}$<{JLbuoZr_rcVr28k>EcYPo+QW`#V?-YW#7{te3J`l1vILWRM$S z_hanKee;9TV`N|`gR$F8qqBouY8%`mf{sJ6<>%!kldprTaiec$*REZd&CD|S*!Svz z0AP;5Jv?7X%=lqf0{3b&ZtZ*#D46BPrVFbu(;*qFqOI*UI-aBXPiUFkFu&mXD8^5O ze-<2-Ad%H=a90MLrhKGYhF4aPhoHV0Yo1(M`;T@W=0M91rwZ~g<2jDsANSpTXMEo8*SN-co!5CGHP%4y)WzHCbivLC zt_}M_Uj-HTUKGx(sSVA|@ebXK6d{@3<@7-%2Q9(u{Ei9-+6<9*2xuFt2`Oqkgk~cJ z2(SOOuNMCj3};vz&L-<@@H9462~YfGG{Z72RXIS%?ZvRf$H%6SRt_C+a8yqW?J1U2 z(_n)B#WD0%LLYw_kv~QG$k@o}28OAD10jTL5!V=#Qjpn z)xpxZuBCWE)KmK5n#E1)y@d-sz0$e=2FBgCUIG&cSKiA*ECjHAUD ztt<{#?&ECPGqq;O%3CbHTJU4zRmL$rZs5GYLu)h5L43`TM_^tsGXoTB9s9m@o(Ar} zz0u@T)-Gp8wFLAbN}czpFMRXqGc!+mc?jQHG7$oG0St19BnVV%wnHJ!iAPk{9Z?ED z$C9*}xH<*8QZaG09M>DqrEcT%SO5p12j?5xMXDHw(XV1jK(o>Ts!9aLT4V4MKl zC}^{lV7ja0K9)a`IT-De$gVn}z<2*LgD>u|471 zHsJre<_&L5?CSOSJ~Tu~Z-`LdAk#rkKy(KM`O(5BcG>@0>Qguiv#~e6mFSk6n3^Iz z%AZ9G;#<$9d0)0Z`2|(D43oMWXeIlJQ^8xZ-Rqbf(Jw|A0}g*lNeN$9!Gcd9#V|m3 z^SgluJ7&qm!Yg<$1LiBIn9)&>K+n8VT;X>fZ{S4!a*DW+*^PsWu~TcEdT!|?#z9dH zz;C>35!QAuFTmE**}xZ}bTV-Uhbm)(a8U>g%L^7_L}w)78D03w;3qoag0v#wSFGtzFP2=9mHXOr{L6|m zIi!+=00esE%WH?_3Rd<)sCLkxorRAlQfs<{k|L>?Xi@zIq>^d5rpGF zOV|al$Rs2{0{}G44z&49AQvXHxp3D$;GsjLjd$j_7BDC{pPT#&3k2N_(vt{t`3}al z;06Ch$T985kRtpNB2oc%3z)`X^E5kd!i^E3P-vgMheTOO(^op~dQtGKEtW~Vx@B?i z#UtZePJV`w$#h@Mq<-|PelI_`IuL@5MR;)v*fBOCmRpjba)R|YhV_6-;?8%AT(Yi2 zK7nHQ>hgMS_q&a2uF5tJ`0GqowYKiBv&IL+!&DIv3hrsMl^ix`b_2(st&Xa#9*zUESH*|9t&CehvDwI7DHeW6WTwDs${^}>%>Gf z0Cpy&2IyT2CB2AteL=3&1XmsSks^ff zi1*ujG*TLgAdz@OBf`6)qHT#Ea5QY;zgLN;8_KC)R;c1wzUO7_GEctd_X6K?_%wQ{ zu-(Ln{qv>B#P4-!7)Tw9GAN0*je$*~ips%8`$&L!n=s=Y8I}NR%yFBOS;B)RUGEE= ze%(TE)3R~2x$iJLf#S;Z`1l8d^_ns+Q%BXceEhnC-;6zsc#*1=sN;=hNQg6D0K>#! zi$w?OcU#c?i*)S@I0_R~HzzgQu7!eot62qOJG0|akE5io z01+4b0LdnhT!#{pA)eD3V|O5?oiGAkiVm40gUzo%4-R3+;)Egrc?e1d3OegSnDdgbGRdQ{jy&DjzL?jPg9sK1(GK5 z0Fa3PCjE6Na9|vbAOf_*2WwVf1Y*+eBIO4{4mIXO8Ioqi&j zHmKSM4v0pD{T0-CKo%WLP}tKAz=dx6`=d2zM;m(qIzE|hPyh1XwlQ5sf=HZ$)AJL1 zeAPHSA_6nMxS^zW2c6?AEG!lKs1I-zm_gY*ov3pkU>IndNHmJk^bCs9^5R^RU?fN* z1?iW*Y^zGFUb}nc^|?}opyc@Y_=P2?byed`l13c_!$xowWMYEn-Mb7Jz83tf1=qhE z+ekBbu6pxl#=FVOzU_<~*^c69c_bJfC!k!A!Rpjg?=c=kdDF3Opts`pZ8jJ5B9X}= zfNJ;J4b~y-BwNQ+j)tG3dMg*7f%|-r6c@ z?o;|GhIsUt@1N!-SP-(=07jrjaYJFpMnv``nne6excmsnE!x4QEQhuplA$l~zz~Jt z*UgLSu4d;myLQ;@wzAz(zIBH}=hZAR@Dai=kI@-|E<*2%Tylaq7;wTwr52q!p+LLD z1C;23CyCf?wEV?y^GYljcb;P(R70x+Qr3HA)umYy{0Mjpz6 z(<#v=eWlAsQrAK!muy<|LqBM!6qS-`MAUj0RWmVMIjlz+?n>n={QC)x-!4TbIEti_VcHJ_lHJx;c2^0lVhh$9wb}n>e z9w_ua;Da}DYj7}2tE+cc7r?e{S06pEps=$;uj|1^w=h1HbF0MEWWoL(fPgIV5nH7Doe6`^k_N8C9!6wT^>6<;g!qVoyM zTC+v?12UZygzz6IqCwD&T@ghzBJO~4y|Rs#?+Je7l4yQmsXbxntB&hf9@gmZGuAk) zTgW88e51WTM$SEg!R8zKZ4B4u8MjWswL;HxBtnvb@#RU`pbdQClL2)}XA?q&cjLr7 zio%^MR{#n?zy)-9_aTzQs9-;oxQR+Os^&NZpQ#IIz(W1;85DC#e><5L%E1wNtFEjX zWg0MK{(&Ked#%D-f+2tGRVj$+O3;2=O-~<>lZF_1z%Qitcq&wafQqg!A}P-x^ME%4 z&+g#hU=BI=NYJ>7+w`%w!^3MfZKTm3eNY})m?bR1^4abW3)Ct}*8KwpfKg^l2Tz{P z&N4gTn)N1}f#=syyH@BVksm?FrZp8R$FT-W*D0T5d)HbHg}Mr13&B7R{-*PFDH9zF zL}r?Z9U68An2U>DJ1F(7=`-t+KZ0SD+@Qy@5rZw0?;NM&Mn^UwHJw62fWHnw^k$8q z2hvn3sCs9PfTlYDJBs|llei@;0S1&2m-J|#1siBxrknFifhxVks-i6Q?c;qvIFpkg zcX>ISxD1^YBpJ2HEg_c%suVyW^vd+PDp!IJv`u^A0RjDyZ9V zQBLT!453a@sr)=V%WCtkAk}loSb5j@*Zgl=HG>AB=%xZU+L;=m9@w`D!mD~BEjT1X ztT_|nj){O7>72DGF4LB~4GKPC_fSn213IunT>Kt<>@U>$P;`DVGKU!9^9EK=z&xa_ z5CB6Z@*RSZgcs9<#ySqNj1VMLl-{2q} z!`Q3I0G*8YpFVrVyRUKL8Y{k=!lZlB7HEjYDTnx>_$_9O&DUtg-O5HcJ6&zQDzvbC z(9Kz|4Qx6jPXn+p6yW}CChzF>1>ME*_v|CHIH!`7yjwMLG{vPtO7BE z@0)TSbDkq1H+n17HJGphB=cWQM_1dW6DP0+>{i5ZUO?;{AP+(ymz|=&fBzN*t(vfD z5E?(&S$4u7nNj`IBeXE27!_*p5DoiUL0cFZ-{DtbI-bT}1pzMxQ70D{V+#wkHUMn% z!Y&*&kGfWSlZX{NTwc$$+cNg5B`5WDxY|4Z?IAKO@CK2rWhbg{$u2#3u;jl&Po`;f z|Iudlk!?JioueqbR3AM>g@x=9D4v)mD1f7-PMz^$_%KMdjrjQ@I9fEyBj>bdgZ z_o80YOo2T=>_P&kz-NXKbU;uLJ(3y1PKMtl;%UWBc>tgZln=8{=8mMK%-D$v{fK1i z`?Ycxr*f;!NYW0!HfEzQab=>VyFqd#BO{=ShUMAu9a+g<+6pJ%XCYhif_aG=S6PJxrr6x7Ijpq^V%FoQW@6y!b)P1zEdaD!x8kIw<8&8iwF z^m|L{cHG#{mP_?Rmw?|8yb6^KTlhUtt>k@02!9oBlE$cGbofVKf~vy9{TV1Oc}66E zj^+S_LN0OPwuo$q>p)&grqF#V} z-ivR$4pNa= z%pgxUF+!RvdGulBNN7ajFZg{j%>xT;ZDSJyVOw~Gp@bk(Zzt#Ps)YpxG{_;cnx8Gw zgurs&Ik2q3N1{O69N@}GL_6!(LZcWTXdS8P?fD&e+$-e8m6m^5W!j>;2N#-@5C;6mLGO^~uT z)t{OdLUM(GL~~FWfS2*9szJSqP&i0?y9m=}7*i0nbz zc}Fide|PrXTJC}^01-;d%Y6w^3aHBnb&3Ccz^?tFC7--@a505dJ){f1{q~>x=fJ$b zCt|qOBH~Heg_ED9PA8O{pf#X#r)SxB@~4Xhm!by3YFa{$uV4#h;8|c3HCoZs)HKn= zKx={;o8r~AJ*;aIBu6RT@yBJuFzi=uafUReW4NU1+k6DopOf?=00^X@z6Kc^GJF0t zA4iYQ!@WT-?=UBvUA`y9dUd(Jz|p7|vv0{{L!06M;CS-9#}PJ?-GQbyf$P!nX3`Eq z*KL%caR|v|NTRIr+Mw`>AFIeuAVwy=b|Y=~VZipHkGZSRLmfISShe+t$zxGKe>wl6 zKp!2Q+UT-?8zk&VNK%9#Swgk?Fi;e0TiXUIGWy*f^Am(O&I{@^a+jN^$vxMxFow_H zh2krT0z5%IFwJf!;>6VW_GtUb0F%#CN|Z&ZZy(AM*h3{Yz({sH`E6Plv~IFw=*H!y zHm^Flcit<*Z~c(Fp7bQE8zf1LxkAOt3)MV+^AqyElL^r8M5=OhS06LU5N`#1zQ-2f zBIs4FDOND^5NQwmw#r<-^79@*u;dD&N`wCWMXBk9vHi@3hb(kQBisDO%C@c1ePL2> z;rM!PAC4v9pjt$pB7u4&W>I3%-n1ozi9b!Vdw(O^<{Mt3vxrcwRY zKn4wCri4JbuCYK{!n%ss+v#i!HNZuqA=>FA$3z(ofShcbkO_Rd zDXbSSDt4%z#Lm8+q%ql;{BOy&-l5Mc-d@`($@J-Gk-FsJv4%B20q%b##Gm^5jjRv8iE!d`q9AFe1fmMS zP9ltW8qZx_fcf#~bo+W2Xg&7L8!G!;$~Jl|7{Mkh7at~aHz2KKjrH6+&C8ORhAq_t z(N>ZC)~mVe<^FgF($o0u;sbXAY9fN2fHy)%wm-ORkY4J?k(-&FH8L_BMDSGKG?if5p0nffs`0^MxpQa7?g{ng{^6%Cqj2j>I%Q6< z9`deC`d~+$-O?rFwW{#Q)YH__9{Qf{ljYaj?94*Er#=ar@!`V zby~q-rhbUBMk(Qde@@V%*K`~2niXr+S$x#QjTaI9-(F;g7b3)buZ_r%_^N*H8NF)RdQRQ(Z>K`;AQtN?ft-ruAZPE~xSMS6i>e*!%KZnKl`+S(3uo%s&A z?S{)$w1(fm4@e&d&--=k$%V^L9-C^$7qzyA2X;^S1$T7j zyGR0%T6)!sZn7k#Rb;*%VjiOEl;@UyvEqGAp+D`H?1pzD1 zQhAzt}-IpYFYPGP*yTRANX>j(F=0=l3$>RS9uGv zC)kmdhKLhZQ@N!6+2&+BP+X~gp(Hl|taoLf&G99_EuiZKv)5p^l%xvgapE{RjrtkZZGZk(;X_tNQ*AT5FTm(-=h^dg()zib>F49R~- z$sOd3Ppg)ZXLd^(7}{*y{essH3ID~*5e(fasI8LjK?K=hFBTEtmc|{D)n6qbr2m## zzf-l9Vmwiko9RkN7nkCFr-7wvbHNnYxkjmAv!KzGn^MOLwg z{WMxCUO_Y#Bl95TyqcQaZ6WSqpRlGVXwwzz(a#gSoHbo-Hx@H3R=fQ2n)YE?cDM1X zi}JZ2qWWW8l*KzH>Q9!{vC9Aa`IDGvirw&LvEREuJbl^t!?At+x^)kww8d;4+Hy|L z)2pckq+}qwd-vLuVwZfi`tb8tSr#Z6wmr&&_%|gQm;okhmvS5H|oCqK|9>hL?&rRTOT{7$jw2)T3RxH&9EEBNApt>!`Kbx{-n;8HA&B0 zJ(se<2pN@jzV(Rag|ftUj(n35*m4Z)dTVkXVALt$eOS6je*b+$P`G*EC8Z%Ak8TS7 z7K2Mh?>?R}7chSLVORGdcayJPVA8|{+N1K0{BiZ-pwHm~qi>_*JGQG*HIxSg$C$-j z*{h9Dgr2ISYB2HXIIZILqBzcsbHj5Jlxj7#v7w zO(x)v`!B$MlEzNZ#}JBnwBBTrzjy$-Ftk~tc4;M%ij3hBsA7f&NkWTH_mubXM@C@| zOm&2q53PD$g>hWWxy;$T5@{WmU30E2y1Jyf2W@vG`a%SwI`IbA{i52=K9#V;EIa}K zZ99p|W88?BIi>sMV0F+=m7ppSr*VDFwx_7v0aRKJz!88Zflfe+1Gp&WFnS(;L9{|J z?|}YR@O3ZY*LM!rs&ugo6{Y|1_;*O9@ja9A>FEI+6Sx==;jLh;KQ?R65(b=o3Bf37 z;(ND95RSKFJ2!24d0C}hC_~$k*@jsqxCIX_aJD$iGx}sxRz<~JwaX)yuaC3x@4Lxf z&Q4bkHim)zn~VMRw!}$2OD&6EJr}=SMWmoNTZ}P}{?3YMpe>FrE}H<%C%T|gLbT{| zxeHSAC8cFo?;n16X3&Zy(&gz$Gaw+)jE^qHJWPxSsa z{>Wq#{^E_;^L=4Qf^Mq)?Ec)Ad4&D^K8x5__jeCmn-2&)LQm+a=gUteG!8y1n($`W z67|PNCEWgdQq&+Iic8==^VMhb?N+JQrqbxK3%B;A^nEqlboBG5JJ+wvqP)FBK!6T- zCrR=V`;&CX17O5x=i`(YY5X|}=0$~#0}3jm@8j?HVHA_kry~sV#m`YS|zw{c8=q`x?^zGvs}!y-yMI(0%e~>dWF6q2X|u zbwNX{zX!)^5ZY*?xq>sI@o?tL?N`TE9v&-7W15uyq<7VrlR6PWA<#Y&PjF(?1MfdD645)OTw6kxyCV4|RUFmwEdRhq+(!;w2oiu}I-gzqDTnx0m z^$!sN-DlDBx5JZHcO9{5swn5-Pp_F$kahQx`4@mxA7(sC*Zw6Rbo1nE!IkL>we?nf zCDY>a)5*(HYH7|#UZ`{UXKCBu;E~4$(PM(;2G`~H8y7xr8>_GY3|fk7SMfl^V6QYf z`7eJ4I}62;kI1(+xpk#wXAeMChQ_e=34LDIp3NcOEw7*P5a}&_O#6`i{XNEfZmS%r zxhDtg@8Ea?{@=hRZgN+sjP*Y$FnQ2uc;U@kwvbuE07FBw(yt3<*j^9cUL=%#S=W&v zFP}b0?a&LkZ^?8E)rTI7MqiYQ<@>(A{udANxv^Bwa6Ud@TwwAV zlpKw>vko0DllSVw4s^5>Zdg!$+%wFDG6ZRb{`IRDjt@ECoC?=12A2*mT8}P&35i)dro9e z=Kw$)(lv$IqNvLRe={cG+!7xK3z4UxF)`C5E)P0$Xv@6&qikvX>v9I5c`2G`=0|-Tt{d6m~VG20jm&yamM@Lv`obV#S;JO zzCjjgrU5?IM`#7CUWoZ92EyeAz0Nlx?yK>!xBv6$PeFPRAhUP?v}!K2pq9mpJ|nQy zHPI4qTCRYB$JnehR|50f!BEtRkXC&S(}sA5Wpc`{#dXJxeVwZqoSp1%NH{Ib&zqc1 z*gLu;%b)%7PQ~M$qTH1$ZtPix2)Yat!%B0lfMA)nq;NwS|HP@+*an63&sHJPdA2nG z%MiSmNfG0YHpP*^&1& zdp>&~Ejck*o6C3M7R%LE`@7qd)aimgyLx5qxv{C?Ky*fA(69PR(b9HQjA0=Sri&06 z^Zv<*Hm=8;<6hiCAroDxA0R7uYX01v81yW*Gsy*_Opun65{&{5de zeJJ|vDhb@~Ro;OT=^;=WQ8q;5HqOeEZ=�*7~kAiW(;iofMw9=sLPAt-8D_cm8C} z6NDBTY5KZ*(*5lXYO=30eKcho`qYVIi+QwcgeD91hk`-THQWX3Lw+$Fzdu{j_~%k8 z0@tt20 z^bf#Bs|+CoVZe!eg>J&&)J?66$4&(u#ZfuNi5Acz#DI_{`M1k2&7U1~Jq#W~!G_>W zXnEqVd;?QLidzK5BbJg3k+5BVv(P$QsDu1jcEDGy!_z7BAf0yAlDh5j8-mN|`i z-Q+yV7YhPnLeIu3Phg^?WG2*$Lh5E9c7!L1FN9n=!R_UXnFbUre<_S>p^3-efj+Z8 zkhh{5K?6q|1d2D}D7t@hR$oVSLj|Ju;ve9JBKmIz3yD}9ipPYc9Tq0470ZfZ$OM3e zE*f479=~8&QizC#hh8 zZS~pAK5q^j)?PFTfx`=#9L4aOXPe|*55|~HkUl0z3!Ofgl$|Y!(p@Y-^z-O=Y7B%! z>uLY*6OtDztE&qJD-yTtC=gs!JxpG^Va%B-evAy}L#65~Schb0(*5l$@~#O$#>&7` zBIGXwRw|jjf!Hy;7*r6|&=h}a1P2STQCfL8O!b#HWc{-sOhS}&0nnA8>!bG5pdPSI z3X0FhsAJD#HwEsTP-uKVi-gD(Pb zBr6NkM-%{_CMTNgppPoQkQ;~gE#!sY2pfgBADzHy}`(y3k0U8p}%mR-_6OHXbe6drzthurA5^gCl zcD0B>5{sU?dC!DlOGro3zdv>C6?DB}c0Pf*PDTiTiHJ5fz9CU2#p6^_Z-#D`|5lgC zrN+h)fB_|31ZOosnYF>4(hB;Gb{61?uNU3p{x z0+(vHBS~I-Kgn1oW?4&DHO_@kI5bjLykSScfU_gHB)rTu8pS_8tlZQ2eAZEPzcH=HM=?d#*Vnh$H|uTh@hhUn`0c)fv7ypg zRGDv4?z5)nZ7TSzoAn$NA@tsJop!4)cve}ZcWI(E0>7-JP@;u7L+Ggo}AL*%C%36%&h<&YVGi1o$cY)nukVpXCyvxIWtMNJF6rm?&}DpYCuT zO4K-gnu%U!^5py%S~*_;I*46Qp0_SxP6dO**LM)9F^5e#cWRC7TrsFkJrK;d>J46g zNI|2mZ7J%|!PA7q@<^WX#KW1#R1d)sTZ}fs$!#Muzw-b%Y&Bj1yG4 zo+kRN!jiqgDwGCDVyY9XNFc)gQVbyB#70$l=QA=gGc&)}qqH%*@aZ%rBp0y3F8YIq zQ6^b15#ad!`GY?jfHekB@Snbv3I;KvVG z=1(;_4kc!1{gz$S!o9x7KBgsI1m}ryMO7&R;!l9+Z$TOJ7wNX;CpCk-pvRs!RF|$3^Q; zBdRLWKDs&sfwjq;7ubK^zu)~fJ*!Lpfp>FbQ&Y}&DqV6A%juLyv{n6o?EC-KLI2Ux zv^;t|@>-i|DiFbQKthS9QIq=W_2$Q`gcw9E7BU&su^zweW@bDvv{6ImR@Wv+Dnqh< zDC!oj(wUu*H1N<2YHq423Cp0qX&d@g%Td)D=Bh7tFs3w1(y!()OIb%(MzQUi=k}v? z3vG;9+y>ge^ADO23EOEq>RDJkW;NiLXfZaJcl}w>K4yJA`I*4;du`4POkwC)lf_)g zjX;}%i1FZia2{YW?s`|h{pZi06|}XrPitu@u@>5qD|(Rb5$*4dPb!J{xfL* zwRY%z+V;tV&zaDBfmFe{Snc4*=cW(b%U9%GWrg+DICG})qADO$qWrQxtngR$!8#Cl zAIi8~gS70k=eJr$rQ+2t)Q!D=+U$KKd99y2`TZQuMK5i7NgN7F?%xX`y?m1ksW)98Vxzw_C($=&3uzDPp~1;PC@x zs4b2la1AwnZfYv6@mTyt!UVl*t$bL^3|w3X9mBOPXTh-x00l@1M-R8W1VOMd3P!43 z@h@JysH<$$GI*S@pW0%~-r?S)eI;|esrFv~q%#N(>t~?^_r+PF-+nICDtQQ+3H2%> z0XOMorLMJJdVpV}G(YYm=Z^==)_?5ODcfOFDVz#NcoZc^V>rx-PhvIV+H$D+Y?k`R z5S*?31&dS3Wfs|;P0{^NeYW0NzCmgm7O=;2`37HVmr#)R+LShgt007+O&?o=bWsmd7`%%S@e)b#t9+)Ea7h)I6dkyI?u&kQx&c zBQ;*M+*YFh+T7%1gL>J^_$O>&ef#1IGeZVTxs7uzS2TTB7O%!i3M#7d84t87_KgEW$cWL9(+Z()c2=PNV@YbQ+@_&*WEfI&?59Dk@GajCmC5L&CH7 zN2BT!=^Q@1jEP$EcAi`GT>5}?rGFmFZ?77n?&#L{_*toZvjuBVk(!yA5TH4;g13z9!_1)7nLQyQBNklJKyx`a4v0@D+ zPUidf?@zq#Uf8`mcQD3r@TrfDgl+$)+hR4+VmMKpB6;KT{##`ZfKtbdD`$~d6~p+O zioUFisNk6?P_&4m0vb=WEgv~`QVSMFtm4=1eiPl5Muv6+ zeHPbQis+u_pBn2f>`IGToQyYxk`hfYtfbjnE?B;;|Up$xB z!}QuTXHQKZ(9tT$f3n~9@*Up{@UDfE8uBa)3x0F}baCFfbEmRZ;lee`M>(B~iVDD5 zokJz4txP+W#^n#D!9$-z2X&-f{qdYje0+S?pG3=w(doOLhm1(p07jG?2M1_fdziM* z%tVjua9UcL6l}9?B^g(V{G+`ibh^t$1VfP+5m~$6Y#+@TctT9aa(d}KyK}yUI4jvU z+p^*@7V52!K@(_M?O}IcMXd)leTcGcqn1gwljP>#%{kN4o~H^qR4FclWj z-g+fU^(l!7D2rDBQy^o)>ow~Z;NN8c%xol3e7=Jc(7qR~b{;y-padBw=Tps6T=DO= z{wE#CDpPT=N~Q~@^PMYkZaV(tR539;`p(~<&x}}ku#?Ln4MWg=Y4}@wPQEO;U;qc| z(Az+C*w4cvT6b8Nm4Iay^Xyr1o~2J#S>7USk1^U#t*iGBD8Q20R8|dT!L>1iZSNF2 z*Csr54UZepZ!Zz5T8e)#2@$aI=%W1Aj(qV?2c1o`+nuRl{*-; zpIhj!j7VRK>yyY9!I%{TGG}FxnqAm9S47l$rwRmqVI_P4YZjAK*JHLJDyzGwLRU6_ z6va9;uZTFf!Gi!Zzw@R)+}wu7s$l4uy+pPoSx$IWnQEzCf9J}o5l$bsecs24);i^m zzh9d@YcT-+k!e%zuAMu1di>NmvAR!m3&0ob*x`@dITa<=a}YVqk6i#hzX{m2MN@D6 z8;g-CxZxVsExQ`Kk-q;xOQChvNMK}|GZzV+B6EEF_CEHwrl!{ z+R)t2{KYg-e9NK$J9OA%v1fNKs0o%37e(Z&p>!&tZEkrb6pQk4KMqD;Utb+4O8g>K z3vrFAOKEd`9u1wi^CSvl{YlQ;9Y4RJMvPY9iCe>Wxb|9BV*b{>7mp#_Edw}bGYtx* zCH}`sQyqGc8;RP$5qcTBgiN6QHlJZj<|v-YNtw?15CU>#K;T$DRhMTeBiuQp`gN4u zDvwcJ_V>k6`rC02n-deTd8C1IReUi)pI~dy^(6iR5n7os=Bi?KJ1+ivk$go0I{*-0 z?Qj{(pXeNOcSs0A6a_lcqYoA@a`L;*!yx9%hBuEiXnmh1qJPNE1Kh_-`ag|aO{nF2?>duaJY|cQ(%?Lz#^K$mw$iL8>r&5)!Aeg-=ml#3VIAqKr2NV zjb|VAU_3OH`|VwhT7@}&T#JU{)nNfuW0@0Gvil_e7MzZvTm|J!YU3C!DKAgf&ifhRUz2;_vgU- zbR+K384*zf5}tefCm!DA;gLa9k;C>Ycj04pcSNK^m(zEoE>?Dr5e{ZxuR6Nx7=x3r zi>I}Y&w8J$H1tN~3DPjJ&t9Y22j04!;P zpGd(ut9(RU9u3~C`VSF~gej}2G(ak=9T z)cEgaBJkUPKP;?i?t^tG;Vs7o$sWLq3q! zQ9JPcSq9cE4x5qzkntI8sQAP5zX3WNOxvK#;)CvKgpR#fH8mI&Tw{A>G7JdQHa~Xm zgUh!=yzn`}F4g3%4_5T*W aTcUSTNw{3^ulgN#+_poeJ@fp0M`AeWx2;-iyLdr=@L5v|GF?E%inwnKt2~~cWm^G8g6&6WJ$*!^>z8g{N z|J%?5585BfY&ZD$z?)gb*LI+h(`MKIyxAQMY3gl5X(c6c3v**i($dnqG~U{z3`ie2 zLPJZNDj~eZr#Z{c@7&8XI{Zu>JI?)mQ-4uI!4Ui5cB;*S`uWAOwdcFL@gd7BI|^xz z2kou6&!uE>^{PQbl0jERs7T{Pl&p{L)bO_vrbv%JzvSL!Ui-BtM9|>)cYY32-8;)HAJa&rS{{>z6XP%npdy_Sdg73z*E~ws*UEvm}6XwMv3!QA^9g+;^M)K8EMn zf`S75%CHdptIluV{6Bq@V|cPGfn(MASLeRvOt$JZrWgxc-paz_?e0!}`0(N5!*~CD zeu>%9bTDu0&&FTK*5EngPMo9QxtfQ^l91CQ!GyzFf1<=R_xCuRQr;*dXmQ>CND zd-J{yvv{oayZ7%q%_JQrMMXum^`b6|{C&#+eyn18K&gI5u@7@|o~u;k5&!fsA0Jvx zO-;O%Q@%!OsEBCm-%PFYUg=JoC%TvtxKM{knBGa&nyUSAU;kh-stmgY?RpM_HAX zl{74#*{j0?FL`)-pJV&n_pQeqqJt=gI}CRi)r`f})&3ntUdc|=R(ONl+}yz27^R5k zmnt4*ynP!WY8rSnLPTd&k{E%$jtBBX)OH#^1{dl!;RpAF6cWLEHU>Bar`QN-;`)VB%6O)4!$DN%}O?quo0$B&72%q*>~cPIq%%+35v5SVNFmkH!W z5d>KU`ZwR)n_3hM(cRGMC$%8g_c^-nQ{>XR1g+kgUq5k}Hb+&1t=(X`(J7m3|Xyv&mJI8C~ zDdORFt7q`LuibiSe&$zmw!{6MCm&_=KVQ7~)@C>B0h=e-8udJv$I%Kwxu3Nvo*Z`j z-jXGPwX}D1tckm@4|_%#{`D)`s{13-nV<9QM55#574m8N`ug6T;#OTNPd*ZgG_H9b zCTe+8=lvZ4`(bT`r_(R76lb&TEuEa4zJHEhja}#|580Ps!~0(loaEfn)k43pQudO^ zq6789Qo6l-W+!jzNFTkGkKZ>n ziGK`U;6@4-6&KI5HNJ(wJ{zmdOS!Xlt75LxbcV&ZC7IT}m-_1yH}GkOmEPx4YwRrx zsv31Z(Gkk8v*aPS%BA7<0tyz#dS=`h$>CV2uo=(5<*#w_L3=eQ-|G^#uIEzJpPd-! zs(d{AFhTy`8Ob$To*>6Aa`nf#yNrB_Kfb)QL|&d5??b9BdPR0F?#Cd)Eb!*?)g9lz z8;L0=>C4AT9`j|xZbd|F zH7E;AJ)oRsdZ98xN(sC3z!Ks7Ia;v17F;qyPAN^&IaiX+~~IXO6}si|W( zMpLqE2cDh?5e)oHMW0-oO4fW~Zu-`pI{`cw1Sxb|B~5Fe8&yB$xsY_rv>{2yknxwo z;d25-=df@{L~pxCrpJ06#=lo{`<#BGeK^guLHGRgj`N*mp(1=)c0*|g((Hybktq^W zQ=Oyj|K&mk=7&b~@*GJ9WyLp^Qm+LshWx*Nz;LAEPHm3Lf4z1JT{A7Oe`6P`j+ipaTkjYnXH|n)kNN&Pcn&q%jyz(_K zbnm`A{&0_g@n;TSwu2w>zI|U_)>y~tYhB8}PK7u2*sJl@Vs6T^GED6KgWYE{kdeGQ zf7Zq_s->Cg6nd-+6Swmfv+m)?8(f z#zDsk`pui=Q5;Jmq@=W5ra4hE>+9=fn9rW@K{VjZoQ+o(dn976IMkYBY3q_2u(7qZ z)wDUoU+;tOX#^*M7k4*u^Kkp>F=*keT|k;z&A6AtbzyGJX2DzLxzoj$-S+>jE&k6w zYTtdu6fMWj_#Xzy$jVZC>^Ry*v#_vW@8EF3OmHGTRLWH{!g*pdAVT7qCgt++v7LYN zMPlDkv9&a*rJr#>;br<6YWx9T2p4AILH{@?yd zjv>)`))p0Ka;Qz|`zhU`pPGIJ+ST)X2iE*sHPJ}? zK!%%#hbQvLzcTI5c!td-NRrqFRxU2CRU7vd zYPrrE)EW*nrXn|Xc6G_1hSIEDY2RmUwJ_)K@gcW+RMZZKu^xk(=O?RD`;aFQPDsM{ z4?5beSj%?8-d>cFY*=*(=#)j=c8y!Xbu80Fe*@)2Fh8>6s`ic!X;cst$<=GON;(;z z_*X|fJsGmuJ!RT*ol%2ntb5A8eXow{D)DzinYJ8iJs4~2JTv}nb||m+Q{)jW*PR1b zf2cA%!V%^a5_*8TWCg5T?7i6y>p(&Ajd7YD-LO|Z_`UnuWS9AC1XLor;))~o8PeI> z+V(djyJNW!@T-;M)r}v{H6v?m-@aYQw4VNYLf*oo3(1!R&^ahRK2W5hxXgG0?h693rCn(` zj`h%+o8adllJG?-D(uaNJB%j9idYmelWDBB6Mlb`6RRxK$C3aeKqa_P3dP7b&qb^ zt8OHJrWFkea=L)ygy|z8W9fpM%Z-6JkGRu0U-3omv1rey5;m>Z76YQ(kLN6JNH!dq zn0StWTef`px6V#IZdV)~VQ?T$3joE*kO^c=VRL`&m@sG659EOfB#;i%W>~8B~<*Od)TO*I*odOcMUN_b{$h7L{^kLnu=e~`01vgi3&<NY%vmd1lkBxQC zPqw9V*eyD;o<`Lo=rgeEijDKa%uha-sc+PK)id%D+N4#e=F2y0N)xc^l2eS3JZWLU zk8dd9Fna6WJ$iL@bLY^%9FzNmOz^58<7 z-f4%%=hzYTw>F-EylUh`0p(Ppr&$xMzy{#Jtfi$Dn-FvLO2pkgnGHBQ!se~zz%Hs- zZG_#I7pLC~?#+L+-z2X1pz};hG~Lk8=3VsXBNinY(NV_Wz~LosfV!QXo$rBBHQ$Og zcb5gdypX&TK)|pxfRjbc>K4k_^87P{(*K@&H_4Q%7VM-o`=&xa`tP8oqoeC@&1tgY zk&p<(BHZWl`}OME{OqJ!?%FkLx{&?=+VE2(5t|=hJOPP6$Exr>SBjuJga8q{`eOqk zAG^e&ti`96c=7p(%_NGS9`y=F+45l)DK03Wx=!jcFbp<&v^gVWpJ7_cv|aOJj_(U} z;6dCf@xxdZRbQN&s#g`ru_cf8bGxmeeQH0_(N!LDAB=%os-=a+Hgt$T>H!|GQQC7; zBiV}!vq-FJ75{p}fO9Bv49oedUaSwVW_3Ngckf=C!R8Q2=b1OiT4X~3gzd+_uR}&o zzC2qY()PxnY?ETRgggK%PEyL3sDbJzYGz^6{I<3T9OtB~Ka~}3W|-8)6P^KS%5u2< zFrZ2y3a4>X+JH69r$s@gHA3dCVK`|?#x*-7=f}^MiHV4a0H#!sTnFYO!+wMv%*Whl z86O}7^>w5{%aM+w*CzT)aoR7u(WXL@clj2ExZkc4uby(b_Ac;5qDkG}6|`IQYj}==HpJm9{sD0fa6|fXHBU~3k6oU2&n72wiSA0D4 z?tie}4o>@{Pfu|utUB

dMtP>*;>Wx7CfP4J0QaxjX~BRL`)uLCY+BkNxP~-bUx? z?w}3a%HBWg5|XXDkC$C;1V8ZBcHnrpgu@HXoCBFw-MYvq6#f5a_>?^t{p6_ECX%%Q zPA=B2TEQfsy9^*i2jSaQdfy#2De-dcp6u*w3gJ<3ICW59H|#m*fi)Eb4rQz~)YE$p zgi7kWerZ68d0Y5U?ri0&lPzzrPXCBa`2O`ZGgjvkP}v$biTYP30ZU)v={9mJb6oxL z1>N#iQoU%_@8rK!&V&}cYHoUL^Zv_U6e5=XgB69v+SeX;1hdoh9~D0?=`gy?)zuY` zWMO0D6y@L)zpTTRYZ;$Xkm$+5CYkqsx3uh|~J;Oa5K=d=m0B`Hl&9$W6CmOFbXA}f! zxybvnh~ay3m^G$24Hra_> zNlxB}gJ+1I1`n=Qxt3Yj``zu;`>cCT;2S7{o8k{SG54!ZYs0Qn6d<`X(Z`R1mRdO-PtEz;_f`Z>EChCqt*Edn0(cFXt`Hm?$)%nXN`m*~EL1AXeTF@87)( z7BOeT+pK6uZo(3M0vb%ZRIv(ivz%w(7~W%Qq|+Gf9R;Kq$t(nYzPin6Iw^K-H12_XvCGUHY?ca?Y z{ToNESCMoAJVXy1IFow$JPy`7wB%SES^_wY^I|-|pt9Gb7@xiTt|swH%K<_iA#paaFlth(|`OZzfWZ^sMj>Vgo)W5eH$6#KGz`S@r){riYAnljw>-H+S*`^y10 z*6X*5_=}jg_6l!l0@isAXFakss#c# z-`j7Zj4~*T4=xQB*nuMm%&|#e3pc9hxz`sTqCpucV$>=$+L#;@!-YrlsGj;4z`D;t z5U*bY@) zM#pBTmDSG94vT--$Y>Y%$DREA_W*cg#d=T)cdMoGfXOt(3kmjRW@bkFS_rtbOF6Ed zS<>X+<3IhIDvrNA6CEsS$NY*7<=gc{<2QLQanMjrKyd%!CA?*IYHt=SG# zFVxcaYB~Sfh`PB0jUG}ZVJ6XIPrRFMX=!Q5wC0kU8(vCui;71N30oN@OG{}?H}^xz zL{AW9-j<8BK+@Ya0;7V5awgdTZAc2CTDrmlJxlYS8i%Of6aV%-Ut2Kb z1P$x0lGs&rbj9!AyFGdGq*s{!f7p(1-@gYRT33vklaFHm0)mRPJNx3K@M89#V=6c2 zc)Ick$DYQ5e^kHBUnc+GM}XI-)%53(+4wK7%5=4*{BOMf|MKep`_DRBUYw5Fb^7VD zD_5?Nz8HO_B_i<_ox*?rsPwm3g7)=$V=6a*xFK>JemGoxZ0kA(hJa6z|8j~4$8K91 z*6Z1hUlX*knf^bX}2I>j41{z4Kceiw;uWgr;x zy&;*41R!v|Uz!F&2Ro#!Wgd$9@G0upTBOFi_wTOY1+d{X(O^i`MR7UpNC7iNccpLwt8~Y(Jc8J zcG;o1Qyr^GQw)N0WOVeJPSdAPrywQr`nkEe5i%S*K=`**=l}ROL?jbe;)k>kep?9- z3~KMi`Pjg2doWVdQ=NX(sO4gIgDgP79XP+x0@hv!J|+hrxWoub5^#JsN?72-EF@ur zUq5Oe>^glDu|uSw+?gM-LB*t=tXRX8kG2L+?@^mMJZu5Y$imVx5}6n>TLhBdht~W4 zg&aly`fd5_n{I9+!^0kez1tZ!zHWbL55aS)!;4Qf&2)29y1A>d72`HAKiKJhpI$l| z8qbNa*RNlnzd3l+%*@o3aMC(zjEq4{A3zTt*4OW{rjZ8DDf`hALo?`_4uY8IQ`lEh zvI&oc!ggF+dmEB$2a*CIlJG<8@$aVrvKXT5NqPZ53Rf6hQs301XKuc=)8rps^UsJP zk|lbEk3)Hjm7wx1kYND_nlmiju&y7bo8#l-t6lb+)_;0s28!gVnHrK#Y#QLAV|+y{ zUL6HFhU~TL!n8Y$oA+Jfz&g+2bI=2_K<&=Ywz38MB78MIqXR{5 zVxS4!%AIK1{5Lx92|@$^_yj+5rT`}U0z zDCHxo_dtMj)950=YK%2!qMKs;%C%{o3D9XI8s`nW&k*s$U&6tvzrWwY&MpQ#J{Wj` z$Ritmub4l_2^vj*8C}5UIITQ3baBXEgm^8*euG92iLL-*D#fm3+VnASE5|)S|M>+{ zD)89%%n@K|MFb)G5jqN@!vNe`KXhTw^;`iW=9=W#8t@#vHco)Zxp?&uuq(H5#x0?C zY~s^Afr2dRy5JNhLCr4z7;G>~1728U#RC99>=0ml_G;yxICbh?x8j}74}RSLdO~v< z&Mh(wo==`^Be?*?v|NZFC%W*itfAcZAca5ofTA1kZ@3>SVjh4%MCC355{Y2`3Hp&l z5(JQoz7KgW1Q7lX;vLCBpdOz3a3Vg5B#Lh!Xx1nMT7tAcc%Dcw;2Ln^tTy{!8#m2X3{PBdPmI5kQ2>2K~^zt_b08H54&p0u;_nXaa36 zv%KNq;R*Z0VR1ndR0Ny?`QTH$hPcgrpFh2Qw)bUX)hN7IZB$rXJl9}^ULwca; zmIJzPqM!@d5h8*E(;EU(5)KPZa?!{7zaMW4#c|y_f2JwWlDjXakZMkWESU>FQdMD4 z@_eS10Ty*hK8{L=l&edeFW;YkXwC@!Mn*<6AN+Wpt1D6R6ZJk!bq8s6I8`E|YtYwI z2=RnIro&0`PX>{HbnYo!2^?Ge*bY7gF^WZBMo9U_0DB)3cwg9gc)W42zV-LB@L3ZF zN=cUC;=(*hrwj}?5i47r$Jg1~9%uCA;GAIuhrw_gCHhqQ6%9Hz2@eR-RgB`Kfu zY19_rQQhncF7muX&y`qM0n#JK=Yd361>XGtu$Q+)qLFtbreM=TQd_mC`; zKy2He9F*v75kkai^p-^1!FJat8?HsYPirpP$?h2e z&4ZnN5u16V+K2=Bf*jnnQgi%=JE!3_*nJ_11K{h#Cs7hf9DOrbdh`hkU-c(MAGZnc5K^5;p5|j{a_bZzPQ4xvlC`u zwF3%wDgpbTZ6^7xQxZKLX=ZG7MPDvtmyS&gwv?gV6Qn5ZKFV^xR0g%a9u)|5gdW11 zhBbhk3yyV<4_wtnTTB557aV!SUDw29_OpxMR;l9B(%tdz@9)aq^#`tObnvHHuU*eS z7GcQ)%xeCi*@qjINs*ycgTGCAaZjm+e+=Z1qgVyv&Ved^{JTZC9zPS4l#2u&PHJJw z4HENC8@b<$w=7O0>uW&sJo@6Po=|h$2hGcQN?QOFfGnR_(Xx96BQW>`b(XBz%Em|2 zx)^9w63EL;XecoK8JU^>oC=#<=6|WgN&-$J&#{y4`HxE@t`hC#Z04=r(e5(1DwID! z-jas`VQFJi2yy|SRJCYih=CRlg~Z{59NpR9e*#eB0wAGvXLotXdf=)(%5f#wdk8Va zHP!f21pbT=!P{H*UvBT}x&@I5z$WH=C_ECUUY_9$3k#EbxMw4hNlGJ2dmiVOJ?CB= z!Y=kTrSlQ=j;?AAvvB#3M#_)61n8!3BqTu(f$A)*sGtR&21qRin2hq#2uQ=5oXWX& zl}*w~j(A>_<5Z>HH$;P;sCjjsn*svb^GZI+68?;!7*Jl;UuQdb?GtcH-4;Vw55|Ag zdR=LGYYE(1zvi@z?r&AG9!Zzivk9Fg0aN&{OApD(t%M*aKwxl*{|-EzH&}UU;+2l(nFQyn3pnOrRLkJ&oIzjWGle6>m z+*lQQ|5M(&nmWS(!Dr?je>flz ze?>|t`2>WZDzfoY&BO)h1n(Q*Q46t+^x`{?(IH6O!AJn6QLaa|vQs%Itfj^z+rUa~eD>>mvIQQzDCs-096QE(-JP-`sQ2+a< zNK&qlxliK=V9S;Smnl&Q4GR!{flUiK1VHOOal0#4J>~L9Y`f3BI7L>?7ii!Vb`u!! z#hK_;;C__G_ZJIZDwjj=NIFqC73IEL{La1p5bc;zHteG&Gt<)2prSHEuSeF@-#xvJ z-P4_j*Q&@Yylu?C%{m{TiV+zv3g$EASXyWs^B=8Aj>b2y^DQeXS`L0yLEW$_JQ`$- z@&Fp#%~6(%%&t(zdAaQ)G!wkMytKRPZZH`l0TB{Ww^Uj8LAmkX zvVYZeguXRCSCv&urq!E#lX};(C8+M+vO5lWU-3#zOmv9Xu(!{s?W~*Tm^84QPcI${ zZGJaq6ZfKc-aJ&rXa50U*G^z@oEtBEa{@eD=oSOzkrlun7B@A866eB4TDmA?o4A1O zBnvWd!juE1_vOXZJ;;xGalS1%j&`sZ9K+#6a60!b#>#LkKpzW`>4xYA)H5_MN{?-V4X3!()`l?I{k3JgK4UQ>NNzsXk~R4ANcYS47PwIfHnevtzuLu^R+=*Co& z5AXq8$g<^y&n@SCD7bncnezM_OEb}Gt=_~#{1VD$cj#C@B1I9DhlZvTY&i(NiPX*+ z918e~)(~D5d_Iq6cD-P)mvZBhIS|z4VPf}jRs?Lmp90h|YLI!2oPpx-`R!E`h=!$U zW=*8&Hfl)XM0f8zV4n;O0FnZBu@yIN+>mgY3r6-NUKfCV1i7QA&3AerZwIW0B`T&i zie=!f+yd=w;4Bk`bKx=wWXmajdPGI_+V~bpl_h#+{V#+rfAK(_8E!JqE9#T@UGRiJ z*N#BEqzvPK?m<3Pjo9Hh(NAP9Lb8DSE}EJ8Gfd&&AAV5h`>C-APjBc7vC6MI(3z1Q z3TasYT3D6GWW(T6f zU(EUv#!7C!e$8t))EW((O1ze6MhQ_39NcEaCU2i}?blP_1R?Y>Uq7(rRQk=_pZsh+ zA~3@%cDSnO!wV?~KDZAoe}3g9#~NJnuCveA;B<1LfkB~%S=Oglx%R_3Xv>sfL4#F@ zyF~l_zt?m_MaVvPBrRm=17*@78K<&r&3Lb`lhjkQ(^ zmndj!+sen6z>#eHxoHr6njU<3Xj%3*3jYC6sAM@)t9dqk@8vZnpN7IsRnA?+y#MkB z6TMk=nr91LIaRD8A>I-axt<=*V=L+2ZZ>D>&rU_;AX$UnZ$%4}GUYgoFd}_yGOU zA@4;40Vb@^C3q`)IcTEciHRQ6juT;`{wP<4W!a$8oub6|a9;i`Odf@&nB(ioaETC7 z=Fp^~Tl|3VGy(xE?an#$0xM5ga!SuyX5D?6tJ__^PRskwbMBa&EcdL=hHn815LLU6N|G0z zQSS4^P;D0aZHKTbL!m9kEpPY3R)1|k{Id+l1ac93;vg7^FR#^t;1CehEnEq{^_RNw zO8=?$-ri%VE}q`r&wxdt>uvkmJ3MNW=wvP!l9A^~RcCmWYrJvynu*fy`?dM0XBi{s z=c~V@H^>y7(AiKKd>lrnZ#B>m@ zgxEv;e1lr+dH*Nj*8B_kczD*_FCA|ja)`){aej4nx_>-jo%3rAK&`u*c<myvFNbF@`yuc@F-qYe^MK~949KF)n{-8n#71ytHbpMl^*3Y$46*bC z-_N3p|8$8rMU$qrHZCAbJN~^|&S7ii_@a5gJ3w-uxjQ)isxpJXMdkM>pc6Y zZRsKiT%`S8A6auias_604K;3%@3Tf)7RP$ zsZK8s)1(ug7%p`xnKdWvOFW@otKw1ilNX+6_&pje@wFu%6>caAAU-mcEF zGe_Eg53#1rD9&|=d)@s`rSo8tV7C}XLEfnpJ|`>SQS$RFsI>!N$tiGj?YgnU-|jH@ zI||SeW*#W$hwtLVBted`4}l`=hyIv;%a-Hlz@`j7bF5*WaT{{tub1w;a4-2Iw;z-> zSA3{j^|F%-PKBNurQS>B@(oO)p+?`R+4)L%Zb8puuyKgAHCucV7~MUx*Ja(JJH(OJ(AXFNat?)W z`Ss-FlTV!zI^%VJQrs;va3AS?NCLg4XcC&_5}J#8d#3d zm-oW^pFh}qS#*k9`}(!B+mr_Cwlrz;^CR&uS+b-apy74UZHtUkN~Q-)UE*DaAXEA1 z!Y1rA|Emu30K>HLzf~s&@%yEP5M3xBg{jGj7S8tSbe=@G#3l+%w$gP?Y_3oQPwQUg`&qy<)iyn+cU3pf z*(>c5v8%ij>;BZV4GKPGVXAZO`1EU3u9BuckVK^PfHj2=y_Cr&V`biXVJ^GJXQX2v zDwk@&oCw;Q7Qa=^=<{MDt;OwDQ`l90-O9hts0clV7R@sK*v2Au1`{%M>(5aJ`z!v6w#b;`|(i_CU5*YkX2OVUQAp>5~#R_Tc??XGOL< z1)m0#v`;GW%SzV4iGKj5W;8{dbgXv|(D0CCD6a+)v>rwwEVI+}Y+K37saW1+8r?S( zloe|)UQXSnGk!qohf=G;|KPfV;^_?$lg_c$CEtC_rk2K68X2?kZ2{p5`t%041Zyam zBDsp|JjDo0%25iBnwabSFGfJ)f{F@W#okq`S4W{M$8ZC2>A~hrBchlez8IwNVm}+p zL0vP+Me*%{L$oWH&zuuVPz-kw3ajCAYA=cFogtccj3R4(_TAqzWUZRWWqjr-LxvfH z3inDwKHANm`8nyzBj4=Gx6A(W4_^i13k~xs3`}^J#b9d1KK8zIF1aVmDCRh5eL|H` zz*RWTuU_x30xJUI0xDv2;)89Vh)4mf>}3H+1Y=FyYdz<)Wur3phU{h-{puX;!=?MK ztfuHkqF&FOs6$Y((M`!v=?c&8UCJZ2usXuz3qjaV)#upnAZ|qg1Kg7>-_j=OZrLP9 z$)zzb;ypvD3dmU0JT+_%8)#gm#=huFa#MzsXJgX>jaE7o;N~UTV1Muqd5tL2L8M3r zJd>~=z7Bvx%p<589R`&!56k)r<%xw088d(~x40%Y*SWN`IkLE3H6mFqaD&aBh?XC! zb&_tR^&6O8DZDjjW$)LeU$54XwiHgEQsQm>z(K-+rWbEb=pEuafUcaAkto2RY*VyT z(0joDwyN&jrynVckMH$v+90u!&Dd$M*-Gz%vP@t>@dg@&rX%0ocFlf;7nW$n2xYJq z3}asF{Y8E|l7V>c^5st5gjIu-Nd2xcZq?3r_qHEdiEu!#By^>@e(sLLtkGDhpw@M@ zx1u5Gu09gy%7Q9KS7hUB+MP&PJFXUTc4}GV4h`rUMP9~ z(i-73%D9@O$EG$NiDZBILMpq+Zq9FSu zT92@gO0T$|))2_C>p$|hJe0+=L|g~F1M%FWF~)dm0rgfV`d(}B$zfpp^aMjhp&ufr zyLEc$7*kuEpgX8|U2iUjP6ILvR4PY;_ z$(i%9dsjFfWBJ^jFK||}S>fx4;_8P68XqaDyu#bG*OtdG4}Ma6yhL*$vu`aNFT@52 z(w7)OcqCU3(RE97oqs9ghGRk_a;5nRs0+&Y&pJL$09Ul6h5CZk=o782L`7eH}I~m%3{~ol&Y1@Gt71gTAb+KQPA(e&hV|PS`nn)ET zh7|L4b-lmX=UUsQ+GrvXGD5o^l|q3kQQmYsSY*+lZfe&N;weGO%M=eqtE9mrUZ#`;0LJqKDpmUZqvV6-5>U(QmHxD zF$mmnl1%}NbcDoC1>a_;gV)%B-1R_-V*hVH=9-gln_xVnJmmXY?K1n|e1%Wu!OW{W zA60z$=t3iG+n%>Hp4HPWcB4Nj#n_E&=$!~}0Goj~y6hr_QYzr%JePUO7;_(xp|rke zKa<{-Q)$#3);?pRPtQO(fvrqIPL$`sg2$z_rf`$a2V>5ZH1pQ$)kfY!^uNJEASs2g zf`jij!d8vb?%1K-D>^pWJpZvrE*aHjFlHjMbwRHZX;iaEJyCZ#I+G7Dz`}DDymn^q_1T~TPTB`XTca#t0D!G@ zAD%S^lnIf8QGVesJ&EAWKxQeUo?h!#pnaiewk*=(ZI)SY?A?aAM$t=^e%nJRu)v1AeBJYu6fr)FWIFh)OF+#{|@)x4{U@B_yl_7ClhCmUec%%^Ewz zmF6pgHdlRm=`>+D*4TJ@*m>+ZBj_ck?%(!B4ojoY&uB2cV+ifKT10RQ?|#dz8?RJ- zpbfRckj$CqCraz?_vl6Jsj=3;Fpla$my71<=PGT;3=Ya3l(=9d;Wno+S_)Pr1dGFX za&v<=58a_vZKcYk9Wmiw+tJ$e{Zvo$$X?>smzg>N&CvG21_u!^bxd4bG4>H;9yi6L z&X*JtSnc6jX#ZsX<~d_VwELi>_SUfsY&kru+*s7Vg7{KU0-|JU5i%q^I}Y8V$khtO zqkq}4DKSZDxltaO3<-SfTh)I-2}@EM#J3fd{oj}N6ir^SNx0Xu;NgL+?1mHra;*Yr ziH)IO8eU2{3|VUgUfn%rI+kKo9xCF8oz;O8o_H4qI*tMvQFdu(6u#2eTCbC&V_o~} z+~Si5=i5-|2x`OhR3;h>0AcT(pU!2wd$%VX2OT8Cae5RZFpy@*0CrW~{M{qC+#v8| zGw}^74$9sts9YRknA1rJ+G)2HQY1X}G^BtXmW7KfVN+G1+hOl}sM7NIKOA zH17{Nfn9fh^X3gxQDd|MBSksFFMqMnWop)=R`COL@DCURfldh}YHCZ>9gJ;47woBy zI);&YH!HQo#T{P>ISyCrSW}FjA9ul*3!^?>-3YlgfSCT)ZyEu#vtYp z>b!n=aFL;zJ^~&<@4=T!xJrmXzH|KvF_z-Tta(Y}-}jgCTEWZJj>jhqxk}xw26{yq zO(hwbWuTLzabpJ5ZessXtHiK9i;9X$tK-nYA75XWfwsPoeudTF-=BsFBd&#MNci8n zyN^PifSuv+12f?4B**s=XhEE=G>p6#9BW-oEU4%l0&SH{`W21Nc%ZI+N{|g_`Y-}f zegy9f`R@Eq*QSW7GKUM5Cq3hq9{Mrn^{t=+HwYwXZM}}3tjJz+ox{~XD>MebYce`2 zsO!PPW{(W^d1P$byt(vybVM(b^QYv^>TT)EP88Dv$C2--rrFA#=xQ zv-47vfVJf!1olm`g{r##klflBtTH`sXV{gWf2id%Z$QaFbLM>*3(kNonVXv{XYO>G z-;by0dB0XFC50KnD99;t2+6yWsTky~5s>+$w1KZ)KfDLTfiTtvQx-Ib5clEYi#Ey0 zx_6SZ%{xCRxw8*vSy8LNf~gqB^mF6^+(U5VPGxxA8}-&%X^5i{!}Dy5ro zGnlWVhk3x%)KnBxmvJ9B*)RQx7#;XiaYq9V^mEid(7)R?dtKgMPD8X*9pBPFTQq0* zt*4!3zL*}&e(IM&h|)Z;%)7i6JzzIjj>@w95Rg%Qp6lZ3rl!WmGcPr*DLrg!W6}mB z%Q9occi6!w1~u%1W9I60o|#x0A_-tP88${;c-P5%9Ul7=EZl4^QBURBzap50%8Ds!L)7V(2w?z)$iEycmF)I28=%>3(MY0 z)>hZWc~MUVncrQs4B;nCo6>0Es)e(R%{+Q@zEe{$YB@}EPGH`9+|sKGGJjpCY8@JV zw*Wsp7YyN;?3Ky<*m0iRhy#IZJ-Qa~^<;2ZXZBJ>1x+g}m4BD3J>{4*)$l0Xa)B6m zhxA4~2h2sB?3P?$TE{WKjZTtOF~Vx7>`4qD=mMj%u;ZJE*}|3sqtHqG6F6EoA(wf1 zeL`)ZBi{DwP-u=$&*qoa+;+M{+0)1t1x{0f&MSZWk$6M9$RaBE9D6DsD|~#g8(Q>A z6vWu+TRyZKjCB?k>fiOwz_7ZOD~8eh3=g}xEDfAa@^Qd05OaPvRJ*iXuj6Nfg%}FdTr!J+}u;9`2U= zDsfwY%4AOZg?^`A>OQN-2YM>_kZvbUqi=g~WW0I9j}N@!AOYo$xYJCy6EKKDE)oHM z3b#lgaX`RogV-2S-HegW4q2$As~I1ykFMrrLAhDJW8Z*YZG%PN%+c#Uyc#QfB30AQ zS#D9on@vILp^ynSOk4{^?E189jj)Bm*5<4YX0ADm8$Fr-oC%^C;--Tc)8%Fo4XGxK z5HB$ZS#XB!#=R_y{>g=~+63BIK#1E*Z5FfZPxzd3WCatAux^>Dnx=qU{;6zf=4-nr zTA_)unwy*F&JK#B4P@aOyX#RB3IdS^58s7pK`$32cdodscVE8> zYxX)_bev4Cl5|w=9UVU5VZWqr^^vcFe5~(LAV8}YUslIJ!%om00+*X`WJx-iO83wD zkgjTG0dS+&Ab-ICR!B{--8jfPp!ty7q{1*vs@O~5x$E2rHH;ijQS!*FGyHF(FhYtx zMuyfT<3{A$fepT!tKTqEH1|f_gZuDK;?3e~^Yc!h>K_;&rfsUR=OyXpZNd?|zLd}P zCQ9Y&C;dQ&n@^-fmYp(4k|>UVyF25Hx0Sf0%?M)WDe5~acb#wXt8G|223QG z)~%vm)H)kyBjVBHa}@*oV4PI4v*i!E%!wka-JNg(R(PqNDM(rEcRPRc&m=mfG9fG> zLyc>zg_qnMjIgAkB)l=sCk#3|)9K80WKbCK4)dQRTtUQC7-)?fAx0R`1ZRiAb4RA; zL3NxK;SaITFkG>IGPH~pHc$qby6wF`sWWF_kdqKLX$M!dTXWJ|)h(e`$#C5quWG(Q z9Udc`2AHIa6-3r;@>hZGfen0tZ<%cIO&X@6h;0!)QW`l;xakJ-a91SlJCs&tE+5>y zT`R|ERxwoA2hzS;K#ZjUYBiawtdgAdMw4``DgMH~u~(i_ig(_Zaw_+}I`{G>?l&MF zOz7>Fo8vvQ^TEze16Gk?F$6lspm;TVVTU4?U#RI9(RikVJGUYeTZ64R%n6`ZN=!0r zgJ1r1%ABm1sbm>KuYccuZ2{QHceLf9^a+|m?u}7_`>vH4l&DoTx7RO;oxntMp!i1w z+op)fyV>i1XX0hnxLpKwZe>26B{9*nO-lhjQJxFBink_y)>S!u(!c4v*rxvaORu)c zR)aQ-<_O{lQ_4bXGe$wA5W@=|$fRM--aYW01I>n?P4@|_&)O_Ks9Gr|F1`Gp@t7C$%Ciyx_0uAZ1DXc#tDt=J#=SZ-{zQ+yK-O1myof9WWc=X)@>5Ssw5=DCU5H5yOwFXE~bN+%NC_8+o-L;LhvrLWuxE_t+@ zmG@$bN87f=szt?>D7jtTO%!@7D{h_irJ_1PYbBBn8S#f{nAFBVMuty=+(Cm@HiUB8 zD?8^;6pX+|k?6YUqOPGqe9Rrr3uLDO6DYYD&o<PWadYZw)B=cc3_s z?mrw!>3JK1x^WQei?WN>`^K)OTHIE^$Y?k>6e^lw$GB|X>}o3p<0~ z(zRcgDX|ColuzvJQQTaWs=dDN;K3=Lx3(ise$&Y23(kSr>fHSG!&C1LvtQA?e)D97 z&t6l3yu5`V42^zzev(;oZutEa-G#2#zv=YCtgS9nH;|IfVv-M5QKX!QZ7*aUQC9++XY^`%-m+wfw= z*M+ms5ic%J5WOHA#P=TA=)brxcFKp3MiU>iZd-77ow&!&sOE{F_Q0-Jtk zbasL3YjiN^H{o134Ci1u^^P6wB|Kx3oZ>P~BIw!9EEU-vPy+&$1Hl39NVu_LcX*(& zs?DCTl6_xOt1ykSA~<5H*_G`KlLSDc5*t@Pz1`i`oTqZ|U~Q(8?OlD(w>&4LLGPqD z&RL<;CekUnkq+0_kZu;UGArrm6!Ui-l?jl%U#h>m3O4#IqbA-tWB#BeC+**ge@^@v zRGsFfbTsMNlf%^~yr&wS>{?MHNK?LHW^qsJ;saxP{|p`eK3BVdWy`6lagXBRQ>W-b zlF+dFdT$DZl8Q^WP>Z}^ zqzAXCqS@A+}m*{(D+KKIYv2(V-+30|fH)=r5naCyl!os4y}K8_@a#9P2!(F<-O|w<8_a z6UF5mu(b+L(W~HEbP@qm~ zRtm%mI&SJ<6(sa#lAOR1?|_3U@NMVfgiY;PCk{IpJHT_KiZqr~R95;T>A!IpyMzvv zT=fPVim}1w%ln>SX^6KM4QUld-Z0g#W2%1BqeP8dHHTsth>9;8TCOJMz;8Gx6VO~5 z7{BybvGpy1nq)&I3SzwYNYqmO1Z_#nOR49x;DkT(REFk&ZGQ>8-yLGd{nPI=WCv`6 z-xPz@_Y4@Xt#g4sUJ#$5F6 znAnoWZ5d=v18~=8bgt%Y2zS*{?E_hrKhzP-RG@@A&LALwCYL;c+D&tj%kqB{C38lC z;UBq#)Q{YH2Od~{?R-jECR}QX+67C{{T%@?#ta)-KytYPoD~7+6fZR1frk$(gUfvu ziUmC7-ig8H0TjpqzYeCm%B-9~MG}lqQc|+ad+!LY_z)q378v*TO{;ho(sPD7LL}~1 zmisZM+Y`rOt2qi15=5Qg(B!?W!0Ez}{mKKNpnw1E>eV%~r~OqiHq7Ax)A{f~dK<1+ zaw8trj#7B*2u+A=4+4)%ZVh^L1I+JIoTj_;egv{U(pjje1t4iDBRy5Sm$BDHe%p#XAQ0ca@9 zr75}7RoDIUHTlEQ2Gl0PA(c~oymb*V$B0R%zz-n1ba6EZ8QMYdq9WIYLhyf2rUx-4 zz+?!xz5|=WR-Ms~oxB7>2 z>y!|%1)1o;nE%x9`?VF+@1^tYZlLlGL=F7J%`I?+^31Ql2u{_~%BllCR~Td`Gsj?7 zaT@n`IFfpvYp@{oNT4-@r|rno@D1R4w?uod3tbxP@GVRHdls*M`1nI3YTXjP_YJ?^ zm@MgMqUKt-ndkSebC$3F2Mm1=eLvj6LRP~B6u4L8Bgk0d#=)$EJ}&U_W;^%@hHlly z6)RR?U}JSY+B!I`$!!rlz*;~mo=_%K8^hr^Li^o;8^@5^$n9suazk=HE^MldKPK}u z4LUP9co+|W%Nicd2LOVY?z?P!_D{z_Y!qN7bnyI;mO1_}s@^-E>%IR2{%}Icld3XEWPpegAF6FK_DlZ!vb)00qi14Qh-_kvnBy>qozBF zuB>#)wA;TISAC_4K%{2u{1*9p`xHf;v$S%TpUm2QdqIoNFL3m#@d0u)S$@4s+#Jxx zpTWT~)c!5iFk*mTCwt0P{K;MerS^m42>hZ4bHN2^L3{3Tu5H8#gklHmf|19}mEm>Y zrKk_v`gB1A+oMWT+w##PcZl$5A?Cy?-BN$Ll6&Al55`VwL@O8$H9BMgkEK3sCJvO;3055um?oxKB}ApFq1_x9Jp* zxJcKM+vLq1b%U27LeKuatp^zLJe8PIeDzeTv4;c1*+ccl*FRI21&u1z|28l`=Y&qR zLUrsxB`wem!oHw##s0bF;_D%-R1wrRp-uZ;aLc9}d$^8Qu1{}ECJUmvN{UsfuaqF6(=010Ax5-MPJ+-?j z*U1BhY3`!?K8j`mGq2LO>&KOT(ZZqzW_F1wu9$_Vs~Rs03F$+O>1)EQcKB^IDCbv^ z2eqvn{=2HM{h@L%&>|%inUrA!YvM%qPzfxUMmN6p3*L!E7H{je@&J01Au2`Lfc$Zs zsm|c}aU!3|3_Zn%Rv;N9F+Qy?LJh-U?=q-gI8WU_XLelN;_u+so}r1tt6|L=|5C$` zbUFI5LYQi+`1*e3X4nGYVVSm$JACEd)_Xr%_Jcw*980|Tsjn!ul=b5Re=CIgjDc)_ z*6qXLK;m?lTx7Y7bu?wwndP7PcKlq~IT5uzCunDAgLDT`1ODi0k>>}&hOO?P(NX~1(5bhusisWo|rhW0F_21`18jPIW$o5apHet78;hemP=gDU0#Lkivs0L z_%Piwz{2Z@i$Le)xA>OU>mSZ+^bE7$d|}&XcFxHWv_6sB<7BHbt3;=jva0VfaH@>s z{Y9&jk-FQj#PyaPI(Z;N<79K~ZYCLCiUQInt_TG^a zwi7?Mh46_s+)15fZR<0L+r-1$x!0(|=C;_C0Dg_2$6X?P!GbEhPR3lglyzphq^=Lk zK?*Y5L5MWKG)f-W+L$tW16kv&-7 ziuh_7ve}DoWTf)1N&h&kaq~;^zp~co6g(S}eTP?m6?6mPoI%1cO;M zStW~`J>l1I=$c-=Z5*p_*F2aIC`+~`Y@x?m1_AFuhe6#7*b7dg-qF!5ksd+#f4JAf zytb+;l|HxE$A?<`Oy_ zoF-PA#7pkKo}&@z41F}0(rNnd>on0;piZ8`zm<(PxjtUz6Np139+ubC_@YgZL+lE% zT|vu9gwJuMEAiVmW$yd*O8Re+R=i0Fy%n3Wm*SI(+-q0e9Xn;IS9=|~A19s6`sv6m z&^_q-5oRJBU!*nzUZw;TB0DGNBB~MMh$oim+v*%DQBbOY5+lOe05KJ{5T1bME`0hi z{{@>t!%HAVDTu7YM*qjxu_Sbpky7`Nn^&>?SJqKY&|dg?KXLC~!ed3V971$@10Q#y z5V5v$njSnwVusLHf57=-WRvLuKRzR_U|5>&>Yv;jvpv3NJ?*n_A{|Bxw?;~;>-^!V zYIP236TC;BA8)e=V)4QQetK#F)c#d=PdS47A*!jn1j1#lI$oXIP1Dx(AyzL6Yeh1a z)M^lAB(@CR+hKP<^E>n`p*1HnWb8gRI)&BlSKLEyV$fOHeCZaQt%L_Wf%GN-Ru~KRQ^mm8N<2X3glS|v9{7-bMFUwvPf$lky5)u#)Faq#fm?UOa zPebF@A>zK|tX*v@k=||i_I8BG*2SXC{l8)ki85_--5m!Ol9Xm{{drFE&@OZLW9{T%>EG$(0ab%woMH1*;Y5@sx@ko>fJ8k;5 zF$$EekHmYRw=v_{0RHJsEo|x0d%JAD0INJTySiF@_0qK(#=vFZfsw#hOn*se^? z%(z*V;*yHO;!*e9kCY6-U(-Tpv_#kNfa%lj*R!7`%P2UY?kbRr}`3OwR8^qm(W~0 zPW7uGz}Kp0Wgv^6F(CUnb9LXtk#~pv1q+|-V6q~zNfJf_v<0O`IAg;&N-LOm_1`X2 ztPK6DBs5*hQiSCH&d)B5uA z#1?2b9`0)#*O%CcYk=sHC~8cbX(cwQf0^iggZ16TE5l5Wa9vlg+}Lf3`_UG`X3sh@2cxm~!XJnGn5Z7!Cj zo$d$L{!57*rPKs_v@SlXo%G5DItwzB3DZJIiYYEy_{)`_Bicm?#}dx?6!e`)^_0-5 zS%vxT;6G{*-`#1Q-#WmmTm#A$g+pJ_MV5o3Vu~%_raAVpWUE?@2olslv!I+s0nCcL zwdIcvIA{EDZID=6V)O@;gya4_f8cZ|u$m|C*4-cGTZ>nX=N)dwEzJE`MWi4Q4g{oU z+e-3sWN8qP-R~SSS4eR6_x5%nDEQU~Tt;_9Bz>rr&Om`>!5e=iQ>R}$+v!36Dk|-H z6lZNk5-Zj^C7DU78-M4}*A{f$d7Co2_Zj;5i-pv?n~y5IZv3=R7E~gWguJ z;3_)>%(<(J@2Pu&Y;kHsN1v%n(fJ?{8uf230^4+YN62n^7kW{v_1*8bSC2^Qb>?{q z2-um#tR%bd-4y)vmR_l$Xrf;>eSCX}nxjJlT{zp@#cF=L)eECiJT>$%4fnzB%uN`& zefvCt6?{Qk4bwvqQmwc)156yif=oOW6HbbXTJzT+rxFn`LsE)Rhn5P@IRE+m`vbC% zLWfX&yw5Yd<1EQ+xuoC97%&H~;smPsi^#iy*0(lvf0IpB7@Q&`B_2y1!S%E#z|7Il zWF6gQ@^;IWg~8%Z8pk`nVn4?@b?nf}ZHV;fUMY@xa=$W`NRsJnz^2IDj<#nXMIV{o zT``wN6nV%mGcjUCFKZ*~Fdn=xd&#rc&RDz}@C^FKt@!Z|-z%FDSrPQVX87AB&>lKN z2$OlCKWawNVJkJ8Nqz@`Cnda@jbrK;DdVtnh-{09799H2qy)y6qZ)K&eztO6gb75z zY3w}wN()MYOHL!zwOyn z?f5y-yedZ*;YAJo&%-y|vsl%TEm)Zldchv=2@W&v!mUwEtL7_wQ z^c?hwK^^~i5gJ26?UtRF|C!{(Tf~E-1AU4&AV}P!WR8J@kf!O+(b0d60l&=E1?_iq zCSMf_-f6ekD2S8dGoYU}L^B7l{3mnOFl@6Z`se#YG>L7JTQ$`APYzBZ1(e1hs!Zye zS9x<+wUeI#*@l@C*HalN${w!kK~CZSdmY4(0Mh$GVd3q&S>32j`3bL3Rpp&;w;J|A zMw(ur{B{_7^X;#*$3TLBcp*9=aEUc;W%hjVYy*Ve6;jJE@W=heuaCPTfifGrlQ&I+4hSAyIu2SLwj5+4%K$0yvZub{5rZs zyr43>_a?w&=_)$A6!RR<0;lIT}f^pW#jKxyx%Cb%!%X4_uxc?`7j^-fz7{LGihzQ-H%KcOM z1ZF_qbLhaXCQG{opRK+}rkctHD6o{C#G>rB9D5-u(s6TE6#A>neX~i-NQ9+H ztG!_*LT9wUEt%)*pQes}$SaoSKk?AiLZGqp3bV_~f$cW`D(rRZHt5i`WvC>z6 z5H@oF&1pW1$2_1AN5K4>br_ z%-V7UD1E$?&+U|V^9V}=bmFkYBbrAZTqu*&P22Qp91=(dcz8Jzcg7?jd|fsY9S^ri zz!u#r*#ko28!z+@9cwjo*Ig6NH3LAT7B`6LIEO+v?f-7rc|4QJxj9}4OIw(uxjm7y zM|zjC^YP`q--Mi5sMw;|hfaQ-6^l|2=Nf5Bw9+CvC3NY4y#xS4zmXgQqv5^%6D9i= z2+Wcv6xs(x#VCsZRdhr&uy)FQsZY%{o?-OFRs+T`Efzng$Q%J;(eICiy`szE?>{O) z@>Qc9=R04-kUVjE?ajj}7{Y%Xi`LV7U3ilaO^DW~>eG3!=eWu4fI_YMS@Hj*@ zrBJ?P7BKgxEmR0@-M9_{-vro*iTk`kHMr`|kMflz`aHDCz1YhKF+ZrKch~<3Epnbil0ZaJ$a<@oQt^;q0J98z1c?u^w;w0u ztkc_+c?%QzW#%6^lKX~+<~lv5=nIi0avFy6A8niaJznaktf4R;_PSR(W6p$6i|WmB zROc@>3vJFWTM4?<&56O~?DO^JDYD-|DUJIfx4aq)DfH9@jj}}n@w>wQ(E}_vRHjQ9^K7Y$KWz) z_YLiB3o>D9yEx{rS2>(z4n=Att0!v&C$&WJ*I(yRdf^5%4jo`s;IhWwaKZsdOxf+C zsF@u)jy-aW$P|3f%OYT6oWnmf=2LuqDUwSgq5aG6o&)`=^aDN?%o<(U{#_;?WjE`- zsH(pwD>C-w-lbZWx32BJs!wJU8`p9c7W+oh7YALu>dLO31^b#ey~oc{*dOU=HFeF3 z55ZJd2Lf)5r7`soP=!xp5cku9$vUqs)~f( zU~^-*gF>5mwf$ff)sz0$HF;S5Q#iTBhJL z8)oQ(UYvR&8wWx4?iQ9(5BI$R?_0n8Tuox?e9&Ai=(w^wT*vc;&8Sj@xZAsD`bnKF zS$2>|r+_bSuydY0Q*!;xqd)z>D|(H2p@L9^Z2JLJLui`&-tQ_-olQApIPG74_9^xE z@9*>OWhb&O4DL27TE29kgQfhA1;3&3O*a)ktSAJLn4!AGb)SQYJg5#xvJkzbNRZxc zTH12N7H*M46sB>iy=~^8Cai5hi%7_aeN|~5;q@^pj{=P+%jFoLBxHggr9Dh#ozc$c ztOT?riGxHDcJsv%5om1?I`dNW1M?)4@ym?+k$-gF%iN2DMEVq~D^ z7RZzj5XNX9kaqW=CYE-pHxW2pob1x{bf#prtk{A&K2TPum8-kNtx%Mn&hHKg5R!_A zd;EFN`MOKbzl{X_ZJUn--St~5k=Mn=u_Gc(=l&#{@p*wd8;UQFs|p-TI9@^{XH57kvi(7A5T>ga^=%JBXTf8~H%! zHK2$$7+3eWzK!ucyP3m>`75n|(~Mqy`9Tx=7|jw1xq$SS?tpX<7g=c( z5|0Aavtrlq63?#ZhC{`a0EY*m^dOx(!K{HfkT|lO>PtfUzwXWbYTkmtHO4u&=Iu$QrdX*k zkY?inwWcjZM-rhnYCU21rFqMa&+~tDDeXIRYEHjU$^Ao2UnIO2yCXx4{t++cCth5< z?zrEN@Nh46v#JZS5KD+u`?V(d_TpAo#@sXOz=k7xcO$mWAXEZ5^tm6Tmyp| zlUYyFRzHES`ZSKTAyJjov#E49^F?DzE&6-AcZT;NL?gWP1lR@_*cGVAJQa!o1Y9>b zL;UV%B+Or1rl&-|`4?L&6Laj%D^bZa%`E{L9eTz$eggzY2<0Uhu=WD&Q9xCOc>Rm* zS*2PfD!XOb^6x%MQ5CNE=B*}iOt^J4FX!G5o2#aR=_Ay_X=N|e1#&2#?bpWmlm)e2 zwUUA}cc_(hclx0E=Nqmv($eTiH{kfmw>@BuIiSFe)}G{-6R0&2@2hx>}1LMZ^nN!gT-MTexyJ<)|?j&`YEAkPnSJL34p9#1rSe|H%WCPJ~(j0Dw0b^-`@Kz{8a6 z;j`j_nNRNg1MGj>*%^7tGG*r<$Sasun>0o{soed4(`EQ-?L7b5lcX0|$}r-t7h{N0 zQY_?sx#-M*$0lOR9Vkx35h;T=q!VF7)A4_?Igm3V&unD%&fzQEeuDGfs z{=dvW2w$;eHGYg>Nc0<&yR+X?2C zOoyVT%~uX4@{Tl}3{^-v0TFDxdGk!C((Q{|O6Qg%!#~A8K5$ueY28{QtD~LTCKubtD<;%Mf)7J1mTU|`dBdj%=; zg4%E!9?i_i#%oofKA)0v&+gX_o_iSKbymV?zCDi7_1_;dRu&hL4v9AR+IF%(k8CI8 z@FJDV#vGHkrXK~-W}DF@$Mp&9ICYD?!}qisLn8l#YL*O0da_mFpCI9xVDffO7tr|u zBbG6A-Vu-z^YG{gvzp*q&ZqLLP`ssT`$DGytZ6F-gE8;^SuK(9^~3G);*)Z6us4c- zbuHuK>uyP_!zo5aC*gMQ$39{w@?!?O3Kzp`Y;+#a5C7uen0$`R9)#$uM=lGR-IQBJ z!HJ|dgjEt0I-T^}EffE7aCop5wHG|s4R&<#t+c7pujki^)XfD@E?HX|lm>k#dJ7An z=m<<&(U&oOYVc>{@9!R=GZt)(1LK^JlNdZNYri8`6#y=`VJ^A=yufuN%kM=ULB&4+>{V$?e>&@z6tE3Z-<1}6J9efRC+d^5^9Rk%^R@(UUjNI8pRr>eLmri6|axgz=X;L-lrB-}kmQ?srmh%gf8~t3Ui|Z3OfaXIUKyVg19bG`+rAKy{}pwM&I3V%A)o<}^&=^}F>SjF9eJL>@9!gw2UrLPGUBNBG@uf}GuQ&# z9Z3a+2&l)kcTq4>r#_Zt*nzIIsq|_rD%>2%g{uSiYNBRYt?AbH6?4gRnAiB#Ex&(k z?8=4*yZ1`Q{u~oBDUf0|6Mt`4_Ou{Z&cV0$aFRGfs?D{MV^c@DZMG!kstk0tHrwkW5^>|_kpDo!VIt-!(o=?iGH}u09a)U-3k1cVrt+Nn}3DyhX>9* z0M(eRVo&YIC0lfB<^do`(rXd1&g=4~5L>o0Pqs;&P#*f>IrrLvT67|r%WDUzg0ahp z{PwU>5y20n>BJ6X=jN1u|Gf6Ljc{ywC_}A@I_;*TOkqzxSng6)vf*aRU=Y{eFCeJp zDNh}xc04m}PeWO3So!CxPbNuGh;SVY3#@5xk0v4D*t<;XfeOJpQ0x)i6avI0ncq8H zbJ`mu^)F|lU#j}H4?PR*8>^ow*V^<4r~E#PsxEnN2;r1`ed5nrPs3wFSyx0AFBn3u zGSM|&`-O;LK;S~GLPk@XeY?HjYT7sGF~9uA{ZihU3EL|-{BPC77lGAAxPhwK=49N)qxoKdl(-5jqNRoDMnE2i5f9c6j`uDVbsFR7u8kOf`VC}p?i~VZW zuUwS>-V>Qn)#6GWG3E7oiavl0Uc#>z28wY)Em*mPS%Xc9WHpjvAb^lh(wZFp$_e}+rZO!g9>P4rj{*~{LWz(&V4W9z zP-9!s@{d5nRl0r_7wKB*_1wX^_pNVmK6oTuxxC$)sO|u!Zaq|Mf=F6NaNF^+ZXY38 zpD4IW-|*?p{lB+;56lbyGV$2)YkZGzNQPh)>xQa0f4-nIDwF<747HYbT)r;uX?U}g zX=2J|)00T!GC9)33-GoIPL0zC!k`g;g3iCD;WSTBBA1uvd$YIsHtaI9URMY52E~43 z41njFbwFl0;e&$J3-YLHoJUZ~m$kP)5X@^5eAjQmuzAD1ihr+9UhwWQj7U_Bvh9f! z8K8wr3No?DnVG7(x>L-$q7U>pjlcR`N#A{iRrAH0-DWSNgzUyDvIhN6r=Epai}&TJ z_h^>M)J_D}0BP_bZu6qWX7I{@wFQd9naoyZJv*DP|Jp0zn8pFDs0^RxEu8$SAkeSgyot+GSn@`g^}B073pR1a)`_3B zTgRHV``<5G6+Z`|;3le8>FR=A`6+qs1Ld$6jI;f$KB6Ci zE^>QFa?ic-SNti-trUZ9aBB9CA;@9h*RLJv_%urrMPq!qM*Li6!j!pgk#J#%xDEF> zaqr)#t*s5sh5gmO!)0hjo#)0_aT2r!G~BomS6vX3>cykeC-xnUj2zAQgHUy_X_Qks zzws8WJ{7ylPJT~jpo|4_zDO_12+3JNb%+Si2SoMAsLi4B30sJaizcDL03g!s&em86 z&m{729WNYP9yrnF!58=bj%@R^r7?e~5{;!^xadq8xx0wQmE1arECY_zhawE(kjY=o z{8*?it1B|V4M`zDT%@3A$b1)h&hq7)2efP#L-ppv(@PH~IDLvf&tka7!D+8igX}P) z)0()^?(}<3Rwexh-{)UQ!OHk7=`419yrHtv3oV(A*^^ItMZuwESZO3DA8C#AH~TcZ z)8j=S*Yb)~cj4Z1m>au*SVg9n4!cR5EF4+!V1djo*;dS)wC5{UtxEYpr4zlXVpa9t zdBp$z{ik4L0r15FeQ|3r{3ZocGnU70Pk1#e@3*de6QlAhi#bU-UUy!pD3`zL{l15c zX2s5vcTsg!adrm$B(grx%)LOh)FC1F6w9p=rn{aBjBPzisFD0DusIPI%ra^ep5 z+PAfcPDKb=G8JFwxPtXu;Ff;1=)RdfSA_?spqHPYUowY~wB%cZs&0evi~?a;&N+oQn+GmhqGr8T$ng{k6hCX5H;e1DQ;aCl`&=B8xp9lmQ)2JBvos~e4mjoL$55A4R@S6LPUR6vIMaY(R&&pXKr z3JW)7)*`Kt@d)o4VDbiemK)0q8gBnsl~jsBx%ELnj7~*5XrqxI7ZXXbMDJRKU9t6$ zB8MM|#l!tiQYs-yVKmrAL5BNJY<)dL!zPpt!w)*7*njNQlc6t3)BnzLZLQ2yg?f`2_1n+_Ob*r5~B? zh}M?`o01SSj9$@I(ljVBr&(@PyZP-=jI=ZJV?KwgJ2!72N?9l+SfsDt4}2o)2=TmR z-ajTsZL=%I+S46lyVLb^AJc8}c=maSv%TakYesI2;p#xD{g>@7v+gckZa5~O$|h;A z)E)_RDs(?E;sEic7|7lwCieE;qxysy;~^?PuUmQN8HI0l>UPv95#FWOoodsjO^0O` z6m~nQePe%Oa$?K;@9DY~@EgxSug@bk1^F`L@y5mgj&^wBCO5OPVoE5vzHQU5_Tm!* ztJ|c6Uub^_?>uKvUBI)ruwXTP;X3fT5${zB@hpNng!Wee=e+aGNMpiwilP0<9j^RW zYVKkd4^nbt`6Ri6zdb-<#8rDA_dj%|3rHV=Z7AT`fHIdP0xSK2;(=2mgUM(PZIT<^ z{{_VumqnS1a1cG@T)Cu&3fcUTsarRVdJ0T=QvKu*HKs~}0tTc+#($iC*-VOhoGTcC_f_1inTOk0*vI{ony8?l zm{<)=uro1lCKvzQ-gPAMu2`4#7 z|E7Bpm&c^k#v?()en)LYR4k#bo4B#PTTF~e;2H-Go=Z1#EtbRoIQU$e-$g>aQISSQ zMrQw+GOUh!^VRmVy;YWk_sq^v)ua~Zcc7=xI*0Dts!|78JQE`IalZ$?KJ{g_*hz{( zto((Zu#eaQ)&w%h9BKy=U9%+Qnx&9#VIb0inGWlK8QAV_|;g z!@N3_iDZB$01z%dKKD6oKdwU@{~gQEQLqycEu3>mUNEtgp!3`1;o)H?oq=wx`j_8R zdvdse#5&E#fC5|mUGL->XD4R$^rx<$IUTIRK$`sMOPKWc6EbHU`dY~|>&&9E^NQss zwNSo0Xtv-J#Jrt)fxFznmwbSa!6{2(#L%PE*j}~c^oZTErY!BeaOhx5ds+d_{Z%sZ zhltzZjKl~$l1@VSM(}peadYb#o($AS*G~o&;&>!X6&@2AKZJt_1Gk^QeoMb&$Kx_5 zR*#a)Wy{eKwpyn4_L`;T@82%|*sxoJE#c-!=Zp0P#vbnz-B}ls+$DrwxZdbpyY6pB zJnt>xgS+Z_M%$!NDgi z@_m2RwG|09d!q~SDBCZ233nOi4CYf86;tyLxxThXH86rmTX`znb)g46)KDOSEaI-e zWQGVAG8e#e?6SH;dOK<(Xa?+pt8oc)eSey%Ng#c+YJk#}ivAu5QFun|k`8z1 zf3-0)hlhug`w(lauMHxw6zCWDOMaoAgm+Ckls zO{02QODoxOMUQ^1Jy1pPaKVT-!<4lr-?c*g3;f$1Ce=JniEj$@eO6R(jZdjq{@GI? zh;q3#ZxuNF{Qf&k{jqLHqCetO^@^Nx$YF|6pO1iEu8ZE(xN5#ebUl)On%EpzMQ!!2 zSB;KN^o#TPKh^4S4j6!`5&INkc=feOwfA25=A(nKE&!j1H_C~%( zq)jfd;EIk$LZL)r_ZPs>drUP}Qu?@9w=Y8Xz+I z#c!(ZGu38Y;p>gAiz0j{G@AJ{k_$vU>R!*;ppL>-MfR}Z(WB@I1F+Voa35B>IMUTR zy}A-NsJzr_TA0>-?0MJxx%DUI{(MYg6t*&WZcW0v5t+{|q@`F>d{?tPDEsAh1uxe; zV`w+9Q#O*50=f*pw2_l!9s_1X^a5OV$fuPjn2=n^`GDX*rd;cH$rC|>T!`{~4E01X zI~INl?y(-4mydak-P3m8l&3K39Da~@3a9lMJ_aIQB!b&^B@UHQ<#kyK!JpAC8;n1~ zfsVQDmL`h9x%JSnL6n_{n;1T_#xK_>dhf392aZIVAvohAMrvg`&WBcruG&VmE$lhG^Dvv#PdCx|XgZ{-5 z=iMgmZr;f+lxw{G&mzBQ-LYQ*2xhh*No08Hq+BmQUaEA(kLv+Rs7Kw=1XVQSjWfIq zI+~+3d142CA3F8DVA>=-XW3)Dw>+6`iovt{vW|HRbZW0D+5ThroBb@pUiJZVRTZsn zKrI9>X*tlEoL3M2-MWe=Lo!ODf_PRAbDLJ*m;;VbTT6|k6UdK3LSKb=;kJ;xK1`xx zB2j3HbvP~PJ5F8x6R%ChZu$*1$%R5u^r3dot;3YHwltRU2XUPsY5=l~A$7XMvCZ%J znU~Gd?&%W2Vu&%i6y$kOMC9yfmn_s4mZzRPd7rUbGjNTKAu9)dvCp`Z1w}>4z#kQM zF?|zr^JF&e-j+nc=5Rax^-^kab(jOcQGlb20RgSpyKX~I+g14lKY9LW_&;t=n#}za`7VE%l{!3UN-0?3T~C17KMP=%-G44H131lh;WcyG`TaLRpTnu@=K10=NjM*k)iOnX4R0i-r8I`!!!VX1u z0jFK#f9+jV<8#F=D5YaBvB}WY&Yea$;R!X0T#}YmpbPp3K1sH#A1n&e{5XB5e>exe zfmWD8j-N=O5Hc-KA@%GvxGVq~CTr`yc~sr^Ww~?feg6?!_TrCRR#EU@qk@fL95}kg zoU%U2ZM(ym_hwE`ZZqH6e}m2hRY76kSzYjw{^a@Xc%On8Sw;v8An1N-BMMGJDp9tCRWCc&C_+@QS-cW7urh*Z`;naB)Ib{&-_94`ubY z)E*mW0byZb;!DG^5)#norw|ld%s4HK`L+$N7ylr#GHuLlI1LC7Di+<=HJMk#--dEZOd_{S7rvL09 zLyA{?DB{9MAb5B&=r44%62m!^-DTzF$C;Da4+G}iEI0ltneXAsdUH|98F?z$i-}F* zJ0=ALTea*4HI)GO4V=H$Vq$&IZ#6yY&(;31m!%#zk*Qr1CZnS*4PCFw9UL0?-%%Ee zUlel8!yQHYMa%ucB9+);!(D}90Mi=Hoy0`ssWNuUfyzKYZ1Y*K4Ha#rBC9vq7&x~$ zoQD_p4o*Prf~yxd?{4vUzV`%Lb!Ac8@5CZ^DH1C|CyERYN2WtNLmO72$BS4f3 z3JXWI(-eYj@82prjIM?z>&sv-6)J|J?%Oj9`Ez49(H52#gn?%c0?tz3Q%+s>;lq7s zMNAN8iR*&Qi$b{MwC?LNUMF`h+IAq7sUz`0U5e({o?7UrUOGF~J;!NNJy$*6Df-9H zr=Wxm>SL3~O~?F{}cYRJ9+$&1r#bGRE00bF&jkD8Elr1Rt$IPf*? z8hdAv(MYb^?{NgSNWABGf ze~A3564Uk1h8PCXfxNywcLgH-h|tE;Eda=Uw(qUSOC*X$Ac-&-MZg9?W{umustZ++ zr+?;VRatuInsDdMZ5}uHPc#Vec>b8KotYnt_m({G=qi3#^QV_7-ZfAWqRlWjHzx*1 zlFD`Kygr8t6=_lda(<~42?$tnS{E%br7lIWGZKsiA2bnePa zj_OMvVp*^027XnF@yt-%!ootc_mi|B--UM~MCFE~-PkED`|6K~cS&m|CZuao)0o;N zYo!jOuLi0AbF8a!jw?c0>%jkB9B6;vs3;~f5gD)BC!AAd9i00S=Xm z{RRZn*Nq=fdx#gFo*w^|Q2t@QuqHrLJ~7wR=3X_Wz}Wr8*7s}V?Gm;z<&h;a6D0Ael?n#$5IVm8^9)bSk#w3!utX4dpvt;<{k^?cs;3$xC^=JbN#HdNno0yCS{k_U~`= z&Xv6DBTOYm#LtI>j%ICn);WDnuxe_ryM6fT%VmTdRf5x5QwFcgU-Knllr4zsW@KWj zY8!+U7nth?Pxk@!XSTaf|H^MwDQhXd9XxV$J){jOaO{3v5boV)KcH05k3*^)i7Tdd zW|uB0VDdB~K9^Q*|E6vu1)FPHm~yZLFb>#&n7(u}at9|W;0(a%1PT#2p^V#_u1pRV z;Pg0Yl*Kxhss?sUQ8y0x_Ga|TbmOwY&|?)evwLA5N0Q;o0EgX*T~9+c)KK z-MkktE`~EIAZrGNaMMd2zsfHPOwKVPR%?fEd56zCdo{@(2vyyH(qZ+NI1#y_ve-Y! zr2#a(4S`B%wk{(&_G}j0pUblVFJ76|Y=a?==7qqDt35~VcN(1_M*6m^YrLbkR=j@A z9hJUQVP3YcDfwbisndQRL9qiG(}C3o4xxWSw{MQgChf0)S(CYP>jQX$PS6YPo^V)mz=Z)&v=Ujsf;C7N~AD_E&wNjz!lmfP1HXK`!zRJ(-4KXpvvvo zXYG)~+(%WaA=!AigQI2Z>lZ_Ju+1iLw{x`~3`$&|ct@8*Wep9hB!ed^oev5pgSjpP z;6gSKGj^!bBNi)52?Ho~wvs?nbPEy50^g2E&Rz-l>Rdd5d4=E5y46Mrr-=4B81#Z0 z^v85#L`&5)sy)k0jNsDwHbjL@Gn0$4E!{>3kq-a=)Np4L-VN@-G~TvNE~IxWx($woV1E*P&MLk9k}$|Ecj4}jFiZops6&4F}&yVgZRe# z!nr5vub&+kj7g8%<&YY|8up5bmX1LVgP2mA%+gyTrLMn>(1G86Xeb znffHChWH<@tRV>uiNwIs0N}uStmdv+V zY)wq0ibO(%Fag+`;{_0>$O$}W2(rW+u@5@&I^2JS z4-3HXBZNxX1=EurfOsEZ>L!wH>o?G*X3-e&nnKB3egm8fjpU%F!(m?KT96M{S z2ht8Qtl|7bYkkgN;p`bMrSwKXpE%o4#hSwT5_-fq9!JjdL_u)wdxBh}=!Dey;f<~R z1C!e$;y2)ixBpZn9d$b4X_J#n6VNKmPO8DnZ{Y#ta%rcPxIv(6~Q(Xytm~BxP9bO7!yR|=!?gkVox1peSNsj5XNuyc?7#iOak9qK z;Q%%0u_rb>1udw;D;-5_GRY@r2wXIc$8z&z=oRCCok_t8r5r{ppuBZt;f;c23!<_ zOv=B1C&-Ba#+}C5e8dl#{QI}Er>DpB0e!vh390@}AN_I8gI8i=nDRbTs0v<1I7uZx z-L~b?jiSo?=d2NRfg15WP@k*UulM7tkrznv2qPae(Y+@hlGIX!kv^)Lsh_T*-jXYS z*xl;1V#?vv6GD|$P_@+J6$kcgn5^+uF7TkRvH3Zz0tY7pa=}VG=DSr?R78et0Kx@z zBhRclZlmBbe)GUZ|5Gh@AHOv47sYhDBG&~v1W3Qa!{aju;RL}*Ol;V(+4z(1%mW!o zTbp)VpX2&Eem*i{5SYVxrLHv|&6TVj=`58q|>_j-bR{DCkHWpCvrySE^DhY^9z} zp0%6RrvLo;v+18BUM7UcCBnp$Cu_KxUuxoyEfE6?ojgGVA)xyT20L2RF3s*WBF%t! z5T7C3&4U;uV2Viw2lcYafuFck_lstOOZ)ZRbuatP{x$5~e&!e7)j&!6{tMD&#H z`|oH1KBI520z!bEmE>q(uTP+Pvv&$lbin}#Ij8>_wp}bAk~v!`!!5-_PQ3e<&_$C; zws6h9vk{$tc9jEVZu{vAO&TYs8jZL5DxJ8rRPDd{nJ`lDa2G|Guu@1OH99A_#!iFK z0fh6n?)2udh_T+m{4HO+ES{csx^H#}qw1bIvYrY6)1fh{ECjOqJL{&Ymc(0!Ij^@RybfYQ2W8AWc+tBHLhocSPdB{L6UcOufJm@dC=D4`H_?Hs5+xb_z zR8g+|r|v>l-99feXOon2csC@&6tCN*YZiay(x+aGkH_eLR;%W$ z1@xnl;IjaNY?edj)32WwxHR#~F*)uYr4mi?^j- z)_y2vxZyeF2kV|>CyX&~YbqC<;6kzMfQ0Zqe)0pzKOcgWpvFwoNkCT5FkN|a)@z5n zvy3~p(LpL!Q$d#MHElDrOg;~cpvAuHXgQq#~=>n_C+jO%n=D( zKT>*qBp3{Ebe@`+8hf(E&Wcs&@qB!JAL4sZ%K@?yM6Nw_ev22TjZ57xh)YQLNxMwl z2dwAudb!zRui_)jAPfpH?|Pf+?fqRkKeb@-x0!!F%yaZ0I0AEc)at-4>rtK)0jJp2 zQGT|qxh*Tl3>|)$ra!r0TX}O_!%sQJxBoVvNRXold8a4^j1qzoGQqyp+dE5ydMbBLiPeQ+1&> z9>))4jazcy)Q_7&p3P>t{u`&MCMQ$#&nId5fvu&MLv3)p!J3U3m}BUL z+oY(*5+6vuT|7KIrYIHAxyT=JR1FrxGDh0uaS92l6a4k$SOGV~<~pa@pHan=dz!ks zF6im&Q_Dq0M?ZiZzVhwJ4TvIxaQpoke~!J!O@75kl;**h1j z3q4Fso&unHqjLhUs`TwxfWJQjJYemuNGWH4JpVzft5l}+?h)p#^qyB=Y2E*lBl`U3 zaA_r;^o{mnmuV$NW}8eVD=V`>l!g_R3XaE$ajJdZ*!qTA@T*Qi|LdKe{}J5Pak6gj zvU79&XKu$gDt{8)u2KPP^M7v|I&tr~xHw8>ck!g5rwW$?$#wekTu9=O7f|Z`xD40t zgT6C?Uo@|U(WzBzH^-W4OK2E~N;?PDsKVJ8A(xq7Vf81}7@$9>_^#Z?KJDDf688?S z0DX!nkmbeT{XxTVXg;^dL7h>lXQ9CIJEsY#T|k356XM}JPMP43}*0FsN0=qB!PyEc3qMWpY{ zBKf>PulQEp2Vk+FPd_>Z?5!F|DXHLc+qUL@R9;ovqGo z2S?B8r?_H`8Qi<05NrSwjC<_d_k?Ur>7VbjJx9k-+?D)Oc$Siqg2;>nib6-e!xOLj zy}w=uN?t5rv7XuCc{TUw?k7rZR5?XHqL*}Cfug>yAH@kzB?qgI3h}+cyL`gt{^8S4 zn8f(u}GdnA$eZL{Wwlcd%shWyCS?8r9QVQ1Z3qNAK(&d2380 zr-s?YZV)v0QB6N2cf@>Crd8J<`-1zW;G=;2g%D*Ls>=O;dOCt}Jp)iq=BMCKfpi_s zWjS=jsK^A}9}xgDK@?IO>N>p26vhA7hh_u7j+x1x-z}LpMkznsXE(YAb%`I4=)h6z z@^3a{WxXobt;()0R!?YFhIL%0%t!qSDY=&2EcEmtjBegL@W_QQTS*q}(Kjvb)tbh} zU=#}ixB~3-&kF5lUymx7WV*m2ErhELM|H?q&26n~ejgBcSbsTPyt90*jWB10QFqeG zPq!p%2ZHe$kE8y@>>p787F-Z$gErL8vp$E$A-I29EqE{C@=P@aZd%P&wAN#ef zop0>S^f11A2vvPt>lquA4c%7yrF5Y*BVmxxn&jFs3ojTLa0mzpm|u*K{vNsC^4xx23h7-3#eqKjM$RfpCYf6m z^W#e5ES;oN*~|sB8a>QfPh7Q4W!7B#Y4Z$VWQnG!g{Jf=j;oD240Y%X&^f+GJ_qhs ztIbC;zg$w!zwY&mlU`&D%2gzTq#3bgYHx-OAp!ph+_EQ9I`b~?raY3R;h1XPYUcv- zmJbu8DUfkC#%TB{7$esET5lya1rSb(_HGxqO;Te@Yfrc2DW)%z!G1xUC+Cs2g5RoU zkQ1C`YHE5HOf|}Mb0FwMvV{X*0NgF1yhzGm;`E!}UwkbBM9*ZHNFJUM;LS>40v$Q%+6sL3BC@uy5;lUchey;aEbLrx{eBg9(z>81S@V@S&-j)3q%@`d zY`x#P!6IW;8$5P#DXD3w3s)Z}!(%`YRkT!7b@^{uZ}ssptw30=^m zQ|4hY0ON8hdnMH0AjAB7_C>;b0U#dH8O)%Ti;!ohkTgzgM^{I6VD46(VTmgJZ;Uup zo`IEL?}^Ycp0~UYxMp%}S`QQNTVCE#z!sv|gP2q|gm1C2WTJbk>n2`vn?2v6sCLa# z@3{?B8}mEv5HU+|duU)-*iOg-e&XZ4XtuUv9l|ZB6LSkfq zDw_cn1hD1<$yhO?HcVx{R)OysK8A!$UpVz5yn_W7=Emz+PBeTKwk+wlP47wgf2exz zc&z(2e)uFwT0#g}S(Rk3M4@roB1$5oA}N$YR;8qjtb~wNA*;*~NmR%tDnufbP4@5o zx$fWdJg?`U`?|0DR?hSL{fy&yucJ~UK_BUp>_q=pwz8Z)S!$GOL{%yfbaRB_)t8BA zsbIJmY+3zp;nkl<>=cwW09>&otr4_@Z-J(D^4;rzfPmbUnW-roe5{=OUH{4IT?V+? zQnsLP6*`)7_Je_tz}Pm|&quP^a0ukN4)*=ct|(?W7NKNxa>zd^J@5@TMhRi{M!yz zWY1x5AGWo9KBG{q!EC`Pf3X%-0O5rYdlZ(?Z;Lst^ne*)jJ^d0zb#|1?hOg=4`z&- zF4_%+_&++W+hOw6$1V)GSps zhuNP8H9}QI1uZC_I{N07BF|x^!}C)HPQ=!I~<~bY8_>tpC;m z!lR1gf5w$iU{bpOCM&UHa5o+*wy^d@ko>7U@ps21v zq1ttMQ4u{U{b{sa7_B1KI2EgSnI4}T9=&(aV_G{%zdm63ZC>&J6~^DHAkzh~FO>hT z$sX`Z{*~Ka^JQU}uwzb$>I(>$sOShVIq04}nQsx$T~t)0NHpGP9C1m$-+w-A4H|nI znINrEAaa=!IX>JG20K}=WS(TaYw?KQU$D-qfuWq4N*h8`EsFzH9UYaavUl9ni71c@ zRbRiJM8(Fi|FMFTn&H3RdrT~UWIndW#p;cHL8*g+GxMrX zb82Z8Az52|Y+Ig(U^=On4>tFGoYeL#K`I!kZ70mQfhp^u%;urBa#rrUr4#;n(~7*h zaImu5FH5lQu@lqQtvldqdqSn0vEB{>IH7$`=*|Et3ajdffkdmf+O$lsl#ByjWte8L z!NgC?1UN-!%H}rKTp|chS|;R7Z$=vF_}{&tQ)upf)0Gpjc@fB@mCm?1wan(GL3|&2 zoV+szYXiJ@*a_Txc9!MfA&2%Z>9flsAEO1MVPjjnAJTCBg5D`we&No0hbM>Ep>?|_ zGdZ%$fhTnIpgY+jj{tNL91tz&Sy0rhYUlvu#$n9u}T#k${(aHcZ+vi{2TWl+AIm29JAz}_x%tB;8j~k zLbaQAOsW+7=_Q;#bH@L~%;2MbgB<>M@80E^A4K2Z6l44`*!to{U7#zF3HD=8AU-7= zx3BPWX;W>q{08G3^Zrkd&YvA|ICtZAl%(aJzYd5F zMVYfI?F|+&p9m)D+s{U6A6-5`bLnFF`+onlJ>rQf)s|l~?cZe}UXC3#80FA0$ukB= zJa69JI6c-K#v5vzs9f2eaq`*8ki#r~@|Qlin57+4|BptS+N~!*-TdL1nZJerRhU(p-@Z@ORd zIavbz6M^p0s*~9)xa5eg069)9`#cW(Hrwj@NBMT@=549*-Qo88>OPFxye*c`a&mIA z#0BQB)ZP98IgEJJ*5y7l6arkK;T@{9j!gDIh8J4VH8_MRC@Dw#iV@+3i}C{MR->YdrU zg*#?re7uPNXVEu{+)2l;_O4A5)?WSO1i$r5h0d3{{hUdohTVLS5mn<#fbi~2=#VxQ z-eoox78Y0%DgbOI?UG_^7CaHekf_C?BYGct_zxR)_zSZA2i~tH3T056&WNE<*FuT~ zw%vQgN09LdFHKq3@{`$OY7B%;0^#tZh7l2XXKk0+@czrptVYgvpZ{G%SOk+_G1q9gMzmuJP`IWPCw z?p1-~*LugilqC6*L;<2`hv;nhSb?AuCMqz&9RbTeC$WQAya7IOW(=HZi`yZ2 zF}1#~W(5+YY}%)_G#Lll&AYaqt=S2|~g^D-OLq#T^faq@)${1E&a zrV=`O4ip>l!0fv&Q}ylHn?|mpx0__@H{4#=fAC;!VJ`)UAY22LqFiJN7T}PDA1SH_2J>1?numc5A+VoeeZwm@?9rwmAtrIe|KLMidc;5Lf zKmvaPF!rf3bVNN(z53#0f<9@oAm|J5_g@R7*EvieVr-&ci*P$omZMR`R_pCpQ&(!X zrMLRsxl1&6KUf_8I#6~;3+obNWIy1fw)V}WGLk?*DTF)YIdmZQtYjXa5B`}uQ7N*K zrAtxXD$K?Nj0)Mo_D zr#_VwBJm9*Gz8VkjX?>Hb)~XD7?wtPQmhZ_RP>7mUxFz%P)$%oUff?W4vr=3bLafx z<9QKxf9IjKBZ*f5E(UEiU@%`GtDL5xf>ETJZ^%5g7gq*GV41(13xeK?kV*gn-er|7 zf5H!*uIDR!y>Y~Of4B7M<-Rhcwmag%iS!-w7FqW4O4d84m&_T*eNyjlbZo8*yu{XI zcC3AyHrFLx0cxsQnO7`;LxSH!4xDJMohHCxA-}I#d6jMJbGfgx+azD;`**>c4AZE! zWrBbF92~6XC9VfhU9ntC%%*&4W&iuPe=zKb(#V#QCGMLj<^$)025uTiIyA#XDlxyV ze!TJ*&JET*=G@!2Cke)=C#u4?c@PL1H2So4A{nh~cbxXT%vG@I#WRgV+XY@<5aPH@ zL6uegrMyWVtw=v!6y{y+?#fw)xz*rVJDm!TxvziD=4ND~Q!SDrM1osmZ76 zAIEeQeV6hlzg6C+?b3dlt7_$+%s-ouhEA{R!d#$4d<=3b;s65*`scU!MAnN$?`d?6 zI`?xsd+nMhY>ZdKziSUa4TP-q7rYsgk6DhgGy!-pPhJBlD5I!(i2_vhY8l3_5cj8E z6Cx;0yK2=|6%U0cK%UJ4il6u=xFF^Nj8-*}y`E)$2sl>DSVW6foud5LJLypJuU<70 z58p}&{=PEUa`64u>9H{|-`b;{ptl8gemsr(`U(rfzP&YFdpU#ig)@|@2HA0nAs!!N zbBtaxdTyU{B5g(0sXS91(6tb$-II$lPqaL{N;S*RwC{Ord$|4gz~{%x?;zYNzmBWU z@76j4Kl`9G5to}pt7{injB^5O=KqL8{?sX%D@y&jH)}dlX?*{2_ zI}H!ihR-V+STqPOMeEo3jzn=A7~R`vcd9UJlckD0yy{aU9n#b*DQs`1guS(tc+y@a z8Zo@wWkH5NS5+VZ|JP+o?~gO*s#K) zqDQI@geAK|m$4Gq{O7VeS9^Dw!Okr*7rrSRDg(m&62pHHvY}&RlWd-=Ii-hjJHVX5 zZZskxpO~2noz6#SI?iqJ>QH}Ld&23`DwgxMR@dme90#Ufzx6HkqEzxMNbev64bTje zI868ZYsIL_fNZcoDSUc%->1Ws#2!`a$&63JHpgLaM)D+H0);2D7|>Nsi7cu@B1OoO(j>@92Uy$qh}{Ddl_S}W_Y9b<|P`ZcNAR~xnDhVa2uOv>E0Ca zjr-sDXrUWi?@5vck%gO2G3v+}}Xk93!o3;YuLRZ`YQZO+fGCE4dQwe&H(}>d)N0 zca`JR-!%eDNxTz)?|_1?It^))dvnxL2r_=cy{dEuLn=_3aU2N|6h|NtvOZavn#+s5 zA}6uTC;L+#zgf1&bR-u;tNyKM^O7iJXvQO&K&&dcjZAw_BeoTsI=yQtgX#Cs*@6DY*#i=`v+9vmVJx*8NH&*?Vst|088LsV9_L;j2sZ9>p3|=qxW_s!ta? zmF7QPTzEtA>HC-ijclemyFc0V1~I>{mV&?aYa_~(UVEd&knAuQ?JFHJmuvpttjAo8cNs}Bo*Pq0DO2hd13}L(TG?O z+2xKsZ;B~OvD>ySHC1`_u?uh{je!36dU=64B3 zI{{oXgIuk^_%Q6Pqc8xVz6~v8Ig#Rbb!GojN8!($9xn^SXto?m9%ET^49B+|yMVf+ zwny7>&F~$1jgpxrUVfI8RXl$=ML0b_&f z64XE^Rjq{RpCSFuti&}0ozDc6?m*MS|J~8MO`9d=pz!16>J&qoZ>C#cB@`*Bl14Ye9@3#=3ssSyK4OW;?FuRCMYf1j7auHt#q%T2%ac#>Rd0))h5ATwYdWU5j?t^vZH>U zjLzq%dLaU@x%AW+mgf$Kxn_eAaBmlr6a&3Rbd$)0j|OFRo+V6(&EW8dV&09<78k}J ze{8!IlpbTg5bY3`2hc<`8q-4Zy5J8}Wq%T@PFK!nupBkuH1T+T zbPq3UD<|Asv*zQ1#7wf;=Cskv0q|B^0SBjOXIdU&8<5lg`OI}XqU!r4lE#q{If?5m zao5CRw`E_B2(&C!@87RRjr83y;z*Oy#E?M95y8|4kgtJ#6>tb>`Kg8x-XPyrJuzHp zV=Y$P;>)Rdtx3>WO9RCR_#W*RCqrpd^}pU5N-|`t>+APzsOTOD(v8K$4zEffLv%F< zQF6M@PwgP-npi}nekC><*Sm&0BM4J~+l^%NKtf2=4~|Yw(1iO|Q^Ey#4DRGnzkcrZ zIxuMdxL1x0L!_~UUqV7tfIzW6?haV zU$Mh!RBvd+M=pF9pB|2azgwx^VZ7MF8seZX796-8zEKo&0!}rA- z3xfz1HHtr|lZ%c(YK(S91X*T8_bRR7J#Qt*p2^d^tERm@k_w1g&r1sDJS$F|f9do2ke^Fu|J8tQmqnZyWPhSD)I4kSvN%IX zxQ^}Snb!&ngp$Lt5)7#%{wU!1wGHVH z>3hoG-jbZJdn9>_6el=ih7X=|?$Oc*M}-uotSe|+6!v|k8_QvIB7G5IpE zrXl=mBV&N}lliQM723Jj7{|m{nC@67A#aRmm(P#mbQlW%W={Xov7LDS1^OeU1lKqS z!{2p%3avbh78E{5T^>b^uwGpymo3^BOdOmC=(SewTd0o9eSv&PZe>@Aj#$cY^RrE8 zWr-BF`%kJOVhs?ScgQt4`q$po^4*7|I&8LC2g)bz*XbT|vy#2K!mg^SI@F$CO{B+t zPkQtZYmG#I_Pv=?Efr*iQVuN;G7RiA!|(o<-R-|kOG^vXh&qm@#JslcWt`JPlv%-LYS>If7@Zu z63W|$jZxyczy{ME+XlP)CsogRT{^{F;PqL- z-M+*)X3MK8(Q`tpb}gyEB&CS#YK%^<`1tYn*KKe1ry9M)j7wr3xL(Gz^To#g*~^w! zkeds%@ z1kSAga*QBpJoRXH#mP0^m9_zXKWJY`B+`#eK|7xR-Y7r(R{ZLBDA8Qj8XA@DdygDl z4GNl!EWxpg#xCpy^L;Ys8Fop)FsGx^dxW;yZd0MT6msIL@SEzsUUdMsa2)!3{L`kO zmjK(p8URVGbL6k@*)j%WpDf-7CY^K{g5%oUL5oD;prx*t0kR2o}EVuF4C(y zFb5_vNELdFI~%uYg5^CUrnrxcMTYDG)c4b)LV-C+#tG}gjg>3=EF~z%IP?5}bP$XN z{l-+LN$BDZ(_B#`JdvP7kLATE)V^f=t^M!{mj%1k>`R0LWCvMZG`dxhqj$V~%Y5v! z)5FxqBOyUWE_D*pHyfUrxR$==y&XNOFx6|?P&>X8B5aOpJcS-(zX%XGnw^ghgU0ei4pM2LZX_X)N4&N&t zRt2UXLu@Q^+}pIj%-(=cY2)bReI`_|C2n~<1Kx|{e#@0q!H-P;y-PA+iyt&3*^nSV zIZcBE{Wq&g*fj}K0Gb{_^|5}};5t0et&(P8cCLx{cPL&SIHUKw%#A;BpG5Cpt?iwU!n08HUtj>1<`Zp4yW_=M=Aw?h{(2ceyWvGezxfZ@2sK6jBOsL-C4; zh@juIV(1992|}q&m@b?ifJK{NOW(-b=BiuOufuiHE!^^N%1mwpzbi-coNa9Y)7H_il7p%WM9(h_Ln}ifwPH`}ON0L;pg3SzJ!tzn9AU zzK%=Yb&j8Do%Qn$sk0v6ab-(kaGGh}e12n7gYxy604&Q_`2C|p1A~JfaC@FW@&z&v zxZRi!_@8-uLDBVLuy=uv+nnVr#nof|=COzGb_w?$72^W?@^eIJPi>&(wStjwo@=bm z-q&My`!@Wl80;=93us?nMV2ExjV6;7{Ok%p=@V#2n<=J#K>*S1^-QROcFg~OIk3

)EyNoqT7ADwfKFROyWIR ziG~sX)NWCPV|ov04uZq6xO~g4gtp)y47s;sVq$dXn!1(N?Ki4B$DULVFn2W{>dge+ z5ci)TaRpAUY^eAkcZ=eCV#Z3K+Oa@mjf=S|NZ{^jRR;gXqh0K7Z4Pzq@)S$SdEX1Y3E|NT(+Y;Vp6-jdv2nb zZ94K%d+3^hnR}aFY2G`LSLd6$nU-nhs+<+%7eHl2I+dXWHOeqOMoC29(>W_D$&DRZ zQCq7`>BYNIa*?hMX7aH$E7!Q&K#5htFS*CQN1T!aMTw`TE|WpMyrT0@Cj61LoPGHD zMD#bb4a*%d+dtVD-;2M`ao_nwc&D@Bc8#)$vlZ99PVuX#2G4Rsh_=~BLSCL7EsM?r zU4JGbwCwCOoxNUq?Jg6G!|gAsY77Z;8%>_;AD~!az%0E{OyU0oy*wq%x5#gYvM3NW z0-z!i0(IwM_|PEkZKThTIKy@9;v8gC<`fj1gR1}IC-u{RTD(S-9a&j~UJRSkh4HL; zE4OZJTNkyPjLlBPS5KQ3Y+VC9|14^CMDgo9D>+d7hVs~Rr21Lp>*@gb1#jl$NW$*j z1Fe~RbJ`}J(&>Sv%&6y!-PVuAcWsRhK4^I%R4`{Zj4|41>!B8Yh8kMRNS%2zD{JNN zX3qNf3-6Px4LVuM>#8r&h#pPx3h**0^M{odh+yWLl+f^dFd;x*N-*S<^fOO?_M}YJj1ZZC{Gl`P|vE?q*b;?sqsViNy=rGvsmTS~#=Rf+6`Y ze06-hQFwI89CnUMQ0N?cuZlsrP;uLHOV_RxS7P-_O0y z8!xXZzAzrQ9WwxcHQ*@)j|Opx`BwpTLTA4!+Sdg!i3;^AVXgbxe77MeXFbtt==xKWynk0czVp8Q!kV@|aj?by@j@v}vwf6hqHpP%jRr3q zX*TjGJP>V0(7E1qx+Q$cepK`RQkjC5FyR`&>IA(}a#-y!5a!3F;~YNpI??Y33y=v% zA#P&m^i`6VnSkjMwT%xh{z>2hbb)ZWeImCfkXDF8@X_uA+a9Z4bgPY*-7w02=~3CF zzzH)YpQ1n4g1eD;N)l}F^UTS5%sK$4D92wq%hs{QCbrw{GE$@A<*7KQ^KB4JU??o? zma~^4_#!Ep)sd(?ce>T&}QdxYR)#Ap3+Dg=Tw)Uwo>7D}ny zBfG9@kO-W}gacxF@T6i|!^Lk*QIo8!zqvLx@}$PO^yr3uE`o@hh5>crIBG}1*j>9Z zgHTxau|mQIb*ahnZ6TLiR3sC^etjq^&2tM_Ai>Y8`7lOK1G+C7Bdw!SaQh`fH%ZHc zYsw1O=X}iK$F)v<1&N7Qo(@_MAWezwtGN4$qboy%rV!*V8d>J0KVK_HjdkmDLomhc zBRcY&wYSwJ_BHZVFg9-w1uC5cWcT|*yaSOGbkE4n0%jHZ2w&1NUc8jzYnbj&1pK|9 z{z<86=WglZ(aQS+RZ7-eCcF6K=lpi-Z|AxldBgtu?XE^LoCxbr=+3oRc>2)h$v#MH z(Fz~9E9jB{+j~R8D$oHWFds{g!!-0xbzF9$lC->=GeT4La_wpxRSXKDik)x_Ba@10 z$XKh=+DKD~Xj=~tPcyg$pW0oWy z&~j#pA*rNvC?eSd{-b&<)l_8U!#03qtWW@*zaNJlk#a89_ef(uC;vJ5l3SgB=9Zd= z(!J-{y`qbQ5e_ZvY76HDN8>= zpKiRn)NauLB|7d2B+X2qS;hSJD8WghJo%p%_1?93bV08W@VwP($7Vc>l=Dl7n&}#& z^n|}wpnMXk&ie!2DF~x=&`9?qB5VHPjt~xRySb3TZ2*alc5VU2*RrD?65&f-CH{GO zNH@hTr{oRKgN#{#GJk*<4xM7`-r@E!Ow0PIF<-|t` z%0sb}2Y{o5X@89b5q=rc-2I%cEVrKP6s~Z(rpt`_2S(kTJ+L#=bV^PY2lr_OLA zKHkDg^r6QZ$a;|;SS4zb-pZ}~^yB5GY~wBe>Z@9z;>*d+CB~v1pLdWMaD+DFqgHIK zQ*w>`rS+Kr&!BU(+GW}MruP!cYn#%Q(>>)k{4;m#ZXS;mr_iaszPs~FaP!W<8}iN7 z>&8|Br2xet$#`u!-rz;1SZ05I>IoAkYFckuagEwtjxz?ej}=+)Gk+{l1x)ixw(|Kt zL01aFuzHoC=4zaXeuz||&9-{ah~g~7=JL`tC$99!`Y@L4maXDh!hG5dmSt;q%HnqX zuRDm!UvY-I2h|>lB!fq#{cA~T1PnX0j`LG?H*Y3lsM_()UQ@NO2S3ZphOMU7VH65z zf0;{NW~y;^R1)AqWIh0js4X1rYscwni590Z{+x3Ka_ykiJ|Fht;CQ1wZ>0HomA=;- zuE_g?x>mS4!T}601(l|I^G>QKE;DlLk+uux`8^byZDD4--|pAerrq>zdS!3VsJL^E ziQ{vU_tU<7+lo!WON(=t%}$-NL(w-;v*E!fGLsd0kVU9Xl={uh%}bV8ee-r0IdEUr z0V^S4UglK?gXC1Qj1!tpMy$`ai{(OWxW12HRg;f;F|ai2ly!Rr7Jqr*r}Q#i$)S}= zI;CkgA5G|dqqEtsjWN$L7@Ar!&u{Mf){xI7W6N~t&>?I+U*LBhXEgi;rwIvD+BZ0O zHzdSh{iW~NL+{6i0(*&1y}n*=VHO|Q^N5ZtdSf7SYsyi&{7l@t`Z8=tow<#!4>xc~ z_@K%W?l8;QeK9iDmD%ADuj-077T?82N&vEjt4oFaNt8P_`IkZ@E{XMZ)E;z}Z=coBwVE zCgU1_7#l}gv7Ak);BPc?z}@(K@8^rE(JFYO^rXDwzY3j)fy3`+yu=^%r)Q?R zdT4(YCPstvDQiW9OI?NRHlWWP+y;CBrbDj2x1W%(ja0(p3y-3rEbZ;nCq?E|$Rsi- z*YV~8$2+u+ZbT_B1SbaMJhsvdB3qnxUyOgV$#;0A+@imysXMyD`TL`Z)V0ORx}*d_ zt3AD(oejVrBj2<3Ws1y6;y5N)J1$@7HjSQTdc~Mi%-rXruI(vt84?o{Bd$@V*r>fJ z#5)MBz9vqz6WON^BnHgYZ3xRcZD&Wdu@MA(5^i3idRH^0scY3R%nQ3`C%mc?q|GUX znww7f$34f`BQ$N#Aoc8&LV0Pl;(sabQTXQ{`{Re)C}VOTtDA+>2aVF1C`pljto4%; zpQ|ymG48f_X7YmO9ESQd3oW|{|)ils&qvZ7kQIJm@j~U#*CBlJ{r=;k4))7Lysnm z0g#lQ^PZPq*a~j5suY@!FkUR>AKaE)zou;D>^WCiVZHd(wiSnrUL2RC=DojjG&LFM zE~zd@FF!LTlh@K`&p+&K6^(7>=I?3vl_EI=%9ybny9}WmmygzH8=+!)i|9?tafo_* zFNhxU?VbE}>cugON#=W2s4@sT0m%{Wu<<_kCJ7uXz`-}e#(^S`Vym3~O#Ewkh#x=2 zd-*V^*MAi&*8L&QLE9PChkkXMSTvSd5c}I1y3%tTP=m` zT~tYyWn3+$bR{@`*MPv!_kZXD_d(oDqH3^pt$f!#5ZqvpGl315I_Zg_==~KLhbc0) zi($IF@GGEW)Pc`u4u-kqO5x3F3^)b6Q=3C7}IP_l5Os zm-gK77ix)P@T_;17Ts62II)fb>vIB}TGULPL<`(MF8gv=899~grJQ)bl*u1jK)Yv% z;B$0RP$Z|nv00Wt9L&^E%DC=dC~APH9r<^9Gr!}xO&3NPFFQ{*ztt>^(mh=`F1K^X z=xI&5F^4_;6bM8eJP3rLbt#;e?-LW5R}AblFRpd9YW%OFvhpuS-fk{iuN2pcCuRj7 z+>W;Gr$U`EmuoEo7C}52LLVu(&*_+wpL#C)W3{&ps`(T37KW0tM|-X=u}q)(w0Y{E zM}Sw(`^_saYta@Gr$+R@=L7_JIm_3`L=dD{-uFLlt=UWqUL-Wn>T>LBP`FHxb760z zLu-y{OGdb)t=<`p_gj_?66Ms+Z~64Zu&cm5j^m^8>`2Eu+@TVPvPT#1&(=w04ufq{ zA7jO!uiT&Pc`>_=G0kyIF}+zFMH&53(GZS}IO#Y7fc5|Q^G63Y8V38kegFP_L+H_c zQ0*oGm!#Cj$k)SqHU0xCH6qMFF$)|lwY><^I;W*M5!0P|&b1dfz6Wfw^o`al;#6C? zukXOYyGUyXGX|g$;1hmmqKA%Iv*JZO!6}#ex6so0G|CX78t?|``>e#E`5}e-&6E%9 z;;~93lv(mYXn+;Ohkb}hB?coDjUpEw3`Cwjyy;QQrhJ#1NW&N4xUFw!I(PR*Rq?;- zE1d0h?l1RzrPn+s zr$LSe0FFex)KHltNHW1K#fYiVJrEHBl?(>`SzTBqyd`5H_?>5c*_RU>P7`*byE$6~ zN2s|W^7#tAIT1@xr;ss_&^1&AZA)kWV;6z)76r>{4U6_fg>1vHk#tLbtq zsA2IK21+`EGsdXshj2zT!zZe-wpAZ{A-&kB!M&uI3{kjMA=!x=Va@-98wbE*c)OZY zzbPmxIsvf;)B8Ro>2Ol1EAO+~l1ziITH z?y+MkTq*C=HtR}u-^$LEq^sh2^Fs^6-|{5;amR)yODY-e0(tp(U;6l%zm)IKtGN|- zPXASzD=RR`)a-O_sN7cu0~;TUg65Puthi9fD?_Gth~X{T`RB$NoG|OP)hxDh<@fa5 zxOF^g>yKrL@T)rKndhd=9y?W9?umkc9|tfFMi&kwd7OhdJ1e?cCxQ z6ifHSGEnn0YiSe*Gjj#D9wj%3HU+$UU zRluBiMLcc5r?>gdHX5u-3q2CL=D$D{Nn9BJMFimmrgh}#Ie-OgKpG?}eJXY+86OTQ zH{P)K?C~78HjfN$pPu0COB{K+i`t6)t8V&kl@{nUQ1y^|)*>XcweZ+ZGKK|5Hs}qc zRqdnS+dJ^<7rkwenMezRxPQ#^?eQ=PD<#kbyx2CEs?A2Zdhs|=o8-80NGPhOv8p}21Yp>>tSk&Jw9Njs% zhez%UE!*#&2=*6g>v-QdlxzjVI5RVY=ozW^9CcwV=#^}09tM)2JCR`Fd@FEb0lTLj z_H}V?`Z)IOm`hMMa))^N>40(~=t+#eS)6(jN`&kS9a6}Zyop(4Bz! z)ywZ%j^FqitN%LhdEG#9b>DaIAB}#*Wr-ue3ARW$R>E{IaFUT3zzXkRXAi#^-gD}8 z<>8gnBXtQ!OXFSUkpc;uhz2^Q9Vhc&yb%)FfwO=dRurOXv9RbCj2*3U2|1doJ+a8a zyusi{54;;=_4*rGHC?^gRrX0|OZiu3|0jc_hZILLmyXI!wh@rLm≷00)yNPNU9V zt2xCQSy0!erIPdTy4ylUMBbRmiNX@b)i=NXK9#yfE`Cdzu*PX^(5#|Sbr?tQp6$7C z6>~rSVMBw28VoM^!z=KqJSMtCKa}Nv`mAWwcEtV}`v0_XuZwPZ>i+wgAvy7;aIv)rAkh~HLQ%D)V31Dtl1j4@m}3GU zkpzfm%FV-JbccPCGFD#~$!%BkD!!H_T$PJfTape|p?+XxNa=Zil{xJ4w{t^uwnGhD zKsckE**ePw-;G8`EBAQcLaPN(A`$F#Q%^)Cl1Fd{v122o8hV`$7N%1#Eve#QZ`$yk zX-ixJ?yA(L4r{pHi1P_gf*h)XF^3rrK#NQgih%f0<$?u;v7AyIe^mJ1x%1L<#o$Ax zqUXC?@9u074&mS+{8p2w8Ut!QerrWxX|JVe6J#;oOG?@faQqkgGcCuN_C3}|ygp73 z#9N0)990%*&x}7kdYWMlfw50&yzXuM_W7k(V4hR;p|(AhPY&EdxwspL)ufJkuWjq*AU%#|c z{b<-EOQXZA(FFxmXM-Stq*)Q^V}tR?olHjnrIRZWH>1ehH=UDtmfwetiLz!-SuqrS z)=ha*ark66sYTX4PyFY+0pSCmNm5^}T~JGTf@d+sR)6O@g`Z6i4{K;3Wr}A%i?_V2 z71|+i0HP3DqsP~I>9)KyYq61Af!INyAl3=3+wSkLme3&Vine?o>%Wy(A8uu3B?yML z1QC;}T{yNj8E#3xo?|}%%Y^>q69~I;oe`T?XoT+17Fjr`I0$y2Ds$Cn{l}G~QpKe+ z-T8Eq?_7n7YlVBp=HwoAs4aCgEU^AeW7MeLwkzU$92TYht5q1T5=0DAN`7y?U~(1( zArng%>$Rwh{*29I-3leYPTX%OEUe$-THk;dDA$)|EgMJ?VOo!Rp2N5#-51uAvK9t_5SrX_GCb;ByY9w_78HWR|V-D zHhgh!7nlj6Upzm3vd7SV>(BIcA^h2;(k0$Zdo}>r*KAnOy^mE~759AT)uz7%-K%;! zUj*v50tVax-xGirqM?|7up`7H3|Cq2-@m$$pb&@>Ii=c7b4pkKerh`CO(U^j!xS5* zch0H#LZ^-4D*OK6Jc|}i4Tc*Si-M-4jl)XNzY0%e4w1%icO~e~VJ{SVXc_)8Elbdi z1-b^g8uT`sP^XmIwaVkHCJG$t!?6*Zu;kSA!5a!8BBrRr%<`xUV3sBl-ni(M6{E1( z9SmVzEuk_2$nWFx^75i(!hhU(7;1$Ygq_f9KF8m96ye1x!bQUGweUwCJ@_tokssSk z)+#$5{>h!Ew;(@UzRkfcvis>h6BcKZmNGfeW^&i3z$r);De*Ld>7&|^aINMeP9AkF zYAdm@QYu{iD_PWu2p7IMo>VVZ#!IWM~J4m?E8K z+cxmG$+j-CnY1vgZQ1(l4(dY#WLQFXNxaeX?b_>+mk9Ftv2H#d2Um5O1 zGi~*Ui;3yUCVysX35E-ACev0mQ;t#ufTLNV38$)zen?ognomrJiM{F}yMTbvN%nTr z?e_rCt=kVVrXkunp(4b{L6SkoN9t3444Ly z0Lugq&0T1Z{Cj$OG`5;dED>H9H|8NadOC)jC%$JlxQP7D@|#!dR2J;Mk9~MlaKb85 z0rs-}6anw$MFAS+lwKR_&EkYXuot@u|LlImiP9Tj+6FZ zHbhw*Wf+xqnlVW=B0@^j(sxyQ&D-kt!#YONP+_B6wmGMu?SOx81S=znS4yTa#=iEs zE^@ml=U1`Q(x;T;3+<_fhbf7;j@)DOdv)ShKteQk7{#p>q(8H60&Hu2=3A)b{_&d(to;VfI5K z@}sARj{?cjM)ewME8%omcN!g8;G<_i1DAvB1&||CB0swh@c;U?Qs&gIdsp4smtoz# zS8hj++=b;b&-n7Ki|<@YuAJq$8{eKJxFzYR|I>pRc%B>KJ_!TTWV`Q-MTu*|xf?mn zFuBm&MI=^bP0|SA_d(qxwhi_RII7W)7pF(fT(dk`l=oqL_%DaK{rC@5BZ(-%{v+^v zD?jB#cMq^0=I^T77Y8htq5;M%Wwt>cvoe@aEz*+U+WVRM2k(iWk?sDzxm0OzipY(} zFp=!lQU9L{3>!DHkt`j=qEHgivrwhIs;hwYrHjr!;&kZiHl~Y@mB{dulGBcyCM0 z#-|T+uFfIn5(k(y^yYA+N;tfA{%i9*wfQWv5Ktg#x-W(PynmFsu6-wEo&{gcOIq0_WNbvmz<;6J7E1^p;f78f~^7uRRZb{I#Sgw2TDZs@ap9 z@gU4#1EY5V8}!@wQ-|}uYp+ZU=b(3j`A9gbBYqcs{ELr@zIA4}Jm*oQivOdEqwO$WdR zawHCg*0MxM)O~2$`1My97Qa>Zts}-uDqH^k32x^AODhNuD>{czFwlbjpK~>gv={Mx zhQ7T+k5E5Zz$+&f(alD$hw(Ba7b_Vdnk{PL7G5<=w|LXawt(dz464dPV6@Ltj zlmC3=O)!*Is54b#Z3Lj1JqLRL`HZN74FNPRt)1{>NFRdlJ-R(&UOnFML8;o~Q%KGs zLGh4xRw8i|k$XoAP2U~=>J_!)qy_x<#N$G=W-8ZAtLp26A?RVp!0p(Hsz2`5FMLnd ztBfHR@%TazuPP65U2!OXokHNqy0KH#v(C>7Y@UAX_VD_nz7U(hQ2zRg`h`#Ot4UqvI7pHAs(oY8(wEI zL1l%BFpx2HPVB8-{&CEw{9EPSwAS?DsgB}nd%(TI6LB!h6r(G9Mn-BOsrV2k5}bbl z$+X0NZF;IcFF2eR#xIoYV3T^gbXV2)4|$CFX4LAO#K0(U5T0;7Ad0VMSRzlp_a9(s%4jEJfVi0 z>4wmW^d3^{#QB6BKQ&dXA8DnLQX4)k{E-s}9;4^8~!<=;x}%kADcea^@K;Nw&1$28$jAZQ3u zrHKXy(AdcVno+IZoqC$EROsQB2ArGLHK1DqSN%hho@UP%C~)fcp_W=}dY`ZJ?{j7{ z@MO`s31E;nE^CpZwk*tJwt~8T{#4h+lULvLTB z%5cvqV*bi@XvZkj7j3TgNY)1thoKh(%hS7ZON1|WrWPn@hzZBpJM1fs-2!+o8u7fzMPMR4WOJgJ%4RC20&!*W^I94DDx3;d8o@52SM_~2=-wxgp2 zKo450qRc;+o5KeRd@l6o^%IK--V@F-eMHGF`Rg1)xu~`96;|d8-wH#3cvf~SV{HJb zxdURK2uvO3B4^k6|42ooJhXxcL)y5Jekz8dPnd(SFOU-GNXYQ63?l^pdrN5LSi z$_B&suQXET4l+;M{$*G*tldw_+NGX;)=UThB8Nt-EiXHuLf1wx%XhY2X*=j%Lp0j;mA8a zKa6>RTBI2V4utNP1&x9YE;LkixM$ApZw<||Bq`K93a+XQ`sKsJJu9EGD+HNW5mmoG z9iC>ab$aN(SD>p23yJOyCBhSQc0}_=&QY|1?>JnS%*&(c9X+K*!}Tw7FTUiu&?jd^ zq^h_r$oBSSf}uDJvY~2M%EIU>b2Y1=Wl_@Xu8BaH%b@3Su6B!X1J)-fP+0{zhxRS2 z9e*#UbMSM&85!;Cdxw#Gp{D28-@JK~1B?_pxO26({7ege&6dM!E|!^ufmjvZ)9KSB zHuI&`V$wFa=HJ2@w-uUIk~PM3n|UhAOPBwp*NG;0Xr}hO%9+`QkPMJOKVel`43dwy z3Ja?ZG;rj^z|yy?QRn3z@V!PynT{@K|IOm^q76sw-+t->YYyLns%r!OSi417P5za**2!aT$U;9ceIq?QcHo(2-? zj5{aR?JT9h%+NVw&{-&2c-+RDa3`({C|g?g*g4E6l>w&^R1+aL%Y8^i#oo>bdTzr=L_| zc{!V8+y1o7`cIa==n+^1LWcta5yy}N@(Kf({&|j{AN_l#U-f#&iUhN?v>{2yD@vTR za_CIF@-S;zyqD!yvf0JM^xDzE6<-2;&K3N2*&$DHySV4h@hj{gy-}^#=)6`Sb{H06 z?bE;}mHN-kToe#wmfCy#=+ym3gP^1FK`HuK=KD%9VvU*bDHp#Lz6DK2gGN^oAj83w zqe8YND|a3#PIU(4Sj#%OER0SM{CS=EOm?z_E2t?earK=pkv6}Ak5lJx4wH{Qx7r} zPRYNpr#&#rZ|yYLzt*j{Z3@IG84e22;U7#DcOLMm0ahHf_)w}5owVj&ZU-J|Dz z?>Hx7cFWuVJc5FV`;{^V#_T4*9h{`$R5{3pQ|feT%Q=SEo>tzf(0182Kz% z==r7|P0e*G6SAoOKB+*-Y~4BN!AlZvV3^8&^(qM#9j7V8n{PxBK!yV&{+{IcA)i4) z>fZHcdGTIG$*?kWk%^x*S!-LfhiFBNgO}&sSL;+{!4pM#(^%PvpI<#3JpX#_57WrF zc;Ms*Bej!W$YF&wi&RItN7hhf406bARfqB%B8AMw7e|@!OvyX|9Eaa57F7>Tg!M%~ zaABr$s=<}Utj;{eZyYS9-UzB16E=&k{^10>AeH;r<~`0b55Q(WRzXse>$0-JWMX&UMYE+|#>-Oni$@?A zWLUfLX}jdEx^tc$XCKc7pcE%jyAEoS{#ELZDBUIBIsYrGTKaX8ViuFvocbwb`_9HB`lRS8!pyuzzfxZz+iS`GEdX zbb4ifuYEdx_hg|XKN*FMW){zzq(YRQZCE=0?X$l3mv8i$FKAfx&q?K)Zg`r*yIK{Z zW$czSFg*dDGQh+!1a&`xWfHFPoEfSv!nc{3nD%4MI$pghm-|?TiXJT|JG%$6Tmo!8 z6F(QIYxMD=FH^Qxf3LzJA5_DJ_*)PK2=vc7bl*1&Ds03+cZ89Ua4O`xjE^qjjjWi} zb`0#i@M8Cg0tHg~)ben(P_q3@5k4lgkTRwWobtC<>1*=&#SN7TDa}ZUJZ>Z1c!2N-I@b;)&&O##p^R- z;EIkgXW+sh_HaU%!#Y{rz1?uj+dQG~Q9WDf%PY#*!jRP`*!WKtRgo67x0FY&lArEh zGk#%Sf?9SJ;hG>x96EN+S?E)Y;?Cl$tcPbVu6lCijW(F%-=`uqLb+Yh0Dz>x;t7Tw z#8Y}j?E?SVHUNz$b7ogW=Ja$==^d7?1Q;b>ptYcpf7-@D$- zmmMxFU9VjxxcYz=PPpkaD-W1gR_4b_GfREx4y@C-VZxM~qRrLnJ<98|UdB)kqOPG$ z-@q#@*+tfQ{u`q~s04D8{Lu{oR{aI>uIY|DRkP}?Q#%{OT^!bpj^3j347#vtzW=U( zXuVr7Mi_uP2OD%FGgEvO{dyvOfpAmgb3kS76M*Y77r!0_>6hILsru9%jLv&f5sfb#T93obWH#qaX&%o)DMySabk z{7?J!kQoJXMR~bT&8(;5pQLq{M$5wr9XP-V??=OaHz?>Vj>O;bw)8OHCv`FC_j&PC z9~Zi6xs)963~c{a;ueN=Jb_<+rN)pc_xyhq#82T426QCmsxGD)+aC<0B$R5YXk6i zrw40=R(|YDMsI$tF81drOiiD}>BMMv5XzM)oYb2q`NX zM)pcpl5Dcd%6!lJ_q@mP9`9ez)31T=eSbdJb)DBaBJCP)^Ni>|As-M^3OA|G2eHhh z1y6xP!i0W&dS_)qm)l9d&|Llj%_YB3eL7o`)gIOr{Q#Q|5?**6;~Dx#MIFS4)8;02 ziMaN$c9z2-ClvMIzFs;V;JqQ&8T0Jvg0~=p>Oz48dtBu5fJC5tEh zQ5e%ciP!gDHr7}8j=WOqmrBHsoA=|NS@O1ezewLR1BIWG`j38?ZPMJ5JhyTdQtW$} z+&WtGIq33t9BETESt)r)mdASiQR4mx7rhOsdqvhzA&p`7cmc=#DmP#Q$bNkGd@&BEvY)CcDRA^}zt2*~TYI6Y}MG>2FOJnXBl7Cr9e{fhiU?zRV1 zdqOH7xV!{@bPdj8XlZ(I3-23SgkRg@EG$%%fwbx@cr3fh8MokBwE39e|&sA^ND97$cUNupH}P@ zn!0XZe6Vc6@Fg|1Hzx%J1>ru8d76~hqCUc0`uh`yjxUBj>&lOR_sq@dI=R2>ddf^NfR#OWNWHS25p%9Sd&RA6$c{lqc3K<{b#S=;Sw-1SM) z()chhm$`*}kZFsRU!hX=3#G!Krc6dmVbDRZY3v1@d6Y5obhc7;VQ!|g3 zUfK6WPEOoEX(P%{w=O}`tB2l%OH_2_LCZF!k`N1>*82497T!RpkT+7MHg*Gg;)qdO z^jgGCddRFPP8eUpTW*{3>Vl$^C*z6fvT5!nlOjX17ii;bxNOfU`B*e$SF~)wg}PT` zzhO!4@cL4VVa>A1u z{xHDrWYPNfWm)T-99&@+m6ThwS{sxXGOGEp?E&F4jPU>?$URi{Fns8n>wh&Nc?FyD zG;qXkHj`N+13p{i1Uy0PmKu5}lVi2_WHTz%JFGrzP!UWqi2O}*LnbP`a8{_#^E`B)eCg!KCFZk-{a zd?vL{cs7H}l%bjG7y6O#B8Ag|Dc~0=P7X8c$}&yrwf-xEGql@3pw@Hgm!H_YO5<~5 zZ67nU^1|X|$kY4V{R0C2OHGFkt4&u5L8FCZ`d*4m20Ro!e{=e-yZ4uq-1+Byno{~+ zch4k>R)-U(U+Ct4HCnl4PBkuI$Bs9#DzXHS0-zXuO^eP(8AMc?P^ypjy*q%HE6V$7iGfOC%f`m;L<`ELSV^O z7a{3JOIv2Ghavw>d?0lW=%$1Wkf6v6)$D0HXYA$SHsiZn^j7~i2ZvenBoR^3XsEfh zF_;q`{J}l|0g&SV^ACe_28#R49lCK)C z;7KuPwY(@dgH1g@A$gYGYI0pnZOY~j{xN+nPTwGUYSKS3ky-Uw-gZ+212Nk%?P}Yv zd}R%&=1Ze@GqnTq2lPOJMHTB@&b|n+m*bQ~SUD$ueJ7r2uHMPcS2p(i|Uod){y$Jx)mpE(sd*ej?M#(vw=Qx!KN4eRtkrAgn!iy-VcRN<%m zltdW^0s#Ptbm%>%-~8IS#jb30Nu}a>fwD8xA=Nayomob_BsxG`UjRQ-#qHMVmTq0& z(V@GsH3S8^OY809{M zY2^jlE!BVkG$w&4P|88G#ZOMkZA(+E)*s6<%5u*x$_RY;Fcf?bosr97?8>tPl~Eu_ zvCD{kty2oyY&@vhoglD&W;$Cgj-+!s-p-FKcQ z#f8W;>(w@Gk*sI_>8WVt_bU`C_&1x5#HsjxEicYxPcR7`Uxbq>hYUY2uTtllR0qBfE5qyw{{*WlR-{FaP4ZCnzVl`T2DqAc)(pgv^AmZer5xs+|(|UDzz= zcKW@gf3=UIhiy2-rp}JS48G`?%SagnEO+nUuiWzC%Q$f369~;DFcUyZu<*HJMw=MS z`gQhfABBF}V58YZo_~#19akmhy#4RqB?YH~@X{f6Pv|0bfd|=T#HC-eniaPF77U2N z<}A~oEhH}_@H3O1*`4PXIbm$nsbSVs>bmarN%j355k9~NpZfa~KvSau{S9aEgl_t7 zjCRk_K2J^&OG`rZiSTTsrJ=9BiqYcB2-nv2La$4=G$aE*$Qaa=9@*i2{Xk`0923~k z8EBrNmmrXZ#b|bAj2eVa5e-)OFA%vC;$VGD#yb^snCm2+#Ab-d65eB^5+z{`ai^v4 zOPI#yt-ZcAML9O>(%y4FNwGP{+@xFLWO3T!I3=Sh;44G$fs$kE#66dOi}JN>`!ygh zu(XoOq1x8jIXE89@Yo@7#~=%B`4y~b2*M{4+F%2`T00OyXI@9V4g7UqXqgp4#(w3Gl3;5guhAkK**w(uSluO2)&A3smaeO|?qBHQQl zZLv)*`k0&YvChBG6*M1#M>?8)jiD)403e6>uqu2vJUO{4CtyD?P{}^RuhXQnW~(+Z zEA>P+B@}70$0qRd4_}6HrYo_i`&w&(hG2L&;#X5J?%ljA`i@0;`Ru3j4$V?1!ud+8 zDKSxax@u|YdrhB;S7s$9xtai*A9r!&qc3jB1U4ElzZ7Q!)1wiLB z=!jox-&tB-jv^w>P4vmUD=`KAkIKc2R1t#GGPrP?YL}(YDN!xCTo9BSW|yGkE>Q^ z=|&AM@R@ksFj-prB073{4*HWXY|a;fXCQd{OpG=VIu4mjWp1xlqx%|U>Qd7t*{=U9 zce1XIu;<#`JV_~A^K8V1SvHoI{0f_Hy^~1UIHmGxPUz&0#e)WK64c8hRMNg?>vL0u zqVMNGD}cU~UDAC{1{#R4($IDYQg-W(gRS%w6z4O*LR6n;#`Vi^E*5r#^E~D{&L#c6 z(=FC7^u_&(^ril#$RIV*qjtZI6v^0)j~vNr4YkvGN_GB)*E_F{vkfa7Qr-`O`x3bP~!sSe(~G@|ycc|fkMBYCqUQq`f>Jp4t! zcBxOwIm+Wuvh+%2ob5{0M<1|C-fw_xN?tn;^IUPZRiNNsf4Mu|L3$Y|F^#TBHDEE~)(pENq{%1i) ztg$yY){w8vG3<0!-6q1!%82$yNL|h9e)X)yF%I*dzt%zq=ae4fV}E&Cjl?}PgR67b z1od+*>O0PrHPOPx^LOf>71@$z8h1X^{Fk%s^=SF60uOQ@JEZ0ihW-S=P~o-4ne)H_ z1*7=pAQ_C2hOt&8ezUFu5d)D~0A$8!Nh67VL3F3c@knI5+ zgl`P*3I%Jkbl85MY8vv|_@e!s7ZJ>PBph4z7s*msXv!~aZEo-h3)diVert2>jL?8$ zx(n2);9a9HuW4`B@%nx;ijVJ%-m=gRrfv4zswCO7dC;Y$qQk(_R)hQOE-PHyU!~r^pP(7fEiAkM zA@x!N7bj-`!A!+%Lij8}H-@v20+w`RocO_kgy&~}tZ*bWOq%MI(7N<*3+O3&=Af7l zEkB+oXpaC*Wci6LH(-gyr0G*ljN_)C9Y@Xtze?ES%e(x1A@h2o>3&wpR|&2D21(aW zn5Q?y#p(*y(DaIq+X9$?KP5@>^XH#&kAcK~BglzJhesbw5UF2o_~f50xh7&{Gkh#GinIDw!~$E28e)a zr93$sEl%JtXu62?VXtP=jzzJz|HMvWnMlPs`YUX^SyNNfM1PqG7L`yitSi+U%Kqlm z#*o!1YEL(M-du^ALd;a}%QK|~#$nTY32B7k83Yxd111vlSSkIIB~w3eQ!*;Fd6=3~ zBn=?mp|_dy9AONG?P0IRv2$2!;cC5x83<%kgn@Qmsz9wJ>?JV=w!;IxIZ^V_Wu6SU z$0O}4=)v*~f5nQxPWKI;(TfR=t(LEB6qhwM!q|!BCi?!xjz+1*Mlg@@&y)XZlua1F z-thM0o_v>awX}7oYpKt*+?hLdo|$}KpXKd)GO#^aHr!2qVyu-x(RkH~&>Hk^`Z7G$;B(f_{?l2hm(RFRs*fnT8v@4g3=iYS8&+CMl9-4Cn z1A{1F>*=@Z@xuEZK!s(!UPqv6E-vh%7lm>tjklfXP+9a`E*8k=PX#Tb6;o=&r9?+u zzgCO0*a0_!dGrVqCXjNCrBk%Gl316@-mA>F|6YNK(4SfsA1zEIh_d&?7X)t#nooc9 zcRzpqlKmVT`E>Tij$60xs_pPL-n;1YfUY^HE*s-pEvi=?WVf(S04OL+WAinW^aIdG zD8<_t3JV1@Y{snDXOd6G@|e86pPbCHC8qj#r6Sis!c#LZv0q!IwVr3+^2;)ta!xl2 zJz2tl6lFT_@niIKB-`$N^<+J!Oe600+Z3xZ<(kQ&mJ zOyns$SLdI`hd3brxkqcVRV`AIES`*#$A-vj9aY5L)AM;o#)EtJ9#y${G-C_5!4|7xxO)o z-509PNu zhg;%1*M8{Py;(ZXth}?KyXV>Oby?crf{5vvt(@ra1;lEB&b5+v&ZA_@1JJVteGhB)CF&x3@$5!uz6@UKy-5D zka1!$J?eF-i(f+xRKb9r%lxMihIuL5=v^*>ap8U)ZIDrm&>N_cA$wur6WrzAgwcgv z27ka_%nDB=PA4k@PP(k5I*=};f#kqBMQ9pyD!!jZTM3?`H{r2;bC^tcDS`X{V}oAFSMTDvq?_L z=Nbi$4WuQcs12;3KcPa>LQ0B4zk{4xE|H&_mh{#wTk$6O5%`vY@j^l{6A=gS%jNwh za8m-p#)Jh89e6E4vtmzxyx2B-+8$P&;8cYR$T}pt(0UPu2XLwi=R+ za{S&u{tysAJ-)~CS?ic69j#=0#S)A)FJIP++q3tOpc0U$x{=}G?V+aJB(Skqzfw!> z%kgMyv%rIG5Bq}a`^gXF%*HxR9!@qFW73{Dlk#S3D=P|}j2Un2$0qKW<`9eFlqYALCM?)VLi(24-PM27jA4tHVU*|>O8>>2U)cWpLpX}SZwCG#!iISQ z!oum<9Wo@N@mr16r*&hdCL>Mnpj3~4d)22|MwMDoAw>+RxXKRI=3Oq4z39IEwz_#l zjyB71w&xW!wcVIgNvpinskaYWMJ!6s?~z@y(aKdB9;(h>yNcv2TyMKY>Vz| z4*eMQ71X^XNNKiZ8xNyk#*TJjy+yFnAUtx$V1ieZ$UNJzk9j@!FUOl09VcPKAaHiT zP9aoBFu3@G^$@21M-WfI;m~E~`@aSnxip&Q=DWtmY?A^PI|BxqWhq}a^yM1znE`@!irrDiEO95CTw!o(bvInOQ>?S$5SBy5z_h^aw3GM8NRd*McHz)2> ze%kj1*D~RFp*QeO69kkhZoTDGPj2Y*3O6<9mR+~%l0N6*0m&D&jK$&!9 za!^m(*j(7Pv(^CtL0Euc4_V*;k*jV=FdIRhD z3>oKvfk@{Ih(UUum?hvoXL{P|*o*s+t%8`N@8d<%`2V4D-PuD`!@b#go#1coKNMU3 z%SNSod6C=ra?_NE_b~5${-#peQv&L|OGY@dgCK#Pc@z8sTZ}K%KdWM-5j1nG6EN{KspP_YvfP}DYz|Kjs$*JoZ zUi_>JAFGCjV+u(GbM+OTANPcHF(&s9H8m9C;$<#%y3_?kGC41@iX2zELu$X1i1*)(Q()CmY+oQ6(ZV;v5k(;@7^p6x#99* zRCQ|(JHElu(Hfjwp$q(!=pCeY{Pz%1LKui96XrHhxoMSY@0zh#+fv;5?%j2vcf+A| z=BN|lNKzpoz8xIGB+jlsfBzCbrbt>YfS)>iMV3AbNc^wgeeQS)4-n*TP4v|;h@!`O z?--0IUcx2xNbMQtlLZXZ->w)OEF3NM_}Gy1y7YjA*iJEuRvUWJX7VHNS?a}ec7nE! zlQ|5u2{VPY_z^b$Ykh*?#aH!lUL8Fxx${}BUr0%Ca`F=whO^x2e^!>J#D4Xt-^t7I zW@YY3Wv?yB5`Lp*BUf}0UC|i6PolX*tC*(TY?5;^|7hh_Zg22)+{07{&b&IUhMzF{ zf(_M&Nu#!i(0@9YmM$OD0EhnlxhI8%&W9{>0n+_WMtAARveVyZ_(iQP$)R_XFZd#` z6a;Soj@=WQZJ%VR+v^b-ssO77#4yuC0k0}3yma@{TPK9f@YRT1Ji7LIqdU5`G9?x@ z2P$_`Q^H=`oBUH3W(ULkYvg#w-$Z8s{jVj6lL($NAUUOyS&L~9%I`^fAv~^6Eef0) zY6D#Ur;dq=GJws3Xu}8#w}*>hRpXd|T@og6-c94JfmVr<8^apqZndI>D}X|;0b3zN zldvBQiP0G#tk-bljLdHR#bnhE4_z!9mp_kf#o~&=Tb%!vH}Kuhzqk&GONdZJ%cjVf zm?ZI;)$js1y>P{YJ|i?ub@yl2WdXHWYJO#^(F?8iv@<*7dbtxWP)m0tMmwv|o2RhGvxU0>+B9*J0AEHRHA9-5)8vdgnl8~-U| zdXqseJC66}kSp`~Xp5D+j{v{WBGdp@>V9KQ3z+Y*h<$F(!5oeLvCevCCGElZSqrs< zCAs9DJ0ZnbeYU>7D(5u(_k|a9nxIv&nD&?g&NE-JCvho z#N@z<-3jCoI;d=K+;=gm!2cc1vb=(Vp{4Bx@)*R2}j+myq)LF`8tZqSnI?BsL}wgX5P_&Gx> zk1d4Y6s_)6q#r<0A)q1*e-b!qn z@b`~@-_w-EE*5*ut7S{jtv*BW*3)~ER%Zs1uSuOX*mt99F6v61_XZ}=*RbCOn3R=h zGNlvOL_V72`v~F+X(3WCi{R6fG999?@GqjyH~}S`o3O-zAdwC?|$3%?QGlXVg!!k zgr;LJxc&SI>jKGO-M)ji;;+oZ>&y=+#Nzz5VcUhF=c)O?dF3$oe}6cz{r=e78%y|# z<3k~$(f}`Yu$wH7YEs>pAy&JW-ri6Ka^k)`bA&Li0A}^O?;R4`I{(b(t<_A>$eAQO zKirw5rtnWdO1VZNuk3K|%bNZ(oXw{O@MhAMFST69?Mj$yPsp(8KFr$)3<_Sehyf3o}_ztf`9dZ3vXQ6t<{EiEwma99lJaf{xr?}!? zjU$p%0hNI5WmY=EMJXK)p(&@By_L1btq1M9nFT3*&z?_Wlaz`vUB|YAv~w~s>1tt7 zcgVfzDUr?-Gb&*;PjbdcZk|ft_043)4jL#F*P+SD*xZtxxc3+zoS54wOF@`o0m-oL z&6K*@)_TqV_zsaXoo<)7()CU{-n_{Qyo4Z5faRhKdnF?B77WAgN}o!xZ-Ct}`oeFy z8u|qo>1;z;umXWy!hMca-HmM1?Qcd&?v+VC7>)yiAoeHcpD-(EYCZwz3TWaSI8s8* zw0)Yn0qat=3&;8N9d`7X@4u|uTkvMZ^5xVLiPFt&Pwzk8x`F-U#J5*W;5uW>JibB3 zCTE0_56C{n~$>i zki4#`^P|}i;Sd%7ZG;aT#|-9=iU5EAGkqOiIEF6;7Kygs5SHs1$e6tk|Mt>@dv3Ya z1Wv#@hXkwDpXdp!BW+5Z934p?b~x+o|JlTKrZYg3=;0Y2_1~?)U$ah1W?h%ZxJ=A5 zAVw9JlyERgUu$&Vz2H*3s`8OzEQYEk5`7qUiFltG7ZwVZm?^-az#YHcm!|Ui(w!&X zTYk~4Pol@qksC36muAeVy*6u0>^CaS$uS1+R-gk;x{V)6Yaa&9MD+{VRY>jDLau!^ z;pXqWp;>ad8I1~I#sepPS)M3_Ofcb$5s8$7ZUOHK3O=>8>@zktMg>Uc`R#__Cu8HL z5RtH0*R@wGzlQqOx!i=OajuB;2(11INe%|mp~1nAI88&-hSpXGYG&eX|DE>{<`~ZV z#~Q=WvnnEXUOnZ;M8RZnx9r?I8nMkn)P}v<+Sv}9C<)((y4IPa!cw*TB+O z>Gc{F>-~bKv0r=wM3t6-0VaV4&;f75gGfc&JsAzO+X+j17_ks$rse*|55=e4zVh4x z+;pu=J;{B*LAKCkC{Bo5nI`U?sBZ4%v*<6MK!Jkg{RmV%-Muv($Co>7MWv`N=%rlh zzD*Yve3~yL>)<~TPdeA9p|*4mLq@q$Up{imIsA#ZfKiBn z@C>&Ju0C+5p||&_ZAr9x<)N^?i;8cycKJ2ik$S)Ms>9`fy{CYD|I?>$PNg)&&KoDI zO_^720#8L`$Pq2O$%`+Pp3c@E69VM}PlbS%Kp@cIoiV#>BEvb>%T2y-wPLIfjP73aJXicRVwQoWYE7 zXw928Hm&c4T7_t#CH>VTN{Rfikth00viNL}RP=2{}bJ}kwbIvs_X z8ebZj*k{etI~*75ZGWLAwW#qWwK#|0s`)Uko-Bhr=DmCODp$&UnZv!UhQ{Ug#;Oo% zNIIlx^E;l|shZb$-LQA{J+O73)@hAe@mnPC$xHrYq$ymRhlqz!x!D``kW%0AR?EXn z45F`;mZsonTe-2sgypdyqz?V)XIyym#fm_5I|g4D7XR+HA*1i?;R{FrjsD5n>ncJUR1MH1H=J(obmDZFLdne87K zc<~$?W!5XL6j?%bhdEY&@F0DABQQVT(Qh7`s^`X!YJN+(`2907?)kCI5na1wIt}z4 z6x3)`rN7v80!C|}w7ag3l7wscsGyz@BO9`~-;X&=6#XP62??6aS2Vn|5i5|PFWJQe z#m*)b@lY89qCWy@@BX`Q@P^h~bA4wyicYQRc*cbR58=Ga_xl*?(TG((>uAdKP60O|H{?3 z8-L5P9IzGoIi3G+?=#)yLkXcW+8a|NlVlhaANG_PhCY70SJESMRTD`0*|zQ{u3MjS z-LC}b={FTDNY5Q)o2h+WA9?c}t5o){nLLxAvTfX^t+p%-=Bi6)39k?g-&pxr0&0&{ zkUJd*(@wC~aAyPnqpo6n@_x*MJ7bm9XR7~ty;2LMySKJGj(svo8gEv+dB`kP@*eAp_e5rgwRIpoSnzMD@q2$-s3cigz9QJNuUVZp z7jHG;V1$+*vfaC1RYX2Ntur@oSQ_z+!a{?Sg*jF4Bv*`TbH-r~D#b-#6`hmCKB`3p za^JhQpQHA+|8K()UF1*YNw>HB*g+6x1_-@AKO zewPobq62>zMEQJj%By@pe4D~`YB*pL3{>=nS(f)tM9!@rMV{QQN1rQ=e-7@K`K4ar zAz_ox;&J5aOgPyaL$658PSLMh!XIg_E6fX%gCK(StjVdU=4;oiDzT)F2UCTe!Jwj; ze$39QAo(dkn;z)S7bX2e3+=P9*tPYjY=8DI`+;i=3uj4c z&gw=u18Yar69)tuA9{Pm6!O$w zkUEcLXsULT$_e(1<@Vz8-j79^v1^1;71?V5tY6i|wqa|)1}oqn`P~&0#Koqqt>IO! z%1Hb2)k|WKi@l+83J8Wd^Z%X%o>|j$&}*@D4*r1}A&i zHJoniMye&XPCm;6ai;v&fm9x)V(99hpg(pR3Ceb@eaO)?kK0{3Aj8a30z$sp)=jq>g*-OVzmd%Uh4w=BjpvMnt^4^q|k`NtP#-ci+8R zq4(7Nrpfr9cQ5Tan6y$mQMv1MRhWvXi}r%l{`%qi$p%}vzvNE!E&hlNQT z82ugH3d7T*AC@WZS9D3lq%cOIsU|dUW(_>KR795Gss9Orr7h8DQo6mQvZ__ zO8utc)0QbM!M$QG1p;yz%ll766d0<3gOG+jVNB}rDSUuX`w;2c(Bz3U7o+AJbnxI! zHI{T4{wdDS^zXru9XYXwknGlEhLqc{$kYK3I?Z4;OEybS2crz;*IINU*2K;||4Ck* z!E0Wu8LgfiNzOIPk#ArB8#b;oGTM{WP6+Cf&x=t8e23cN<7B4eJ+hM zwnzAniuI5D`5m+6qw7N?i}QE)3aj1Fqm%k4+v>d+2RlXeRsQXkJ-3p@6?xN3 zC_Yx>raRp|&HA3fC9aP*8{z{RGs*k8$5U+Wsa_e}bNy}@7f7{tZ#o7W;{5#X=DT4h zu(XX2arpTtkh@bD#4C!{>k3aJi@o zJ``yNLk}1Udg}(DZ(MpO{`&m5ga8?A_g(y@TBsz#o!Np|}@#(?ntLgir7I5hEG>FO!~NGi`Q9Gd@aWq&3`BQ$q|AmUCZ;4ca|hM`(2^g0FjBOvBtrI7Sp|^$ z+^g%OAS+5xI5B*h990yJ6j6{ivHqfa=+Co&b@~)ji&lZ);uZ*3Dr3u3*1#o1KUB)qUcBivn8ORiV*HygR*LO+6 z>|p{|;!f4?CjNif)PBiDhmB`amR{V^QLAy#OO7^EXy@+-cdyh}UVsr$BVogiCR*v~ z$}RgArHaJP$Y?+q1Ss~_U0z_bVpoCXuCM!ElKdHKc>>KDmMK?ppc)h6=4uofn{cv8 zaUA^>9S{EOX6wB8JUdM=s01Y{1QoAsZ?o)-6s;Y4bCz<~_N1J-KRe6a?k(?Q{blAi=0%&X znRKizeom)}^x-w*dAjOzV9Q)jvd2I@l~M3|K${*T)5#yLRNgu zKC$tE=2NztE~mb4hzv&mIg;|xg_nE9__i^;(;%uks!Ri|Oe#nr1Fp<=s1tCy(}Iy9 zVA=gv5+H128rlz8`l2_d9@EB|8BQUg3(5faeS=-@wjXh>>3*GJ8?DW5~^d3glOO!|axt3(`pz>MEQQkRPaH|oJl7vkz zt7dX0)7odbH?o0=k0pKx@25RtXRX6&63@ba;MSYx=lA587e&Ey={R5}88U2@x$yyJcs z@HUw~3e&1$K9wW)gFiG!)LB#7z-Prk@lMUJnZ4gzm?@HB>W1WA$u^el6$vp++-L2M zhRKDoWARpl!;6Et4=jccZEgE~F*Q3uv5vTti1A7b>;xd%!fiMRa2to6%+%h#8TU2% z9QX8@eYZNND&TG;Lo_b+#!ZnjvA4ohRBjM-n707An0H_yc(6Sf8| zFx+Wq;p6nAru%W-^n|e0nUP1)L-R+qyr2UBeTP_`0Rnx2iZPM!mUVrBxce~>W@@F7 zLGd2wEj2y;_2Frr3~Q5Sh9{PNf%1j)4ez+iXMVgVsO19HRzDoP-k&7Y+SuS5n%#jZ zI{fbf*z^|}Br^{#vSbNA4&Lk05a+saF8A}2^YZwmvIyb!gWK8mYc&ZU%HxOT7zV+%c z7o0a?$EyA(?yVXpq1{7+w+Bab^WPW?w$xNRcU}XqgyhtfvcGC)aGjgM_+xx>vcS57 zQ~UcyAQ27%kQJhVDqyQ`682uXa)ltR_}ZAoHD35mKHi?Ti&?p0B zhAPNcSM!r~wzHhs`fZsL=>M(o_+wIwcV%CDn3BSV6CETl>Y-S~r(L*OB=}ewso^M< zSFc}JLK^t5at-SHZ$#h?h*n{KZcb~tP2$^5YBOX@EW%3-Bjxn_LECoXA99+;OE^6W}ZKArZ+d{dYn)%DX8@Se|o zxv^U{eXUwict`w>Jc@JV3p}``-PXD0@F|r^xhV?vaQ6AMm= z-)gM0QYe>(iZi519v|_r4X%D`l?kTCv%WVv)clWtSM%9?Jt0$6ua=_4&S3O0mu8Xs z;CZ%l5q;h=f1R7UmUB}T9{q1z*Az=2Jk*h&w2PLu$+MuLhY9xwnb(m_TRUHM{qq!J z-6YhTTV#21?^k2&%`DDQZ)dY31g++ZZv83Oy|mje1mI8UB?dz1x`NY zj%Mr#kJI6Lu{DrRb5ed?xP|e-r2g3gvu$DQ+D-YAkX)oFh72zrQ_cP`FG)^~1q6

T6}Nq><)HN zqbXGOFp=Cmkt!E@n~}Hvqx^ZJrS%JYdZs){*3Z6)6YiixQRAn^xOcx%iF4@6h~b@Q zyR%OEsO>w_xi8P;9Ub11ybak|gVG=FN ztEDm{aCrhwfv8woA`+^%h+D34{0K6Gn1pYbf{<~Dsg_Eb*d@V;emjxPg9IGSWdeZ~ z+Klh9a>hp~a%=r<*_62W34`{XJ zV{LCge2@X%CF$o%zFaoPKuC7P*Xvur4@*1^^bgbEI%>_uvW(a5_eER+=Rstm397sWQ+aK?HNyGlap4lKv!@RN;G%u5SmB!Kk_ zmdzX&t$O(XsjZlO+Z`Vtk8BtnkBrj<9HvFUVKHBaD4j=ZGKH@(>_b2QFm0FIVYchK1e2n)FJ~cJ zhEVd!V*456Jy9Q*sJx@4k?BNOoU|;dlbGjpN050LT-AGXl4Oke{f=MF^2|jIl0U9F z+}JmuaO5O!o?XfIytUIPVQ5r{wW_4Yf+>Kq$$Z3)WUe)(9Y?G*Fo_3ngog$&1J@72 z(`Z;&l3bdOUAWI}_zvu)iC;r%+_Bhe zZH?uVuT93{edf`s=3lN$57Y1b3>4j$JM2_a>R*rcgTG2H#la3fR4_?s2W7SRo(e~< zfqu0~?SWXyQzK47BrtvC*v;aAa33067xCsZxIEW>ivY}D*Yq>VxoS=4whNCe#Wz3BAqNm9h78Zz}6~w&Hz;~c3 zATkC}J=Af}myfBBd(DowY$pxSdU4pIC` z`t}vxE%=rYd;^Td$d5=d9XvWbAsBaAJ>aOwN`b(7yMQJm9$vGW`N3ros<#Ob-(RWC ze&(3Vlthef06suRt3tJhUCqM|adjgghD3TXHf=IkltVV8ldi^yr}6B1OW9X91icY1 zqc?BfEH&2s(!H>_h{1>OB8RdtZK~+tsf!;1X^-D@bR;}wCp@O#VDowmW^w^>aYlaA zocLPzK@w&5R*{$~zUT9uObNXUA3y&mczY1wm}@T=CQO3Tn2hhkv1Y(Cad0$8i6qwT z5Vh51R6TSwmXmIWVO{a!1#6G+J)X!(X!Nu+D~g8mLFPXD??A^G{XB)?qn?2S~{_5nK)1Eu)_juPifmK36Z#b9D3xA3t09 zZn_FT^f-8aM7RzVho7se?t`vEgup;PqkE^~%{5cg4{$m`Z;H z2@MF*i=bTL{^T{zL~``fw_6OdI!&g=&8pal*JtyW!ac;tR&r z?RtgoC1v6o!6hXnrC&l@)9rd;Ox}#j%*)H0jP}#9W}ky@QO4`SdSz189G7M^db5LL zW3{-(&cZUpj}LJE`Zw*)0L%Gw$>fLPd~6qfOKxKEr2O_+10~8N5j_jmA7UR2%^I8A z#7-5i22a0t3TF$_8?I@Z84yYw1ZYMYVr^`!;;Fa0UIwdH5M+!b^XZ^S?cf z`+tQg9(x-4curq+$%lLWr|kw8r?)?1&3~`;zPy}>`vlJgu&YkFyCWpX3J6hHEuSws z`Ox7lkMC{{yWxW|^99F`xh$KpKl)W#KzI82rnzjR!|)mN$luElwtvQ_MReP!F+ahH zxoBvZ556v80rcvX<;N2HI*Iwjj1c3y@_FIk)9g*Qe)4%P-LUD(ZNfm%jnxKrk(%Gm zzES3h61e$O2AQuZQf`PI!j1+>-`4RV85L3N$^;OF@<22`XbK6w9f060CvUbX!qO5b zJ29a_A`T3<)Q$XJJqk)%_u$icsS?&sIfPe?=;8MFA@AdVvlmXO%U zC#jtKVu}en00S6gWIutEP}R^EoK*4Lp}+OJ`Vo!E{;yz(sm;d>;kjX+rtpPZMiry9 z^XP79E9jbeKJz3UZkRN=kONb5GOePq{b&O3=MmB(b8@G%F1@4*HnQfte9f;)+y{dd zzr0fj1%j6kH}btKQo-ON05Btj4Fq!q-*|NyY5O~cAq%TS5-sH=hJzc{r@on}OBqsc ziv43?5DI&&ty^-&@OaNJwhJyUf>3@`!%-O%8M<#;aM7yq9TGh)E~~(IqTyObfz?N* zzY099JiWwuJOgKeKp@cjrb%7Eqv1g>=)m%&v8tyh2EV8H_^>j-E7X>MDU9|Y3?juc z9y_nU;NTI*AFg58Icuy|f6}aNZ4Jfe0SxRj{s7U=6aHU3XGjxja+cT6y8aP@)kais% zN&LK-(LwO?f8AC;VXW*-TMNj940*LfE_M3U_lFzcEa;)2pyTCyUOi^dhsv%i^GiP> z*;|g_oyNoUmZ%dXW_Ac6fdGKfiN*MI)0(Zau{rrkS+`EBi^^f5-s_^t9@mc(q;8Y{ zCg76`>d6f}C)RhBYJdFQy0y!wM>QmLC5ROm?@z25h#Bzv?Y~1)Qw@N{P8b%j1IpBO zP^24ZJUd&Pc&fvw+4~-&UWDggLw<96m*ZD%N!I$_J!bedSye{I2`fcRJyNQ+XfvT&HHDDq)K;JRzRNLD;p$XFJmdn*8dbm8Sig0@QY-rJHe zpTogDPaFe`V6ZyC!R5n)pY_N?D!Rm-6>97iz>clK)llHVr@rEdPXULI-WTql98&|v zDk67Jp|!;Ewc1?&hhBK3%(-bdD)58INP5^05VUb7TJdd5t}MW~&x!Kkp^p(G zJ1{`&82bYJa-T17%v$kXw_4Z?NDh6?%AF_C!n}y;vfCbRF+eyGd{HOrDSPLY%{`MW z!%u$KIbOy~^0YZuKov{Fp`wMfHguu7;v;%jEi4qk?e4U5tVq{7LD-a&pp2cPI=|Qr zb}oUm!=-~*FT8K3CuS`w;>*0O`aoAY!y$M}!Rd=^Pwv)14)co1!TUk1__O!Bzt+B< z+S$moaNa)b9!LvBpeGRxheWRKioYxoZP`nE{LMETJB(`?H}coBo$1rqhX$fczdpKr z|K&HOlfA>5udC%w0UaWwI_Ul}9{~#?!G9ned2uzk!xIq3r(jVIJJdY;DinTb2PnBO zuq<@>-A#yE0E|}yXUs1sP;q09xr?b7of~1>P1rXBEtrRGGZE53vG;K1<6S5T_^rur zN5B*Wr7#~W2SC0E%*Y;hxN)Nq7uww1oGGjgVp6vflD%O2@)7Ry@Z*B6QBh6p6Vtd% zy~tfcO$^%?E8x&s&zu!Gq8bQYYI5w614&4D*McM{HS+b)1y%{M1IIa^7riE~agav| zNwZ_kf$6m;;fdJ~LJ#h-wOKH$fNBVdebwL@U_X&=gk21KQc+Qn$50jI6C8)cZMscK zz8x-AT*K$0ramXqvW-BQ~>^ z;A3Rz?w}1HE@Gs`BlTwH=gQB8bK1H8xAm?%^>O9C&+v3m`tZKRqw@UMEY!GNrg!kY zyalqesF^Vd)`A{vg>4mlh*?_a9&%*8u^DI(z2t5>Vup-=JS@p)c0 zS(`)K>4+=qOJk$kTW-(&JVyxR;1+epq@wD(#Dwrw#%dTuM@#!iLET+Y zm?0GGooQ1YU?cPi+(5!ZQgIEM&H_&DztlP^27OeN(n&ZCM6fSzu6q>~-hSfVyQDvy z*zxZ{>7U!qMrs2CmZ?7~=Z1HFkE62a{U9RnroyhDwM(Gtjm|Dh*JxSm4Vky6x5Dv~ z{-UL>nXVoD?!C_O*4^>UpRp|>!FKTsR&UJ%UNv$KEOcxvT6gx!2R(imZiyd{KxWZ` zc6GlzmH$iq5)m;$TxeJ^5EkzEzgDYKWn5QHO=U1Q4mENTjA!Hkz(!#n0z(q);LhQB zu8c&PWM0fqJy1YjKs*CduLS!JBZ(z28OLj4w`Ll#T$sDV;@?+It7pH#Tu|Mg>4e4y7k1>Y>PH=L zo^WyPSUzTkofA4IDk)P>W@?pgvra|F>Y#%|A!@l&V2#7AI=iP1lv2&4`{d_Vct9}C z0MrcwCXu#^4KWXo-Lt*%Z4LWgn-B48X}UMIjP*SOI46JEBbF1J88U24_U%Q+tMac&5 zp5O>%%A=3p(0kZHdfR<{T`2F0l%}>Ahe}j+zVr zW_=A3E#0|xzVfGD zmX@Ejx6$>-^ku`sLe*7OMCu7lQjWSEJ#c?FCjuo=7=V66v#*`41v-h0KXjyv9oV9R z@EZ*WSr{z=yXN^n?Y(JK&wcwY{4>u|Ns2-u(ICyU5+N0m=Avj&O7lEiNTrDeG!v4d zRGKF=qq#H}4brT6u6=yE?!BM?+AsF=JZtS2`^CQ2x>q;))%W`u&fz$Z^ElgCJ|R9b zs*9x--ukQD$mD?o)*(>Ht+N^yK5f6TAg98M@F)snS^vBis&<_ zn2cUM95{-S_CtDZW;T5=wut!n;nUVa?YwLk>=K$~)X<|I5Np4Y{g67}#t>;FTn>S3 z7uyE!cV9{u{V=;N`@Hzi8kWDAo0t5Ri`oTE{}%gxeV#cKZRGMHZXKP-Kl0+gBkjJ2 zy5|0K^5?hj&Fi-@7COpL+igzWbbD;qK+9EX9SBOV9>JZe|MnS2vJx*>Bq%RcdJ<}( z1@OX+s9O@P4`{7D6dXo=NzO%yzp}HQ%Tyu;CrFI(TDSb+?Qf*y|?SSae{%+Pf>ONMoP`V@U~u@ z?g@w5>ey!4LX}o`vu0k^2I?X$QpGr3$f$8Z=^2^_P>Jc+!IA!9b3WvYrV4lSyR0vN z+L%A8S-WRGm6T3dclmZImL$ z&ZVQOFK@5@6gu7x*H`4&7BpJDJ_f<3zosY4_l51@rh*qU{9e99Hv z8>Rba&}CN!wK^ipkI9)J#}ddHjLZ0>>rc?IMmp)i0U)#i?8tImQCl}Oh$e<>>D}aQ zqd#?Z*mVI^d?sYhLUCOf-GFWgqezXx-=-7NI*OdWulz(fspcWR-Ye;%8DG?f8CU3o zShZW+!77Ibz+M-69VlQxs?@tqFQfhIAp(W~su7ZbMunmE=dCWzOX-bd8CP7Xf$U02 zbRmNL^J=MQAnb1dhZOqbj*LdX^W#$8*{hHy!l5LTq);6|`!!B1fMZk1MLmJry1d4; zC#tJ=0mJ6#zqkrt%G3qsbFro*qk~bp1{N^_`9vX}s&WK)J7YpP}uL=&7R%ZO4e6iDDaX`)2L%j#cMR z=a?h1V#Sy>kf%QoJ*RJiKai(jDAqyTfG=fb?Cra!Uxtm&#(q*&JkwQikG~iacgnm$ zoSc`Abh;`6;1>g5?^l7cxb;&GwYwN)dfcY2>K}@UsLLAHd|RBDq>drw99k-(UMH~W z%_l4@g!Tw|0GJ=fB`E&7jw&u%E1O5G9ab_`P!O-FL3Qi*(efr*`qa>9@ zkVxZ;Xn$^ae9!LPhLdHE`a!KW8_GiX=X0@|&3zI)|1wRY;@-;~<-}}}DbfhSwtqim z&6+ic>2mR-E4L;&Gp0h_kT3G zn{~vWRQ=9bT3X^zOTLeA?{HI#I6ov?lQFP_0;3-M^VMD8yQ`}bK5}()ZV~3F*Grn_ zPcpa<^_54v;gv4qVb-DbvsvNP%y|p%g*om&_taN z6^t-YzgSg&2KVjZjSD-d)yvc!G{AFV!<2MPeDhk1a(lDTpt3ik!oaL>CQFdq@$mBM zA;9h%bD>~9`&*2-N7Xn6{hFi2M6VDwa(|#yZ?XepiY+v^g>8rTK38vJArQo-$L9iA zjYK#7>h0|6I(6;Zez+ylj;aZL1UINqo1hDkh=R-?CT~hTe-U|SDOs@_ zJCWhOBK_YOq3wo%W$V_hRSgXd7WxEPg@(C7^GB0rxXMn=*lkfIq&O0%1Z}N^w8D>Ndn1}vwo}(AG%I)R+PG4e=8Wf zSoP6JY4a`)&&0$;!()dxN>Z=n7w;5z)wE%X5~f<{p;rZQ0fVThD5mzh#L6b_$e)?} zdARNkAaYH;m!UJPY-d`~hZb`D`f4=Mkj-v1P{p=KXB^x3Me$HtUnn-i?2 z3m?dMr?bgzQJbe#G-ox9TH~Q}G}zYPsNKHJDx8HtF7&P?%QBw*tuzsReXFu6MI}n8 zONU;1tyF0a!4V&`oF>)PX!8QL?}e&V+PTY~H6`25X1G7oqh%*PP>l)6j?hkxOk`qW+mQ~;C*e7hRoKuc>U6}Xy zY-yr-d0+f#?(E2Yxx3lbz28Fuv5*v$u+Lln`X!4AA3+Ef-~i~5#zhzoviI8OY`YZj zP1WOfZi$f(?kTB0o<{lY9(o3NZj?Tf>9V+bTdp!LPB&pPMZCZM)~2M?ROQOek$grp zpkTdyGTwk%1;dFO8xeN(`yQlChU_6l{mBVdj~83NIvMeU*Qww|a|k2NUV{H=6cA6| z*P8G>7FZ)U+>iNVr~j*~>mE=jtOwiCqYqJchvxS=paCBvLh;Q%CI_2n_v{H1;{BDE zH@!z?j?OJL{pIYP>$juh#Yp`H^u1N}e$((G9T6G;kYPU$pzl-1W!4=v-ouRfH@)M| zwxycWO>EoN<&&M2MN&f4V#eEqH{E^id?I8k6H~;iH9aCeyIc3U$)yipr+GYMqDB<> zKoi&lLclBtiLQM0cI6SGWc(nmXeq1_t&bAO8LgSLZV9i0uLaSX?5*p9TY`+eCt?~f z!)sVoNLVkHL5VH7*Fnd#RkO}{j zU56$fu|AU&@B6`nt{HSa@Iu}LQ=B{MF3`KdUGgH~Iaz1gcZr4w ztUeoKzVWP8^v;WUk2cW_q+Z=u*`M2kPL?$Naz;dm#bm2o9tCj<20FfNP8J#wzVGj^ z7|>fDe2gB|WBEy~zC-5-@Pr~m!Qejw-TFT!F%BICV;Hq=>hOk#_^lYJ$UrZBrD zK)LHm@|Gfxn~j}?l!uBFU68Bm){AsXH0nLq4Gc=KuVt8v157~f5*O|hhRrda3jl-5 zELl7MX5y{&I*DoJb?XKiCBA(1tX#WyHmqtxud4H~+LJ$=+#6SeNw5ac1<%^qW0~jvmT{}>s%|N0td$dw~*1V*i$2@ z?m!57Ebh{$chiO9U) z-#P&6NA#0HZK1~yi>nEmq|6AuWLlaM@a@toaKP?JK%w~6ucqG-hi+k;n{w3DYv#8z z->Y)7>!Ps$#EPhd*iq7%j|A}fwa<6qFG-381G@?l-5b=0y-eeF8CP7Vnu^TacG5@w zwl8xwP{)b)+HUA+Ht(XD3Q0=`rGAuX6me?AIo#()iTAURnpez1`@4;l_=a~qKo!bF zTroXP2yzZYMBv56DzJti>|c4~HZulC@u|zgB6#3Fvdv~;h-K`S46SdJ-#;!s4{%t3 zIU$lYklp%=mS5HZXA;2PMb>%u(e<+d*s1$-mAIY-C=~+48b`f-Jry&D4b85#QZw5@ zJ14VD-QaQy_Z$o?+by7;x@9qL&#xn<#rvKdw-W^s|18gWU~b@K21k!) z&aXAUHBZy-ex%fhwKr2<^hfx#{^(oTeu-?l?!2?rk5#*ml~#we@oJgbOYH~{Aau<7 ze9_Ne-fQ~lb$B)Q1ky4xm%R!piz9IJy4%}R)^)W1Xg>%cgakLf93{&nFxj~0^=A>sN>cC+Xp`kjA3M69XzY1s`@g&_kT zQ7P%_?UjZ1f!H3XkryEju(M}gY=2O!BO4|5N^z(mlOE+sr2YAS#qx_tv(BHI7o5Ql zyDwDF;%WBcKQiDAhmLVbJ1_N*^UX7L0&70mw{6xR%zZp)3<)|g0n5StgI@tAL7M6( zXF!}ICj#Of2a$at0ro)p3+k^&ru~@8HYm+ZUg(zUQI2OkGJW&qITTUx&HI~q$^Nsi z7y!e1=t@A};TWV0$OKk+{y?N7lXmAN_y{X#(>x&b52>kSL?Ys~l09UugV~z(tB%i4 zIKFDBkhGG|)bz{D6bAUt?(*KgPSjNV^6lnb%4yc&qxA++cYgjnfTS(F(+8bL{CEjy zA5?<SK^)5Qka-a$c6eGQhPPP!}kutGm+DhcNqwFro#(FBFt_ zhSqkS@n`bzdb}#V{fKamsX(F3Yn6wL3S9eSU#DYIO6s=^7rps6x_7Jq9S+v3h2rPb+!`Wk*KFDw|JODN@%ks zwH?R-)FtXf!S|2}KcJ(fMnuBHKdA>^L&i}9lcez>ad*Lk?Q54WlD@o3>6A{4kBM{F;7Xx$2F(R zZ_2oPSTyyNTs=TR81xg>cAO|R42wjxC99~&UDQj;EkNa@ps#hHXt|>!-9*E8H>R4Q zJVi9zT!hS4ID#z1A-&25XLSr3u85ew!nG004soz%1v%WwZ{HBz;NmNsFde+_^^9@P z&tGr4KlO(^_dMq@n5W8Py#vsE&)A+C+b^pj6Iph0!yeyfz?2)+LJ2p>svK&IL;s;* z0cG&SgBtrZsfEUmP=^I`&ZOks+LbsSdMF1oWZNu#D^bkBCH=rMo4g8YnF_{3hY#Tp z-C!UAgLD?;l&>u3K{5@9-(F-wSl0)G@e%jPwoFh1eFv94M~}1^b$dRhT#)R%H`cyn z^=)9h$Qr)m7T_`TmO&M_Y(=jFAbhUF3|9%eEs0QjkWyu zEQa`z{AqoIdg*8IHc|s$k+|$FA?9o}B6G%pPrWrzLyg@?_#lqTs!woKps9gi8*~j^ zJ>i$KzH6@)A28dgE!*j9iI(a7miV0`SNBEzt*Yc`{YdZTwb=YZ@7i9rGXbn1;bD$# z;n%PI9*LyTa0!%72y*ybeoKVWMvFYbbr$7C1beqCh`a72dq?w2!45AwfQ~;Id*x1PdaacJZp&2;#fbxFBsuCRrfQLND zX>PwEhv<2;$u?3Xf{r%V=L~8+HeJ(Or3DZQ=L+4}VPe7uSvGn_N5C@_M6 z!)hUbm6r01TCp#22(l3%5dQ)>d!@K5>@YZ9fq{W5q0)|}N>H1Cs9^#)$<^+fqf+3r zM|{0o$OdNWuF0EyAJCdYgkuX6g+~_Kcd!)Dmf5p9fuur(&e)UQci@+ep_}>(VsHX3K6^9}XA-^F$gANH9)JR~T6>w!^ z$Di6aR1`QB={bG<;f4o(A#Uy=)QYQv--R^Ovq-Kn{4O!CE?p9s>|DLmY4yRfr}7F> zMzE%q5TDvXwSC<$wnK=Ia08H#u3cYzJNp{yyeBu*b2Jw5+zz?i;ue19L{5~LE^5ks zq46mxyk^?7*K}_cFFZ_K)ws7d=wDN{Chmzokm=RW!N%wdjUso!y7X0{L^UL0>GtmR zK}?DylP1OX#B=luJr;Mg0axGi!r@vQ5!_^HG2l`d{j(3EUYclB#kR2R&ekoHe&EaK z@t7+kv0tuiY0sVMO=NtJxvmyb>Y^{BW8QT}*mz51E|q~)$DB{wox|-J7|I7DjX_ks zaQx7z6g}NQz4m}H>?a#5>wN^1th45e%b=c{VFitJv&que5ipYOX*{AOQaHX!xgGbvOVx?p52E2k zgf?>>#Y@Dkmlk{B8Hp_8rB-l>NO1gq@yDW4QYq7ZXI~xdr&FsMK}0fq<{&jxtn&6*(lxbB&AASYBOSvUsef}Xyf`Y@y0>n91q1vzA77o#d9pR6TvhGD+5x}j-N9(w}t+rs9?e;%Z{V|H z>mfEGEdl^fcWPnD-t}Q`NY(-I%lr3irhgW{U94-}d&WmvckXV__uZm=3XQ1N`L=hi z=pY(~{T#iIOYRPbwfaukEY&RsZZ{MA>)qm2_5QT`7#O^yUwmq86cRQgwNtm1+9{a| z^tTOjm=%D!o7>u!eEWv1U)xah5MKPiIs)dA(c>J$t9Kr~;+blECB@hv%BiGY`IH-X zN_U>Y@8PV2Dx>0QyWF69h*ev*x5Y^42_JQhK5umHr(Da1Bm*TNlTB&G`Mu7~GJp#-)MZ>~=(1LGQ@%8ux(w?LY4`uVx}OVg1T0Vs_#KI(^o0xG zZM76}T;8BMQ5Ua5h2}j};c0xpPWh_CqqQ+0Bq`l@uin8m(e2{Uq2{g6wSGzW)lNs_ z#T`F8{}S6o0`&tsTyw2GJpXv6&=$Ac%^Ox9Uz7KJDHpDeu=NqC9SI)Q(I8n?fE-D) z&OQd8z4PbKPvC_gK{qGPF3D6@;yJ0ARRpO)j-B3Or zLwaSWhZ!O>p6t9Y9WNfq4ln1NqzL`Y361Ge;el7BowC22^dY2pV7+i-RZ`r|WWk`l z(2F5s-4JX{u+zF87#yaE|@OLH$!PPoLfysWGCc2l42& z{2K56kg$V|>*`>POaj+(O(JBboP3_k+w;Z@Wqa5j_cE=ynr^B^(k3W0mq9N2a-SA* zDY~-(h1~fIUjVfb2o$=7UV;kNiVnqxbJx{1WS)B3b!Ne`jf#oZa?ECFORlE-s%H&p zdmTi^gr;A;5(t8r5;IZ|%<8XmTrtjM>JE*d=uj4d7w`({NQL7*$17xz1SQ51O$Kk;POo)^@Aq)7GA1(H z&O&$3b`KBTlU5GVxW;bGm2PSmFxWm#XZrra|y*wj)N zC|<&SV9l8y-~3zZ$ItDuT?NYF=9B24B!=w1U8+e_0GQ&$!xQOA& zhZCj~L3#ll>#>TM-mcJCyQg0}=f8B1n)prep9^>75s)i;QBB&QAo2uX&eJ@Z1^9UV7kMO5Fq$;ANWD$-+6?L-hu&$OXm4 zhx_P(18fWlxNumhvQrDv)u!BQ_@U+ii9ka=m6KhK`#0?Azsgx+F1SyBB36!Pi@3$^ zxMJ4*tSsvpjz3p$8E(yyD!(2dsNA|P1408Z#3glgK}cB^{%Gu6dtl2k^^b;Q_<0sg zhM8Nt9Tsj`d8}hPf9-PGsb?rmMn3DqM(1;=HqgVjaw~;#Dwx z_Moq~cScU16(Ou1fX~q5tl;`WWw3(Dlx!$2Y%e!cy|Xk>hb7ncLO~J<{6rR zq3ArgCCW)W_qNGD)%OS;3*wxJ{k#NYY(`rrVz1M^;ePEGDN!3yd4g%b$lX6w+!;MK zTRPrQ9SM@$H+9=1_Tf?X=WpJ~;;0@`|9Ax0kL1iSJTC+3VMQT?K&Ou%U;6Toz1*pB z_d9lLPi^y~`H?K1A}_kb$y)HUpw`B`zPsAY#y)b5dYaMeF*2Zm(;%dMd@WEIr6_<5 z{8uaoKl#*a%&K&(b8D*B623DlZhdTRQD0lji&Gm=`aFeQJrTkozqB2%dOynFuzLTE z^SYVR&10~}sL2r&4&-TtNHO+@+1N?RkQssVYswFO?K}PU3d>V(cLR{4-y;AaD}ruM z9&}K#cIhx_oP4pzb@lOMS)$)YZg!=VY+`X1uXirYe+>~4oDc>mqL3c{FJ+5Yvcx=1 zk~eZ4{aPdLK(oKL@dMz61BX^ocC6h79QGBu&d8&nIEgO!L;pU?0Tdh7ix{T; z#&Ds);UcY*pesO=qO#ZZ9@fW%) zZ)x%?N7mP}Xp;-dM$D*(ESG+thcQUz*CF9+Z0=GZau_BM|rMi0+r-H9{ zdAgjiK))<|{U=U+9f2eo*c_RiU0+WJ_j~&dDwyW1$7-F4FD&^p_LT`41sNt<=hvu<+WoD38$qWysO_F+eo+6 zA$@>_Wi@cZyd}ZKf{`JQ#YHKGg2270hNB7l9>?m!2_OGleU+&n6;iYu?Z%{7_%rGu z2AGl@ziL6a+jE>I!KU4jiYx}sJw2C6r#oBaI#(b%KxTA{H$j_R(((8=kr@|G`> zcT4i`=+c}$f23u5^SjTBlf6QVWqOl+wH|oS+5|082)G1_m|cO>llw0YF}n^EJJ|6Q zWytu8sH(Bnt0{OOU2skp#=dbQ8{==wlf*^6rl(f`qo)SlWTYZ;PY2-MtZ{WNqGClL zx@SCksu_2#-%T2pkP3I4V0Ozo#PPu~d2d3Z`=8^=Zs(X|o2e|+?^W{GCr(qjEidoZ z%B1Jh3Hoz50EvgHx;hOVT@jE62%MfdnyUm#_t6!~#ZEi-3+Gw~FIQro!yiDtKnhLJ zeS|WT@xOum8p0HVurn%Ng!K)N`Gl)MD@A`B?s+uCKM_iE3OVxG`W=X%V?!UTyQwT&!fg(mDn8boi zI(7u$ZvION8B{&6Q8EdhwKmV$5rq{Zk^{nB{lCf6dZHHv*4E}vNPN!v3$H@k1#l-S zqA2D~l8BD?gl`7LQNr!XZi3SP#c*&t2+eRq>GLT=^r1GJ-e=*5##gMwS`m|bNs8Ap z_S7*4-Y^#gx{dH<73RMGsk67l&fWdHP3txra<)08qrsRcqqcZz0yr{pcOoL2xH(rk zAS4hO=>hj4!#!X{$1zbcrf+tu9@pPLo>8C?&ov_V;J><=ck>CGlH^|yMTuy+a2nw^3R%-<6YaoXGhfm^% zL_6O0d6clFerQFf@{yhB0o~w+@dej_4eK}1py&D#QkJ#z9vT|YSZA^di!VzDu%ZOF z{u7u5)%A4a@x*R^B)P}mz)b6bT~Mr{f_#Wcdrkpm_!eCV z?ExpY44or566aF}uukKI+ea1xN)P>dC~R%D`rt(?3Y`ajM?o?gvOZj|*2K zo~iSofEw+IL)CW{N{HANpajAZy8UK_Sj7lawURP3!bcxKENFn-5{J68r^g*(p#v!! zSo*iGxtM+<^2)Jcn6!nB|MhqWCNGY& zO{(31 zIMlHKm!VQe%fJv4gRO!mCS;1zUUw*>O;UENWa5^tx*e3{~-r)BUWp*gt=*|*8%imL^I|g?Zc)2x!j;M`qSXzDTa>@D=z8}83Je|@DaB+4sV#KhtrLX!|LTmVF<1W=&$RzLI zuX*9}7Fy~Zbv-3q(O+uv@?B?oekX4k)UugwFOXp76)g~-w%$HssXgsXB{tGz`LyI| z{z8wZ=giV{{=O0C5l2xgA4>KKJljmUnG5amOo^n(f?O3>_F%GVzKb)aq_c2kb_Z;4 z6QB$#oIB4>=dj}ucgK<07z8&(!7ADek_*46^gg+*q8|ONoP#4`erP8pqTgF*LATYa zR{qk}tGg5>7p-y@hs?}s9k_ERE{EH7dL<#1+bw9SDYo#pAgRM;-g?Y%mCcZ^V7n*W z#z?(@%VfMx5fqj7QB(ViPpO9A`LcMyNOxw+qbOKDj3klLv@GZ6!OSa9 zPtuT0{zOfk`JA32Qi~LRAFRp4xVSh0k8Emc7#MFvyTxdM@1oD2alb=k%@GNU)rk+4JX z%DFov#~%9^+UC!<3H^Siw^{5wB`X`Xq+*b1qGMtXqltOXp+kqLsgnR$LibJ;0t0L; zEGXvDq5t0xCxOl)4qtNZBa2!O-y6qPvNbo+)X z?KaNwYa^TRK+cQhrg+LEw@<(it@g!j0_Cx%ec6s+l9Ly+0FI6>Dr<*BdrOEV|OOjPYT-hJ;5Nf z>vA9t|N8A)S3~}iHJTuj9i=piLfG2@j46r!{{HBM1g@jUj#=ghufFKRxMxon zZ`AAs((BK{g0O)Rm_cQm>8~Ps9iNWHVcXG`jwJzREO{e>4H+3|;EO|HayV`4Nsnfg z6I5A#$LwCXapnB|LQenQJD*ln1IR*sK=I1etHqaOnR?{+x_v*&&Fv4~d=YHyX7QbF z0_>cezAdKNoPOd{jTt>pG<3l&&a9fk3HP_n9nea`Rn%O}#;?!l4v_0iiCQ#y@n9=O zIN|4^K&Q}k6pGao_}SAKc_`WftNY{W z=o}2m_dOC8-y%-QdTJ19e>gNWwDXCEsh4d|7ZcgMjG0bvV*br1>s9C->{h;={Sf=> zD}SV_a<#1MmCeV?1xqX|#T$NGGcqzF-C@D3%a?Ep5keyPZnuPkct6wXlb`Dw8e~^q zVdddNx^`{bS?9Vm9+j~)H_#PooX~W;jUYnc24t3O+qNx2oR9pnBMu2aU!Ot(a1iI% zW`2A+e>t~Fggb9WH{AYr2oFStXC~fA=C%xhOxc6@>hU~-nB5(N;qBzZH|{$AtvT@T zaWYNk_t@uRHvv{6OZ!$^Md6+xq2Y`!T{Hq#zbqM+G&UUC+zwwN05c|r2@Z5%w;-Ee&L`JS#f$DCmz(I z=slQhR5hI^>qoyHOYDw}$C3V7O1^8qBl#}LrBVOU!IaA4luC&`u$i}}!n57UKc94Q zDr3~@|FVVKC+Kp#mnmR74@uR6F zDbIQj_56}?-0og^9zS-uy^@A00YR6KPVC>WgByt3L_IkM;ap4@6ODvZj`R11|8ExlpmgH-oQyK|FU_02r}KJEIyCNFc0314*=Nq8S2*_>6;?lbwm#j|l*N2y52?4kJuwHjalsPFfj zGEc7|JM{nOd^_xNpjb&7L|9)1e!-^=dmuFP^Iq3Pt)f5t-U$T2s()TQUZ*p!E_3RX z3|i|`|ECq5ZEj#;cKA~+src;TUcF|u|LJWsH1_aVbpJ2jCb^>B&${>a;6UPA-EhGo zp%@PHh3DnxFQ0!~b?>=j=5W?ZaDt$Fhw+bhUS>{Rd#I^-P(Tqddx_S;qeqXDL8EgH zDI4(OQ`9G@#t!{_{nKT6zN19AH=GtxyKhZRjllb^a$?*X>C41QpK9=3ya=^8PtoCw zgMN}rGi?vD$@hW$_?sCmD6)lNW)5T>=N~euc^IECI<|^?oq5yEr$yTYTX!VpPN_rv zNnkj8B(LoUF`ztvYIc2t8d$5^skQjnk!L_jWD!Wb@Q_-cae56C>1=zy{)1U6sI0qr z^)JZC)YaD)kq`&vRPyQA*jUf`;cRYLYjrK#-eY!Qp`oNkZeDu8W6&Z(x1p+P2WV}6 z$k1nly-iQ%XH(@4OH5=rR*wvyO8oDCXriBsxcm^my96?(K&F}9nYT0ShayTr^-I|QGd%S$86=)QW< z*59v1*7MIs({8D!BxFF6QeyNbVi(@gThX~+i3cjg&jii1CxBd36%1SkF7golw6@uc z!wLW6N$3~JJOAgg=oe!|EvWwE!Y$SjXaB!G_tI>0pQ&7SVC=QiAh3M%Dya>rMiD`m ziI>DF-;KD7$FwzLrdM*g>770t>SzzQt1$dnr`wwCo+%X~$G`w@+vIps<2K?$=qUhW zq9eDRbWTD^a>ynkARyqXYeH6koMt(6U)051+wFU;$J#%L4)smC(`z?I`=h1$_EkM? z`Y0#Iw#LTYPql2+_Bu~gn}1rhp%9zaMH@9ElY`))y#M<^=bc)4!6Itez0@T9CjL{; zUp%d44oH3x(1e#rgGZ;*^Tl1}YNOI(GpE}fyGjrG`v7h&dMwM#fMeD7?pL6PlLJtY zL7^@m-e@p!p|sZ#`}VCDY+$TfIg}jK#a;79i}yt29vhUB$aR^hmem;Q;;j^`eOHmg zr9C^5o$Bfx928WDfG;?nC*8X?YI&h|=C6n3UXTub@WwMkX0F*K*5N6Aert28ya3_u zBEfPcqLka(y&jSa*EJo7Qq2pt2^NA*_A)C=qyi5E5f96R-w4=z!E7khvTdVto&BcM zNg{F(28vyAe=8cdHUC8X?@w}+dsGs;sU&8u5hI1QPj0aWU#exWH?76gn><9RtVGSb z;ZARE)2p`MIMc0uCw$m2)MqVI7-A6F^v<6I-YLE11D%0pi8^>3JLtG}Id;rzi$To< z5>bOQ2$7hG74%jg&-yT&H$R*)Q6twS+A*t8_v1&g7hB}+eKVgnbYdF~Q(chzkK!;L zR}dR5jD7#!*UWXkWi&X^>CkZQbh~Cb2z;Fg=M6DY{ZJ%QNC>)~2ZAPyM&?H4?9<1_ zh9=1>l0E7CX9Ke*;We_q38&e&^w;Ah8s*irIxx92yaXlQHoELWuI`orrlrY5SN;L= zKozZ)zpY2VrgxB7C~VRm@Egg)u;{n08ko{Yk%WY&WG}5?>zz|!{ShgBX*5-RrkIm- z<aPh-iQXNmoegFL)ONA$P@T**ju~O zma_d4g3S_9VGmsrN}pOA$9q4QfC(8eQS?wmqA* zkFXFWT_S0Ptj_WqDf6>MIa#3lOp=8K;0=whuW$J+VkJP&FRiaiMXhZIuD^M!c}dR` zUw8xfq2|`Wr`ite!!Rxxf1<(IWa1aMHsaao;4EcoGk;qyn#Ay(+rx@O|J*6X;~%xGb>%(&BBI}pLo&tC-4;AL`ha?=>eY#~)gLy!gBskDqQPZLrF zbD4!LZfxCse7}O|&_}3Fnx^!^)YMU1&i~Lb^Q~2s6vt<3OfoYgoGY5FR7j5V(-kQO zJvFtNV@pdYr)x_~`!2G9^+CbGMV~k9YmL?~nX`J2)g#H51_v}gUBev5#-oAdM&A)G5c)DMs^aF1tgv@XnX>GBoSh03})a4T6{6w7br17G6e<1sZIf*Fy#UopdNhA(2^*;eWbL8KKWvK5QT_CJSRv^S_G=Bzo7jPl&$WnciljK^(%@uU~C6j7<#!Ed|f#10h4HOhB<>|*#u~N&crWSb zbi_oqIt;w$K?R54dsC|O@WH%*fx?_ApV|lFv_}Y?> z7w!y8(q!vt+rEe8Ac_s%0B-seU7K&3;TNgbk%jlc@scqz>N7R|{_Bg8V&cK}9E)j^ zZsTzAN=&?<8X6rr$6kb9xAI@BZ{-C< z3W^f5H|82kB%UBAcm(vsfW)Ev)+AzKPNE6Fz*qBQIBO+J9Mi z{5x;0WBYjIM;K4?KPz0`H?WEV@lBZx0A|3ypK#@_%JRvw77{Gtr}nAmha z7z;j&?z6dE&z&4|5rj>^Ba0IWvG?F^p@meizOL>S@Xxv&E{oYIa>ydAf2g4^O3DZ{ zPa|w!W)xD4n4s?iy5Sm&;R$+=p0KdAIgaFJGLC22^|XvINx)*h0SuZ@e>=3L$Oyt9 znai@WGFem2E4!!;{=xY&;XO7x{z|i9)cvi8p1UN`WLjP?Ba^i_)ne(7M5hKgvl0Md zg#IcbeXjy*0u?2iOtJ~CIal*EF9?XHlD)lsC?H;kU+(l-hKYvdm}yeGj$ZQ-aWGau z#ACK_W$cH?Pf{zd$W>r}tznvZ2q3NCynokr?wr5UmIMs5})=g1)&z!0;a-nQhfRS$UOd>fq1zVhW0XG zN;E28f%uyCa3;Pz22Y-;wg~qgioWs?-1Hh^>iRcW0^wG~baK_BoSgEglbY??c}Zw? zVy-(-(bRgoVuT34ie=yHr!fWFMLB|lgI|-!AdiC{0^48ANyqT5K*KJOCr2)zuwkFm z9g$!6X=~7T*P$CmqQPlrCxFOrfmALI8b}&jJN~vY4}}PlX~)xulwb0P*cX?x 1: + raise NotImplementedError("FITC does not support vector-valued function") + + # make sure the noise is not hetero + eta2 = np.array(self.options["noise0"]) # likelihood.gaussian_variance(Y_norma) + if eta2.size > 1: + raise NotImplementedError("FITC does not support heteroscedastic noise") + + return super()._new_train() + + # overload kriging based implementation + def _reduced_likelihood_function(self, theta): + X = self.training_points[None][0][0] + Y = self.training_points[None][0][1] + Z = self.Z + + if self.options["eval_noise"]: + sigma2 = theta[-1] + theta = theta[0:-1] + else: + sigma2 = self.options["noise0"] + + nugget = self.options["nugget"] + + if self.options["method"] == "VFE": + likelihood, w_vec, w_inv = self._vfe(X, Y, Z, theta, sigma2, nugget) + else: + likelihood, w_vec, w_inv = self._fitc(X, Y, Z, theta, sigma2, nugget) + + self.woodbury_data["vec"] = w_vec + self.woodbury_data["inv"] = w_inv + + params = { + "theta": theta, + "sigma2": sigma2, + } + + return likelihood, params + + def _compute_K(self, A: np.ndarray, B: np.ndarray, theta, sigma2): + """ + Compute the covariance matrix K between A and B + """ + # Compute pairwise componentwise L1-distances between A and B + dx = differences(A, B) + d = self._componentwise_distance(dx) + # Compute the correlation vector r and matrix R + r = self._correlation_types[self.options["corr"]](theta, d) + R = r.reshape(A.shape[0], B.shape[0]) + # Compute the covariance matrix K + K = sigma2 * R + return K + + def _fitc(self, X, Y, Z, theta, sigma2, nugget): + """ + FITC method implementation. + + See also https://github.com/SheffieldML/GPy/blob/9ec3e50e3b96a10db58175a206ed998ec5a8e3e3/GPy/inference/latent_function_inference/fitc.py + """ + + # Compute: diag(Knn), Kmm and Kmn + Knn = np.full(self.nt, sigma2) + Kmm = self._compute_K(Z, Z, theta, sigma2) + np.eye(self.nz) * nugget + Kmn = self._compute_K(Z, X, theta, sigma2) + + # Compute (lower) Cholesky decomposition: Kmm = U U^T + U = linalg.cholesky(Kmm, lower=True) + + # Compute (upper) Cholesky decomposition: Qnn = V^T V + Ui = linalg.inv(U) + V = Ui @ Kmn + + # Assumption on the gaussian noise on training outputs + eta2 = np.array(self.options["noise0"]) + + # Compute diagonal correction: nu = Knn_diag - Qnn_diag + \eta^2 + nu = Knn - np.sum(np.square(V), 0) + eta2 + # Compute beta, the effective noise precision + beta = 1.0 / nu + + # Compute (lower) Cholesky decomposition: A = I + V diag(beta) V^T = L L^T + A = np.eye(self.nz) + V @ np.diag(beta) @ V.T + L = linalg.cholesky(A, lower=True) + Li = linalg.inv(L) + + # Compute a and b + a = np.einsum("ij,i->ij", Y, beta) # avoid reshape for mat-vec multiplication + b = Li @ V @ a + + # Compute marginal log-likelihood + likelihood = -0.5 * ( + # num_data * np.log(2.0 * np.pi) # constant term ignored in reduced likelihood + +np.sum(np.log(nu)) + + 2.0 * np.sum(np.log(np.diag(L))) + + a.T @ Y + - np.einsum("ij,ij->", b, b) + ) + + # Store Woodbury vectors for prediction step + LiUi = Li @ Ui + LiUiT = LiUi.T + woodbury_vec = LiUiT @ b + woodbury_inv = Ui.T @ Ui - LiUiT @ LiUi + + return likelihood, woodbury_vec, woodbury_inv + + def _vfe(self, X, Y, Z, theta, sigma2, nugget): + """ + VFE method implementation. + + See also https://github.com/SheffieldML/GPy/blob/9ec3e50e3b96a10db58175a206ed998ec5a8e3e3/GPy/inference/latent_function_inference/fitc.py + """ + + # Assume zero mean function + mean = 0 + Y -= mean + + # Compute: diag(Knn), Kmm and Kmn + Kmm = self._compute_K(Z, Z, theta, sigma2) + np.eye(self.nz) * nugget + Kmn = self._compute_K(Z, X, theta, sigma2) + + # Compute (lower) Cholesky decomposition: Kmm = U U^T + U = linalg.cholesky(Kmm, lower=True) + + # Compute (upper) Cholesky decomposition: Qnn = V^T V + Ui = linalg.inv(U) + V = Ui @ Kmn + + # Compute beta, the effective noise precision + beta = 1.0 / np.fmax(self.options["noise0"], nugget) + + # Compute A = beta * V @ V.T + A = beta * V @ V.T + + # Compute (lower) Cholesky decomposition: B = I + A = L L^T + B = np.eye(self.nz) + A + L = linalg.cholesky(B, lower=True) + Li = linalg.inv(L) + + # Compute b + b = beta * Li @ V @ Y + + # Compute log-marginal likelihood + likelihood = -0.5 * ( + # self.nt * np.log(2.0 * np.pi) # constant term ignored in reduced likelihood + -self.nt * np.log(beta) + + 2.0 * np.sum(np.log(np.diag(L))) + + beta * np.einsum("ij,ij->", Y, Y) + - b.T @ b + + self.nt * beta * sigma2 + - np.trace(A) + ) + + # Store Woodbury vectors for prediction step + LiUi = Li @ Ui + Bi = np.eye(self.nz) + Li.T @ Li + woodbury_vec = LiUi.T @ b + woodbury_inv = Ui.T @ Bi @ Ui + + return likelihood, woodbury_vec, woodbury_inv + + # overload kriging based implementation + def _predict_values(self, x: np.ndarray, is_acting=None) -> np.ndarray: + """ + Evaluates the model at a set of points using the Woodbury vector. + """ + Kx = self._compute_K( + x, self.Z, self.optimal_par["theta"], self.optimal_par["sigma2"] + ) + mu = Kx @ self.woodbury_data["vec"] + return mu + + # overload kriging based implementation + def _predict_variances(self, x: np.ndarray, is_acting=None) -> np.ndarray: + """ + Evaluates the model at a set of points using the inverse Woodbury vector. + """ + Kx = self._compute_K( + self.Z, x, self.optimal_par["theta"], self.optimal_par["sigma2"] + ) + Kxx = np.full(x.shape[0], self.optimal_par["sigma2"]) + var = (Kxx - np.sum(np.dot(self.woodbury_data["inv"].T, Kx) * Kx, 0))[:, None] + var = np.clip(var, 1e-15, np.inf) + var += self.options["noise0"] + return var diff --git a/smt/surrogate_models/tests/test_sgp.py b/smt/surrogate_models/tests/test_sgp.py new file mode 100644 index 000000000..2ca5822ba --- /dev/null +++ b/smt/surrogate_models/tests/test_sgp.py @@ -0,0 +1,60 @@ +import numpy as np +import matplotlib.pyplot as plt +import unittest + +from smt.surrogate_models import SGP +from smt.utils.sm_test_case import SMTestCase +from smt.utils import compute_rms_error + + +def f_obj(x): + return ( + np.sin(3 * np.pi * x) + + 0.3 * np.cos(9 * np.pi * x) + + 0.5 * np.sin(7 * np.pi * x) + ) + + +class TestSGP(SMTestCase): + def setUp(self): + rng = np.random.RandomState(1) + + # Generate training data + N_train = 200 + self.eta = [0.01] + gaussian_noise = rng.normal(loc=0.0, scale=np.sqrt(self.eta), size=(N_train, 1)) + self.Xtrain = 2 * np.random.rand(N_train, 1) - 1 + self.Ytrain = f_obj(self.Xtrain) + gaussian_noise + + # Generate test data (noise-free) + N_test = 50 + self.Xtest = 2 * rng.rand(N_test, 1) - 1 + self.Ytest = f_obj(self.Xtest).reshape(-1, 1) + + # Pick inducing points at random + N_inducing = 30 + self.Z = 2 * rng.rand(N_inducing, 1) - 1 + + def test_fitc(self): + # Assume we know the variance eta of our noisy input data + sgp = SGP(noise0=self.eta) + sgp.set_training_values(self.Xtrain, self.Ytrain) + sgp.set_inducing_inputs(Z=self.Z) + sgp.train() + + Ypred = sgp.predict_values(self.Xtest) + self.assert_error(Ypred, self.Ytest, atol=0.02, rtol=0.1) + + def test_vfe(self): + # Assume we know the variance eta of our noisy input data + sgp = SGP(noise0=self.eta, method="VFE") + sgp.set_training_values(self.Xtrain, self.Ytrain) + sgp.set_inducing_inputs(Z=self.Z) + sgp.train() + + Ypred = sgp.predict_values(self.Xtest) + self.assert_error(Ypred, self.Ytest, atol=0.05, rtol=0.1) + + +if __name__ == "__main__": + unittest.main() diff --git a/smt/surrogate_models/tests/test_surrogate_model_examples.py b/smt/surrogate_models/tests/test_surrogate_model_examples.py index b6adf44ed..5b892fc36 100644 --- a/smt/surrogate_models/tests/test_surrogate_model_examples.py +++ b/smt/surrogate_models/tests/test_surrogate_model_examples.py @@ -620,6 +620,113 @@ def fun(x): fig.subplots_adjust(top=0.74) plt.show() + def test_sgp_fitc(self): + import numpy as np + import matplotlib.pyplot as plt + + from smt.surrogate_models import SGP + + def f_obj(x): + import numpy as np + + return ( + np.sin(3 * np.pi * x) + + 0.3 * np.cos(9 * np.pi * x) + + 0.5 * np.sin(7 * np.pi * x) + ) + + # random generator for reproducibility + rng = np.random.RandomState(0) + + # Generate training data + nt = 200 + # Variance of the gaussian noise on our trainingg data + eta2 = [0.01] + gaussian_noise = rng.normal(loc=0.0, scale=np.sqrt(eta2), size=(nt, 1)) + xt = 2 * rng.rand(nt, 1) - 1 + yt = f_obj(xt) + gaussian_noise + + # Pick inducing points randomly in training data + n_inducing = 30 + random_idx = rng.permutation(nt)[:n_inducing] + Z = xt[random_idx].copy() + + sgp = SGP(noise0=eta2) # Assume here we have an idea of the variance eta2 + sgp.set_training_values(xt, yt) + sgp.set_inducing_inputs(Z=Z) + # sgp.set_inducing_inputs() # When Z not specified inducing points are picked randomly in traing data + sgp.train() + + x = np.linspace(-1, 1, nt + 1).reshape(-1, 1) + y = f_obj(x) + hat_y = sgp.predict_values(x) + var = sgp.predict_variances(x) + + # plot prediction + plt.figure(figsize=(14, 6)) + plt.plot(x, y, "C1-", label="target function") + plt.scatter(xt, yt, marker="o", s=10, label="observed data") + plt.plot(x, hat_y, "k-", label="Sparse GP") + plt.plot(x, hat_y - 3 * np.sqrt(var), "k--") + plt.plot(x, hat_y + 3 * np.sqrt(var), "k--", label="99% CI") + plt.plot(Z, -2.9 * np.ones_like(Z), "r|", mew=2, label="inducing points") + plt.ylim([-3, 3]) + plt.legend(loc=0) + plt.show() + + def test_sgp_vfe(self): + import numpy as np + import matplotlib.pyplot as plt + + from smt.surrogate_models import SGP + + def f_obj(x): + import numpy as np + + return ( + np.sin(3 * np.pi * x) + + 0.3 * np.cos(9 * np.pi * x) + + 0.5 * np.sin(7 * np.pi * x) + ) + + # random generator for reproducibility + rng = np.random.RandomState(42) + + # Generate training data + nt = 200 + # Variance of the gaussian noise on our trainingg data + eta2 = [0.01] + gaussian_noise = rng.normal(loc=0.0, scale=np.sqrt(eta2), size=(nt, 1)) + xt = 2 * rng.rand(nt, 1) - 1 + yt = f_obj(xt) + gaussian_noise + + # Pick inducing points randomly in training data + n_inducing = 30 + random_idx = rng.permutation(nt)[:n_inducing] + Z = xt[random_idx].copy() + + sgp = SGP(noise0=eta2, method="VFE") + sgp.set_training_values(xt, yt) + sgp.set_inducing_inputs(Z=Z) + sgp.train() + + x = np.linspace(-1, 1, nt + 1).reshape(-1, 1) + y = f_obj(x) + hat_y = sgp.predict_values(x) + var = sgp.predict_variances(x) + + # plot prediction + plt.figure(figsize=(14, 6)) + plt.plot(x, y, "C1-", label="target function") + plt.scatter(xt, yt, marker="o", s=10, label="observed data") + plt.plot(x, hat_y, "k-", label="Sparse GP") + plt.plot(x, hat_y - 3 * np.sqrt(var), "k--") + plt.plot(x, hat_y + 3 * np.sqrt(var), "k--", label="99% CI") + plt.plot(Z, -2.9 * np.ones_like(Z), "r|", mew=2, label="inducing points") + plt.ylim([-3, 3]) + plt.legend(loc=0) + plt.show() + if __name__ == "__main__": unittest.main() From dde86f5ceeb8cf3ed5d6dedeea0b466375a4b445 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20Charayron?= <70903915+RemyCharayron@users.noreply.github.com> Date: Fri, 13 Oct 2023 16:46:52 +0200 Subject: [PATCH 07/13] add MFK and MFKPLS compatibility with mixed variables (#467) * add MFK and MFKPLS compatibility with mixed variables * black application * add a test in check_params that raises an exception if another kernel than CR is selected * if not(self.is_continuous): ... else ... modified by: if self.is_continuous: ... else ... * Black formatting --------- Co-authored-by: relf --- smt/applications/mfk.py | 371 ++++++- smt/applications/mixed_integer.py | 24 +- .../tests/test_mfk_mfkpls_mixed.py | 990 ++++++++++++++++++ smt/surrogate_models/krg_based.py | 55 +- 4 files changed, 1391 insertions(+), 49 deletions(-) create mode 100644 smt/applications/tests/test_mfk_mfkpls_mixed.py diff --git a/smt/applications/mfk.py b/smt/applications/mfk.py index f54fb9b70..b6bf8538e 100644 --- a/smt/applications/mfk.py +++ b/smt/applications/mfk.py @@ -17,15 +17,24 @@ from sklearn.cross_decomposition import PLSRegression as pls -from smt.surrogate_models.krg_based import KrgBased +from smt.surrogate_models.krg_based import ( + KrgBased, + MixIntKernelType, +) + from smt.sampling_methods import LHS from smt.utils.kriging import ( cross_distances, componentwise_distance, differences, + gower_componentwise_distances, + cross_levels, + compute_X_cont, ) from smt.utils.misc import standardization +from smt.surrogate_models.krg_based import compute_n_param + class NestedLHS(object): def __init__(self, nlevel, xlimits, random_state=None): @@ -130,6 +139,10 @@ def _initialize(self): ) self.name = "MFK" + self.X2_norma = {} + self.X2_offset = {} + self.X2_scale = {} + def _differences(self, X, Y): """ Compute the distances @@ -182,6 +195,8 @@ def _new_train(self): Overrides KrgBased implementation Trains the Multi-Fidelity model """ + self._corr_params = None + self._new_train_init() theta0 = self.options["theta0"].copy() noise0 = self.options["noise0"].copy() @@ -226,9 +241,28 @@ def _new_train_init(self): X = self.X y = self.y - _, _, self.X_offset, self.y_mean, self.X_scale, self.y_std = standardization( - np.concatenate(xt, axis=0), np.concatenate(yt, axis=0) - ) + if self.is_continuous: + ( + _, + _, + self.X_offset, + self.y_mean, + self.X_scale, + self.y_std, + ) = standardization(np.concatenate(xt, axis=0), np.concatenate(yt, axis=0)) + self.cat_features = [False] * np.shape(np.concatenate(xt, axis=0))[1] + else: + ( + _, + _, + self.X_offset, + self.y_mean, + self.X_scale, + self.y_std, + ) = standardization(np.concatenate(xt, axis=0), np.concatenate(yt, axis=0)) + _, self.cat_features = compute_X_cont( + np.concatenate(xt, axis=0), self.design_space + ) nlevel = self.nlvl @@ -244,6 +278,16 @@ def _new_train_init(self): self.X_norma_all = [(x - self.X_offset) / self.X_scale for x in X] self.y_norma_all = [(f - self.y_mean) / self.y_std for f in y] + self.X_norma_all = [(x - self.X_offset) / self.X_scale for x in X] + + self.y_norma_all = [(f - self.y_mean) / self.y_std for f in y] + + if not (self.is_continuous): + x2t, _ = self.design_space.unfold_x(np.concatenate(xt, axis=0)) + _, _, self.X2_offset, _, self.X2_scale, _ = standardization( + x2t, np.concatenate(yt, axis=0) + ) + def _new_train_iteration(self, lvl): n_samples = self.nt_all self.options["noise0"] = np.array([self.options["noise0"][lvl]]).flatten() @@ -287,7 +331,20 @@ def _new_train_iteration(self, lvl): self.optimal_noise_all[lvl] = self.optimal_noise # Calculate matrix of distances D between samples - self.D_all[lvl] = cross_distances(self.X_norma) + if self.is_continuous: + self.D_all[lvl] = cross_distances(self.X_norma) + else: + _, is_acting = self.design_space.correct_get_acting(self.X[lvl]) + D_lvl, ij_lvl, X = gower_componentwise_distances( + X=self.X[lvl], + x_is_acting=is_acting, + design_space=self.design_space, + hierarchical_kernel=self.options["hierarchical_kernel"], + ) + self.Lij, self.n_levels = cross_levels( + X=self.X[lvl], ij=ij_lvl, design_space=self.design_space + ) + self.D_all[lvl] = D_lvl, ij_lvl # Regression matrix and parameters self.F_all[lvl] = self._regression_types[self.options["poly"]](self.X_norma) @@ -297,18 +354,34 @@ def _new_train_iteration(self, lvl): if lvl > 0: F_rho = self._regression_types[self.options["rho_regr"]](self.X_norma) self.q_all[lvl] = F_rho.shape[1] - self.F_all[lvl] = np.hstack( - ( - F_rho - * np.dot( - self._predict_intermediate_values( - self.X_norma, lvl, descale=False + + if self.is_continuous: + self.F_all[lvl] = np.hstack( + ( + F_rho + * np.dot( + self._predict_intermediate_values( + self.X_norma, lvl, descale=False + ), + np.ones((1, self.q_all[lvl])), ), - np.ones((1, self.q_all[lvl])), - ), - self.F_all[lvl], + self.F_all[lvl], + ) ) - ) + else: + self.F_all[lvl] = np.hstack( + ( + F_rho + * np.dot( + self._predict_intermediate_values( + self.X[lvl], lvl, descale=False + ), + np.ones((1, self.q_all[lvl])), + ), + self.F_all[lvl], + ) + ) + else: self.q_all[lvl] = 0 @@ -393,18 +466,65 @@ def _predict_intermediate_values(self, X, lvl, descale=True): # Calculate kriging mean and variance at level 0 mu = np.zeros((n_eval, lvl)) - if descale: + + if not (self.is_continuous): + X_usc = X + if descale and self.is_continuous: X = (X - self.X_offset) / self.X_scale + f = self._regression_types[self.options["poly"]](X) f0 = self._regression_types[self.options["poly"]](X) - dx = self._differences(X, Y=self.X_norma_all[0]) - d = self._componentwise_distance(dx) - beta = self.optimal_par[0]["beta"] - r_ = self._correlation_types[self.options["corr"]]( - self.optimal_theta[0], d - ).reshape(n_eval, self.nt_all[0]) + if self.is_continuous: + dx = self._differences(X, Y=self.X_norma_all[0]) + d = self._componentwise_distance(dx) + r_ = self._correlation_types[self.options["corr"]]( + self.optimal_theta[0], d + ).reshape(n_eval, self.nt_all[0]) + else: + _, x_is_acting = self.design_space.correct_get_acting(X_usc) + _, y_is_acting = self.design_space.correct_get_acting(self.X[0]) + dx = gower_componentwise_distances( + X=X_usc, + x_is_acting=x_is_acting, + design_space=self.design_space, + hierarchical_kernel=self.options["hierarchical_kernel"], + y=np.copy(self.X[0]), + y_is_acting=y_is_acting, + ) + d = componentwise_distance( + dx, + self.options["corr"], + self.nx, + power=self.options["pow_exp_power"], + theta=None, + return_derivative=False, + ) + _, ij = cross_distances(X_usc, self.X[0]) + Lij, _ = cross_levels( + X=X_usc, ij=ij, design_space=self.design_space, y=self.X[0] + ) + self.ij = ij + if self.options["categorical_kernel"] == MixIntKernelType.CONT_RELAX: + Xpred, _ = self.design_space.unfold_x(X_usc) + Xpred_norma = (Xpred - self.X2_offset) / self.X2_scale + # Get pairwise componentwise L1-distances to the input training set + dx = differences(Xpred_norma, Y=self.X2_norma[str(0)].copy()) + r_ = self._matrix_data_corr( + corr=self.options["corr"], + design_space=self.design_space, + power=self.options["pow_exp_power"], + theta=self.optimal_theta[0], + theta_bounds=self.options["theta_bounds"], + dx=dx, + Lij=Lij, + n_levels=self.n_levels, + cat_features=self.cat_features, + cat_kernel=self.options["categorical_kernel"], + x=X_usc, + ).reshape(n_eval, self.nt_all[0]) + gamma = self.optimal_par[0]["gamma"] # Scaled predictor @@ -413,11 +533,56 @@ def _predict_intermediate_values(self, X, lvl, descale=True): # Calculate recursively kriging mean and variance at level i for i in range(1, lvl): g = self._regression_types[self.options["rho_regr"]](X) - dx = self._differences(X, Y=self.X_norma_all[i]) - d = self._componentwise_distance(dx) - r_ = self._correlation_types[self.options["corr"]]( - self.optimal_theta[i], d - ).reshape(n_eval, self.nt_all[i]) + + if self.is_continuous: + dx = self._differences(X, Y=self.X_norma_all[i]) + d = self._componentwise_distance(dx) + r_ = self._correlation_types[self.options["corr"]]( + self.optimal_theta[i], d + ).reshape(n_eval, self.nt_all[i]) + else: + _, x_is_acting = self.design_space.correct_get_acting(X_usc) + _, y_is_acting = self.design_space.correct_get_acting(self.X[i]) + dx = gower_componentwise_distances( + X_usc, + x_is_acting=x_is_acting, + design_space=self.design_space, + hierarchical_kernel=self.options["hierarchical_kernel"], + y=np.copy(self.X[i]), + y_is_acting=y_is_acting, + ) + d = componentwise_distance( + dx, + self.options["corr"], + self.nx, + power=self.options["pow_exp_power"], + theta=None, + return_derivative=False, + ) + _, ij = cross_distances(X_usc, self.X[i]) + Lij, _ = cross_levels( + X=X_usc, ij=ij, design_space=self.design_space, y=self.X[i] + ) + self.ij = ij + if self.options["categorical_kernel"] == MixIntKernelType.CONT_RELAX: + Xpred, _ = self.design_space.unfold_x(X_usc) + Xpred_norma = (Xpred - self.X2_offset) / self.X2_scale + # Get pairwise componentwise L1-distances to the input training set + dx = differences(Xpred_norma, Y=self.X2_norma[str(i)].copy()) + r_ = self._matrix_data_corr( + corr=self.options["corr"], + design_space=self.design_space, + power=self.options["pow_exp_power"], + theta=self.optimal_theta[i], + theta_bounds=self.options["theta_bounds"], + dx=dx, + Lij=Lij, + n_levels=self.n_levels, + cat_features=self.cat_features, + cat_kernel=self.options["categorical_kernel"], + x=X_usc, + ).reshape(n_eval, self.nt_all[i]) + f = np.vstack((g.T * mu[:, i - 1], f0.T)) beta = self.optimal_par[i]["beta"] gamma = self.optimal_par[i]["gamma"] @@ -463,7 +628,8 @@ def _predict_variances(self, X: np.ndarray, is_acting=None) -> np.ndarray: """ return self.predict_variances_all_levels(X)[0][:, -1] - def predict_variances_all_levels(self, X): + def predict_variances_all_levels(self, X, is_acting=None): + # def predict_variances_all_levels(self, X): """ Evaluates the model at a set of points. @@ -483,14 +649,14 @@ def predict_variances_all_levels(self, X): n_eval, n_features_X = X.shape # if n_features_X != self.n_features: # raise ValueError("Design must be an array of n_features columns.") + X = (X - self.X_offset) / self.X_scale # Calculate kriging mean and variance at level 0 mu = np.zeros((n_eval, nlevel)) + f = self._regression_types[self.options["poly"]](X) f0 = self._regression_types[self.options["poly"]](X) - dx = self._differences(X, Y=self.X_norma_all[0]) - d = self._componentwise_distance(dx) # Get regression function and correlation F = self.F_all[0] @@ -498,10 +664,56 @@ def predict_variances_all_levels(self, X): beta = self.optimal_par[0]["beta"] Ft = solve_triangular(C, F, lower=True) - # yt = solve_triangular(C, self.y_norma_all[0], lower=True) - r_ = self._correlation_types[self.options["corr"]]( - self.optimal_theta[0], d - ).reshape(n_eval, self.nt_all[0]) + + if self.is_continuous: + dx = self._differences(X, Y=self.X_norma_all[0]) + d = self._componentwise_distance(dx) + r_ = self._correlation_types[self.options["corr"]]( + self.optimal_theta[0], d + ).reshape(n_eval, self.nt_all[0]) + else: + _, y_is_acting = self.design_space.correct_get_acting(self.X[0]) + _, x_is_acting = self.design_space.correct_get_acting(X) + dx = gower_componentwise_distances( + X, + x_is_acting=x_is_acting, + design_space=self.design_space, + hierarchical_kernel=self.options["hierarchical_kernel"], + y=np.copy(self.X[0]), + y_is_acting=y_is_acting, + ) + d = componentwise_distance( + dx, + self.options["corr"], + self.nx, + power=self.options["pow_exp_power"], + theta=None, + return_derivative=False, + ) + _, ij = cross_distances(X, self.X[0]) + Lij, _ = cross_levels( + X=X, ij=ij, design_space=self.design_space, y=self.X[0] + ) + self.ij = ij + if self.options["categorical_kernel"] == MixIntKernelType.CONT_RELAX: + Xpred, _ = self.design_space.unfold_x(X) + Xpred_norma = (Xpred - self.X2_offset) / self.X2_scale + # Get pairwise componentwise L1-distances to the input training set + dx = differences(Xpred_norma, Y=self.X2_norma[str(0)].copy()) + r_ = self._matrix_data_corr( + corr=self.options["corr"], + design_space=self.design_space, + power=self.options["pow_exp_power"], + theta=self.optimal_theta[0], + theta_bounds=self.options["theta_bounds"], + dx=dx, + Lij=Lij, + n_levels=self.n_levels, + cat_features=self.cat_features, + cat_kernel=self.options["categorical_kernel"], + x=X, + ).reshape(n_eval, self.nt_all[0]) + gamma = self.optimal_par[0]["gamma"] # Scaled predictor @@ -525,12 +737,58 @@ def predict_variances_all_levels(self, X): for i in range(1, nlevel): F = self.F_all[i] C = self.optimal_par[i]["C"] + g = self._regression_types[self.options["rho_regr"]](X) - dx = self._differences(X, Y=self.X_norma_all[i]) - d = self._componentwise_distance(dx) - r_ = self._correlation_types[self.options["corr"]]( - self.optimal_theta[i], d - ).reshape(n_eval, self.nt_all[i]) + + if self.is_continuous: + dx = self._differences(X, Y=self.X_norma_all[i]) + d = self._componentwise_distance(dx) + r_ = self._correlation_types[self.options["corr"]]( + self.optimal_theta[i], d + ).reshape(n_eval, self.nt_all[i]) + else: + _, y_is_acting = self.design_space.correct_get_acting(self.X[i]) + _, x_is_acting = self.design_space.correct_get_acting(X) + dx = gower_componentwise_distances( + X, + x_is_acting=x_is_acting, + design_space=self.design_space, + hierarchical_kernel=self.options["hierarchical_kernel"], + y=np.copy(self.X[i]), + y_is_acting=y_is_acting, + ) + d = componentwise_distance( + dx, + self.options["corr"], + self.nx, + power=self.options["pow_exp_power"], + theta=None, + return_derivative=False, + ) + _, ij = cross_distances(X, self.X[i]) + Lij, _ = cross_levels( + X=X, ij=ij, design_space=self.design_space, y=self.X[i] + ) + self.ij = ij + if self.options["categorical_kernel"] == MixIntKernelType.CONT_RELAX: + Xpred, _ = self.design_space.unfold_x(X) + Xpred_norma = (Xpred - self.X2_offset) / self.X2_scale + # Get pairwise componentwise L1-distances to the input training set + dx = differences(Xpred_norma, Y=self.X2_norma[str(i)].copy()) + r_ = self._matrix_data_corr( + corr=self.options["corr"], + design_space=self.design_space, + power=self.options["pow_exp_power"], + theta=self.optimal_theta[i], + theta_bounds=self.options["theta_bounds"], + dx=dx, + Lij=Lij, + n_levels=self.n_levels, + cat_features=self.cat_features, + cat_kernel=self.options["categorical_kernel"], + x=X, + ).reshape(n_eval, self.nt_all[i]) + f = np.vstack((g.T * mu[:, i - 1], f0.T)) Ft = solve_triangular(C, F, lower=True) @@ -695,25 +953,48 @@ def _check_param(self): "MFKPLSK only works with a squared exponential kernel (until we prove the contrary)" ) + n_param = d + + if self.options["categorical_kernel"] is not None: + if self.options["categorical_kernel"] == MixIntKernelType.CONT_RELAX: + n_comp = self.options["n_comp"] if "n_comp" in self.options else None + mat_dim = ( + self.options["cat_kernel_comps"] + if "cat_kernel_comps" in self.options + else None + ) + + n_param = compute_n_param( + self.design_space, + self.options["categorical_kernel"], + d, + n_comp, + mat_dim, + ) + else: + raise ValueError( + "Only the continuous relaxation kernel is available with multi-fidelity" + ) + if isinstance(self.options["theta0"], np.ndarray): - if self.options["theta0"].shape != (self.nlvl, d): + if self.options["theta0"].shape != (self.nlvl, n_param): raise ValueError( "the dimensions of theta0 %s should coincide to the number of dim %s" - % (self.options["theta0"].shape, (self.nlvl, d)) + % (self.options["theta0"].shape, (self.nlvl, n_param)) ) else: - if len(self.options["theta0"]) != d: + if len(self.options["theta0"]) != n_param: if len(self.options["theta0"]) == 1: - self.options["theta0"] *= np.ones((self.nlvl, d)) + self.options["theta0"] *= np.ones((self.nlvl, n_param)) elif len(self.options["theta0"]) == self.nlvl: self.options["theta0"] = np.array(self.options["theta0"]).reshape( -1, 1 ) - self.options["theta0"] *= np.ones((1, d)) + self.options["theta0"] *= np.ones((1, n_param)) else: raise ValueError( "the length of theta0 (%s) should be equal to the number of dim (%s) or levels of fidelity (%s)." - % (len(self.options["theta0"]), d, self.nlvl) + % (len(self.options["theta0"]), n_param, self.nlvl) ) else: self.options["theta0"] *= np.ones((self.nlvl, 1)) diff --git a/smt/applications/mixed_integer.py b/smt/applications/mixed_integer.py index eafb16e9e..e9076c274 100644 --- a/smt/applications/mixed_integer.py +++ b/smt/applications/mixed_integer.py @@ -134,7 +134,7 @@ def set_training_values(self, xt, yt, name=None) -> None: else: xt_apply = xt - super().set_training_values(xt_apply, yt) + super().set_training_values(xt_apply, yt, name) self._surrogate.set_training_values(xt_apply, yt, name) def update_training_values(self, yt, name=None): @@ -148,10 +148,18 @@ def predict_values(self, x: np.ndarray) -> np.ndarray: x_corr, is_acting = self._get_x_for_surrogate_model(x) return self._surrogate.predict_values(x_corr) + def _predict_intermediate_values(self, x: np.ndarray, lvl) -> np.ndarray: + x_corr, is_acting = self._get_x_for_surrogate_model(x) + return self._surrogate._predict_intermediate_values(x_corr, lvl) + def predict_variances(self, x: np.ndarray) -> np.ndarray: x_corr, is_acting = self._get_x_for_surrogate_model(x) return self._surrogate.predict_variances(x_corr) + def predict_variances_all_levels(self, x: np.ndarray) -> np.ndarray: + x_corr, is_acting = self._get_x_for_surrogate_model(x) + return self._surrogate.predict_variances_all_levels(x_corr) + def _get_x_for_surrogate_model(self, x): xp = ensure_2d_array(x, "xp") @@ -238,7 +246,7 @@ def set_training_values(self, xt, yt, name=None, is_acting=None): else: xt_apply, is_acting_apply = xt, is_acting - super().set_training_values(xt_apply, yt, is_acting=is_acting_apply) + super().set_training_values(xt_apply, yt, name, is_acting=is_acting_apply) self._surrogate.set_training_values( xt_apply, yt, name, is_acting=is_acting_apply ) @@ -254,10 +262,22 @@ def predict_values(self, x: np.ndarray, is_acting=None) -> np.ndarray: x_corr, is_acting = self._get_x_for_surrogate_model(x) return self._surrogate.predict_values(x_corr, is_acting=is_acting) + def _predict_intermediate_values( + self, x: np.ndarray, lvl, is_acting=None + ) -> np.ndarray: + x_corr, is_acting = self._get_x_for_surrogate_model(x) + return self._surrogate._predict_intermediate_values( + x_corr, lvl, is_acting=is_acting + ) + def predict_variances(self, x: np.ndarray, is_acting=None) -> np.ndarray: x_corr, is_acting = self._get_x_for_surrogate_model(x) return self._surrogate.predict_variances(x_corr, is_acting=is_acting) + def predict_variances_all_levels(self, x: np.ndarray, is_acting=None) -> np.ndarray: + x_corr, is_acting = self._get_x_for_surrogate_model(x) + return self._surrogate.predict_variances_all_levels(x_corr, is_acting=is_acting) + def _get_x_for_surrogate_model(self, x): xp = ensure_2d_array(x, "xp") diff --git a/smt/applications/tests/test_mfk_mfkpls_mixed.py b/smt/applications/tests/test_mfk_mfkpls_mixed.py new file mode 100644 index 000000000..ccbb5587f --- /dev/null +++ b/smt/applications/tests/test_mfk_mfkpls_mixed.py @@ -0,0 +1,990 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +Created on Fri Oct 6 14:47:08 2023 + +@author: rcharayr +""" + +import unittest +import numpy as np +import matplotlib +import itertools + +matplotlib.use("Agg") + + +import numpy.linalg as npl +import matplotlib.pyplot as plt + +from smt.applications.mfkpls import MFKPLS +from smt.applications.mfk import MFK + +from smt.applications.mixed_integer import ( + MixedIntegerContext, + MixedIntegerSamplingMethod, + MixedIntegerKrigingModel, + MixedIntegerSurrogateModel, +) + +from smt.sampling_methods import LHS + +from smt.surrogate_models import ( + KRG, + KPLS, + QP, + MixIntKernelType, + MixHrcKernelType, +) + +import warnings + +warnings.filterwarnings("ignore") + +from smt.utils.design_space import ( + DesignSpace, + FloatVariable, + IntegerVariable, + OrdinalVariable, + CategoricalVariable, +) + + +class TestMFKmixed(unittest.TestCase): + # useful functions (g and h) + def g_ZDT(self, x): + x0 = x[0] + x1 = x[1] + x2 = x[2] + x3 = x[3] + x4 = x[4] + if x[5] == 0: # 0 -> blue + x5 = 0.1 + if x[5] == 1: # 1 -> red + x5 = 0.5 + if x[5] == 2: # 2 -> green + x5 = 0.75 + + out = 1 + (9 / (6 - 1)) * (x1 + x2 + x3 + x4 + x5) + return out + + def g_DTLZ5(self, x): + x0 = x[0] + x1 = x[1] + x2 = x[2] + x3 = x[3] + x4 = x[4] + if x[5] == 0: # 0 -> blue + x5 = 0.1 + if x[5] == 1: # 1 -> red + x5 = 0.5 + if x[5] == 2: # 2 -> green + x5 = 0.75 + + out = ( + (x1 - 0.5) ** 2 + + (x2 - 0.5) ** 2 + + (x3 - 0.5) ** 2 + + (x4 - 0.5) ** 2 + + (x5 - 0.5) ** 2 + ) + return out + + def h_ZDT1(self, x): + x0 = x[0] + x1 = x[1] + x2 = x[2] + x3 = x[3] + x4 = x[4] + if x[5] == 0: # 0 -> blue + x5 = 0.1 + if x[5] == 1: # 1 -> red + x5 = 0.5 + if x[5] == 2: # 2 -> green + x5 = 0.75 + + out = 1 - np.sqrt(x0 / self.g_ZDT(x)) + return out + + def h_ZDT2(self, x): + x0 = x[0] + x1 = x[1] + x2 = x[2] + x3 = x[3] + x4 = x[4] + if x[5] == 0: # 0 -> blue + x5 = 0.1 + if x[5] == 1: # 1 -> red + x5 = 0.5 + if x[5] == 2: # 2 -> green + x5 = 0.75 + + out = 1 - (x0 / self.g_ZDT(x)) ** 2 + return out + + def h_ZDT3(self, x): + x0 = x[0] + x1 = x[1] + x2 = x[2] + x3 = x[3] + x4 = x[4] + if x[5] == 0: # 0 -> blue + x5 = 0.1 + if x[5] == 1: # 1 -> red + x5 = 0.5 + if x[5] == 2: # 2 -> green + x5 = 0.75 + + out = ( + 1 + - np.sqrt(x0 / self.g_ZDT(x)) + - (x0 / self.g_ZDT(x)) * np.sin(10 * np.pi * x0) + ) + return out + + # grouped functions + def ZDT1_HF_mixt(self, x): + fail = True + + x0 = x[0] + x1 = x[1] + x2 = x[2] + x3 = x[3] + x4 = x[4] + if x[5] == 0: # 0 -> blue + x5 = 0.1 + if x[5] == 1: # 1 -> red + x5 = 0.5 + if x[5] == 2: # 2 -> green + x5 = 0.75 + + y1 = x0 + y2 = self.g_ZDT(x) * self.h_ZDT1(x) + + fail = False + return [y1, y2], fail + + def ZDT1_LF_mixt(self, x): + fail = True + + x0 = x[0] + x1 = x[1] + x2 = x[2] + x3 = x[3] + x4 = x[4] + if x[5] == 0: # 0 -> blue + x5 = 0.1 + if x[5] == 1: # 1 -> red + x5 = 0.5 + if x[5] == 2: # 2 -> green + x5 = 0.75 + + y1 = 0.9 * x0 + 0.1 + y2 = (0.8 * self.g_ZDT(x) - 0.2) * (1.2 * self.h_ZDT1(x) + 0.2) + + fail = False + return [y1, y2], fail + + ############################################################################### + ############################################################################### + ############################################################################### + + def ZDT2_HF_mixt(self, x): + fail = True + + x0 = x[0] + x1 = x[1] + x2 = x[2] + x3 = x[3] + x4 = x[4] + if x[5] == 0: # 0 -> blue + x5 = 0.1 + if x[5] == 1: # 1 -> red + x5 = 0.5 + if x[5] == 2: # 2 -> green + x5 = 0.75 + + y1 = x0 + y2 = self.g_ZDT(x) * self.h_ZDT2(x) + + fail = False + return [y1, y2], fail + + def ZDT2_LF_mixt(self, x): + fail = True + + x0 = x[0] + x1 = x[1] + x2 = x[2] + x3 = x[3] + x4 = x[4] + if x[5] == 0: # 0 -> blue + x5 = 0.1 + if x[5] == 1: # 1 -> red + x5 = 0.5 + if x[5] == 2: # 2 -> green + x5 = 0.75 + + y1 = 0.8 * x0 + 0.2 + y2 = (0.9 * self.g_ZDT(x) + 0.2) * (1.1 * self.h_ZDT2(x) - 0.2) + + fail = False + return [y1, y2], fail + + ############################################################################### + ############################################################################### + ############################################################################### + + def ZDT3_HF_mixt(self, x): + fail = True + + x0 = x[0] + x1 = x[1] + x2 = x[2] + x3 = x[3] + x4 = x[4] + if x[5] == 0: # 0 -> blue + x5 = 0.1 + if x[5] == 1: # 1 -> red + x5 = 0.5 + if x[5] == 2: # 2 -> green + x5 = 0.75 + + y1 = x0 + y2 = self.g_ZDT(x) * self.h_ZDT3(x) + + fail = False + return [y1, y2], fail + + def ZDT3_LF_mixt(self, x): + fail = True + + x0 = x[0] + x1 = x[1] + x2 = x[2] + x3 = x[3] + x4 = x[4] + if x[5] == 0: # 0 -> blue + x5 = 0.1 + if x[5] == 1: # 1 -> red + x5 = 0.5 + if x[5] == 2: # 2 -> green + x5 = 0.75 + + y1 = 0.75 * x0 + 0.25 + y2 = self.g_ZDT(x) * (1.25 * self.h_ZDT3(x) - 0.25) + + fail = False + return [y1, y2], fail + + ############################################################################### + ############################################################################### + ############################################################################### + + def DTLZ5_HF_mixt(self, x): + fail = True + + x0 = x[0] + x1 = x[1] + x2 = x[2] + x3 = x[3] + x4 = x[4] + if x[5] == 0: # 0 -> blue + x5 = 0.1 + if x[5] == 1: # 1 -> red + x5 = 0.5 + if x[5] == 2: # 2 -> green + x5 = 0.75 + + y1 = (1 + self.g_DTLZ5(x)) * np.cos(0.5 * np.pi * x0) + y2 = (1 + self.g_DTLZ5(x)) * np.sin(0.5 * np.pi * x0) + + fail = False + return [y1, y2], fail + + def DTLZ5_LF_mixt(self, x): + fail = True + + x0 = x[0] + x1 = x[1] + x2 = x[2] + x3 = x[3] + x4 = x[4] + if x[5] == 0: # 0 -> blue + x5 = 0.1 + if x[5] == 1: # 1 -> red + x5 = 0.5 + if x[5] == 2: # 2 -> green + x5 = 0.75 + + y1 = (1 + 0.8 * self.g_DTLZ5(x)) * np.cos(0.5 * np.pi * x0) + y2 = (1 + 1.1 * self.g_DTLZ5(x)) * np.sin(0.5 * np.pi * x0) + + fail = False + return [y1, y2], fail + + ############################################################################### + ############################################################################### + ############################################################################### + + def run_mfk_mixed_example(self): + # KRG_METHODS = ["krg", "kpls", "mfk", "mfkpls"] + # KRG_METHODS = ["krg"] + # KRG_METHODS = ["kpls"] + KRG_METHODS = ["mfk"] + # KRG_METHODS = ["mfkpls"] + + pbm = "ZDT1" + + if pbm == "ZDT1": + HF_fun = self.ZDT1_HF_mixt + LF_fun = self.ZDT1_LF_mixt + elif pbm == "ZDT2": + HF_fun = self.ZDT2_HF_mixt + LF_fun = self.ZDT2_LF_mixt + elif pbm == "ZDT3": + HF_fun = self.ZDT3_HF_mixt + LF_fun = self.ZDT3_LF_mixt + elif pbm == "DTLZ5": + HF_fun = self.DTLZ5_HF_mixt + LF_fun = self.DTLZ5_LF_mixt + + # ------------------------------------------------------------------------------ + + # Instantiate the design space with all its design variables: + ds = DesignSpace( + [ + FloatVariable(0, 1), # x0 continuous between 0 and 1 + FloatVariable(0, 1), # x0 continuous between 0 and 1 + FloatVariable(0, 1), # x0 continuous between 0 and 1 + FloatVariable(0, 1), # x0 continuous between 0 and 1 + # OrdinalVariable(['0', '1']), # x4 ordinal: 0 and 1; order is relevant + IntegerVariable(0, 1), # x4 integer between 0 and 1 + CategoricalVariable( + ["blue", "red", "green"] + ), # x5 categorical: blue, red or green; order is not relevant + ] + ) + + # ------------------------------------------------------------------------------ + + # Validation data: + n_valid = 100 # validation set size + x_valid, is_acting_valid = ds.sample_valid_x(n_valid) + + y1_valid = np.zeros(n_valid) # obj 1 + y2_valid = np.zeros(n_valid) # obj 2 + y1_valid_LF = np.zeros(n_valid) # obj 1 + y2_valid_LF = np.zeros(n_valid) # obj 2 + for i in range(n_valid): + res = HF_fun(x_valid[i, :]) + y1_valid[i] = res[0][0] # obj 1 + y2_valid[i] = res[0][1] # obj 2 + res_LF = LF_fun(x_valid[i, :]) + y1_valid_LF[i] = res_LF[0][0] # obj 1 + y2_valid_LF[i] = res_LF[0][1] # obj 2 + # ------------------------------------------------------------------------------ + + # HF training data: + n_train_HF = 20 # training set size + xt_HF, is_acting_t_HF = ds.sample_valid_x(n_train_HF) + + y1t_HF = np.zeros(n_train_HF) # obj 1 + y2t_HF = np.zeros(n_train_HF) # obj 2 + for i in range(n_train_HF): + res = HF_fun(xt_HF[i, :]) + y1t_HF[i] = res[0][0] # obj 1 + y2t_HF[i] = res[0][1] # obj 2 + + # ------------------------------------------------------------------------------ + + for krg_method in KRG_METHODS: + if "mfk" in krg_method: # if multifi compute LF validation data + n_train_LF = 40 # training set size IF MULTIFI + sampling = MixedIntegerSamplingMethod(LHS, ds, criterion="ese") + xt_LF = np.concatenate( + (xt_HF, sampling.expand_lhs(xt_HF, n_train_LF - n_train_HF)), axis=0 + ) + + y1t_LF = np.zeros(n_train_LF) # obj 1 + y2t_LF = np.zeros(n_train_LF) # obj 2 + for i in range(n_train_LF): + res_LF = LF_fun(xt_LF[i, :]) + y1t_LF[i] = res_LF[0][0] # obj 1 + y2t_LF[i] = res_LF[0][1] # obj 2 + + if krg_method == "krg": + print("KRG") + ########################### + # Mono-fidelity KRG + ########################### + + sm1 = KRG( + design_space=ds, + theta0=[1e-2], + print_prediction=False, + corr="squar_exp", + categorical_kernel=MixIntKernelType.CONT_RELAX, + ) + sm2 = KRG( + design_space=ds, + theta0=[1e-2], + print_prediction=False, + corr="squar_exp", + categorical_kernel=MixIntKernelType.CONT_RELAX, + ) + + # Set training data + # obj 1 + sm1.set_training_values(xt_HF, y1t_HF) + # obj 2 + sm2.set_training_values(xt_HF, y2t_HF) + + if krg_method == "kpls": + print("KPLS") + ########################### + # Mono-fidelity KPLS + ########################### + + sm1 = KPLS( + n_comp=3, + design_space=ds, + theta0=[1e-2], + print_prediction=False, + corr="squar_exp", + categorical_kernel=MixIntKernelType.CONT_RELAX, + ) + sm2 = KPLS( + n_comp=3, + design_space=ds, + theta0=[1e-2], + print_prediction=False, + corr="squar_exp", + categorical_kernel=MixIntKernelType.CONT_RELAX, + ) + + # Set training data + # obj 1 + sm1.set_training_values(xt_HF, y1t_HF) + # obj 2 + sm2.set_training_values(xt_HF, y2t_HF) + + if krg_method == "mfk": + print("MFK") + ########################### + # MFK + ########################### + + sm1 = MFK( + design_space=ds, + theta0=[1e-2], + print_prediction=False, + corr="squar_exp", + categorical_kernel=MixIntKernelType.CONT_RELAX, + ) + sm2 = MFK( + design_space=ds, + theta0=[1e-2], + print_prediction=False, + corr="squar_exp", + categorical_kernel=MixIntKernelType.CONT_RELAX, + ) + + # Set training data + # obj 1 + sm1.set_training_values(xt_LF[:, :], y1t_LF, name=0) + sm1.set_training_values(xt_HF[:, :], y1t_HF) + # obj 2 + sm2.set_training_values(xt_LF[:, :], y2t_LF, name=0) + sm2.set_training_values(xt_HF[:, :], y2t_HF) + + if krg_method == "mfkpls": + print("MFKPLS") + ########################### + # MFKKPLS + ########################## + + sm1 = MFKPLS( + n_comp=3, + design_space=ds, + theta0=[1e-2], + print_prediction=False, + corr="squar_exp", + categorical_kernel=MixIntKernelType.CONT_RELAX, + ) + sm2 = MFKPLS( + n_comp=3, + design_space=ds, + theta0=[1e-2], + print_prediction=False, + corr="squar_exp", + categorical_kernel=MixIntKernelType.CONT_RELAX, + ) + + # Set training data + # obj 1 + sm1.set_training_values(xt_LF[:, :], y1t_LF, name=0) + sm1.set_training_values(xt_HF[:, :], y1t_HF) + # obj 2 + sm2.set_training_values(xt_LF[:, :], y2t_LF, name=0) + sm2.set_training_values(xt_HF[:, :], y2t_HF) + + # Train the models: + import time + + t0 = time.time() + sm1.train() + t1 = time.time() + sm2.train() + t2 = time.time() + print("t1-t0=", t1 - t0) + print("t2-t1=", t2 - t1) + + # Compute errors: + # obj 1 + y1_predict = np.ravel(sm1.predict_values(x_valid)) + if "mfk" in krg_method: + y1_predict_LF = np.ravel(sm1._predict_intermediate_values(x_valid, 1)) + y1_var_predict_LF = np.ravel(sm1.predict_variances_all_levels(x_valid)) + y1_var_predict = np.ravel(sm1.predict_variances(x_valid)) + y1_sd_predict = np.sqrt(y1_var_predict) + # obj 2 + y2_predict = np.ravel(sm2.predict_values(x_valid)) + if "mfk" in krg_method: + y2_predict_LF = np.ravel(sm2._predict_intermediate_values(x_valid, 1)) + y2_var_predict_LF = np.ravel(sm2.predict_variances_all_levels(x_valid)) + y2_var_predict = np.ravel(sm2.predict_variances(x_valid)) + y2_sd_predict = np.sqrt(y2_var_predict) + + # obj 1: + # print("y1_predict - y1_valid =", y1_predict - y1_valid) + print("norme2(y1_predict - y1_valid) =", npl.norm(y1_predict - y1_valid, 2)) + if "mfk" in krg_method: + print( + "norme2(y1_predict_LF - y1_valid_LF) =", + npl.norm(y1_predict_LF - y1_valid_LF, 2), + ) + # print("y1_sd_predict =", y1_sd_predict) + + # obj 2: + # print("y2_predict - y2_valid =", y2_predict - y2_valid) + print("norme2(y2_predict - y2_valid) =", npl.norm(y2_predict - y2_valid, 2)) + if "mfk" in krg_method: + print( + "norme2(y2_predict_LF - y2_valid_LF) =", + npl.norm(y2_predict_LF - y2_valid_LF, 2), + ) + # print("y2_sd_predict =", y2_sd_predict) + + # PLOTS: + plt.figure() + plt.title("y1") + plt.xlabel("y1_valid") + plt.ylabel("y1_predict") + plt.scatter(y1_valid, y1_predict) + plt.plot(np.linspace(0, 1.5, 100), np.linspace(0, 1.5, 100), color="red") + plt.show() + + plt.figure() + plt.title("y2") + plt.xlabel("y2_valid") + plt.ylabel("y2_predict") + plt.scatter(y2_valid, y2_predict) + plt.plot(np.linspace(0, 9, 100), np.linspace(0, 9, 100), color="red") + plt.show() + + if "mfk" in krg_method: + plt.figure() + plt.title("y1") + plt.xlabel("y1_valid_LF") + plt.ylabel("y1_predict_LF") + plt.scatter(y1_valid_LF, y1_predict_LF) + plt.plot( + np.linspace(0, 1.5, 100), np.linspace(0, 1.5, 100), color="red" + ) + plt.show() + + plt.figure() + plt.title("y2") + plt.xlabel("y2_valid_LF") + plt.ylabel("y2_predict_LF") + plt.scatter(y2_valid_LF, y2_predict_LF) + plt.plot(np.linspace(0, 9, 100), np.linspace(0, 9, 100), color="red") + plt.show() + + # ------------------------------------------------------------------------------ + + # PLOTS tests: + plt.figure() + plt.title("y1") + plt.xlabel("y1t_HF") + plt.ylabel("np.ravel(sm1.predict_values(xt_HF))") + plt.scatter(y1t_HF, np.ravel(sm1.predict_values(xt_HF))) + plt.plot(np.linspace(0, 1.5, 100), np.linspace(0, 1.5, 100), color="red") + plt.show() + + plt.figure() + plt.title("y2") + plt.xlabel("y2t_HF") + plt.ylabel("np.ravel(sm2.predict_values(xt_HF))") + plt.scatter(y2t_HF, np.ravel(sm2.predict_values(xt_HF))) + plt.plot(np.linspace(0, 9, 100), np.linspace(0, 9, 100), color="red") + plt.show() + + if "mfk" in krg_method: + plt.figure() + plt.title("y1") + plt.xlabel("y1t_LF") + plt.ylabel("np.ravel(sm1._predict_intermediate_values(xt_LF,1))") + plt.scatter( + y1t_LF, np.ravel(sm1._predict_intermediate_values(xt_LF, 1)) + ) + plt.plot( + np.linspace(0, 1.5, 100), np.linspace(0, 1.5, 100), color="red" + ) + plt.show() + + plt.figure() + plt.title("y2") + plt.xlabel("y2t_LF") + plt.ylabel("np.ravel(sm2._predict_intermediate_values(xt_LF,1))") + plt.scatter( + y2t_LF, np.ravel(sm2._predict_intermediate_values(xt_LF, 1)) + ) + plt.plot(np.linspace(0, 9, 100), np.linspace(0, 9, 100), color="red") + plt.show() + # ------------------------------------------------------------------------------ + + def run_mfkpls_mixed_example(self): + # KRG_METHODS = ["krg", "kpls", "mfk", "mfkpls"] + # KRG_METHODS = ["krg"] + # KRG_METHODS = ["kpls"] + # KRG_METHODS = ["mfk"] + KRG_METHODS = ["mfkpls"] + + pbm = "ZDT1" + + if pbm == "ZDT1": + HF_fun = self.ZDT1_HF_mixt + LF_fun = self.ZDT1_LF_mixt + elif pbm == "ZDT2": + HF_fun = self.ZDT2_HF_mixt + LF_fun = self.ZDT2_LF_mixt + elif pbm == "ZDT3": + HF_fun = self.ZDT3_HF_mixt + LF_fun = self.ZDT3_LF_mixt + elif pbm == "DTLZ5": + HF_fun = self.DTLZ5_HF_mixt + LF_fun = self.DTLZ5_LF_mixt + + # ------------------------------------------------------------------------------ + + # Instantiate the design space with all its design variables: + ds = DesignSpace( + [ + FloatVariable(0, 1), # x0 continuous between 0 and 1 + FloatVariable(0, 1), # x0 continuous between 0 and 1 + FloatVariable(0, 1), # x0 continuous between 0 and 1 + FloatVariable(0, 1), # x0 continuous between 0 and 1 + # OrdinalVariable(['0', '1']), # x4 ordinal: 0 and 1; order is relevant + IntegerVariable(0, 1), # x4 integer between 0 and 1 + CategoricalVariable( + ["blue", "red", "green"] + ), # x5 categorical: blue, red or green; order is not relevant + ] + ) + + # ------------------------------------------------------------------------------ + + # Validation data: + n_valid = 100 # validation set size + x_valid, is_acting_valid = ds.sample_valid_x(n_valid) + + y1_valid = np.zeros(n_valid) # obj 1 + y2_valid = np.zeros(n_valid) # obj 2 + y1_valid_LF = np.zeros(n_valid) # obj 1 + y2_valid_LF = np.zeros(n_valid) # obj 2 + for i in range(n_valid): + res = HF_fun(x_valid[i, :]) + y1_valid[i] = res[0][0] # obj 1 + y2_valid[i] = res[0][1] # obj 2 + res_LF = LF_fun(x_valid[i, :]) + y1_valid_LF[i] = res_LF[0][0] # obj 1 + y2_valid_LF[i] = res_LF[0][1] # obj 2 + # ------------------------------------------------------------------------------ + + # HF training data: + n_train_HF = 20 # training set size + xt_HF, is_acting_t_HF = ds.sample_valid_x(n_train_HF) + + y1t_HF = np.zeros(n_train_HF) # obj 1 + y2t_HF = np.zeros(n_train_HF) # obj 2 + for i in range(n_train_HF): + res = HF_fun(xt_HF[i, :]) + y1t_HF[i] = res[0][0] # obj 1 + y2t_HF[i] = res[0][1] # obj 2 + + # ------------------------------------------------------------------------------ + + for krg_method in KRG_METHODS: + if "mfk" in krg_method: # if multifi compute LF validation data + n_train_LF = 40 # training set size IF MULTIFI + sampling = MixedIntegerSamplingMethod(LHS, ds, criterion="ese") + xt_LF = np.concatenate( + (xt_HF, sampling.expand_lhs(xt_HF, n_train_LF - n_train_HF)), axis=0 + ) + + y1t_LF = np.zeros(n_train_LF) # obj 1 + y2t_LF = np.zeros(n_train_LF) # obj 2 + for i in range(n_train_LF): + res_LF = LF_fun(xt_LF[i, :]) + y1t_LF[i] = res_LF[0][0] # obj 1 + y2t_LF[i] = res_LF[0][1] # obj 2 + + if krg_method == "krg": + print("KRG") + ########################### + # Mono-fidelity KRG + ########################### + + sm1 = KRG( + design_space=ds, + theta0=[1e-2], + print_prediction=False, + corr="squar_exp", + categorical_kernel=MixIntKernelType.CONT_RELAX, + ) + sm2 = KRG( + design_space=ds, + theta0=[1e-2], + print_prediction=False, + corr="squar_exp", + categorical_kernel=MixIntKernelType.CONT_RELAX, + ) + + # Set training data + # obj 1 + sm1.set_training_values(xt_HF, y1t_HF) + # obj 2 + sm2.set_training_values(xt_HF, y2t_HF) + + if krg_method == "kpls": + print("KPLS") + ########################### + # Mono-fidelity KPLS + ########################### + + sm1 = KPLS( + n_comp=3, + design_space=ds, + theta0=[1e-2], + print_prediction=False, + corr="squar_exp", + categorical_kernel=MixIntKernelType.CONT_RELAX, + ) + sm2 = KPLS( + n_comp=3, + design_space=ds, + theta0=[1e-2], + print_prediction=False, + corr="squar_exp", + categorical_kernel=MixIntKernelType.CONT_RELAX, + ) + + # Set training data + # obj 1 + sm1.set_training_values(xt_HF, y1t_HF) + # obj 2 + sm2.set_training_values(xt_HF, y2t_HF) + + if krg_method == "mfk": + print("MFK") + ########################### + # MFK + ########################### + + sm1 = MFK( + design_space=ds, + theta0=[1e-2], + print_prediction=False, + corr="squar_exp", + categorical_kernel=MixIntKernelType.CONT_RELAX, + ) + sm2 = MFK( + design_space=ds, + theta0=[1e-2], + print_prediction=False, + corr="squar_exp", + categorical_kernel=MixIntKernelType.CONT_RELAX, + ) + + # Set training data + # obj 1 + sm1.set_training_values(xt_LF[:, :], y1t_LF, name=0) + sm1.set_training_values(xt_HF[:, :], y1t_HF) + # obj 2 + sm2.set_training_values(xt_LF[:, :], y2t_LF, name=0) + sm2.set_training_values(xt_HF[:, :], y2t_HF) + + if krg_method == "mfkpls": + print("MFKPLS") + ########################### + # MFKKPLS + ########################## + + sm1 = MFKPLS( + n_comp=3, + design_space=ds, + theta0=[1e-2], + print_prediction=False, + corr="squar_exp", + categorical_kernel=MixIntKernelType.CONT_RELAX, + ) + sm2 = MFKPLS( + n_comp=3, + design_space=ds, + theta0=[1e-2], + print_prediction=False, + corr="squar_exp", + categorical_kernel=MixIntKernelType.CONT_RELAX, + ) + + # Set training data + # obj 1 + sm1.set_training_values(xt_LF[:, :], y1t_LF, name=0) + sm1.set_training_values(xt_HF[:, :], y1t_HF) + # obj 2 + sm2.set_training_values(xt_LF[:, :], y2t_LF, name=0) + sm2.set_training_values(xt_HF[:, :], y2t_HF) + + # Train the models: + import time + + t0 = time.time() + sm1.train() + t1 = time.time() + sm2.train() + t2 = time.time() + print("t1-t0=", t1 - t0) + print("t2-t1=", t2 - t1) + + # Compute errors: + # obj 1 + y1_predict = np.ravel(sm1.predict_values(x_valid)) + if "mfk" in krg_method: + y1_predict_LF = np.ravel(sm1._predict_intermediate_values(x_valid, 1)) + y1_var_predict_LF = np.ravel(sm1.predict_variances_all_levels(x_valid)) + y1_var_predict = np.ravel(sm1.predict_variances(x_valid)) + y1_sd_predict = np.sqrt(y1_var_predict) + # obj 2 + y2_predict = np.ravel(sm2.predict_values(x_valid)) + if "mfk" in krg_method: + y2_predict_LF = np.ravel(sm2._predict_intermediate_values(x_valid, 1)) + y2_var_predict_LF = np.ravel(sm2.predict_variances_all_levels(x_valid)) + y2_var_predict = np.ravel(sm2.predict_variances(x_valid)) + y2_sd_predict = np.sqrt(y2_var_predict) + + # obj 1: + # print("y1_predict - y1_valid =", y1_predict - y1_valid) + print("norme2(y1_predict - y1_valid) =", npl.norm(y1_predict - y1_valid, 2)) + if "mfk" in krg_method: + print( + "norme2(y1_predict_LF - y1_valid_LF) =", + npl.norm(y1_predict_LF - y1_valid_LF, 2), + ) + # print("y1_sd_predict =", y1_sd_predict) + + # obj 2: + # print("y2_predict - y2_valid =", y2_predict - y2_valid) + print("norme2(y2_predict - y2_valid) =", npl.norm(y2_predict - y2_valid, 2)) + if "mfk" in krg_method: + print( + "norme2(y2_predict_LF - y2_valid_LF) =", + npl.norm(y2_predict_LF - y2_valid_LF, 2), + ) + # print("y2_sd_predict =", y2_sd_predict) + + # PLOTS: + plt.figure() + plt.title("y1") + plt.xlabel("y1_valid") + plt.ylabel("y1_predict") + plt.scatter(y1_valid, y1_predict) + plt.plot(np.linspace(0, 1.5, 100), np.linspace(0, 1.5, 100), color="red") + plt.show() + + plt.figure() + plt.title("y2") + plt.xlabel("y2_valid") + plt.ylabel("y2_predict") + plt.scatter(y2_valid, y2_predict) + plt.plot(np.linspace(0, 9, 100), np.linspace(0, 9, 100), color="red") + plt.show() + + if "mfk" in krg_method: + plt.figure() + plt.title("y1") + plt.xlabel("y1_valid_LF") + plt.ylabel("y1_predict_LF") + plt.scatter(y1_valid_LF, y1_predict_LF) + plt.plot( + np.linspace(0, 1.5, 100), np.linspace(0, 1.5, 100), color="red" + ) + plt.show() + + plt.figure() + plt.title("y2") + plt.xlabel("y2_valid_LF") + plt.ylabel("y2_predict_LF") + plt.scatter(y2_valid_LF, y2_predict_LF) + plt.plot(np.linspace(0, 9, 100), np.linspace(0, 9, 100), color="red") + plt.show() + + # ------------------------------------------------------------------------------ + + # PLOTS tests: + plt.figure() + plt.title("y1") + plt.xlabel("y1t_HF") + plt.ylabel("np.ravel(sm1.predict_values(xt_HF))") + plt.scatter(y1t_HF, np.ravel(sm1.predict_values(xt_HF))) + plt.plot(np.linspace(0, 1.5, 100), np.linspace(0, 1.5, 100), color="red") + plt.show() + + plt.figure() + plt.title("y2") + plt.xlabel("y2t_HF") + plt.ylabel("np.ravel(sm2.predict_values(xt_HF))") + plt.scatter(y2t_HF, np.ravel(sm2.predict_values(xt_HF))) + plt.plot(np.linspace(0, 9, 100), np.linspace(0, 9, 100), color="red") + plt.show() + + if "mfk" in krg_method: + plt.figure() + plt.title("y1") + plt.xlabel("y1t_LF") + plt.ylabel("np.ravel(sm1._predict_intermediate_values(xt_LF,1))") + plt.scatter( + y1t_LF, np.ravel(sm1._predict_intermediate_values(xt_LF, 1)) + ) + plt.plot( + np.linspace(0, 1.5, 100), np.linspace(0, 1.5, 100), color="red" + ) + plt.show() + + plt.figure() + plt.title("y2") + plt.xlabel("y2t_LF") + plt.ylabel("np.ravel(sm2._predict_intermediate_values(xt_LF,1))") + plt.scatter( + y2t_LF, np.ravel(sm2._predict_intermediate_values(xt_LF, 1)) + ) + plt.plot(np.linspace(0, 9, 100), np.linspace(0, 9, 100), color="red") + plt.show() + # ------------------------------------------------------------------------------ + + +if __name__ == "__main__": + TestMFKmixed().run_mfk_mixed_example() + TestMFKmixed().run_mfkpls_mixed_example() + unittest.main() diff --git a/smt/surrogate_models/krg_based.py b/smt/surrogate_models/krg_based.py index 550ff5152..e9b311a73 100644 --- a/smt/surrogate_models/krg_based.py +++ b/smt/surrogate_models/krg_based.py @@ -495,8 +495,16 @@ def _matrix_data_corr( ) = self._initialize_theta(theta, n_levels, cat_features, cat_kernel) # Sampling points X and y - X = self.training_points[None][0][0] - y = self.training_points[None][0][1] + if "MFK" in self.name: + if self._lvl < self.nlvl - 1: + X = self.training_points[self._lvl][0][0] + y = self.training_points[self._lvl][0][1] + elif self._lvl == self.nlvl - 1: + X = self.training_points[None][0][0] + y = self.training_points[None][0][1] + else: + X = self.training_points[None][0][0] + y = self.training_points[None][0][1] if cat_kernel == MixIntKernelType.CONT_RELAX: X_pls_space, _ = design_space.unfold_x(X) @@ -701,6 +709,39 @@ def _reduced_likelihood_function(self, theta): noise = tmp_var[-1] if not (self.is_continuous): dx = self.D + + if self.options["categorical_kernel"] == MixIntKernelType.CONT_RELAX: + if "MFK" in self.name: + if ( + self._lvl == self.nlvl - 1 + ): # highest fidelity identified by the key None + X2, _ = self.design_space.unfold_x( + self.training_points[None][0][0] + ) + self.X2_norma[str(self._lvl)] = ( + X2 - self.X2_offset + ) / self.X2_scale + dx, _ = cross_distances(self.X2_norma[str(self._lvl)]) + elif self._lvl < self.nlvl - 1: + X2, _ = self.design_space.unfold_x( + self.training_points[self._lvl][0][0] + ) + self.X2_norma[str(self._lvl)] = ( + X2 - self.X2_offset + ) / self.X2_scale + dx, _ = cross_distances(self.X2_norma[str(self._lvl)]) + else: + X2, _ = self.design_space.unfold_x(self.training_points[None][0][0]) + ( + self.X2_norma, + _, + self.X2_offset, + _, + self.X2_scale, + _, + ) = standardization(X2, self.training_points[None][0][1]) + dx, _ = cross_distances(self.X2_norma) + r = self._matrix_data_corr( corr=self.options["corr"], design_space=self.design_space, @@ -1172,6 +1213,16 @@ def _predict_values(self, x: np.ndarray, is_acting=None) -> np.ndarray: y=np.copy(self.X_train), y_is_acting=self.is_acting_train, ) + + d = componentwise_distance( + dx, + self.options["corr"], + self.nx, + power=self.options["pow_exp_power"], + theta=None, + return_derivative=False, + ) + if self.options["categorical_kernel"] == MixIntKernelType.CONT_RELAX: Xpred, _ = self.design_space.unfold_x(x) Xpred_norma = (Xpred - self.X2_offset) / self.X2_scale From 8744f0a4fb10307f239a87edc8476080631ab1ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Lafage?= Date: Thu, 26 Oct 2023 12:03:21 +0200 Subject: [PATCH 08/13] Update pyDOE2 dependency to pyDOE3 (#471) --- README.md | 2 +- doc/requirements.txt | 2 +- requirements.txt | 2 +- setup.py | 2 +- smt/examples/multi_modal/run_genn_demo.py | 2 +- smt/sampling_methods/lhs.py | 4 ++-- smt/utils/kriging.py | 2 +- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 745f06580..0bedf348f 100644 --- a/README.md +++ b/README.md @@ -41,7 +41,7 @@ To cite SMT legacy: M. A. Bouhlel and J. T. Hwang and N. Bartoli and R. Lafage a ``` # Required packages -SMT depends on the following modules: numpy, scipy, scikit-learn, pyDOE2 and Cython. +SMT depends on the following modules: numpy, scipy, scikit-learn, pyDOE3 and Cython. # Installation If you want to install the latest release diff --git a/doc/requirements.txt b/doc/requirements.txt index 91de9d982..0bf29edaa 100644 --- a/doc/requirements.txt +++ b/doc/requirements.txt @@ -2,7 +2,7 @@ Cython numpy scipy scikit-learn -pyDOE2 +pyDOE3 numpydoc matplotlib git+https://github.com/hwangjt/sphinx_auto_embed.git # for doc generation \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index d79da2ff6..cfd7b9813 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,7 +2,7 @@ Cython numpy scipy scikit-learn -pyDOE2 +pyDOE3 numba # JIT compiler matplotlib # used in examples and tests pytest # tests runner diff --git a/setup.py b/setup.py index 90f6a6828..af45e8812 100644 --- a/setup.py +++ b/setup.py @@ -105,7 +105,7 @@ ], install_requires=[ "scikit-learn", - "pyDOE2", + "pyDOE3", "scipy", ], extras_require={ diff --git a/smt/examples/multi_modal/run_genn_demo.py b/smt/examples/multi_modal/run_genn_demo.py index b915f09f7..9b9edf786 100644 --- a/smt/examples/multi_modal/run_genn_demo.py +++ b/smt/examples/multi_modal/run_genn_demo.py @@ -14,7 +14,7 @@ import numpy as np import matplotlib.pyplot as plt import matplotlib.gridspec as gridspec -from pyDOE2 import fullfact +from pyDOE3 import fullfact SEED = 101 diff --git a/smt/sampling_methods/lhs.py b/smt/sampling_methods/lhs.py index 7a3001ef8..b3262eec0 100644 --- a/smt/sampling_methods/lhs.py +++ b/smt/sampling_methods/lhs.py @@ -3,9 +3,9 @@ This package is distributed under New BSD license. -LHS sampling; uses the pyDOE2 package. +LHS sampling; uses the pyDOE3 package. """ -from pyDOE2 import lhs +from pyDOE3 import lhs from scipy.spatial.distance import pdist, cdist import numpy as np diff --git a/smt/utils/kriging.py b/smt/utils/kriging.py index 3a7137a12..a0560c62f 100644 --- a/smt/utils/kriging.py +++ b/smt/utils/kriging.py @@ -10,7 +10,7 @@ import os from sklearn.cross_decomposition import PLSRegression as pls -from pyDOE2 import bbdesign +from pyDOE3 import bbdesign from sklearn.metrics.pairwise import check_pairwise_arrays from smt.utils.design_space import BaseDesignSpace, CategoricalVariable From 2ac08cdb2c4c03ba17d3382d96229359c64bf912 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Lafage?= Date: Mon, 30 Oct 2023 10:49:02 +0100 Subject: [PATCH 09/13] Bump 2.1 (#472) --- smt/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/smt/__init__.py b/smt/__init__.py index 159d48b87..9aa3f9036 100644 --- a/smt/__init__.py +++ b/smt/__init__.py @@ -1 +1 @@ -__version__ = "2.0.1" +__version__ = "2.1.0" From 2f9a74e2bb4ab683c184c1bb1f9044dd9ab91057 Mon Sep 17 00:00:00 2001 From: relf Date: Mon, 30 Oct 2023 14:39:35 +0100 Subject: [PATCH 10/13] Skip i686 build (atm, fail on Github actions) --- .github/workflows/build_release.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build_release.yml b/.github/workflows/build_release.yml index 1e99fac0a..024c21770 100644 --- a/.github/workflows/build_release.yml +++ b/.github/workflows/build_release.yml @@ -20,6 +20,7 @@ jobs: uses: pypa/cibuildwheel@v2.16.2 env: CIBW_BUILD: cp38-* cp39-* cp310-* cp311-* + CI_SKIP: cp*-i686 - uses: actions/upload-artifact@v3 with: From ba2c26276d12f0a3b951d0802fa8a66bbaa4c756 Mon Sep 17 00:00:00 2001 From: relf Date: Mon, 30 Oct 2023 14:50:18 +0100 Subject: [PATCH 11/13] Fix CIBW_SKIP variable name (grrr!) --- .github/workflows/build_release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build_release.yml b/.github/workflows/build_release.yml index 024c21770..224e6058d 100644 --- a/.github/workflows/build_release.yml +++ b/.github/workflows/build_release.yml @@ -20,7 +20,7 @@ jobs: uses: pypa/cibuildwheel@v2.16.2 env: CIBW_BUILD: cp38-* cp39-* cp310-* cp311-* - CI_SKIP: cp*-i686 + CIBW_SKIP: cp*_i686 - uses: actions/upload-artifact@v3 with: From 531b872df113037cffd022bf284ab60aeb7fff41 Mon Sep 17 00:00:00 2001 From: relf Date: Mon, 30 Oct 2023 16:48:29 +0100 Subject: [PATCH 12/13] Use v tag to release on Pypi --- .github/workflows/build_release.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build_release.yml b/.github/workflows/build_release.yml index 224e6058d..4c013eb25 100644 --- a/.github/workflows/build_release.yml +++ b/.github/workflows/build_release.yml @@ -2,8 +2,8 @@ name: Build and upload to PyPI on: workflow_dispatch: - release: - types: [published] + push: + branches: [master] jobs: build_wheels: @@ -45,7 +45,7 @@ jobs: environment: pypi permissions: id-token: write - if: github.event_name == 'release' && github.event.action == 'published' + if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v') steps: - uses: actions/download-artifact@v3 with: From 67a66ea958d4bd1e952c3e6be75ad86f62c088f2 Mon Sep 17 00:00:00 2001 From: relf Date: Mon, 30 Oct 2023 17:41:16 +0100 Subject: [PATCH 13/13] Trigger pypi upload only on tag push --- .github/workflows/build_release.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/build_release.yml b/.github/workflows/build_release.yml index 4c013eb25..4bcb25546 100644 --- a/.github/workflows/build_release.yml +++ b/.github/workflows/build_release.yml @@ -3,7 +3,7 @@ name: Build and upload to PyPI on: workflow_dispatch: push: - branches: [master] + tags: ['v*'] jobs: build_wheels: @@ -45,7 +45,6 @@ jobs: environment: pypi permissions: id-token: write - if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v') steps: - uses: actions/download-artifact@v3 with: