From 32667c657dd9b8c7e2dbf7c88bcdedf32d9625b1 Mon Sep 17 00:00:00 2001 From: Storozhenko Evgeniy Vladimirovich Date: Sun, 31 May 2026 11:58:36 +0300 Subject: [PATCH] first_commit --- .become_pass | 1 + .gitignore | 3 + ansible.cfg | 10 ++ group_vars/garage_nodes.yml | 27 ++++++ host_vars/bigbox.yml | 10 ++ host_vars/vps01.yml | 10 ++ host_vars/vps02.yml | 10 ++ inventory.ini | 10 ++ roles/garage/docker-compose.yml.j2 | 10 ++ roles/garage/garage.toml.j2 | 28 ++++++ roles/garage/handlers/main.yml | 5 + roles/garage/tasks/main.yml | 96 +++++++++++++++++++ roles/garage/templates/docker-compose.yml.j2 | 10 ++ roles/garage/templates/garage.toml.j2 | 29 ++++++ roles/wireguard/handlers/main.yml | 5 + roles/wireguard/tasks/main.yml | 34 +++++++ roles/wireguard/templates/wg0.conf.j2 | 17 ++++ roles/wireguard/wg0.conf.j2 | 16 ++++ site.yaml | 0 site.yml | 7 ++ uv-x86_64-unknown-linux-gnu.tar.gz | Bin 0 -> 23838 bytes 21 files changed, 338 insertions(+) create mode 100644 .become_pass create mode 100644 .gitignore create mode 100644 ansible.cfg create mode 100644 group_vars/garage_nodes.yml create mode 100644 host_vars/bigbox.yml create mode 100644 host_vars/vps01.yml create mode 100644 host_vars/vps02.yml create mode 100644 inventory.ini create mode 100644 roles/garage/docker-compose.yml.j2 create mode 100644 roles/garage/garage.toml.j2 create mode 100644 roles/garage/handlers/main.yml create mode 100644 roles/garage/tasks/main.yml create mode 100644 roles/garage/templates/docker-compose.yml.j2 create mode 100644 roles/garage/templates/garage.toml.j2 create mode 100644 roles/wireguard/handlers/main.yml create mode 100644 roles/wireguard/tasks/main.yml create mode 100644 roles/wireguard/templates/wg0.conf.j2 create mode 100644 roles/wireguard/wg0.conf.j2 create mode 100644 site.yaml create mode 100644 site.yml create mode 100644 uv-x86_64-unknown-linux-gnu.tar.gz diff --git a/.become_pass b/.become_pass new file mode 100644 index 0000000..8ab736b --- /dev/null +++ b/.become_pass @@ -0,0 +1 @@ +Ghjcgtrn73 \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b40528d --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +.bocome_pass +.vault_pass +.venv diff --git a/ansible.cfg b/ansible.cfg new file mode 100644 index 0000000..5e794aa --- /dev/null +++ b/ansible.cfg @@ -0,0 +1,10 @@ +[defaults] +inventory = inventory.ini +host_key_checking = False +retry_files_enabled = False +vault_password_file = .vault_pass +become_password_file = .become_pass + +[ssh_connection] +# Стандартные безопасные настройки +ssh_args = -o ControlMaster=auto -o ControlPersist=60s -o ForwardAgent=yes diff --git a/group_vars/garage_nodes.yml b/group_vars/garage_nodes.yml new file mode 100644 index 0000000..3803cb7 --- /dev/null +++ b/group_vars/garage_nodes.yml @@ -0,0 +1,27 @@ +--- +# WireGuard настройки +wireguard_port: 51820 +wireguard_subnet: "10.8.0.0/24" + +# Топология Full Mesh +wireguard_peers: + - name: vps01 + ip: 10.8.0.1 + pubkey: "ZAvz4xCEPmlbor7/sg7+gCC5X5ju4IBK0KEmqD7xmBc=" + endpoint: "5.129.217.146:51820" + - name: vps02 + ip: 10.8.0.4 + pubkey: "JbC++sMcNaw1L7qL4ZvjfHYIjgw7h77aXXuz1sCHQlQ=" + endpoint: "195.161.62.100:51820" + - name: bigbox + ip: 10.8.0.2 + pubkey: "SXCR8BgJcomhe2pygfhNmXiRgoJynuwoQxMsqFDL/W8=" + endpoint: "" # Bigbox за NAT, входящие соединения инициирует он сам + +# Garage настройки +garage_rpc_secret: "a3f1c8b2e9d4a7c6f0e5b8a2d1c4f7e9a3b6c9d2e5f8a1c4b7e0d3f6a9c2b5e8" +garage_admin_token: "c213debe864061cefe501f7791d557b6dba701710b41791b4a4a0fb036690d1d" +garage_replication_factor: 2 +garage_read_quorum: 1 +garage_write_quorum: 2 +garage_version: "v2.1.0" diff --git a/host_vars/bigbox.yml b/host_vars/bigbox.yml new file mode 100644 index 0000000..8e47687 --- /dev/null +++ b/host_vars/bigbox.yml @@ -0,0 +1,10 @@ +$ANSIBLE_VAULT;1.1;AES256 +61643130343565383630613661363963396462386231663361623263666236386166613931393936 +3834613362613439656230366538336439346534353536610a366238353163393135343365393432 +30626430653038666439303762613463396165373964633634646466633466313533623339393536 +3563306536326331310a636436333563386261666565316461653538373131656164336665326339 +32346661646662393534383261633765383633336237393431336365386362663535376537663537 +61343864613961306366363465376330396437383438336534336630643365316136313866326439 +39343439383238343239333038636137623631363261326536313838306535653631326666326232 +32303332303266346331396339623632336165373864363238663663373639323038383136363531 +66623638663838353737386130383433663835383332343361663966613038666261 diff --git a/host_vars/vps01.yml b/host_vars/vps01.yml new file mode 100644 index 0000000..2f9832a --- /dev/null +++ b/host_vars/vps01.yml @@ -0,0 +1,10 @@ +$ANSIBLE_VAULT;1.1;AES256 +38653533356362336439326463303238383835336131373337366666393763643337656266346262 +3134636164386636363765313861376437346566343935370a623633643835316162396237323038 +35393666376533613535373262303830313564383237633830373566643536396134333130313331 +3938613431646232390a363230616561383037353631653839343637636163633330366161663932 +62653965313330313539313136336265653136623966383965343965643730373339323433376437 +39653861343230653032333462306364653437656563326135393438643236343330376265356630 +66646635323135656336393630383066613235626433653163356462623733613733633431343862 +31346339363830643231626336336263316534393137633432383436343136373133326638326562 +39623562633866333334656566303532616231373037343437383263333936363166 diff --git a/host_vars/vps02.yml b/host_vars/vps02.yml new file mode 100644 index 0000000..8deb1e9 --- /dev/null +++ b/host_vars/vps02.yml @@ -0,0 +1,10 @@ +$ANSIBLE_VAULT;1.1;AES256 +64393034393333373737623763623366313139346139626130356664356536333435373431363564 +6664623430323434313132313031323830343166313230360a353731366262346638313434376637 +34323137373733653761356661353835393664323365336332656535316633373736393465326130 +3864396365346534370a346434346132623262643434363464326338656237633666366435366366 +35346530623236323233386466363761363637396438386263623866303562383839616639623032 +66346539333233316135643834613837356338653335326632346565636662383330326662326135 +31323933323439396566363362366335363635393338323433653738396236333431636237383261 +34643362333531653966363135646662663565626238313536613537316361653063373762316439 +38643866663533373034626437333130346438383138306533393030303065376331 diff --git a/inventory.ini b/inventory.ini new file mode 100644 index 0000000..74c00bf --- /dev/null +++ b/inventory.ini @@ -0,0 +1,10 @@ +[garage_nodes] +vps01 ansible_host=5.129.217.146 ansible_user=root ansible_ssh_private_key_file=/home/estorozhenko/.ssh/timewebVPS +vps02 ansible_host=87.242.100.206 ansible_user=estorozhenko ansible_ssh_private_key_file=/home/estorozhenko/.ssh/cloudruVPS +bigbox ansible_host=192.168.1.3 ansible_user=estorozhenko ansible_ssh_private_key_file=/home/estorozhenko/.ssh/gelonet + +[garage_nodes:vars] +ansible_become=yes +ansible_become_method=sudo +# Для bigbox и vps02, возможно, потребуется ввод пароля sudo, если он не настроен на безпарольный вход. +# Если sudo без пароля, то всё ок. Если нет, добавь флаг --ask-become-pass при запуске плейбука. diff --git a/roles/garage/docker-compose.yml.j2 b/roles/garage/docker-compose.yml.j2 new file mode 100644 index 0000000..0ba200b --- /dev/null +++ b/roles/garage/docker-compose.yml.j2 @@ -0,0 +1,10 @@ +services: + garage: + image: dxflrs/garage:v2.1.0 + container_name: garage + restart: unless-stopped + network_mode: "host" + volumes: + - ./garage.toml:/etc/garage.toml:ro + - ./meta:/var/lib/garage/meta + - ./data:/var/lib/garage/data diff --git a/roles/garage/garage.toml.j2 b/roles/garage/garage.toml.j2 new file mode 100644 index 0000000..164957a --- /dev/null +++ b/roles/garage/garage.toml.j2 @@ -0,0 +1,28 @@ +metadata_dir = "/var/lib/garage/meta" +data_dir = "/var/lib/garage/data" + +db_engine = "lmdb" +replication_factor = 2 +read_quorum = 1 +write_quorum = 2 +compression_level = 2 + +# RPC слушает на WG интерфейсе +rpc_bind_addr = "{{ wg_ip }}:3901" +rpc_public_addr = "{{ wg_ip }}:3901" +rpc_secret = "{{ garage_rpc_secret }}" + +[s3_api] +s3_region = "garage" +# S3 API доступно везде (для простоты отладки), но можно ограничить +api_bind_addr = "0.0.0.0:3900" + +[admin] +admin_token = "{{ garage_admin_token }}" + +[kademlia] +bootstrap_peers = [ +{% for peer in wireguard_peers %} + "{{ peer.pubkey }}@{{ peer.ip }}:3901"{% if not loop.last %},{% endif %} +{% endfor %} +] diff --git a/roles/garage/handlers/main.yml b/roles/garage/handlers/main.yml new file mode 100644 index 0000000..543a94d --- /dev/null +++ b/roles/garage/handlers/main.yml @@ -0,0 +1,5 @@ +--- +- name: Restart Garage + community.docker.docker_compose_v2: + project_src: /opt/garage + state: restarted diff --git a/roles/garage/tasks/main.yml b/roles/garage/tasks/main.yml new file mode 100644 index 0000000..669d4df --- /dev/null +++ b/roles/garage/tasks/main.yml @@ -0,0 +1,96 @@ +--- +- name: Install prerequisites for Docker + apt: + name: + - apt-transport-https + - ca-certificates + - curl + - gnupg + - lsb-release + state: present + update_cache: yes + ignore_errors: yes # Игнорируем ошибки, если старые репо битые + +- name: Install software-properties-common on Ubuntu + apt: + name: software-properties-common + state: present + when: ansible_distribution == "Ubuntu" + ignore_errors: yes + +- name: Create keyrings directory + file: + path: /etc/apt/keyrings + state: directory + mode: '0755' + +# --- Логика для UBUNTU --- +- name: Download Docker GPG key for Ubuntu + shell: | + curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc + chmod a+r /etc/apt/keyrings/docker.asc + args: + creates: /etc/apt/keyrings/docker.asc + when: ansible_distribution == "Ubuntu" + +- name: Add Docker repository for Ubuntu + copy: + # Используем переменную Ansible для архитектуры, чтобы избежать shell-синтаксиса в файле + content: "deb [arch={{ ansible_architecture }} signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu {{ ansible_distribution_release }} stable\n" + dest: /etc/apt/sources.list.d/docker.list + mode: '0644' + when: ansible_distribution == "Ubuntu" + +# --- Логика для DEBIAN --- +- name: Download and convert Docker GPG key for Debian + shell: | + curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg + args: + creates: /usr/share/keyrings/docker-archive-keyring.gpg + when: ansible_distribution == "Debian" + +- name: Add Docker repository for Debian + copy: + content: "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian {{ ansible_distribution_release }} stable\n" + dest: /etc/apt/sources.list.d/docker.list + mode: '0644' + when: ansible_distribution == "Debian" + +- name: Update apt cache after adding Docker repo + apt: + update_cache: yes + +- name: Install Docker packages + apt: + name: + - docker-ce + - docker-ce-cli + - containerd.io + - docker-buildx-plugin + - docker-compose-plugin + state: present + update_cache: yes + +- name: Ensure Garage directory exists + file: + path: /opt/garage + state: directory + mode: '0755' + +- name: Deploy Garage docker-compose.yml + template: + src: docker-compose.yml.j2 + dest: /opt/garage/docker-compose.yml + mode: '0644' + +- name: Deploy Garage configuration (garage.toml) + template: + src: garage.toml.j2 + dest: /opt/garage/garage.toml + mode: '0644' + notify: Restart Garage + +- name: Start Garage services + community.docker.docker_compose_v2: + project_src: /opt/garage + state: present diff --git a/roles/garage/templates/docker-compose.yml.j2 b/roles/garage/templates/docker-compose.yml.j2 new file mode 100644 index 0000000..2076c59 --- /dev/null +++ b/roles/garage/templates/docker-compose.yml.j2 @@ -0,0 +1,10 @@ +services: + garage: + image: dxflrs/garage:{{ garage_version }} + container_name: garage + restart: unless-stopped + network_mode: "host" + volumes: + - ./garage.toml:/etc/garage.toml:ro + - ./meta:/var/lib/garage/meta + - ./data:/var/lib/garage/data diff --git a/roles/garage/templates/garage.toml.j2 b/roles/garage/templates/garage.toml.j2 new file mode 100644 index 0000000..da25928 --- /dev/null +++ b/roles/garage/templates/garage.toml.j2 @@ -0,0 +1,29 @@ +metadata_dir = "/var/lib/garage/meta" +data_dir = "/var/lib/garage/data" + +db_engine = "lmdb" +replication_factor = {{ garage_replication_factor }} +read_quorum = {{ garage_read_quorum }} +write_quorum = {{ garage_write_quorum }} +compression_level = 2 +metadata_auto_snapshot_interval = "6h" + +# RPC привязан к WG интерфейсу для безопасности +rpc_bind_addr = "{{ wireguard_ip }}:3901" +rpc_public_addr = "{{ wireguard_ip }}:3901" +rpc_secret = "{{ garage_rpc_secret }}" + +[s3_api] +s3_region = "garage" +# S3 API доступно на всех интерфейсах (для доступа из LAN и через WG) +api_bind_addr = "0.0.0.0:3900" + +[admin] +admin_token = "{{ garage_admin_token }}" + +[kademlia] +bootstrap_peers = [ +{% for peer in wireguard_peers %} + "{{ peer.pubkey }}@{{ peer.ip }}:3901"{% if not loop.last %},{% endif %} +{% endfor %} +] diff --git a/roles/wireguard/handlers/main.yml b/roles/wireguard/handlers/main.yml new file mode 100644 index 0000000..d3b8d99 --- /dev/null +++ b/roles/wireguard/handlers/main.yml @@ -0,0 +1,5 @@ +--- +- name: Restart WireGuard + systemd: + name: wg-quick@wg0 + state: restarted diff --git a/roles/wireguard/tasks/main.yml b/roles/wireguard/tasks/main.yml new file mode 100644 index 0000000..6e9ba58 --- /dev/null +++ b/roles/wireguard/tasks/main.yml @@ -0,0 +1,34 @@ +--- +- name: Remove any broken Docker repository files to prevent apt errors + file: + path: "{{ item }}" + state: absent + with_fileglob: + - "/etc/apt/sources.list.d/*docker*" + ignore_errors: yes + +- name: Install WireGuard + apt: + name: wireguard + state: present + update_cache: yes + ignore_errors: yes + +- name: Ensure WireGuard directory exists + file: + path: /etc/wireguard + state: directory + mode: '0700' + +- name: Deploy WireGuard configuration + template: + src: wg0.conf.j2 + dest: /etc/wireguard/wg0.conf + mode: '0600' + notify: Restart WireGuard + +- name: Enable and start WireGuard service + systemd: + name: wg-quick@wg0 + enabled: yes + state: started diff --git a/roles/wireguard/templates/wg0.conf.j2 b/roles/wireguard/templates/wg0.conf.j2 new file mode 100644 index 0000000..397eb37 --- /dev/null +++ b/roles/wireguard/templates/wg0.conf.j2 @@ -0,0 +1,17 @@ +[Interface] +PrivateKey = {{ wireguard_private_key }} +Address = {{ wireguard_ip }}/24 +ListenPort = {{ wireguard_port }} + +{% for peer in wireguard_peers %} +{% if peer.ip != wireguard_ip %} +[Peer] +# {{ peer.name }} +PublicKey = {{ peer.pubkey }} +AllowedIPs = {{ peer.ip }}/32 +{% if peer.endpoint %} +Endpoint = {{ peer.endpoint }} +PersistentKeepalive = 25 +{% endif %} +{% endif %} +{% endfor %} diff --git a/roles/wireguard/wg0.conf.j2 b/roles/wireguard/wg0.conf.j2 new file mode 100644 index 0000000..fddb87c --- /dev/null +++ b/roles/wireguard/wg0.conf.j2 @@ -0,0 +1,16 @@ +[Interface] +PrivateKey = {{ host_private_key }} +Address = {{ wg_ip }}/24 +ListenPort = {{ wg_port }} + +{% for peer in wireguard_peers %} +{% if peer.ip != wg_ip %} +[Peer] +PublicKey = {{ peer.pubkey }} +AllowedIPs = {{ peer.ip }}/32 +{% if peer.endpoint %} +Endpoint = {{ peer.endpoint }} +PersistentKeepalive = 25 +{% endif %} +{% endif %} +{% endfor %} diff --git a/site.yaml b/site.yaml new file mode 100644 index 0000000..e69de29 diff --git a/site.yml b/site.yml new file mode 100644 index 0000000..6323406 --- /dev/null +++ b/site.yml @@ -0,0 +1,7 @@ +--- +- name: Configure WireGuard and Garage Cluster + hosts: garage_nodes + become: true + roles: + - wireguard + - garage diff --git a/uv-x86_64-unknown-linux-gnu.tar.gz b/uv-x86_64-unknown-linux-gnu.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..963a44718d6de7c61b7b28e5be302d58ff5f8da3 GIT binary patch literal 23838 zcmZU(dpy(q|37|pr4VgqmC9i`SBj)!%vKKR$kkQXMdgrGIudgjcF3VNB}*#gu++QM zm8ew65SCGFIyvMpMkd3y7Mq=3zo)ME`}fD^+wI0)ub1_DKA(@r<9>fU9{1-Hbw%g5 zU;pNhWk-*BBzo*uI_1ATFuEk&%V9%VAz`${S|h9zRqfY zvSVe>r*8kBi^N@DXX5s~dU7r@d-@gZV0=jFliG7nFsDUFl3&eie*87JUi~uIE&2VW=1Z4OlVEPt^h4qv_A&Q|^0t3aZBd)Ib+#^(Qt09AX9-Mf<#y`(qhX|; zz;oJVc6OQX!vaV>f9&VD@1PKIq|&lubv?q{X(5;Wl_l@qWY%7Nd3-YVE`9Xlnd4CV z&FSM~n+%qHC2GI0Ewd{mUHN?THc`_DI@sU#+XuTQxrR1tnL{6e}Ci(cV&O-cO1@xPv z4`5%Ul$pJR^JOj|0d?CfxtL<>h9tQ}ve+GRKiGgPfj3E3?+ z)+IYNP`tzz4N&qR+*Wx-p1f$(%Jzaj=y;YT+^mZ4u0? zgW(3m`3;pwRdkB2ZjrfsRReT+unVbDYSrHy1dp*PxSe8uU5#Bz{a!I$M}uxKHm;rZ zNKxw46%2-065JXbR>@&0RNcDl!GkFx3wf*-WY!RAE{{mz?G)SUXf`(RtmU>^kp;u; zbPK|fOxf#-TOE-W1lk}1j2K~v*)304T3nym!P_~;*45}YP`t%F165E8Wrvuqt69-t zJenxIKR4ZQL)Fm~Tb&35(Ws%^R=!sYG8a%2#csOlS}jWMARVDPl~TV|+@+(jY2aDP zsrXuf)F`d4x-}o=A^xU?yESNQNLj%4Z1eqwd&Ic;|*2zDZJfs$RUjk zZ;%-hQK3*+3JT5b<*d;X*$~nOy9`vY6r8VkXG*Ma9PNz`v2f-}B5>|tEs*JQK*@Gga$})wrOYERqSJjh`+9nRu zt-CcCj$mFH%-111HYDkqSrcv#`WvWrr3iG%^Bd~@#Qj>3TMExdteb+{CN|R1ENTd` zl}GAge|cj~L(lJ#SW2=?6TYSxj9Gx;$%eRnb9?W6dZ1Wmi_hR>PL;qtK~gst`pNS+Mo54{6CV`6OT-gDUMFUk>ea^Hc<2z;^bh%cdu2P)?)!AC;^LU%#DU1tuWo@| zIW*gyvaX(xz?Y&H#qTq;e^BPr*ctp^AvQv3&-;Js0z2tP${#ECJtw;;3;*G*RTsX; z9+*bGQ-q$~{sj=LXLo`1AH4NKpXc{?zoAH&UFEj;kkk)nE6oH1>Rr zfXhzCZF%ynF5v62Q|nEgsCf}Srr`mfKjv+_+S3%b?)I+q*H6%YvR*zr&|LKL`9A!X zivfS)pC=Yn{^#JWEZvfg&mP_j*FR+*X2nXt)9f0TRhZh{UvakOqv_S}dAZp~eKQz> z^@rEp+To+U$SHqy4`wqz3CRGS4|TE^~>OJ;i0vh zJtZNugxrFYr3~xmnMIvvZS+!Q^!umN+y8v^U~x?8JnF)O7G|+`XPzR$R%F+#@at(h zHBerVH*)WYWa{|30o}^1n9dK;cWdVB9AA7PuXsGYa0T{`V{#L-=5AEaB;~GJiZ9g3kYKx&@IoU7dU4olcD$v;IDMb09KQ@5&g=JC;3?+BAGh z+U)ee@=}xg5^L09?5<18hQDY^kzD;1rF7$OnzsuNzHkUbzZ|Z$K5bR;;Xkjwd_J1! zK`&%m{*6OzS&_bH{r90y8^g{nt*E+Od79H)^mQd;`{tappQ2UIKfgYy4n&@-4%qG( z>|SHP()fJo$vs81#cyZ3FV0>&w9iK`Umdj@wi<3lk9wEkN<1B~k}*uY{%vIIe`3P6 z_S>Ci$#0_jb%m##{xW?#@0^Rtun+M^=iMrO%F^_J$73xs@`n|hmh_?9mmm8+4?9A< zqx_UtWn$qTjE`Nr@5#f%mS=PSvJw_Z_dVsmsw$DJ7PPU#^#D$yYo3u18i9%>Fl>z)NSOAW!86lZU}n3*4}<`#xHlBewOp|qb^61 zO+K$X+_rbQ_U6^kwfoXyx^MYh`^jotBCOoF0v*4{``o^NHT6OECd@(<*T6!xxbF}*cr;B}Z-Gd&Y<9jRrhSPSh z*DRYL@3znW$Vdx|qF0li4IT?s-+1u$r(icD@VVjX`#1jfI`Y>2*2hn;^%<_a{&6Xh zM|f^|S9|5_tLFGM=?{yJ>IMviUHhRpyZ*G~WiH!8?sU@F2A-O2@TT=YRsv(ae9;#D zd9yGo`^?{Av#&re!$CdwSTw(d(%L&yuKkJs;Z&=r(f~HFIqt!=qBKqTk z1MFjm0xpF|V1Eo@>sTv`!dWB#3`I>+&Mz$OS;;tiDBwxJw6O_$r&@N8$>5n)q%^q@lGL)G7CJJpXd}?*1v#hnH&&1DrOprsL;h@f?4v>Oa$(bkRl8 zZ_}=7Pq_ROZspf*_Sy%7unJS9rpQS_#=YHNmIl{uyz}nM^T3MerM7|L=v^<4e|lXe zUYpsw;BWF}eDZkp7d!vI=)HgI9z3Mu%G!rnfEz`kb&gE`b6ePTfF4diar4Y$pAzmX zC%dy}814nN56?Z3pS*!HCEI@26n%VRgm6YF(pC45>IzZvCnLvGDx8?rjKOUzOGu)B zgXUj{3GS4p6A20LS3fyW45&q6sS9y>BN3+6cDp^i3o%ZjMSq2}7OUbR#gq2NrZ};|4{YN zMUHS5*o0~)1LZ_3-`uVlPe^haJ8S@b4GFP+|2J#?<#-FT z>Q|n(`e_smvj)=vvJ=G;84B_W$%gKXpp3N-%wK*n`<8H|TRnD_p};*Pw0? zaj$rF2RiL&IdNyN&z`%~q3pC&FL}|MQvH0`r*Hb+(x?Y2_z~>yQDcE3Q|hYFlBC*r z6AzkS?N9u{8Oy2t!zT?Dh`uR@JN>_hhA)ZgqFeB1Nk_u<+56k6Q5G;{TA?9=x|0P- z;KDa%4dLhOr;=3@y%+e>4`v5nt%`tMz+NDTUzHs1Nhhq*Rv7SSD~hfkci`6@-WqvS zec1Zos6lza9fu>D{bFFHAAj9J`7qC;>i%eLR6VR{2bQW?M*uh6$SiufM)l zW4zB~kGOt86toxEt>TFR!?z8!PvX;uK~2akumkt_boK0rE)B`g;^8c%O)i~~u~>J4 z8y|MvZz#^W&~lc{qGJ+k*V$F|Tc3xv#CJ*gocG^IL&BNPN{irx?*|Vq)Nv~eC|Btm zjkr)}9ChM%xcSt8sFo%uPgWUh>#OA{5%t1U`>M>rds--4xfMVa!@Mdo+d0yjaBZ-b zrkr^^n@)(r@4SU>^i3WNqva$WDY{|cP+RU31O~B?9rOllCT|;xqFoeXk_K!CmQ1pme;Cn{WB60#BTFhDcYd?rCmSWxLn&DKZ!_jJf6eIPgTDMY zuEKS~Q-|^Z0WZ{-g-I{AFti&`DE`f;m%OcgefZZecvlItpN;OAo@HNBzCcMj62)vU zX7`3Q?@jo_yhM-~t8n^6Ey?xg`?oUh$XE0CD8pOk)3oECTq3P1W_a{f!hb4t-Hx+@ za1Wj_+N6ZEc<&nlkiNLa1teXmvcwdtk}q^ zMoHcvDRADfc~SjCKgGeV1+@!i*anQ(OGbOG_}`vjmm9I#@ozYr_{D-Z+(obODPI|B z9aYT5i73AHw{Sata+&+{ka;Zi%5G7!>TCzq0KVm+Qb!_*z2p202XD}XYDwOGb~6a~ zz+H0b)mH3e?KS=}xg?VtxHOza;>NWkUhHrV$r$AZ-^{U}dG!f|5EUi)7~D~5!6~B> z78=Bh?)kFVZm2ZDURsT8pL0az@#@b$8*uYg-)(;;u%x?i9^GqJ0nWIr_E%VB_Ewt1 z!e~Y}$R_kFe59AjE&_95C{Z>X=cl&Du&sVNb!&95Q3B|dg(rZ)h%~{?x&@LWqaO02 zr|cx`3k$QVL+uPRkxPt4aFx&G<7cEeyNSoTwdsVDD3-ZTcdI2BDMc=KJ5q8%9WVRh zWpcUOH@F>T0UM^}(>?2L5VA=o^2e59M)NRPe*{_-8op5ZX#A|*ZQD~F&X&P-^Az8j z0^b%dkf_4+vDAp^Oiw$0ox^ARrnAt+c`deS*c5d=>c=r$DBG)V+L9{&jK9ORG*c~P zg{RRx=Sg<`SSK&aqcv$o$TsIvtyy}h^v2hz>JZ5EAczE}*qu;!K|MR64JZ{V(REwe zNa1Z+0=XT*b)*nFE|GFjQ50i2?{f8_kl$(a$D&WJ2#2Xd^Mr`d65}XdxO1am6-#Q{ zz#R8s79`8_)5uy;4}LCa?QOl5bGtIBR|44l!}I5$f6A2lTWATsCf+2aJ5#~r zU2#z!SxN5NHimbBxo^l!XyoXCu@*E!`&jdH27VVJ5LCxTjthdS%hHqH3EAHbm1JJz z#;4V#5HyGmu0dS4^)z!_o4?;LWq?YEdTY^o*j|#E3Icq7`Mc-Sh9Va&1FqaNWmj_!GX z%}?UQBt?w7b((&e!^H=`Mh~ES?50p}AyO1fM)0MDX{^`rxx^ z9e(Ch#?lmk+`}(0(Q{?)t%Y@KsMIEgp z-g1hJT5d7%(_%`2n00tPfYFft;b`bpOaI8A{pnrcV!z)scH_pQrj;&LpWP$E_NA@9 zvs5c}^?`%>Nj>wQ-*BH;;C=7T-&*?b{&d#2|3j;ImB;Z9RsQNssnUHw*2f)|VDa1# zkspKUf|iYpj*i;wP4CrUjzCode#$A6OCGjJ^pXjw>!(Ot*5mBDQye#De^+k8;Empk znm|W(tYVM6JfVi+s7|m~IaHA?1LKhnnxCaFxdSs(iY=12Uq%zHx(A+o8cICtU^Srn z@HswR;D1~AlNNi;lTIL}9fW68#tS;a3#sS(_hNc~IzM306a~HcxxiIFM) zL;DFej>vGM+6yOWu}oPtehg75+i%F1NZV!;SB+Od`y*BKG+*C7#qxS?ElQ7bj!=+S zNi*41?6eepfOQ4iDWOpriMOiD&By&&kGn?(Yk5yTSwxWJtbD)QiY-!-K72sLDfYxv zzbnnZC<2Q(Ug&?+lujUjf8X`0*Jyf8rBKoHl~>%+N;{0YC##W#`S!UvZ0YK^pn8n$ z@q$?kW|9xL5gJu=hmA68Z}s)c-dx4@u~P8u0oZ5CA3TdG_vQizm1!UPMS4kcbIx7sAtLu#6aX<;_(`ayZYjoPW*=c>`}L#MGS?n`*q zQ`69^8C#2im^RE)wjzLir3bE(rT0$1@fy>ofsY#`zG|~YFo`?DKsr1lyV(rz-V^P; zijaKs&QrUeg*@;mF;pJkj>$Vpq7zh2Ii;lF%ZZUbUqj%zGq2)egmTss`WDG=)AJ;Y zWFf9@ukkwR;kknNgS;{k!a?kwf|ZQi`B*ASSC~i2;wmz;bPEx{x4aLvDE0)jx}x7> zWCOzWeoN>s49-ZHQ~(J?2bFF{(~E_a-k;Q)9g?_1Txa>Jq9JmDA9EY!q-ca=zN+X* ze@#WU8}%B&G!)Egx=(gnXtNKu$_#g`x%R-Ae)?h53dvZ{1F{!}o#<;Hy&SLpB&l7V z)s&`YE)ynAKw@a~aQed#0~zn~w0rR>$M*vD4x)tL=*?}A5gzmsJCq{z75DvlTW+EF@nWk;884t^I z!^kd3*UexEUkpn+s~6!g1-JKxEf!=b-`i!S%FN$E_XA{>Qw#zSro2cwLhcr{mq&?D zpMsX|EXY$}C4*N-t9D>VIAAE#T*0zGJGa3+`3X^v^WYU4Xr?{3@}WaI+wFF2gBh|g*r{k@qD*8!mzYGaj(H8jgGPwG z`ACF-KO>uoCOE}h@>Ad3i3u=XpBw9^G=uPy6`vww z6Iniml{xT(`p`eq*}ONeQ4;Y+se4NCLvDJ`;`BlX20J(EBk#+TPc{)GEmp13ib7ad7-?PKmqO1R0&Ujw z#bYywa_mn5*tq>ag}>e2kDX z9Ch~TL%(#Y?QO-sjAY42PnCaTA%9YzwG^)k4s$G;Mxvhe-|W3Qcn~hrZo{GB_K~GIam5_ z?Nf{yMA~nhHkW*^6VWQq@Z!BN4YOsH`EJx)690ANR?O`@WyYh2CbnF_& zZ^I~)A2AHzQ9*xPHhECc zJVGJ4j?fw}7?MA9pX)3Q&T6_rkdiZOS(7d}z^xL+0eoG6uBj+YIJ*$VvI{hlvub_v zq$iYNQzpNcu@ma0j`1*a3IFN|>?h0MsWhd|UGi4U>*dnmVkfHz(y`K1lkIIEP|;aU zxoA%Q#gGuy?S$HUEj#P8le3Bl^ zNYqTQ7*7hsZBm;rb0vY`Xw-m25!@>pdR|xS(5m1%iP||{FiXBZ5e#T^wgT@lQilWe2!M5-qlAo*KUb&<7nTldq1s*5v+JN~D0_*9eYb8zVS1jlK4vYbiZXhy zNWJ&=v0c!BPOHp>le@D#n`Y}*%B=Uhn(@*_mj9Vjz$Bxl1kSdxm})bu1>ZV)OcFOq zY6bDkAkYNp?9YWw7b=w@RrIZxBwSsW!?+%Q78QPmV(U=?e6^=Xz~gR`Eg;lDr>A_{ zykN2K)NH0UVUA8CaG3+SBvrJ$mSLG0T zsCJG_dj(1RI~(v!&wY$5if4m!nazXPgwJPLmg4q!!)|uurJJ1Y6D0b5IU|#G#~;7s>g}tyFq;gE7SH^T zL=C3T@f|a-9EpsFffCZE9lv*IV9MlmTgWAmGr}Qm3)?^Bb4ehjxHWWj%tqh_nsnBn zj83RoZp*fyrr>J^FqIn+=r%$Pf#Th+a2~GvP4e>@JCEErP2e?NCrI7e4$}lUM!7l& zpeXwVrJR(4Mj;$<7nKWGlcelxgc%P!??1aStc0}|Q$5NBj2Hn5=@%7J1?`O2cn;VX zX}`~gXNWmEM-l~PTF{sj7;*AHtpw2-irrfJGpx`_f#pPGJXEidk@acL0rlg=ceN-_z9h72%4Ul4C4>9yA6qT|a&mIViVbYRjcO7_N1`R@ z0g$zrs@3N?7@#u_YV&d&s)JCCpoS>#5okLW>HI2&c4D@}77LFQgru7=NsmH?s(U)? zK-E<8dz5ge8ZmX^}&QmOq7^*`7U|qudWCy`G=F@^M{_A`K9$Qx9P0FdF zD|U?i1PRwsVj|o^;;(3?9s@IawCr(P!stYR( z=#h@~?>AUS2yh_Qqd2+H=YpnXRdu6%!KbDwobT36pK^th-;4}WzCQUhnmD$QW%)Ut zmXr&nG2%pQd&v@!+g0r30NtJ6>eS)aE!Z}yB+cK)0D9WlsjmM9JhEI|+n7Q~m1?|3 z{@BQtEh@2~q9q1g+jX=YCnF&0VYw;1EI5MPCol9T}8wu)oh3(p(UosX!?)W?f-eoFXF$H_ECt?eMD# z3g@HU_u(vyibBWF6gvsjG_D>f1$PhFPrY}xpf0U68m_1Web_Q7{HW*s}^G%fd5wiTmDA9|_{K}+;?&y2m7L|qI7G=gRAF4N)-k;@Z z9dn{ImHVEu6NH7DA5nHo!# zgLiHGTvs$N!jw@p{Q>)?&~q#E8TY&CAjcd7Ze+j3!w?eH=|H+3l>QKP*<@p}6KD=c zKshfQ#wM9Z=Ym!eZT~QErWgH6%}&xN86E zewlv?p zpdP(qvW!K-Fqliwo4^n)4a#-XjOAU!j94YyizKU%hozo_EckAIgeP`ftZ1%~#OH zAv6V;sG+M9D2Wb@Y_Kf~gY3OvAh}vb2Y^Ec-VoZWpdJ?0MWur5v#5{;Lc@(!=(&fO ztc0mO`_NY4`EnCJ2(ziM+6XI^;4T?d)fYK8&{%&^vq^rF6`#&(3LJR~f;Zh+POgoA z=t40aFN4E?cMz_CZto>MoGa9>#y%M+o-*Nk_M?BoV+Gd?LYNDLt&J3$agb?%d{AY^ z*bTy~_hLe{b#yMso>@%=vT_pE=fxT8uis2Z&7i~7>fUci2gyMHOz2eHg1N=Q@s)N~ z!KSG~SyP`TY#+`AxNdFCC6KuRGx8_-1gNCqHy4d~bmfC8?U+GFJD64%8bVOvLw zVI@&;X>I4wl!>aTAN>LzFE9Z8T1{ntQ@_S?9}m}8=xGtNu+N_8dk}@zPZv~iZ>F1U zx1a`&Y_KsqcXj&M5M}N78Lib)IDK+h|>IBDgGWF$V$G4LyEpwps;RQ?Pv9!rLG`<{C?%T=>7F0A{;g zSREufNAH_lw0$Zr7Kj!D=SL#^bE;$+cI}Crmj1E<@RJ+cQHGVAv<S zRiOL<;iUwj3tBu2YF{np5!5wpTLR}CX^ARutxcQJZ zWs*1n^1gA}J9jae8Jr}4ke@`G8wfBI3 za)+zL^f?%O1u%Fq2Lo1_w%Ozi&?I#6ZXl`7iAGD%$4Vo4UAECJzkI(9^IRlEYV7vm zfH~7R*VVc0*vhT5(DMpme3;1U<50ax zF{N(QfAfMmtRHPPff8J4cs6D75!~o|!&WGXb{wBZiupLmZM(+WKoEgs;LB_vMuV4L zHd&d~bXhIBB>fN-0Zk6~O`HE(M8#S{-7i6ve;eNCiE5AHf z>MbI~!z7X^69u~l52P3F7k%%VjUUPoQOdx*_Fp&K)V)!Jnt$Dlm|W{!^MEz!x^umX z>rDbi)irep0okAh#1qRX*XSia9=2_YQ=DA`v@qx8?8NF`%DQpwYB%b?(iAW#YqIh6 zK|tDoSAi%sOBJg_h5#cNSy1nHoC3xG9Y*}`FZEYmh;d7&fl=*amVqzbZz&!!2|h`N#{)e1 z#t1rGKY-MQ>02b~cl|Jj(pqFcn)R>h1pd5XRnc%#%J+1j8~-Y{_zHhM(dz$#v>TUs z1-ux6E(J+IFy`|1^+6>*0!n@;A_Fg3{pyG0cwo>{`fTVAbUZATTaDk5P&1Pd#-H9o zpfkj{Wz#_VTl=dM0y>XVrAUHAulvQ*p2XzokJUEpnm{?Zc2)>zp+04c}-n= zU#6{X&96pBd<>*0pmhFqHyiM?Z=Aq@@k^l+D|H@;fmuNB`LB8n&}j${K30aB3)qnj zNc87Gy6B7jMQHoyN?(8_2EX$ZvJ#uJzYiTlbFLcD_lpvAxW6s*jJXW-p-7p#3rZIP zl^&o`4_naLXL!RFR0`KWzyX4qGePu27lCY;d|wO-q&e^ZbGT$qtnmZc#Kx>gd9&m- zeym^|lq_?)(=4_sWQ|JZO-lR+(C9B&+A_ivH8ch6whuDN=2ku({=3KZC0FgyO@q8h0mQc(V>Z+hqy=(9X* zK?(KK7cVeCI-EC~aH^CUftw93?S-DZFqA7j^_D|Ghd^d|u8Da71Z+?ORn-Q>KkD0T;yAZdA?pDHFqiDSHBRLCi>3 z0BOp=6{5i7Wc&6r$bdwXmydRFMZxUtdLU#K^j3G`j>C$0akQrh)=LH6avZ#TH zq9KmCYg3`8NFUUhUBj}dg^eJ+`G9mcmQh_R52Tscu#8%Ym!S6m3$%nbqlews>kU!X zjMq8=a_0Q2fzRXt>7)~_FC798)53wfioSEqErRRK1Yog|E~9~tm@1V#eUp4t7+F5A^eHJm{{-Jnub zFOix9u?fEKe{8~unq!mDAZvGaVbdQY*XCw>h6p_~_sI;bR9I{I&UHm6RjLeAI!2&|+)f$=0kU_7k2}Ul*g1ZCJ8y#&)#=x+gxpv{wLUz(#CAxwlI8$oi~11sU@GrQXd!72sjXL?CFuz_ z{cKw>Uw%O-ar=8srEIGzc&TJ!^8+jr>r+a{;71u7ro;H?A7I}iDR0u3rW7B14t4Qm zPtv%Tl})%I*@td!iCCEdh$=0{(!N>jb1vRVJ?yT4p+PwS z0~dJC2&{JBz~QUh8|qbDbBVs%DNNmXHr|VgdGlFNnmT-P9dQ{;%~;Mr4mh+_j1Zsl zN=hkP$o_?d6j4Z98uyUA00}|dt_P5m+#sntW-32R6Xft^tES_`-MMV0YTQWPJd z2)8F@_HaLafU3=gKc)dYUY`|gfI`(x;1{C>Z$s>4O{(ym-nYb4+c3=%pt)9tYMPXK zYP@$}5uLfaAA6Y9lyudPLHLbvu8hjPK=|q1Mxi+j9P6C*2Nvom{Ti6y+=4Q5eG`7v+W3>gj|*I>%Rom#=AUqEP?b`b^x2P~Lvi5n50!8s_R<OGW|4e*Ptobn)MTeGmhm3Yna z93TW?jx{RZmQfZl_Ls3;LJ;ut*xQKmYvJv)s^0(rtU395{J4UUMU2Hl%!O&c8M=Dv z=8cLV$f{0m4XnT4MDz>(RRc2=zNGw_W+(HFWZ-y27cM;~WG*^^s*y{$s0<_xISnZo zq3UeH5dp;V%-HQYldy3VHzCEf%YNT}KdD~OD9Dv{-5P@?wAmlh2q_6cttwC8{LCO| zM3b7(zeiqLZ6>&fR#LeO1Q}5$S`~sLnkHA5$TF{@ft)!4uq#bcvfOJlJ292RI0-*2 z7c$_USDQt<|Cm?=(7&MbR1(Y64H6`ph)AQAM>L+8=BiDrBIvRMAf#)^$O4!CL2j4JcgLOgc4z^E+}SU&a--g);Qfx3)=Z!wy;_-*S)T{4OM zydZ#h9(5KjWSyvww~trqJH#s|Hr6i?GFa~N34|Y*p5%wmoar3NHmpe^c@^p70bdUAT^;?}Z^OJu!l0xp2uSk=w z5H8MM_rqX-e>%}~PLjOJg(zPposOwP__KceYG8v*^*~r50(jWS2cS=Nd@i@lABZqk zGb+z8pb?YvbsQIg9sqW*8ORX=)zLQSA~&U~9<9I$d#C-%fPQrx;=KjfAT0rJxkqVG zg@6(uQd}^e5_?T>9lsSi8vyNTqg0tCB!=7@=7WR--R>>%VtGyQN*StPyZU)Twr0JvIDnG0$|UVkT%Uc$?lqNw+61$5A#vOsXP3X3n?ZDh@jVESotgC;1wRp8X1UOL9A=pmHQ?YdH^sAr`awd- zGt|g;QsJmHPMuwq1L9!XWuP|@TH6NIPtEk07vYwIBH}m$vI_2=MwLN^0O8?jV44c_ zoSAeZS;Y9yAaE zmLXX#Xg5zW0>2W5hz|&;#&1h^ucmQC8n^Womi(r68 z{?#C8NRbcHL`2sLS0ICV67Khg=MYr3r4+;RXS^hq9l-RYDIiN?vcS%e{~;gX#x%o! zO{E?;37#%!ak4BLB5vYiWKAlNv2kJiw}&@C;hK(bqw0lijFSUl`yHV+%I(>Vhau-9 z>g%E=MSqTM0*&)hk*u;ma-dwZ_uV|v%ae$Zv&W|LmAn|?i*)Uh+a|yB+jI8Tyk_>R z1f!%ick8&lwUbF_D9B=`BRF}%bIr2{vKBHV z>!o!|_Ju$U_3`N3f6r{~#MJeSZR)dU`T=QPTxP)-`gVd?^KNd>ClNV-+JR9I1^pVz z2cxvj!2PS9b>qghS-Y7so7#7UP1n>QP2^E7g8?Dzr?M1bdC%ENDcG(Igv<(17k_R0 z;3NF=6$`+2$eczu8LS}UNmgJq8?~Fb&Vm2-X8A^e+diJPnF<`e*KGgq$t|ke%0jF} zOQgNKEKaatP+>`wYPQa#n?%nfd_FrV$`#hu=R>|k`OLjNxFLmrS3Of{6%1sH{WFj* zvupQQn+r;OI~G$Ba*L%FF-|LVmFeQ(@-rt@kER^E-m;qX;+&)={44GuM@P|t_0*vt zzGj|{fJRtQXeK!(JJ*I`5HjYDj>S4Si*&7~hGgF_P2f*_%|~$0FsTfJ`cp`r(5Dl6 zx`MK{45Cxp6Lka|h^c6>E3;Hs|M_zgFZ#cyofb>A%h;l$TC7RQm$_||Bw}p35jwiVGpneialw^sCa4opAp<=A=-! zRoy_)&1xU#;Wqe?>|>h2Q2;5?l%vOb|8?XbIO`NeQMft*x!qdiK#b_N1;mueTEAGeogtEVbTdB~8&DNmUFrB{dsi`|CtR9}~(owjt`7)$ErB)Tv6L`hL zW4kIse&>I1aCERJ8VGN$G?Tn#IGR1zw4SJQHvlIt#+M9-Tg60!vkh)=~sb5cFyKklUHmI-IlDi4nCqnZR9~0PYhVcY%gfyWo{ZalbnN| z_J8H+N+t%n%G6J^82F_6OT3HbW|5F*gJDCk>8Lb2A4`4nJ5(%LsLB?*kWOR32P`!lwW9`EzXBX+&3=59ktXMY zBT<^&;u~OUFHYMWSB(yzRf!=hZ34&IOl zKLiGOQPX;EJCOoTWx*FRkRhGh!?&q6e0E4j%^xtptsr`<^v_3bm%c&ePrjltt|T(# zTFkwwMdAzc&4Z?V-U4`ff^1XoR}j8+2NNCIw@Y5UPozhhUCtq8kR1mMK%1}A<=DxC&*wExCBjB_IH zVa7Xv3avt9j2$A@9VhH$USO<|>~65*`(NO8<9?pu``;z|5@(PZ5Uc#9njs(AzMp5{ z(BRLi4_896PU+hxpxve%RpKOW=Rl-fn1om%p#mJsxhVl>RcB4ek>gT*So7QPi7cOP zk)z}zheD$uG3Mm2(AmnF_#H&vvQYtR`0ZYB{;N&o$h4YLe-y8goIFlwccnNHIj$6E zVuLCjcSu=bF@Sb5&7bggmV`sd8v(7xYmK4qXQ~o#{-7shx>$RXJXA zE-;o~R!5$yf>Nh3k;VfyX6|3a7YGt!Qw{4qWi!U2i1|irCi(f-CEE$XmrL+&zhi`5 z#Kh(^otjK72Q9{;U}>Ca6Z^yU|F4a!k4x(A+iQyEOcALuGa=J*&E2W9GAF{a%$5~v z-uHUZq~?~}YLJc!8%nf$6zs*0O@qfOfrExk3ApFv97ZAN_6B9Wi0z`^gZiZ>s8|gW1^ZM zZ18pL{N0O@_*w#`uTeskA>6mv|3E+7ZP@|#{=Y{__Y%NS*1BYx#e>DG$h`B(^qCNW zv=lslCHd!?g&GXgm+6MOeAG?C4k6Z8<4XzzB33*%5?!;~TgTAj$f3$O_FL#`Ynt_< z@wzcn-7IS?$+muAl^Vsy73xBDjBw-2!}R|o6$~{Dd3MYNcYR4q^5s0WKa^BsS?S(n z{m@!v3{-CvI^{P@GOVkuEyjz+D0QH^PS_`m!#IW*`q#-bl`-sj=m*vutJwIpu}~eZ z&XzZp%w=!1ZnBmuQX7t~eh8>g=LVtzRSJ=Na~Z?@?h_aUq?U^ z{jZZ4x06xD=Nrq|Gl-#@58ImLP4+wx2KKUJ-6Hl+wF7wg{$-FM!a+hfS{o$8Yv}oC z8k!R@Y8V*8A?&0v68vOm5GjO4{er!QT&k%t`yZBwV;Yi_Ar!EDsJZ`G_elj-A0io# z=guE<(|2gL z`ZLLzfMD2a?JxYQD>Une&pSZ5c7HpMC_RLfnUmVlC{Xgx7X~>-=Xs6)fDz0l!{EN> zrm8In$bO$ z4qSm2y9a()^@c#i;ha^8C&Qc>)QjTNH&i&RX1M_G-hRg!Xb&=BTi_aXGiJh{iDS0% z;FA3SJHLVz^?~#mXgw|u)Xyiv%Z?~0zqnuR^_LJv-49H~kqrmYU|FkOXlyj%)u56I zlZ5ioV%s9*=@ZRnr!FQ}Z-3LKTY?0c_X|xznn-J7{uwDx{T+8b`(APHN6)zjud4!( zH{;1sQgW9SR|sV6iPiunK^d(l-vc>Cn;^R=_U2_KlCr_$vnN&cB4S7Cck8$so0Yo^ z$-L2Oe+L;>9S=viDQ*5a-Ysoe@I&(q(jK?7%RPoedYx9XAHrj`7S=%xnFtq$_fpEz#6sSHKZQ(E$PCnJk zV-Q0G!*KddGI1*$oU!MuI}Un3_;a-cN;`8F|%9d zgiAwn`5AQ#u{#b zw~gN91~yQFCl)^1+~p`FK;~mz4x`flO%sp)Ws7FD>uL6j zTSHdOu!WsH1qMy4pu8RvWX_~5wH%lSRvP@=_EslV%w)?B+|FNsrdem1tn2N9AY1si1e2EjIT)6n1#R&m{r68FDwlCz0<-UoC5=1&drQZg9? z*Ob;W#D1z9+vyA<0yI&zB59ka^mpJp(evvkJeCz;UXXL@_jR0RScrG& zWkI641JX=x`D9NhcL6Fyu_H*D3sZe&qSSk(nkDl3*~+G5lqu1~#UL_O==^rgRK5ka z?-SI`&ZcPo#AY^QAc>)0KvCYm24q;Ny-z!!!EXkl;Ac%cZOyx2@6n+f5O6D(T_Qirzkf0kNa;5rLMbbn%Koa&nfUWG_A9&h`Gh|H#Z zd{!2s3gAX_D-Lz9L~BCnt@-o0-3L86=osHL{>`$P>_3@K9^hxlV0xrTz|W3A15;8f86 zq_zgaxi7M9lrZ@I=`QrjT%xx}*>T6|b4;@_=L`L*70QXOjLs4nThD0Vtp|Jr1IY6x zX%)*i#cmo$9hjCRephGTTb_vx7$6C(zz@+IzZ+OA&D0=q}ev5TNJH^iTB6 zwK}amcF1+x?yN2A1g66@$(dfspo zbd+CG+p~bc?Zqy}CyxOy7C$+sR&fl_P&?=kM5!X&ug^O(Z{v zaN5;%O~RhoeDAXK2Z>m2ZKUa1;$kDEbLG?e4%DUPqXd@fS4Fdxx+6j<_z9?QFL!X> zjy;)5oYa*+3R=Gl9qIUm*7{22-6$XHmgcu-KCJiG$_{DAGyT`>?P zrNWWGyQ9zRv^3bo+JXh!sr$oD`^B=6dQ$XLR4cY+XD>)Y;hVOO;c}`hsXB%GrhGH=iB%n1H3-y z2y+J`GhUYCjiC6?R%UQ7tw7un>ast}9kcNtqkYpU1SL*s_x9T44y&#LH2K4W3(CG? z2UBJOK)i?|5iu(XIOeyBLnDt$PTZ{uk=xFlL?sE7PG5S6SF*8s@Zk>+~^U6`Yqm_dLj>}VF$aFJ#2|}T04tY+ZfvwGgA5H#D zp{05{5l0Pt7oqC3>pTODjcb&W;-IQF)`BscK%rd{nVTP%?aaZ+`z(nYRC5`9)4q8r z(HCipUa<(CxhjfEUq^yeu`6|#eXfBtOHDM>B?Xo2$-?qB;H)8gE)V==tZCGDYsDNx z+cMxI45$U8_@T-0E5WTLu;abDb1e&`?pAB#-OWIr@J)^&qPtJoUp)h8^vRZxy7foV z!-iS&a^n!G0M?%(#oM^Rt4Q?T-j(#1ujXAVFktqV+vZL!C3-JVqlpx?azagvwC~LB zRQ4Thy0-x=PI@f4qT#S2wc?|5dV%kkgpNEXj!|0*arSe{ty%$4k4bg| z&xCw%q*M{HF>3>L9;3qq1Ubn`+(jZSQj(^t&;a$!8t^iu$!XkPv-wJJ`>6{*IF@eF zj3{~@-L4-5lBP$Hnf|R8Oe;Ukj{=q^Cip!T*uXIfgKK4q2wLa{YBZzc!rG_h;0aH5 zDg$lXF9YTlC_jMK9H^ZaB7WNXWPzo6N9yLDq#Eilh&;~YeJyH#gzcy2#Lw9OTn zJBQIb;R8RpKQti^E@*hCFEG-q+izB9+;n%G<6D8C^y1wxAUK)2DC|Rn^9jj7{{`ez zx87yVcCSH!b_u*$xOX;SUw~dC^+?6h`c4Z^P6R3-0T7Rlp9fA9d-(n0G?t$)1edAs-H>avOGpy z`zfIUONo>YC_ng#GQ`Ak7Z>3&04`1TgzHiDj?k;;0zq0=^$Av`u4*=+j42ccgmB3YzOT z<1{3(y@Bow5B0t~90hMY&;hA@q#@pE06^y(!;lnpA?!FnfWoV(i0Y9`%=~Je0In9s ziI~&$Ap$>z?WkmqCWth&TZW;IH$>07O$-Cz<8W`45o#=5Op5LTc7> ziNM|a38fCYcX~T9P5JDMChF{|z}f_4HsH2G?D(twCjo`I5Shb&>$0UvlQ)Ah5+uLI1YALzZV0=JbL zz4x`h(H_wRQf6C6ql0597LKhKW@sq+Ml+Ib!$$?hWEMV6YXZC8CR)1l@62&txL&1| z&|DHr!XV&BK1+1)pEHNXt9A{ICvOXuU3@V564fq29&1saKQLwGj+WbQ;dM%zFN^X! zUNVipA6?1jpyE(R4rBx z6!-5$j}-AgRhaH^{gh9d3WG%%Z0!3$w+Q+4I1a8~3(S~!gEeO!5~_^|k(--AsQpCa z05_RCMB1>ewk${%61Pa-MsDa%_WHT^vu9B9se*W}+Adfrm@9P$xc3)XxzCO`2*X-h zv`m#qo(pCj0L}T4x#u`dTYHx`O+s0ZkB7twcA}+n?Hke~Bf%w2z-i#B|Ji3P5t6-F zU6@0F496xAJ)2G$r~lZi=ondH1*;nZ7ErlK(i)9!s#fzG#2<4QfVOOn!tj2j4fyxtIk% z8EF@!D+PF|?V+x};S2a*ztv<6)nKKLTtG}0IF&3Q9^mdwy~AssaRo0HmFD2c+U-c109}-cRILnQAB2$WpiL|D0OUU4t;t{2p5#ZPm%zM zc7I(ZHc%f!QIi2Z7tLPIZAl)IPt|zYbG<~LrE^}j&vfv|s`98e#0J~!L$+u5C@CjDfU@sM)7C?u^{u>i>63_ZD!{6mfe^v3i`oTIu4^}D4i0?7pnf@YyD?K& z5soWJVT@Jg=|rG0Ij^B4Fru?>YM0C$`E_N}svi&36vC%d{WZ;aZ%;}WA8?j8j)2Z; zimJKZ{}(M(s^G1EJBrA#7oNfb`Zk8B<2oN1P8Qvz*4?75<66w?q=2fayXlt8hQ~?d z`y(pbKjq%z3b$vMM8R9MvsIhUxd%R$9Q3B4vgzInR_c7dPj~g73{Tw@!=t|kG?BnY z>stQfiXB1;CJrMD0GG?Y*uh8Sdn~8NKN@w1?s}q+!urz5JO;Be`s=-ggvqNXu*>*MjgC$#s{ z84!ndixc1rPWH=@p=ro)E|+{HaD&P?$rN;rkv3Q` ziP-U6Q?8b*9?$ zdZ?iP`!|>v+RJ4|dSbXFRVa56JBn>i{yS06WiLSg4@;-HP}1F7$(&9M&;#-cM8nH# zcEPAuDgK-MgA6?SwQ<&ZmzmjKvfTPn$4fF1qTBs)=y>XE)A@2V9Vq9ytGERRk|jNm z%v;o%h;c|k6@dF$+ocQHY2?N?OiN&WW>B2SUp7TfZjEcTbqY0N)idf^!DqhAR6~~! zY)VtbqNNH}RJRk#188pBVXlaI=Hso0(0^?@9h>eJvV+|7nU1EzNl>`;>$?`0d7spy z>nVd`0XII!G2aQbX=l(x`9>c&VJr(S`_=$hTajggSxF61y=tpE!?qoN$S`9T3$kaA z;v3XjC~jYr9=pQzl=iXbJ=Yk|T2l`=ecH{XTb$KXH+&x7^aolMsGm+$9&f*3s&YIl z68Y;5>w=*&CiRPv!qa9Xw?)L}JqX$<;3&5$9dT2==XkRqpr9!?>G24o1kgU^MUM_k z6rLkZeV+BeP#u5a!RXpu^4GPsM@K-lYbG?xwfqyDCiPLBc4T+zjj4W}oqCoO=x(`7 z+SAPAf2}=aDLf{2%Hk(6$V_e;`JvYO;p3(Fk^f0=8UoSx`yz`0AcoXH(@ymYnDC(F K%%8+<%)bE)?po&n literal 0 HcmV?d00001