From eefa296a7546e0c65aaaa7ec1e8b3d02acd950ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Krassowski?= <5832902+krassowski@users.noreply.github.com> Date: Fri, 16 Feb 2024 14:18:20 +0000 Subject: [PATCH] Initial commit --- .github/workflows/tests.yml | 44 +++++ .gitignore | 160 ++++++++++++++++++ .pre-commit-config.yaml | 21 +++ LICENSE | 28 +++ README.md | 29 ++++ docs/demo.png | Bin 0 -> 94153 bytes ipython_markdown_inspector/__init__.py | 53 ++++++ ipython_markdown_inspector/_hook_data.py | 9 + ipython_markdown_inspector/_ipython_patch.py | 40 +++++ ipython_markdown_inspector/formatter.py | 104 ++++++++++++ ipython_markdown_inspector/models.py | 25 +++ .../tests/test_as_markdown.py | 50 ++++++ pyproject.toml | 45 +++++ 13 files changed, 608 insertions(+) create mode 100644 .github/workflows/tests.yml create mode 100644 .gitignore create mode 100644 .pre-commit-config.yaml create mode 100644 LICENSE create mode 100644 README.md create mode 100644 docs/demo.png create mode 100644 ipython_markdown_inspector/__init__.py create mode 100644 ipython_markdown_inspector/_hook_data.py create mode 100644 ipython_markdown_inspector/_ipython_patch.py create mode 100644 ipython_markdown_inspector/formatter.py create mode 100644 ipython_markdown_inspector/models.py create mode 100644 ipython_markdown_inspector/tests/test_as_markdown.py create mode 100644 pyproject.toml diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml new file mode 100644 index 0000000..f737b86 --- /dev/null +++ b/.github/workflows/tests.yml @@ -0,0 +1,44 @@ +name: tests + +on: + push: + branches: [ main ] + pull_request: + branches: [ main ] + +jobs: + build: + strategy: + matrix: + os: [ubuntu-latest] + python-version: ['3.10', '3.11', '3.12'] + runs-on: ${{ matrix.os }} + steps: + - uses: actions/checkout@v4 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v5 + with: + python-version: ${{ matrix.python-version }} + - name: Install test dependencies + run: | + python -m pip install --upgrade pip wheel + - name: Temporary installation + run: python -m pip install -e .[dev,test] + - name: Test with pytest + run: | + ipython -m pytest + - name: Check types with mypy + run: | + mypy ipython_markdown_inspector + - name: Build package + run: | + python -m build + - name: Install package + run: python -m pip install --find-links=dist --ignore-installed ipython_markdown_inspector + - name: Pip check + run: python -m pip check + - name: Publish builds + uses: actions/upload-artifact@v4 + with: + name: ipython_markdown_inspector dist Python${{ matrix.python-version }} run ${{ github.run_number }} + path: ./dist diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..68bc17f --- /dev/null +++ b/.gitignore @@ -0,0 +1,160 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/#use-with-ide +.pdm.toml + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..6f6325f --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,21 @@ +repos: + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.5.0 + hooks: + - id: end-of-file-fixer + - id: check-case-conflict + - id: check-executables-have-shebangs + - id: check-added-large-files + - id: check-case-conflict + - id: check-toml + - id: check-yaml + - id: debug-statements + - id: check-builtin-literals + - id: trailing-whitespace + - id: check-merge-conflict + - repo: https://github.com/astral-sh/ruff-pre-commit + rev: v0.2.0 + hooks: + - id: ruff + args: ["--fix"] + - id: ruff-format diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..cc3e579 --- /dev/null +++ b/LICENSE @@ -0,0 +1,28 @@ +BSD 3-Clause License + +Copyright (c) 2024, Michał Krassowski + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..0bba769 --- /dev/null +++ b/README.md @@ -0,0 +1,29 @@ +# ipython-markdown-inspector + +Provides IPython inspector outputs as Markdown, enabling better integration with Jupyter Notebook and JupyterLab. Depends on [`docstring-to-markdown`](https://github.com/python-lsp/docstring-to-markdown). + +![](https://raw.githubusercontent.com/krassowski/ipython-markdown-inspector/main/docs/demo.gif) + +## Installation + +Requires `IPython` 8.21 or newer (which requires Python 3.10 or newer). + +``` +pip install ipython-markdown-inspector +``` + +## Usage + +To load an extension while IPython is running, use the `%load_ext` magic: + +``` +%load_ext ipython_markdown_inspector +``` + +To load it each time IPython starts, list it in your [configuration file](https://ipython.readthedocs.io/en/stable/config/intro.html): + +```python +c.InteractiveShellApp.extensions = [ + 'ipython_markdown_inspector' +] +``` diff --git a/docs/demo.png b/docs/demo.png new file mode 100644 index 0000000000000000000000000000000000000000..8e68c37b0f78e08921b3c38e52ce1be7fac7209c GIT binary patch literal 94153 zcmcG#XIN8N7dGsSqaY~Q0OE#g&II=lwJgs z5ITh3d+&Jy1QjDSG^o;`pQW@0%(k>1h1=`nly6&iaXb zblS@|cfSRH2sNR6uvk2tRymyJBoqGFz)9wIesHMCW1=n*xTFfqODsf6<179wEeKhs z;^L;|;xasrb4kIlKMlD1ikQiz#ju=&mb~?8^@a6>LKrl%8pCT9FU2Ty;fGONoQ~0V1!LO<|5X zEHiLOezUt`N<282F<#$t;3R~B^wzK8j80a>i zig+c6&@wol85$jDy!Q-V(_4h?Mz#r#?cfTA=(W8oBPs^xq&PojD1qW!_b;9)ii2w# z@34RE9_#Mz>vcQr^LoyTFQAGTpECuo4K2-5HcarBwfvJF<8jb~4&CH-sVRBKwD=K~ zvJ!mLl;3E0Ja)?#YM$Bb8osq+W@>9|Y&R!r)Rh^s8X&eeulCbUiz{KNq0U=EtaiR5 zZ8cEXa%_K;mLRy+cCSZId{{RA2b!2k03|AfQrRqG!4WH^Cqrlnl_x2&a)^V2Izv+6 zUEX_D!-LFKLl>m2%i;+ujQrh?OTl@yjHRHXiq-lh_=?+<%gnfG&IDXo)@)dsey}?U zqO*EWvQj=#&^Av+nbguxIY=k*0SBKNB>L{ozG+Ot2Bemn@b^1tz}*x`BQGj8|3JU) zVyA9i7t7w`>H5A<8w~aWKkffVKdQ12UsS-08u+B^8@_B~4Ktsco+=IU&wGR=VKAk+ z%iNCkT&{6hzBX}A-ulK#?=z3LdcA8HqtA+XcWe|{1wB=o7FP|67Aq=0Po*d$4BCC0 z##mz3d1$H6s#Z5szZ_SYV^5S2oqYX5=}#`o1ggo@HGyfP(ERD_pfK?9rfTb}pK~C8 zvGLLI(b2alqps=R>n<;Qm5Zi(f2yaS*`9g|XwfeegRRf%MMlQPMn(50X|&Q@Or`NE zDu=GsLX?z|Q+xh%5{zN9$2~5N51L}(84rrNPm>~$*>XTfmQuy{C0`uqrNvub{J zcVHh(Ix*f)UgRoUI)GL%CBNgmJ$XOIZ<5lN#Bi!jp$ly#fzVQ)!r7_pZBqC&S>w0X zUTmZkmnOL8R^;XrpZW0NU%p3}lcwUgC~q0Btd+A>q$I}*qbeG{=vu>VPB-C(g?;GP zWad>FjEz0RRzH5uTaDYbmDsl1<0a6Qcu4I}&Uo|0lW$vY3jt*qY{Qu}AIPhsuIM1( zM_OoT#Moeq&yT5RZ!Cv&l}%#X~R(1{Vb3T;ATV ztdFwAD@P4*%py$pI<(7%9>(eCSBW7^}`^3H|ce-F5P@ zQ^PEJTN!R!XCFGNM#YqSF9{OQR;%qL&kgYjX30P6ea8HChzNl9~# zkkJ9Gi_U8o?o*0AwDY*nR9*yN1%9&LMWr{|T267kS>kcMhlPM;#B&AH3O_Re-&z^HDN(wd~^xQ1W15b(C7N@7D)1k)D zHgmiOKju^^Eia%o!L%1Ba119vjE!*3lKJ9XEAU8zILi7`*9mCl|G<_7_o*``e!Yw_|gR8 z(N%OuA6$BQE~hpYlMkkn?#5?&K z%La8NN_4%+TD}xRUJ}I$CR0+jr$pZ3DjqEnB0f*B7e(kYFgWW5~#eWP?dE9&4K? z_p5Ny4E~&&^zF@Lv@))Hvx5x2o|8_8H0TT~8fH>g%!s5_fSa5S`QVmmhPuAMVa76T|*OXwkVcTbAb>6FwH!e^zDOi&E+W zeD_UwP=YEszv`Wu+r)hZ@q9&msDUq&Q;;~Wr9xp;6u41;;c2BdW==&CJZ85X@`WgD z@^n4cU~St)Nzp~VXTV=ZRJC^Bq<$-SuAq(4^>CwR&3t)Yg}+3bK;(rN6aQYv+tcNt z($(wYWuLDyA>= zOqsb54h*8W(8!p*s}8FWgiZ!FVw?@{*)i)E>cY<%KB{B5if?vmruSdTC9QMJ(KIS4R>CL(LGL$f^Gr@X zbXJpp9*QU6oN;ssmjB1+dV^KxQ0|w6nYNY^8@bD>))81mZi>e4Eih|d>d)4;V>XTvzFvqQ< zKZW##-YEUkb>Wm-_PwryRkg2cKd|0#N1>lQ^0hoQ3dSEkYH!_5I}VfACTMQL=Q2FK3@ z6%j-y+(WLYCc62iCa6iN7f$Z!o`S1V z;q-~q72!ekPY>T$R8*Hcz2B^xhC-B;6ffb>grO4BtvAn9PIDSH8}-@QqTlL_In$vl znYA4~)wfNyf)6Pzgj`i76DA9it>RzXuMUiDx}Bgp35ROR@_QxyWkQFNEUE2pXlgK} zJ{>9Iy>E^;j6HUWlqZYZGdd0xXSw>090Y`Gs;eri?6<0p6=d{NAZ^!+r*|St!de`) z;`PDUR|!)@+|=_{rsk&BTg#$0c?Qpe~)BdR zy(4pFwSsz=J-Jg(WdG`%iEUuZ=DdW+vn*yUSaaaYrt8H~>q8mTQJM4Bg0a21tu3~s zf8uk^jRwaDuV{i`jqW?Mvu$CuwYBD%5|n>|I(6o^N6Rf}m$n$x>0CeHWaU`0i*s}L z!&D{o*Kk#1lGZ5wCb*{@F;hevT0=wQ+{^~wl#Y8XH-{8BZ2hbMP$e=lQl-xhZpi?T z(Ujbk#sWrM1?x$;Y~(=!K&3q87mTpNqW^YxcQ-OJva{nV3b}$mxe3Z)SN{X9!dC!M zTt$+=sboCtLjKo<)sL9dHyvf6w}87E_664WvSIhG$|J6x0Tj)G{rp`M`~Td4*+U5u zA|Duie5R3S=7*i+#V3gU8K5l=zYnpY{;MLEs2CtgAx_vi=66o2#M@#}B z;F&;l&2#0KJW|iBjvv1?UEK`}3(LvLDUdk$fp+cweASL}k$N&@3L%kl)~WEooAKjq zYRC1F@)Ucbl!e7bnS%m$V9Wt{*1Z$ls$FFQB{lo?-Uu8}@yV&3@v>(iIWsPqvZ157 zxmlwvjFQZbV`$jf(H7P72lwxnQI%`v zIy*a~%gX-#02DNaA`l1z1B2k#34Q5c*}%e&Hd^wP0!c%_8I`wjz-^fNWZJK3%Pmi# zJYBXPE@8S$M;Fec%%LE0bBOtLQaX$>3&Y9I{=wa4bx?ktJ|h4s^_Yd_I+x3A>n+{` zq<+2Y?C67`K#G^KcgaXdnhzBf6yBszhLf-b{jH-j`put+Nn?cS@XxjT&&x#{6nv1; z7zz04*ZBb0%b&Bevv++?c3HjGPWG1GXMY5Q#t)jv(!!$shyXyX24e%bF% zj3SQne%Fa|Q3uOE=N5ZYSCtffo)mi>ZEBb3J%9F$M^G@ZoylS#SAMBKQ+s6PXO1jz zPqIxVgFc;o;%z@cUhGU}y98CuP!`Lays?fev_j%3bZ4l!ON25M+>_pP$LS zohno4(H8!wh=fKo*D4hv{g``C(Z=F(^PW~ZGCngisw^f(-O8%4P6u*r)8%;E_?|(z zN!t)gw=HQ1n2fxAaj(NcN2Ma|QiJS&)bh#bMFWC@$mvDjcp!<5)JM^uJrxtV@?JT} zhynYT@f|dlSbh)P$~@~E4ug%j9VitEaA}-y+$$JG8)?th1W|G6-8Jk5-UE2^8#iv4 zut8w30wILU!K#+7?s#kKYu>*3>FLL8Wkfe_NXy8uCk;)1^KV=CqPw*Y4e-NYe32^Y zxoP?QAZ=~!dne03S@`++n>x`M4GVtuT&#cv8A7*;fnd#CmywK;47{;yfq{WAktQuw z<)Xq{H_7PUSy{19A#eD{_-0blkyZdhX>Mt`w78fM8=D;g^J9^X1UA^{$jI^WacgU9 zuv~!K`bd@$RE?F2ib_tS#%^+csZ!GW_(yANZhpR;KkVhAktqNvM`Do3rH%0#nEKc@ z{ghrepXJ!cn)B~o@B6-2sGFN`{f<<%GzYX zv_9EC1SK0-#9PJ&mHP?G|u; zlCuaaII|a{Q9HWi`el({t!~&JMxAVAbrX0{f9#Za{=Q0+2Wx9 zok{c?3Hjnn@GR_?YsrEYr1p_n?fa7dcaEd`UHf-W|Fis8_8yc%`5Xh7TFmXg-qHfj zhK8BjpdmOkG#e&papl}DUQ!ben$-JUEASGBDp%7nFf`4Rjs(8C_V|x}U7&#jx_wBc zWq-mJV|nmY93n3sW{YpqpR|6f9tF681BJ@hC9OMd4*%!;CTnk@%tvGBi;cDuUxhn3{_FFy zO?(S6v(_3+!gdq++U&(AdVzoR3}2(X7sC9miNnh1VaDEB)Mk+5NX`9hciQ!>EsXxn zKk;)yO;5Nvkjp)N^7*t%5j-jmsE8kWr{on`>Do$VnD%H&! ztLwDmk~5^Dyg56h)`xdB>i^+IX1AZ1c zvOH&IYHDq2YiEHi-XF%)G|3Z#%T zg(NF$NIOnm2J=Em{P0QDtf+q42{M9_a;vV0khLfrU)1cHf5h7`(3QiyianeSZtofD!0oDfL;eYpeh5*oWUSu2DCk&JBb zMD1924~PD0Wx_6_FU(@pzIOv%(Qo4FE9D!8zntSHjK0QqRpTUG&TOD3+~haVSlco5 zioLDaqJhF`B>(IAek%FuC%v0S>Itd>kqbS`pI!Hcx>#;zP>x}W+h#G?!>4VA~g;b zVGAymuV?K3i0rPgD_Pz8In~t#P=SbaJrh>bE{`f-cjV3zhJJ^uhnQxCZ_VPH@YtIK z4|uJctgIIi5s}x^{uvG_$%nJ!s_c#i%*l|Q4$VIpE@~uYhaoAH)u7MyVR3PqvRlbd z4VQW<7@QmxN+VT(zesw^kBgsPGbaDQ;;3t@t19*$)q|OJ=L@GdMguP<%Mg_v+Xpq~ zI`P7&-E6SaI61h)?uS9DBD$_A9C0A7L@M!w&;vffPvE@!685JVb^UE{W{+|lk`kO3 z3QssM#{@y@-=UdtSv+SOfLk>Aq$`2&1cTr;Lzlj18GV|E#rcAfnA#H0B=yjuy$F$N zWpP*dGZ44po%P`flhuXLphtPh{gCQ2ZDVMyFxzU?y4Ny@t7bHca#V1Q>bPK?$i?MV zb-vELY}R(GTHSjsxMC>6#ka|6Nw7aGHuAP(ny0jDU1Iy@=2H2pPWf(9LMHaRHHGG2 zk0bNYL0PJI!K?ttqq078Z#uod^1X(yXIbAk>^S6DBTJUFnf-MxC)i{ou@!GXmVFfU z&c0;0-S#l=$qjOUg3C7e*(RzfWoXzo!2pi7eoo~FnS0dgfPla?|FF&C;)N!^qsP_ws#pr3XQxeg~OfpfnrQdqL3Xli+psjDQ zD)ej_7sRDKArtFZJB@cTqcsSv1W&VQ?3P<-q3;1@4YoU-URlw$pPisvd(#*yn5id^ zwfYMYNSS8@4KA2c31d_m9!~aFU4a?zmO9_@8#Jfp81lIah*HNk(fO6OObBkXZIz~-5&qEnheoV_uS9qI2&;< z4*9432|ewq*ny);+cWjgz8$r0VFCb%^{8wsYKC=(u?)L^0r~DO4nj$yz!T5#Lm^ zhrd)L<=^W^!+zT2hZpC>SeuyR z*PqlowfEJ^{)rB4rbL%M+UmYdXJItdbe51O0-!Dyn>-fFe5}s3TuEV6!ns zUV0f`icFd=;>38#25a_0iE#k0XI7?^0i@G*miGnKzio)9G`c+thslTFCX(S3E4JW0 z#Q88qH~+jGH2Eg>L(`prh=qdgTK7KpvyGF2bWxS2Xf=)UD1ErzB3}FZ2N|qqnVJPu zTG(Rjj#ygpd#2OFl^Num6kQX@k1p+=;TeJz=GPo;FV2e+_3V*SPzX(mAHAzwWZbwg zGt&}eqA}Tq3*0Ko%PShz z^_u!VoqG>XVx=g$EAjokEm)^1`khqF#E)Cm*AIOIq$!r>=Zj*HvBF?@+Q)Sdzseec zi=Q7QRHP!?6B4v7pluE@st-un5#9@M;^c)*fdfZGL-(gV2HLTm%12$P37HXum?H{F z9ZrRYT`$YTQ6jaR$diYZaIoa+XmcM%IaZZdxH+!W?%HLDda%nkG}#3N#WngjI@Ofx zZsx@o(qB8X(tv4Go}p`ag@tR%R({wI#Vn16O3Cb;U5IISB7EVd&_%l`11?wBL)Q&Y zW$?b<=8awayq?{b`HD8eZMou9-p50J03|8o=2B7R;5D3u9b$oc$el*s{Tbicf*+rS}_lH zv7DA@j@O-N#7Dlfo$C2c;JJ8^4AI|vb*Gpb048Jg5N|UxM+bPnnZo?u7j_GcGl`gA zVC$}i_Wzi;Uo;Uw%>9CQS8xcZ`7bZ_FFFEFUv;Wl{pRcr{MupA(b3Uk_J}LsmAmQZ z@>Sf28Osg=fvyS?pBQ`=|cm&jzAPEt`l8$pdefMP^NlNTqgGyr4m+f2QzkUkOZNZ5N~kZNNIMbXiyNLW~PWW zmi`x*`oVBB;qD8vLC}>VlW*jE{2Nd z&>lcHMZp&CUtO&ec!QnAO8shZH!hXZvK9MlU{WC0)9#h-g2;^(wn5~-TQ-H_JY>c2 zdJ4ZN%`2Zd?$!#d(BD&=0?|*V1eVdSAvsA_F0#vHP^i#a>7=~>u8-(901x=pIqDsf zS8mHcnBx6)0lspTfksFV8yXcwPC`=WzQY^}fz2jz8-5H3NE3BofBF=uqRg?kSz%WV zfwZG^ouTwGTHreZ7ZYz;mI9CXe78L`v`6JcgkBH3EaVh>!eivf=@4r?1Urih5hW3a zGx$NBy-#v4#|wbm1>#f1T@*n0eJc_IQ0f9HJxv5G@Z(4J*Akxl#4$YV`SH!#d3kwN z@1QF&Pc4p|ww8zBg9zPQBB6LTdg^>#JkXU(lSHAM{#@(ES3^aLUQtt*(VFAnJeU^0 zqH6yJ35ja=$xeJ6ePdpb0ltyZaU>Z4_>C}JK)W&2eyTxUUcT1*#BnkO($^v7ua69D zH%E%=3>Wo~uqwX$gwWCkS`u`=TD2)d{ie_l0B2=o4+RLbddCF?E#=^*;m9k zSeN+w9P!S<>)h+WV2|+0lgD``%WFFd!tgD6dkINgw@+FmtlYql(@BqtQ%#RC-4LIz>)Hy=xh-)3&}Bhq@F| zrjO^RCMj|}neF(C+qy3>nDnNmbVAnfD8;C#NKt7~RZLS!Mpo6*a63n1L30|TfWn#d{&<)N7}GN`|sTZYTgr|*H^s{zCrDYz_bt26M)DDH>|YS z^I1efh3)k8^rMA}0jZQ(1k2iqXw*=;jM65)x6;W=c9_Z9-n-z#AX3)y$U$c6KzZy0 zbT+`uQT^aST{|8-rlyLC(5aUQlllxQH2%HsMwnhRbF3U22Oa$hcI zk6Yq?vRG@3>7b*Pb{isiRGaW@1>aOq-{y~sWD9I}qzGRw3Wh%r#v?6}G7Jpn*1U`8Wfj9s z#&TMgBAp(MIB0bCDP#Pr%|jw!$8h@>!XWm~XZvh2|tvUWkcq^dt?X4<>e8PqRI>ZOY_SEZpQV7eC8M zZJKNSyu6>bKm78+bPjE%WnLPC`E1i_h+d8y84YZ{{7?rXeMi74!{x?q`rb?~rT~ZT ziD#tD12VVPi`bKE55m+trXX~P*3PwIX0zl{9uy@A%uTL{+P>ibV+iu#Lmc}AuUV{e zY6+>70n!|a5s_?cl*fqAF6T+UohjLR^nO|W6~xYUU~jLZwAHML9;=~q9mvuIMotFP zN5z)Eg6Nse%k~MfTxGJXz9Y0QsCPu3mzJ#S2-vkIji&ZXL?#Zin`0Ho8SG8O4sBMK z)cyH$?u@H6~=XmL1@)2bf zKMkBs*=)DvB!p}zT~tRzMU=pcj3x5W5(cGT5=oE;K4G9Q-l}+U+iz3d|TRLGN!ATca&ik;4+Nlc%KY`L8*`?w^KU zKKHlT7lV96!kP{_icSh+x5XjXP* zt<;8e1T9N}B^k4T{Q77XpWXNBpGV+_sX4t^DV$(5C>c`Z8ulVu`WN?%9WaB!j;d9+ z$&+ftpYRE-em}oV*Prx?8h6<0nWHhsz6$Rf_K={iSrS>kEt;ao8?bFeSpOrPz8J;M z^V8Pu=&bj)j-@>x)4Y>gqL0NVKN)OyL;ctC+KgoXIZL|Yv6MTKyLqZgVWX zd646^su4QiT3UB?JhH@`BD|cDvvRDU+mue zVk_fv>0HCIfrZ8K02xG+aQ@yTS9YmS93tUei%Kjf6qvaPssSropMP|#)HZo_X~iga zxV@yK6&|I5NlLK8z%#WdbzBFj9XVOg+S*G%(9{thm_nqGg>9p-EVFgypFwNT-iCyj zq6k<)fnTXAxk%Af(iMn7w7QZYGIh&s_pi%VGrBF#3G-K*>05RzL*$+vX9jz)ZapvK*x&E)-4}39 zqT|HAbqRWYwt%oJlyM%AdaC2eIVwKEN9q zi&XG}hPg3|a^m12IicW>$Qsw$*GrZ_$l=7JSK9BA$Q%1=OA_)r?u zK+4c#XZFUQK!RuNdoTtFTU_wS_y=z8azV-3u}=IsZu?H@ZeXdpJmKxp%UNsL#5i}Z zuM?eK7Z8h`Tj+fq$R+d|uRnAF@<45sdYQLi$vG#o~R^a8Ysl}nx z#=4CMsoH$1YrTGc2(p|b$>843UU^k-kG=Th&ocv}I9!`3X=c$jsW+RoB|tb#MCBQ#np-Z;nk@31$<#GFskEgR z?u75_?xpQdQW=~?C&%qNZ`~!8!d$1=`(V|9zOQwEKEBa|#GM zeXJ*=dZ-GP7mx||*wbP@{B(J^{{q}H^Yp$%6im?GLXzv5s5toK=b}V=w)A3aCZoOW zs4uqH?X58XNpB;6M@jJaT)g2TV(a1iV+Rw!+$+3UF0eLSgmp29jHzPMIFD>JT5WfxKzLb@L%m}N7}*v~WhD?}WZt04EqQu&5$GY#xeu)xvITGIoi1hU zEVjpNQl5&6o+fPO2!$9DEm|~^rA+p8Wx*3O8XGRC2%FaXwNd@@br|>?OQh>&hQ4=u z)Mkm{iaq(<)<)7`&$rix+Nv0osT<*7c-E;R`|u7=W#+brC!{Z^a&GSlmNRy<~^el7B#ux zvC98g!2pA*X@>)1purbJbT<@phLm-y%m4258Mzdu$tYqo)Sp5&YSF@f9Io|W<4{sW zp3MhdPgCA^jz}XaX*z9#Yh=)+PxiN=XP3&@T+@j_qDO~4Thvp3l|C}q+0zmCukMow z`+%|X8rV4S>9cis(`(z2aTimlrGFiOR6uGF_0bd>5)uL=;W5rD_dgX4w3ZrTWE65s z*W6kON^g=99KL$sGU6Uo_Q>LG7v?yJG%sEYsTL9Z+)2oPsa0kP;x_LQ@o~;hK3*47 zV5aW|*OywF0W-i)<*gAyua|Kr5$vI8 zZ|sS7m1*f!)hnd-3*cR4F8^;1^Y;;;WBDzN`DIOi$^HL#bOq@TexpZ?2mhr#2TA{j z^Z##K0Pws*{J-G)zrgU9dA`EZK;Uw9_tpO^yt!E4HhgwfASO`7ORj`xXZQxk?=t>{zYS(g$uM z-B_40mUKRU-`K>T9|a`hKY#ulM#T+e-jvUG7kZ+jqcxE#3-j}XC9q^W-isnUfu!Of zE)BHQmtI*_W&1gqaB+n1h+^zlWMB#qfM7|;$P%<4|5X;;xtf}A{y4#coqpCT7(qcp z!_MfhF;VBTmKHuef&DwIGPfi$=iyW~UkMJL~ zU)Hhg6R(7k#AGBwIqWB zU6&~1vQ5<_NsQgugapFpVUbO3O&;zP;#;%56)sGh86n1DOTZ@(XqhbyQ!X$G7p0hF zf-v!uyr=SBpClY$4y#aCN5|b#%%!N;;rixeJs1q;Hf*A6qcZGG;%({fR?ya_+5to^ z6fuch`h2{+I#pI$fXITAlaq`=?AffQre;S3?Jz=_mX`C>J(1HrCeGHa8>nX39d30pj9t6{o1GN*-g{5t#=NKyq{ZAUTy@{a}Qa zAokT3!~Of&K(z2LGP{GVqlDX@U2G^13uy6xf(HXgAKYDO7$3DmPU5-F$I~Y0jG?~b zTcwHmhKpX!R5Ra@H(4&SI)d&FT}ZhpbUr-(>wbVQaiS8bVU-@<@#J9Pt#vO-FnKh2 zWNt9JAULR>DO^>?^`iy$zFkaG60sBs3CVp!K$f%F7DkmH0e0I&+l=nEN6(nMOL|>1(}})2NPiSn6Qf9jw%BRwkDa4W12K9k78ulQT1W z(mY;mYmIMe{L#&&U-$O|^}Ct==_0oO4wtN>s5q~$YOm-uafdmU|o`kn)lDPmKMO-R*76! zm&}G{bV$nnq;nN9+S#6KA=b643FAK936NUM6!-dQ8uZVP(oo~hm;P4< zYT#H&@iDhn_jL_Hc#o8xURr{`u3AaEE%bc>U?u>u8+)s-FqUu3EI|5oNkh5gN>v`Q zx7@{JCF{-tCT41ZHB29&lo$=glkDh-=n&)KZd5aNL3Q$o13cBa+k!X*ht81n<%%!` zwtL8SiGKaW^D6eHnt{^*ZqgMp+}ug%odqRpUyCt?tB z%x!EG7c#N38mll@yhq-VE^MCxylzIu6tG-0H8cdw?#E*f)P@P=$G&p?QoYqFObjl3 z0`Hb3IZugN&l5ce=Eo~D@hOyiETC*PK!F9{p8i82CLw{1+46hROTf`Yw_8G8j`!6V zoSC5A3EjTKSipLL!L%s{Gc805`#>71?3q%J4^n)fHLvZW_Z*|nfE}Z4(l%CF+oHTo z-(}#&G=-Z*(kx>Np>q`z{vtZ5*MT z$|kl5SYZ$pt=4%BN;5S1#UbaTQg*|$$Tf*!&3=^-%YuB3mGSWPaE{Va^yC2L4v%^- zBJe{nkDXZb2|x-r`4SlZfMq9PFp^isl_nDwB5WX^;eV-evZ4LFg4uDa_#VQMZ}O30^HdN_2$dMZT~6}ac5=gI1m+2;v%szb#$Q9@ zekjb$%z1ZSo|g;I=7JWDCTpFL9(#)^%GSVlej{=a2qk1?ATP`e3OIlucdcVJnRb8= zXT>(F2Zx8h*77|+R`+Rdyosf8vin}ts-4pxnV__0Ge0^d>qT%_in<^_B29;%@043$ ztpFheU_xT31IDYYpDw~)Vj!gk5!bvG4GlA|9C$=OdUbon*x7kMODgEGYCH)gTID;L zbu0gDrlhaWDzL&uQ|=LjPEfo3*RpN^`{OLBW`j)kIBr~`hP;5W6(KY=IpPRcd~MQ( z?N?Q-SF?l~ouBLwD)tR8Gw}pQTOTjtex8_e=M@bm#`g&MIJR$o-rn8_rR0GkZSGz~ zd_uy_mwwuSoxj7OfN;4uJpfdHkMECvqkMuLtG1;bSYBC4PD$xY6M0aNeSezesCQI* zd6A8wlH~cMv^G`mwW!-maOje}JZQjNnjdiI%l9IA*R6hhe%Tok8A;~M!_54u6-XzH zjgOB{PSX1l-G21?460qKN?J`p3wN=3#OL9qXPxXbDO z-Q66=vRg4@=W#F;pzS1sI6DK3`|lWLH!dk5nlW$(#94UGWJIwD3n64YdjTXGx(kf| z-m8=cIQ>(5v8$Ykvf^Ht5_#8;^Fj?L<`*7e-7dEn2#&Yq;Xsqogz#RkjzcDk@p6(=Y-;+GwZXpMLG$Y8Bizt;8 zUsgUD1vC#7#}&&4dR;lKu^saNmS~BBFz%-=i~kH7Km$aMHX$+^wl0pfJ(WP ztY?}7H4#cNQGoh4I5|1l&+i*x<(iy&AbsE6roa0i<7Ltb8D0~BKS#r`Xr*(#JTvY;-S%COiRwn^x|D_lln+J!RxSvxC2@ zTt*yZr?wovZcz9hL#Y1zWxqa|vQJoFe{y?!o6(Wtj9Q6qt=E*|&DOxFLx4*Kq{dWt@A3cw=D!ZtM>QW{3kS2&@;PL5g7Fr`#uO78OGv@t+fXUqpn9G|!R6|;NT^JXpC_tKQ`)t8oT(0mm2MKyDcr{=TSbo&`$ z-L0^z(}|x<95skmQ0y5>^TLTvH{*}MqoR*r%sXTUll$)78a+n-;YSeNeiId+DVtHp zSs!Anu;yyu=yVukIgp*0I1DK4t9Vhlq*Qhz!YCfLF$VjpQ{Myh)UBn%Uw$agG z?<#lRfuL%eg6(~tnZbh8$jA}0hNl*LiwZ@;M;qg^{zQhh|`~cNrpk;9I zOYb{^q%==I{pnZOJp{<}^vY$!AMw7q`R81FL{SYQuP+=1l}v|;fa+~)w{PZJxlRjb zqx#T@On2kjZ3{qe58#Qor>b0>oVQ6ytw$^J8YWshI;=$y6eEc9cUXIgL@$U56a}pc z4GDSqs79isq{QTY-pB9nctCN_vlulw*q^Y8AV25tpLBdDEIOT!q(`ylnQLc0CHQZ3 z)yPw*8kLGEO1MaJJ;l5zEo-&h&|mVxZP%q zb%leNwVU>ydLXc1(6f<@+Q|k#(T+~sRW>I+!zCsgTp!*Z)m6FF4hS9{bjQ0*Oja_p zP&AQj;Rze<5hhP=gV~2RlONjwNi5}SOb5WH22@03bazuU#Ig6S983NPG%kDMVK+_IiJ<>p44EL&>lKE9B}c4F|b>^VG6xe6Tyo8r7T#_ z%X1OYv-9)*@hiHZ$Py~T*j;Jb^kOh zg7Q5C-|)SkNqFRHF*FlO)Hpoh_w<5qb{#`5eu4K^3Eo%ZTDdhBQeO@%L10}4 zwM~IVQPf^$t2c*AZ22c(dC2-aaYtaYmKj_Jlr#y$1QacgkC&jdrlN1PmR~(9PGsw z7Q)QMyz}#b?~$!OeQFplzuu%(vNNPPnKU%qW2i^xy*7Ecky*O#;o-ZwY9T8<>HJ=f zglwonjf{-UvM$*Y2JKGia;@ z(@U*PhM|?UNAt8DwwOm zKm&TSv?}GqG7nKD_H0#~P)UwQu=I>n2sF8Dx1Y^_CyDW-iz6%WOyBnSKg_*(Je6E3Qky2xGuXww{ec8Qxmp?VWU3>I!nR&HJ zW^wUOv9F1d`o-_n{FL0@Ukq9*<>X3aXCofsf1mz^_qSY9tD3H=lvrK0|95H*St&`| z52zyVg%AtcM86sql?s_Ayu78G`0|lTrnyZdr7BEFqcR$~$M?$NDcu(>g{3npL5wqo zLZ)A22GE}N>&MqGqoWZu;C4!H5zW}FqQdC5bd=fdMWF-IYA~csR_0sZBaP$t+7Y9E_Qy<_*zWJ@(qdg*>4x?TEW(em7S(cc z*9%$teRh0#n*&LI|6;<9nqNzvzdvl)xWw?`8sgdY9YLFNxx?p*Zs{=enFfg6s`^RX zb-G3;=8L@ixv?+53yLDo`|9SsAyE$uKL5t3VM(fVaE*F$x?3~9wymwa?~%k7PSeHX z<@(oWH-5;UC!b&CYGq%uyQPI;BYm}l!x}$-=~LO^i{&TY(kVaO`+c@F`G(f(o0jG# z{5eM0TMpND#F6t{x|!$ph_!k=y~!*dLoG8PIF>ByI1$YTQxm???cnVNG&sLDgCxvn^&7yZ$G) zuap3=u$}_c#~MiY+&=(*G9KD%sBd%6)Y<%zzyHqsgu`$3!!@#={E(P2q!7i)9X<|k z;!ZTB?G4WAE@M>xbfH-Hx0=xfR2iKCzb;6l8m`myoxi>ZiS6;bsJRd4eg{sxf3SCQ zCmHoR-CGJ0YTG3!m)_&3~05Jh-@&|)^vRy%d6^Fm&a0d2n-I$u|=YySPn zZ3nG=`_BIu-5a!M@yK>pXDAV!3kBzXFMG>=IQ`+S&p#4@6X8QUDTuczR}O82V17DU zCRRxE6}(qIC`9$yX*cWN(eM~7ovUu&z$;^48J^sOnle-+iOXz&5As5STMhD=9ChvJ#B zQ#Nx2DiStRSvQcX2uF@=-m-<#Jt$qmt$c=e%Z3dbaO+GrI?F?azDX~iO=CHdFR{7b zeb3U#G?wmpw#Y0Wl|{$8?wW5tCMT>Wf9(C>EML+r6oDwLOIXBCNDIoJ(@Au69NHpY z?Y8?zElT2%xnE{ed&{*J z<(SNvob;gEU9+3C=yd40(UIFdvsj+w&dzfSv&5jF<%T!`wt5mci_D><#O07!)x#em zCPP$X0z3NH`g8I!Gg&G!G<|GymK4%h6l}6hpONl`Jf4rSKk@N2!fh8XJWZs52CIOp zb7gCdo;NOE^!0N1afjhXbv>nJIFh1QynOjmf9}P?_b*K4ckf0=MVVS~@Z1A4t%v?n z7BIFI1-sscpIch+1|h5LHBx?h_`vJkzgZ9R{LUNDd8X04S?0JdY-WWg3Hobny(~OR zst4}MI+kZ5(#Mm#-ae>U7%y^8O6<>$ba@kKbDLB=zAeCL&*l9(b0(UtduNq5eQ1&p z?Qe&5ld=mpxD(2E+6$$~pHyF^x9)`cM|6PPx^;_D0=zuR)kt@_6!V$SugxBRJJ9RS zfG*(Dva+;O^NmB@QkS>U(V}Z};ZiP&)pq%km;%3ZgMli$vOZ3evwyoA8+$em zXP(>?NIs)CQnq~J+|=G*7?5RgYD`Pc;7i(ub<2)jHxiFZgunf*pty5xYS^H(X0qp0 zecHKq!|Pn ziclw6SI(S@;*>eddM!vqn9Y7X^IO%~xk)aaKZb&%7@l$U>L@wyVP)m)mri#)uRVMA zOy?#fBn*A|g2iX4udnYEO>y&gb#)~rC(FC{z1QBbRYXC7!!mK4S_(nHZ}Ov>82gzQ zSGXA~LB@*{NV@uDYAUMc_I9)IR}Eqd?t5NXM(vh(9v`1b*E_xH>L=;nJ(DHR1_s(P_)&5O+cXJBm5OY?0-EF;otkY|Ia!v zC8Sb5c;#_Wu1CpH|2(_@Wj{bxrI?&U+BW{1Py2UrbM{mUyX~l2(42^wuY}sl_y6-G zDBpkOS}XVa_fL4?_?4BfwDNRTc-KFF`p)8srhF{&WY>)JbY2yeRJkJ@xpxn3pgdP6 zLUa?!rrP(mrhu-o&Lj8Z$B%zEf7Q^C-*>sbz8)Dvu5sq&bqVNki!6oAV}>~n{3a>F z?VsBSyeQ@I>`Js92_C!lM)O{1ViVx!pDfA9$bfGE9or~|3VZxec(QSD9QGC)zYiwq zt|I{|1&@?NNWiQ3U59>r`(Q*ikr&=Nfgb(_9S5ek9@^;@8NZnXJ3CtI6=Y=a*;`Eu zii^il?_)Gzne%W-QIS5`c^_5T)noehe|-G8IXxtGb#&=XdYEy?=0M>?(Az)YR1C;$o2U%q%Q|v zsIchICCWzX_gm&OTj>mWn8I0&?)Zb|=7~_WP=A2&;b$I@_L;DXvuiIjGv1tVlza#@ZS-iTMT(Av~CvwBjj?94^h@N;V-9=I7^O9j6-aedzP#{OWc|vGJak z7AZl&_0Ml$`a^9f4VwYY4OW?YW4>?|jJ9|yU}@GWO4%#1X+5Nm3VDy$OQDM;PF`NV zDaHT$SOQiB$rsrW;hu_|4B0I_0E15+K73d~)Y8&Aa^%SVFAKkZJ-eXk3uM^W*9U}b z@^jWWhq!-V0+esrB=+JKZF*HzReQq7_n57_`Pp7~cOU5{W$#~Vrsw1{j5K0csdz~K z{ua?vC0{zr&ieW7kBk+DvwJU!<3{&J2 z>hzIB3Vwb6GR(I&*bM(32nWf}=F>*@p|P>TrzB&G#^Jfy*gu=YY$@;3Dr){*6C&q| z-a4Jc-nK57zZOw_m#AobJ;}<-%Ji{SIuh5;;OJ;W0)fi`(h1&(!n~}xxjDY=bZ)2? z3k%DqjZ##H-;x;1R5%Q85_=y9K5Tg#KOE&t2{0vuv;I5zrw->(3{kINy&8we=OAwC z;E;*nzSRlDpTl@ld;53PpLo)nH22bN78VgXefqSr$H((?!ph2)>psJXc-MwlK8N7z#|WrA!otEFayi=cq{a00UqT;uA`(#kPE1TVEC)fA zwz0Xz`LN>79hMwzHH=%)Tn3RSwzTHFyWhtY{go&F_(wXIjb)WvuadXB_@mRqSMJ|e z*j|ru4EXwRfM^_plvn+tr-w_af=J#GXL6IM)&^YNujJ|JY0-&m_Vw|suB#6G#cs)N z#M!Szg)*PBpKgo1oxr_&_bl(bJ$EoLFhDed$h(yrW%T$?rDYVY_gp&PJb%7kD)842 zwzKc=x?G2lJGmWFTKM^E*RIWZ^L=8Ll2oU%1$2-sSzh`juqE~ln}~UXd!oB|Nf>de zW(slKF!Fcwr2wtvQNDjB-2BaVe*z{Ywy$*G{PR=wmHYuff%!LoLLq*o@YqUD_>*$7 z>D}-AnVRrFlOwol{zUxAK!Ug9e`*l=^f3L+ey%(s6u`ulgchLlKk5$pCk6hKnf_g_ z`1jVNKc1-n!n5@M;0JNrdPg?#WuNJPp7`%`DkZo5mnqxiX`VK9jOgFIy^@bs($n9x zOL^{pZtHIvqr4x=n+lTGW4Usr{7!LtiA|*W$ydVa<_GSSvA2?fIIXL^x^Evv$Iglg zD^6SUU{^riEz6^NiYu32xsA30;*jl4XR?oNKmq5Eg-Y@}@6l@mnK~&8-lRJPPdeIt zCL;1v-#&9F_<28S%B$keeV1XmrMaR-^aY}1b$)m6D=@l>iV9`|`9QHAEs}HT@I8B0 z!m5%{5Fya!!6`w0*b5ksy1Dg1%ff2Z(b9^jL&CvA4%_~qvXXX-{5W71|1zpd=({qq zvUS2;>I6bEX$jfm>-z^RzwX9fFax{_4!rBsQrpnbK+v|b+WG_YQz%p-QA=6*AyNkA zp;J}>G5;vx$kWyG8dvfX%|c`@YAYJn*cjVzs?^K!X0MWR^pk=W(j$p6cwLUC&c<%P zlE9>c1e;V&l>+O|Xo)XBE0ZdSOVckUKm%#aK?y0}w*QtL0ppIW?z?f<78De~%b{)e zGEoc*lZlCGYHA8SXCvKr@{SQ0<-(b)DB`lm4$U3gw?9cd{yI4!DQS*k7ifbkX~>Yq z1(Rg>quk@PK^s>4%>)DnYRw@OBVFFUefyu6%2h~AfQ4#Aa?T>udC2z0fXZhp^Z66x z1(gd$qN+}nqffF51h@J8sJP+(eP*9|%QLO7XTL2P_mmsZD6NlUj=ZVl-BaaVbc}$I zOFjC~=i6hXIVO4rhD$lHNKugqw;e*m_hQ;mM8u{wLI+Zv$hn4yj-;n}Jug!_kOJ=d z`Okf7yat<$j*gCi3b8dCB=qzs-=FnK*G+1o`S$i(vyYK0(Y`C-ew^Bj4&rO%5Gc;EewIPqx1>>({jvNI-2 zsH+ECc%3=ZSK%1Bs3P|D1&LkUYUco6t(&W>XgvvZN!!g5$r330g|a2ES%_#(^gVhA z#NAa5T{2=#p_SrxI_+r?ZR86GlSh{zer z`S$b2-EHNn{2KR;dmcCtcwHPS4!am39$zBnf;Yyksb8cJJNtufCCX~ACrc|R=qzF^ zR)!vG0rl;z7DtYhSlnK70l$x=5E>E!#`akl9ZS(m77mWQqM~<@E>X)+ESoDEU@mw4 zegE<&js9Z^@89Y_J=&xAW75qXQ|cUtrB2PLcI$GGL`FaRpJPxKaj`tB!}0BV%w?`* z;t>lAgS0)?Iyx^pI?R`af`ko4cJKDXvqF^%`UZRR8i|&|Fww%dr>go0j*!~>*}Kfw zZlINvm#_bUS}`~{7_um;tY`ViTn2`Qd=@5)2oOO_-#g)r{f|40&$US#?7ute==tCn z;gk`>7ExitqR)9e2Kvc0W;&wQRi=J@oc~0wFm2DeZGlQ>JVv|Dc8n&K9oHf+#O1QF zupC7M_|$-e^iS9{OL>JpDO+1OV5X)e_E3C#EAevdAyJOY_t>UCiRn+C_!9*GX1V{` zsrnyLKh9rM9H>OKx{EoPeI+FtM*agI@K;JoTnYLsSYxHq7h4I}e{OB%9>~rX0sJ9t zluprqWl_qt@F6Q0?Ozu}qQ$i+|E%Q=W4D5*e*R!okD?Larf>`N&7Vp z*y^1q&JgskUWJL~(8IfK5*b&ACw(q`kyYuA7rvM$Dv8O^17j{0;Ll8 z0ci0UVUa+pG2L?06@P;0}nGnMIM8(6Nf%3gH;c z-4)S{sN})Hfq})PCG3S>q?GkE?0>(Y^J^03;WhK2tmaFNi}QpzRL`&|jG_uGv83_H zvyuyUfA~N`D=@ukZM%e$Qq}3^DWE8nV(#;$&SiS|@f z)XDdiOnLGqdV(e#dmWot-@761_dO2WQX%Mm{Lc!AUnGVmmcRq3%)G@4^VBB$pM4!4Z$9@nS+3}w z0Zs2K2)!8h7BLAX_fd8A0@RPspTp>vF*3oV;y<#v-^J|9LVE5nh|0Sr#ly?y>*F2aP8+d(u5G;OPafASxV?TC4>zAu8*)9rs(dIdFSFm1$K|^) zsIm>%YHi3i-qlLhyN>3^B7ZyW{0PVu#{#6&#>cAGM@kg4JnrBSJn$+-K|)T>EIGdzuUUmf2DgJOIoF2M0YBn?nEndM8)wQO!)tK?|BUlwk>ph!?9GsX$=4RZvwx(wKd6W-2D$BKY&DH%C`E;^` zP_}-JtC#mLmq_M*|NMH()`5>7?b<$JDS5VSFXuPjGu<(Xo8&Szx_$gknk@XPSoSz&R|Q3V_Y>JsiFs@`L)>o|skjZZhQ zw{0E>U0Yb{{WpBe-e5m3?%G$qnR`{dZvNE@V&lWOU}A5hKz2rdJ9yCHR+6U1@Uu{D22sc8_T9?X^92ldCbU<|aFWhs3-m z4bg%oH}s8J{}kE1W@(4DTJx_=p+qHXVv;?AcBV#XV5ZQuDoa;JybPM6^vL$lqkK`> zaEvM*qcTdC-9N+`R)u2h8m7-s|uca~bGcM{i31*tP4*71=d;6(@C#7+UmN%v0oCTyLRY7Is_P_m)0f*7%! zy3-Rt-;1qXMyzYoL>QS&PLU;Eg|?7G6tk-IKm=+XfXZb@n`}s9eqq@}`VIuIEUfyQ z!Q1QvsF^QT&~DpfMF`2#4dheWi%N99&Ow;rlgZ;d@k+fqF+BUT`-5g$bGG` zBN8Kc4oHjXrkpyF>vqc=8@DC$Sz5Wy>+9vvhX+13iF{61ySSZk6a|e zRGxC<#{L^R-;i&Q)KOX-PUe1|Az{UTMrc)f>Zx}3<=&IU80k&*GKLs2%`Y=BnzSY; zCxvX}i?YtzhAn@|k!Gx*Sq{LZE{g(4XCn8Wp*20l?N&84H za5|;_A>2q@Mehj`esh?)Fcke6x-y3`b~MBA*a!YJ$WJXqKvU&sXSjC&(J<|B@0TR#K^MRnpCH7@2G{ zJf^KvbgJW?9=YeySs&C3sIp7lF1B-$gFT#h$iZFYS9u zY9^4nub?!ix}20J$i8;Xnn^MG*d#AO%1I|%HRm5pjv3IrHq$M9^7N@%ko3bQDX|2( z9jb4x+2Wjp*p2f#G8(JCZaXeoFX!n2ol02y8^klA%?XUVTF#r*7p3HdCdNEU??FC= zeVwmc_)qnfO`RKh(grmLs$YEMKx(_wyB>F~;&B$B|Zd(`byaFRNKJNH3 zkti=VzP@t`rA;`kT}|bM`=r>DegHEj_CCd^|O}yXDy3O9pb$W)xYCx0z zB_S>M*^NQA_#MC#r##FP49b{M9>I{eQyx_BwaHaXXYV^YEz1NOF7o z$16~fB*D;`1(ho_=F8b3_jf2|%fYpZM;E^t0qGm4rxqLNta8ULA>VKsg2 zk?{{8P&G%={OfdZn!ZtIzxK!#3%XO#17+JJ)~LGnR>|F){PES2fq|j1s@b(X@EF@q z=E`l1&-MmGNY*>uFTzb$k7Ua_ujnx;Lt-hodRr%3N2NCNb$*dlfBN+4e!2V6puC^u zQ@Rs){2~t@Hn^!|#uZ?F-|gmXD(isDv198LYWwRWcB!hGaxg5Zi+~hmdwdmal{q?Y zXy!E>-h?9wCbJjh64g9miG2R;jmHc(C+E(A!$=9bQ)i0`liB^75J!_5pU_FwVbp2F z;f$(>53??UNPFPXA6!8Q+(^F4n6;<8X!Y6+vt#Wv+QFq<+;?i-8Q411IjHn6>OYll zo{yLxuO)rlS1;XsUB7BW-qRmU1?UI){F$AV)wF;JkoUH>cFntQLfHB*1OKjX8 zIa&_`f63EteDw-CdGb%JbL)prYo~9R5(xv>y^J^J(@L+6h^tt9@?bkXeC!aezw|^p#(7c{c(1Y9WAvVT+ z@Wka?lh(1GM%mhv#GW01?wEm%SHT44)6FNx>(IU-=1YAtOs0|8yL7N%!J27gS2%?Cg^5y5BQNiM|iQe0Ltvd8Z&Hg*nEufx&-^^07#wT<~wn zUNpMEQ;Rtolo+>M;_#ZOrV#6zj*2Qj@+-?fK6x57YqGSTX(nC*7EP#6(N=Y>NA5VXG-p= zIY;RQzHmVe6)SXB2t^ODw?PRg6`~BUL)#U|a-5&ju>a2S*FYLC6ZKXkE^tX0dsc=L z4ZOJ}Y~O&8XE7z3L_DOS@eHx6O)KY8XsEppa#evWv}JKp)a&>^AM3j^?acw5QHBNv zUf$jxz*w#QL-s<+f=Lf*NO-FJ$z;|UTorEfdvQ|78e-8M)R-58PL%ApxHyb{FDm*1 zJ%(`}k=xeR7WKWZCDvvgi-tXcxoZbMayY2Oo(zqRuGP@zkp{zocGfY6e-#oEI@;3M zSb+8qEOkvg4uns>@Wp5X`G6b z3w_xMTZxe?FmMUpj;XKYJR?4f@EeFH$#O1h)~p#A90VYN&H%pRaIwX0q}>}bCu-}r zletv=XM;8mY!>`+r2$MJrtrGq$>H8jB*o&Mkja>Yd{-9%B@{)Ji7Lz~&eUqySE4)22<+4_7A3Lp51& zp-5afDr0&&S^gvjQyI^@L$l}wN(6{qTnyOG!mxU1m$*2ZFk4$%x&fh1nLW&1U*+@7 z4Wp=wX>6l6%V^tkV5?*0()N#T06Wez64)WeO{(e^LrG{ddW6?P(d$xD zBHbwt5w~B)w{a0Wm)JX}x*4`GvCG_s4YaDNii(wujnb{q-p+Pog?XWTRX2jqw>~*( zX*`Z=JB~jsLL#KwEUhVe=1YemV8?>FAl4m>msGqrrWZ?+lh~7x?j~!|)(IApbu}eM zfE6#)$(6IO4Z$9F)Vt#sKA5auH4)=v4@}LRGs+>6{(6uk_|m(bW3IG`*%4>NszLyK`J~K*|Ht< z=%m=OB5Z>L2M&NoJ2&$=8e_K~Ki(tnVs9@6AdbZwr^wI0=B%3DPA1w-6J{D@<^Ygj zAaHg4e*HMPUHd^-9p#XOWQ_Lm5?jl6k=Pj1_)jb<+=2QJd#vx#2`@X07f0of-{o;?7^xye| z=@}2qu?PC=SWC$VLF|;#WEj`I!P00gzpN}PoyO^8EJ#TF^GQ%1P^4E+oC=MGyY0)! z2-t)D8uG{A-V#eoKM)Zfjsr2)Z=t1J2ZvPP(Kw=y5<7kIYkN^AswCOY9soG)D9$Mj zdJF6aprOoWy0Rm8!VHhdfULt|3&~`>j+U-23wy~?$eG^ppq9ibac$SG0yuFM6b@_1 z!~NrwkD!KTgx1bZA8&7K^gm;Zd^X#0Ahi+|rQZGbAoF*efEpAJF2T1SZL)wA;(%~@ z)WM&L zF#WjV%yFq$GwhVAhNtl(enT`1va-Uv&E_9noSc&KEEXB()0cYy+l;e-ni>zhVc?KB zQn8L`To3o^{w%#NUx-D|Cq7*|XmKEf55Nu4 z_Gn98-7zHh)?CwDK9sQLyd4g-k81Aj?kzfJ#@aRoih1EmLL+)wAIdPc>kSFH0Vicx zSy+VM((t+w$u6e;Gb+gGY4G}yQ}Hr0%S&fx2O1l}^NJ%co5+_SE_nrwNZ*we%hvgD zBPq$k)O20S1%XU`^v4_R-+zHT-g8&KX$&hm*37GGd3hNDNo{*|Arfh;eEbGQ&?%v4C*h-z*SSV{F5E5^SsFcJHGE z#bZvp(OV6P2l83r2C|70t+2>uzc9Og-htHMa`lhmwvVG^C`Oh^F)1yBUO$Q@j$(y` zsR1TZYg$)<&Aq_})pF|XJWhd5O+ z!y^2eiHfLN@|zl;Z#Ezq%=wf?#<%Sait2lW;NUzDSNe5|Ofn)a&>9O=pMAT%lB8bX}xo za=P*hZxnjJ>mpeAgMelxX$zFqe#0OB^%X_|v+!UdhV|23zL+Q(wCFouR<5&EIkc*` z=G-|LBmyeJ!>Qnundgk3f{z#T<>yycNea6;Q*P)p>g#tQmfXLu^O9rcKJfdgP5Xn( zGZS4;o{Te5a`aett%moOqsUgrgalD{LMB(vYRUXAL>Rf$KO1rKC}BiVOjK0drh4aq zXYb+NGu&@77-M*>$3Br1#ERFeUj6XKcQZOYsmdTETqItAm_gCtq{Z@is&e!UUC=&* zaijcOnVI=j8xA!H)6(`Ci>GY*^zECicuHB8&&6k6dEGD*wmwMQ+Ep(im<0ERQZ2* zer>29#5H$?TUj>69Cn+F7d0U1gb*>PO3uB{DtWC93t4#AF14r6kl&8O^=w=OLEGU< zeAt`2*ko|JwTbSV-f}oU7IheG1P0IIYU`i#rphbB>5C(G)cj>TPoqiby;jbERZWm} z|0vvc_DIG#lzX?=)C}1`ZjGh;CoHrDpbV#4w{hdkw_l_sB^h(&PJcFV%3)=AX#L3l zuIZTYjl?Fsj(Sqt&A(ArX5dBCW`PAEuN*97WD6)?mpb0poU@(1i*iDffr*W6{fsY; zlX)=C7C&;oIpg#2u!b$NJkSDWq8645X1C$Avx?1P;cYpvC{==`W!AfnYEQ>^=S{u8^-<(+q|<@Ah@pznJz&G@ zH!uwj4-0v}8atESN&?qOx1{B;{k(8N(J)?+oeL1kB;V}BbhrNg{hI+>r(p^Wqvi;# zk;mxg=~aH}Gy4SM>etIv3+ijg|H=DL_%z&FcEp_=Qn-$86LL$-K~rxGys1+ZucO*X z^>yPG)G}MQ(}o>$bG!1&!oouLPBWS)6B3Fs22c50dZ1JLz!DcF(Nl&-**VSibE+^m z@gF(<)h%@ex3`djOvp{IUxywC2=xQ@_0IOhuTx0$@7I#q`M-bvjyXC)kFMTYarOP* zO7s=8(SKFc|F`^LfoS-Jfr3C|lbN`<^vEW3g`c@8$U*n@AEX;HISSV!zRw>u|L-?j zF**OWu>CjxpvWA9$9(-356aV1?i(QC9qF=3QyQJfIVDoHK2mY;cs~5>jQ4(+aX}WhqRGsA6FT@{6ScvMfA$Qhdh=`L73a2LQ9sVO4VWiq z+|hYZn$rG2#X;9kEw#xMBq$@wDw*3!*RG*`jr`EZ{Wj;8Es^fMy}d3$zIyul8X6kN z2i+zs0MPuILJ31klfVWaH}?-Ud54~tcl&UovtaFi6%tWB-I!tLVj{-MxJA zv#E?yo$zZw*9_M^lsi@0&aJz;L+Mmd`zCSvfzI;E$xTR2 zjq>=tyd;MMWx0;+^B3R$&z0YjD$>qOPJPl9 zMg9Uf#&igZNcRei7*pRvpE6l$GY-VMb&ySB+S=NHW~ElAiKVQBBAhLE*=FZAvqNFt z7P7a=3b|~Lbp3Mh&cf5S-a`9dT@;s`Ufq+TayX<7rDg)_qc+2fRwO_c78egYE*H1r zn#YbBizYgTof9x)x+ui(wcMjRMg5px2TSPpy0dq{OM(&8jPlJYSWKay${y%{5R>oX zPZ*8{t`uW9Ft_a^$~#2tkVW{Mc=cVoSK>xdP*TUcgv%y5(=2xi`*^fQ9cN=}DBMS7 zWw|2@CB&30*b~-odr5XTTW@N2bZhyRviyP>q<>lR4vm+Mu4JrEyY?9IMpXC{G zsj1_GgKN8;k;ULyp}5jbOltow_y50;;7I$XA$l%8w9Ki>4}| zcfomCf4CI%DX1$-gXH(&Q&IAbH1w2k+hGLpRMoAo`p6@1umbSxVOrZc-(46~2A1X1 zQE(}bV1mZA^cguhM}~&X+RtF@9l^5xp85s}MSLDt3K1tmVXV|suCaVLUxbWqWfRTZ zd(nJ=su(2T(xk~B4yAHOt{m)gwn6hbptXT&0ROAe8=pwWEb`+^r_swg7!hg$BJbYy zR-L*Ehk(FdC)(&%62-7kq-ORm0nT(&Q`QxGnTZPlzywWo3GBFGaMK8+Ih-;wcUJ6b zT>iV9pHs|$U|51LUbG*^vI1Rd!+nD?E@UF0AEr*(68~Q-{&<{X=RhznLS=)RBjP!L zBuZvY|5qXImY_NTwmr~k0GJPp6Aaxb&PvK}E-o&@XM<6HU}(Vka7bBDX29Sp;rrd# zefqeX+6CPkSFcJt)KLWn2CiLu5lm!61B=iB91VyCj(h1tsmU4#1K2mn^Zd6%5heNE zfsQS_JUl8-4PDk{VPa~5?&?a-eGX6;^*0&FM>IJp$@P8Z!6u#sch2ptl~q-c3@n9< zyY>vg1B5?|q-JW2 z-H;o+py>%Z{nY8xS^-4jC|s>TKA_k)lu-b+dT(Y``H^+yP2hIG9NlIz<(S?}A$JDS z(f^@cXrCa*K(38zPgwnpDR*dOB)t9L+Ue)l&*X_3!12bPijKF!i|!Fxre{$q8CwtR z)O}{H=uExVv@86x8Ct!S8IbM{%9=9uFqms{#sSzoRlB4EN`32YK%IQu_prH{a*Snw zlyD*{iUUSom%j_&1L@dSZrKQm;yP@4?ARv>y?xbn_Z7LD3FST{1KA$Ex5gv`^vNSB z-baRf;e_VI9>7Y=K+W z;CKu??OHRQUU?;XtCKk{`KzoYluE#*c+EHvn3Yb=cBAzHuEI&7hIRa&V)YwNyiN|) z4WP`((acP{SQ!!;+TZgCO8+c>Cc_imuAUnHG-5BN!^A^5c zTY0@+N$xGU+LFM|#>S^FDH9Ot98#U>j@f0`Wi4{7W`tjmz)D{@Mon2bPf4rH)#&sK zu_Nf)puWa5cW3!+7ZP&eA)DOS%gGHjd2-O$TCuWOP7`H4w-n;QzL~BHN1BPP&50pI zIxbnNz}>>sJ1!rqSzd5Kz<8`KJu`z7xVDX8YKx_=@}n zCXRk2&9115^@TEG2`AawBY#~0QygOZ$Uo>a_O+%$=X+ zKkO9JrRYT&(q>rXnasZZI6h#gV!u}9)l6jtxN|=69)~*R;JdcAB}bowm;k2fX(CFJ z-UL#(VSoK$F5!#&NNDs?Db_r}yM6!iRO+IsWY?`E3I5-{G`+M}_Y>_1BLvo}jfyM_ zrbMTW3R4buMuhBSTB|D4(~!CCe>qqyZmb>2pqQFeRB@`XOGmL1-OnCE|&;{0h(5>*V9MO2~66C+rHULen@WlrQ@3DzWZ&rgJR25NwMcS5Ce47!9>N?2k_ zH_&ly4|0osf`!F+{&I%9jg6DqVXH`o*R4 zZBnThsW;KnYYU3(rB0Q!SO0E6b2g4AA{Z%3WN$W_$oLGda^W0jn>)ma3pRC?m6g2b zPi-1x&HX+-q<@?GfMr`=xyV+oRQk-1fc;u*#9Mh_o3rm--ja>IA#lGTV^)A+JqUnO zxM2sb(C6H%s8G+Yyr#Amt~5sE<7D$eg_81e$@gXg=U+;>Su*YW9W9c}sl@z9B3`R2 zDUo><9i|SM90;4}{_vrOEBE{2{Am;;yCB8`J>e&-gJtews~Rv<>J$aBgki1&>quj$qMy7?cd2|6 zekL+9YB3cS8Z1?97eeJ?fAAF=sR>0-L)I8lx+uSP_JdPH)FJx}qC2(MfX@WHEM2U9 z3&f_8RA;jtRfPC&68)Oh-Gy3YLdCJha{Ff_g%XrYO+KrjJL?GyFSE7r0(coL&~D;X-SL~!GXj$jJWt7 zQO!#8)>9M_7z+BHE5Zy$&K;_%>&hG9JV{@ADRPR=Q2#s&wT~gylcbh6Ilc+Q1Qbtz z5IMWonmi0W+{h4(rUN)A2;?;yVYHrJUUdo9mv2ZrQY)<@O0&DtUY|REe${&rY!e@9 zYzc%ywKa9@O0an{F|nzJZMG&RT6+X^-mzO1WTXA+(o*=Id3#?UO`y3HC^dJ4A}LVN_b z=}@qax)-p1vlgaU4OM(tm|s}P42o4fW-${rr)Q{d{aWB~eiy3ktPSAj3p3`pj@RkC z`%&6%7cF_x69zVV<&U8X70z!3!lk35%P?-(6k;?ZjFweXJ5LI94yAGdW^S~OT5u2Vp*2hDK*8#1(9+Ybg|;?lm0Ze+ z?6XD#8`XjVBQoB`e%^8cDbZ`K@n)3dv-Z>9-lH=&wh$Et1X=-}-e~$C_p`D;&NMzcaDqhnQ^2Vgvao;KttrIcK{k*jaY^IxZj)9HnDyx2+ zZ;27xp?i27U&Mu$p)t-_FY76(?vrPDRuVZZnRRU}iUxYw4rZ3x?E5N^(rDNs4f~7m zbdc!VF*Bbf?`Bn(KZj6 z^X&Y&&i!pqZUiTWnbmzeX?Dv6ocb85$2U9j*{&#a#f0nB+coaoAssVEIehxud|cL| z)qaqJMNd=M3xv|oeu4j0wegjZ3F>gc-D%PoNcmJut@qIbn1ayAQnEnr_62RG=;L5v zW(Iz#o8^FaFN4T84P6@)^d9&bSD;lUajE)M+Fo0g)1>?NZ6BO+^z@W6jBI;P!t;mu zL&|UZ6O=`Y6@y}+`cCg}aMus3PgV{M8->fCu0?~*{L?8zv3;!c(12Y79HpS`6-V%& zzpl_Ol#5XQy7DhpI38S+@_YYsB>Y2O{=ac+nKhD@c_~*d*bE{E2W+N0uN=x2(nkCD zw$gb1Igsw}@pJzlv#UYpDRRnpNE7~FU`v=rX7ToS$}>zs1#NaNnESa}{+}smbm7yT{`h8dx6_o%0RO%0ivY4+uD&%er z=pGbB8NZ4CAH9@#KnoPou`#2~8PBkWzsxo(DJyp_h_6|@7RZuhuoW$nFoF@K#Ka6= zjuq~P69Ifx^v6X_WlEA-Lm9*GuRJ91i+fBSHjNVt2fnDh40i+Q!`$-n@_XWba3XAxa?liz zq>Q|$96$ZC4iNhNofAeSULkN&0c;b|YWU#6Zs%#JcgbY*kHM=^+4{N&6TfF(L2qJSaS@#xW+rAxYUKSS?!Jqc1LU)_5h&K|H-?@1oFPkVT9${eSixa!FV z4}}dJ+7!mX)KrsPD1Wz$srCZUHO)^L>QvB&pOZ6$<}Ppy#`<&vnmKT1VkVX8XG*(0 z2A3JQjI|X|?=ZEpLg*fb1up*O=X122l26*&NH82gQ#-dfb*Wa6q4ylB{~RgF5dtVD zHiIG%r&ZD+{7*<$*4E!=XYut|7#Yu7hsSp{z_JG=jd3qBb8zsQ`L6~@h5!oF-Fn+Dc;Sq*h{O+^)z_hd3l&c5T6@lgDH$rc=zIOjmi zqF2rbc5n#Qlv&(6g9CH`qx26tE7JMLe+c^Zy0@46p$sOo7BX!Y6r|%;Vr>MeLm@y~ zNyhJ52hjC!&>MhVtrBJvL}d$(?j&U&arRK6J=^UsK}!n}%D$Cr&O}>p-F-^)BJrsZ z9K??345}NjD=6+mPRI%}4xpilghA_L<-U#l-8UZ_1SxD*J(E(U=gx~tJno99bpA$dq zOt4sgiB0GxMzxn7Czuyc7i3pxR@w~|OG!%ZlioUol8BeVqV6(0YVr5N27`-8uz=A| z!1M63sfjTnSL9rDZKiL!)l3Iv`N$j6bSkH|d(el@;k6D_>=X~JOxMWsxUuh2H2omO zC~;k7HXPOk{%VjSL~^c~Qf_Dif-?XFylo)-BIZ!(3J8{ds|@=w(MxfSPP<^gejg?4 zEK`ezZEog96tQ=~D+>)G5(&*rR_Uk|VCgwG*0$^D(ZQ&wD2xrWTK9Z#_a{0j81}WE zoG})n)@qjgv`RuPjIEGqNe>p2bf(I2bxe=iou)(|lM@c@Ipi~uuROACPr$wz49-xLj^aAM&6H?R)I(=5#8>|)geps#uY+q0 zJyuVtKI#P@-vIn(L5YB$yzmF0ISJY^U5HQ#XZVs+f>|u~M4mwEAXM6%`Ln4?hg}lAB-%t?F0e zrE||Z?$MFu?~>z<3aZeMtgdkWzyUwq4a2+N_zm?h!Hko+(WLTIKXWv>TuoQSh}Qqn2VI?YKQF$8<5jIj|zE$RdPL|PY&K9cBDe{ z@(b@_M4u7&X1T&&*4e?tT^wq^E-9PH4fI6!Xm*mzkfH=4Re`D-F;d( z(0^ob@N|FedV9j_WI36oHR40bX$cL7%L1l2#0cBDmtYa@e{7qQ1#UAqYgd^1K{m+8 zCLyGf zujO4bbG8#^keXeeqrD%UjdkDEtOExQ48k^IhM|CW+Y5P==U-k4TWUJ1!X;1On2@TQ z>xkvkV7+3RaEk|B-IlHoS}&Vf9JG%3bS>kSr=Ffb89YptgIXWaPFJ~_Q7E)h5$B0K z%{Si4nG#-S#*t}dSwg|8CzIKgs^JP~d(mJ!P4VEZ;(X%0*~hgfh25>?qk#jf_2a=8 zj|9YLsUHM0gocG(cKx`4X|+|LM|;>vQcB9Zo}SBYHd`ou7siRn>|Q?j57eY~taw*0 zi<@sDU%i|jsIzm(8L_>xKe1wUBd3C!6?iKHYI5*(1GE5v?6V51yegbx4(1XPxTh21 zs&VU+C;RLP5ZW4T8Hdb9c-qYH*g;;(2QGMx?&iImHPljf^Si(j1m%67VV&uZvbXagEL0;o9x*i2d?@Jb}8&4Y1 z?jb7Xf@?=2YG6>Yyh!{T;;wVk{d)e`V?15dDYjDfBvJz!PQows^}jEOAVv%q_Lvse zULMoSj-~Bpe^$hQzu`ew=iJobkiwN?uns))-m-cs)@OF4rOWi>-IdHvB%p{v??5tm zAzNw~4xI_xbjz#o|phLKiRM(<*97Ef{*Ye6yIg`0%6Y=P%UaCKBRU zyo3lmuc4h%+<;oo#ABskGoLymNE9}J4YT(xdOPnnUPO~%3dI*h&A+Xz^dJs}&|^>< zw@ubMOtiJIq%-K{V}DKiT?S_E{nBmiC(fLaSMp6=KYheR(MI^4vsui|+9+STUte3Y zUcm8$Wx#-;}xg8 zD`#oDhn{X;rG06_O6K@+qE7#`%Q^?`>XCPC)=$yE{b{hp1tz9BY^v6H`b}2j9?E6~ ze~mgSU}QARp`Lh3P_a-3=ETrvXtsXZVr7&Ql!>MU2M)wv{J+@*Ys-s4{+#YHyQ7%; z2ao;bG*+hxs+P?knG5D`a#2%S`m>6PB1M88xawV#RX&D%o%ypigK01>7^wup%H>TB ztGM%ipcl?xL{9AFl^vHqe)<&hYaE&1PKuY8(vJX#&;XBhAIbOz%y&BG*1e!DOY2zj z^=8uT2(Z4XdB$I}&l?b;TH_s!0eU7r%`G#HF_BIaG%iIK3Y6<8)bvu;Og;B?PSFC= zo+&m$?y2?&F7s~lBL8t#ab>O_B4LD<{N^{IBIpa-cA((>o1CqeyGN4WQib2F6g4H> zZZcvpOVr&$uENPnwPa}T8dL8kVMP8!iKDH&E+wRuHSLOIf4vi32r4ix_WvKuy?Hp5 z{n`dx=8%w(Bx9LFDWZ@eV<<^0851kYkVHw5MCN74RHQ{zhO`PPQ!4Y5r3e+uR8pDB zQ2NeW&wlp%etRF^U+*8^KK8K>JHuM*zVF{PoY#4t7eKGsQq8=IkPo~+!A>;N+Wh3z z(o!IP(`UZ*1=oJJuMCW6+655$VW4tr(eAxo<6|%LR~A0Ni2DyrVbMB7-7X*J?wG6xby_$8C}*3 zk%=j93i`dZ;p~fo^)p9UXj%j~WBa4?4nwYQD`lBbFSd>G<7rt>QhkAc(-Xj-@Ta2M zCr1mb^JdF`ap@P&{;^Z0??#!I%y(KV%0_>Vq&{aR4`;w=+nW6HC;ko>oe zUH1*wId8lbDcxNvzk zUUqcls_;*>V_lf;C$76;^4!GbV8N%m300rn-g!dYkhYz4rR@0(?6=z<);&?XC?Pe- z9TT!Sn>yjDhe?cg;$8R6mbQ&`Zl`lr-PRnmbcp~Xhi_?2c)HEu59q1NmRwFx@ag)x zx_@7pa`HQ_L$5k6?veW$7J)Qz^-($BcGly^o<=UIOE<|mkou{xZ%MA>`2Ax#~JEM)I<%wK#u2kCtLmn?;HfS;dyl6F(vV#}Mv_srRfaW!EGn z=jQZh>29;+f4POkb@?2Gvt+A1HA{}-P-@n3&jE@tAs0W)3rw0;$9{(Gt1bB3Xncw# z?}@Vdm6{*jW!GfTQa{#AZbw5&QtoDE;{`(_bv+JYxE0ji*c#5$%yLF&ix;nvR!Sbt zDap)a@eV4dT#9ns^-cEW`A4t%vvCcj&-EAV84Wo~jO_kwt8Ps*HSTR zn4Z4A4ztY)fDj$nYhU*2*>e8ltFgfT=_a|)G!PlTWiWWFTyF226LaPC4; z+_+xfuwW8NDlw6dP$c9|-_zPI`3Im_lvw-+PVi?c{|}Yvf8ZZ~01ph^7m<+vpM9fX z?kEWj-6=o6j?PZcjytOtPW$`cIasO)Tefr|PImURO|D!Ac?qb-jdUv&L?@WsU~HTW zX%6~ukV>2pSYpszC3O%eCKS3|lt0K0cJG3`xu+Rnln2+7<6*YQK@^e<`xqg#8~y%&TvvqlEnJ06I(?n6L@(!=&gg znkK9x6nz8{O#@9-d%h|zIoUd&4DQ#59#jGd)j=pV!qJ$l;GKc%Uw^SnU=LJv5T*t0 zv$1glcQ6GyiqEJGK<iGEh5^o2bMxQGd9C+H11T_IqB!)l9nj5!l;dc}}{O7@gu8_iN zCl&A);Ch~WV9bVWgdTX6G9l0g1xH@K?tPx+4Q{YoAsGvKjoY(K-#I~Q@zyP;(?FqI zlHXnIcwuI3_S6{W!s&TCo38+XlLL|Dof;dS&VtOJ~(|L*{c1ZjV0V4%34 zcadBZw$0q6xo+FJg-14UU{K))#yRorAVw753W|z~P&d@F{QCJ5(~?8T>vFkL;gON) zn_Oc;n2BG<7`)mP9!0As4ukV*D+|^Ju0Jl*Mny$yJArqTNTf2Fohvs+Kr?8mkd|Bx zok>ki@bW8*xS(oZuLw~8b;^K|1R_D6s?APFXvfk>Vz`0Nia!)t1afj%(L>*lAu|x1 zgzvfx$;^w5z#7nBiHo#a9cvHy9ss+u10_VU@_NS>4bZB$*#3EQ=gn@HmA!uYGzaer zN{5duM9R-C#_RkUg z-!d(P8{)nH^Y{K0WB|9~n*Bj)|M#E&8|M5Ms!A9&{CVAfe}j%CSr7CK3_31l-1!@V zd>9G50X{vip4|AhwsH5LzdW}THU9?yaMNNN)^79l$7Jm4m)fqb^1@SM<^~4OK;Y`B zF9Xqs590ZApwWG`^^1VH^JWjb;y-`kXlU+zu(#G5PkrvXXPMT4n~DFMgqcBRroD}g z^wV_^EP_9XF6MO*;Z{s@bM)|d1MLYc8{sr~)b1&C-s!>HFFNyKmzTRR!R7?f=`BqX z=Brx1BQL&c7EWF@BbLelIB6We??ysU!9-qZv*Pyczrc9`?_(5&AxN18Db_wdDn;(N zUhTK+b3tj>gi{>`SI{i27ZnwS=Bq9}Ee(c|;Yv`cY~9KO7^t$KK!FajB~(Gg{2o<2 zAa#QczaYwqKZ5#xWG$iL{iA;x7#I*$k(MUtX!IcT$lKgI~4C2;}bDvnONmSl_N3*xB2=`uc@|cQhN#b)y@BP zA3~F*4crgpv%74|ee}D#0W*2$ih8~V>?*u5i@1CAM%oLPu+Y$~Cnko5-@bphd*G3J zq@6;qg0(z-lg~gs*c!gH5$m?wMr5Ro(9I)pC{`~zT>qf=ReITS>(Da|!-t`MN2aOG z?bGGpmp}h7!r!;~4-*EA!ZN=xp#g27_K=<$-WOF5%gS*5*p)#+`-(S%?%K{ygdW)p zX@YZ=60iKu`8W}GNR!!Sb%uDB-KRYBaX5*QXFHwtLe6;?`#xBPI71kFU4uIkfxW3H z$05T@M%m%QLs?nb+Kv}px>aD^ynpYM!p`5n8Mv$RrcH#)!Fz~6qkh%yw6L=@Sf*Di zS-g$Z1UFecIu|v`g86&YbN5A;$fYOeaT^`mXB{#Dp8)UuWD>0UyyOSCciHy|A9ceeI*_~yGp6I2wvTq~Z5)_x+ev1t>gUggk)xd)%w_9Cm#y5Lp>{ooEVCcE1UA7U z3zz-88|}-HZ7J3T@x{WekjEnamB1^$*T)w$0phRp;|Bp+i6O> z;^`0Zu>oTO1vbZP+t_l(6$}MCo<0j$j&z!4{mPW%>@~2yoJsiYbc_txoKc~dTFY!j z#mx730cfp$72A_InrRMs=~Nm}5?yUjL>eO=kwMPIJzT_sp1~xVrd$A?Cd%a=xC9?K zaG%_6pa!L%4bqc7L!i{QP5@R`Cy~ay^zy5A$%wMEr$aE#zI^$r9=&{?^FOqO`sAd; zu~^hf9SehSX)VX-UqtUC+Uf@S`y7Bq-=g;C_0a(5mc1c`YcQ8`sIIrmQ3870uy7~XU z1aB2i^Y9q-%1ldrGIfW7ZI9NK)YOPVlbkn*A38FPE-TKy_;rIr6MC~+Nd>?-ELj5C z2`fd=*?(|xs9F?Jt!alBux=?BY}c~0#Sh;Av|UTn`-x|&-$r%=8MF31udX|9fpq-M zgoURUGZR=D5_Y*>s1TrRvNWxePUpAXyKVDC?)`wtBh0K6Y>o)Ca#Tp%zat0|#C@uS z0?l2iKsM=67tM>U?pxABrca zYA-);eDP~;)@jq*P8ZE@DojWSm;0m zTBqH-h*6ie4}LwSOU+lU;O!#lG1ToOLYr*t~gj z=;@USiIt@IM0kqN8fgT#k%1&rlQl{o1l@<0tN&sn@P8Kwf#+8GyDdtAvzY zWndSQSYDp==R=w?cl^2>Nzyze(Pla;EwzQ2l}$_!Nuj{UM9HCk30LXj6}!$?EH_YK z`#pUZ(%P6A$5y)U zGMX8zXhvYau&4gVxskos4>&3E_|Hw{L!FQk2BKA?OS}7v;rkw4ylXyp6r}s#S;jF1 zD*@b4Cecgq8I30+-`c*ty?yfRrsszxwGZpH zI;aRn)u(W>m@0)wHFPud{;q}Vp{+6 z_lgzfW8M4YDo4+rbAQ#H^R@!cBBtA*c9lQ)0Ly#NjO|A?bHk&spi4$nAzMwDv6N@1 zMzm^#^;|&xkj^$3h4~=@;qK@cavc~=y(H3k^_8DwM1=(z?s{wWS zWdo&XXOY_=MC}-r3sz~}CInC0C1ru>XdsoEe2SkJv7X;qlGPT*wRUdXNhDC#Lt*)G ziK8t!!9u}ba(@`bnd<0P{Sx6MuZ~o(%+_;rlm5KBsX9%E!cWL<^7rHza!aIcKl4CF zNo{0qS%IVxMUsB{!$eSl3u-0k&BnQe>Tn>(df16?8S#=In^UL3YYhzz1yS9q&{qA$ z!?tzV*na_0J_?Ri(iYX45Al=uFLnA_yfqQMb#+0P{Pzak63?Ve&@DdX4nOAHr( ziauxf`^)vkpBGn%PyXLuPz+6|QpBJ7_ZO1%KYyH;96?+B;eWoM=#l<>>%ab;Ki{HC z{r&6ze8Edz{QHs-w7-A-pD&F5^Y8rgFaLf&|Lqu=I|$=4BRv`$YM^2-n}gWtE7 zbw_0jk70GNs^#|(Z%dD~PKXSG8#wCTE{%x|$m(c(amm#2|F*WhK_tGAhq3mDZCWUL z|6HR8+744X!F0)DbXdM_$0L-*sz+buVM%(r+ZWk=x8f|rI9G$csQBme#&=vYCn0kh zVg3d=j{PHlM{`i!H^1sR4O&;975;f<9d+fOYhgJ0WJ3W2r`qZwkv0G!>;uR3(I zW$o(K0T`Ig?+Xn4nWF4`nNNm-r~dLPIlR)l8wFKACrlIp;p%|g0B*rN`VwvGNsRR& zO{6#{%O5blqDYjxCl)Zr#^z9IyGLpt6Xg&1G$zVmF@%Z}agFeZwVSWNiQ*g~IwU0J z!lD>qb%qW;MO%Wf1qWXE+Up`RjeXjWh392=@z`PJTWFQP2Ny|URXN|vl}{eqHjHD7 zNcACH#&Hu8w@qc>toB_P3i{#dJ5_Kh zjYhCPZ(A!=OF^lG*=6+Q%O&>uP|}8m!hNqM5Gt?DSH^m)GC!buPQMvEBsYQVb1Lip zT_`oY$MMe9(U15c=i(vwdWD7_;h8r=wyjLcrC7Z5eOL7QEvaZ>8e$foa_V$p)!@<> z=oZaz_vpE18Xm8eTI-%Y3sDiZeDf9Sz}Z}@*H;b-#Q?Z>uQ~?6$!2KlxQa_-wIh1& zp$`J~fjWxXNgK)DW(Y4hcU8X^&U|v(tJHN>&AaxRn0sr~IxRcDzdzxR4`)gH3vFfW zD>az_F1z~0CCR~DXse&s-4`RH%@rgFMG`>V9 z31(Z*=b6U!XU5;_SKYQ>JY*5HcW<{|0sn?BZyT(J4+B5eg^lOrEFzj%R){pa;Me@l zj{aPJ!xGb~pDNh<^|bkE5H>mwr><%FqS&jdU}NF_=P1)pcN#U7TZC5r`hJk@2)H=H zxZ?^K;IS0g!t`72O3lG{X2R>%fusEe6+(IAUVtaZwXkWUv-zsVl@GWZbMNf3^&-IX zJ6JgJ_U1`=sCV5Z;s)NOC4C!mG*noi0>8J|$f^eA&aSfi(lwdA>m6?6 z+Ti1VM5haIvpIUB-6OY`c|3Ra0uBZMR_zKmwXFjKN1f)Y+wvi>^TO`RFT#+hTyW0& za>YKV91j6>3W(9$j&*NV$x*UDJDpVi^ykaF&`W@-zolwBCO(NgCdB149DOT=V)*!S zj3C?1wLo=bE@xjQ`x3nNVU0J}Gm(ae&^>_BqJNq1uGW^o*-z1&+UAJlGqTvc2dLf`zlRA?)K+c{vB@-uEZ6HfB7$8NX91{E`Eyt@`ceqA@`pz{uL+x z3Az7#fk?Ud694`0{P`B5>px$VPYZmMh@l&E%U7t@oyGv z#~NG01O?FPxn_~nutPYItQM33p@_v4fM29e?>{?lTx0)xb~y8E_kFn(Ig=#W>86cU zUfgTfK1LMWdMG|GFAuA;x?%-3+R5W-!E?4JqYt-+;vxtz1i{Pq+U!ueXC;nbuN<&a z*bRkm?c}SuGO&F0pBF09C!t4LXqQ8b&-eXEhqwq!d6(sinydbgmS!{{9lM{?FSCM%#{oMT{S=jLS?tn~h1K=%ak6e#ofgTq%*&%8@c)*DrGNWnu1nQImlNo*ndL1MN-L?h_^@;pVX{vIXdIc>377?P3 zCo+_sSxSN5_w1t}np+Cmbm)_OFaMgsIU67fRh~ug;bYv}F+<1QZMco72(P=lozB%$8p{tN ze2ME{o}ut3>l#>&~zM4QQrpp&?#+<2D`!x205) zX#<1OkJEAd;zP(Eu@^Ff<|1bFxDGO2e-wGeU?36uw&(tuw{(w3AsPSWEmrak0M4f?30a)N83O*en9xK4JC!Y z(TnGc<9FKG1v7zO%BD83EbiRA#N;Vm^L2-UaApEc?H**0u~d&QamnSU5YU!zv*J31 za;l{OyLAos8saaMRO^au5La;0((is0aBtRdUOU=I(cMzXu)c5$Pg{bd0=s8&2Ocul zJxg|Ql7rQT_{F_ZkQ&B0he$~+UW7kCca4;G3hK%X&9Y+vS^Rf%Y%KflV6i zXV1q>YF-FmrknN5*ZLeHvfs+>O!jwdlw*@QDk9}m+v?M`B#8JYCp8ZXj`)SKwlUql^ zSJF$&c`Xr8SUCk9Vn$!)J9peo8Ar>q?Z7-OYx8LZh+Tv?AM56Or(*AdIEp+Ua85u< z3(i1RR#qtdZ6myL5+1|S0Lrgj_PpZE6>lq1{a_Z$J|X0#E-6`;%;Y|mP7Fx|6m9F5 z9;Z3K~eyP=%2viIlLcO5MJ{r%&`^*NdRak=%VrK{Vb zl*}kp{Yic_z``)kgMDHaWge;K`I>mwtMwC93qYMA^v#{cWuOOnNWlw)s>1>`c( z)_nhXDsA}Aj;`sEwkOunB0uu9p{QFdBR(T=%XwK0p`eVE7BiU1p1EoII}d3e@xK|j(fzKntTj_)qF#Hgo!Yd98=z5X)plhj*&w&es-=E6xY*(U@Lm{r{MYPfU`677PUsWJq z6GF0`nZ}eF@(rb+Y=n6N0E%THV%ztWDCC$tjIQ%d#lBj_`;5iwmzM=em#dsdzY?v=anhiF`2+a>Hn6tef2RTgn z)~s88pL;<55=JtAeGc!%@DYm?6=ZYH)4YD5G+qA-P9te5Ou8hi06bk*RFq~}ukgdi z3^K&jEZeoE`kmN6KbBa)qz(DF0+?9S{wlYoB)Lu$+2MY^nTLL6t?Yk`u5|~B&}zbM zw?50ECM59_W=O?Q+y;D(nXwWpn3?f^xGF9?9Skk@sWr}AdL-%+yY?t1kIPJ1DWa#* zwSG%XzNwp^7(LFpbJw^T2HBNNVRA?jVgl!yB;~lo<+alP4f9QrE2s)?h(@+AZHa$1w=cOQ^N4L zd^1|m(0)`9-TPUTlF%^L9lUty(i2v_Qya+F#dO2CX**^IR?a80W~iO7HTwA$PW^1o zGV2Sp%g@9m_iMdZ4%dxC*`Lwnc}^1qAzy2;gU;&TH}BJyRQ~ug$RS>KcmO-29jr565BU=hSDVFH0@1?+gv# z_(Cj3@(jq@+VaX5dS-ahk!;&Sd{ZTx? z+Y-Pt%EN%6S43L)aPrRI{Xwr)+WhtyeM5G|kZj$VJ26aT-5xMt?{wd3$L8XY_dJhU za?i9Izu7tJn4tCh=ZSArm*NZGHxJfPzP_#aG4aaaD^m4diHFXBU=``_g(`gtduJ3b z?6pcDO)5N9(&C)ziQV01F|b?1;nKI`h}imq#fL3XfV=N(5HHZa&sHKSk~HBiX`yOY zJDs?fXmSgz)+>B`%SRpjF}?h|*hb|iAJp^z-D);+jx8DA0SWx=5HvZp#=kJzv+VO7?6c8iv8-P*& z3ugKF0J*g6!QDTI0Wi|PQ9g9vyyV#tgwR$k)tRBhloY|$t3Qr!c$M%HF&Y{3lQ*F+ z?I^Ne7Z?K2s`Om;!M|T2XrAN6xw-aCRD;POXF!@wClx7}B`rk9#1Oim=gb%?#fFC) zo~!^1*k?h<9_v7!?~UKtKh+ zOoiz}m=uBg1jCgKOnvYIRbup8R{3375mprfxkR)VQ8s1kH8gmE+AV!;f|*q5?a`UlDf zN)XyIpW#-spAzmitj9MQtyT94EeapUpc(n034uA`GtWVe&h{thXA{Utvio-G>N@HT zU+x5l9YH-FcN|wj!)O#aA2h2Wxy#4V;d`0doXS964QQ#Fg)S4oB5old+~KQUR^Xg?+*w})B})*M4T!FVZ4QQ4no zQA6hqcvX04o&e02Ez2j}|Abok^W&hNItu?FF_E#c5nSJfEHvx82)8qkQ*&gT0{?Cv zS9rGxpZfHYjF}Vlf!`P@d#%iwBJvo<9srv0XiKJeD;upvUnWQwx3Ru$9o-Y0gi8uE zMa<$$96vMm>Tw9Ogj)83lYv~=rnEefWt4ju<466J4L@)CXY#A3aLSMx0s?LS2eT2kI!8nPMLA&*;EB>w_I1(e?zK3TLz#yl(at`S4ZZLHT^~5mwLX$Fjx_27MHDiR~|rc)bFg%AzV3Z zBxfNewxv7c0(fo9p~G`Fi)4aZ>ra3hpBS!@=-D?=XdC6g>}dHG#|)9K1N1rU0LM{b zdb>x{l(gdzs*H{^<|OPgC`trsgWBQdd71^9Fk%Dm!3mtV&De5vzA1D$F@z zyea&ySxbq2?c3$Wehn5tgARz7OzK>S7`3Zwua{qxi|G39%x>t8CwnL*Ou;HIPJR6d z!@42Cus#D_5>ux+65-4Iy~zi3#81}*GTEU>Sz#D#fA|Vo!!R07^VQL|DCat@I_W;e^Oi9CQ; z^zHBUtrY&2*H~v$?z8wLa*=hmkc0LUe!m7Jj7`Kl(ws$e^&)sfxi9Quanm%6oFUlD zapE{MLj>J&=Iu=v5sPh$XSwj@&mk_Y!ItzZjEx@GNW0UwMEAAmKpvAB=nDo8Ujngp zvspR7r6ui^@X7)#c{_OKfT3ZySOG5U>=5AJz%zs%67z-%m{1LTX%9&!A1#YM&U~Qx z#`a>$oyi5o(*?wQ0+~?;=P3Q!`#zj`O#U`&F*Z}AOo&43DUIc|fF@Z-9W=IY^_z|8 z;uQesya&3g6I$O>|5`z=@nbauW;S&!PaxHs9ZpVM$ht|_NQlID0s}f+lSHt za%uC2RX2gnIAoUT@7e{=KWYk%VepF%X{adoP6ad-rxcrM}A2Va%%)UYV|i zdQg{ya4H^83_@BSVk~9liaz?=bEJd4+9Wov)_4ilC3VE8YI3k?c>WoyP{N}SG2HA& zfzwNPB(ph0B~OI$hw*IpC;}!(J4c}o#*^cy(=+4FpD!o>K&ZJ$#BJ2*!8ei8EYJ2* z*2Iyp*7U^h)tqBjXl`~w&m}70tymFs#_(+ZG^+E#4k=>B_e10T_{Zvm=W_QL9}hZ0 zcA#g>P=2l@hvC6dvzSY&wO2r@oSFrhzo9kK7dFHD-B{7dU*??+~7EpBqaVIg$l zfk+gJenDDK;!nRY(0X+qIOSc>0MXYN<;5n{-9w$EjQJHPOW}%Z*qTVP){gN^sjZ>Pba>V z7U@OH(j9mPaPiD5#ri*`Vj!IYgU@E7#9kcxFP7NE?CW1MuEjanB0XVoY_(Xf|4%Z) z-y^L59G79J%Z{TDLB;mhvpBtk5&N!Fw_a8A< zCxd#`<)!Jk}zUR>dyxa zczeilCK>=p2~s&TJD(a9qFHZX-(WZg_p|z|8e4U)+`&iXC{3jT-mTp)>VWKqp_dPI zX_99`y;_r~$uP;nFgC7I{Tv~pG)s%K!XR!5kC3bpz46-ic`OEMQ9e0r@Rb2!BC{iX z+sUKAJuugC%ZBLT#5~R~VPDl)SP_Oh`=D>y18tM zdsVYH8Z=ZV4#WU>1Fb^g){Dk_vdntP|B_$gp{37_MUAy%f=^Og?#ykmT!@M>fRIAWwsW|l1$QxF$7^o9e#$cqO`cazKNA7|X;0abVK3N3u}e9>02 zB^B&&FYvl7P_vJ0P*jX*oL1kAi|S)os%B(w3-5KLemA3nC{-l<Kem|DwHoIe%5SVXG_LwMZ*9$1+}!aU%LW`(*|^jfJOi0PVBi;5llH4!2DX&5q74`%BvGk&`3*0R?B zRpkdBNtIcw^4G$rS>4DyI6{#gV)^+{=GpJ7mp9d%>ODI=kWy4RCo4!Vx$Uma;>V@# zjal%?^RF{51rZaSDh6tQVt^$zej$36)quP{bhdSH+%c=+fJJR_%36NS+P zMZdp;6Jqd=N~#OCxa8TEmy9wvL_SQZ^s@sv;4tsb*q4t=c<8mK26Rv>p4^j4Byf@( zTfLagRkr~K$VezStqE=ye!^5o{&~Mf;t8t=^&}z^{7{vHcVAJwT7J>L?^I@Tfc8g8 zg`qc#EkW5pOL}KkRKQVn@J(v9Skd#Jo8a-TzoCIZ>zW-u`shG-i5oE}-_h-w*nldI zc?%VeZDf-Kpn)ZSIerWWll&a^n2UC!YfI24S+O^UEx6C%85vK!_r46FWU zYtTCQcWc1Jz1=Xvbzf8xf0pSp<8sn}q(kz7uhIOfW3o29+<#3OuO03{^e(Cn3-Z_4@~`h!+R zlywqmyYIf5I>zc1o%UW>sTF|lMSh~Qk`dTMT5KH7wxH|Ff#UACp9VbdALDSoqcR_< zF+koC`}U2e*gsANv8bB@?uGlx4fo39N%7;Q_b_CZw{R6ycV%KbK zy+Sj*%#I=P0p|_Ea9@pQ!om;M2L$N7XO_}|@@8xa0IH>%kKA6Jw-%-2ON36`Cn2sy zxGhId%_&1QML$oeM+N*4rb87Hl~4)mnVpf!7?4zODi0{^x4Ou_${c^~>)IFUoz^XBA!%)X?f)RBs&+$qT`w>7-| zF}B8t!cUkomSfry`vGI}A*>oZeyBA27Yx>TIdN%fG_^yYjHp(aCP|XLIfOszkgQhw zvW3yy%=?}=yIB>GUTMC(N4PVNeiX~{NDc%*c&wpXX>(1Rsj;yr{8h+P{YxbE_O72Z&rH2V|%l1ZXTEmDrSJ_MhJW|#20RN67ctgCi_!Zz1;dKqJ=&u3eLLrSG9O48 zk*b%A>NjEk%m7NhZ_$x7&~V~6n2UVcnTAoqq-X)S7sHK797^wvyL(R^y2Mc?D6ydk zmBG#)Y~L;d#tAp#Y71^*zIz8-M%HeNWE7G_0f(6YwZ!&2iuNjIdbUQE+?_T~S9Weq z^6W8I76~$audu~^e8{%qsgTht*9a6zu%IJ3BV16;r|gY|EI(7QvSJ%jmeu0jbjocW>N)sD{(yI z5&Y8FPli^oCLflSRL13A68&8P0=^J}9jsI>Bk$&2o3C;`z8D;r7oB1X^w3EF&m~7% zj1xj^gN!2k-opOWlg@C_sE&Kt^FGnT)u~8SE2%B25(ZIylAjIlZZ~X_U}ltVb?qRY z*hc}I-a<;UeqqDj&XV?~{Tj)r@bpZ8La5<$(#T8WAUOTP*plI;K(wQda^QsD- z9nDMJWGRaz>^%~?yo@Xh&B_g!^(~#ldk&l3_jQew0^=UORZpCy+io2(QW2z2^l({q zJTl3~c+rNVjI+9pt?mWCKZ3SL2P~^?pyqgZ zd`4@F_SYUQ7Y4LV8+v4ql?E9Im&()E4Tuf3egt z7b<{e0~5&yXw-rYM-c#kZZ#nUxVgE3vxd6yv$(=-Gz}?}|BXj|V#gmg0hpW(DasPd z01+BLkY0R81uIf%t(jWC$4YyBicuxn(@`c{g4{q5Zvhme*74y?hN%A6XBF30fI{WdPYprk~`O4C3BG^FxKZ(zsp9$hK_)#%qyjT8Q#ex-? zG_^{&G=ePN@g`f3fGdViAS(9xF?1AY3J;>! zwqLM@T>5(&z;9F+uo=(X@wf#5HvSZ-^QNQ`ycuYs2dGjCPxiH*B@x`)c^bc>?Z_Kr zPb4nYzUBz)p!@jjUk(B2Y_=qR6}*0C@^w6IKx+ZGA&B0u+AhEE7GJO8fs(qwGw9Ng zz%efJf=U-1+O=&bWj6r)|7*J18h{w~E$J!}iq+0oA=S&i>nr!5q-@VIVeM%U{+lj- zH?9MNM^NoY12a2NsbN^r+<;yKc;Q3qVsvgt>=-Q(G0+pIClKs>d|Z@XS5cCK2dKS& zNK*i;dNn){KsOKHg;e)nm+xP+-~WSy_+Q4C|8MEW|G~MRwl*Ba+!LuM=-2v6?65?V z?9I0$WXza^H;?~4|9p6!!5*h0dPt7B2tS^w8L;QoIS$C5O!QY`hf6;g^yA9uU(i-y zNde_e1+v@h`k#NXW?7L_p>VXEqdsxTGo9L_v5N#7iA1O70--tack7ZCG>8=M>;woIA; z3X?Nhi*L7kDK)_%w%WK=)e`U>6rcIST}(- z;;AKxJEY*Ux9sIAwpItCC<2tAyeht<=U_WAO~?@Ge8ex#AGW*dqI*3%Po4hmp62u_&+-FI#q!^&d|gil!8Q2wuYUeY^f#zEtL}f+ zBiT`tFt9RClI@p!^5h9f@(xvqS=N|vVsyO+lx92wbL)xD46u-w4(el|mR}?ba2n-{ z>Qse$R-1y1h7;T}A`6#UBnU)FcpH8Wl&!+k3ikcPK438AZ&L}k!mBGUg64&8rDtM! z&R`#yAq5z8n_E&gwqqu~`tl>F49dO7{tap#nSOW_4F!ueRK7q%otv$406FEx0U3d&X zbqWnPr|O!}7mx*?T$U%NmOXv!JC3@%xdDw$yJ+GDxwq$i2Nqp$!mkH;9k zc9+oe9bz~inWnB?b10~S4`iJX1wH;E-v}G$s~x%CLh6%Gwav^n!t~^pb}++~+Al%V z=^9bREi&MLTzLlV$N6%RCs{Fx!QMn%Hr8JWUUXNvk#vJ&4+bL#H7_6CDYR^lKko*D z2|;k-kMuj^IDCdKHcON>sDlI`G#p*oLs|7h`4^Ded;jFd*Y;I;=Xcx@%Fo zp=i?d`H|j+5%h?0;T@34qPuXsHX^$JGDMeqXEVCkTtPfQC%1%OT1u?PZHiipIZNjq zE|{-5ZNUg=Xa*zZz>~106EH8EsQvBmZmP2B+Ascho$sQeHZ8N#iG9NuEhN|bvi`~z zF=qBR;JEHUHQHWurqrjKar*u~uN_}FD_!c{5aAHf2LeF{yCYEYp234N{Q2?nHX~Be zO3KfN60sfYy^Re$rlq&o)dvWyYq_?xDuDUJ?q753x_cieEbIl~O5s;zeD_>v30np; zpT{#t%!s@rQ=TGisC%Ay8@Bb?6L_Jm_Lvdilzx%Mzt;1nN@y~|-kMB}!}Z+nxg|34 zlF^8KC@$vQ$&ozOSHs9lz)Ye zH?GKd8fy2pi;=+kqL=~GDR7f{B*ROrGU=^psvK2EZZ*U`IL0v4O=gv#g83}sk_Bm` zE04vYocEe{Ole`&t=G1j$XRX-+gh#jCFA+h)VpRkKV1E&R@kqp8}D`+TLH!Sqm_{1 zM2nQCFyvVq!hVSHa@XY-9Cezuk{7T4EL&0)dCoym{~;!zU~ic9n+fJ#NBj>9z%uvaqW& zsy<(HbE_psyG>W-%@wK^fPz4D^TO=~HWy{Ka9w$n$92qUYo(;R2aiB|ts-4qXGtW* zOQMTMOMCUhuMnN(7(bNE$JFUevV`L&pD;@qCn~wU|1}jScI-h-HZXv>A-}U6^Sc$vUGaaNud6$^Fgxtf*vFU94W28rxI%Ym z+3_l1?H6lw*6dg+4Q%$8YzSJ}HPbWG^e1a297!v}S!SSMD5;L|Ko9kM;?XO~K$Hrt*qd&r4r$F(~(;| z=@ahN%>hKwTlD<3Jh{!=@7Koizv}O7pH~P}q7IgZ0ILyHHF%dVCVd@GW$>H%(S&5r zCWnVODEHkxO~q_ST?>r^G`E{t8%~VIJnC^p{pTmhBD-a!b6(Sq9}fJ({c{xGo54S0 z4M*2XDU1$bDukMV^5axLKVb0@Q&#g~-*6Esvmjx(DEwiiS?GyW)h=9&m<#Bqlv0al zoo=AKI5DK*P<df@>-h8GBg8tHF6cv{~tc`A?iwD zpi!fyg;E+eC6NKLZw+xf@`#6{p}S9F`AN)HV^!3eOwC$Kio5)t1iKHQn(~E?=)1%< z8UlXh)mE49mmDl^EOV%_T?t?BJPWb?F+<+BZlBBNxHk;8MmmFloOKj2uWx<(oL|*2 z)cXF(VFCgweAq6OtEiJ4+|+zDZfp)o(LXMEEt{#`GTE6qEcHW4oI;rw3Wzfsv&#BZ zVaOqy&D?z2=I~*v@|G)%IexFtDLwg)5Z*d5Bc%}fxJ!R8!>wiN!79@xBtJdS$b783 zwn~^LNM+eK);U^(?4UKt$CQK3JCt0b zLzexfT`yp;EI`qxV|T%wgF>tSfw!+Fu-9SJSE_f$LTxsS;P9yn@%O&G3E#k8$%!Of zyu!%>h$Lq>i@1UYw_7zTu2i2dJ*9t9lAG!;cpSaSuy0+4&saDi(Q1hd$lGaZ8db!Y z!(-}>VA_(F{41X%O0Rv|6W0Y^!o39{>Ah9dr{MraPKweWg4`ua&mIJ9mo7=}dUJMD zNNDpt{jggRt}ND^{rGGfAx8sYLPcXXL{h=IT6jrG>ugj44I>=%kAvw~?9Xsn`CoYq zUQaJOOXFMTmuiE?W25^|gCp3qUyHt(I@tMmLnJN4V|A_pQu0*su@n|fJReBJ4CP3~ z?`Y(N=rEC|$Gb`fkvrfUk+Lb}v0Ly2`{8J#xpna!6}w3o|EV_V2h+u59V(y29HQ<6 zIn|)V{n!bx(J-HM?jG*+{g(7BUDxuRR`U8?fm28>geZbNs^CMK^6~wRNA?$~FMHvi zz(2IRzlTlKS@eWmYV) zuo%8=eR4cx{? zW1^ByMolgQI$KUEy?SmvK2g}keAVRqrP)Bnlz?mQrzIO4-K871bdJU)xA4tON)}O^i{Gxm`&}Hw5FKy3i3u@*c{x}?O9jEX_64Yo; z5zikkbL^}=t9ET5Ki+M~J`kfxO5aJ^)oApg$9+_mlDw2BrpUH@rymGp$}?*u z$&Q755rz@JUdTIy>MUoEea>WLl<=u%Zf?42@n))`cYq@D4VYttw=9)8fQ6ocpR1#fQIlt` zl@?y}$XG}26Mw2C2rfAv%dUMt^_@-CNxoWYs_4X-xYUNjP07(lY=c#&zKWPR;+MWu zt_C{6qOJUl#bERKPAqgs_mRs9*WL(R@mxM!Mr7I)P#PO zWkL&j*Q+$U$~kpL;qy-qx1`-iI6Tt!TE^Ds@L|cdoc9D|t?CzcGC7M=;^i5i71F?7 ziE)=7b=ZdN`K-v%rn&R#?IIg>YVDZq*B?czy_B!L{USkrU3~pSPm!we&$W|`_Y}

w%+ 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 str: + if isinstance(obj_or_data, InspectorHookData): + data = obj_or_data + else: + # fallback for IPython 8.21 + obj = obj_or_data + detail_level = 0 + omit_sections: List[str] = [] + info_dict = ipython.inspector.info( + obj, "", info=info, detail_level=detail_level + ) + data = InspectorHookData( + obj=obj, + info=info, + info_dict=info_dict, + detail_level=detail_level, + omit_sections=omit_sections, + ) + return as_markdown(data) + + +ORIGINAL_HOOK = None + + +def load_ipython_extension(ipython: InteractiveShell): + global ORIGINAL_HOOK + ORIGINAL_HOOK = ipython.inspector.mime_hooks.get("text/markdown", None) + ipython.inspector.mime_hooks["text/markdown"] = partial(hook, ipython=ipython) + + +def unload_ipython_extension(ipython: InteractiveShell): + if ORIGINAL_HOOK is None: + del ipython.inspector.mime_hooks["text/markdown"] + else: + ipython.inspector.mime_hooks["text/markdown"] = ORIGINAL_HOOK + + +__all__: List[str] = [] diff --git a/ipython_markdown_inspector/_hook_data.py b/ipython_markdown_inspector/_hook_data.py new file mode 100644 index 0000000..67f75f0 --- /dev/null +++ b/ipython_markdown_inspector/_hook_data.py @@ -0,0 +1,9 @@ +try: + from IPython.core.oinspect import InspectorHookData # type: ignore +except ImportError: + # TODO: remove once we require a version which includes + # https://github.com/ipython/ipython/pull/14342 + from ._ipython_patch import InspectorHookData + + +__all__ = ["InspectorHookData"] diff --git a/ipython_markdown_inspector/_ipython_patch.py b/ipython_markdown_inspector/_ipython_patch.py new file mode 100644 index 0000000..3391098 --- /dev/null +++ b/ipython_markdown_inspector/_ipython_patch.py @@ -0,0 +1,40 @@ +from typing import Any, TypedDict, Optional +from dataclasses import dataclass + +from IPython.core.oinspect import OInfo + + +class InfoDict(TypedDict): + type_name: Optional[str] + base_class: Optional[str] + string_form: Optional[str] + namespace: Optional[str] + length: Optional[str] + file: Optional[str] + definition: Optional[str] + docstring: Optional[str] + source: Optional[str] + init_definition: Optional[str] + class_docstring: Optional[str] + init_docstring: Optional[str] + call_def: Optional[str] + call_docstring: Optional[str] + subclasses: Optional[str] + # These won't be printed but will be used to determine how to + # format the object + ismagic: bool + isalias: bool + isclass: bool + found: bool + name: str + + +@dataclass +class InspectorHookData: + """Data passed to the mime hook""" + + obj: Any + info: Optional[OInfo] + info_dict: InfoDict + detail_level: int + omit_sections: list[str] diff --git a/ipython_markdown_inspector/formatter.py b/ipython_markdown_inspector/formatter.py new file mode 100644 index 0000000..f79ec08 --- /dev/null +++ b/ipython_markdown_inspector/formatter.py @@ -0,0 +1,104 @@ +from typing import Dict, List + +import docstring_to_markdown +from IPython.core.oinspect import is_simple_callable + +from ._hook_data import InspectorHookData +from .models import Field, CodeField, DocField, RowField + + +FIELDS: Dict[str, List[Field]] = { + "alias": [ + CodeField(label="Repr", key="string_form"), + ], + "magic": [ + DocField(label="Docstring", key="docstring"), + CodeField(label="Source", key="source", min_level=1), + RowField(label="File", key="file"), + ], + "class_or_callable": [ + # Functions, methods, classes + CodeField(label="Signature", key="definition"), + CodeField(label="Init signature", key="init_definition"), + DocField(label="Docstring", key="docstring"), + CodeField(label="Source", key="source", min_level=1), + DocField(label="Init docstring", key="init_docstring"), + RowField(label="File", key="file"), + RowField(label="Type", key="type_name"), + RowField(label="Subclasses", key="subclasses"), + ], + "default": [ + # General Python objects + CodeField(label="Signature", key="definition"), + CodeField(label="Call signature", key="call_def"), + RowField(label="Type", key="type_name"), + RowField(label="String form", key="string_form"), + RowField(label="Namespace", key="namespace"), + RowField(label="Length", key="length"), + RowField(label="File", key="file"), + DocField(label="Docstring", key="docstring"), + CodeField(label="Source", key="source", min_level=1), + DocField(label="Class docstring", key="class_docstring"), + DocField(label="Init docstring", key="init_docstring"), + DocField(label="Call docstring", key="call_docstring"), + ], +} + + +TABLE_STARTER = """\ +| | | +|----------|----------|\ +""" + + +def markdown_formatter(text: str): + try: + converted = docstring_to_markdown.convert(text) + return converted + except docstring_to_markdown.UnknownFormatError: + return f"

{text}
" + + +def code_formatter(code, language="python"): + return f"```{language}\n{code}\n```" + + +def as_markdown(data: InspectorHookData) -> str: + if data.info and not data.info.found: + return str(data.info) + + info_dict = data.info_dict + + if info_dict["namespace"] == "Interactive": + info_dict["namespace"] = None + + # TODO: maybe remove docstring from source? + # info_dict["source"] = remove_docstring(source) + + if info_dict["isalias"]: + fields = FIELDS["alias"] + elif info_dict["ismagic"]: + fields = FIELDS["magic"] + if info_dict["isclass"] or is_simple_callable(data.obj): + fields = FIELDS["class_or_callable"] + else: + fields = FIELDS["default"] + + chunks = [] + + in_table = False + for field in fields: + value = info_dict.get(field.key) + if value is None: + continue + if field.kind == "row": + if not in_table: + in_table = True + chunks.append(TABLE_STARTER) + chunks[-1] += f"\n| {field.label} | `{value}` |" + if field.kind == "code": + chunks.append(f"#### {field.label}\n\n" + code_formatter(value)) + if field.kind == "doc": + chunks.append(f"#### {field.label}\n\n" + markdown_formatter(value)) + + return "\n\n".join(chunks) diff --git a/ipython_markdown_inspector/models.py b/ipython_markdown_inspector/models.py new file mode 100644 index 0000000..1f50d90 --- /dev/null +++ b/ipython_markdown_inspector/models.py @@ -0,0 +1,25 @@ +from dataclasses import dataclass +from typing import Literal + + +@dataclass +class Field: + key: str + label: str + kind: str + min_level: int = 0 + + +@dataclass +class RowField(Field): + kind: Literal["row"] = "row" + + +@dataclass +class CodeField(Field): + kind: Literal["code"] = "code" + + +@dataclass +class DocField(Field): + kind: Literal["doc"] = "doc" diff --git a/ipython_markdown_inspector/tests/test_as_markdown.py b/ipython_markdown_inspector/tests/test_as_markdown.py new file mode 100644 index 0000000..f5198cd --- /dev/null +++ b/ipython_markdown_inspector/tests/test_as_markdown.py @@ -0,0 +1,50 @@ +from IPython.core.interactiveshell import InteractiveShell +from IPython import get_ipython +import pytest + +from ipython_markdown_inspector.formatter import as_markdown +from ipython_markdown_inspector._hook_data import InspectorHookData + + +def simple_func(arg): + """Calls :py:func:`bool` on ``arg``""" + return bool(arg) + + +class SimpleClass: + pass + + +@pytest.mark.parametrize( + "object_name, part", + [ + ["%%python", "Run cells with python"], + ["simple_func", "Calls `bool` on ``arg``"], + ["simple_func", "| Type | `function` |"], + ["test_int", "| Type | `int` |"], + ["test_int", "| String form | `1` |"], + ["test_str", "| Type | `str` |"], + ["test_str", "| String form | `a` |"], + ["test_str", "| Length | `1` |"], + ["simple_cls", "| Type | `type` |"], + ["simple_instance", "| Type | `SimpleClass` |"], + ], +) +def test_result_contains(object_name, part): + ip: InteractiveShell = get_ipython() # type: ignore + ip.user_ns["test_str"] = "a" + ip.user_ns["test_int"] = 1 + ip.user_ns["simple_func"] = simple_func + ip.user_ns["simple_cls"] = SimpleClass + ip.user_ns["simple_instance"] = SimpleClass() + oinfo = ip._object_find(object_name) + detail_level = 0 + info_dict = ip.inspector.info(oinfo.obj, object_name) + data = InspectorHookData( + obj=oinfo.obj, + info=oinfo, + info_dict=info_dict, + detail_level=detail_level, + omit_sections=[], + ) + assert part in as_markdown(data) diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..c4b30d6 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,45 @@ +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" + +[project] +name = "ipython-markdown-inspector" +version = "0.0.0" +dependencies = [ + "ipython>=8.21.0", + "docstring-to-markdown>=0.14.0,<1.0.0" +] +requires-python = ">=3.10" +authors = [ + {name = "Michał Krassowski"} +] +description = "" +readme = "README.md" +license = {file = "LICENSE"} +keywords = ["IPython", "markdown", "inpsector", "docstring"] +classifiers = [ + "Framework :: IPython", + "Framework :: Jupyter", + "Development Status :: 4 - Beta", + "Intended Audience :: Developers", + "Intended Audience :: Science/Research", + "License :: OSI Approved :: BSD License", + "Programming Language :: Python", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3 :: Only", +] + +[project.urls] +Repository = "https://github.com/krassowski/ipython-markdown-inspector.git" +"Bug Tracker" = "https://github.com/krassowski/ipython-markdown-inspector/issues" + +[project.optional-dependencies] +test = [ + "pytest", + "mypy" +] +dev = [ + "build", + "pre-commit", + "ruff==0.2.0" +]