From 7a90f4733f0f4dd7b3e5e6656a6f7c6a7eb4558b Mon Sep 17 00:00:00 2001 From: mistangl Date: Wed, 16 Jul 2025 16:37:03 +0200 Subject: [PATCH] erste Fassung aus templates gebaut --- .gitignore | 169 +++++++++++++++++++++++++++++++++++++ README.md | 28 +++++- bin/get_cmd.bat | 4 + bin/install_py.bat | 15 ++++ bin/manage_interpreter.bat | 30 +++++++ bin/plant2dxf.bat | 4 + bin/setenv.bat | 30 +++++++ cfg/allgemein.cfg | 2 + doc/images/mubea.png | Bin 0 -> 44116 bytes lib/plant2dxf.py | 25 ++++++ lib/requirements.txt | 1 + 11 files changed, 307 insertions(+), 1 deletion(-) create mode 100644 .gitignore create mode 100644 bin/get_cmd.bat create mode 100644 bin/install_py.bat create mode 100644 bin/manage_interpreter.bat create mode 100644 bin/plant2dxf.bat create mode 100644 bin/setenv.bat create mode 100644 cfg/allgemein.cfg create mode 100644 doc/images/mubea.png create mode 100644 lib/plant2dxf.py create mode 100644 lib/requirements.txt diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4bbd579 --- /dev/null +++ b/.gitignore @@ -0,0 +1,169 @@ +# ---> Python +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +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/ + +/site-packages + +# Benutzerdefiniert +/data +/work +/log +work/easy.dxf +work/easy_todraw_edit.json diff --git a/README.md b/README.md index d2bc1bb..fa3d9d0 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,29 @@ # plant2dxf -Erzeugt aus einer csv Datei mit Angaben über alle in einer Anlage enthaltenen Elemente eine dxf der Anlage \ No newline at end of file +Erzeugt aus einer csv Datei mit Angaben über alle in einer Anlage enthaltenen Elemente eine dxf der Anlage + + +``csv + + Elementnummer;TeileArt;TeileId;NachbarIds;Bezeichnung;Planquadrat;Merkmale + 1;"ILS 2.0 Kreisel";"shape_f81e5c4b-a976-a3c0-3304-d2b30da1ab29";"shape_d76e250a-0a46-f6d0-df52-943ab572cc63,shape_ad62cba4-3a33-c4c5-944f-eac7abb7603e,shape_456bee3e-01e8-be9e-aa74-4265c1195bbe,shape_463bb635-b3b0-d4e9-c8b9-42be3b7219b7,shape_6d9bfe2c-d8b8-3ceb-bf26-bdacd0a40712,shape_1ca5b56e-7825-2852-d241-0562233b6310,shape_2f9fa13c-23d5-784d-da4c-8d1c7e313116,shape_fa451c64-e507-8932-d5da-7cc93476a176,shape_30127aba-263b-1ed5-c5cf-e27933594406,shape_641530a1-7396-8e83-3a50-1bc59a406a5e,shape_161f85cd-b1f4-0943-34b7-1d3b8134bcc0,shape_e8f52a47-c493-39ef-ddcb-78297d96944d,shape_24812b84-fd3b-6a44-0302-2d0fc169a6d9,shape_80ca3488-cc41-4caa-00cd-b3de9f5428e6,shape_8b856d97-b18b-6263-7c98-79d8b4ca679a,shape_67f8d19e-8857-1f5d-7d90-3a2a0a9da157";"Kreisel:1";"X:9174.15 Y:12039.11";{"Abstand (Kreiselachse A - Kreiselachse) in Meter":"20.265","Anzahl der Separatoren":"2","Anzahl der Scanner":"0","Anzahl der Rampen":"0","Höhe in m":"2"} + 2;"ILS 2.0 Kreisel";"shape_8e75c773-8088-b286-9dc0-f601442d5e70";"shape_ad62cba4-3a33-c4c5-944f-eac7abb7603e";"Kreisel:2";"X:18174.14 Y:12004.13";{"Abstand (Kreiselachse A - Kreiselachse) in Meter":"20.265","Anzahl der Separatoren":"2","Anzahl der Scanner":"0","Anzahl der Rampen":"0","Höhe in m":"2"} + 3;"ILS 2.0 Kreisel";"shape_d76e250a-0a46-f6d0-df52-943ab572cc63";"shape_f81e5c4b-a976-a3c0-3304-d2b30da1ab29,Weiche_Xg8Ledh-T0ejWPHluSM8tA";"Kreisel:3";"X:12474.15 Y:22171.59";{"Abstand (Kreiselachse A - Kreiselachse) in Meter":"5","Anzahl der Separatoren":"2","Anzahl der Scanner":"0","Anzahl der Rampen":"0","Höhe in m":"2"} + 4;"ILS 2.0 Weiche";"Weiche_Xg8Ledh-T0ejWPHluSM8tA";"shape_d76e250a-0a46-f6d0-df52-943ab572cc63";" zw. Kreisel:3 und Kreisel:1";"X:9574.15 Y:22171.59";{"Weichenart":"Aktiv"} + 5;"ILS 2.0 Gefällestrecke";"shape_ad62cba4-3a33-c4c5-944f-eac7abb7603e";"shape_f81e5c4b-a976-a3c0-3304-d2b30da1ab29,shape_8e75c773-8088-b286-9dc0-f601442d5e70";"";"X:13674.14 Y:20021.68";{"Anzahl der Zusatzseparatoren":"1","Länge in Meter":"8.2"} + 6;"ILS 2.0 Gefällestrecke";"shape_456bee3e-01e8-be9e-aa74-4265c1195bbe";"shape_f81e5c4b-a976-a3c0-3304-d2b30da1ab29";"";"X:13624.15 Y:18421.59";{"Anzahl der Zusatzseparatoren":"1","Länge in Meter":"8.1"} + 7;"ILS 2.0 Gefällestrecke";"shape_30127aba-263b-1ed5-c5cf-e27933594406";"shape_f81e5c4b-a976-a3c0-3304-d2b30da1ab29";"";"X:13674.15 Y:12821.68";{"Anzahl der Zusatzseparatoren":"1","Länge in Meter":"8.2"} + 8;"ILS 2.0 Gefällestrecke";"shape_6d9bfe2c-d8b8-3ceb-bf26-bdacd0a40712";"shape_f81e5c4b-a976-a3c0-3304-d2b30da1ab29";"";"X:13674.15 Y:16021.66";{"Anzahl der Zusatzseparatoren":"1","Länge in Meter":"8.2"} + 9;"ILS 2.0 Gefällestrecke";"shape_463bb635-b3b0-d4e9-c8b9-42be3b7219b7";"shape_f81e5c4b-a976-a3c0-3304-d2b30da1ab29";"";"X:13674.15 Y:16821.71";{"Anzahl der Zusatzseparatoren":"1","Länge in Meter":"8.2"} + 10;"ILS 2.0 Gefällestrecke";"shape_1ca5b56e-7825-2852-d241-0562233b6310";"shape_f81e5c4b-a976-a3c0-3304-d2b30da1ab29";"";"X:13674.15 Y:15221.61";{"Anzahl der Zusatzseparatoren":"1","Länge in Meter":"8.2"} + 11;"ILS 2.0 Gefällestrecke";"shape_e8f52a47-c493-39ef-ddcb-78297d96944d";"shape_f81e5c4b-a976-a3c0-3304-d2b30da1ab29";"";"X:13674.15 Y:10421.53";{"Anzahl der Zusatzseparatoren":"1","Länge in Meter":"8.2"} + 12;"ILS 2.0 Gefällestrecke";"shape_161f85cd-b1f4-0943-34b7-1d3b8134bcc0";"shape_f81e5c4b-a976-a3c0-3304-d2b30da1ab29";"";"X:13674.15 Y:11221.58";{"Anzahl der Zusatzseparatoren":"1","Länge in Meter":"8.2"} + 13;"ILS 2.0 Gefällestrecke";"shape_641530a1-7396-8e83-3a50-1bc59a406a5e";"shape_f81e5c4b-a976-a3c0-3304-d2b30da1ab29";"";"X:13674.15 Y:12021.63";{"Anzahl der Zusatzseparatoren":"1","Länge in Meter":"8.2"} + 14;"ILS 2.0 Gefällestrecke";"shape_fa451c64-e507-8932-d5da-7cc93476a176";"shape_f81e5c4b-a976-a3c0-3304-d2b30da1ab29";"";"X:13674.15 Y:13621.51";{"Anzahl der Zusatzseparatoren":"1","Länge in Meter":"8.2"} + 15;"ILS 2.0 Gefällestrecke";"shape_2f9fa13c-23d5-784d-da4c-8d1c7e313116";"shape_f81e5c4b-a976-a3c0-3304-d2b30da1ab29";"";"X:13674.15 Y:14421.56";{"Anzahl der Zusatzseparatoren":"1","Länge in Meter":"8.2"} + 16;"ILS 2.0 Gefällestrecke";"shape_24812b84-fd3b-6a44-0302-2d0fc169a6d9";"shape_f81e5c4b-a976-a3c0-3304-d2b30da1ab29";"";"X:13624.16 Y:17621.54";{"Anzahl der Zusatzseparatoren":"1","Länge in Meter":"8.1"} + 17;"ILS 2.0 Gefällestrecke";"shape_8b856d97-b18b-6263-7c98-79d8b4ca679a";"shape_f81e5c4b-a976-a3c0-3304-d2b30da1ab29";"";"X:13674.15 Y:8821.64";{"Anzahl der Zusatzseparatoren":"1","Länge in Meter":"8.2"} + 18;"ILS 2.0 Gefällestrecke";"shape_67f8d19e-8857-1f5d-7d90-3a2a0a9da157";"shape_f81e5c4b-a976-a3c0-3304-d2b30da1ab29";"";"X:13674.15 Y:8021.59";{"Anzahl der Zusatzseparatoren":"1","Länge in Meter":"8.2"} + 19;"ILS 2.0 Gefällestrecke";"shape_80ca3488-cc41-4caa-00cd-b3de9f5428e6";"shape_f81e5c4b-a976-a3c0-3304-d2b30da1ab29";"";"X:13674.15 Y:9621.69";{"Anzahl der Zusatzseparatoren":"1","Länge in Meter":"8.2"} + + ![Mubea Anlage](doc/images/mubea.png) \ No newline at end of file diff --git a/bin/get_cmd.bat b/bin/get_cmd.bat new file mode 100644 index 0000000..4dab2dd --- /dev/null +++ b/bin/get_cmd.bat @@ -0,0 +1,4 @@ +@echo off +call setenv.bat +start + diff --git a/bin/install_py.bat b/bin/install_py.bat new file mode 100644 index 0000000..ca9b59f --- /dev/null +++ b/bin/install_py.bat @@ -0,0 +1,15 @@ +call setenv.bat +if not exist %PROJECT%\.venv ( + ECHO Initialisiere Python virtual environment... + py -m venv %PROJECT%\.venv --upgrade-deps + ECHO Erfolgreich. + + call %PROJECT%\.venv\Scripts\activate.bat + ECHO Installiere erforderliche Python Packages... + pip install -r %PROJECT_LIB%/requirements.txt -q + ECHO Erfolgreich + deactivate + + ) ELSE ( + ECHO Erforderliche Python Packages bereits installiert! + ) diff --git a/bin/manage_interpreter.bat b/bin/manage_interpreter.bat new file mode 100644 index 0000000..02d47a3 --- /dev/null +++ b/bin/manage_interpreter.bat @@ -0,0 +1,30 @@ +@echo off +CALL setenv.bat +IF DEFINED NETWORK_INTERPRETER_PATH ( + goto %~1_network + +) ELSE ( + goto %~1_local +) + +:activate_interpreter_local +IF NOT EXIST %PROJECT%\.venv CALL %PROJECT_BIN%\install_py.bat +CALL %PROJECT%\.venv\Scripts\activate.bat +goto :eof + +:deactivate_interpreter_local +deactivate +goto :eof + +:activate_interpreter_network +SET OLD_PATH=%PATH% +SET PATH=%NETWORK_INTERPRETER_PATH%;%PATH% +CALL %PROJECT%\.venv\Scripts\activate.bat +goto :eof + +:deactivate_interpreter_network +SET PATH=%OLD_PATH% +SET OLD_PATH= +SET NETWORK_INTERPRETER_PATH= +CALL %PROJECT%\.venv\Scripts\deactivate.bat +goto :eof diff --git a/bin/plant2dxf.bat b/bin/plant2dxf.bat new file mode 100644 index 0000000..4e590e7 --- /dev/null +++ b/bin/plant2dxf.bat @@ -0,0 +1,4 @@ +@echo off +CALL manage_interpreter.bat activate_interpreter +python %PROJECT_LIB%\plant2dxf.py %* +CALL manage_interpreter.bat deactivate_interpreter diff --git a/bin/setenv.bat b/bin/setenv.bat new file mode 100644 index 0000000..9c1b715 --- /dev/null +++ b/bin/setenv.bat @@ -0,0 +1,30 @@ +@echo off +REM falls Umlaute in den Pfaden sind: +chcp 65001 > nul +REM ~dp0 steht für das Verzeichnis, in der diese Datei liegt +pushd %~dp0\.. + +set PROJECT=%cd% +set PROJECT_BIN=%PROJECT%\bin +set PROJECT_CFG=%PROJECT%\cfg +set PROJECT_DOC=%PROJECT%\doc +set PROJECT_LIB=%PROJECT%\lib +set PROJECT_DATA=%PROJECT%\data +set PROJECT_WORK=%PROJECT%\work +set PROJECT_TEST=%PROJECT%\testdata + +set SIVAS_TEILESTAMM=\\195.243.223.3\sivas\jit\programme\KSbExcelExportSivasTeilestamm.exe +set SIVAS_EXCEL_EXPORT_DIR=%PROJECT_DATA% + +if not exist %PROJECT%\work mkdir %PROJECT%\work +if not exist %PROJECT%\data mkdir %PROJECT%\data + +set PROJECT_IO_RESULTS=%PROJECT_WORK% +set PROJECT_BOM_RESULTS=%PROJECT_WORK% +set INSTALL_DIR="%ONEDRIVE%\Desktop\Kabeltool" + +set PATH=%PROJECT_BIN%;%PATH% + + +popd +goto :eof diff --git a/cfg/allgemein.cfg b/cfg/allgemein.cfg new file mode 100644 index 0000000..7003541 --- /dev/null +++ b/cfg/allgemein.cfg @@ -0,0 +1,2 @@ +# Allgemeine Konfigurationsdatei, welche die einzulesenden Layer, sowie geometrische Abhängigkeiten steuert. +# General Config-File, that controls the Layers being read while processing a certain dxf file diff --git a/doc/images/mubea.png b/doc/images/mubea.png new file mode 100644 index 0000000000000000000000000000000000000000..732b815d90ffc4dd58e41d8cace48136e169c253 GIT binary patch literal 44116 zcmXtf1yo#1(=8-8!95TlNN{%v65L^MClFi*cL*1EcL_3haCdhJ?(Xhx@9_QWv0wo+ zeY(4rMI{T0&# zzIG;4tfcmlP1;h`TqY?I)v;Kupm;K;P%S8RCcCDlrcjm5B238;9wX$~BWsOB;>W<` zava@7%heEF<6h>KS7vkU)%P`H3=Cl!T{bBt?sAId-a=)9^)(?H_w1^!Y~J1H-rw!rcu z#y49$c?n^yV~{Swx&d#3ivLW7`hmFqa{u8{gmt}3eWLHE?{G7)Bi;kvlrGZ#t%e=n zL__)Ug}D!71QyA-LP5-cmYKwrZJbpZn0@+h=k6g)JZMfD&K)}JH>}VN{p|_LaX)@F z6!XyXG%y8?)9}Cd6%r)Zg~Nr1keN+*hsKV4bza?Y@1f4w>4e|cSs|-AiUDy&to>f> zFfqX3DWS;w9Kpgj$sR5|_LQEH4om~FVbM}j9NMY-xboYBxryMV+edrOfVu*;0cN_@ z^C>>gUgdxL5vN0vZWLu_Cd{4rLtKH9963>}$cnc!3t#tv+?R<3j$bgOl381taY*(5 zhWArb8`DB#GWQXRet`eYyv`IZJnY2Mgp2~UoPj-s=lT&JE*!oMN&xnQZ=DdzpX;6F zccCDxCKwpswH1fhTYcSZFJLPd;%#K0sZ{2;||lr4Ww4MbfHPi+pM{ z5FP0^Bs$1tK#%g$gTsyqYL-GLT^_C6QeB>fZyJ`gvz_-iZ`~J#4$w8{;_QXtc#}1e zLWSaW9qu&U4%n@on^ClR<1DF3JRoD9jVibb1~f?*iKX;IXwbm3T%P9i!-UQ2y>WGE zz}7XY+8MuGCbCiSItds zH{q}lg-nQw6|8UI3H=-=B&s%4Abm6>3wVAWxK{Ka!ZZAfeL?5Xk*32))dPXy@@!Fl z`!X*T+$L%GRq)w{U9f}L~kB7^T81_l~1T zyWSjG3B!5?AqB7@Yh%leX(3NGP{tyDGdbxdFQ*u=8)=ZoaeVZKqCIaAJwd7jH|>P%NhX0*3* z3>-oi;|}r{0&YWrpz(1Np?VtpAghgx-JN|lzR&%Qsx2?=7T63#LW+{;-U0s=P1*AD zVU~s13igz~)>30&{s__XO0MLC#=K=U)zGGe$Nfgi47KJPT0_7ZwgMLFLgUx^>c1Y# z;PzY_RET%1U?4<_bNZ5eV#+#3`E$bH2O!YGA1W{H_@420xbeS{CTHnCYyJ{RZukm) z@cdXfZ-P+m+`qG*&{VU93|CJbrXM5Z7mAy0cd>N9VS}>?7OF;Qo5u48u-iLHYY^ z4IrpeMk^4B~lIeIjNU3jz5j>j65B8Xt7*TOO3XHPmFZEWR6nt7@a}j&ZChu4t z>#2n=2T^2wPOxUFbP3sG!c56S!o#=7Fl+)Wu+RHo59 zvedo%qE1Pw^vsb%7&X4wt69H9AmH#hN-c;Z*PZ!%OOWSSEw1ci6R6wWKS7x|dvCv1 zoNjPIl1!n@xG(Q!UK+-bJTtf5yXRW2jbPibJH|DpIwmH4xhgt9LVBv=<-cd99c%Yb z&&h&l%}UirP))NH_P=(pi4S;EYvKtUS`!YnY@?f688>=!MHNpddCIYFx z)2ir29TQ73T83!8DsEsK1`~_vY$NmKhf~0*YfyXLYv=J`IolsF00{Uow!A$}e&dnv63->%w;rFC7tn!g$12I#7%NmH2*N73`dhiiPK(VoS- zpcX#JQLD(>j)G{j@_+L~hy>GL{eX4#fw3~PpW#IQl!ibh^UHnylgY1?5+M1fze58a z!_JZoBhTl-shaa@KM$10h(j@sFFQtz^;Od)U;GH8tFG{HZS=bLqUv&-uQup;jN!xh z>Sz9 zHPbgbHr?>}>>z~7pt4b)xO<}`Q|#_5l$888O(-kZCp=2(LZZKq?HvO#-30T+u7UlY zBmHyM$YjB~$D0d~;q{B6^NsT(G)Ik}V%m1Uo(tt2Qdf@0cz*&po+k$f7Ggip`a_%8 zt>#O10F(?(s}-a7AEshVsD#J@K z%UU4Ve2d7Wj8CqL(l?Z2n6#O*a*i4uqvG-2fXF@=LK3mDR3T&axJ?tN@R-7I%jas@ zX(({7&#Wf3tMd!nd~f3v#nrf%ch&MNh|(NSSueeZu^!H`t@#tD43dum(Fhw8%0>~* zl4RvP^;(%x-T3-Vqt1%|W@HeRFBJ;!njAq|KzutD>wQWR{^c}w9Ymud!B(QbNfQnC zu5>PvFSPmh)+cz>K0~?r;aDb<^O+W>ym+vrXQw=2U;g}K;WFXi?UJ;( zQRKJ@&Gn(=s>Z{X^US3@bbL@S`Epf7E#m^>K92Tq`?qdE&}VMPp0oSK^UN)3;moC= zcwFi=`I1;!J)^VUT|waamSNG|6pLcr$CLSraxuQf-l`XSHKQR|mql-SUof;F)s+99 z+b{U2E}^?nMWYIT>64Jg_vh2sw5#-SJJ~KqXJcjGcaQ#;kdiPYzRabIc-)RK{OBy*qr?A0^er&OkeUJd>kgr=#2U5hhtF^!H$V)DOWi4KOh5&;l9=(`Xy$Q zC@TaSJnpJ9?numR6@->oqz3X^?k6<;o@QBU;}_eSaScqRw?GH>K5@kbr1;A#C<*%h zJCfZT7lI$dkNSc*W+3dhKoZJ6T+sz2$oUnNcpW_p5(ep*y2AY zeJFM&@kQ3@Koc|>^A92!<5kHOKfhax7W$y)3TZBf;}EHww}Ms5`CJ~q>yx#OGWFk7ncn}_TPL+XBr-(m+Gmq2`ey*<9| zg4|VR#|te4hjT$rrMWz#Q!534>&M%pehDp7aR#*%3Y=rDde;zV3T@f67FPRwC1GM1 zwp<$lJ2^}5$n?@=mgTIEB`lO6;RS-X)*JU&1)K-ab7P^H(-utfi{e4`>|b($?GY(0 z-Fw<0e|91nE>>nae!Z2_;yfAcKN@f3<$zrNt%{ec|F>AX5|rtM`%M-qs-#Kk;qmj5 zz{B=X9ZqRO+417EvwIsrD(EK5B&3bW!8-_tYfoRB4Pjjb1^Eqg8n-Jzw;>Rs6#Jx- zDP>xH_sG5b;HXKPq#TvNBig*Yj^7`})$=yzMrvpgh+U&&ZTvKm3wY#MLQ@i(0oF!a zBPLvAJJsEPF#?2 zLqXSp!^zz@M*jJ%9P01Xwdn`I^o+@W9yIf_IWZJ~o(rdP1zi#CTopE*>hw!B>1d}V;R?=S zKLCP+UCq|#WE1Q|OST)ki6 znusLrtPQ1i98Mbw7@E`~EVvwxp-}-SV&JG-EY5KVnmgd31sJoe>30yVh;wAwQ%FSr z$**VV%5~LB%8a9+ZLpp+4w1k;x&)Dd%ID4C?!@jR^=^VO?mozhUMJGxQ43m3LF;0?F$1f0jD(-2y;gFG74>!q6!4PvZ} zO=#&PJgA$=!F@UK5!vw^uJ<>n85%VZkEBI}vNnseQQiCbsX4m=P^Y~(JR4oYSKG%I z^e7Skdk*r#164m8Wf#nh^qvD0BeNY8F&Pu)%4SeKl<WE5Xdwqt$P&H`cN-~SJxWoV9{PPlFnNhAyG7+xCTfMWDIuo(t@GCu0U>`;g0tNTxFBbYH)*95fNc1B8z!2w>qu zu?g!SO6qOyK?Mb_d@Ds}oTawGRD5LbUYQ19Hk;3HwK?bdEhEDNMfvrxfiTtUW80!*bW0Sh~nh_}%Eci3ubIS8Xq(mU4;s@S;Y`v3H~& zwwzw+RsJ0)&HOF831v#*Y+$Qw3u(DL&C)3RLB)$9TT!As%r>Wn`uzO7KM6tJ>W?ar zNn+$Ca+@299on#4-`VL+=W)=eFo4GTCTlQ~%%WwkDE&h9Kl&0<(mz@7ra+OuR6Lbi ztUY&U>vg-6-tOpufdSC*Ctu{-<@`}=O~T?vYkD*KlbsB z*yiRYH+U1q#>PhTbZ=uL#(6R`Nz^}ABFbbb=V$#Ajd~f;>FKFkY+MF5Oy|nxPj`Mu z{FNCHF$uT1Su;G2z7LY12z-65r_#xY1m$z55{Z z!$rRWhO-O_TwZD=&Wr@Hm*`eJ8I@?y2_hchd*-+;o^;JZ84@W?-&&1T3xwKUk-Bibt5$8~0{?i^m*NRxGqq_DX? z>?HAc+|mQa)IC>kaHq>;R;tRh;Wl#;hG)dxyonxgTKONm4y|Y8jZZmja~*YIsc!S` z?dj-~UAZTQrFn%1MJ1CB->p-@8Cntv$@iRgaP zWu4Y(7}$ph66hO(0~26;S6e-*UC#9MJTJt)DP+nf(5l{VhB5uKOq1SWuzoLbfZGLy zZ&0VCj`;!wwDnA%%djh470+r>th{nFOQswe@9$mvBEJmJR~lVhTx~s=4r}6R z|GfjnNN!14?*2}cG@dQ}v_K~rFkSg@i_?)>AnKPPAUN+&7h%0eROtlT1(L#eP~*BC zcQT6+TzT6gZ4#rd;r2kxClUc7rgF<5Svp9%@Dm($!e9J4ACA!Rx_hP8pOl-NBO767 zUBN@{8&e++t`Da8F9*okt>&YvO~)^f%G;}4FAV=uP(v>LXDp1**E@lfaW!ugbup`L z3tqCWXYqOUR4>R^`JD&UGmXj3Pmrf=*g~qXTrQ{c>#pxv{jg<7GYYJC_9Sd0em6-; zNy(;j$JDR7BbUq!0ke-qe-)`%a1<&54LRMOEcI893k;XHze<;={Y~ZulQ|vDIyq@c znn*k*(rZl=fx$X%4kYpU9vNS%uvL|Ge^nr;lcAHTQDcU|VKKc9gyS5AECFDf zY*zEk?>pBivzRG~{vRSD5Bs@MlJfG-P8QNTmhY)dM$Io2Zhf9D3NL8fP$HBNXE=b( z;Z~_s?1N55I!#Vaj_YoUX`ylf>c++fy-q{4;OqT=i?vP`vXJS~;gyw)y-bhD^K(1* z+v7oGrWT=-#ahiK$D$HtW!klO1JtYnJ!VEuyBz--Jlmk~;8-u?3sW8_p~&!9IXT=; zAF`=ubG!TnY%GPx;hSyS!#9uH<7|(+(=vHE06~>%R2s@=31p0>aVeK-u<$zW3l+#` z%(wfr|8Ieb&Jk&2x`1FD<>c$`b{Hqu)a;X1#I=MUJByHWM<)yUD#Ko+Kor8hGTmlZ zKnZSVt#{N)IsQPLkuK6nYSzg^FPvjwVP*b_Y{I1c!Z1!`yE*nQj0L&-6KP)M)iTx8#%S`OL4t;yNGE7(A z(luSAjEI6_+!s#3O$56h)d2c7g$oO*QbI3~h=_>T`CGqg*yWE10}Fex>TxzvZ>vv_ z8wSWEO*17bD#~owgYfQ|Kuj3x3BfX-$O!I?7e@9&=}0?==!#Y7Hl8mF}(AV8^3V{EZ%39I|H830yv zGg3iZIPYl{@+|oMu+pf1f2sftI3OxY$^g|8wMv7|4?{^z?`#7!WL&C77sY>x@N{>! zS5%O>2>>4m0OCe6_~w9RoTlCxhvrcGRBm5?|J81qEvVK)HIYewtj2t5zRDQ+uU4%+ zV5q=AYET{miRU>qpUY{U^U31%=}KB6gLakm66d?24<8tqK&len@+DfGc{`MH#W(i$ z_JBwQsI1=c0F>!l+r2xCmGQ0av<=W%kj5>;|^%I}J zo;VAEFmm`AK~(vl$$H12+Ah!InA1U~8P4V# z9m3PUr!82{f$DX5@=-pE<^u3MBXOu>=FM`2NG&w)9&-mAv&5vf7vKY*|D>N*6o$8P ztjX<7M62ST6_0ARhiWr@;*!p0zVqp$#m&^Jwp?oA2}Wlw}~4s zq0;hg&b{Zqv@e@p8YHDKeEW z4*S7i7l>fU zplAKQey#h*3_J!u?-x>T{CowjF)C!7Ci}M<^S(xft-iiHUubkf%j2hwp!1hIW;a&; zYsE}{&T5>N&>ybcjweVM80Xz+{~*IRPkEWo`Y&A{r_0gSye)~?>`2)yO&qmpedVNh zIGX0^Z@<}et}z4yOLoOZf3R-%=a3L$4(#TGNlgUMs$UYLxC40;o*NO@GIxr7GHM%| z(p(8F{XA?reGvIX^e--F`b}so-j0qX-Lwkejy+*K@3kC7VR3BTmy3E&iDB!@nm3`I z$LPK^yCp96*dMZu6BId3_8GLm$8U;F5bR#2*;G{(=lEw|}?(WE4pZR{ZT)&jP zb~k66^^Z7^bM(m*s6-U`od)2A1}1RteHJ^*i?#oX6DB^KZ-$N0RGTVjG+}ev_%GQw z$fqzW+U>&VHvGHKXx*`KcNOiYWf8?`&aLW=;8Dg==pWAeGPDOBnR> zM}&~P=)@~^P8pf&wjJ5+v~rfL30^<#2GK_Xtr?JM6gvIY26TR}CZ3&oOVb*yQax+= zhi`PiUs|OD^BAD%`bZy5<2lA zfHA59;1O0LGT8&8!B*d>wJcX+H0)>2^V*GMkH&tE&s*u8cH6QUxFK;APOXGR)k1A0 zk=K!VcUBeZUcZ60wlu9fwAOc;#};?z?MA_+c_TlTxr3we-CJQNV=4O{^q1;(d-qpY zl3AT@t@cpj$3!05bI@^3N?Vq*MRuQv1Z~(~eie9mAbc9RZ}T{1!TrbW`mZH1%roy| zjm@kwpWc}ZK8-Ma8@vj3l7=1n{S7hP(}%~SBm*+h2MYIcV2f(z{a*(W>BE(RQ5`u` z`N$m)xC{T|QXz(HhJ_<}(~EPiwtMls#`(qI{XLmj_>0Tw$o*@Y&TBb!I*-wFcqC{3 zpUZ36b|f~TB2b^jFi__L6O^}Eu%j5ONX^$GGwQO=nn7*dY3mr%R##3Sa&q#<)Sc+s ztcV?qC?++9fB7jp*u3xaWG;-1XPO6?HxBc}L|={tA=l@6Iu&2T-pRA6Rz9mGlTY%2 zM|elD_`KLABMoiGUQgj`ak1e`4~nlOBhL?eeKl(8+SPEWTS{5i`;%}SzPJy->;4pV&dqX=Hs?}}k z%|H4)$9QK=2h157MKJCctxSs<^rIH)E;UGcomh;nG(obo1gR0o$OmmN-xhRhhllOP zGmx{h#jhr6k+tvd@k@?d9}g3(eV%`o#zCF$B#B2{EJB);(-JqgHnMyS)`bdHhiigj zv&?!sJc(T!c!667Q1N=P4#8)3W?Ze0Mw_XYI7~M59UeEZdm=&MSs&r>1py-PxYhPN zxnG9b_xQ=Vxw>jh`QgoKd}``mvoZ&4m=)vmCZ{jeFzXB5ch~4J=OQTm*D;;f_<7n1 z8_+8ayjiWGIvsUQLi&yqO_KTW-0wKYl!xP4r~*Tf`nK=9o<7&s ze)kxm5#%SjJ>$w(c<%!Py0i2%conNCo}a7TSiD~s@DCg$RCU3HH16==xJ1|Y7vxqua zs6Vp8JdQ;z+iGDs$!#~B<%`8s{=r_?|LqmFdnlprQH#VAYFzLvomC>j&t)xOG_718 zft!Q|h(#S5=v!&F;i=kboP7;`rKP%QH!n-|B3pgyb{+9FW5fR^zzRR0^@1$USw7bj zj;&1xlgKaskxQ_)uWc|75wOAOxzp&YWBwsk#qQ9!vDuNXSoovKc7HP$ez#PQrd7jC z`;j0;aE-f762nOIES6GE=0SXv^sbt*cb@5d@j$>6=Z4q=tA4ww<@LJX57xHjA*|hA zSI@+R`6D6cvfY-~Di_0;yz^!d2`;^3UamP9B$4MMxqI5R4@k%=l3>tzz!)BBjdhbOoi@_&1T+eRG^EZ2k}^G zrAOUUpKxdm{FvILR#gL(9#V$3VcBCi_wZM2ANFXY3N)rL}W3o@r=!i+G& z%)x!b_m1N$w3^0Rr6pVZUlo#Z_YTJ=tnJgx!SO@mbwg??OjnS$>GsoSv*b@$TwpAp zi=+!yy|$#Y9ry=fLyB)tem;*sabeib8|)k_sHU(|Xz_SK+`3E(%jl2v-dLX&0ua!>)3^wS?aH-HkA2pC zS?V@k?jn@VlNbrs7*%K*K>2qkM*53qBKWbV0z3}9D<{lPYb^=P@kaK^TC;)2(GF1Q z^;w*KhRaZV&dUv~)ct~m2)dYj75^MqPBv42EJq|HO>zGXW8WxT0(*WD(4fa{Fpy7g zM&{UfB3rxC(DBK4^NF|_(JbhJwp;ITZ~V&CGYTh`?c%Av>-r*j;c#lewa20vriqXJ zMmp8fo^LHH63j&5{N}Uied%;3`Sj^G)}nGH zV{KBHt}XCO%Haz~@3@ChC{Gj(=|GgTlnZnFKQb-RIX_W{&1s}U@jv9gJ}YEq={jhJ zBOy~0d#Li*yy7L>`BrvopZ3zR`hR~M-eK}}Ki&BXmDzBOp7rQye7QF;?BVFK?)6+6}v_lYJu2)z=F!{z2M1gwh!_Z%^ce< z98P6tanEbHLj6SWfm|G4H*T?(P3@O}2QI+kdS~mb*_x_+-dZcowD-ouWqu^k%DcvM zA*#=*$R@>-T`riCMG%HHG!y=Xeb|3GEU)@0SHNkUtJhomVKRk>p2PU>peG;E zdiZc@?4b|Z{_%i6m$yA9Z^lS(3}m!_C12xMwf#zku@*KKa<%j&X=^@$yZ+=y+o>tP zX|_j179k<;9Y-;CWIUh0=MCwm!^Hg;VUrstP`W6&`~cz>8=n6{S1@I->!=-RT$Up!{a0=aW`Fqj(Xdf8->VRk1bODgz(2&XkleLL-RL&cTWO!w zDKPFNnDa+0xOv)U`vOri45FDuvh%n!DwijY62rBM&f`2XW7?8W&0S4wygh*7dPsA> zgST~iQcuXyTS%Q-`_+l4>-9x^_=8Y)AhTKY1T7fLwRW-oS?`#H6PK?eQBYw078xf+ z#RgGf?(GASFYKXcf|19%>PJf=Qo;PQIo`5q(`UtNm*t)a`w&XRyH~E0Hk6+{XCEyO z+)0v{wslvb5ZHr@drrwPTI%Ylm`=}LvxqI5xOGp5?O^2WeqcybVpB3NB<)y=@A1l) zn3SKZ53E}H5elC2>W1xn<%>RZSd+NV>*tYnZZaX>83un&FYnpy`0rT%7BM@?UXZwN z@}%u(3xS-dw+x(rlWhX0?wxr85NFO|6$Dl_45FH*Co|sllF^Y-OEIF&EpH85!Sxo(W|fMt#d2 zS!9oI!}x1YLKQb|37Ox_(@-{ZsKaHe|1@}fPE_K!hebqd|DtM()*SITffI7hE7LPM zZvSQPYO?*xth?xdOV8WWT7GVQJX#mH`Nk^lNxkE-z*kL?gN9FT@j_Q1w(r_2JlYvo zI`r8b221zBZ&q--uDd#Xd%m(O+oD$ecU{gE^Y=Aq9>?y}(;ae!A;cuj6!?e#k##m}tKH{y?L%K*SEGa7bHhZ{ze0@ZQbawyF*hMDx_58hunYElt_&_O zmn;I2O%;Tt^E&OkhWAmY^V6_er%GOIl8J@lxAPIXWqH7v4AKink5*}lioV9S!w6d$ zHkauW`;EkE_WhQkA%hG>8KEcxpa(e35>zqxwqWnb$mxgQjwT2geCp&Yt83K#LK zlS?#FJo1})4cJL)lhQ3cbh_!glR85(ZUsFU7>&9%N$wy8X~_^r@M<&{j43f=S#R-NTuT};Xe8ZdD@JS0aYJ{82Ko9?lr zCmc<(4PVgnAnYBDjuJWU7=mpA}xIR2hAAznK2{gbkxfLzjWMNB1BdDg!pB zVVG(aFY<{B96&GV35g%5x$CMeSE_&+&agMV4WM=kbJxnm-5%2D`pQbN^44tGJ{>{l zIJ)BxSXJ2Aq`NTxGvl^W2*J6e)6-B)?aoPCPALQag z%-{Hx-v(P#FN@Rp-B^>N_`e5nPZFCt6)_@AD)A2e-hxm6EFn6%86LyphyPK4D}5pQ z(q{+#ZLfZ~TKdFg)2@VJ2i$$~zfZ~eezIUx3v7nl9}uLXS=jhCMxZS6;rUlzPQo2Rz& z1oY2_pZxH#zR*W#(IO%u%12D8q~^bTmwX}eO1{rd7xY;z0@n@J)$B1kDPECB0_{pz zZ@e6lpobLQV}eY0P9&M|U3ELgJc|1!&!Dvw59R_Ri!R}h zPq9qWS@XbI``c*^H(8(5(oDHhzza^^L2CZx>C+jo^Y;5NIV*E2TY(7y5L;<}xTi;+ z@|I&XsyWpufJyc<72T{ZjpV_QaOmlul+! zPZ}B{6WncZ7xcYDP2I*@!6PP)Zi}IFmq0!ac`S3Xfdn;7Q26+SGFDb>kLX?vR7kKV zSymojk$5z1bIHKRYT{_?r8*u4`NQ7O62Wp~wD^SCVeR2~8s&6c2~i5650ka{czjB- z7PfyGnA&b~l((o8^mSj{#s}xz2iLnQhA`?UfSwCyr#q?wx4kdP+!$@IpPQUVJq5#H zQ@OZiwFhKpiWOTLSPERTjjj@+#SoemGTKit8U0*1b zqDcw`#f#DBaQqFS$}Dr-sgGWpSGOj?tJlxdwc~4PZOu3jHuy+bD8_I+e;}iu2v5If zwvgM?)VtX@8OJNHg$^`uBPl0uVi(ZJg`5YkOAcT}s&N09&ZAzevp9<9&UCHH0O$HJbhf;Pk3h6g(0e&h^`?7d4;T zgWje&O0!X&B)_G2UmIzzvqmNg4!PA|#V@Hw4kb7Ua(-B64niaghWcP8qutfo6@n1C zZq}HqlWrd~%b?9iiP|A056XIk!4Qq+2-X#Isci1E8S`<^ydAY)YbPP~M^CH__h<;h zH*832)>O5^X|_E5wtI)a7*yB4vhsZnOs}CaX8(CI8XK^jm^XV=b>5MHdt?;>P>TJ| z5YGlir&1)q0=@4iLgf7){K2L7Eb!+}$vS=F;|bA35H#^5r5j*%wUGpLSM9jE!Xp#nS64srbUzQ4OE z^uM`DE$qbADRrV)E+a;@L0WJ%;Yw~3(>@~$3r}+Wy&yM30i-6kW?jg_wuB)JH-)Xg zRrh#OtO>uGS?pmj?X1;Yng}B%h82X~V^}{BjW~AjF(XEQ8?SOcqU5!;{eVI0n^Pqp ztpp@FH+fy?^IuyE%h^&EO8Hm{0!upX=p56~p{K3%rBtWd`WhnfJ`&_mPG`2_*1*E~2~{9Q-M1 z!;iF1G>!l6)giz4LDgICiRk7rKgk^Y8spQmw86j~?c81$2V7YtNHA3P`l z9z210a)^zb?x&<=#~pr9v{(avh1%Z!74vu_mdfQ~)2QjHzB+pSU$nAZUdXcG6X!#l z1DfWX*&mpUTl+=d@$}@cY%sztjBbMi_329|+ZIp1vNTTAI)C%?zx#>0u~Pve zS=!o?q^D<#c_pumX=kL$lB%5d^M%CJrYAKC5^COgK-c9^+86*1Mp;MbJ47LTTiv2BYeKp)A#!gy0 zdk0aOoDA~uq9Iu;`+YM`Kh>u;gLO`u%q1)WW@6>iI8$&()jsqHG#r_6Px9?QF|}%JR4cKIKo|#Fud+E-SfvI@%o(O`I9~}Bc2q3S(E?N z^;mGHHR>7f8coPUDD*ZVpU$xC1>*inv;??$xldYyolea!$rAKvH!D%5+eKsa8Pg(817cz4O=buZoVx-J|zVtGo#%Ys!1tP<>a|TDsT{ z)Hf8a*o|pq!u3Bjmz)8zeLrOR$BHgIKW|1(C7;er8OgOOTOkXDTxwmJh=}zq854e; zT%ZeutE(jNYPd{aHjK>=LnQ}u;&tMfwt2XQo55U)tLZE5##x^a78aI~G?CBqL&qaD zlx14EF>pD%KyQ#6Y|qEAOonbq%|LiF@daTtZZsh{QY63 z3~8L$7RSA3V=mn0BhpEV2$h*>k*@X#9Trx>61PudsmAHgLH@oo7Nuk98D+W=IBD$< z-vFg`V~u~Re;YgFQjyQ`kZxL9I@A+HYfYioa82)rp4T(w6MTEFHm`(ZL7=z$GX%ZM zly0k)4umts4^rpS>yrOsj?wO;q!ssuN9xNlR_;2|2Bp8D>f0 ze&gJ()+HTG6{O)7@U2|n+A==sZbzR0)e>ptROeY|(!QrLdQPiPwVz;rp8%gIyg&ar zW%#|%C|Gq~$rK)oN{*dD-qzg+i!i1$#=rlU04iPm4@5{vEuzM{!M^a+=6nUq04oB_ zt?EjD3Zc%ytN15lY7Np-J$&VSSr&#!5La%o%BWrQ7Y|}ndrKO8oB$lU_0#6+H6}(> zVo&CmI{Az$!7)P?T4bQfrCKfcZQwWg)YIu^86oX(Vse`?~#^-jXVL?-ZzS*(N7|jM=LIAMLZGp(VeX)xd+G@PJ9rW!FE8(xPlr$Z zWBsXQ0QpFosos&8(dVt5bFzHNPZ*d#wTK`#oJX2j8@C<}@Rra#39XttZ>D!Wh}>?I z$-UHkPj`fZGKuW+_oid)CQ?HowPkuOXGy(D@+)6AlDGI0_roymQ5ntO*D{zJhJ`IOI8!K8K_jX8Vs4Pc=9 z7^+MJbIi$yx6Jsy*I%7Kz%pQ{oDVs&VITXRP~p>2InRFKh11PK6^O`JTPC?N2zJ7J zj9yRZ2;jcbBX?Owtb&0?Kf|#FG>oJI^_#78SJw-^P*M!)Juhi!Bm?!$HRQ^+N}UFS z)4jrqndC;sp|$04;4{y0Xb;TYCo-C;{VB`tRmmjmS&}DbI!%tZPxHv&fu$y0t| zejoWuou{Y7{M6Hp!c`&kt5Q;V3*m#>R!_GDN4bD)>+?=WXD=C^Tv*&^fQdq z|K8X2EB-3+@!rdp(%yFr)5?pq4s$#r^2=JqS{#I{5H@R zYQBzP%ZmZ`{-~U;ABO=+^X6ft9xW7yZOD55-~4Si+Su^R=P{!2D`=8)!uHDJ%Q^4c zJvT9E(v)9Npyg4^Tlo1-RCJ9s=B-^RQy$+5k{4I=tEP{g33oq2Jwm5uK?AafArgMQ z%bhVrM}DQ{wx^bkpK|$zJEeDPU!l``3(o=P;IU>12-j$sjQF?9e786z6<#TuW|=al zif(}B0X6TG=ElGRHG#jfyy>|$@jPv)o=?bk?k!y({1%O#=&?E%vo`?O?rA zG5dq7n{a~v+OLEE-wQySa<-NOOF`KgjKTc#gGy=gL&JZp#_OY8Uj@^I_5RT)q%IhAF*dOY6fT7F_m~> zB|pZRSm~O6w_X-xWA*PYBDM1qKNf%Iw!g(9c<|PpG!V$8X%P zV`f^w*AO)NDE28RyJR8mk~{N3Tvcx=Y+` zy0)%FWAdC`*jK)FXmvZ-37&~&54UPy{axmM5-+bK-&D9f!oZM7M~jW; z|E*7*-eR{_k$rBYth_Rn6ByJC&#E6DH&y6fsW|ZehI1b08UySqzp=iux>^51vw?t6DX?tD6DX1cnny1Ki%`qwq<_pkh^ z8js%m0^I91OSU^YV0Y@~>C{V;rII#T;PJwg&!+Qq_Q0+1=_hPQm{a0ll8e!y8M`s` z9OLnojJ94;)-ozLO7qa~!=}E}s$0f{IHcu=T7}Hpi)2r-DXqa%Q$Cd<_i`6j#F7AX zXR8_p?*J;S(N%5&IIyMDuc(_O!!RQhq zxLOuw!#?Wl*6m~81+*-7&;_&BekmYLUmlG}c4l(-HV(LSKRL#Zc|WeBTnDuGHNvnN zVtAS-v*tHaT<&go9!wS*AJVI>0=V?XI(O_W*7zm)Gs}3tyKm&*8D#H#d+ENKn{uM( zuQfAL1rfOQ?p2}RO*L|V-*2wp{u&tO5Rr#IHLauD;A9l@<&)>T+|)Mvrdn&9)`KcA zjU7)>$$7nMSmswA4I4*($^I!&?B>aGkz&0#5~wy!e)p=rNH%k$+7V(~G(6v)?V8fO zNp<0-`%zoE)}I2F*tI&n`06r=kJ7HJgLgb_IklN;A-=DKlMZ%2t}U<#Q_BoSNB0Iy zvqWIH+FVTvvAu3-~P z*W~bzc;Re_71HTCSFp#$?YxY;G_7v}L&~N6nx}`;s-*PA$u}eefWLkAE;~Dwq-H!J zxm;_KJ^`{q&bNo*002kWYbT6~6d2dv3E=D+hC44w}EYLbc+aW^53Aj6G}liLhJIHuP!#(}mX z@_1wWQOALm#-$D*driKDnN~xfIY+t7e^oXkC_4MS+P5?KBe#++DzV!kn7Yp<_{QCz z3=@rv)1~;@22XC8pA$v32G+Q_?nIoblpTegv+&zf z7`)RDXUt0J8QMEKBGYgQ2D15+XL$aMg~R=WbN4azog0TaJj%{b*C@2a=DlrBL;83o z?rHq}8;9J8RC+N)*-9!5SIvmgahG3C*=St28>BmI0vbTLtlWyAGk7HITvz?enXd_86x*~Ot?Y#31njQbj$AkAr zj4iSrVQ>q0F*h#kjdryzTOx13$73Yx6=r2t;dkIaKzV^>q}I;OEPs^#4Arb}j)=>0 zu7d!l2k6I@d`|eunG(utBZ2PGyz{@E6vXbO#At=zP0BF^!U}H2t!(=Sc^^2S@>SUf}ByxDj(crXy45rY$IE1Fh zmqH*;O-3w`sD2{*5F(s=9G?nFI+Gg45FJs3Nl)o4>|prx;5v+kCVTGNQ#2mW$8vuW z3kf?;eI~sxd)!eqm6Upd=MzG?<(F{uxg?C)STF=3O?C&cQ8mv!<&R#Jf$)J{`ukP#fNaANA^o|1_<W&txt2x=-_921e5ow>xcl|^oY;BFyY806Idqp>v z_@|Ms+XI6->k1aP0Eq?lbRKMP2bPtX6NLLteu!y(&z&(x&*57lNNgb^FZp)16OC#y zZkrS3?bm>625r1CW)!dZ9M}I;hsBj>NZJyu|IovBOf;IYRLg9}XpHXC{+OVAG$!j= zS=#mi3A7;K23`-61aX`Q_<0z5sR zMB@rITNY$e2b`ExoTKG4W0iWPG-mv!)9 zPHZ17bQfIU{t6@kOPcYumUJ=g>B&#_!v)9&^;D?sQacHcLuc<37-GxuP)Fm{65`dN z9X1wJaetEoou(u1{XLue9Rs`BcJtr|S{ACO!aH-rk&^uH4nB_;SjZzd4xQCpD~Fu1 zMn>)P(TxDhS%xDu=lLFbEejSzmQ+(VMXer`u|}#((p+bmj7)=@bDv#mw~Gdx+zR?C zu^YYgcUI(jp%@RILdYV08y}o)yPRw9;hp8Zjvoh?KE3D5cmOvqWq9#rJRZ0EEOxrr zCbGIXHKU-?%=!LSfcP`s^_7}{XT7D>>#+L#n30^~gCi#auTf}s5&iYCSJr1b@ZONw zjPTu6SE4|$Cbo;v=i=%RX0bKdfbVHaqR9ic$~i_ouAM=j@*QTU{8Qht7zFC{SD~3i zX32D>i#lH`Z#MQLP%dIfNy_0wehOyqQ4p%)a1hY|8bEMN1o)4#7v35ThbpSbk%N>N z-!PqhxQNE_-PsKBooqC>QdsF&r_&VDsANS`^o;SQ6HIGvi7a*=lSoBV2hg`^Bgin@BP40ne~&S) zLj!%sD4D82r%;;vC{wY3%ooQFszH2tW6bf3ze7$&F~wS*WVk(if;s+kB@wRvDEy7D zPcEZ9fQ(ZSU6vj3hLqz3BEQRqiJo#m@)syS2MtCZ1uCYu&#Xrti7vzO-Zxc4=UP8$ zytPZnOQXnO%(Vg=^I3GbDX`_RtmRQ_niv*cDS$@`2FZvlBt$pq#ebx73^2DcBN6ht zxrqnr@}K(aCJhBD7RKma?CRmL8RCeW{?Y|77k2_ekH$DWJb^4$8M=!ewYqVPhs&NT z9)Zyro>w<=Y1YT7tX=zFxpj5idb4G^T2}dWz)2o_AkKc}%Ez^6?Kf6!rdnG2d`gOp zoV;@%aQMnvA;P~lI=WP+FD`0AGE;s`*_?7j=wJr0{W^=DcZXV5M!+E`adY#cnFaMm z$KqEwzw+FyC1051aJOYm+JU_#=fB!J}Iu${BF9qsO}V;`RXHBYtymN&!$2bk@*Vp(+<=9!P=Skv#dO? zs{RqYHdk=@sVRi-e#dQG1X|Nog;Oo`=Iq$25vD(x*1UVZ+HwGHrwY35_$9VI9O^et z#2Xf7Y!`gAafJ4%nFxEyopjj1Oa3xHv&8sg*_Kz|f5y=`ltJh?ad3a(yp*=wFZq?$ z8YVav&IO-#OF$fQ!^g*hw5JbsgGAdPf@=NE0fSvI)Nba4K!wvO%-V%dqQoWn(1vu>Zn=_b+Y5EQR1qR_t=-2fKBKDTucYbI()OkY3a^ zXVSBz!Ptcg)Sdm|RuHpm_nCJr-;f#8iu%(I2h?6<)5;ajLP?z6+iqXv~KPkBH zppq2zSK!StLMR~=nFIAw5dy)#gkk_?L<#iRkw?FIk9_p{6ZMN`jsb46ip{q;wD>L? zI8`&NS6Zo$BwuRwhJ(sv%{)D1`uGNs+G*MoJ#Rgd{Q1f20)>;phRH3wl2@(%ZAjxw ze42s?6wgn5fg*RvPr&VX#?Bk=h?go-;h=rqmqEf86$WPw=mIy~8Pb+*u$aDo@KrC3c95bz2A?IyHUS}nsG z@*;dm@~ZqJ{gv$V`|o}Tx8)1N8W3y@&)4L?I?4<+1iVJzBCfdQ^-g2BCCT~pT2@De zkm{NEm}ZYt1rH0Z(W|?US(wIi+*xXDQ15^mIb)NJnvr;1sM@^O^47YDB>@h}TMb6= zWmA{!%CO5;lyZq9o6*BKlu4AbR`pcvIOx<}_8gp-LB_EIoy-Hw#JSJ4!fMt`d$_o1 z8WBJpaEWm;PV@Un0}Y9&`}X*Bxv)^_sbqWEGKoX-xm#>zmQ6QC!u(WW+wwChdfew0 zmt~k=yoCTe$hL0pTfY(w@FnJMgVmNmc_xfk(yVQxz2KJIFykTL#*84C&K+Xa!?d#y zw0Fz>b#>HOU1+u4;Wj`;|9L>T!PY!TW{I9lPIuNDdY5539X-SK*xs4J+2XZBrX2)N zO^b2=o_#D|JMF+`vmdMg6hW;g!KR@pR4BwGOo?mrh1D=u=B+OB<>8x{S$iD{2j!*z zBQqRm&t9Q#xpMhepO!dN+%hy|O7!T6m!?8%L}sE#v-3+kpfJ8h-loO|SbjKnc{Yk( zr~oJT0Ci%4_Ug;^;84V_40RviB(KpUzUmF{m-mWUt47j|t6i+o2yUO1v!4g!dp6X` zU3a#j$Rb0hdrVE2u6WJ465P)s9_e&t#?xfatisZ!T=ufrOZ**Of(-@EF#h&CG*R~b z===hOXO%^h{8W$P7yCP?yuloD-NeNkq<=P<50t**PcC6L5XdW$+cEb>e|wjtf(_AZ zXUtHLb$aEJW{u#CmdX%z^y?U)L+C-&PuZ1U^FEuiq;~}qVOvD=PFk&Jaq$Dr0bS;a zRNng>;kFSR@8;BWYi*bp78SBAh>gySYF9g3b>(+vuP9_ay`Z8Gzg+*78b;1~ee!(p zE%V&RAMudS9pVvH<}z~e^Fugd$$ok9@1a$i37t5W=BQBi-Z*~4&&Di4k;ul*&jhjCu zDpiCHk^V#i9)yfP{x#hXwB=JwLywEMGt*&Yw44}jhEOGhtm!vanp^wEuf+V4AKnw# z7%hFaPWhVTo+JSfCNC2k{Uc<>g0#A}fV;iV{Yu&i<9@Wa8Mh^pY1hIN^IzF?}xnaw(KSf^?%0- zPs3GbZlzZ(O&hA(5-&|HIkzGpxBtHxCyca+;5xK~H!wt-NZg)W6X;iZSNiH_`&F{V z@`tO!ks&n+R&L2suZ;9Ui$^{W$$Rz3CC7wPG$3Rx!)@^nPZM*M3oVG6Kh&_7n$xwX zvPwx+qkQc)D-;!dotaCk3VuRPjF-||ii4$xZ}g#Zo7(9e50RbQ*|+xjpoeikxyl87 z$LlMJVpDN`?q>XDN6GSfM1-I959;lboj~zEd;W3wLtU@I5}%W;MIxiUn=2y(&zk5XW2DnjQv&1HhSQ71O<^DkkzT<13K^654dVuL};f_B{#@f4jNQuDTIq^!2 z4-6N&xw!1RUn?75JyOLH(tUl5WQx35W^*9I|M)05LjzD{AmZ;->F;2AX; zA^5HcT6bGRd^*-3!n%51LHa%0!lp+^FigEQ@2j)}trMhDuY0=B#5XA)VJ7-Cx#GlC zVE90U9l>iIF1wWuIi4=WT=KIa=+@@W0d!3DVN6jao4Z)?1qxa1g{78D4Ujt8r)br5 zDnFEdFF2QJeC!wRK|!BMkuW-TK+YLh?pBS`7AvlZ?u?7bvX@2V6<`ezVm+5isftN- znoyAVUnWoV~D*Q=E&Xm zum!J0B$R-hNZ>sS*Aj_?0?fXzChECbfx*vN#n=rRabGHex$O8Z+T<9?Xw<7D+hGF< z;og>y$NQm^C6Y*>e=Lr^$iPgY@mqnLdTg*W9(%Erx(3E)Joa2*dh%wHqI%V~CB7SrjF7w>@l#LGwoQl~mBw;pW<<_t_aKZ2J;Mb1}>l1?C+ zwKVPI6sWwsc*7H07UYh$M3O-Itnw@KKD-Hs5OF1HA)#4ET`KR^@kgr+)ooRpT8kfq zHhV-At6B~}9GR$QY-;D99;C~&F-^sT!MweJ$!s@`(q;{h`Phjj#(u$XcouTM8f#zS ztX%w-2@sDe=dOSOYhPh+KnrwKbyjFTv=aVPiBIS!{)hHA(PU&E*y7~W>V*qCW}Ht} zEU|&$e4~Xgq8g;&Syw@VYkK9Vv?XlnpZm;|OTQGbFt zcn~`Xq|&vR(wAg=8Joq2KNvOnf#VJb-wa!D+K-${ z@|I)i%8bY>^g#QAwgMydB1@VC+Lvftmjr#tebH5}-)Nbx!nbdCjhZ?ze21Vn15sYT zXXJ5&VGMee^cE2jN>)we?6$jMn7CIVucwhdWA3|DrI${}w)R|;DJ6*h0jX8M`KCw> zy1u^tDE0fa^-sM4ROJ$Z=1f!MJnNL6^dmpB!m01#zfeSTI+>O8EF~=KL3pZL+$>6* zW#2fG1~{`VHsBf{7~gqhijx0P|4pG_IwS76bi7{rSR3mh0U0^8AX}o_{^e4dce32} z3P+m_6?H8MLUmnunMgg}v$@jcbUXUqda)HvBmG)L`{YPQV#GBux-ygnS+I>$j|jxw z`Y8`}C{;^5*X-BXBaGMi`K%{`^sgb}OpA8i3Z+UJClYWt+pIeHh^>j;iOa->i`Dd& zx<W^hDR=V0R%tx((VXM`e`UkyV&D_vy|4_&xdDq6& z00WF)uY+KkhSovbXTvgfZ5YCH-OV_+Z3Fg^-eN}0ZPMvxCE0x%sk7Gl6zJNBS-L?0 zOlte+=cep!e7*K&CH2o-{u;te*2j@g;iG$t7iW@3MJQr_%(TyL%LT*l4RO)6G(!9E zKKf~qCGqdk4qNiX1zKpJv0768PAth;!f3@1uHOdRnosB#B}i-9eMMiMuksb0e_5H7Elq7}s#DD=MZ z+PcWaNsl3Z9;IBDn+X9HShv2R#SqPT!>n9B@D}U9*=JKAY@HFz-H)?nD%bo5)#}Rc+2?3T8b#dT`TC zXNj9H&t)&1Y=#%}yR%0V!c+zqXol^TQwgnr5<=Vv(=2Zl4IicwbG`!AIp~Bn`&XV!Fyvr%6;u=l&g07d>!&w+neN>+r_S7|L`qG~ZsUG+RqKc9&x+ zdqox%Rmdn$GhSMB+G6NjgeV(0D%{A%v%G*^|2hf|3YF%Ac_;ZK8D&Hf2=hV$z-N3ej%mTB&=nKulCval?M6 zru33hp%L#_jF#pYGRDgn0tx+xbuXZpR|s zwgdISn@6KZ&ac8@&^Gzqc~Wck0G;~&x+>mEz*pOIGAfmS*ntgf)*iFFca0 ztaji15kbR_Ky{fT-el9v9=|c%1$l-kuhT~!@C_Boxr@a1{hpVF@4W4RL-h4YMS%i; z+?~<%ycos6symfDr&f-ZX+!50g!G<9F{R4T&;D$${hPLMQm<#f4S&@lM+y{O=Tj7o z7EieY(hzTAoI%_1pW0A*W}adZcXR#FySEPn<9^sSH5kqHvw|9WWHH)XNY^HINIHR5CD0&+RZLnr)7ywaMvWJiF+Szx22Qzr%)x)Okm@8<$&VK^S{UOQadx>1EbIp%# zPoA58%4QrpXzI1AyYlSvusAl@(*o1S1nQpbc1pSPdGf3Xewy(!@k>2=mL)iN<=U4? zP9UnY&5Hc%Chq^R{ul{Fv;_u&7Zx=;I1mh(A+Y+#{Aa`X{lennJ{3%cB7N-FY4c~O zp-KOu(w3IKd(-+sHo!O2CYfY;_rd|;d0_})@IS9$fi(e}lNYp|)!>^68DK$By7A28 z^Gu_27B5P=V^#Gf22yW%;FNDw98+7lQPAaB6?!o1IR! z+-?rl2h7$15YPwgn1WSv4)-Yam&Z9=t+^As8MOi~1FqAMd82Su=4q>IlWjoUC$l{9 z%;EL(%3|e9I~v5#kUWB|Sw%w_RGROoP=SRf1}2p|h_=(v!%q^9*1tlR!?R94X@-feTA%5m|@LNIo(K- zMTZ^C&$jGY#Fh>((Ea6@_x7_uzmFa+wB}@cyE~kXhw3BwkzOHSEx%lAcM@}Mp@J40jEYk!%g>6AaUd-$w=jK@ONU+ zLs%RI;CK@^rZ##IKCj$6t+sF4d#vWkHRZUc);9Eh{bdZ@9ME1b+Ps7%23w<_l*f zHFulw_t-%lA&1aIMt&-5M=-?DV|^CusVt#7KO;5G=)k&lXgU?%!^?P~C;5Jkft$s8 zc7mtI12%R=`-6TXmX;)b(E$SFhua`1!1aclgxp z?X(}=jbF($(q|vPfnOOU+S^+7kx%^Dm4g-!C$KH1_2$PM)NnRr1&V~SN2P)DS)w`q+}VxM1ADaBb;?DPjoWypJLEQt(~%_>=H_2217_=tWgYoS z=4Y&}j)%3v@MR}23z9m^GI5(a5D|KvK#2IcG($F#*mi&0TEz?HxmM&i3MmN*c!^Ld&(7c&3RnRJu9!%4TBzRv=8zS?@pY|Ak#229#M_ z%d!=`ZJ2PDfn4z%ySOfWOZCb1Rnq6Gjr5?a4O4qUE>(mcU--lUQ8jZ&OV|4kcv`mD zjiu+Ni$8$on^o)G=2nawayl+0Fl4Fy8-uy&IUrDbg1nn=8o9+sE_1z|pJClg~#*U5p1LXcN6kVpSp@f zi+FAMKoZ#6W2GB`q=B4)Q|{`71*A9NR0_prn09l7{@iH7+~AYL#IQcoS-;^RDweAq zC3`Oi!Bq4o!=3Iq{*~#rbtlRjUW50rv%+mh{gf;_PG}&cdf|P;OmL3E$|VxhUG9!F({G10 zF%;%x%%=vVOVoF9jR967`Z}E_p`_7fy1S5GYFi)IZ6hQFqZ6 z-6Dsp@VZ9fn$Jk1WdWJn5z{Uv%r2|?Ws2J*{_k^pv-rY)o7~;wnOEPKXN__nNMGe1 z=TtPmyAwuMnpyN0`U)B&zkt)0X#8w^*2%|iAaIJbK zxA$eLQ%u}$rvZ);v0_PdR0UL?Hv>inBbQIa+mM!s{!rU1D@gFf!TKxp6jni3{01yiYCM#Rp8jy|aEpku+^)XC~_ueNX zYLQpY89OF>te9s=&s?t>THji>hDegs{5f_wd+y>^@?^ZqTpB7Hb$sxSJ1X&(~UBNuuiNray+3CI!wHr9hfe6F1(CB3ENNqF&q zd=A*!{to-AX&Rqee(=78=c@!@-$yfz{SVFvQyzlgtFP1${M8_)sV83;k+bAo<0W3> zWrC8r*WFP;05D;k+!`;nF9Sb#dk@56~u6vNb2MUcYhA8fC8()OPTDYqvXr&&H;EqGLP( zEla7^gcC^=Pznl!A@YtSTy{B(U|*nDx!p_XL%u8y|XAoDMDGZc$1sw}t0{z|+Kd3>oqG8m>~% z)!%Ht3;2Xhs6Zv)Hzg0>bCsNFwUA(x`6ZukS-&sUvR?IWTu|KTz9F6|h;F1)3d7nt zhKKc8>sY(p&r+tU+huIcio*y>pjgSlll~DT!A&IEx-O^!dDnW}=_H;1(0zT6& z3r_b9sVRw{&#lK-F*O6)e|#wW21T!_W*rT2bR-E0qjjyxpwXVF-5$XOWUZ<{W_@<^ zf>$d4#`mo)scbdwSY}lP*J5RTr~w#Kq4FB&$-&Fv=pfln%S)i?437Vfp50_U+3tDY zqF1b(oAKy+v?hw}rc%TD+iF?9o%tOaB?#o(>v(fP8T}ecKI>#V)p~$o6a+FFxf^6F z(}xYm+nPInE-o3(&2$#}GCQa9n6>=Z**Sa8SN#M7?hf2hrW-)KWAEE#dt0qr*ZA&h zFFX^_0MA@Yp5E1($tDksUf#g!KYkuUH<1osO};D;3u|wL0T2Zl57cx653a{r;6Vv^ zY^`e#LO$Wcd7=;+rJp&6oB6piY8CppsaM*Y9(psnHAQOuF}ZZJwzFI5?$5iRaaop$ zFwRH1$PV&Mq`vtIb?c$+QF9et56%_L*L!qe;Fx;=sMgI1oGpV*|4wY{`dshUVP80r zamo2=VM9#&6FP|-E}7*Y;0_QKF{r712Z)>rKj4qYN1B~m8v6qNC8ww-*1%fRmajHF z>d9~kv*14uzhhyqIss>B<{b7$he=Vr6I&Z3r=Up=hhMU{*8d)p^6^7%0~=ew+i8j-65 zm_n`c*QbZKY!}PhpMn`>Wasu4nJw9nAUYKN?SKTDps-$FbORDvNYCJ>EXiXVietlp z?ICl<)%{wbD>oho>$mr9gKppk;zkEMp?UK%L&Pdmhc&Rkt?}BJBI#^B(@g5&X{ z1dG_FW^$49n#!%$HFoFMZVRXB?a`kmMJZSGPU4dW$BiyQxa#I=4bj{21K&RK3}!%C zowua~IkWKv=t)GycwUHf6I;q{Rj9-uAM3U)5Gy<`tJ$(m{CQf7y2-rD#&^Hv!bXh_ zLr;dr8THchqHe!uec8!ypH}4V`@7*OfXhM+<(V~FU+EUV6-|}}BqaRY-+X4PEBMrO zqW4P`$aJ>oL=Z{jF!IZO;^UKGW$^o9=$7O}$r9bXZ^Ey05%J@Hb$(lR`|dY@_1XeB z%p+_p^o=L%SY0xz-y_*do^m(oe9}ag^boh)odryP@L{XvyqtJ)~o${3nhvDekd*LiOLa<&c zXNHFHVNMxy9asx|&SAC)z^$)DH&<9}`-U8lt!e@#&@~tXZ4cefKe;gna0Mx6qqb8M zWBXCirzxqlTBZq5^A_>juwb>f%d9P1c(3s~$Ug31p+n9R9NYHdcsff#45$# zZZCHI1H~rH41sLC!5zL~WPFY>mcxb%O?~dyyX>C!ollM1Me$_;NzHbaz)&6G#oRe) zqXWyd%n=uW3(dn*U&n0Sps53UKhhs2vWg9d1z%-}2#*C|$@O#YP65zP6aX~3x`MyC z(g6Q7TU&dg&zB4_Tpb(&_Kh_ev3YnL2}*EWn{HS}9721VtZ2}+2nQBdCa9;%xH_P< zZkQJ6#3Y^l6NedqmCWg87eQKg0*&9F*`It&#WWwAQ?Raz)7lodR+!B$Uj;{As`URr zBiNes0Do9%DKkrS)BNxO$W0fe_h$|r8o^tJ$pIUJ3u9cHhh=Q(@=r6EA5VjPR$U`v zy*5oTU&{%|I}AXj^5oJ}YIEVq5+8;pU>wW#gVRUhI0`Ve@xb%DPOM~y!)(KjNBg*G z&3703K-SjsN%O{5U;^k|NoKZDF`5W?5Bk~6W#=k156Rcef*I>-#?*Mj#bTAuZ*8`AN<3sz1-Al75$u2?f#&E8ZiVSDyP zyAjX`?Yo^a6kP2@O08Yg&7tRxy;6}H46>xojPQuWH}!v&S=rD&<$lxQ*}kVOf6T`O zc4+rTApl^MZx+3T!f`iRPMG@F&BUrL@ZIlO_@9~@34w_h_0()lfa>)8V~^BgMP$5N zIu107N@irUtF?M%KZb7MS5h@NDDN3y=FT zXWz1ExcpAf)xk4HEXZ~wg}!gv69FV&(6#>A5E`Lw*y!f97%*e#>N304xcO88WhrD9 z!%8v9=?0cC3rS2&td|_DPe_WsU;QnrOL3Hw2p>H1-*y?B{0s@RwB*|zwWR;qnWRLg9N(exy!>3|7j&|GTx zU|DikhfW1#fdz6nw%qo6fLob?|FI>A}m)|CO3?Ud=u7r8qy;aF9Ujp?Gv!xKIBhpx9SshmgZv6hX9v?}zE zO)vCNb(ge_rsj=CGzRAgK1cYw+FTUw#Hziba)u9xHJ$R!5?Ruwp(!&@ZrmTcIvj1P zcSEtSG*l=~DUE$`4L$@y^n^MV@YFCS1|I6~R^b+1v%#t+<5kt4A~kRYwc|Oi@uf*46b7Ar6hE=ekx`JyQiURZV3vW-ifJU+J zK&}yB$I0z1d6fzSiFaNlnH?uJg|aRVFH6 z&*d2)6V(^4KA9)N854<;i% zNkdCl7-V{Iv!X?B*cub~`%EAle_>{3?6q{?KdeUEh*G-N#?1J{Zs%)-a~8wmQ-^}q z?0>kj(EU+EmHXpAF8kDJ`f$HxcWN&GB6ME1{6A2*omw}5GyIyp9};LEtPj%FijrSP z1F?4Cf~EZrK11@$P#u64>RU{C>>%Dg!$F703+5G+!@>Cnx?15?L1MMgX~d44jl|d$ zNZ2E+|Gh4^9i`zvVcyRD2%mXh%a}Nv(%XF5(UivR{12jXs_|s@=JQqCG4cDSBQXsJ zhMmOPKhp)UGoTZ~Dvz@n zT1Sq{x5jTE`960+FD}-h$v4G+S%om-$^0wEsYc+3Xn6nFcFSw;l_N%(i^3K*q#Dl$ z(t*gUb#>$&c*8x{7Z{jlPb)<0wr^9uSi*w^@j5-FY+kH3DZ85`%R-)zXtk1o$+#2m zor77HLPPe8_B;pP_!|g2ijJ-56;B1+5mQSX;Vwj4rFA(4?b~=PbU44RMhc6t zU%<@S4+y7uW-5er{T@WXv0egMQqBG+*sU1$#i*H6c9nZ0bgGp)$1KLrf=y7@#8u!3 z=Mmy?y`y}a(6VqcFc`7JMOQKyF5unsMjCJlI;3p?pRdtur|@o60}e|<*qSStAQKe9 zC9QfM0Y|#(TjvJjek+CaHWa&f_Uf_o9-BH*_PDvNF`@eZGZ^{L*?1;7ua0~MyLryD zribNLf0V<>mIW{bqz%d5MAlARUhd#Bw{}HDe1jd*KxtK~C*;aS%D*C^!!==RKH-A> zk2a~qSz~k&0H`0qmh~zGNkE+Pf>)FNNZ}MHkhN;`{QtB~(?xdUm;TQ@LfFFIcbs5kqSoc$|Wfhkh(^3h~HMvRUPnCOCowFj!x zk3v5=&t&`7%N-bQ$P1mGmp1aF(*4oiFjU>lesoyP4BA_U3XRLZ7g( zPnU`oBUEyQ@_9Tsji%HL2tX0;r2scI&u!}Dt&3$&J#KK{Uh=qw`}Uy?889sl8Du@Z zvxNOO`nc=khs_4$dJF49d0DeLoKG7wHk6r(pFW)Roaae!=&}Z(#E*W@o9Z|29|`+$ z9RIA=Ye|7Uo45pfAj%a+P?K4H@9#O3|si{!W4w@+z0CjwN$f5!j#8(Z1;fA%6Y#cl1RiE?3HY zWH-R0;}(?$!Zk6HkVu*r>LLq*!6Mp$3yBZQ9NS4xKu^x{Dz9p7n+%ScdasBV7QNugedi-4We?1r8-#`}@ zyvF8{Nof*p>pD$Om6CPDvQ7#ag>x`YLs2(xdv?jkCG&)QtPu>S>wBo@Hm-YOJV)GNCoysX0SAvpS1~m z^7X%N!A9SX-0R&=zkpX)WRU6hqW|ApsA?uMTUY#xm4&tMpwlbip_FO9fZfuUYf5p? zmQ7jrS32w>X3qO3LGBnYewj3{syTfw8;L-banHj4b04)pq3-R@qT<`E+t0`+I)xv@ zU9C9O;}@*Y4ene%{_7~AbF!}VgDD(gsa7rZqa7U$py6NDBkR0icEzbCG$yqzA(P@~ zQwokV#``-`1M}P?Th*~ZkX`<6c{Q=0#}>L^A4c#Q92DEue)U?Y9_b{5QJcy!>EoRk zw(Z6jWfr=Sg`)z|WSI?*)K4$^eQTa5&{+pNvz~Fi5+Gngx8ixhpj+#BWmC~=yBF!3 z{R#5O3v57SP6VgfJ>8@RR(s8mImFI@{# zcP4!OZYwG?g=k8@0*y#DG0$P(j$QRfUnx+EJ^Zr?X@AbV*d z_?O=bJDmr#>7B`ZkJJ=3u!YWz?+v|Xy-z1b&@@z?q>B?qh5Gd#$+C8=A5Q~K?G^P1 z(?mjr?in-XMN=wr1K^E4YweniYGDNw;OJK~YPXGn1+qc!m?r2kr~{{n|F`hC5rzus zC-XaQWv|=l-Au-BOEFyaxhiicR}7w=VpJNu9io;8TNZUhx6zvu^6p2?(4*2}BfIsL zgGKJtodsUC`(bkJd<5!gVxu7)&_r8wo;+)lC)u?H(S#SIEmX4`5uKGOOe&G2mXpa{>^dqr@Uh)@OWi; zp5V*SD`Xf+B{&Exo|2ip0PYaD;ZrtBO-W!>7cNL>w1#AC<1t=P*Vf_6zUO`E12JZ5AK~4-~ z!-}WqPx1#^R59$CoU`mvd9mJN>U#J9ls?lXL#MgaYO}+V=E0i>n=4bJ1l*Cq%EogK zx5I%WHntJ)AU|K_2$*NbJxZSNi1?l$Q-D1nF{3OC;?X_T2peOGLZ?gIxjI6fp~(6k z%V^%4o)g(>pxCZdXMJyu-_8JQq33e#iso~HwrU^|EU7<=aPZl1kc_LW{$19i`3m7j zTX7=J&$g2Qq(vrnUWH|sC}0ut{$k=)g^94-Esb36W=wRfgw{Bddo8Vx7gw>7EgLZR zye0ML76Q$yj<+nt8**hUjfVKjbE97RmK}a+|Itf6iQRCu74z1vgG8+Bkn&?$#H(&Fwn%yb9zFd!hv6%zf;Tr%kuz(@0gP`O8<}lGGGPTL&F-?cq~%&%P#lT-D~NfQbQvCqXROK1ZnC}_U+k0Pa?}rh)lA} zz=ONVP?yp^mEc0XzY$)7R;&77`4nAt5lD`i@i~coPppMGJw~F+LvOi6ZRe7!>DBG} zH!0!%vd{mK3T}^m*XZ8(;oeNs?La=p1J7oqu69?EDXJ=tJvNp4uLvjX>D1T$ij8>@ z4=XL*Wu=egGqo&;$ewLYdV-%yaZPQ}|MmftjD$>T_SG69E}ex&-%R9fl*MhVh8e_n zb&u)%*Gy6v|HyHALOoSG-{2>_@futw(_LgSW@h+JpuaVpr-@IBp8S{C38$F)`)#Rj zXpCD~HXU_5MjUM0C8V@0BK_Ha*5qGLpC$Mcs`{FYYJoJWGLxXr_pxl2OKkMnNzrwYvI zF7+!i5q*C9r+aUO!R*p9D@n|nZl-G;$8t~U zpGKM8$93lhY)j*|YQw5tncPhZ?k0v-v_EYLFU=Z<9AtYnw?vfcgrgl+8lV|KO=g&)k4kZP#2UB`4RStXvSmbmg*z4U)BY?wZUR^mW%0 zc153~Oq%_8@_=Trzr|%uwB%2XbqIPxmh$v(O zXna1WJi-E?mbyd_uaOrO{lt6LYbTQ?igrVJf?r28J*_4~TWA>)D?y}v&XM1cw%&>f zv*;S`Pc5JEn+Ffy#eWI1uZ^YYlN*qLwCljo1u9HQI(g}>;wE@d8^``0>z?gbS&bO2 zCl=^js35IE;oxHt1Uz;4lLK9NHXK)3+SWx*ewK}?a%yZEJ!(FK#ZANtLPVt>VO7@0 zHM2lp2pJ$^U}j9v>vb5~b-KxN8!KcYB_p!ok0y<0La~1F1BOmb*Emi7+8^6F>reH- zPR-14Y)|k{ZYgrb)cL?}*msgojM#kQ@@M3gNe0GgsxI-!*FQR0;3(phaX`VwA$oBm z%01M;HwIw2_!CgJhNz~wlG6nO19uscR{A}#--t<#XDbX>As!7UXF{4hYDB@MlgF)x zbb`u?==F6#((PR*G|r6}KzkPfpR!ZdY~a*~Z&uPnn;nn1bt|#+v8oYP zJamsgw6WOMegnZ1MHBZBs&-qnwmFLeQh4DL<$urj#18F&ygvo&D3A`? z)jrwfSoj>3E3q!ek}FaNeG^19Q~@2&`NxSd$osyftsd%GvdX%T^=aSy5J&TU9J75f zdJqal;leLSewmKfjj9HVi@zRC%BRc2M!JB!M>6=VcLl9=g>J1&BPdp;WNzpb59kLX z`8ApExJVN7o%;{+g1;^Dc!KIS2*8qQ{k>XD0es!L#OvSJ?k=#7{v1~BFbBz4&>a{6 z^Np+>$%0U77d>Yqg_a0fz?tN3shmA)BL(KPbs&C=yqn#d@Qh3d=A`lX|EsC5j*9C0 z-Ug*ZkZwdky1N^sbLf;tq;n`mLPAhNP)a};y1RSmknSA1VHleC`uVPRt>64JvF<&w z@1Aq^+56f1p(1c=8C6sec($p!2>Yh%v?vs4?FZD}?>`Otp_F*0HeKte#uu1nac*1q zfv1Oz2I`D$&W;PqVmM3{yj)kl1?UvOE8z@S zFddorF5^YxQMbOW8R7CbSENyVw+uCW8MwlSHv${tA~K2t?6!*L2ggi7{8r$TwJ&H zR5)iuFLJA5q{I`f9gs1jj!N0p4C&qgNGQ7f@fB(5m0DdD$Lu}4 z&JTBeCqRI>$oj|@0w^>Zma!E_9Nu`o4V!fgEZ~v!my~~Li=dJw)6}=)gdCfD2n~Tb za>3@_aW^#dNm|uuUgn^}{nIUx6w~gqLy|I6=g5iT2T@USzqEStfw%QgM-^SUX2YQ- zk2LiTqYozB(G!TK(`2mf3=vi-ya}{n{E_deH zi^v-4ZSJoQHgBoi?$h6Jf1<;24@h_M+9VAI-d~0GGfY+pBRtBxdA|W<-&wa2y#zV0 zzr@7krqq&(EgY|*Wl_%c2_nkvw_sb-9FQj3BaMtr@3$Aqn}XgZjb+Z?X_SDnp1eO>u30azj3G|h z?^BzxHJRpV7<92FoMYJ9e4Q3% zH2hBLZYVI8O^!^%BVpFR)s6kZ^}g>lNwSFAx(vsLO>uz&|qG`Zd- zn@Yj#p4!F07IPNs%NmDE*-fTMW_7(ermS&JNBhGc=NYCKOJimyPEORDSZ<=|%2>wa zDPG#m!S{&gQm1@Ugfb{dlRtx36qZb*Jio{VcA)diq?npRMfIzyh7l9u+h_QABE(E7 zrV-p>X#5?d7Vo}TQA`e+N(dxrMTX-I^8OrP_$ICH^sc*)tk3P&q^)FM@~jIT_Iww~ zeok?Tn$2tX9&#Fc+Pl;~eu_!5@rw_Fm4!gVBz3|i*Kg!)?W^bg>}L3egWm}XN>Q5a z4a&Umpckt8`XO)(5fR6J3RX!n@%Q(4>exaq>OCeIWSUjV){j~+k0{F49drC?yseX-GCicx>n|+<{3@TktCx;XyrDytmvpWhOe3Ob#X4NL zQ=|RCi)GY$p9ivmqx0D`x?1VTomC?h%abKer^xMz6dbDqDpGYXDs4{VFlB2Zjmv5TRZ1rU9kp<$F;7O z)|PlT?t=jLM>Mq3pcH~_mfA&>vO(0I6G8{weW%aQHTM)wl`BtR#yMch4Oy4naJFR= za!*us4=YgX>h8WdKjXS7IkV@NHi!;PHbCBtKojfEcgB%&=c=b}3?q$yirHH7i?8oA zW6&-@D#L1x_AUXEB!F}Uw`NrA>@W{T1D&)5&XbV&J)=Xh=42w1XSy0~!@8A6bBUm; zh-Sv8EQ#6z(6v$-lLWxmMKqXKxvTCNjf#!Qkd#WV#XTw#NkvrTMpxkVcTZUpvRPs$ zK*Bz3sTg&HI_8eXr^OuSK{VdYQ(~AAr(2<^#AqGxxB9d;=2a+w56L$D#icdF6a6ZO zTf<&-GR}utZymja&q;?6o8<3XHY!C_(Wq)mx_EIS@LU{i@K(aXUs;36RDdjK$WZ@X zfXwTvbQm*Hz})lQUsug@FfXd{aT8TU zXb3maVopg2vka}Yq>CvbIH8xiKkX%@6eNl^@C)D9V~Q7d*|vjhw)DpsRwNl;WWUN@ z?R-HLt?vBnGODaNhR(P`xJ3GjUz4=WC-|Bt^d)nW>VS_Cw1DR;_U2Om*BXcf7HGrs zM)qa{Nd9cx`oUa%nD$iuYP4Eh)olM=w<5!L4d~09s`In6Z0p*%@Qa>kidzF7#11nwmn{F;Kuu?LB$x$9HEn<m(G0vHXMzt+`DZL^s>BI?WY@``dd`u{Pos6++qQ-X+`BNj z+>@)Z-eYI!;%Q_X_FxEdCw$jPHe4E7xuD9O>k<}vsY>OJlgBxBMm6H#)9LO!x2yfm z)c@=R8?5e?PI9=7>_M)G;_HT9?{R<%MSl228lqvg+odQd8yv69I{C>@R-~`H1B-?( znl0TN<-}}-AD0}SibZ9EGk=N&p8&{KimLohu8Fro{oP-4^{n^+_B}b}M&Snkll@Y@^FWeMN zi>W;i!qtdasbI0<3DZ5bPd9vr{Dmpg0I@u97clsU(#9-lG_DbnruqU@_55e1cxd_N zDr_J%V3#svR3R>%>PyV$Fq8-HF$t~eH~fyzQYhO`_jQP-L>^PtP4L{^!$Lf2;PqVG3)V=~Xu8a3EG27)8gav&>E! zKk%IYvc5gDkdF6r_Q6WRqHH2v?Hd%E?g$c%!^8dJYy+;{RSSz$!JiCRr~ug2KJ$}Y zhhoEqg^!)9%xGec4*lE> zX7k>@9w@Yu`L`s;1bgSEb^rZxRg(|*FW#O5>fADk_;(^S>3U&*e`bm*j`pz>WNwx) z`6no=HLcwt{@AbMQ`rNR@5M9}2dAwtbNqHLha#{E@i zn6XnrL7ZoRr3IRPP~<}56FT7=X=4hnU8L3kxuGBU6j&Leox?xJ^RN$BO2@cTIKwZ! zc4zV4XoOJ+j7~li;`Qb97U6Nv(FqP#S@z4-IhbLw6@x4cFZ;52-yJd5!(c46ZrM5< z#>}AFqQ{kyXoEI~+y%0_RmTB(JsW;jUW#d!1&g2`_xXdvV!2c6i7M&~B~#i{91C4)J)a!HP^Fn>GbFwjh0PJ!;Tu@d>B^3*-$l z^Nw$V=%wRLM*{b;n&pX6L-UVBtBPo+@b-L%un3TlQ{1oI`{efh zJa8cru@>u$aqSEYF+uLFXp{`1)`^?~aUXdbhURg`k z<)(Ola{y6Q)!NOD)hHF2I2iz4yFXN0^t-kST2+WqS@qe*5r1rGJ36XgFRfpiSpvK` zpKusrxvwh6V8tgpDnqL4k(VM=;>~Hn+2tPomV9KbFY;YJ|9KZvFpUu!Ro_ims(M79 z=B%SEP@--d#aLJI*dms(7N)xyXO=Ae%qpxg$a_GIS7d0OfbiRLuP(G-*PTH5vj4 z6AYB!I}JLGs7~5>2;XtNzE5)t*+mit>y1f#i4Nsz50mr(gEcckE4U5Ys9frGOXyg! zj+<1+tW%|EUEudrj3*jInf_>Pw^))-R5Ss@XAc_b=K%;=V#JjL$xcR;tYXCI z<^F6WE@j6%Edy^24eij1AhByP3+#4rM??Thny6${NEu#Zo1mymhC-TPE0Doao%Ua> zL;LY?3G--SZ++Lb#cC-yH^*zNr~RpvNjTt(FK2_GPf3}Dm}kDb^0VC@%Wbu}`mtQ} z3A4wRH<=$zE#l1FBQ((uEiGc?l?nbEDV6`Rh}nkMwVO2}0G14?F1^&$CZ`6d|F?>eXTh1%dXxS=!j3hH1s190>pHF zF**G`_!?RAxyqzR!eK(E?wf_`a*&c z6+kJ@R}XO>x#FKRJNs>f9TQ(~Q$Ab>%u2_QFrM(e3(Kr+v)9~%A`Z}9+Z;oJyE7$D zXDx2;hSh?eX@4>sgO@b>OCU|C>+GspB$_ZRvEI;LuPZpPKyO+S65$l=F(jSaBex8X zw+C>BI-jFUgH|wUn-nc=hPYn2d6FfO?=8Rcd``JOhk41P$kggrOd$=t3eRbI}Vp=)(i%sOASaq#S_)x zX&X)WsoPt2!K*gklfP`7@nqUSfkW5!>EiulIJDt|iNw@z>B)Sz)3x6Ed3nL;2-Vce zzuBkwCN#r`IQ9g;pIk6-M4qf$CbmaT_aGIPpB^iYSIjKd+YdM$#ydQZt~c>AxC0Rx znc}lGg^!yTQ@Xb*iGZ$*4Gy!nwsqQP?P0$~1!i8MGadtfgd0rs?hmWA*3DK}ogO#e zn$}1=v-7)@1aM&C(BLG#Y20Zf+6;>7Dy`q=%xv_8k4+ct-JtYRix)tj(@L4&o&nz( zHufO!>x~T$kLW%M#Bpi!ZxSxSM-dFGni1NrvF`N&_;^M2d?|}XQfN4~H*t(az;A8( zht8+V$=j~a^McMFH6RZ8RJdf19vud`!two>Ij|mw6KOKgxTvC7~@8L8n+ zae3rJZP!8h!Acxk*+;*eD=8!-?0RK+8NF;d)vHV(eCI|>OKVop1y#y=npY)2dO^i} zb5Y~iWFY!VnycVyB_J;m<>Q)V>uL%6gQr75<&kg49hk^GggRd{^4bqds6aq)X=5M2 zrC#gQgk9ij0fk{(Tf?VY%G*MfXn4wwWE;AR3@q<9gZ{o--bbl^po7LL74YQ3$toanY8uZ2Hx!VIMy_*Y-pMhI?qnlJi{>ES{YySWkp8$B!~}_9)_uV7LU09nPe3iJ35=p0uK; zSd?it1YGeqgUXau{%)E=)Fz67AqcT2h`AQQRl{)g*GQq{eRazUx<#F@rAX`O%Z?8Im zbjYJxDu4vRz!MaKoY0^+A+C)tsg;-Q`~fXhUJTEE=qB&T!dv`rrQ@{?(kp1qBt zN#(QPdu;?WhW5(CjR5}vDrk8%$fzvn9Mfwr2l~-vwJb5*^T60Zuhis#!QtL-*_N8z zXuY@+lTNeF6^e7-5(rahj+G{2gL!(buQCmjp~$z{lGqX3?y2C z4aZY?`i^}s?1Hr4Uph$e&&aj#X=7kdf@FgqY7eKAGqQkzB>j zUjluHd;-Lo{)$|OA~s)m?pmaQiG1W_xgHf$Ak-YJ3J^M6fL&k3;+UcC#c*AwTH@J( zW#_!_@ve)QS}f4@MN>m8ABZ`RkRFq5zI^42qm4{+jYuU6O72@3Oiczk6wpZBjf&kK z|(j4JnD!Y*?i<#B0EkfEz5;O0o zm>=N%^ltk}4|iWF@|qJ4qoO9P(+o<+i-kzpN6d!%_=f!0x50f3;=Pa6i${m@7|(l; zKK?XYv*E9~5i;FbV-R*hm#?V}&@CHW|NQ3@j$|;UHDMN=lI>#aYOk@|zBSEP$B}|C zsEDZgLiiYW*h34eXjk*-}zt6n1GEAk)K;mv-;iGnvpXw z{MnTRE;@hf&cXuz9;=*qiPHa-(mO?qhsh(Jhw+AZCfx{0TJMTBy@ruH``E)*ifw(Q zt&y~=EEFOrEe*Ouhw5J+=>m?Tk)iqX9UY24P?k zj_H?+*!3JTs=gH2c|eesj+%07UM+bJw?9STNq!XZ^g2P@-^9%xd+^=FAdQ!2N#f@! zb@zV#Z54%aU-s?+0u;`Ml}!tYggULq5MXpNFWMS|w;Fmv z^SMLqbm%kRbhOL+X3Tu>gqy>X+Ii!>(dHXkqs!%93w zU)!ys8a#NPjZg}s*ZGF6dG(j*pVwh(%0S_yv~qy0Sm4G^66AiHpXSvWb$850YTLx9 zEu3}f^(FeR9LfIlWOwZ7Cc9A}xo~3nvz;}_eIaDuy(@IIyxk`=PB4qW_3Q5JZ5S>So7E?I~vFh0_eA2m?ED=O+@5CBj@@ zpx(FlO)HD8mjW|jmmOy(WwQC6|DoyCfoL>R-Lgc5QZjD$@f>Zv2Z%aM8cIEro3AU5 zbqGxuSzB`{t*$umR|v`io@qe4W(KtGSp9s8%RFklSxYFe=si^=uf~;guF7H6MYL5n zRi)u+JM#BdyHw%1^XRFm_XH+<1|%+Nh6p9Zu(n}?Ry<|~KPDQUVDM9Nln%IeY&H0^ z)Z=&zI-umI#tF=R9Vg`Nr~ZQ`rZnT}cSU$>MbccQRjzycaC?)MV%1}aB|}m0TkQm-tqAn*@UGh94_RWk zv}L3!_g5y$1nJY+pEGB9{Hti17y;N0n{v*pFd?j=tkm>Wi$Uh`c$usprV{6!@jGrI zYoBRcQe|e!XAQcbUqAaC4ZEoK^4nl61(b6>9Xjx+01rF)7mfr$mr1Jup(svx8oX$e zg#G>`d*yo0a!dfTMQXz!?$$W!Ro7NT({E4v){k?e84B2o7(2baGL!jDafnnNyLv@n z8j;EEqH2JNiP4T0cfx*umYHX8aViA%zeeAYduxaE(wfaOp~8vSc?Cx`MJ2(la({OA zg6NIr3~?@JW6vSUzsLKE9Lx|_@8p3^WsECggd|@tY__p2F>5dmidh9?FVuxM9|OpQ zTLln1JOqXIO1Q56JAZ4IuIr=W}8=N2LZ|!I!L|h)jo}ljQ`*M#d!HHy@bZ?1s&A zw798s;tK6fPYSsTHVY)HIEi4F-)a-xn^;;r*EY;Mgk0jA|H%yf?Y}2CB#cQ&DVw$< z;D@WAUZZfklRrKC@7fv+mu7V)?5-eD z@6aZ1@3F4{?o>td9|D!N&KmmLN-kB5^cKzs$Z7Q>GLTLdylg8Y1}ubAf0Se}v@1Ex zaULJtb~5bhd&Gbg#h#vyx({~s|Da@P|Ma(Dj)Wt$%q&|Gx7uWb8aUu`bzLp{{@)84 z2ngXl3oET7E>Vb6czD3^1SS9v`=X*wfJ!IdTMHJLa~>~Fnddm;TyE}O@BWtbznL^l aJRx7^+0e6q`Yn-wm$HI}e3`6e=>G$8zRYd_ literal 0 HcmV?d00001 diff --git a/lib/plant2dxf.py b/lib/plant2dxf.py new file mode 100644 index 0000000..434af0d --- /dev/null +++ b/lib/plant2dxf.py @@ -0,0 +1,25 @@ +import os +import unittest + + +class TestPlant(unittest.TestCase): + + def test_duplicate_points(self): + ''' Testet das Nicht-Hinzufügen von doppelten Punkten''' + + # nodeids.add_point(Point(1,1)) + # nodeids.add_point(Point(1,1)) + + self.assertEqual(1, 1) + +if __name__ == '__main__': + # Plot Ausgabe in Unittests steuern + draw = False + + suite = unittest.TestSuite() + suite.addTest(TestPlant('test_duplicate_points')) + runner = unittest.TextTestRunner() + runner.run(suite) + +if __name__ == "__main__": + diff --git a/lib/requirements.txt b/lib/requirements.txt new file mode 100644 index 0000000..9cdb0fe --- /dev/null +++ b/lib/requirements.txt @@ -0,0 +1 @@ +ezdxf==1.4.1