From a48c2236c89635f6a2b48c718e20764b602986b3 Mon Sep 17 00:00:00 2001 From: Timur Usmanov Date: Wed, 11 Feb 2026 11:48:37 +0300 Subject: [PATCH 01/10] Add pytest9 to dev requirements --- app_python/requirements-dev.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 app_python/requirements-dev.txt diff --git a/app_python/requirements-dev.txt b/app_python/requirements-dev.txt new file mode 100644 index 0000000000..322bfeb44a --- /dev/null +++ b/app_python/requirements-dev.txt @@ -0,0 +1 @@ +pytest==9.0.0 From 5f7505a04c0b5b21251ad2ebbe2846bfbde075a8 Mon Sep 17 00:00:00 2001 From: Timur Usmanov Date: Wed, 11 Feb 2026 15:45:54 +0300 Subject: [PATCH 02/10] Add type annotation for app: Flask --- app_python/app.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app_python/app.py b/app_python/app.py index 07b90cf6c8..14abb06dc5 100644 --- a/app_python/app.py +++ b/app_python/app.py @@ -17,7 +17,7 @@ format='%(asctime)s - %(name)s - %(levelname)s - %(message)s' ) logger = logging.getLogger(__name__) -app = Flask(__name__) +app: Flask = Flask(__name__) def get_system_info() -> dict[str, str | int | None]: From f9fe4e82761406682c0f87271dab86268693a1f3 Mon Sep 17 00:00:00 2001 From: Timur Usmanov Date: Wed, 11 Feb 2026 15:46:22 +0300 Subject: [PATCH 03/10] Add tests --- app_python/tests/test_404.py | 16 +++++ app_python/tests/test_health.py | 17 +++++ app_python/tests/test_index.py | 114 ++++++++++++++++++++++++++++++++ 3 files changed, 147 insertions(+) create mode 100644 app_python/tests/test_404.py create mode 100644 app_python/tests/test_health.py create mode 100644 app_python/tests/test_index.py diff --git a/app_python/tests/test_404.py b/app_python/tests/test_404.py new file mode 100644 index 0000000000..a46dbf9e9d --- /dev/null +++ b/app_python/tests/test_404.py @@ -0,0 +1,16 @@ +import flask +import app + + +def test_404(): + def assert_404(resp: flask.TestResponse, codes: set[int] | None = None): + if codes is None: + assert resp.status_code == 404 + else: + assert resp.status_code in codes + + app.app.testing = True + with app.app.test_client() as client: + assert_404(client.get('/health/')) + assert_404(client.get('/sdjc39042/sdcs/dcewcmscd/')) + assert_404(client.get('/../../../../../../../etc/shadow'), {403, 404}) diff --git a/app_python/tests/test_health.py b/app_python/tests/test_health.py new file mode 100644 index 0000000000..6d4ed4f91d --- /dev/null +++ b/app_python/tests/test_health.py @@ -0,0 +1,17 @@ +import app +import re + + +def test_health(): + app.app.testing = True + with app.app.test_client() as client: + for _ in range(3): + response = client.get('/health') + assert response.status_code == 200 + assert response.is_json + d = response.json + assert isinstance(d, dict) + assert set(d.keys()) == {"status", "timestamp", "uptime_seconds"} + assert d['status'] == 'healthy' + assert isinstance(d['timestamp'], str) + assert isinstance(d['uptime_seconds'], int) diff --git a/app_python/tests/test_index.py b/app_python/tests/test_index.py new file mode 100644 index 0000000000..2e57e022c1 --- /dev/null +++ b/app_python/tests/test_index.py @@ -0,0 +1,114 @@ +import app +import re + + +""" +{ + "endpoints": [ + { + "description": "Service information", + "method": "GET", + "path": "/" + }, + { + "description": "Health check", + "method": "GET", + "path": "/health" + } + ], + "request": { + "client_ip": "127.0.0.1", + "method": "GET", + "path": "/", + "user_agent": "curl/8.18.0" + }, + "runtime": { + "current_time": "2026-01-26T15:56:22.043+03:00", + "timezone": "MSK", + "uptime_human": "0 hours, 2 minutes", + "uptime_seconds": 160 + }, + "service": { + "description": "DevOps course info service", + "framework": "Flask", + "name": "devops-info-service", + "version": "1.0.0" + }, + "system": { + "architecture": "x86_64", + "cpu_count": 16, + "hostname": "timur-ficus", + "platform": "Linux", + "platform_version": "#1 SMP PREEMPT_DYNAMIC Sun, 18 Jan 2026 00:34:07 +0000", + "python_version": "3.14.2" + } +} +""" + + +def validate_endpoints(endpts): + assert isinstance(endpts, list) + assert len(endpts) >= 2 + assert all(isinstance(i, dict) for i in endpts) + assert all(set(i.keys()).issuperset({"description", "method", "path"}) for i in endpts) + locmethod = {i['path']: i['method'] for i in endpts} + assert '/' in locmethod + assert '/health' in locmethod + assert locmethod['/'] == 'GET' + assert locmethod['/health'] == 'GET' + + +def validate_request(req): + assert isinstance(req, dict) + assert set(req.keys()) == {"client_ip", "method", "path", "user_agent"} + assert all(isinstance(i, str) for i in req.values()) + assert req['method'] == 'GET' + assert req['path'] == '/' + + +def validate_runtime(rt): + assert isinstance(rt, dict) + assert set(rt.keys()) == {"current_time", "timezone", "uptime_human", "uptime_seconds"} + assert re.fullmatch(r'\d\d\d\d-\d\d-\d\dT\d\d:\d\d:\d\d\.\d\d\d((\+|-)\d\d:\d\d)?', rt['current_time']) + assert isinstance(rt['timezone'], str) + assert isinstance(rt['uptime_human'], str) + assert isinstance(rt['uptime_seconds'], int) + assert rt['uptime_seconds'] >= 0 + + +def validate_service(desc): + assert isinstance(desc, dict) + assert set(desc.keys()) == {"description", "framework", "name", "version"} + assert all(isinstance(v, str) for v in desc.values()) + + +def validate_system(sysinfo): + assert isinstance(sysinfo, dict) + assert set(sysinfo.keys()) == { + "architecture", + "cpu_count", + "hostname", + "platform", + "platform_version", + "python_version" + } + assert all((isinstance(v, str)) ^ (k == 'cpu_count') for k, v in sysinfo.items()) + assert isinstance(sysinfo['cpu_count'], int) + assert sysinfo['cpu_count'] > 0 + + +def test_index(): + app.app.testing = True + with app.app.test_client() as client: + for _ in range(3): + response = client.get('/') + assert response.status_code == 200 + assert response.is_json + d = response.json + assert isinstance(d, dict) + assert set(d.keys()) == {"endpoints", "request", "runtime", "service", "system"} + validate_endpoints(d["endpoints"]) + validate_request(d["request"]) + validate_runtime(d["runtime"]) + validate_service(d["service"]) + validate_system(d["system"]) From 036aedb726c78aa67e04d18ce4a2509679521e8d Mon Sep 17 00:00:00 2001 From: Timur Usmanov Date: Wed, 11 Feb 2026 16:02:30 +0300 Subject: [PATCH 04/10] Add docs for task 1 --- app_python/docs/LAB03.md | 46 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 app_python/docs/LAB03.md diff --git a/app_python/docs/LAB03.md b/app_python/docs/LAB03.md new file mode 100644 index 0000000000..876606d7e9 --- /dev/null +++ b/app_python/docs/LAB03.md @@ -0,0 +1,46 @@ +# Task 1 + +## Testing framework + +I chose `pytest` for its simplicity. + +## Test structure + +I created 3 files in the `tests` directory: (omitting `__init__.py`) + +```text +tests +├── test_404.py # for handling disallowed URLs +├── test_health.py # for the /health endpoint +└── test_index.py # for the / endpoint +``` + +Each of these files contains functions that use `assert`s to test the app with `app.test_client()`. + +## How to test locally + +1. Install and activate a virtual environment with all dependencies in `requirements-dev.txt` and `requirements.txt`: +```sh +python -m venv venv +. venv/bin/activate +pip install -r requirements-dev.txt -r requirements.txt +``` +2. Run `pytest` in the `app_python` directory while having the virtual environment active: +```sh +pytest +``` + +## Passing tests output + +```text +============================= test session starts ============================== +platform linux -- Python 3.14.2, pytest-9.0.0, pluggy-1.6.0 +rootdir: /home/timur/proj/DevOps-Core-Course/app_python +collected 3 items + +tests/test_404.py . [ 33%] +tests/test_health.py . [ 66%] +tests/test_index.py . [100%] + +============================== 3 passed in 0.16s =============================== +``` From 0f9ed8b925e006630620f50884732f4ffe83626b Mon Sep 17 00:00:00 2001 From: Timur Usmanov Date: Wed, 11 Feb 2026 17:16:23 +0300 Subject: [PATCH 05/10] Add CI with Docker build&push, fix lint issues --- .github/workflows/python-ci.yml | 45 +++++++++++++++++++++++++++++++++ app_python/app.py | 7 ++--- app_python/requirements-dev.txt | 1 + 3 files changed, 50 insertions(+), 3 deletions(-) create mode 100644 .github/workflows/python-ci.yml diff --git a/.github/workflows/python-ci.yml b/.github/workflows/python-ci.yml new file mode 100644 index 0000000000..56ddc195fc --- /dev/null +++ b/.github/workflows/python-ci.yml @@ -0,0 +1,45 @@ +name: CI for metrics app + +on: [push] + +jobs: + ci: + name: CI job + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 + with: + python-version: 3.14 + cache: pip + - name: Install dependencies + run: pip install -r app_python/requirements.txt -r app_python/requirements-dev.txt + - name: Flake8 lint + run: flake8 --max-line-length 99 app_python/app.py + - name: Run tests + run: pytest app_python + docker: + needs: ci + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Login to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_TOKEN }} + - name: Docker meta + id: meta + uses: docker/metadata-action@v5 + with: + images: | + ${{ secrets.DOCKER_USERNAME }}/devops-infoservice + tags: | + type=semver,pattern={{version}} + - name: Build and push + uses: docker/build-push-action@v6 + with: + context: ./app_python + push: ${{ startsWith(github.ref, 'refs/tags/') }} + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} diff --git a/app_python/app.py b/app_python/app.py index 14abb06dc5..06194342e7 100644 --- a/app_python/app.py +++ b/app_python/app.py @@ -2,8 +2,8 @@ DevOps Info Service Main application module """ -from datetime import datetime, timezone from flask import Flask, jsonify, request +from datetime import datetime, timezone import logging import os import platform @@ -48,7 +48,8 @@ def word_plural(number: int) -> str: tzinfo = str(tzinfo) return { 'uptime_seconds': seconds, - 'uptime_human': f"{hours} hour{word_plural(hours)}, {minutes} minute{word_plural(minutes)}", + 'uptime_human': f"{hours} hour{word_plural(hours)}, " + + f"{minutes} minute{word_plural(minutes)}", 'current_time': loctime.isoformat(timespec='milliseconds'), 'timezone': tzinfo, } @@ -78,7 +79,7 @@ def index(): 'runtime': get_uptime(), 'request': get_request_info(), 'endpoints': [ - {"path": "/" , "method": "GET", "description": "Service information"}, + {"path": "/", "method": "GET", "description": "Service information"}, {"path": "/health", "method": "GET", "description": "Health check"} ] }) diff --git a/app_python/requirements-dev.txt b/app_python/requirements-dev.txt index 322bfeb44a..8343bd38e9 100644 --- a/app_python/requirements-dev.txt +++ b/app_python/requirements-dev.txt @@ -1 +1,2 @@ pytest==9.0.0 +pylint==4.0.4 From 1632d927c76f39a8030e8ed681b14972e7885b25 Mon Sep 17 00:00:00 2001 From: Timur Usmanov Date: Wed, 11 Feb 2026 17:22:18 +0300 Subject: [PATCH 06/10] Replace pylint (unused) with flake8 in requirements-dev.txt --- app_python/requirements-dev.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app_python/requirements-dev.txt b/app_python/requirements-dev.txt index 8343bd38e9..40b9a509b9 100644 --- a/app_python/requirements-dev.txt +++ b/app_python/requirements-dev.txt @@ -1,2 +1,2 @@ pytest==9.0.0 -pylint==4.0.4 +flake8==4.0.4 From c3708d54b1a89525154bba4d6608964737778557 Mon Sep 17 00:00:00 2001 From: Timur Usmanov Date: Wed, 11 Feb 2026 17:29:33 +0300 Subject: [PATCH 07/10] Fix flake8 version --- app_python/requirements-dev.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app_python/requirements-dev.txt b/app_python/requirements-dev.txt index 40b9a509b9..dd9710ab3a 100644 --- a/app_python/requirements-dev.txt +++ b/app_python/requirements-dev.txt @@ -1,2 +1,2 @@ pytest==9.0.0 -flake8==4.0.4 +flake8==7.3.0 From f851750bd677da5a4c022bd73ae51ffc3dd90ff0 Mon Sep 17 00:00:00 2001 From: Timur Usmanov Date: Wed, 11 Feb 2026 18:10:09 +0300 Subject: [PATCH 08/10] Add screenshot and do task2 --- app_python/docs/LAB03.md | 43 ++++++++++++++++++ .../docs/screenshots/Lab3-green-checkmark.png | Bin 0 -> 68050 bytes 2 files changed, 43 insertions(+) create mode 100644 app_python/docs/screenshots/Lab3-green-checkmark.png diff --git a/app_python/docs/LAB03.md b/app_python/docs/LAB03.md index 876606d7e9..3b55f469c2 100644 --- a/app_python/docs/LAB03.md +++ b/app_python/docs/LAB03.md @@ -44,3 +44,46 @@ tests/test_index.py . [100%] ============================== 3 passed in 0.16s =============================== ``` + +# Task 2 + +## Workflow trigger strategy and reasoning + +I run: +- the CI job on every push, so that we always know if the program is OK or not; +- the docker build also on every push (so that we know if it fails), but only if tests have passed; +- the docker push after every successful build, but only if this is a tagged commit (for semantic versioning). + +Note that this workflow remains correct if I decide to tag a commit that is not a tip of a branch. + +The downside is that if the tagged commit is the tip of the current branch, then tests and build run twice; I do not +know if there is a way to fix that. + +## Action choice justification + +All actions that I used (listed below) are mentioned in the lecture. + +- actions/checkout@v4 +- actions/setup-python@v5 +- docker/login-action@v3 +- docker/metadata-action@v5 +- docker/build-push-action@v6 + +## Docker tagging strategy + +I chose SemVer because we are developing a service that other applications are supposed to depend on. It will be helpful +to know when a breaking change occurs. + +## Link to workflow run + +This run pushed to Docker Hub: + +[github.com/Error10556/DevOps-Core-Course/actions/runs/21909811285](https://github.com/Error10556/DevOps-Core-Course/actions/runs/21909811285) + +## Green checkmark + +All the checkmarks: + +![Screenshot of a successful GitHub Actions view](/app_python/docs/screenshots/Lab3-green-checkmark.png) + + diff --git a/app_python/docs/screenshots/Lab3-green-checkmark.png b/app_python/docs/screenshots/Lab3-green-checkmark.png new file mode 100644 index 0000000000000000000000000000000000000000..12dd2bb7d5048e0c5fc350b8c03e2ee934b3e5b9 GIT binary patch literal 68050 zcmeFYXHZjJ*fxp<3kawPNRvkek*-wfk0KzwgLI`zM_M2>D=0-Y2uPO>p+rjP2_n7M z5Gf%by@nP-&$oEgci!{!oH>8a%*jlKO|tjSUTfX!F4uM4@3l3RX{cDJC@3gsR31Il zrJ$h1Q&5}~I(G(q@-`#g0{l7e{>a#qf`Yd3_hf3Ka$ z;flY<6i3WIAb*=6C;l9-iTpo5eL0L4Pg;@Bb&>YjjYZrG z;cU2LvqSs$2alo)&~N#g2>C+`9mVtvtn7s(Jaibc<0kFJc|Y-JtSFt!h5z+HM97${OxKbGF*4ygQZygerJ_@zHzh?uTDWOLHp&&Q_gU+yjQ9*w`ZkK|Cs`^ zq>6eXoyncp>ZH%Dt z1K8(J@mX~~1cQ-v`jTO1Uh|U5_Ba87=(cIUl%3b1-aC)dStQ^&)_D#iRZa*G50Al( zkR_YqX;kyTPys%3?VGkiq1pXWpJhW2)v%K%PwFFeDH#MVXA~?uuZ$s$c=8;msHpT~ z!d9yhnbTKR#+eYy1o!E`@8mHu|* zbGQx?cH`#FGTTv2b~P1)l?04_*`tD^$5nv~UlYU}GGB*& zn4g$D4VIHDjLBdoY=-K<_|GbRA2z!?xxb29-`mP}v%MM;a^V^nYkupUZl5=KD!U%b zrF%hpY{mkNG|TuFKCi=?l9E#5E|&iDr%zle3Ht*NRCIwctH$xCf%!u14ed(>-N3Pz zr%FX2H9BS&u{EKcb|lFP)AE(USBf3_B@ge?u&%!s7Ad{*q%=<>d^V@_vYKkZB8%^(JV_Rp0w+^=?7f14v z8HG&q0@u&l2*+=YO`WMDLpq#DB z2esaetx+cxV3wAW_ngt*ygJ4a6cDu?;|%ufMfmBj`HLLxjF6?uo3D6k8qnuD!OsB zg_xSqU=xl%&SZyBdE*BOcmPr7#ukrzY_LoTJnM|el={=O>nyvo9aMDGMD`6>a&*S) zPY@Seg9M*KwBJJd?3r z{R;1uuVC*ramW-*-c)ipm|kF!nGcd3tE(_98vd$Pw`UkdSE(fiH`oqXiBKn5H6;1f z<=#h)Kr4gY!0x+!@3uB&Vf1p8e5OuDOPd)iGXWd0(9kcB=obNrse zq;6L{IlnzdFpD)oY`c^4_g;G8xvs@>NC#{%|G}{E2oh4qnfGu#or;!fD}F{m{Fcdy z6XN&{W)II5kE#oA-=@fBlHwXO+D4dywdrtJwPRPnNqPF`U=fC9KarpDs6>OqCH5+Q%5KC}Dwb zw6~iKV|c%QnvetBXS-u*$~w=B+}1n8D}HG^X*ZQ)qMfj3QzO@@U?RdIzyn^6{*Y|6 zW09?|f|x+v@!xLY;}?C%wMjX%i^(-H#)=o@^q>>I!kWStX2m7oGc?#_Z*0wU5Gp(l z(O=G9<8|<`I!QAJ#6~DGT(ZzdfROrn*m(#^v*bAbN>M8Q(}G`5fp~uU4IDL74&|Aj zSLoTZwxXFm?j=#3`{!?#h&v8U+v&X7FkU&u7y$r8e>gIByPIdsjBNCa!e4OWpZy-chGEW`~6O)Tc)MFq!+p8Q&#`Pi*7l z5sD}u^|VEr=$ArcPSRb9+&Z61O@BF|!vD~@q}1ce#jD!${;s9Q#Od!rVWYJM9Y#f% z&++n(d&{YVIrb1Sr~Xz*H7C#HGuZg<8a3t50>{UQ@6A65-n}(=^ z*+;0|4G{~Mhk~D*oDEBxBexo&sLMbOBL=r@frMEmkM{+MN*aH2n)7X_ zA66*lTd(%8vpBB53Y8ak7_MIZhg!h?kG-0`;1krjaN%5UFVmU)r>GItNB7`8E$VB@9`)5; z&kC&+t%x%}+eQN6h=V3wlp~j-(i^8qnEbRyl?-vPYzk}w6AWC(pigJcb;aZEAUHHO z9tJCbfwZc<=(^S5o_tBkGBlm7NK_SW{i(oSP+Dp*YBzH|A$#*U&TsuIfTu+RgLI1_jTYUkaE|(X+6?%LUweqvXliUtds| zkLIQb3k!?649UcI+0iUxb9%-3nMR2kEDpmQ`9$Il0qI7*FP3YnMw_DtlBK1I$(zT) zLPd80#$|&X5w)E)GcGh7Uh%;cSTxNIcNgm5MtDuDKcnOC7^t-I@ET>8>FN%Y1H7G)d>IEx9{2oP2bdMLf*t(e!7JjgfhgaVYh>=@lV>cTs>hC^9m!f|g@J-QF}#oL6Qfyb zwYs~s^WF<3vn*?yLUmxta+EUe`}AA;XTgO{=eHs%)mfhY$EmA)r}@_`K106mc6w7v zL<~~Fsi|3Mf83+(aiO8?=8l3%F%%VKUTan-u&)68-%Q76-B2F^+08H}zVx}&t6$fn z?dNe(XzfowuhIlgwuwN~Q`H_n&b0`dy(D0^7s@DLn)Z26RPjw{zTbcoNRjjlJroOZ z-;6CkBo;(Or~|J(pRngWm}SjMd8Ies941xaCXnBhUPaC5(6$l7YgGRE+A7u*Y#vd+ zJvRKpqGyZ1@g~Y>(d=)FP&YuB7}F6~vNmQqe7mT>4R8H?O>&$Wq1l@#Ma&3aFdzMv z;z}65uQT`joWLKOoVFJZ@DHXidTGt$09~%aZf#}I%_p4k4h%(gl5LB#I}daeEZGV? zY*lw@|GF2-ns0@j-|J}9)c)K=@YMgc&@|%8$E1hNbntR={)Eh50AUlZT@-QhB-N@2 z-JeUC!cqu-x5W;#^#3b0>;KJ)xO368@-q7)=>l8}?R@L{!>S8$oIIlcJdCmG$n*H* zK}B4E2L=I$IK4j(kg^Ra$cgJ$l_^t(^)(%AEO5Lk$Y;5MUj6xQ%Z|itu zWX!Z=#2-O$!vl~J1|h5~mcTc}DxTWLcnE66eCB2d~gq50UoEn?mS*Tp%>hD^E9Nr0JW>sE_wTP>q|h zib|WRs_IaOkPJcE%V4+^l8U}2qNx@qV6;(e&1;hR&h=RkY7YmAf*a;7OCQS5^az*| z8J=-#Bv7m%xg$_`fb0c&VBP+%;`FGNJF!bQJ_RDavIYnjrrw6 zNy|keV)+Y?RpB8Q0+mO7R<}_!e^x8Jqk0p!>NQ_gMb?YO;Yy|n!Yaav0+b=kb*l&F z%39a-j`xECQ=_wZhmG)VtZnfu>h1OG^$D_`aHU{bL%V1dx^cW#{oAr1YdJeRzCBYD z6HmGlj!Af$PKElt%|eJ~Qnxn25Y+F^7#SO^pwiCPS}nC2t@;`iiRDidLCv|GYH_i^}5V zmN1HGkL!{c5ICB6s*xh69P%_5FAK@VM0Uwoo4dLeu1DL==e$+h0@0N?&EO*xKt_;^0!M2uuC`tuPw<@}kJ+t7ZIpvGA9E+w$Mk@Cb`13LF z)^}?G$bp*4o(uS35Yq%3v?Jj$-XIvG8>**7?5dctqa286Zmo7J@qC*$SoLIxU3Esw3S6&dh;rp0h*UDm#xK4EDICtE)e#A| z#QTd*SLN6iKju^kdHQU0n>|5xPFcXBL?3JyU66HISz8UxCxk2xRYjX1YgJyp^pls5 z8^}u13$0bvo%Zzc&j$I42dfhKMDIVptJ%vGC71syaRH<0!@STf(%32c}J%kFt1 z9WcUfuf`CYL)RcYuGZtbr=!uVId&Sj&^@VS%|c6#9AnS9MH1fV_Vv3uA=erB4E3>M z4h2Q#Qu)K)8a7=dhxf}#Y{c69C~-HCohFFyN{cx^wv_Ko$S9uTK7McyspOH$pcqh) z#v~^f;u!_{#yIAjrn0+KRW)OuUJZ+UuhW%)!7Nv2I}ZQ4Wsq;82&>@;TJm9+wM0B^ zIFlgh4V&95J6vB+5V22T6flP4YDl+bWz9e7e1aR4hDdoYf7N7nHPqM7#L6m1-O4j> zDFOqn1i6@)Q?owh>C?{+D)0{LFk30#`H%dJrEtT-bXRk!rEOC;$tlThqX$+nXYu?S zKQ`YI-UAPy&TCNOi;iDSC4G960n5zBihs;{aVqNdtCJx8VvRg>O&D?;D=?I>fZVUc z{`Mu`tIUSh4zbB~`>}$pEfuKj(WR=_O`T)Tfk=;%o(mNbN$M`r)oL_q*lqS|&Q7~h z3zm%}Mgfy_)c&>_j8Vuq+k0tha9IlCzQ6g(vi23pswvE|_j{-emXi5shzyJ;6+KgD zyPd>AY+q^!=qOPesc}o)ULDQJ8?bZSfJ_a3MUze{JOwzaNKajE{4TT~Qd@;G0%3?c z*tFn&l&oJf?ctlohh2%J=-IA)l?vR5IU#B%)gC+xk1(%pTU!ff6%+f$=*5b@&7W4q zxgJ?zyGlJ3lLB zxyLh*EDM>>UP^4Abbr)u+;B7^HdYu9Ah6a|_g?5RVFO-4-m|g2YR^o63F7cYotb~4G%{K3M8MI_W+iIqAm7$7f0#s*oCV zlx6Q~W0Tn&$-FYmVEJVhE1@^{fnC4gnU0nKC+9Q- z!x*7Cxz3V+s**)_Pk&rLDj#ly$R1#QRa#mq=JnHbcU7t;N;$A-*fZ!eXS}*@MNu-b zt|HWrl8}!rz)aYuY@Q~ZIB{a}=cFAGl@qmyDV&Ozu%6`)+-l27xhM|u8W)p_jfh~8 zRa4YXyOT-Xbxk3Zl)h(hl299JZGBl!3%ZgZ^k`T(%OJ~xtA`jCfSQ&?#*8Dc_sCBT z3&^@OtJC;zvTLnfyLK(x)NLWV#-FsY+zP2OW7(~5Ng-walhG1^X~~cy!JC?!Rbk?d zO%4Zd-lssDsAe#Ac+?`6bPeaF;0eG(zI*o`vyW74c1p&{`ftOHQqdOm{_*`;-sS_% zydH~7s{H^U$IOi%N%?JL=ESBxy$W5A!G4a7y#;DeT`o0{$2U54zp`X>Bqks&kUtum zALdzA3Bw;3MX08Z3}0iuw3=tYZ=__HZ}4AH6uUk6qoKh@JdweDaV~J;$z<@VR@BV& zbnA@QZp6vo%TDgJ#qFjfc#l;~>mZ*g#=N@?N3JK<(%K-u2tZe6xxL7Fh9b&ZxANzH zDwpvMqcUpmsBr5As4;Q!@EDtxyKV~P`xaaA>T(KY$|Txh#dPL0*+s$htE`%LXULJ| zXKdyifiq0;tH6(#i@}XH&6sAZ>{DQzI0%`7-Tc>TuzBXA0;LbWrca+fP4PoZw^Ltc zV=K5ssLh&~_y z>Fw1fSv9jFc(}L}kA24Sva?2#s3JYL#`+lRHOA}|Sy#*{5@~agivIHD^jjJ%O9=BC zE)~-XX9JLstA1{EawxHCQtg>aR}9bf&S!*;gYe%D+A{sT|}yn5ATMRi9~F#>uf_wV0_Wkx0*eeQ^1 zx*WV4oCJPNwoG-oRu@Aa$kJP}2{ z?(%cu=*s=EW{rgXsQ{d}eb0f`B39@sZA44Nz|VC&v}kE4uh2dPx>2%~>e|1*4|eMo*vz`$ng<)n`$!gNJ~Bs z=RX!&qpFJ)OqQt!NNIAil-HUWhaBu{K|w8{!D!%Cq}YCF9+b2)30?m561q0{>m^~I zG*7SPKuqvXSppo&@k*WaPhx7E@o?C?Kzi_z6Ce~z_51sNL8KcuZfvdZ6Z}@5SeDtu z&pp3y5pZN2BRC_sCc$~{ag_XGVDI{>tbc7$kMh_pQhhaXar&@IMJAzOYbzRVkg>>I zU&DzT+rD)SZA`aah&-6)a~Z8N^{Fv;XwjO-Dt3r1qqMFB@qPplc-&0SF;fp-MXqt) zbN-;F?k~~YiRDt+*QJH~`d&gJf-=zayV)sUB=xn%1}y_w@q#L<_daC?MW=5GRobIn1`uth{uxx_qaAV1B zq{=e~WcjxxB(MXsT=F%zRnv`ozH1-l$W~?CW*@>L2H#cSx2Q6-I=b5obv;VvpyLOr z25G7nU9F*iwE&Z$BX;)oeB9h_Ou+#MCurEWV+{+;xY|&aPfLeoqz~~ybFwRV4nzwF zYvysi7Wg*L5E)kFH1d#73z-zZITb(?wDJ7y>9bCg=}oHLBoqJfpv0WO?%2XnKomgS z*Wxl-<~#bVWw2;r5s?|MYDn8Y;Af#^6q#WMYFb{Y0zm(vdWF?(RcW8)L3Y%tVZ#}s zw{q0zV0u#|uR%Y1Kx$OrKFObG9~BvCu>PxQqwAv;;4;&FpRWurS(yEdcKcLs^vL~N zf&|GTH%|xWf0v7ouVZP?EJ-k~eC20W>pS%WJ&VVpd70qHf+M4gfV*^N}BDp~1CSo&Ko?65Z%MnJk&Tqv!6A0i?W#Eozj_MTQ-X6}%S^m$_)b z>(Iz5^vq?sAi&{mROj<_G!X`BsT`~ON8l4t=j6f4RYga5@}$9``V@eSwPz7 zDC=!_>`pAwYj~q{Td(f1QY|^nXzjRaBQAL7SXo;G&V$%Aj}UX(9t(h&eKE2KR+y^W zU5vmrq3^qev$|>5__)+MqQe>+AHlNKlP57hY_`aOiwpH~dt@btev%%sd97l`OA2W< z!wbCJJsci^un&5=h|SOV_Dwr0Cskil^TRK3S6y}Wvhum5wqUJP3kw8}v_C(NEM-Z} zLioMt%I@tIVe;T4y)3oYtI|~zFx?8DCD;BdV%Ob2;=LqGeRX(v7`j)*1kw@=QjI%R zy5}=_!c?WbTh7y{`sq~*YEFCqz?b*!6khcNL+U^b z(U1@~($@Ys+eJ2pl^u{6p!>R26z_%-*~4JFk!y`W-f z_kRUxW4}lOdF*Uwat?B7NDUUtZ(bA>NRXV{Hz{{!#^mc6)gc~(XAvdmPy!&jKv)=O zf9CX=GjM~B#M;$7vpg8qyQ;*tXMcZ3`o@hPAf${QzmcF4N9~WFH7WLp0ipo_B{qLZ zb+?%G2j_yNkPWT8cF$cK02&r2fa~pDpYlu9d><)rK+kz=H^&VMu~gxYnLyTZ_#B?Iw_8b!b=~{5sdF4; z;l?)!FFK#&HG2uc1+5Z#fS}%XEZ!LXl?9N+c8LblBSjWvH14NEo&)7}S`S_ezu?7K z-8!|jJD0L8V}W!;f|;N7iwa}lgToC_Odh;O@M-U>i&2}wQd6>BgaFG>#4D4nL4=W! zwNh}A_mSRs1Hi7G`;m(GiXYb;69Z zziryxyQ*N)AE0!L7CFgoyBCx-*)W;JQl!B1I6|*v%zNIn4`QZ!u|nYhJAiI>L1gNk z!G5*y-&Ks<+X-w+a?JVVE=8PFPW5Gf<9GM%n>V**#{5s%fTCptWgi8$cfYAyUH+-F zw9v>@4Rx&@=3NkxMLb6xBgiv;^4aosd*Obe=UbyzDOdZt`N9jq!ZS)(6qt=LBn1o zV7kfZ$TEn4C?&@H7|b^vr5BzXSxFFfskUDRSfKWkuMq#3ckkTAT*iKSqU;HB#LChr z#)A^=(Q+5;kjp623gf7eAfp(#FQ2<0Vn0)}e-N2^M+dTvR<;b3HB^fg97r`ScijJw zY*Kze$1Vw*h&P%&Il_nonR5z>OIq4gsP+IJbTngBXj*q)FT1;UN=t5KnAuG@elRN< zVj36j(u4L@(QUizceef(hguA7QacYe9@>yX7ut}ASrT^~IFWs93`N5h#sI_wDiK!FjdhNp7j2AGjY4Ho^|Ao?7{4RVA=Y zG-<2vEJxrC6@Ycrh0yw&azq5QcoLediXRW|7fEj^qE9K}0bc;7wReD)TU1mZY(b`4 z>l&SgGtiy1vs;rb8JsGibR2!93KoME)^)L6fZMg{4_8PTI7Z}F^tFhuLunV@=cEu9 zGlKS(W(mVby{`|&y!S3}adSj-2JYiHHNM<4z7=hAb-bn{oJpvtkZR(ipfKa*e8My*GjYMAzaGMtzw4&j<==dH!9I1LqH$$`7bxe>?WXJcRbs+T@oqw2&u9eAw;OHq^q6(2|^>}7a`byI^5 z(tx$kolmD}_}CExi2~BN#32DOzaNh&cb5(26 zN*<2|7i(4iLbOuG^2svI|+( zro*f4zw1>)zUx6ZQ92{#o)sXFU=UhbK+4p^9Den;8+uV^ww(;hr$Qgo6`5+IjM%6+ zoSz+GwJt;T6BWzQ0uSY5XSBi`mkfVrew}w;y5eReW2dt)!%uo?fEOJX+a_Y0P~9ls zISs{!4}FU=GBUOnxH%S^;w*`$Q>hvG^>b(?{AaIZ1867(VVeH%y$CIXSiCyiq7WX& z;2BH@u;1%N)2@jdxC;EU#WLmuX##ihz2^@A(B0RyGP1Zm>iP*xEy*=mHncJ1Z3uJ~ z`B(sMTw3j+#hzeNTM7B*ES@L^g0k1vvvF?Lpgq5rBNa{=ix{}72T6yFH*FAo)=SZq zBx%Yj-pIoxW&mI&UW?io*ni~|3;Fspi5w7gW$^|7ZZf<|a5kW`)U#jHMQ|l8JnV1rvS&f+{V# z`eWJ1uwgnm~Y4*x&m?%?Y5hW}B0A4PVe|LEaBPTzA8{r6cW?BDz^K7CU9?|6cg{ztX_ zBK6Y$fBOH2XC@v4Isv|8I`3S-U;b}-U*L}yv@vd=*=!Rx&j{M;v0p`~AwccxKgxPXyz#2H8#kB(=>Tl1S z@g&a3`fQu9rf$diEG7H8Dmv~%ZWe_y^z4czGMS|W3cLU)IJlIw3N7`TiXd}KW zDj#0}zZ&v>S(WXz-$ow=^C( z;Cc5#L&a~Ezk8e6rDKVGdwaKzkEY<$^AuOw^Ty0-gf(taQl2?h&EBF{e*b%3&E6Ni zD~w)Xjt3`S_dWY!(;ZqbEPHbR@~4x-=p6t*SVPjbqT@?O+0hCVFFe1Eva8C+xBcMy zJz9qOk`MwAW%-2SDlSmm)A9*5r_C7vhsUoM9n0xk0X?nH7pC6knUssDN$67#(YvHG zu=v__rzScvv5KFVAc$Nb;j_e-6nB@{{=14IctBCbDWqF6TPs*C`np3~H-DCG^_FW? zI(p!l#3_oP@A$0WCmN-QRAlVe8>vMtZH4$u4SL@PxR2X;3ip>gHCO&SWuo0v=Lg9- z6e7foclv!1fa&a*xc-VNDJJTUpRsNbq(VUO4r~ej7+nAmA;Rw)fNKQfg9CR`0{9gN zg1+Pkj6zglj@aDnYZYF)Kri*zVt@~3AupDT0Jw!XIcMqAv7LM@{_xVzEO*A|(aDod z92_V)Hh$X(u#%>21a24Y(FHv&+J}cF9rf!zxGs(8z(lRP0}AmwIpb`Ssuhr>T+j=# zQAPjf(O-lwSu&vkJl?hIkQQXRQBz=;FIDc8r@3P4-@K0t3_VtKSuzS>A$mc*pBg#6 zS9+BUm+)l63fIx>bwIQ#j49dL+vhtE3p)<PFAl|88! zg4#De0@`S(V-1ARw~F(>Qt>=P?%;_Hdid|$AB6uP0f|iHH3^kaT6Ue?4O=g)3r@dU z|2*CS##uUC;Ap_R(06v^{ z+RM}IVv%y6e}_($Yk{;IXJu#c@bRg^25WbTP~Y#bt2aNSK%cgH?#(U<8Pr+Gs`R4| z_c6tuMo4FzWd*b}C8a;O) zL0SXMf_|K91uqYe%Kr8W_VuYVc?OBw38K6H$3Ft9&4CZe(x_GA5}Q1GXP`~6u>P|y z?qd7cQ3oSd{!fDynK~ zm^BIf5G<>s?5RSMW{M1t$}xLy0o^r_mEBRnd8kPwZ!d2ul=+jc^>~B($uSf2jvg03 zAk-daKTyCGLN$ZwO6_|31|0^xe?6=&U<`LfSD}DfOb19$5=7Vi!H@H$%k)aReEGv|kn^A7xb{^rS=w(r)wUy+@6H|VLpO67X8MYM*t~%q!Ww)_;+1SVIu1 zS%+G9?%vfoQBD!KRsYBUuCF60DLGPVALXWK48)hC#j&pXBbBWuF?&lum81=Q$Tv<;GJveV6-`y~wBN+5oi< z1OZxyWgjP=1nx}kAD2Bqwg9+yDai8I7(Symz!DvXL{_hd%$k&V#RJ(kXVw2?s5?Tt z*iZt1S^+(A+~C5=1ElA+cGdf3`w9S;43QxhB#5I72eP|*XXPvA!2(D65(3|bhUOb| zFrq8WJ~|<)lwdZcCI;o|4qUfx@$yQkg1Rb(6Nr-ECOaNlT@7KQd_yqE*Z(wa!GGHv zUiRykI4?iHy7%JXe|jL^TT)6uUSV@J1eDF3knngQ*?2bT7Vb5@_SANl-|Aj~$^0W- z0O0781~*fN(iN$XB{o3E;&8Y}Q=PU;JRTG0u~;#ZMQkhKkBp1Ls3urzG`{rQdD?yy z$`uRVfGzn*Sd+Ia{(>pjU=5U7w5IW&5;Jx&1bvN>0pwFNv$K1eBwg(n$(BGWGgpjR zw4g2?E)Y)KL^?<+cf|JgUhJ_B#~j|Ip}Md&$l3OpyvqrePlYTt zq5Kzy0uCprbpcm{KUU7TE{vPQ%7PlsfcWD?5`=UlNJF=^-QC@f7ARimf#?g`E&4jE zr~^WeyaBNVC*Sl74Y$k{YStW#qGkl$oVS68fv!hh0NPQ6%`wiimXT1N0!Vt7xEd z9q&k5l^rPtC=Q2Y`p1tKy%+l1AiN+Cm1CE+U=?@!1g24NW_ARSE%V0GfotOyj!>7^ z0gy`OkSlC#nShic^wxaH_|;V?1BvD|TH zKw_FfTeOmTE8mNhdCyt4cNKToi09d?TUC=&r1gsfj8*#kUb-a5TKq&PDSn0Mx{Hl-aAMv9Nv1fmGbY&^KWjv8E0V7vGgaH z%UkGND)^dy5>UH0Ua_Cfd_@0o+@Em$6H9kpyLCAnI>F;e(mzw^_(pDy+P6^^`OZIgpNU@Xkv;nNu*)b* zd9^0vC_6Z^_TZ#afcVQVxoew|PxJdlgxe&aUq&4v7SeGZQ%ItOIU{Z8>v&Jb{&eG# zb7<-x3{S=y+mZx%?RsC3FEd|L@>ArJ_95t81}Y zdw04$_QPU%^ZWA`9tC7;@=XTU+m)7DlPqrhP>2_UTsmbDFq?jvzP-J(GpXVoV_uu% znt48EZ8132$0^R6|E!Rf7Ss~EQj#Q;tjQf6oYFv+-F$ca^zxmSp7tamShQyZ1n5KX;c)pM& z&0YuB?c5Ve8D}vVMj)W;(d&^3#kt-TB3x0*xa8DjmB-ZafuO*Bzf=JCX>LNm(E=+8Lx_J zjT3gA7XK>RGDM9BpVhPP;{J}0lf#lun;`;cMk1G`zf7|9x?JfgMENI6+?HLK8!mH> zjj%w>Rm|iUkFuK$r1RjUDwK^p8%k~W1q~7SAJkg15pg;BoCyt+HuKz;?pPO;ibK-5 z%99g(L#~a^g50_H|0y)h?iUs_4itRh&0107H!5hOm=PrIT?IY+CCxcnhlk1``8@{M zzNxALi;DMSwE^nal%QSNRvu@rWmg%ruoOwayBZ7Sa(0Dz*^b~+K;E( zCf$nD&m|DrQV`XB9TU*f*X_YqkzScL@ z=O|j{Gyr2QS_vCA>xL6eTkpZ%H!Ng6&o~VwEq(~?Yek<5-En9(TlSIW2-={OO8%g{ ziek^`Yn6!3@x-%Ne7rc<4nO<-vz<&_Sr6a=s&+$CPM;Oag=}r^qmDX?P-nkXxHG%a&F5R3<>Sr2N+NQCJH8(hNIY@J zWBH+l@2~5^!llOL9_($AtbKDKDM_6j_L#jcwhqac^-sPAny5*YxkM_#9#?w^fL5#e zNq1qJ#;XCfD8CtU3a9MNXhk)n^@C`-NgdC?vSDX_i{jW*3!!&eXv(yl6i37adWUMW zQDKetszYgOY(U?qghV0#mAAMBh~1%yiz# z8x1|5hm%X6oR=H7DATG5S*SZujju|oajkjJk<omY-+m$FZ1QpN+H{Bv1c+$D8 zv|m*6lWX!w9^Uf)#iJndm%8SWOON&mgWB>;H8|qcF2x9|A<)wJ$i##tEiLWmiVx`g z>vcqmx+XO)ojTi_5$aTIkgVCF%t4c(kvQa=pbi=|(lCxyOWo2SFBcj9Xmr`q(((+7 zcxHY5`6F0kTQv7wKi@kWQ&ICHNYBGrrmP+fltb@#%zEDvacr;#f?|C2&p9JRhGdoV z&$47UZmpJvXWDL8NxxKTyLnCN=3Sjj$BRVB>71TOyXly?6`?-P zu`U_wNWEU%$JQ;?JVzfi;XbRAR6@mleD*DBCOj%H6+lOUOk+txE+>Wp10)ddaX3rytB-B^E@3*+Wi;u^5hLZJ^K`%EJHKh zS!h&J5$W8&IyU`u_Ev(BF8$GRPdaP#-Zic0_l+UXf3njKxs1%lo=5ua3yQnp6`j>N zgV5*z(!hmT{>SiD1OhY-jE(F|Z86;z;_MI}uCf1+T@vHspl;t5hYnC_!Okk zz*D4Smv$Cwcz`Ba3Jgo}k@l&B!-Fs4p4a%WuDTo$_=MdG=guGoPG&SeMOF`W?z;A0VC1(@@qKo#Sm#qxyL?w#gYn|# zpoG)v172P}6$jY6wuaYzQ)t`$BGlp$gOm83_0T+E#g`eFyMg!FUCoJS>yq5uqqDc$ zT>P3go!p-D)Qtb@9mi#C!T1E#PmmcTD`i|Se#$28vyzotnR(<2@_|C##Pr)#AUb5L z<%qI0*PKZecOI@szYcvD{{EIYFAVsF&4I0|7x}@Krs8Ry`=U~iXRi?mI>!8%h?`<_ zucbcB%|74IKQTd7TPL!t*WPIdY;0<3r73%*W~{sA2d3T%DZJO=7QeZ4`N8Yg=jdpj zVyZO)M4>VaF$Rw=i>f%kvgI%JA#oSbNE3y3W+15RB?BbwFo-sWwNV7c{l z`WC@#vaX#V_n~|CDDnHGyF2I7?JQe6@6nfA|A(%(fQm9~yGBu31Oy2I0Tl$KyF*kE zq>*mv?v4SZOB#eB6qF9>X6TTX&Y>HIX6SSCzTbD&fBv=3TDX>L7@lXId+ylRzV@}R z_98u43Yinh^3KkC13xi&&GoA{TmrfpA4XScy?q)l*1NZM^XlY1ygZh6R^$x)sC5Oa zfBU2s(tZKJ?qhj$zEAD8B@V(@I4Mfo^$7)K7_5}-vuXcI?v_)G$>gq!lLxvN{;%W1 z?_uBjn9PZ&Wo-3C1A@Q3f-TDWe&UDeuir`TkPJwDl5Lso>nj#}5aU+hN7-hJ< zkkSY8Xzv~Z_HNjmyV7<#k~RGw7Pf=QPqXK}S(QbPC1MXx59w%Y0oL*dzcP06ya306Wa>xM%ria`s+JA3gNVLud}CAgpngZHjMQ|!?T_|CHAM4 z=C(_c1w#lB`UY53s2KR!zkWq_NFKU-q)t_xFG`pk;CwxRIqjd6F)12r%+j6ZZnNUFK@)$1mb~Re!hUqahmC_<0>iN% zmrNJ-!E?LG5h#&j9{SdU_-RO`u?bqztDHT?5RHi}E;+6R_ zm8&1;^eQ>9_E|IX^5e2$)+YS?4XyM$C8Fj_NVsSJ<*T-L*m#yL1uoFqE8a=17ZRPn z?-%u{Nd1`A-oN6{LiMiJg?eHXUEK#;wRUf~poix|Zj>hg{d7UDGqm3Q9N-zaFh6kz zK{`v5)#g|UZnNmZb~8AbHbyY_e;LhANX31~ zr0_a=ch|Zr5+e^)8_=wRJY^F;Wv86gL#^eUWLsS$&G_)oJjNdVz5H6H>CO6HrESV5 ziEDf3CA?UWjJt(~SGp=}TKO6DLyE-{2Uyxf0Dz!cBvjlf~!WysMxK*1rb1?U z?%R%XCh{#@g<3|8?`0r$j5V8AZ~KDy)8*G$b^hkz!@DX>c_~}0*hD_=)jNbQ7tq6; z*F0w`E#l^kIMt~rt9D`wL>8|r)^8*W*X5+;EwO4ZuLO&e zKJLR-WN$7~&%VCU5xC`OO7}w41_dIYJ;%f3ZP2~JS7e((!ChHFnVaE%jt5Q)Cq#Np z-X3d`WVU$eq!BmyAv-w$o@VF^Ru)xSAa(^IXOmtuZQa9DP*Y>Orhein0{-JZrmZt* zU~f|jcVK_^*sQA5E3%$`VrFkcD0sx&*{T%ODNO26XiRQ7ySuyRrIVxJE~+;qMJyci#5%#eBUT-TDfuWL)*Tk!CyE*2Rgm;3cuPm4R=n`d@^$J@pF0~WmV9k2n`SOu^|oB63Uue8BtpL*@670ZV9wu$f;)qETqX2 z?k_O&7uY4N#Oy$HdRJu>`6uMqg!N#H>bv?qX_& z)h3pbS&IK2v*~a9`TSsS;4W z%4X1k05lc=BSlqJmWK%S{P!Qr501D;7+%WHlMs&i{rU5Rvm!d(!X2;V$_iILH@=|2 zQdmU9{_l|luGU@bZ6Bg;<4n}n-_5=gjaItNuu54|H41zT)ntueSMdFTs8JcW5fyoP z`GkbLe^3N-%myR7)yDo+3miXP-fe=JXvrGv8lA?R1f-PMZxK87@owAP(;szxVzsc# zMr`3JVug^q3HT6cNc&GZZJ_0i0YPX1#)1{Klc-!A`SRLYCqV5603T^EPso%YUtqQA zBj#eqm=yhB)NHT=m74)GkL#Ze9*y#HnoFfXzI}0fMcvy!XxJVs#}NL`+#IV|t11t! z@&s+EfRq5TM4kpf)+X*{1%{wiK>p(2xpJXhGnTh%e6!Df{K-p*S;VmH5`Js1h+2Y} z?qq4;f3@2$NAcFggeNYLNxRt;I%2-swNpGu}#pSt+{`Uf40B792@6)ea8=19CSgFN=7m^M5^y`!nJ)Y@=s!AR3wEW5jQEB_LB9l? zd>TS!{!wqk##~A^@+goPc?H!6zzNZMt{fFQ@QqelMO_=KbaL`i#MJ3Rvlkn{8vKCR za>3tr+;LqZQV~`td*>xf53T3xLcr|5wQDhOfxcpr&1~}XXA>#JX!Kz_{t9b2r!<~u zlprEWti6mrZEiPp5)e;jM`feUdqA_`6_s)fF#^B7W_KY0v=}`YfKo8!0%0R!bVyd6 z6o4FoMbawLL7ipX&kseEisL!#H~|fiwoe9!z~nC+cb&MTBTh`*9wILW3rI>y+9I7q zQE4e-jfjL?R>~fgst$oyvj^+$?#3xr>l@(H@fu|I0Vte2D)>mS6#K`olm3ClI-n|j zLQ2^S0G7p*&1euCA*VJk2T;`2=DwFg7PmekXn1~e0P-f1W;&AUT<#{vb{j@79}*9+ z{sSJqKXH-|iE5z#oaQ$}g3ykaE25Q^wYuUGtuE|WNh96wa9v_2`nFVBEgX-JE&v&n z)9*a4TGE7iWw5Fd7f*iF#l)88(E@)RWD(;*(Y!r5u!|U6{7e)S?~xlSqyR(FnM5vSLV9iZ;4Kx=@aPfq z4#Tp4h|}|XXqY`>uXK|S#xqudI z3mufEDJzwWnQH)5#gF zfrwl}3QCU!Nc9V>JFiy*Z;_t?VBkC1mdJ#99(Sxnb9}ib<+j``5TnBa03~&^2a6o- zlFJvAC6*l=9X;Z;na;1~Ab0;Jh()7HaKWpKw z;B&n29rU~%tGKZzQM6^QqiRJwnl0g3iW({adUwyxMoevDx$aLZxK!<2*zi)|B$pI< zeXjtB89-HyYD*9zQvUL&Fs^arb0JPn00oy8iy|WT9zx1QBQr4#*5S3$@t%){z&|;Ejiwc0k2AXBf2lIWe!8Y_p z-?uAzMQkaAP4~`+>x>3PltL6~hu?^bhH)A1TOV^2&h;Pyb&G7G;n^OQBH-4 zku$CKI|C%`GNS$m%Ug^5onv(Vl;mjUJ`j9?h(iXI!!^>~TDf4S@A3y>cQw}Jd%fx|bIreXX<#SSoM5obH zk?A@wv2KOhOYZQjKVl*QSwsQE|r$|m$dSGKnfMyo$mg7klQZp z8C=M{aN+L$%t6qk1~SqKSZY7X?0do=V4K4u?lLd9cn$B~Or?Q^+<>or)51~sBO-~` zcJmLh;QiJTCW)z1069n>C(r=~((E-A*4Kk`!W2YXCg8L@j(WRy>`1`Ydy7)6*1m$j zFwiqZUk)w_xETI8pGe8W5<<#FMu(%#8@Ge5nCPwZ881NZz24~Ptso(`n=dD0QU3f) z@CXO^M6jm__XwpZXzh>)pLYb<+Uz{SwtRcntZ;m|@l>PUkdk2OB@uD5Vb%1rqxHT( zu&Ey5C~$(f5Sg24Y$?m{Z{vTV?bohJW_avE7ASdBli}`}z!UK=6XP33*0qYI zfW!0SwNp2-SL`kKuZM@r2*g6Wj}=6nC(LYycPtW~bk9U-9~_>&6aR9Pvu7KD@bvOJ z1fy^?vUzwPXa9*Y;EZ06N&Pp)!r;D9+%(;E{-U(;RJ4pkX*Hd(#j=XSe9?D^aRV%k z53hflF5E6Y1t99SSyZEl7i@f3SO>XgeCj?{(s5E2bD>Mw-SJ}#_bD}J#9RhQX&r#u zaLb083^h9gLSpV4B>~A-Fh9@5sAQat`D@_br~u+yq^5O@r5y8Tco7CHv{dVQVdZnJ znB1Qi$S;g#BT8TrJs<3E8y$@w+|!;EsJG_{jgDF#ygOO%v-33sDVNO?L0}9L_bAcofC&xgOqw5+U>Ssm>*;&zUWnHoX zB#dPvZRED*>4yHo-*%E zoso-Dp0fmmK*BSl`AT8e-sv>8m9la_B`hBWh+YTQPMI?n7W52>4ZJ^J*jK|)sC5Q> z%dU`nDCT~B)h+8o)SIoDd=?qCl5DG7*HgE`WuxrFv$NIsGW}6@)}%8V?U9vNe;a@C z+I-b3H98np0*vI~PnzjXT+bSpdvu(53avhzX=o3_!u_395V!aPqw(S|4jS@mg!wlI zVCTXTt@sFt$t1n4x#9Au@;b7#bn#&z{s798ED1};bTbmPB?R4@(+x~Lj5h(%j+F=f zZNd)Xo_LSLghqczI^oC%qP(x2Hq( z!~p$PfYn>?YPmx)Hvh*%=*!Pmvw7}fz<@4d`2XUTM$;i<6`+@oOGyu476RM#n)#r^ zJwq+#Euie9;~@R!3hy}xZ3svRBipx(0rV!jXob2@j@=}gqyVG@wz(C1!GrVD*ZE3~ zp1+L`azd@@@MR8cVxXq?G_5O4q2da>ba!`dWN!O4Ph9Ju`P8pwB=)M?Uwg z_^?QQmeK&^e*hWp_5wM^HCmzY6ly?H7K!d#2EsV7lgRV}l@1G8a~SWZ{Zqm3z70Fo2@Ri&IeoEgE~ z$E?>Jyss;0Q2*8=e#R9@BlxWzoN8%TBf9$f;&XW56fLJ78q9#GDzNPnaEJp()YiXN z;^8T`gD1aD)|_qO7!B>Msi#mdz7EjTG^b@+0q_=`<7f7AiK5Q@I1!zn0$NZ2wNd8M zO{JAX_f+MxSW~~wAV}l=(X!!|mwi!fN>IV+Bmk7h+g{`ZB%hSC-2oX7zBtE|DTe|U zHIM;aUNH>)_E=2&+L8?@yMo>%s6W`(1a|lxYEma9I$o zpHU0<2eZsx*bf(Omldf|0NVPqj&g8syVOcYa3ES{1NXNV*P}hit3VI?@g#fXZ95X|R1}HCz#L7k%d#RiBUbbCr}u3jQ=cP8 zIHXmijC6a$%xJnZ*yM~D+b=qmD37M3znXGLE0;Ca$g^74P2X_=>1n`le^%0z&@g8Q znZTc5;1)o_uRt@86Ho+a`wD<5;H1N+$;FA7t~y6)@^mgamfinve!vXg`uJ}j)4}oa zOM!d>pxU74c$u`xpkCg-yk;fUkR#y#;C6cjgeY4f6+J?U(URFqI{eH~L`oCHL zvXA9k!)N4Gx}K7B0`!hn7(Zq}?AddB@)-D*7T!h)rgMhinZL%d?7!^^Hm2*}Sv$r>^j#DzS0LbxpJm@=?>%-5?zz;+j|-UJpSBF z`~T#0>O{}g#s*sxOd)rCdBe+fsa zAv60+xGh-AfgxxS5|cp{kyoCC>*0^|e7AOY-vQG8KR1}lyu!^_5L&ahymVz-I;s3W zp8##C^gJ02?m`~+OA$3qBw{|Q^+)cEA@Ogsd%y%B?T3RKeV}h;1sgnex>|&MZo6g0 zNWBSTQ@xwgY(i2Z*V0u!2-h$IGQjo(wnO(5{{~i#vky;h_Z;O{IZe8BoCPTb(@6@) zB>`%(9lZhSnEyWft@>?TIahLp4lla|BjM#|5etw$6^y z{*CybxBll3bXrS77lr)P3OgrfaWs__jnUBw{7BKn^JLz=`zK{iE1jVDzvF*D8ntb@ z9IbA7y_*TNPbz}`-vRocIpWJsuzn9;|IeSmJ|H;zzut(p#QF4ozWkr>1J~~VaG?8t zz4nBai@+Ovod3_u|38-;9f#i!fsSB9yZ9Gr0pf9zB3{gL=1IGwTnldUNDRsaI{dE> zy@z)?-rS4Q{`Y6;)9Y7!U@Ux(DoywXS^{v2i$mj_TcpN#Nzmg4bWK5vQ?o zJf$Z48l9XE;aYk`)5i%iZVaCWNU)7hg8~NoFjgsxRUkbLe;+U{QiGEFVaCv^F9LZP2qc0sGfT1BaK74)q&*_iXkB(j zU%J~PYGDi*$9U~}Fd2~93}O18C#~fSTWkO`j2ehA1(Mvzso9?5Ui<7IZu`u+$;pvd zulgQ!AIZlPQTXfS7Q?#z!?3+lM*m3XlTgK z8X8jKty_Y>Ex=F?szDDSRZL}J=Szlrvu=JHS7+Hi8~c^EvteG;?t#?w3P7SaZpVn_ zn<5>b8}qM`=gojNm+PGRsoUL9v1Y?JH4929i-pt?qvkxAcI{uF!O3>2*|~p7e!isB znza=E0Z_9F1SyF7*`a9RLF^9^HRtwK=zS6;`D%FRqYq^pyblbAqM~1JE7k-6Z4W~z?Yd6s@ zGZ;!#FA7}Kp#!EX=`X3-eY%*_2D$XpvRFE;7s?X}sG|)pD|>&@^5q{hh}Sj(m7({^ zA$|XM9*Tx}yjnuyTh?;s<3sxF3(I9bOM$ly&qC`hfsD~EBKc_PfB--M^cE0-)-i_H zV}rCZ?brW4P-3U#B0S+#uWz=mBkXhHDId1rT|1wpJe(D&d&=)DxvSmLh6=sw0G<5LbB9#! zbeWi$6XbT(^6#3bTo*m}_k>)JZhmD>Rl5lN{{1^JF!+yQ@4HCJZ0%VXa1|r4nQ>bW zIA2%-O4dTyRk@7KcoOD5EQAlES<5&1fR97SKC!f3wp?M>9U1YoahNFvQ}ALEe$!A; z#2G)C%;{r9rWW!}t1;}B50ik*-Qv`s$Tg^LcHsI?PT;>!DG5?Er3-`~Rt|9PaA!>Z z^cWDTP7YcCn@8Cz54!NIACp^H*x2IPh~sY`NdOX^hf=8>()HS$6cHSw+4(&pVgin$vnW6*SOg9XP5O1BZCeI zi@Z$MEbTDhOuM^Qh4U4Lr&Lx)E}e%EE*BbYEj-G&yQDqF=vdx!SX!9^2YDlKuqnZN zh!45KwT11eIeUt%b8>Y%Iu380Y@=)dubFY>7dE3a!*^?><11-`i3%`v43yzKrT3!G zkG|F8>-hW}x0)z3o^}MqH(@|hCvmJ|yXEw>tc=6f2A{guxT|Q|*v!PJVpb|NdZUZN zbA-1zYPM~KUSXYMZDZ>>f6TWm23kJpb9T^++s z+UoVr`=NTirY}H+g%MbcP*hC(WqbZmEd1Qh-FP~)6+&RwGQ(rgA!%?$EWvIrovu5u zQ4F)Pdj%kkdWBpW?w10LOoi@?&0e*23U(0PKcSs6$x5oKa-STZX1HGyd?n}pQPkhR z`et;h*@&Jz>O(i)p2xwhm#r$ro z8tJ?qta{h2{?n!s7a6=Kw;sltrY$>m9CwpJAp0aG#s2#BZ{MAw#{fLd|IfjDi`FnN zuc}H6fi#=vOZ0BZ|7w3JHiR0@ z02HsOsH!(q0jbJwpkS%7sd^5JKfOIH4Jw*aZ!JY#8J-B!RG3!$Ylai?{Z{$$+PM6} z_ap^bRFMD#)|b`N+#&8pv^A2H(~tu9yM0BiZYatowee!fh(Q0e<@&8m&#%my;Mq2YhIDwaW2*1?%8%k~}tp{$hDA27R7 zd!RMe==@gei9i~2uDO%A(Ie^^seXxXys(bCM zm=WdWgucFF7$?4Az#aIoGkK%*wAtng51bsbbWbBl*uDVk+HE%zVEQGS&YS)cfxA39 z1oAnF#iF*;M~TFXEp7O+g}Y;`#h|OIaD5c{zr<*8-gpX;X#V&R=H?ROY>yyyoxJO}2 z3II+4*h4GrIM2Ws&J?Tb`lH8{wwDHoZa4ac;~+J;f8*VaJwD9jb5$KA}!}Obe!a5g1y-je#@xa zui!R4yKMDBS=}IIUv2+lJ==^brmw$Wcg33FxvW&P@tyrpyZLtC%k)MV9SAb5?C_Qq zyS_lQ*+cSrq`;;FOnQhu)A@8iRS?-Yo6@4-wau#i75I@F60=Gd^#JSf<3(Wo@e|He zTJAZZ#e>w-QHdNeZ!~yI$y$=0#SnSv{20sug7yXV0OdBZ7PW zQXKca)0(hQESeTEzZ*=vxVX8%H}No-!9gx-NPDYxz(RI;0b#UY^wvaGA4qt?auKJv z->aJwszMmI^q%%$Xw<>tRvBnG#65{5hKiDnhAmzf*!VK5MZXw zb>V;zaeLXv$)sMq1gd1_>zy%l0-hko&=#U3QO_5ANJT|Oi?m@GB3|c(dx3q0(krwJ zWG8ge(qXiG7X8CZ)RT6O^1$a-LWv0Q#ux$Ol!0&Fu>6Mip~jey0sV`7ZV|>OPzpU* z??SQZqB~R{;uxQh&=YuQ#6cbjWX(MZ7Na|SN+u@MCjCic}hWPaM_d8NN1EEOmT!-rW`xxjp5agDxuf1c5(WQ5^%t1xh zbl9@<+w^}Qs%|`M?qpI^|8YHH;1ra87e`y9#zYs-lzpN+U8Dw3s4VhQs5uph3sSw` zHyKcfBytK0!qXdEIb7%5tF7mQ0V;mkS|Zy+R$+QP@xyIo%NabmtceLRHQrUI!0|e; zD>WKR-2;oYV!FQ+hxBl~!!EBVucO`gl`!*TKR!J#;&eTbEM93$`QUZ7i~7Th@7zyO zR+b1Oz`s2tI&bz-M0gmM8|BqI)|`281Ogdp&+(9G5V&uO=Cq2c8sXEYQJL_%oxREN zdR_X3XGq2nPCPER+fpLZiUAVbj8dHrbf0U1PK1A3|-m`tkk6P%&Qv<;u4P zL~d5r*Vhs2sP^nPPqIZR+rOnZutNu)MPd*xuXvm$LY#MIBz)4;a@S7zFe|J(AG!GW z$x{llZx&BtJraz6t)r~`_YVPeh2t7IklH?cc)j&6p9b|3CJQWnW^6%4v-fSMJE+*f zujOpf-@R&+z>H;6Q#(`2xfKr3ZE!^$E;qrUYP_RbHZiHTy0iUTOK3XiCR@!=|F(`z}Cr-rcOwW0-vA&)>WVBZ( zU|}_*VZR7=h0j4oTTknCI9_fj$anT3H@1h#<+8lc8({@mnG{ zvDRpe<8Pr!QZsRM?+Yb8mX!pDzGkt^r>|WbqsUJL!zObx3~zoiuH%MwPJVu$sM=+z zelUD@G3muqk636(;c^qj#LM|?Q+6;`!8QyurgLsXx^s@la+|lt2lj)F7nX}6f{fv8 zqIU^nrgCM|*1OXU(a2hU6iz(q_1t_hpqHeJ$3(!+@oG-Cq81EZFmXi`Y+Hgw0)nL( ziU6R}0*4A6W&Mk=9Kwjz3y^Xcs+SWT~t^Sae#o)X>~MG`qX4_Vqb)-GK9Bu8D7TN_Two zepNn>=nU5@1(iuCcp>p^S%yRsFKPL)_5?hUs;cAPnHUd_4_lqFtL%^EiBT4JcA_TH zIXCX3X|wa@fXIs@=q2>-PqLnS_*l+959mJ{Fksr=ZvM79l>?Cy`HSZV!=sEc-Qj0! zihn;itTm~dvc7lF0;Hu+0Bz$_9r3pf^Q{+#2(^fDn;9Oz(o!~Ym+e$_6_o?9u-%vH z%r?QvVx~(kMsbWT7YF@gIc?X`)djApR+#vO+9$Hrz@V#A+LG?zdzn6`<;k-y$OUn` zW%Gj74R&y?T}Xs%`^Rd2F^`9TxVcHcq)VoY#N7%^yfT?BE)zupB3EQI)w1 zILC0>Vex^~Wb6pN7ySVsylf^XwwSLNsFQEa8xsAfMkMJY+z2_wDc2|xJ{)sGUR)d< zCs0dEg>HP>IGiTfnA7;62XHdx{65o)L*Rnw&2vam9!*8_ zN;tCl?p(NL-t$;9fFIPgpkbgHR5T>x=2;yjSUB$vXMm*x?#!&){FQf7CmTZ@WRB}@ z>#Z~^Tq)Vke5i6q!DWyl`jF?{&UM&&nGtZrA)RXV9&n ze&*}w7VRP@=B+31>3YC4`g69*r__dvg(jV}!DQy-E=!(0$$z(mxk{cb7q<6pUec7N z&pDN)$#?S5fK=%}LaHC{X~z2r-vz$AeXLJSopW=7dZS0y5*!6B(<;8FK?by|IRP`$ z^^Hs-0At_ki%vMDkZXb1dEJ&|YA!Eenh_Q@T7_4xyK}`Dy-;q8{$f6OV5n3$lm`}N7UY)znCi2{_) zcDSv>H{a?12cs^AV>eR|4Xl8=hzFt3Ve3D=?3`xr+Q&3Og%uQ}2}FUgFE=9Gedi`t zgIP_K`j86u;k=z5k;GEN8?Na}kg2FN@9JX{-m1QPcL}?BiGmOJ5^C~t0Udk+aZO;E zE340Xx|8xq9WSKae{}1E!%SI*Xy~tF6r#qbUfIVHb#H0^Ry7^<7^Wp&lstCF7b8+f zKGGDuGlQ^;q-RXRSF87yFcBL!=NJt(Uc0d&o9A%SL67Xs1QSs*4q4qN3URdS{VpaB za5uy}w}m&I`(cL>{&8pRVSff!G$3ZeOA#q8o;9|*&o2F$KHn;yS_%Xf} zLyH|TUSMklFJXE8`}c>ykS{etQ)N!1G-5ZA0>==O83nQ7AO1{vUL1Rtq$W28Qy&2< zwzPx2!obSj5Nid8w??fw2LdLv8AozZ zSW?nuST&rliOKVf7%Vm>7ZQ;o(E6w&#tp94Cvf7kqzTCojrZ}=P1!*aa@&8!#RMJt z==%;jQH-)V(nO&ke1@ejcOC53_xIrZ*a*ZkfZsb>Sgf&7ep-N1ofGuj+Z4pa2I=?g}&chRt)U{q_D% z%ZeogVu(vYr1$E*SljBB^k{;y=yTDpId6J@@mf84tC^D0o#CA{F2 z{4NJ>D??EzO;kDMHNRYcE_v`O_pvH3x*dL4MDcfGg1kH5vwfk){O#x!FQsmV5RbJ zf1Oq`mIoX5vxk=q5DP@MO)IR+R^!W!P9gRido?PanX3phUZ}Si}ZI{4A7Us%>GVK1xMpx!~9vWI56Rzu0f!L$wARvBSO;@DQBzJ z(wS(?Fyfh`$`;!xmnxA1irWGj_o*7CO zG3r91&2zj=>RzPOLOZf|d%zdgd^!u=3UZUE>wCQfUBY7jb2r^h)QH;LLUUk{IJ<`t zjoC0iYgaRSu^DiF-SzADZ>QOGx8uHlCf=v_LePQnkHV}>OgMg~a!Dt~5sQEj)ZR?kDNd?FkvtDyjWQ z(8g$qF7%O^1Zb!=L<&@Kn3$hM>ILgOJesRj3n!Ny>!hUR*7{0ehgA(ate}zMbgcsy zn8T*0+f`G0yudnYg94S^_~7ln*AI84#q5N%wEhyYPoz9@pJv1z9XTg;TweQJB_yG3 z!b|Z<^_?G3`&_@t^gSfTrQkg{<;l~Bt1sjgrKLUB^WCxO5<8~d$l!YBceXcs8RfB^ za_D_DEqioyWRW@?c!g+y4i6uhan#S-F1YVdYSHqZCmK68%n^}zqMnt5Mp}~M;ty<- zaoX8yZziDA%|@8&IxZ|E6)DwwGY5x}7R|~cc1_2ubn&fBY_LV`nx#{9dV9&zfAD*Fh!tS6k{wO_yTC!$7;j8X(oMBKgU8I!nLK$Q?scTIVP%lnVYeF~0`5d27pEQpU&`XHGRA?d&i zE9W~@A}I*b)Trc07A=-}Up3Gh+YN#^sKR- zu8;cNr#4)pP}(AQ{ao0c{SWp*Gn_JohC;oXSsEzj%rZt$BkHcbWO}UvzC4R;wB_HM zt^V@YYgD7z@HHmhuQH=?52zX{rao*fQoihw9R(@%cyRCEur>1?&5m7*tTl_d54XdyklW8cSfvAD|-C zYF>~t|IXLKoKmd!>WCjNp}Wh|Dk1k*&Sg+BNF&tF*|xo7(#PTvtQX{i^T(|*sg<+z zY8U)?MI6QCp=bMCpp9+SdhE{w&?}G@F~4I~D64bm!&V46e7x(^x#svS;mfmYM6(xv zgT5G*J5ot9vOcUQRB9h~&dSta_qIMUJVWqN1Rf(bDk+iUu z20z`))&RhGCkVM4R%zi2QB-qIeyfcId6~-+FJY=V+Zz4ic|x#~7jL$xk2a_1ZyqKE z(nVb?&9e1Ho`BY>Os`M}cU@u{+q)Z122H2QPLqIy-vy)0-`3y=$D643CG&eFMl1{pG)fr7JgY>qzRo1gidVF>fw`H_c9@7=8Nd+#cz@-(y0&&WRx!kp?f!DWuK8wxv>BD# zaw^6w(=+Ys*M~XsSAGsF`Ul^x_Jx8F%0H7>2tgIzA;=;fT|yBDf34yj>U03@pgzZK z`3rve=Kh2^D#e2P>chyQyWhu4o&xEe2<)~wR=@Ctx9`$;jpp&JXT7uK&>kNirol=Q zZS%D&-mKd#Fkt{C)oH-XkL#pSJP^G<@{-Ae4PW&3dBgdyC**{(nHlr7n{)opf?M@_ zy^!t`e6)MWfVoCtVAOEB-QjeVxAcLs6;pzMK!68in%N)AipQ!Tc**e%77qu%p1YT- zc2Mw=f2eGJ-p<}Q>mlquw}5i3Vb)BQAHJ{p&d9DeUJhDqZyNnCW!AQ4wgzdjhtz65 zTN$r6!9htX)sXJSTR37s0lsqWOZEUV*3inEe6lpx#&e1hvDX;X{X%Zqkz>odm{T*iwm9?FHbLuChnD;UI&V=1!yn@-$B29E`V)_6m zE@cra?_Ud-Ae~gbyM?mhX)1_ta(*qIjk9lp8U5I`o&a+L|JjzRqGD*Tamk4_-ofoW=z$A*O4nJ8NmakL*+_91 z8mT$ggv4_!K-?HPI7S{*@wZF@J1lH$yu)H1MZ>$>8*mgFRe#qkb0lVK7LI*`Xq2BE zOn+dPpDh!j+Zh=xYSMAq4njOM%tSFiVx*Vq*)7l!XjMwlf~h5TcU{<@mrY7$n4{U4 zE&+ACIGCu1_(;FO+fQvK4H*rXMZGEy|IW>qe(wAChvcuIbKA2Fbj7x{vqk4bu{Yg@ zobK1lBsaSN8x?A^2xb#5ERMNV)@v<_QcY?uDwG=ma+cY zJ}W{39f+8tu?{OKYDn4;nMnQUaX%F;ubsTPIRnVn7_M~5H9NezJZx_24S$JP+YYl7Ek zGgp~HM(z9e^?Noz0LNDPV1lK$2!MrhjV&c;xzHMnOEFzzC&ni49(1)&wx{je2T<_Y zBpkrC-{Loy)(ee6fWG}#Y^DD7>uz9B&>_qVVYps2tDm%DukBxLZqW&IN_*>Ez>;2YeaRXFHn_8nLq0%Pz) zqDc$3-eh4#(JIDV?wF%RTsh&4e{oE{xe=^_nb@U`U0{YS6)*)8C_ncs(yK^H81vz_ zo@!C2X=XeT+>!md>$;G6`?9^XIS!x~kSPIQ8UielX7ZW3I*(_;ZoI}}VAq0NJBWh) zI!Es5H%lGFLernwOw;AUcz#6V%MZkCyVV|jBu7Wb7IS&Ac2|D^xg88zdBNMtZEK*> zVmFTgAOS76Q0%5GImsYZv8_T^P8%h2r?X-*-E-H4=&Jhqq|_-3bpOLeP_5C z*aC)`^r_poUTk2vURBzRrh=ow^f-y7Qi{2Fx)HP-(AQnd9?x-Mf|Y*&mW$pud*`w# zf>8@*=@J#D*zUqq6LwP_3FkRVO<8|`MOqa}Q?<`_d4*=(c4>QT zbEOac8T~F#w;eAnD5w88&@86c!RQxvv6K5GwCdf8{r?h?5G}hlV6%N*L276WU?4C9 zH(#fYRUVFutob4sk2fV8gguoy#h^$_k}h4ni`Mk=F1#qC-Qn=_r)Oe zthFWt0x%D^txAC~xEJ_p))`N!E>yIHPv(Ji4^BI4(|0u%ZFc*&Vvz4QGyuLtl3mdn zWxA6`cYDRun+}kt`7Q{6Jqy$utkfMWe=#;Q12TwF0L~B=qxHld9v6UuPU-Jw*7LP_ zg}Xgzwo`30CwjTCOuobt`mJQp4p!X0bU@W2FMGoJECa%xKKl_4@Fch0L;_GFRa-B# zflgT{=1RiyzdAtbrEaZS=+Ir5+ioEe^k#{xwxb8j&JXm5f}!t&m=P~`J8sWNMP=1+ zzH2~(g+z;v_qXW)e_Pu-DVZUIg*N?X!;`)vg)3!_dxHP|;VXk$1fzXez@OnKt~Yhi zkC~7#TxfM1G+Du2W6NS9*TuY@g{CAcucvd$;px;xxBhjxA+D~xRdfUY8}KQB-&9M? zZIgqb3!2UcMm6^YuEOV?YhtT#Hin*WvtWaC^zZIH{3RaTE2|V6(bE(9K1p=8!HjJs z!*`@~z_!L|!=?sVMF|WstsIxoHx9S@hsZouiXU&nqd~_>(OY9Wl8F0#jIy@ZAuKY| zcnp{3J93*gSYIqW!|cr9G*w^oWON8@wCjb?+fzO`$J&iWrL62PrECmi6O%H>adL=$ zO$Ns44u|n@OE$SW4Qo=veq)qbH>`zNUBA2K7F1MAuQeddR$LqE4!$0HpC2lM@D=TR z&WE00>5Dh-4i4nINU}KU)sReSLG5<$)~w8)!QP*(9M5+*$I4K#<;aiwYc~K`{Gou*1LqZBCAt7dUbj*W zeX!~4Dz@P5^$1L=)Z7gB$eF{#BAupSaOKY>L<41@2>`}QrcWHyt||U!vaa~McTa_> z@TH}tzYmb;r6G3-&=DwLUS)qgFPU@g7HPaXGq&vRj*pL*`DDpRu(WhtZY{9!m@0JI zx@+a|&*ny_x0n}e4csvs4j=6wg1um7uGG082YmcmJL^)$71iP-9Fhx~X6??LVpeQi z_wcCeeVez%Ge&xi>4^sQSt`K8MCwD0O_1lcy zYvKPP@2#V%TEB2%LP4bjqy#}gKMn<2{6X7v2GKRf=EnT%<;XXF(WHuM`4C-bd2DP=Av6nK5`6kZ56Qu|^G%XU_cyR2?U(u+pBM02o?un(v*P9t zDcafD;}8nP@&t>?sacO5FkZp6>UgAKqkoDCY51l$8q5Yfv8KIg^l)axIJ_9yZ+tYj z*~UpP%Hm_&S>~HLMYRs`bUf}V8-WdE2c3Uy@F+UjlhkF?1U0Rs$fB+6>ctoVC4F1# zb5AI7>H>>Gqa)t7Jo&6uaQ$V%kk?X9Sz}QZBN;7ix!A@{bO>Ip zZJc60G0Ko9+$FIi6gKV@AT_UZ?$+_k9jARyRP>Se>Ds`?LeCQWxcl_Yan~i?UAlFg zAG)HBb91p4AGa32JoO-K;>M@-SSF@*b;6%VINg8@kF<}Mw&mr9YEKis#T`NP{nRqZ z-}WrlKlwoEu-KsEF=mC7K)VP>0XfC{pYhTkNG%|X9JwHBCKDXBV^a@^C_i#N+*#=$ zV5}%e6188hu5d)Q%m|K81r{M2jPpa|;}uTxQM}2;bM|eK9K|b<)KsUnZHlh;Bn~bY zp*iapZ3@fi%dfz-S*=`?+Qi$;d;9{zsqXKlSc&cH2?X~;tne<0U}>L@u%=ltI@RqZ zQk*o0A|lb$3aA+m7@4Mr7(CVSmrPfJNw{d4Q}cu;zs0C8gkk6`KM4gz+mIXT2c!q2 zZ%h071#vpgsrI~Kc17*Xvuo~?n)PSWi;H{Z=5m)hE=ebjn;a0ngf2H5uyrY&#|qlD zbKiriHtcK;l33eSVXyOeTiI&{lsG_X=p3c1H0~UA&O{dbdEpX~TqcpO^Cnp6+rqz0 zk!a8B^aJB_Qbs;>cH2!!p1N*#k%~$RFd8bcXRo+uUi9;Oav8g~PcbRTD=RZgN+v>M zRFYW1`8ay7ptS6Anksb;EvwawYtlm<{$0{+W)rXSTe{e)pF?kB=#u0*(olccC6J@e z(K;~jZMNGD*RuDcr{zff+=+?gce4@i#Wf{^1OJF+<#8p0PhRV}+%bZdjUO?O)77(% z3>R!{0({@;uUBIV(I`vTNvk+5-UXqpIQDwToI#K)*oDqH29#o$gQ#yS+Szl`S>s|*BntZCbuJQBe-D%z`Nvb%(v0u&$$lN}wHlZlB<`}9x6b47KYZL_r) zknt>h#Z|AIN(xCD@#_n@9@qy52gPF+($dnbnFGL?unr$hXnE7|ypCj@&sHQJfNEzG z#mhLxVUAKm)qH1y>}Z_mQtKu^rtMot_Tov#LHfg1y^GIzbtv^ZJA3`gu0Agn6eL`* zY?`#1U}wb&F3K*3WbdREc$Th`UJOxqCf3xHA39F^9`5nH<1G0qJ#rmaA&I2aHi|ff@Ujb%p{O`#M*^ zfqh#yS-rB`|Fvky{6m0b6j_Om)2Ic0UA6hH#K2RJ`FjaX{wD(Wz`+I#*Scgh;zS1z z@5-eT|LW-)a{;5Gk+w1AMG3_-XNMr91^rX#D6r<3liaQ*kNVUpWaToE<7#zmlsI~- zE8Tv7tGT~`oEWZyCbg6Er*rz46AbB>+t zo{jhmZ+S4=BQZgr(Knm6!CPshxwVstmG||;6cxC^=Hsmsm=!H;Z6*g_5tzQ&dIb3` z^$Fo_AeYyZYT_v3_`J(4SmL&gUgpx8M+n;{JN`Yp(_eBruPZPOZR=I2v~^X zKVMl~xw0sjD*7=FfwBg=sWSzLcdgP;X_<7i7huZDN>@{RQH4_y%5yzvfWkh#3 z%U?TwyFF18!8o+~EV_faea;APw2e2mgG|CWwxe;9kc{S+GrIw0qXAvjm_?ntuXe^W zx~Hei3hsMB-Yu`>*pkh5MUAlySv?NHRhE%Cxp~sP?zUC9a!G`yzM;`-<6vCXUIC8m z^}6yq>{{RAJdZm!mqgV&V)z+8Sz{M6ugt9aBqqz6<9jfzfzXOj#cgeA>7%OV7svw^ zMvDs2xh@Z=(#qOi9J*4+y}yv3qX{9e(&fIU$7(X_4g%@{Z|jYfj&|u89)?7*RMeFc zj5nlU4i`SJSrK$@yWHH;Vw_J*N2lW7@-9n@FY{~*W#tzQw&@xglG{OSaqpqJtCgL> z=hD-iPS>s@A}%~b-mCqDk<*evjNpVY*wh{;O`={WMq>S7%`?44^!<5vINcnFq2s1r z;kA`>%M#22u@Rz{r9nem9)=q~Ba)X#RK|uk@I_GUr3w8tYjy@e*E@C$GVC9)9V~Uj z-MBeT>9FCU*4gHdf^< zcyPij=duj)a>RsPBVBd^;|%MqM{=I+qZ9@n9RSAk9Z4) zYj(50lr#O#ivlg+2eOEXwXaR&9HDk3%jo<%V$TXFkd+;G{%kNiHDj(ka@7wD#(bl7 zbrAo+;<{D*q5VV_v*mjBS@k<7$LIqzPd2Y)1-Gh4^6PI0-L1L5?srtf@)q zNmI7u;y?!OfS$GW#6{we>Cb01PUBC~&uXx#ZVG5`ddUCCuGU4bS{a#{-re9%SIGy) zZsM_)^X)8>RTyPsvR$k3*ggQs9C2JK41k~L{}hZ5opcF=N<8p1&l4KzBNO;D5nNV( z|LtG@Za!~&&wFi5)G^s*KFG5Jy^wxi9(Wwu*BETxv6J%=raBULc=*>X)@~B@^HHEp z5L_YtH(V)*g=IfUIehzOiyeEa{&=Y54bBjHO#i-S=u*%ogYwRsvteO~Tc7Hv26u|C z+X=O_a9w3!7s^%m{d+Pe1{aVp5f7Z?E(!!hALH^_mx+6hv4oGT7@XE9nv?TQ(o1=c z{duxYBGr9Pc(Qh5KKtitO%Th#33Hk3i@8K z+^Fif&k=qjr6av_Pm8=vmGC0X6P9a(K|^XgO#-?Wf`BZ~P+TH;QuKgNpMAL|GfKaa-Ba<1P_*OgC4hkuCM4v{O1Z`MUVbJSMp!e_0QizTc-b&A61t3 zHqg)eaKlaryX?;+C=0z^13PtZ6NBD?Z82KdQ}@qXvBaStT=)y6x2FN+2Yk{`QUbiT zHZ5FsX9!7uKe6y9c29yw1{#}{)y!}LQarma%9*%o@PyVI7RMO@+8nG7?n}f68W+BeV8tp6Gg+De()Rf?gU!~3!Nh2<7VZbB#{4y> zp7Xcvj0%5Y>k*Bib$aP8tu0Il(h| zKx`2us{j4>#+2)O2n(DcHS-&0Ii$RG#Yo4eH*Q52Nmh{g|NSd+kI-9yA+`J)z3b2^ zHrMYB@2f_J9^%c!kAG~1%!%@U&GU_1sXxyGKZAn*k6AK*p6Y*EsFBs)VSYWcGZ{OQ z-;TNvLy2L8x6C!|MFuRpN;pvZH?^?~FaEQxiG?@tgPW$$n;#V^bSh5vAgYXhhMLZZ zY+{#To-6RNGTY0b9JaW)L3|Ud><+jy3)fuRey_2RuwHqJ%F~d9_Oq(8Au(=Ob2Fqj zLT>IK4GX4`KH@{0s}sh1s@&kh4~9w*_bn;n#H0m_Ike9GXh z%NriTn2onAk;y6E`T22AO8MSuEP9(g%rsw52-B#}7DwfM=#Y8qLjp=o4VgEaep`>3 zdf^-7I`)@@ODr1QnrOQmwn9rb zF849k`ugM7nLk{BMf}&rGA>VCnIo^)HRm>h9ZQt10Z? zsA)Vi=?1h`vF&D~@8%(JZU?8RHtlL=sux;}H7=J(+8jbw;@!KMB`yi0^%9E7-QxX| zB`z$-X;LcUny*hKjVNXHqrhpw3~us*jWx+Wl@rbnyV)M;7wu zrav^{7YX#E2&&=6Z|veikh+}|GIqCW4;+T+KM z`JaV0^Gzr0nITY1miSffmsUjVKgngF*hYaIW#fpWMSUc^xU5<|! zG2I#FeL86Sfq=BDJ+>V;qbw`o>JikR5h z-`V028U6|{+IKs~k%)bCa;tVJjQMA#DVBkOL7e02MOhueIHWtGX}n^VNFCg&sPJ}I zF!M1xe^&3QZy1AXFhKyJx#8TJXG37RKE5f{JtkLn!pPu50L(`I>AlPZ-WjTjxVf{dI3{f=YY_=nqz z5N7Jne!W@gKpb)!^K+o}=YZnxi3+J2k$>Qj^1x2l!DN3xJaN6}((6pA(VxexDfraE zLr>-=*AV)@{JV}C&pxNo<${Fjw3{XOeAGxsk1b;Q?OV%`$M5T~ zk?%}eH&u>}eQec&+ zi&gp(j7hEsaogKo81=Gr9n0=;K=ynZC;D?FD1V3XmCUlBmVQy=*@01BynaP1c&!VS zVSLshg47T%MRly-v%|-(OV`nmH@bMXup97yTnCM4fh_G1$f;C0u%HUol;odwjaS$$ z4`S9`=kUmfCi8^G;hX|^xzD=00Fzf1%?d;O*_*IMk1CY?*DK`B-8xN&1alA42wsT3 zm+js`TPM)%AGPVZUdY76v)pR-VWXP`P3VOVZ+Y-lVxlK!VEC{{7~< z;Gm~lky)3>MfROHNV2c+_`if?*z9c7VW1$smnc;A0Q)2~DzOXdbDT_CUA~)+`R{Ap zJZ}7b+QY*%BbSoX4lH;T#rXCmLJ5}*`w&Z5Wx>shup=F+pD8{y4yH@jwxqoSK&-^! zzG?#1shIGPFeNkTCwltcbk*20S){V8EVG85?G@jsSefSto{6- z&L?($Xe3n$Hd^?i0r1G(Co*R^w3&Gw+8IG+EQ;#I`o!rfy(vnW6L146s^~MgXS+-7 z*%I7s*d59$+BJVKNBD72MwJkjc71g`(+&Tntq{uQCw3WOx`i4?<>d_lYl9{Yyow)_ z)ekg%+h(!w6^%(9VhPH|AYH`F$JS=)D&tga>Dl`Yu4g@;_>yGxy0G_<(*yHXLXbV# z=E%NGL-VF#%H!QNKDGcjfglEe6y+td67FclH*d~FQL`~@A|Rau*(s1dEjQKx4a1VedoKbONb|W(!})d=6JM}d;y91`8DGQ ztC}R8?hUckgUuVe^C@9#?A5alnEC>b&*kAf5d2C$-R1VGaKjJNWq%$(F#I}wWThL1 zT827@{+r*Y1N?})pj^6MQ4e$cZM{Eue`|u4aE3NHH|^r9s{!$YxzBz*3LqMsN-Q!z zxThC;B;vA{a`Dn7nIg`=1Hs?l(|lthnE+W+cG1l1m;JN*70UVpRS$QbKj`%hNK%d$ ziQ{v+n5A8Gf#% zU-$pTx1G6U{W5CxTA}%E6k#f^L;Uu5G;c&uya?a+R9iC?_Aj3dXjZvn`*DoCAN)oz zpWs0cIHl+9zwbCBDGgy6n1-c}m;+(wg9G!y;t=4k;Q&+huj^OS7Ck4vC*2flYHg~)aGLM!7cjuF_(Z@{BQh||NfSzVY|0@o7MCErtI9)%a zw#2lWzf#oAPw%-%=h~c8b*wCB#qEVd@bT{6DiD~ss@R{lx~yUUC^ld`*{gDCTlIgG zp}y6qZHfJ(^bwmy=>|?prC?x0hC256$YtSQ%!t#KqOqwFauCay*l^M;G#5s??uk=T zQC;J=X#WzWCk-jwIGQdWbPtz zwz03N7t0@w@Ib{IpFjVO)(schXFi#mM_5hVx{N089&L3cK^wth9nQHEq2RN4&QsKzAc(!;u?V~!8z*4Wls6Mr2t)KKmv$otEinBQ#t9n#}8J~PuC z?sJ3juHIcc>sLz~PGJ7k;DfIXD7OJ);!^q04BQ&P<^3($Ivll`laAOO%Q_mvZ>Tz( z*0KRcj>+wDf|cU2PM=dD(4Awh09;%ZalW7~iP%Lm><{8DgsQ2PU8*YLQbpOit}8cO zR5i<;&O`F5(hap)jZG91xhjr9INns^v_X>KYRE1S+cBUQ{r$ULg6l6+7gr_; zlsR(%d1u`d-aLyjoJbA?;Vot5Y-I7buXpd}LnaA`!q9_fIx^Pcv%`uL;`I9>-F`yZ zUD}ryUj@brpA&FeW;C(O#wp18w@Ph!er57{=1@G#n47Oq4cOdp+f6`E!o zPdwyQie=t!{Jov3&m5&F2d82`dt)F75x=2MVm7mgq0Sp~9ZLR3V%R?#m;~hZ^;G`}7s1%0< zkZd-PUCDFPtY06d44+2m71+dsVL*XXw`vtgtx9y>c)vLuw%yuv+DtcTeFyACs;2hn zeAfY}$Wb&m$H%ylo<8c-!;y)osu@7kF520&Wfg@*CIod@)LoZ22is+TZe(r$1T}=I zt+w2fnmFmh>sbhAh~Y*jfzVbv-;r?^ou4cL^}`$s-D;Fm(c0kT5@?1z0ag|!#4=B+ zU*)^GVSsI4|CJF2{U;dM#o7l}H=HO>NAZr<>&zj)RzqJ?SqY4Z6!OG|tG}0Pf45uG zu}{a?w-4@NIfj<~mDSnzRyqe2kOMhWsVi()XjDe|96;|g19}Ft{s_&&853l?b#PPN z=R1-HP)Wi2+$S-`>8eIZ6CdJPPcc#RxOM;K8EB`6yl|4L56y+>!M+)-EL>vo|9PR<6l0&WJ5&5 zn#P!%oGd?VJ)@qZ(-_mow!a-l^{)72_!S3X*Argrfdx^FHP65j$&-a8?FwT8Xz&Mw z{aC1YUR}aoJ0>I|ns4he`DVCC!d!9apVKvK)19JZM$Qq}uvimj)+D|!3=;FG!=FFPpBlQOb{vr_%-62{0MDyho9|@U zEPFQ)QDL05X7d=>l-nykBPgM|I^hfx6$BCp^)S>xwA(jx{D!P@L+xU(PX}+g6(N^0 z6Sfz}Kq&BapW&xRZIQrm`%zStWZg(5{_H*y<>aw%5VUrn^LP&5%l-IJO*6`U;SNRU z`yXe3K-!nVlE*WikAYzUb!wk8G@1O&QMloP-9t?lIbLU`e{%~grb+3g+$f|lkPd$K~ z1FD%TmkbQP6k(3vKi=Z1oLN4>K0X<9Z+eCi8W!f3wA7a|U#3I$a&JSz5jx?r>ui%w zh&N+iq@k%TnaAG<YeOsYz_xtmqpN>P^_<-1AIE|hZ{Q8ZROk6vU99SK% zPElJ^tYPf?s?IlDFSuu>9b4`hctiVm7&g||n5LBtZL!{!UGFgroG*CEyGtV!z(g6D zo;)_~8Ok+aEOR)jB_9J-?VdpX!`a_t7RhU-}(sW@Q53c%q8YGpAU=VQoK1QpFd-RUT&#(l^}^+YgmERR z+^C5YAw)~6Dw3VqDt+*clU5|W#!CSifXQyW))Wi}?fx(nDHN^QJbDIR!47rre6X%Z zuKkDr`sjkBFx1O`l)}dHLD8HL!yBP5nrMjeQLkTAoe_BS)um2Zv0NXYxvm}$4|!qP zc>KX~M!gANm45Za*0bTy9503wJJ*-)Ld`{IwE;u}`}&P{<6I^it`)A{+EQPk;+}B@ z#v=K_!C7}BK3-m`t$o$Fp(S$?l93-Nb&ERO+q}SsSQ5;ZdHGTVNGF{`*jSvLcnk6KKM_rJ02yN$i{))kJM%Nn+xY^ZY$ z==AfI>pPt8l8hEN;e_|u2!&*=e^q2Zy9G##{OdautzefIEcy^uaO<~ywU!NDwfof@ z0`4}jQ5#kq-@(B!x#85d%l{&#`bPk3)e6+}B)FX1fl1w;f0N|hPp9-!6czAd%9c^rUQ-eBgeG%_U4c@GY8)!ca<#G!4 z^E3FFLAv;(=2SxCi*=XSowC9&0dY{@hLlRf#_w1&t`Y`bEDZ!+~Zcw>LruiR<;_M4&G&fBP{ z58tL#tMZ;UyrnxZFWUCPl^-igtaN)xOtW0otc7xT5xwzXQL!#_*&JOVQFA(`06ouh z#>@q5$8KtD)cDZl?MHoybL`abe=&&eoV(KYhJXy$AAO7uRM70pzGXJX(Dt?|P7S?N}G zfygz%ec04>+7Et&RF zMtp3kZcA@lVx8f)^#vlX%~kr>j<009$3r>pe$M@Pv1sH@!K(>Ou-CO~hbL|*n2g?Z z-I1ItU^;1lh*CKf{U(|!TC;twu5&@Vc)`TR))uq5os}a;mBAjt3i|>@=OmOH(EJL8 zdy(392A39Mn86ZVPT)dO3QrwYXJ2?R{;k3B;2qz~{lv46yg_ec{i7#7EkAcI-m8u2 z1VZ!85||)QC3m2`ZHbnBK1Z zebNbnrm`!BWn^p`hnyOPzAFTbch3kMh;6QWc`8XvH;I!D%2d3xcYZq6_J;_tNoV)) z&D#9;<&G{<_5Fg9QO<<8E!Kk|>FgD;@cFr_78f>?!@%=T^tqGYItmPj*K*yKTKw$f@QMT1W!?gEA-z z;ViMEyrQyH8z?v?ZEVc!ZNP0)zf<4PfI}FS1Ss*Xobls@AL)FI7R4c8C3x_?ma?xX zLqY}1=XW$5$IWtQKjGrYD|(I~kHX8vy^*%_(H zt9QabzrOlY?LM*8#ht+ic~Oi4%l;Lwu3l%TxbRc-=UHi=_v2ydNIFk?D*pwF@M^cL zFKx@m?V^|(-@;I1Yxzl?l`HR{8~R2QtzldL3$cxv>p|C8AU)6)p58+#If;8}bGWzC zQMfYVytU#er=-LvC>YgMx$mEs=w9=pXgBG3-;_i?a8#3QX77m!{}OgTd3rhB)btwD zioxg}sl2?>P8n-`y$s)>2UotRDUoIQPLO3eB5@qpcHY7JTx{xD%xt2upo+w8KWxW* zD)gnE40eg@^sdu&R*{WMk9-_nEcT!xNys)Goy+xT2z}P33txZ+i57 zFO(0mtvNN3$hcZue*mQ^lSyZ1Tc8VP{NRJv_GL)cfEC)_UTc_l z@$%&&;x%E7nHbl(|~$XU?1f_6$aITU%;w?t3T)QFW(fV4w({uIL2?Jkeby zRYnQ&t-Lj#-}A?C8g4^YiT#B9$=3Ee!4Kc9Q%-y3+hs|`IT!2s2F6v=jxUY0Ko0-) zzesc^?kuOPq(#Fxftb*&^UqD*>vrUmo25J$%t`0V8kAi%X_73RUMoOzMvrt~U!7_+ zYvZr0`QYQI_u73|&9U)!UdeM`R2SH5F$OsV3}3U|=inW$0-Xa+tbfqu8Q1%qggW9^ z!n)<8-?Cm)OPiAXk0iim4$mRc-(UOpcc1=0Nfx|+^Kz6Q-q(~*7&eSXOTpksBNBL}Ij7nQVD9er<9iK+cjW|3-eEaFt5=dgN@fm5JS&|^l9 z*YA9v)30t6ysl!baMWV{T+i31w$is>E9l7oeagrjnU2Kx`pQvhR#-5?SX%=p1A{V9 z)?)c*$nr8x=)J%YwXi6126{jKvVPX#UqLfhJqD2?@~+P!gc3;l+#1!7x2 zsoP`r*zT(K-0Q%_J!`1q$C%G>A-*>| z0^<^rQmAhB_lVEnf8Y9RfvEWhJZ&qKv?@_PGm7pk@`U#gb|tkQ7c>%yy0EPBbRbXQ zCI+x&K*^Sr{4&t#YYhdacU~&Eal%SY7I$%@qch2WoUTzu9xTBfUj6Y_|7m4I)$iNL zoZ$Sm#hy;IvT?EqGrdJd<}iq|M70BEA14w9HFsY%0{6Hiv*OD_oz^!@9_PKxI#s)2 zJI6Km>>lfoa0$C^iFa}Z%CzsBFlbh$T_6Uvs$9E<%dkgUxUTCTd@V>ec@kOL7&@EL z(%MNcC>We{R~4#kud?%hR}1_-ibvwlMFCZNi1Vv2y}_5>k;nefJViOt3q*hyzXVe8 zf8=r~8-pd>ZcM5ka5i?Q-3?i$Gm@ZEb-Am%mmdpj8Gpf%FAC95i2>ouZAKhEi>XTq zE;}6HkfdpdhESL3wXG(TmLUa?D&Mw9c2(=YdjI~a#ey9{R!(WH;P2!IgGXWw%A~6R zjAb|@t%`M`J#+;La%<`J4Q?>!J&20XempcJ#=m*?Wba6hp|;eo0@H`e&6clvE>e3J35^RKr9k4ucbPJ0tev-XtiO6Q(i zEcDiR-21b;Wn?7cS;QH`QuSQD-nFwcpYX>w(Nao-9{Y&nDwIwB zD3;O%G+r+!N=e&s!lnc?WIsRDVShX%ygZ&Ce2>fs&8}WM@j}-Gz4l5YL7Wdb*!JKM zE^%HKwK^9(q68YB#y#n4h~(riw%gBGIg4UHR^R%nmJQ=~_9~mGk9Amz&AJuu$mt;T zCSv4ehML2QT-Nj~7!;No78ZNFph%xu(go zO3~{6Rd_WbiDPfDZ5GR}1Vy905xVj&RL7kx{FXN7%XXI;`Pis|G&f|PVl<+@z0}vS zHs=4-_~}+Vn`KB$r02jAlhF0|&AwKrymRe{_B~1Eq}()U1sX5}<#~Or?_8fz3S>ld zuenZ*WJ$Wz7#eeFw!=ByDeky!w9?q&%DrpmPooS>TMQ^t7#Gh@h3?)M?-Io#vPK+# zetpX4JwAlot7Hm1wh?3NH?N+xn>q^yFA6dIVbaTTkLzDbbO^6HXPqNtu}-{v(X%EL;8LfF9v?o-32#hV-*x7Fxbzb5a{aJy>Rk0y~ab;NN z&a}6E`b8?tThoX3&$=_g6;Nje>Hi(-B5=ESq1~!stfoXcwn)_zvd-tJ<;U#Cv{$T&)HB}7 z?kugNB3CY5x)d4_Z~HUI!KbHY92*yN!P&?}#IgKx&Va&Z_oetAlGvxm52jT>#2*or zd6i3&E^6d$pd=A;MS#sXp9<`MqteL2P!?$*b#H^Kw}Z&P&;HP%RrfOWMST|bYi}6u zszQV8(U%I2_&8o3(ZK^tJ9L|VUoS#2FJ|@gJbixhJxj;3fRT#unGJ~SSg}4zRmfoA z5^D=*^Yi_%b7|Vyf9D!G?zd1VtB>Q1vg};isa-t1 z{sr8w)$#%ggewYLK_lB>r!-J4<6-nkksV8(vHhvdZ?qJC+%SSLp(^vihGzy>)rLfs zb^Lvk+d7P_*%^)Vt<%AJLCrw{-0;aEZ^ZBq7>28;@{9+#VwW%OH|sWuca z;JkS>%lSb*k@=dop@xj;yyo-23OKZmz(oc62*n9shi4LyaA@QgbU^@BN8 zsag@OGO{xF^JO1_b6zumJZ&z&qX6yBQy%KzgO9dZRgW-)^;hU-=CC%@=6TzPYI8#M z)qvyuU)B+9jXw`tjUjXhWkJxOg~Dlze74&av#YWzESrwd_G0-UAX>tNJ|HqXS=kWF z3wM`MFXPi)moAZSjGi_^vux>Sa@>p2kBfCII88OX zs?`4D0PwWQ-xBA)_F+BuJ{C4M2KQzB(eWbOg6C>=PxyHqCrP08C0J4@d@09FMeXgm zWd~|6i#4Sxy)ocBFjec(7;3YV*Vajc@!!=&LaQXWmy>3irDJJTWJk>U;PLIW2U!=$ zj6PHS*faJfC=G<$fZOFcg{`_qH5lyUP4roBMXOlX0%WMs1_YI%eUROkqam2R^uv4M zLWs;G-;dT_rDt#kotHgbijxh*p&c+39vE-qF`B+KWvrFH?OL(o<@MSh$@g)8t=6~z zSlz$OoWa#qEXuxe9uJSH>f`%`v;^eY>AsgQe+j&2#efU)#!XO6dhQ^pGf0 z@a)?=Vh2ahF!Y>$(PJ$OR9zq@F42S_xm=G6+RI--g{BkJ!TGz%^-l>+YU`tY_nBuG zqNCALI@nQdNw!n%#}u&ab*LL z8j*h>2OEj&8k4BlHMiDMWRca~)7XO-2hSaj@~ERmRuDL^hRi>^$IAeWP@9TS`RG0- zLtA!Ad-_ds=eVBE$*kR_J(14~YSuhr=u(f`p>m)tIIK~Xp7*DR7L-{0RSWjlCIy%! zn^32s)E-a3V!W{l@ecc=@y=JBu~H^`Qc~Zq7tcG%%eSHJR6EN4Jhh;u(e&Jl!A$k+ z7Xzi+4V@3c8u}2?P1@~U-`u(&J>vsnGX3JB^;OI5zlvB995?jr2vGpSiSq zqup!C6UW6@M8ne5c)VS3$66P7=<@BGIE_1X&`g*O(;n7hY=3}9^_Dcd6DJgH26>8Y-^qmT?AjAG$VR6(A@>arm zPD8BF0|(m30jjsJ0%TeAA;T5q9;Jai^u;KPhcF-N(Y8i5`%Y%(WgzY9W?AM%fp{4K z6q2ym*rwJ;W=`faJu`E2Sns0}Ric(G4Qq+QCaU7T4WBfiOdND&hG)^&C&+Wiz+2qL+<8QVD7OO53 zRppz%o{gq12K)&>Vg1j`mJA&vxbjDM`Gole27T6w*nenC8w?J4VgAc8S#owgbeiNA zk`@D8DV6*B7$_oIW=6hP-}N64b2!Z4jL3YPAE_eY8s+dJr%|7K0tm%GrsDs;U*Uy? z9es1!1Z&v=3kwV5L)C=F>SZx-+yty%G?`)S!=o*a6eV^^9{bKk38En!z=a0vD?(sS zkSHV{)53?qG91sd71|l$DAnUD1qu{ z{NXVu_f0iDH`ML9lhQLqO?B@@QL6c}H=$ad58SG{rJZj^^Q#YYL@D5OI!8!o+?Xj0 zYs9}szuGwe;Pu`#tBfoOC8aO?S)coUk@5@J`Ym@=U2g_Nu`_*=C5S?Y+L=cqlBI=8{M7!1MDI z7;uPA31V-Nb2KdNU_tN=)YPcRm>f!Kf?Ey_%IO=n^t=qOaqr^K?-Y$2Zw9L_II9ZM zQu4eT9Mn{7dYK~{uM7%yEi8~3nB&lH?&zqS-oR+cvJDcoTfaC~Mp4vpBmK^n@fV5l zDi28vm7teFEO*5gFFB7)VwJ(N+HdxYpKP*U`x#;#<_;73 zb15bJq=!bhFjh>Y^fj_QF@IzQL&%@z46PZlYG~aeENLU5LTaQwH@8)FmR)&@c$-G{ z)KX5>mzA6Gi^B&ZunHll;Nz+iiLtDt?sBX1;oVM<0xiEFTBXTV`nr3%Bhx#E0`XAr z{k$OZaBzi_u%E8nLuhBIkL@NdNK|;%+&?tM{MV5ac2rh&=u#~p`3ip5P_8K(p-+CV zXGXke;TNfjVK7vzjSb;WWS7WX;w)9w8zvI+4H5R;L99LX{>-H zJ@k*r__B?e8^NaW`R*R|qWkoY>u!Ta`O&Xu!v$qAoblPyO^NO)_8A$J0#9;t+(&k= zRGvz3vaQUT^2+UG^f=UJnjZLYNg25&}{eDZO#PW!@?WIKOcg)E_QMMl&(k z(DP7MKjAmziB)-i{)Wk2v$wuF3*VvaB|K>z?JLFfWqji^<$`ZhW#Oq2G~uR9(<|7f z&um(OP`JF@_4&Y8DLJe6r`w6od($xOpR;Tp;c@k3Es8Tet`FEeA(vp z>(`!Bw`lz(Sum2in+XOS4YsK*ffYe;sVIJfXlcGZ9`VcQm2s4y!Ca>BvhwiljyIPv zfTug|K7ahsKJc=@$9t|~M&r(j$^#AnAC>o(dpLo?m=9`Op=V+YJHo=%%NZ!*1epIB zJ`T2QlIMaixAbdecWE_c74%E7!%HkTeBNqc5sNIb3Us1bmnZr0kxyD z1t%gX_T9)z3Y>>0Jtna8xi>fNI!{yuTh%F56n}Q+gAFey@iP2QK-3Q?{7P^;lvhld za{q-QqS0^8MU|AdJcWJ$P)yO4DQugr#gt$s@*R6Z^3=3p)OpK!bJ4`l|Lera812RT zqf>LmqBx_CQw<7~c3n`T@`Dzt@mn8d_~z*NacCDF{sQkB_Ns6j1(Zm}{pS~w1|5&MI3ud$Xj+Z*PgQeQ_-OpojB9l~!m zoAMpa%-|V97jZ=qqXiYytcxK5Z~MW2;1&l$YS%tdLJnXP^^G0cLlq`;WnsHNXF|Qd z40nZxhs8E6t+}_ZilfqW**r&HB4-db{a+tt)n*m#GD!*slVzyq*)O5(XtCw~MOv2` zdT<}y3OqeMAxzy|`rL3-_~Zs0%AbsUcFT8L6)HglVz}@VD4{rSQJ|aAoPcIpmza1c zhj!6}3}dCsH_b6_DcbS79gfy!>y~{G^`OTkx-ye3iu2>3bZH;@vRJG-lftIJ@<)~K zm6qUw=hINd@pSBPM~H^-rCph4wyvm=gu`HlZ}Z#L{Z%Q@1l3ZfCH_=%+U(f_qd|Br z^#Q%uo3CU^xg(i}4bn24nqU(Hh7{%QW7J4Fg!b@4Df*eSk>iRCU;Y{=zrV)Gscnca z2o(R0)>eWCqrXQ%yBIBjs&^?-{K*d+gkXcgQyO#}DzPIff_lH(J!evz4nC-h-9$ozH!|q7j=ub zJH+74QA9#fIJl7qO6vf!Oa8ui(wsW~7 zrX!_ii*^=0JD%?(a#Db*lyTMF`(qY@q|C~V#`zDD4iS>K)MaE^^$bG17<|IswDMd~ zm6`c`Nk5;2gz}cL18ohaL%g8f1uZt28N<{97$sQ0PfWh=(=crhtNS}Wuv0DqVwc%<%wBhsX`OLY;{sp;wI zPq=^;>LI1BEJ5$-fIOfBS2L-3U4NJMUJY2>haYW7;8hvWH=j}kbO+3ZoRj8tY}8nL zwYwln1#uA!X`bi}KdHS@1$A`+0Nd}8O&4c*AY}2Y2GFUy6Q;9w2pOckj(lLKSv?)7 zp{8)NuXi&s3Eo8pZ46vnU+lZ{pv{u|{)y5E>UF|Ku6>Cwk8hO3bG}@$}rKh!=;1FA3{tb}(aMnZt~p@}keRl2>TS2V!9r z=Z$YC6XcbTj~P9ZSLqog1AMEwNs_+WF3k#B%g?@~5HY$Y8SrMLyC5xS-2hc#E0H|Jrhe8TEHpt$OPw%}jNu&NcT|+l zeKA_DyFYoYN=DWE{jSZ>oH}>;6c{d>AnvQpOeB=8)vGlwWwp&t`N&HG!Lp>pgebE= zU>YZ=`K`rtP{nC;*8&_y*yxbSM(W1eq>J7I3G61x_R!>;C#tD^pB&gE77oNb`!P<_ z^XE34TAJnNy@DHgZTms%B$(teeJFWHEYHNQwkc2sjxEZ(fVOj>M@mWAtP)n4>R^~f zqQP2desJLs>CTd+t=mA6=#ECuhlYf8#wN8udsBg;YY+Wq3s(1VsDz!>axQt*SWT|h zO2j1Gkuo6m>ti+KO(>f#ILRuQQoAf@3e-lz5y6}$@GMnMtH50U$ZF!aBusO(*>erb zC5{wil4;Pg1QetN@vszxRc6R%`SeF`vm^66J$}8LJI;Gk#v;}^IG$rDcv>+r9gtHw z*-_N^J}g!Nva#pS-<0cW)^F`Kg-B~-MI({Nd_f-ojA%Yf2_QpGW_x0%>7;)?{eqG9 zD4$u-zAQxGg%(Q1ulX!9i(v3mNEq1e(PDrdO?|q>{3iU|JvQ09_ZO^et_lb44_=^n zf`OQ^3Jr@@>ATm>a&}GBfho^s=OsYhe(%nu9?V8PEHe&#c++GFsl$ejEN5~apyd;6 zXst?hfhce`a^>-o#Ah;#wzCDLmMih`hkg7l`+q)P{Z1f)c|)XW z>o5GU;PBirV0q^?h{s!TK>#%`Wr;}u119z2eMv~RlDwsND z=KKA?aP_e2mb}td-OyeDJ+5Q(LR!X{q0iLVypNTJL=I7~Dc%Utb1@`&wd( z52F2?BRWeP9^TKB%4~AF2$Dbxr5-9j-kDAF?s753jOzRBZMrTpXXPcNq!t+Q>TS-l zYuMC!mf?Mm@^?QUt0@DWdYvp?z7{f;GY$H|iRH^3AYZ zI};ieC%QTJm!f@;j1tt+pY0qXd;fh{1(mwe8i{edSn>J${lzzJv%Zg?E?l@?>TB@{ zDz0z4)NG>@E2!v$tq4`|ieavu^DvlXRFv|dq^;^QE%q>)h2@yQwAWNFY&c<|KH-010S1q+q7zxi zwXxGSHn)`etQztc~eG^riy|CpjL{P z22tl)ckYWIOJJ0E&Yjh-&}mxRTxt~Pk>IS4vE&p=-}onye2XSTIG1L&3OefmW-DFM z&D^ohueMP1Q77@-}cS z)EOMC*!k3{Sr)lwQ`GT!?8N|iJ8BEurT*KmH;$yAV!q20oS?z2X0lL&-xj2E`Z6~q z(f-cu&|dw_Nl2#+Gozk#0Z7*X^v9f}iRc&2v1(GAN(k1@+uMf`1@rdaOjU!*vF~kf z#r_+4C^0?B=*PMsBoYsHgOJ%v)`i-8=l(q*f;RVqB{J16f=04S)?;fco zp3vmG)QQizc;y@Q^1mQ%5XlLREE*{Q*7~8l?r{*m+2RMRe98V1IFolCbQt%bD)Thx z%WhtuDggxPz+JQf%$ya?%IQZR^L#VUKMKSF^8=96jZo^NNUj!^h&XzFc5POKrPTQb zDdRXahXYEPTQGHio>GoJqMCVYg5q^Q@T{U=OR|=c6Sd2qIQak|DGV$8*LT%yzg)c0 zQgaH7+-IXGg;plK?BuD&iKOW@Mu}IVmY$yYtt%(#VSjvX34r<~c&a{p`Oi+;{3o^j_Cg1Fi=ZajNR3YO=@eA|#Ns^6M{>vGna$G0;>aB5?H8AU z@L(>0cS)E?*lXzZ##CK*+fgmh%jv!;2#9St$p5^!A@+sxjGGREsmo{Rrs|0cfnth$QOD{saU#w4$!y5FxtBlsb(NJQK+#aQHm`x) zi`~X+uhC)??v&n67)7IFzI`p{6BmlJ&ynL zJ-DH)B*qiYg$-TLV~@SeP>s;i7+hE)S($xzzRIuQv6vN)wChk~mpgBOO}hvjN9dF< zb=1RDU#!&*KW}|)NM>C-S+r~kg>%|VS)+aNa1#8Mmv^Qf@MONfwMgo$+5%Z$fc!Zw z)~i-l8}_6$0-NJSC=KYC;wRuQI`K)8+Hd@nX+M z#P8wOZe>-M(G<}!AS?PIJG2)Yd`1xL+S-vX@ZZk7H*N?UlQ&2c` z#nWCPbV5yv>UYWqKR|gy#u=o(MiUm>Xi+o;Z8IrekkioDI+Xhngtd|JfhQx{S|5<( zzvvV1dpXu(%Bj!1r~5-wo8lVqCtff=ygYCy`__S?<_Rk8GMLaQ ziXL+sCNXG&19P8UKsEGi1?nCky8C$Q6w40l$hhb}b^gZG*?$Zob6YY32Fw7+K>86z zZBfGT7nAuZRH1WL$S@J!k~fhjRtOxnry8&1;hpxlPVt_+J0Ig`7V?ZcC~htbeu~ZZ z{qp*8qHFC!ecsq{I_cs@mN-RUJ;5k6V$c0`)Eo9kPoFL*8ts7Iq<z1s`FzmnOCk;^dOeOF7~*_3y`s56ERiQ%)Y+4!Tv>WuRnh-f*gkP#P^pK zoEKyic$+X?*cMu-y+yqz`)6y6GNRJRtI6{CIe%d!bgHj)8k!HhK<)mDr)D#T%atDu z)+c@yYWK6PYP|S7iZYp-2gx7AXzH&wzd#%4xl=$f>D2DQH>FQ&v$ee{eH->B&>#5b z?7jlpMezp-Mxbv6_5Aw0S4it~iA3PKE!dfo+9?`FMRrnyYU_|(>)^!xY5%qPYt?_z zB>>ufRSn>)d1Wj+GSiHX9KIqr!6g``(G(!Q4&-Q~qd}VxkhKvC+d9H2pxWVNuOWIx z_IpRkKEiaLq6`4)eQ9!I@ZwMTy~*dG;*lU@~ zsRlF?k(~T@{Ph(;`253f<%Ld#Q1jYwiSAj-O}z}uNWeVX{dmyu%iV(r`l>ycyxxyr z{4gNlrgOc-f!r$FW%tys2#pp0^g<{i+L$|#* z9$U(wl{|))e0i8kW#hwNGCJ+rSY1*LUdje^tIQQ2C9FZ?0$T`pGd?by0octRBQ7p+ zQPBzb`EbDYsHx^JjMGp3DPPg7mp^fq^rJ;_tRx$DA;{!ifiB(U2lK^M)7mSHYA4UI ziy%qXBgdm1n-b8t`$j;ow`0-UzV-~9?E0vFE4FJyY5E7;r|cGXUyORDWhf#dB6POt zzjzivC_)u4#>uDk1Ar5*79xP+G^w3*2d~8>Xkh{>Ehy(38@*d;GirZ1CAxU(GueIt zwVSo?Unq|j&wL5CNAj~NWYmu89r$?61eB-iw@GZ_(?my9xu|v6JbSwJ@Q1f=Wf8Pl zr#kXX|F0+#Fx{^gJ{eoXDck^2>NN3ry65?S);o)C;i2?cPA2j;@;1F8++NL%@0vv? z00^*sOL`Ow{)LxbM=x!s?D-Kk`s?R`o}5n6Z{=$mIW~OK1pxj-!f56HqyTHCu#bpN zO?7r3muH>~l6fCQVFxSKv8BEX3Npz6e>7eyjfq;v0c#vcW^jQfI>!yJ`ERF%4FG%~ z&CCqcvT|yU8G={!w9tzUBdtw;sV@`y+m)P4~QUb-0Vr7ohJf~kinFzf* z_y0_492MZ>*8!_0e04_4)f~{JSMG~B6d2~mtYVttfyjhJ%3sA`FcmZP#cjWQd0NJ6 z^F2E&DHdd_-PMN*F5Q$q5&rEc-;)>OhRGnZ(QG3I{NhNc6e6*Sr5J<#SECu(8ju4ULh{KCIZ+s^ zHdc~x2Qg9c0#|Q>u907Tw<<+&V8)+5tqYn%fXvr@P0hU}Zy#@vCd=;vqQ^?0C|OkG zVq9!Iq)5635dO>-`lTj+vLncZ%kRb32N9F_U~IwLt|qK*lACUqe>1uW3~QLg)E^N( z;4j>7nW~k|&|B5;O$C^JUTL$ok$CKb`+@6}2yHL9t)^W~Y+!&CBg9WcRcedb0+RTa zt35>GKHBDN_oj&Omhhp^%MP*Mr`<~}t6!4EnLjCsaNF*fn?T(?hrt;S`Wv6sn(s0u z?2}P?Idbnlw_X56GSCwC*i{C!z(hoGdIgOX4WQit$ic;697Uv77lenI zCqVBj=w@^^uF$V7Hj&Hd2e@Y=F~oI|NSw}#wW0ur=(m=~C8DzEy}bZ*KeM%a(m!vt z056smzfH7i2RsuZH?Luk&7Y{>xtrLSx-VXwj6Hwjg0ytjtccL1Yu749S>%X*?x;Pc zX_SAbnkL+$YE%)VQh*|SCFp|+wJOSb3zP`^GH*@?oXkee+jhp7fcB)7aTT9;|9pIB zRzb3&F3l^RQ(5A{X#{K`(Te?hp(+yJL_As$)seohQq@mdKw)S09)u$(VOy7 z2@eA55LM^uDa4l;&rKLy{(LM8T|=IZ0El|Y$1q2*B6*D^NrO7Dl-ZBw(ZmNp+UG)j z#}C^Z=Up%>5|*BdHn2@Wp?H*HJ?NWesq>9~MnG44BrPD{Ukusd&SuhmjouvPaRvt; z!om1zx!vSkHVi^lNFg}79;V4w_H62n-NHm`f_J0u=VHrGF);!S7;(fQfWOSBa|bXm z5C^Gh=Cb8>KXeU_B)fGGwi8lp!rPoX>=aVEL7LgSQnFqJ2lO_SV@z{kpI{uENh^Z1 zagLmnZ+kxLN%KdJAAdGq(2tO-K=%gVVhh6O`V=|p~*KpvDU&3~yfK#3!T2_@<&SGOa)_{UjgXyR(ob#=0xQwl{Un zHm)G=Q}7;PaEmmSxXvB+Y%2rmv-aEe^y%Vie`4@uT`Fi2sBNH?b8}SQUB@ecn$s?9 z#1Sa;nj!2CZt_ay*;xw2(#;RQ{bf__Lf~}lGkdsQyq?;B8K5Nf0-qjEn$zbDWcG=O z9P;_|`_%QgTA}E}T;hn~?l#g;jnpf4_V4NMrXN^2OT2#bo&4~qOPUfOm!x)8c#gg5 zIk zrk0k36xT;S6@{*kDYDX#b1_S+Q!N=@IA%C%es+8x2CId6E_c=}%Lfs+6#?ywm^GR0RL1F^+p7B@B-12c~ zOap*&?Y%dvX`VZp4PQ0^jeFeZPrq7x3Y|^>Db5mfsl(szG#7N;30A_AD=|z|ET8&Y zG;#7ZU`=%u8|(F7w7A3prqHA$kuQr~ePy}f}fzCp66;1(3@e;L7HhO`xl z;J_>s_>_T)HP{~ucIr8ou4G{ zjNc}C4nY)`G&|WrBCW@AE)a^QtFrWys6C;ZV}+`_TR!fXAF;yl z^jEz^pj86u^I9d66~Muh`!mocWmP8-&MMp1wfpI&seUxS$xSa0bd8R#rLJrmoZX&z z_nxtO479$1G)o?^W6f(bS6)TvP)?I(md#HCUEFDM7mMTvz?)e(oFKOwv$jq+nL7)2 zdCv)HW|<#J-Oq#jfsBmbX*a6B4Z74i$^6LJL^b(>X5z=lZMRJz^^sXuHlGHZn$yLm zY{gUqwoZexRh5KD6u{iBR2&>w1oBjuu1menbul|IQFfZ#dK7hJpw${}8b5M0JtQI)%JxuGMmjPJDhi(nMFWR#ROmrk0?vHa+YB%4I-p-DTo4TcpPB-pR(3 z7(cgb0O;HfoOHwCk)o5Q1|ld}t%zXpFgR(ZQhGf}qROs6xQ;ZT1qQ195Jr<>@AUZ7 z;(sfRgyJmiz0$FB8ZHu=iIt-w%Ya+Hvp2?|9*K`jjKDD~vekZUE{qI%iz=lxOg!CL z#pqavse_x)?0A%#53&&&Pf_ZpOl^(xxwCAti9mnRQCQ>D@p5-6L+|5|X z^kH7n(=z|CXqwke*j5e7UZBykMpPLhxXb_qp2omu(uY$PYzAq81-1IqbK^Gyuzsck zq3szyf7obvb~4PMc+6E_X*Vwu)b1PSVxWs3A~-`wQvpf9=2Crj($3CK=zK!O^RD-4 zE(-jOUdt658za_9@u6GXK{zER{CB)?x+K!i1mvF6NTl*n!nWlm!>xKgPUZQoa5DZ! zj#Z9*oceVwZ(^-RU(NWqbou?zwsq9fT6=a1H*+O_(zA)U@sSJmY)(3UWhn#NjT%(b zfQAq;Xm?|s7;dR@}Atmg*@I)BK$z)+^JrA6Ax%Bsk?c=s=o?lWFtqp_1} z*tpg31R>sy9h{Wpv)OtBmU`vf?V%cDi{WVt{(!@7rlw9Z%r3FzzkeT=6^d8f+Wu4; z^1@1c(Jefy|fvz$wv(xa8jdMt%f`$#P zhi|jBC&@)2-31EODSOiEg%ZdLK+Ka-3;~?y3)vjzYT*Vr;GB>U_B&swDY^lzre!FR zByBO)|BSdRj7&BzmxhlRsN8%Yt$wNBQGP^d zFTjbiz1ZxdkqiJ2j*Pw88zZ`IZf?Opnozv^z5xMF-T8cl=4HW*);z`E8sg$DYZKA! z^PjZyrDp8IcuAFuK?_Ccl90>Q9(G4s$I$y%_^hf#1qF#gy=fIf6oqkl8z0xD?ZIw1 z{qK*^6(2sHx@$yDln~4qynV@`o47<#jlFdPqcYWZ}@%F@!(SCh1tGj2+TkQtdX-h{Gq=Ytm_ z@*s6QErPZ5_Bq9Zvc+iPn;GnIGW^y?tcB_aa%HixM4B8d_|Ty}`CHHn42I9h^mGRJ zVun|j2^mRkZ9(?Jn}-ew$ywhxAA2K%{~yMEB9WLT@8rL9;`sBORYd<%oOfg9%l-YW zaaVA4dz=w-rtznWYX8l|_wUE6gNYH1w0L-rbO1KdyXceP(vHK_J&uq1j`@bya|uq>}K~6Tf3>IsChy(Aj z6E~floV?Yao)pB+o~Gh7;5f^eRaQ}v4;aYo%TWBFOY;7mkrRz?i9!mPfaBV)2Vx5bi+SRJwYVS!0oGuH6h(k!ci@&9c z!C;D>lqju*Gkj=*0nhuVYIhf7bwPLSUiEQI454W}2l}f{Ekx+ZP^HT@YTj!En(Q!D<1%Sa(Tfrkq$ATJrRCl0QSY$3p|RA#9Y6RbN+==6x_(xWLnmcl zf`V-V#QR%$QEC=mVLR1?YP(KY&^Z0z3J)oh#XX@7C%n7pcL!hF24 zlvRAy*SY8^pEjXJdW__zjRv6IZrQHO+$6yTn*3Mg9^l)Bcb|Ixa4}2XUqLTBLkIu- zX|5zJ8eX+9H-6j`Y10=K^`I+O!~79)wktmfdyxarx*wVb^-Jgmx3FH2j={duC)AUR zp8FHtLG8zKXJ=1LAC*#{`%WLZ7xEjv_Y>aBdZb`7G_P!pc+;b=4P*silH3qXVb-iv zA=k_oh)eulTYKn_@k`0v9) z(?X{GU=KEef8hMC4sAkwpf{nHsn(mqlmp}UKt|nePP$c8u^t*+P+OCiZ=N<>@=h|z zd#P`=zYm-JJ}z#Fq_OWZCv7lMr)~;?=<-b855+-q)Z|sKXAZ)a3A>|sWM*3sW74+i z#7kQ9V5l5L_SI3Hbx=f=sNw&*K-~uMNcy&J#?E&ez^K#ww?V{bZk?ZVf95>MbAJHzkD=rc zv||*p-T?plS15Qt7vI_JX#)bXr0RVfhMfyl1 ztf~TRLf|TMv%D!R2Wqp85!jkx?|QZGKYgMgH&?_4>8=Hq$Q^LY6Pv5`&cHpM(;3E$ zWOYUf@4Th$tD9B8G3S(a7vWh3R@BMneLtr&dp{5USuSqLmxhP@b@N_&S@CPd&+WRQ zuwKjL!+c|XoqVy{y7C(J6Zd-NL^ylrMBH5yYO;Ejwqg zeQrMkfgGOHx_`%5ai^`C88(BqXqWfLUWHXVE|Nk>-O=I#NVDfy=n!HTOah&d5DQLa z=Mmcyt&J&k^K~S(^F$EwoYT@b5x&C0LUHEyW)8j(ZI$DL-7N3R#we2ZQC|(O;)QX$ zaWnojK_$kR)56?4#0NqDiLg13_;29tx+fe8wWcUS2YRi&f;mG;Y-Y$XSUF;eRx7sSyHpp{nOd9xRrYs7X_P?i?onEn|BM{N2k(gdmsa3# z_dvFMh`-F<9CEP_o%N9r<_`nk3Jo4$A~}qj#-a*;e@c4M$avRsk*ckAm zNtG2LKbkfXJ_GtipE5(R2kqy9mjjk~dmC}B+NlIAcBQ3n0 z#FSKYd!dA~$d-H88MFKJV<}qE+@pXW5qaJ0Kt+e)>lt@UfU%q<|%#oW=`;akW&PYZeKT z<#c~nHMOALjD5{O4hZP%~U+5AG1bb^a@aY(m<0M4mDHM_oL9cdtNi1kr8 zvH^u;Q)X>K*1mNF{I_u>mCE_w#zAfz8*Ah9vpE%rsupk}V>Nx|WLrNOLT>;c+ECkN zPRyK27}WFCb(j(%;ali z+C_4?ud(SK>38(Tv6qaPmlYWAoVM2iXEJswhZJ1WAVU6VxfVSc#!P0bkPwQwV3>L# ziP)Z-Zt`1y_WD+dbst+rzu<;-*>%DH zHjZ9Ku(LL9xBVX)6O9|*V&r_3#`w-ky0=lC2$L!Ed zz3Y|S-0f5(V-y0&iu{ZcntFkV={d5=H zPmNdbbi+T0N#{IkXr49jHLw$b=zA2^EirJ+?K@zGUapO``0c)@>T-jBvSGf- Date: Wed, 11 Feb 2026 18:10:22 +0300 Subject: [PATCH 09/10] Add badge --- app_python/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app_python/README.md b/app_python/README.md index 139ecf4b59..bbd3be3d1c 100644 --- a/app_python/README.md +++ b/app_python/README.md @@ -1,3 +1,5 @@ +[![CI for metrics app](https://github.com/Error10556/DevOps-Core-Course/actions/workflows/python-ci.yml/badge.svg?branch=lab03)](https://github.com/Error10556/DevOps-Core-Course/actions/workflows/python-ci.yml) + # DevOps Info Service ## Overview From 103480e44435e80d88804f3472b13958f9ba19bc Mon Sep 17 00:00:00 2001 From: Timur Usmanov Date: Wed, 11 Feb 2026 18:44:28 +0300 Subject: [PATCH 10/10] Finish lab03 --- app_python/docs/LAB03.md | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/app_python/docs/LAB03.md b/app_python/docs/LAB03.md index 3b55f469c2..159fa6ee86 100644 --- a/app_python/docs/LAB03.md +++ b/app_python/docs/LAB03.md @@ -86,4 +86,36 @@ All the checkmarks: ![Screenshot of a successful GitHub Actions view](/app_python/docs/screenshots/Lab3-green-checkmark.png) +# Task 3 +## Add badge + +See `app_python/README.md`. + +## Caching implementation + +We compare 2 jobs: + +- CI with caching: + [github.com/Error10556/DevOps-Core-Course/actions/runs/21910845044/job/63263997026](https://github.com/Error10556/DevOps-Core-Course/actions/runs/21910845044/job/63263997026) +- CI without caching: + [github.com/Error10556/DevOps-Core-Course/actions/runs/21910713353/job/63263515554](https://github.com/Error10556/DevOps-Core-Course/actions/runs/21910713353/job/63263515554) + +Results are surprising: without caching, the job took 10 seconds, but with caching, it took 11 seconds. + +This is a negative improvement (-10%). Still an improvement, though. Just negative. + +In all seriousness, the 1s difference could just be a measurement error, and these jobs took roughly the same time +because there are very few dependencies to install. + +## Snyk + +Snyk has difficulties with issuing tokens. + +## More best practices + +It was revealed to me in a dream that one of the most important security precautions to implement is not vibe-coding +your way through university. However, this is just not feasible with tasks like these. The AI-generated labs are poorly +reviewed for workload; as much as I wanted to learn the subject and take all that the course has to offer, I have to +prioritize actual learning above tasks like "Oh, by the way, do like these three other tasks on your own, independently, +because the course team can't be bothered to teach you. This is mandatory, by the way. OK? Thanks".