From d31f29d7671cb7f48bb881a7337d33d010f596d5 Mon Sep 17 00:00:00 2001 From: Collimo release Date: Thu, 22 Oct 2026 10:28:55 -0700 Subject: [PATCH] Collimo 0.1.0 --- LICENSE | 10 +- PORTAINER.md | 377 ++++++++++++++++++++++++++-------- README.md | 226 ++++++++++++++------ collimo-icon.png | Bin 0 -> 144456 bytes docker-compose.backup-smb.yml | 2 +- docker-compose.hms-docker.yml | 20 +- docker-compose.yml | 94 ++++++--- sbom/sbom-amd64.cdx.json | 47 +++++ sbom/sbom-arm64.cdx.json | 47 +++++ stack.env.example | 8 +- 10 files changed, 633 insertions(+), 198 deletions(-) create mode 100644 collimo-icon.png create mode 100644 sbom/sbom-amd64.cdx.json create mode 100644 sbom/sbom-arm64.cdx.json diff --git a/LICENSE b/LICENSE index afbdf20..7110856 100644 --- a/LICENSE +++ b/LICENSE @@ -1,15 +1,15 @@ -Ferrule -Copyright (c) 2026 the Ferrule authors. All rights reserved. +Collimo +Copyright (c) 2026 COLLIMO LLC. All rights reserved. This software and its source code are proprietary and confidential. No licence to use, copy, modify, merge, publish, distribute, sublicense or sell them, in whole or in part, is granted except by a written agreement with -the copyright holders. +COLLIMO LLC. -Ferrule is distributed to customers as a built image. Running it is +Collimo is distributed to customers as a built image. Running it is governed by the terms of the licence under which that image was obtained. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT, EXCEPT AS A WRITTEN -AGREEMENT WITH THE COPYRIGHT HOLDERS PROVIDES. +AGREEMENT WITH COLLIMO LLC PROVIDES. diff --git a/PORTAINER.md b/PORTAINER.md index 739d7ee..ce22e11 100644 --- a/PORTAINER.md +++ b/PORTAINER.md @@ -1,21 +1,21 @@ # Portainer GitOps deployment -Portainer reads the compose file from the public `ferrule-deploy` +Portainer reads the compose file from the public `collimo-deploy` repository and pulls the published image. Nothing is built on the Docker host. After the initial setup, updates are a single click — or zero clicks with a webhook. ## Before you start -- Ferrule runs from a published image, a built binary: nothing is compiled +- Collimo runs from a published image, a built binary: nothing is compiled on your Docker host. Portainer reads only the compose file from the repository. - Portainer must reach - `https://github.com/ferrulehq/ferrule-deploy`. It is public, + `https://github.com/collimohq/collimo-deploy`. It is public, so no account or token is needed. -- The Docker host needs outbound internet to pull the Ferrule and +- The Docker host needs outbound internet to pull the Collimo and VictoriaMetrics images. A licensed install also fetches - `https://license.ferrulehq.dev/revoked` once a day (see "Online + `https://license.collimo.dev/revoked` once a day (see "Online confirmation"). - Nothing goes on the host filesystem. No bind mounts, no config files. @@ -51,21 +51,21 @@ console. The image is public: Portainer pulls it with no registry login. It holds the built binary only, never the source. It is published on GitHub's -container registry, `ghcr.io/ferrulehq/ferrule`. If it ever moves, -`FERRULE_IMAGE` is the one line that changes. +container registry, `ghcr.io/collimohq/collimo`. If it ever moves, +`COLLIMO_IMAGE` is the one line that changes. --- ## Step 3 — Create the stack 1. **Stacks → Add stack**. -2. Name it `ferrule` — lowercase, no spaces. Portainer uses this as +2. Name it `collimo` — lowercase, no spaces. Portainer uses this as the compose project name, which also keeps its volumes apart from any other stack's. 3. Choose **Repository** as the build method. 4. Fill in: - **Repository URL** — - `https://github.com/ferrulehq/ferrule-deploy` + `https://github.com/collimohq/collimo-deploy` - **Repository reference** — `refs/heads/main` - **Compose path** — `docker-compose.yml` - **Authentication** — off; the repository is public. Turn it on only @@ -83,10 +83,14 @@ container registry, `ghcr.io/ferrulehq/ferrule`. If it ever moves, Scroll to **Environment variables** and switch to **Advanced mode** if offered — you can paste the whole block at once. The contents of -`stack.env.example`, with your values filled in: +`stack.env.example`, with your values filled in. + +A `$` in any value must be written `$$`. Compose reads `$name` as a +variable, so a password such as `$ecret-pass` would arrive as `-pass`. +The setup wizard writes the `$$` for you. ``` -FERRULE_VERSION=0.9.0 +COLLIMO_VERSION=0.9.0 UNIFI_HOST=https://192.168.1.1 UNIFI_API_KEY=gateway-api-key @@ -107,7 +111,7 @@ Everything else has a working default. Once the dashboard is up, starting from what the stack is running with: change what you need and it gives the lines to paste here. It never asks for a secret. A credential from elsewhere gets a placeholder to replace in Portainer, and the keys and -passwords that are Ferrule's own (`BACKUP_KEY`, `SETTINGS_KEY`, +passwords that are Collimo's own (`BACKUP_KEY`, `SETTINGS_KEY`, `ADMIN_PASSWORD`, the database passwords) can be made in the browser, never sent anywhere. @@ -115,15 +119,17 @@ Add these only if you need them: | Name | Default | When to change it | |---|---|---| -| `FERRULE_VERSION` | **required** | the release to run, such as `0.9.0`; `qa` for what is under test. Never `latest` | -| `FERRULE_IMAGE` | `ghcr.io/ferrulehq/ferrule` | where the image is published; change it only if told to | +| `COLLIMO_VERSION` | **required** | the release to run, such as `0.9.0`; `qa` for what is under test. Never `latest` | +| `COLLIMO_IMAGE` | `ghcr.io/collimohq/collimo` | where the image is published; change it only if told to | | `WEB_PORT` | `8090` | something else already has 8090 | | `UNIFI_ENABLED` | `true` | `false` to watch only hypervisors and storage, or to try this stack beside an existing one without polling the controller twice | -| `SOURCE_1` … `SOURCE_8` | empty | a hypervisor or storage system per slot, see below | -| `SOURCE_n_SECRET` | empty | the matching token, password or key | +| `SOURCE_1` … `SOURCE_8` | empty | a hypervisor or storage system per slot, or a list of SNMP switches, UPSes or Redfish servers, see below | +| `SOURCE_n_SECRET` | empty | the matching token, password, key, BMC password or SNMP community | +| `CHECKS` | empty | up-checks for anything with an address: `ping `, `http ` or `tcp `, separated by `;`, each with optional `name=`, `every=` and `timeout=`. See below | | `POLL_INTERVAL` | `30s` | values below `10s` are clamped | | `REQUEST_TIMEOUT` | `20s` | how long one request to a console may take | | `UNIFI_SITE` | `default` | you renamed your site | +| `PORT_SLEEPS` | empty | switch ports whose computer sleeps, as `mac/port` separated by commas: a drop to 100 Mb/s or lower there is expected. The slow-link alert's button writes it | | `UNIFI_OS` | `true` | `false` for a self-hosted standalone controller | | `UNIFI_VERIFY_TLS` | `false` | you installed a trusted cert on the console | | `PROTECT_ENABLED` | `true` | `false` if you do not run Protect | @@ -132,7 +138,7 @@ Add these only if you need them: | `WAN_ENABLED` | `true` | `false` if there is no WAN here worth watching | | `WAN_POLL_INTERVAL` | `60s` | paces the v2 endpoints only; floor `30s` | | `WAN_DASHBOARD_SCALE` | `24h` | `7d` asks the controller for its widest window | -| `SPEEDTEST_INTERVAL` | `15m` | how often speedtest history is re-read | +| `SPEEDTEST_INTERVAL` | `15m` | how often speedtest history is re-read; `0` stops reading it | | `BACKFILL_ON_START` | `true` | `false` to start recording forward only | | `LEDGER_RETENTION` | `8760h` | how long the outage archive keeps events | | `PROBE_TARGETS` | empty | set it to turn the demarcation probe on, see below | @@ -152,9 +158,10 @@ SOURCE_1=proxmox https://pve1.lab:8006 name=pve-lab user=telemetry@pve!ro SOURCE_1_SECRET= ``` -Kinds: `proxmox`, `pbs`, `vmware`, `synology`, `qnap`, `truenas`. The -dashboard's **Settings → Add a source** generates both lines and says what -read-only account to create on that system. +Kinds: `proxmox`, `pbs`, `vmware`, `xcpng`, `synology`, `qnap`, `truenas`, and +`snmp` for switches, `ups` for UPSes and `redfish` for servers through +their BMC, which take several addresses in one slot (see below). The dashboard's **Settings → Add a source** generates both +lines and says what read-only account to create on that system. Fixed slot names are deliberate: Portainer passes a variable into the container only when `docker-compose.yml` names it, so a free-form name would @@ -165,8 +172,8 @@ otherwise (30 seconds at the least), and a self-signed certificate is accepted unless the slot says `tls=verify`. Where a system keeps its own alarms (vCenter, TrueNAS), they are the alerts -and Ferrule adds no thresholds beside them. Where it does not (Proxmox VE, -PBS, Synology, QNAP), Ferrule raises a few: storage at 90% full is a +and Collimo adds no thresholds beside them. Where it does not (Proxmox VE, +PBS, Synology, QNAP), Collimo raises a few: storage at 90% full is a warning and at 95% is bad, and anything the system itself calls degraded, crashed, failed or offline. Alerts already true when the collector starts are never sent as notifications. @@ -195,12 +202,38 @@ vCenter's triggered alarms. Templates are not counted as machines. Alerts come from vCenter itself: each triggered alarm that nobody has acknowledged is a `vcenter_alarm` alert, red as critical and yellow as a -warning, and notifies like any other. Ferrule adds no thresholds of its own; +warning, and notifies like any other. Collimo adds no thresholds of its own; vCenter's defaults already watch host connection, CPU, memory and datastore usage, and you tune them there. **Acknowledging an alarm in vCenter clears it -in Ferrule.** Alarms already open when the collector starts are not sent as +in Collimo.** Alarms already open when the collector starts are not sent as notifications. +#### XCP-ng, through Xen Orchestra + +XCP-ng 8.3, read through Xen Orchestra's REST API: XCP-ng itself has no +read-only account. One slot is one Xen Orchestra, and every pool it manages +is read. In Xen Orchestra, as an admin: add a user with permission `none`, +copy the **Read only** role (it's a template and can't be given directly), +give the copy to the user, and make the user a token with +`"expiresIn":"0.5 year"`. The commands are on the +[XCP-ng docs page](docs/site/docs/connect/xcpng.md). + +``` +SOURCE_1=xcpng https://xo.example.com name=xo +SOURCE_1_SECRET= +``` + +What it reads: every pool and its HA; every host's power state, maintenance, +pending reboot, CPU, memory, uptime and version; every storage repository's +size, use and allocation (ISO libraries left out); every VM's power state and +snapshots, CPU for the busiest fifteen; alarms and the newest events. + +Alerts: a host not running (`host_offline`), a storage repository at 90% or +95% (`storage_full`), an alarm raised within the hour (`xcpng_alarm`: an +alarm stays listed after its cause clears, so older ones are history), and +the slot's own token expiring within a fortnight (`xcpng_token`). Every Xen +Orchestra token expires. + #### Proxmox VE, with Ceph One slot per cluster; any node's address will do. In the web UI, under @@ -255,7 +288,7 @@ SOURCE_5_SECRET= ``` PBS separates the token and its secret with a colon where Proxmox VE uses an -equals sign; Ferrule handles that. What it reads: every datastore's use and +equals sign; Collimo handles that. What it reads: every datastore's use and PBS's own estimate of when it fills; the latest run of every job in the last week (backups, verify, prune, sync, garbage collection); and each backup group's last backup, oldest first. @@ -292,7 +325,7 @@ and DSM saying the box is hot. #### QNAP, over SNMPv3 -QTS and QuTS hero have no read-only API account, so Ferrule reads QNAP's own +QTS and QuTS hero have no read-only API account, so Collimo reads QNAP's own SNMP MIB, over SNMPv3 with authentication and encryption. In **Control Panel → Network & File Services → SNMP**: @@ -321,7 +354,7 @@ What it reads: model, firmware, uptime, CPU, memory, temperatures, fans; every disk's (and M.2 drive's) status and temperature; every storage pool's status and use, and every RAID group's status. QNAP has two MIBs: current QTS and QuTS hero fill the newer one (QTS-MIB) and leave model, uptime and -memory out of the older (NAS-MIB). Ferrule reads both and takes the newer +memory out of the older (NAS-MIB). Collimo reads both and takes the newer wherever it answers. Alerts as for Synology. #### TrueNAS @@ -345,6 +378,86 @@ TrueNAS 25.04 marked the REST API this uses as deprecated, in favour of JSON-RPC over a WebSocket. It still answers through 25.10; if a later release drops it, the slot will say so. +#### Switches from any maker, over SNMP + +Kind `snmp` reads managed switches over the standard MIBs (SNMPv2-MIB, +IF-MIB, EtherLike-MIB, ENTITY-MIB and ENTITY-SENSOR-MIB, LLDP-MIB), whoever +made them. One slot lists every switch that shares a community or SNMPv3 +user, comma-separated, up to 64; `:port` after an address if it is not 161. + +``` +SOURCE_3=snmp 192.168.1.2,192.168.1.3 name=core version=2c +SOURCE_3_SECRET= + +SOURCE_4=snmp 10.0.1.2 name=dc version=3 user=telemetry auth=sha priv=aes +SOURCE_4_SECRET=: +``` + +`version=` is `2c` or `3`; without it, a slot with `user=` is SNMPv3 and one +without is SNMPv2c. For SNMPv3, `auth=` is `sha` (the default) or `md5`, +`priv=` is `aes` (the default) or `des`, and the secret is both passphrases +joined by the first colon. SNMPv2c sends its community in clear: keep it to +the management network. + +Each switch becomes a device on the LAN tab, beside the UniFi devices, with +the same alerts: offline, reboots (from uptime), firmware changes, errors +climbing, flapping, a link slower than it has run, half duplex, a hot +chassis, and a fan the sensor reports not working. Only physical Ethernet +ports are read; whether one is a fibre cage is a guess from its name, and +optic diagnostics are in no standard MIB. A switch that stops answering is +offline under its own name; a slot where nothing has ever answered, or every +switch refuses the credentials, is the slot's error instead. + +#### UPSes, over UPS-MIB + +Kind `ups` reads RFC 1628, which most UPS network cards answer: the +battery's status, charge and minutes left, seconds on battery, input +voltage, where the output comes from and its load, and the UPS's own alarms. +Its slot takes the same addresses and credentials as `snmp`: + +``` +SOURCE_5=ups 192.168.1.20,192.168.1.21 name=racks +SOURCE_5_SECRET= +``` + +Each UPS is a panel on the **Power and servers** tab. Alerts: on battery +(`ups_on_battery`) and battery low or depleted (`ups_battery_low`) are bad; +battery needs replacing (`ups_battery_replace`, from the UPS's own alarm) +and 90% load or more (`ups_overload`) are warnings; ten minutes of runtime +or less is a warning and five or less is bad (`ups_runtime_low`). PDUs are +not read: each maker's speaks its own MIB. + +#### Servers, over Redfish + +Kind `redfish` reads a server through its BMC (Dell iDRAC, HPE iLO, +Supermicro, Lenovo XCC, or any other that speaks DMTF Redfish), following +the links from `/redfish/v1/`: the system's maker, model, serial, BIOS, +power state, health, processors and memory; its drives; each chassis's +temperatures with the BMC's thresholds, fans, power supplies, redundancy +and power drawn; and the BMC's firmware. It signs in with HTTP Basic on each +request and opens no Redfish session. One slot lists every BMC sharing an +account, each with `https://`, comma-separated; `user=` is required and the +secret is the password: + +``` +SOURCE_7=redfish https://192.168.1.31,https://192.168.1.32 name=rack-a user=collimo +SOURCE_7_SECRET= +``` + +Make the account with the lowest role that reads: iDRAC **Read Only**, iLO +**Login** privilege only, XCC **ReadOnly**. On Supermicro the lowest that +reads Redfish is **Operator**, which can also power the server, so keep that +password to the stack. + +Each server is a panel on the **Power and servers** tab, named by its BMC's +address. Alerts, at the BMC's own levels, warning or bad: the server's +overall health (`server_health`), a temperature at its non-critical or +critical threshold (`server_temp`), a fan (`server_fan`), a supply failed or +redundancy lost (`server_psu`), a drive not OK or predicting failure +(`server_drive`); a BMC that stops answering is `source_down`. The classic +Thermal and Power resources are read; a BMC offering only ThermalSubsystem +and PowerSubsystem says so on its panel. + ### Inventory reports With a vCenter or Proxmox VE slot, the Virtualization tab has an @@ -376,20 +489,20 @@ shows), and the inventories it read, with their fingerprints. **Evidence that history was not changed.** Each inventory records a SHA-256 fingerprint of itself and of the one before, so the runs form a chain: editing or deleting a run breaks every fingerprint after it. The Sources -sheet shows both. Ferrule checks the whole chain when it starts and after +sheet shows both. Collimo checks the whole chain when it starts and after every run, and raises **Inventory history changed** if anything fails. A run that `INVENTORY_KEEP` expires is marked expired, not deleted, so the chain stays whole. Because whoever can change the files could rebuild a chain kept beside them, each fingerprint is also written to every backup target as `fingerprint-.json` (never pruned) and to the database copy, -which Ferrule checks against its files. For the strongest evidence, keep the +which Collimo checks against its files. For the strongest evidence, keep the backup share under a snapshot schedule the stack's credentials cannot -delete (Synology and QNAP immutable snapshots, TrueNAS periodic snapshots), +delete (locked snapshots on Synology or QNAP, periodic ones on TrueNAS), or use S3 with Object Lock. **A copy in PostgreSQL**, for Grafana, Power BI or anything else with a PostgreSQL connector, no plugin needed. Every run goes into schema -`ferrule`: a `runs` table, one table per sheet (`vms`, `disks`, `nics`, +`collimo`: a `runs` table, one table per sheet (`vms`, `disks`, `nics`, `partitions`, `snapshots`, `hosts`, `datastores`, `clusters`, `health`, `sources`, `changes`), `vm_attributes` for vCenter's custom attributes, and a `latest_` view of each sheet for the fleet as the newest run saw it. Every @@ -403,10 +516,10 @@ later, change `INVENTORY_DB_PASSWORD` and redeploy the whole stack: the database container sets the new one within a minute. (Postgres itself keeps the password it was first made with; the stack's health check puts the new one in.) Should that ever not take, removing the stack's -`postgres-data` volume loses nothing: the database is a copy, and Ferrule +`postgres-data` volume loses nothing: the database is a copy, and Collimo copies every run back in. To use a PostgreSQL you run, set `INVENTORY_DB_URL` instead. Set `INVENTORY_DB_READER_PASSWORD`, at -least 12 characters, and Ferrule makes a read-only `ferrule_reader` role for +least 12 characters, and Collimo makes a read-only `collimo_reader` role for reporting tools to sign in as, so they never hold the writer's password. A shorter one is refused: the role is not made, the inventory panel says why, and everything else carries on. @@ -415,14 +528,35 @@ and everything else carries on. |---|---|---| | `INVENTORY` | `on` | `off` stops the daily run; taking one by hand still works | | `INVENTORY_AT` | `02:30` | when the daily run is taken, in `TZ` | -| `INVENTORY_KEEP` | `365` | days of runs to keep, in Ferrule's files and the database copy alike; `2557` keeps seven years, as SOX asks. The newest two are always kept | +| `INVENTORY_KEEP` | `365` | days of runs to keep, in Collimo's files and the database copy alike; `2557` keeps seven years, as SOX asks. The newest two are always kept | | `INVENTORY_DB_URL` | empty | `postgres://user:password@host:5432/database?sslmode=verify-full` for a PostgreSQL you run | | `INVENTORY_DB_PASSWORD` | empty | the writer's password; on its own, the stack's `postgres` profile is used | -| `INVENTORY_DB_READER_PASSWORD` | empty | at least 12 characters; makes or updates `ferrule_reader`, sent as a SCRAM verifier, never as text | +| `INVENTORY_DB_READER_PASSWORD` | empty | at least 12 characters; makes or updates `collimo_reader`, sent as a SCRAM verifier, never as text | | `INVENTORY_DB_CA` | empty | your CA certificate, PEM, for a server whose certificate it signed; turns on `verify-full` | | `INVENTORY_DB_BIND` | `127.0.0.1` | where the bundled database listens on the Docker host; `0.0.0.0` for Power BI on another machine | | `INVENTORY_DB_PORT` | `5432` | the bundled database's port on the Docker host | +#### Capacity planning (paid) + +Every hypervisor and storage poll is folded into one summary per cluster, +host, datastore and pool per day (average, 95th percentile, peak and +capacity), kept for two years in `capacity/` beside the archive, whatever the +edition. On first start the inventory runs already held seed the disk and +allocation history. The **Capacity** tab forecasts when each reaches its +threshold, with a range, and raises `capacity_runway` when that is close. + +| Variable | Default | | +|---|---|---| +| `CAPACITY_THRESHOLDS` | `cpu=80,mem=80,disk=85,pool=85` | the share of usable capacity, in %, forecasts are for; also `alloc_cpu`, `alloc_mem` and `alloc_disk` against the ratios below (100 by default). `pool` is Ceph and other replicated storage, planned to nearfull | +| `CAPACITY_RUNWAY` | `warn=90,bad=30` | days left at which a forecast warns, and is critical | +| `CAPACITY_RATIOS` | `vcpu=4,vmem=1,disk=1.5` | allocation limits: vCPUs per core, VM memory per byte of host memory, provisioned disk per byte | +| `CAPACITY_VM_SIZE` | `vcpu=4,mem=16,disk=100` | the VM "how many more fit" counts in, memory and disk in GB | +| `CAPACITY_SUMMARY_TO` | empty | who gets the monthly capacity summary on the 1st, through the SMTP server alert email uses; its own list, not `SMTP_TO` | +| `CAPACITY_SUMMARY_BY` | empty | a "Prepared by" name on the summary | +| `CAPACITY_HOST` | empty | the host "What to buy" plans in, such as `cores=64,mem=1024` (memory in GB); empty: each cluster's largest | +| `CAPACITY_DISK_TBW` | empty | each drive model's rated terabytes written, such as `CT1000P310SSD8=220; Samsung SSD 990 PRO 1TB=600`, for disk wear | +| `CAPACITY_HA` | empty | hosts kept spare per cluster, such as `Prod=1,lab=0`: usable capacity is then the cluster less its largest hosts | + What Proxmox VE cannot tell a read-only token is left out rather than asked for: a VM's IP addresses, partitions and guest OS need the QEMU guest agent and a privilege PVEAuditor does not have. A container's static address is in @@ -448,7 +582,7 @@ with the model that gave it. **Recommend fixes**, when ticked, asks for a fix for each problem as well: steps in order, what carrying them out could disrupt, and how to check it worked. Each shows on its finding as a suggested fix, to check before -running. It is advice: Ferrule runs nothing, and the model is told to give +running. It is advice: Collimo runs nothing, and the model is told to give an exact command or menu path only where it is sure of it. The assistant is paid, whichever model answers: the trial or a license. When @@ -486,7 +620,7 @@ anything else is not, with no setting to say otherwise. With sign-in off there are no roles, as for everything else. Each model takes one question at a time; asking one that is busy says so at -once, and another model can be picked. Every five minutes Ferrule asks each +once, and another model can be picked. Every five minutes Collimo asks each model for its list of models, which costs nothing, and the panel shows whether it answered, refused its key, or could not be reached. There is no automatic switch to another model: a question goes only where its preview @@ -498,7 +632,7 @@ said it would. so. In **Settings → Stack environment**, each slot is a provider list and its fields, and **Move to AI_1**, under the old single-model settings, writes the old variables as an `AI_1` line and clears them; paste the key -into `AI_1_KEY`, since Ferrule never sees it. A slot that cannot be read is shown +into `AI_1_KEY`, since Collimo never sees it. A slot that cannot be read is shown on Settings with the reason and never stops the stack. **LM Studio:** in the Developer tab, start the server and turn on **Serve on @@ -508,7 +642,7 @@ The first question reads the whole case file before it answers; on a desktop machine that is usually 20 to 60 seconds. **llama.cpp:** start `llama-server` with `--host 0.0.0.0` so it listens on -the network, and `--jinja` for the model's own chat template. Ferrule asks +the network, and `--jinja` for the model's own chat template. Collimo asks it for its settings at `/props`, so the panel shows "llama.cpp" with the loaded model's name, and the context each question gets, which is `-c` divided by the server's parallel slots (`-np`); `context=` is then not @@ -536,18 +670,27 @@ AI_3_KEY= | Name | Default | Meaning | |---|---|---| -| `FERRULE_LICENSE` | empty | a license key, one long line starting `FERRULE1.`. Optional: it can be pasted on Settings instead | +| `COLLIMO_LICENSE` | empty | a license key, one long line starting `COLLIMO1.`. Optional: it can be pasted on Settings instead | -Without a key, a new install runs a **30-day trial** of the paid features, -counted from its first start and remembered on the `ledger-data` volume, -then carries on as **Community**: free for personal use, with everything for -one site. Settings → License shows the edition, the days left and what is -paid. Whatever happens to a license, monitoring and alerts never stop: only -the paid features pause. +**During the private beta** there is no trial, and a key is required: +without one in force, Collimo reads nothing, sends no alerts and pushes +nothing to VictoriaMetrics, and says **Private beta: not watching** above +every tab. A key that is withdrawn, past its expiry and grace, or +unconfirmed online for 30 days stops it the same way. The container stays +healthy, and entering a key starts watching at the next poll. + +After launch, a new install without a key runs a **30-day trial** of the +paid features, counted from its first start and remembered on the +`ledger-data` volume, then carries on as **Community**: free for personal +use, with everything for one site. Settings → License shows the edition, +how long the key is valid (a Business or MSP key can say **Never expires**), +what it covers, such as *unlimited sites*, and what is paid. After launch, +whatever happens to a license, monitoring and alerts never stop: only the +paid features pause. **Online confirmation.** A key is checked by its signature, on your host. -Ferrule also fetches a signed list of withdrawn keys once a day, from -`https://license.ferrulehq.dev/revoked`, so a key that leaks can be +Collimo also fetches a signed list of withdrawn keys once a day, from +`https://license.collimo.dev/revoked`, so a key that leaks can be withdrawn. The fetch is a plain download: nothing about you, your network or your install is sent. A key that has not been confirmed for 30 days pauses the paid features until the list can be @@ -560,9 +703,35 @@ trial and Community have no key, so they never check. License and press Apply. It is checked there and then, used at once with no restart, and kept on the archive volume as `license.json`, so it travels with archive backups and comes back with a restore. **Remove license** takes it -off again. Each change goes in the audit log. When `FERRULE_LICENSE` is set, +off again. Each change goes in the audit log. When `COLLIMO_LICENSE` is set, it always wins, and the box on Settings is locked. +### Several sites: the hub (MSP, or Business with several offices) + +| Name | Default | Meaning | +|---|---|---| +| `COLLIMO_ROLE` | `standalone` | `collector` at each site, `hub` for the one that shows them all. `standalone` is one site on its own | +| `HUB_URL` | empty | on a hub: the address collectors reach it at. It goes into every enrolment code | +| `HUB_ENROL` | empty | on a collector: the enrolment code made on the hub, used once | +| `HUB_LINK` | `normal` | `metered` on a cellular or satellite link: the snapshot every 5 minutes instead of every minute | + +A **collector** watches its site as a standalone install does, and sends +what it sees to the hub. It only ever calls out to the hub; nothing +connects in to a site, and no port opens at the site or in front of the +hub. Its page is a read-only status page: whether it reaches the hub, what +is waiting to send, and its alerts. Records made while the hub is +unreachable wait on the archive volume and go when it is back. + +The **hub** polls nothing. It shows every site, sends the notifications +for all of them, and keeps each site's archive. It needs an MSP license, +which covers the number of sites the key says. On the hub, **Sites → Add a +site** makes a one-time enrolment code for each new site: paste it into +that site's `HUB_ENROL`. A code works once and lasts a day. Every message +between a collector and the hub is encrypted to the receiver and signed by +the sender, whatever the route. On a hub, set `RETENTION=400d` to keep +about 13 months of each site's graphs. The full guide is +[The hub](https://docs.collimo.dev/msp/hub/). + ### Sign-in Off until you turn it on, so a dashboard behind a VPN or Cloudflare Access @@ -595,7 +764,7 @@ can change their own password on Settings. Users travel with archive backups, still encrypted, and **Export settings** downloads them as one file to import into another install with the same key. `ADMIN_USERNAME` always stays the environment's admin; no local user may take -its name. Without `ADMIN_PASSWORD`, Ferrule refuses any change that would +its name. Without `ADMIN_PASSWORD`, Collimo refuses any change that would leave no local admin. Adding users and groups needs a license; when one lapses, everyone already added keeps signing in, and can still be disabled, deleted or given a new password. @@ -615,13 +784,13 @@ nothing is refused, so pointing OIDC at Google does not let in every Google account. ``` -OIDC_ROLES=ferrule-admins:admin; it-team:operator; @example.com:viewer -LDAP_ROLES=CN=Ferrule Admins,OU=Groups,DC=corp,DC=example:admin; CN=Helpdesk,OU=Groups,DC=corp,DC=example:viewer +OIDC_ROLES=collimo-admins:admin; it-team:operator; @example.com:viewer +LDAP_ROLES=CN=Collimo Admins,OU=Groups,DC=corp,DC=example:admin; CN=Helpdesk,OU=Groups,DC=corp,DC=example:viewer ``` | Name | Meaning | |---|---| -| `OIDC_ISSUER`, `OIDC_CLIENT_ID`, `OIDC_CLIENT_SECRET`, `OIDC_ROLES` | required together. Register Ferrule with your provider as a web application with the redirect URI `/auth/oidc/callback` | +| `OIDC_ISSUER`, `OIDC_CLIENT_ID`, `OIDC_CLIENT_SECRET`, `OIDC_ROLES` | required together. Register Collimo with your provider as a web application with the redirect URI `/auth/oidc/callback` | | `OIDC_NAME` | the button's label: "Sign in with …" | | `OIDC_GROUPS_CLAIM` | where the provider puts groups; default `groups`. Entra ID sends group object IDs there once "groups claim" is turned on for the app | | `OIDC_SCOPES` | default `openid profile email`; some providers need `groups` added | @@ -654,15 +823,15 @@ what notifies per tab and per alert type, and writes the lines to set here. | Channel | Variables | Notes | |---|---|---| | Gotify | `GOTIFY_URL`, `GOTIFY_TOKEN` | your Gotify, or `http://gotify` for the bundled one; an application token | -| ntfy | `NTFY_URL`, optional `NTFY_TOKEN` | the topic's full URL, e.g. `https://ntfy.sh/my-ferrule-alerts`; on ntfy.sh, pick a topic nobody could guess | +| ntfy | `NTFY_URL`, optional `NTFY_TOKEN` | the topic's full URL, e.g. `https://ntfy.sh/my-collimo-alerts`; on ntfy.sh, pick a topic nobody could guess | | Pushover | `PUSHOVER_TOKEN`, `PUSHOVER_USER` | an application token, and your user or group key | | Discord | `DISCORD_WEBHOOK_URL` | Server settings → Integrations → Webhooks | -| Email | `SMTP_HOST`, `SMTP_FROM`, `SMTP_TO`; optional `SMTP_PORT` (587), `SMTP_USERNAME`, `SMTP_PASSWORD`, `SMTP_TLS` | `SMTP_TO` takes several addresses, comma separated. `SMTP_TLS` is `starttls` (the default), `tls` (the default on port 465) or `none`; a password is never sent unencrypted | +| Email | `SMTP_HOST`, `SMTP_FROM`, `SMTP_TO`; optional `SMTP_PORT` (587), `SMTP_USERNAME`, `SMTP_PASSWORD`, `SMTP_TLS`, `SMTP_TICKETS` | `SMTP_TO` takes several addresses, comma separated. `SMTP_TLS` is `starttls` (the default), `tls` (the default on port 465) or `none`; a password is never sent unencrypted. `SMTP_TICKETS` is `open` or `all` when `SMTP_TO` is a ticketing system's mailbox: one tag per alert in the subject, so mail rules thread it into one ticket | | Slack *(paid)* | `SLACK_WEBHOOK_URL` | an incoming webhook from a Slack app | | Microsoft Teams *(paid)* | `TEAMS_WEBHOOK_URL` | a **Workflows** webhook: in the channel, Workflows → "Post to a channel when a webhook request is received". The old Office 365 connector webhooks were retired in 2026 and do not work | | PagerDuty *(paid)* | `PAGERDUTY_ROUTING_KEY` | an Events API v2 integration key. Critical alerts only; a clear resolves the incident | | Apprise *(paid)* | `APPRISE_URL`, and `APPRISE_URLS` or `APPRISE_KEY` | an apprise-api server, such as the bundled one (`http://apprise:8000`), reaching more than a hundred services. `APPRISE_URLS` lists them as Apprise URLs and travels with each message, so the server keeps nothing; `APPRISE_KEY` names a configuration stored on the server instead | -| Webhook *(paid)* | `WEBHOOK_URL`, optional `WEBHOOK_SECRET` | JSON for Home Assistant, n8n or anything else; with a secret, `X-Ferrule-Signature` carries `sha256=` and the HMAC of the body | +| Webhook *(paid)* | `WEBHOOK_URL`, optional `WEBHOOK_SECRET` | JSON for Home Assistant, n8n or anything else; with a secret, `X-Collimo-Signature` carries `sha256=` and the HMAC of the body | Paid channels send during the trial or with a license. When neither is in force they send one message saying they have paused, PagerDuty resolves what @@ -672,7 +841,7 @@ What notifies, and when, is shared by every channel: | Name | Default | Meaning | |---|---|---| -| `DASHBOARD_URL` | empty | where tapping a notification goes, e.g. `https://ferrule.example.com` | +| `DASHBOARD_URL` | empty | where tapping a notification goes, e.g. `https://collimo.example.com` | | `NOTIFY_DEFAULT` | `bad` | lowest severity that notifies: `bad`, `warn` or `off` | | `NOTIFY_RULES` | empty | overrides by tab or alert type, e.g. `wan=warn port_slow=off` | | `NOTIFY_DELAY` | `2m` | only send if still active this long later | @@ -696,13 +865,20 @@ profile so neither starts unless asked: COMPOSE_PROFILES=gotify,igotify # or just igotify, beside an existing Gotify GOTIFY_ADMIN_USER=admin # the default GOTIFY_ADMIN_PASSWORD= # unset, Gotify's admin password is "admin" +GOTIFY_ALERTS_PASSWORD= # the shared account everyone signs in as GOTIFY_URL=http://gotify GOTIFY_PORT=8091 # host ports, for a tunnel or proxy to use IGOTIFY_PORT=8092 ``` -Deploy once, open Gotify, create an application, put its token in -`GOTIFY_TOKEN`, and update the stack. iGotify relays to the iPhone app +The setup wizard writes all of this for you. With `GOTIFY_ALERTS_PASSWORD` +and no `GOTIFY_TOKEN`, Collimo makes a Gotify account, `collimo-alerts`, and +its own app in it, the first time it sends. Everyone who should get alerts +signs in to the Gotify app (or iGotify) as `collimo-alerts`, and the admin +account stays private. In Gotify an app belongs to one user and only that +user's phones see it, which is why alerts go to a shared account. For a +team, ntfy or Pushover groups suit better. To use your own app instead, +create one in Gotify and set `GOTIFY_TOKEN`. iGotify relays to the iPhone app through Apple's push service; the phone has to reach Gotify and iGotify, so away from home put them behind a tunnel or reverse proxy. `IGOTIFY_GOTIFY_URLS`, `IGOTIFY_CLIENT_TOKENS` and `IGOTIFY_SECNTFY_TOKENS` are only needed when @@ -715,7 +891,7 @@ and iGotify as their own small stack and point `GOTIFY_URL` at it. #### Apprise in this stack Add `apprise` to `COMPOSE_PROFILES` and the stack runs apprise-api as -`ferrule-apprise`, on host port `APPRISE_PORT` (8093). Then: +`collimo-apprise`, on host port `APPRISE_PORT` (8093). Then: ``` APPRISE_URL=http://apprise:8000 @@ -725,7 +901,7 @@ APPRISE_URLS=tgram://bottoken/chatid mailto://user:pass@example.com Separate several services with spaces. Each service's URL format is in Apprise's own documentation. -### Backups +### Archive copies The archive (every outage, alert and event the controller forgets, and when the trial began) is backed up **daily**, and the history in VictoriaMetrics @@ -734,13 +910,13 @@ container with an empty archive restores the newest backup by itself**, before it starts: rebuild the stack anywhere, point it at the same backups, and it comes back as it was. History is re-imported into a VictoriaMetrics that holds nothing older than the backup. Restoring is never paid, even from -S3 after a license ends. Settings → Backups shows each target, what is -there, and a "Back up now" button. +S3 after a license ends. Settings → Archive copies shows each target, what is +there, and a "Copy now" button. | Name | Default | Meaning | |---|---|---| -| `BACKUP_NAME` | `ferrule` | names this site's backups. Give each site its own when several share a target; a rebuilt site must keep its name to find its backups | -| `BACKUP_KEY` | empty | encrypts backups (AES-256-GCM). 32 random bytes in base64: `openssl rand -base64 32`, or Settings → Backups → Make a key. **Keep a copy outside the stack**: without it an encrypted backup cannot be restored | +| `BACKUP_NAME` | `collimo` | names this site's backups. Give each site its own when several share a target; a rebuilt site must keep its name to find its backups | +| `BACKUP_KEY` | empty | encrypts backups (AES-256-GCM). 32 random bytes in base64: `openssl rand -base64 32`, or Settings → Archive copies → Make a key. **Keep a copy outside the stack**: without it an encrypted backup cannot be restored | | `BACKUP_AT` | `03:30` | the time of day, in `TZ` | | `BACKUP_HISTORY` | `true` | also back up history, weekly | | `BACKUP_HISTORY_DAY` | `sunday` | which day | @@ -749,7 +925,7 @@ there, and a "Back up now" button. | `BACKUP_RESTORE` | `auto` | `off` to never restore by itself | A backup missed while the stack was down is taken a couple of minutes after -it comes back. A failed backup raises a "Backup failed" warning, which +it comes back. A failed backup raises an "Archive copy failed" warning, which notifies like any other alert (`NOTIFY_RULES` tab `settings`). #### To a share (NFS or SMB), free @@ -793,41 +969,41 @@ needed: ``` BACKUP_S3_ENDPOINT=s3.us-east-1.wasabisys.com BACKUP_S3_REGION=us-east-1 -BACKUP_S3_BUCKET=my-ferrule-backups +BACKUP_S3_BUCKET=my-collimo-backups BACKUP_S3_ACCESS_KEY=... BACKUP_S3_SECRET_KEY=... ``` Backups land in `///`, with the -prefix `ferrule` by default. Make the bucket first, and give the key access +prefix `collimo` by default. Make the bucket first, and give the key access to that bucket only: list, read, write and delete. For Wasabi, the endpoint and region must match the bucket's region; Backblaze B2 shows its S3 endpoint -on the bucket's page. Without a license or trial, S3 backups pause and the +on the bucket's page. Without a license or trial, copies to S3 pause and the share carries on; restoring from S3 keeps working. Set `BACKUP_KEY` too: these backups leave your network. ### Reaching it from outside: Cloudflare Tunnel -Ferrule does not ship a tunnel. If you already run `cloudflared`, add public +Collimo does not ship a tunnel. If you already run `cloudflared`, add public hostnames to that tunnel in the Cloudflare dashboard (Zero Trust → Networks → Tunnels → your tunnel → Public Hostname): | Hostname | Service | |---|---| -| `ferrule.example.com` | `http://:8090` | +| `collimo.example.com` | `http://:8090` | | `gotify.example.com` | `http://:8091`, if you run the bundled Gotify | | `igotify.example.com` | `http://:8092`, if you run the bundled iGotify | If `cloudflared` runs as a container on the same Docker network, use the -container names and their internal ports instead: `http://ferrule:8080`, -`http://ferrule-gotify:80`, `http://ferrule-igotify:8080`. +container names and their internal ports instead: `http://collimo:8080`, +`http://collimo-gotify:80`, `http://collimo-igotify:8080`. Turn on sign-in (above) before the dashboard goes on a tunnel, or put it behind Cloudflare Access (an Access application with a policy for your own email), or both. Gotify and iGotify must stay reachable by the phone apps, which cannot pass an Access login; Gotify has its own, and iGotify only relays. Then set -`DASHBOARD_URL=https://ferrule.example.com` so tapping a notification opens +`DASHBOARD_URL=https://collimo.example.com` so tapping a notification opens it. ### Deploying from someone else's private repo @@ -861,8 +1037,8 @@ If your Portainer has no Additional paths field, merge the overlay's ### Running beside an existing stack -This compose file names its containers `ferrule` and -`ferrule-victoria-metrics`, on port 8090, so it can run on +This compose file names its containers `collimo` and +`collimo-victoria-metrics`, on port 8090, so it can run on the same Docker host as an earlier deployment of this project. Set `UNIFI_ENABLED=false` on it while you try it, or both stacks will poll the same controller. @@ -892,6 +1068,27 @@ container keeps `cap_drop: ALL`. If the sysctl does not survive your deployment the dashboard says the probe is unavailable and nothing else changes. +### Up-checks + +For anything Collimo cannot read, it can still say whether it answers. +`CHECKS` holds the entries, separated by `;`: + +``` +CHECKS=ping 192.168.1.20 name=printer; http https://nas.lab:5001 name=nas; tcp 10.0.0.5:22 name=build-ssh +``` + +- `ping `: one echo, through the same unprivileged ICMP socket as the + probe. Where that socket cannot open, the check says it is unavailable. +- `http `: up on any 2xx or 3xx; `expect=200` asks for exactly one + status. The certificate is not checked unless you add `tls=verify`. +- `tcp `: up when the port accepts a connection. + +Each also takes `name=` (the target by default), `every=` (`30s`, at least +`10s`) and `timeout=` (`5s`). A check is down after three failures in a row +and up after one success; it raises `check_down` on the LAN tab and is kept +as an offline span on the outage timeline. A bad entry is logged, left out +and listed under Settings → Sources; the rest still run. + --- ## Step 5 — Turn on GitOps updates @@ -914,7 +1111,7 @@ download. ## Versions and updates -`FERRULE_VERSION` says which release runs, and nothing changes until you +`COLLIMO_VERSION` says which release runs, and nothing changes until you change it: set the new version in the stack's variables and update the stack. `qa` is the build under test, and moves: every redeploy picks up the newest. Releases are built for Intel/AMD and ARM, so the same version @@ -924,9 +1121,9 @@ runs on a NAS or a Raspberry Pi. For development, or to try a branch before it is released, add `docker-compose.build.yml` under the stack's Git settings, **Additional -paths**. It builds Ferrule from the repository on the Docker host, tagged -`ferrule-local:latest` so a build never stands in for a pulled release, and -rebuilds on every redeploy. `FERRULE_VERSION` is still required; any value, +paths**. It builds Collimo from the repository on the Docker host, tagged +`collimo-local:latest` so a build never stands in for a pulled release, and +rebuilds on every redeploy. `COLLIMO_VERSION` is still required; any value, such as `dev`, will do. The host then needs to pull `golang:1.24-alpine` too. @@ -940,7 +1137,7 @@ seconds to report healthy — that is the healthcheck's start period. Container logs on a healthy start: ``` -ferrule gitops listening on :8080, polling https://192.168.1.1 every 30s, and 2 source(s) +collimo gitops listening on :8080, polling https://192.168.1.1 every 30s, and 2 source(s) ``` Silence after that is correct. The collector logs failures and state @@ -973,7 +1170,7 @@ Dashboard: `http://:8090`. ## From here on -To move to a new release, change `FERRULE_VERSION` and update the stack. +To move to a new release, change `COLLIMO_VERSION` and update the stack. With GitOps updates on, a change to the compose file in the repository redeploys on its own, with a webhook or within the polling interval, or on **Pull and redeploy**. @@ -985,16 +1182,16 @@ variables in Portainer and update the stack. ## Troubleshooting -**`set FERRULE_VERSION to the release to run`.** The stack has no -`FERRULE_VERSION`. Add it, such as `FERRULE_VERSION=0.9.0`, and update the +**`set COLLIMO_VERSION to the release to run`.** The stack has no +`COLLIMO_VERSION`. Add it, such as `COLLIMO_VERSION=0.9.0`, and update the stack. -**`pull access denied` or `unauthorized` pulling the Ferrule image.** Check -`FERRULE_IMAGE`: the image is public, so a pull needs no login, and this +**`pull access denied` or `unauthorized` pulling the Collimo image.** Check +`COLLIMO_IMAGE`: the image is public, so a pull needs no login, and this usually means a mistyped address. -**`manifest unknown` pulling the Ferrule image.** No release has that -version. Check `FERRULE_VERSION` for a typo. +**`manifest unknown` pulling the Collimo image.** No release has that +version. Check `COLLIMO_VERSION` for a typo. **`configuration: UNIFI_HOST is required`.** The stack variables did not reach the container. Confirm they are saved under the stack, then update it. @@ -1012,14 +1209,14 @@ reuse the gateway's credentials. Add `PROTECT_API_KEY`, or **The dashboard says the archive is NOT persisted, with `permission denied`.** The `ledger-data` volume was created before the image shipped its own -`/var/lib/ferrule` directory. Docker creates a mountpoint as root when +`/var/lib/collimo` directory. Docker creates a mountpoint as root when the path does not exist in the image, and the collector runs as uid 65534, so it can never write there. Redeploy on a build that includes the fix, and if the message survives that, remove the volume so Docker re-seeds it from the image: ```sh docker compose down -docker volume rm ferrule_ledger-data +docker volume rm collimo_ledger-data docker compose up -d ``` diff --git a/README.md b/README.md index f0bad9e..12cd34a 100644 --- a/README.md +++ b/README.md @@ -1,80 +1,188 @@ -# Ferrule +

+ Collimo +

-Ferrule is a monitoring dashboard for UniFi networks, hypervisors and -storage. It shows what the vendors' own screens mostly don't: fan speeds, -per-port error counters, SFP optics, PoE draw, temperatures, NVR disk -health, WAN failover and cable modem health. It also keeps its own record -of outages, so the record survives the controller. +

Collimo

-This repository is how you deploy it: a Docker Compose stack, run from -Portainer or from the command line. Ferrule runs from a published image, -so nothing is built on your host. +
-**Full documentation: ** +**col·lì·mo** *Italian, verb* +I line it up. A collimator is the part of an optical instrument that lines the light up so it runs true. + +[![Release](https://img.shields.io/github/v/release/collimohq/collimo-deploy?label=release)](https://github.com/collimohq/collimo-deploy/releases) +[![Image](https://img.shields.io/badge/image-ghcr.io%2Fcollimohq%2Fcollimo-blue)](https://github.com/orgs/collimohq/packages) +[![Platforms](https://img.shields.io/badge/platforms-amd64%20%7C%20arm64-lightgrey)](#what-you-need) +[![Docs](https://img.shields.io/badge/docs-docs.collimo.dev-informational)](https://docs.collimo.dev) +[![Status](https://img.shields.io/badge/status-private%20beta-orange)](#help-and-feedback) + +*Monitoring for UniFi networks, the hypervisors and storage beside them, and the internet connection they all depend on.* + +- **What the vendor screens bury:** fan speeds, per-port errors, SFP optics, PoE draw, temperatures, NVR disk health. +- **An outage record that outlives the controller,** with the evidence for whose fault it was. +- **Hypervisors and storage on the same page:** vCenter, Proxmox VE and Ceph, PBS, Synology, QNAP, TrueNAS. +- **Other makers' gear too:** managed switches, UPSes and PDUs over SNMP, servers through their BMC over Redfish, and an up-check for anything with an address. +- **Alerts that mean something now,** not counters from two years ago. +- **Two containers, nothing built on your host,** set up from a wizard in the browser. + +**For homelabs:** you have a rack, a UniFi network, a hypervisor or three and a NAS, and you want one page that says what's wrong and where. Collimo draws your rack: each switch as its front panel, each port lit for its speed, so a port outlined in red on screen is where your finger goes on the rack. + +**For small businesses and MSPs:** you need receipts. When the ISP says "it's your equipment", Collimo's outage archive shows when the WAN went down, for how long, whether the modem rebooted, and what the modem blamed. Read-only accounts everywhere: Collimo watches and tells you, and changes nothing. + +> [!IMPORTANT] +> **Collimo is in private beta.** It runs only with a license key from us, and watches nothing without one. Want in? Ask for a key on the [Collimo Discord](https://discord.collimo.dev): [how to ask](https://docs.collimo.dev/start/beta-key/). + +![The Collimo dashboard](https://docs.collimo.dev/images/dashboard.png) + +## Contents + +- [What it watches](#what-it-watches) +- [How it works](#how-it-works) +- [What you need](#what-you-need) +- [Install](#install) +- [Updating](#updating) +- [Alerts and notifications](#alerts-and-notifications) +- [Editions](#editions) +- [Help and feedback](#help-and-feedback) + +## What it watches + +| Source | What Collimo reads | Set it up | +|---|---|---| +| **UniFi Network** | Fan speeds, temperatures, per-port errors and link speeds, SFP optics, PoE draw, Wi-Fi radios and the channel plan, both WAN links, the cable modem, speed tests, outage history | [Guide](https://docs.collimo.dev/connect/unifi-network/) | +| **UniFi Protect** | Every camera's state, the recorder's disks and their health, its CPU temperature, each camera's throughput | [Guide](https://docs.collimo.dev/connect/unifi-protect/) | +| **VMware vCenter and ESXi** | Hosts, maintenance mode, CPU, memory, ESXi build; datastores; VM power state and the busiest VMs; vCenter's alarms | [Guide](https://docs.collimo.dev/connect/vcenter/) | +| **Proxmox VE and Ceph** | Nodes, quorum, storage use, guests and the busiest of them, Ceph health | [Guide](https://docs.collimo.dev/connect/proxmox/) | +| **Proxmox Backup Server** | The backup server's health and capacity: datastore use and its own fill estimate, the past week's jobs, when each machine was last backed up | [Guide](https://docs.collimo.dev/connect/pbs/) | +| **Synology DSM** | Model, DSM version, CPU, memory, temperature; volumes and RAID; drives and their SMART verdicts | [Guide](https://docs.collimo.dev/connect/synology/) | +| **QNAP** (SNMPv3) | CPU, memory, temperatures and fans; disks and M.2 drives; storage pools | [Guide](https://docs.collimo.dev/connect/qnap/) | +| **TrueNAS** | Pools, disk read, write and checksum errors, temperatures, TrueNAS's own alerts | [Guide](https://docs.collimo.dev/connect/truenas/) | +| **Managed switches** (SNMP) | Cisco, Juniper, Aruba, MikroTik and others: ports, speeds, errors, VLANs, temperatures and fans, LLDP neighbours; on Cisco and Juniper also CPU, memory, power supplies, optics and chassis alarms | [Guide](https://docs.collimo.dev/connect/snmp-switches/) | +| **UPS** (SNMP) | On mains or battery, charge, runtime left, load, voltages, battery alarms | [Guide](https://docs.collimo.dev/connect/ups/) | +| **PDUs** (SNMP) | APC, Raritan and Eaton: draw against the rating, banks, and each outlet | [Guide](https://docs.collimo.dev/connect/pdu/) | +| **Servers** (Redfish) | Dell iDRAC, HPE iLO, Supermicro, Lenovo XCC: health, temperatures, fans, power supplies, drives | [Guide](https://docs.collimo.dev/connect/redfish/) | +| **phpIPAM and NetBox** | Free addresses, racks and outlets, for capacity planning to check against | [Guide](https://docs.collimo.dev/connect/ipam/) | +| **Anything else** | Up-checks by ping, HTTP or TCP: is it answering, and how quickly | [Guide](https://docs.collimo.dev/connect/up-checks/) | + +No UniFi? Collimo can watch only your servers and storage. See [Watching without UniFi](https://docs.collimo.dev/connect/without-unifi/). + + + + + + + + + + +
A switch drawn as its front panel
The front panel. Odd ports on top, even below, SFP cages to the right, each lit for its speed. A red outline means errors climbing now; a dashed amber one, slower than that port has run.
The cable modem
The modem. Why it last re-initialised, and whether it rebooted through an outage.
The outage ledger
The outage ledger. Every outage, its cause, and availability with how much of the window the archive covers.
The Virtualization tab
Virtualization and storage. Hosts, guests, pools and disks beside the network.
+ +## How it works + +``` + UniFi consoles vCenter · Proxmox · PBS Synology · QNAP · TrueNAS + \ | / + \______ read-only accounts, polled _________/ + | + +------------------+ +--------------------+ + | collimo | -----> | VictoriaMetrics | + | collector, UI, | push | history, graphs | + | outage archive | +--------------------+ + +------------------+ + | | + dashboard on :8090 alerts: Gotify, ntfy, Pushover, Discord, email, ... +``` + +- **`collimo`** reads your equipment, keeps the outage archive and serves the dashboard and `/metrics`. +- **`collimo-victoria-metrics`** stores the history behind the graphs. +- Both keep their data on Docker volumes. Nothing is written to the host's own folders, and redeploying never loses anything. ## What you need -- A Docker host with **Portainer** or **Docker Compose**, and outbound - internet access to download the images. -- At least one thing to watch: - - a UniFi console (gateway, and a UNVR for Protect); - - or Proxmox VE, Proxmox Backup Server, vCenter/ESXi; - - or a Synology, QNAP or TrueNAS. -- **A license key**, if you're a beta tester; you'll get it from us. Without - one, Ferrule starts a 30-day trial of the paid features. When the trial - ends, it keeps monitoring, with the paid features paused. +- A Docker host with **Portainer** or **Docker Compose**, amd64 or arm64, with outbound internet access to download the images. +- At least one thing to watch from the table above. +- A **read-only account** on each. The wizard links to the steps for every system. +- **Your beta license key.** During the private beta Collimo needs one to run; the wizard asks for it. Ask for one on the [Collimo Discord](https://discord.collimo.dev): see [Get a beta key](https://docs.collimo.dev/start/beta-key/). ## Install -1. **Create read-only accounts** on what you'll watch, such as a UniFi API - key and a local read-only admin. Each system's exact steps are under - [Connect your gear](https://docs.ferrulehq.dev/connect/unifi-network/). -2. **Get the stack:** - - **Portainer:** Stacks → Add stack → name `ferrule` → **Repository**, - with URL `https://github.com/ferrulehq/ferrule-deploy`, - reference `refs/heads/main`, compose path `docker-compose.yml`, and - authentication **off**. - - **Docker Compose:** - ```sh - git clone https://github.com/ferrulehq/ferrule-deploy.git ferrule - cd ferrule - cp stack.env.example .env - ``` -3. **Fill in the settings** from [`stack.env.example`](stack.env.example): - your hosts and credentials. Keep `FERRULE_VERSION` as it is: it's the - current release. Set `UNIFI_ENABLED=false` if you have no UniFi console. - - **Portainer:** paste them under **Environment variables** (Advanced - mode). - - **Docker Compose:** edit `.env`. -4. **Start it:** **Deploy the stack** in Portainer, or `docker compose up -d`. - Then open `http://:8090`. -5. **Settings → License:** paste your key and press **Apply**. It shows - "Waiting for the first check-in" for up to about two hours, then - "Confirmed online". +You don't type any settings here. Collimo opens a setup wizard in your browser, asks for them, and writes them for you. -Once it's running, **Settings → Stack environment** writes the lines for -everything else: hypervisors, storage, notifications and sign-in. +**1. Create the stack.** + +
+Portainer + +1. **Stacks → Add stack.** Name it `collimo`. +2. **Build method:** Repository. + + | Field | Value | + |---|---| + | Repository URL | `https://github.com/collimohq/collimo-deploy` | + | Repository reference | `refs/heads/main` | + | Compose path | `docker-compose.yml` | + | Authentication | **off** | + +3. Leave **Environment variables** empty, and click **Deploy the stack**. + +
+ +
+Docker Compose + +```sh +git clone https://github.com/collimohq/collimo-deploy.git collimo +cd collimo +docker compose up -d +``` + +Keep this folder: your settings go in a `.env` file here. + +
+ +**2. Open `http://:8090`.** With nothing configured, Collimo opens its setup wizard. + +**3. Follow the wizard.** It tests each connection as you go, and at the end gives you `collimo.env` and the steps to load it into the stack. + +**4. Your key** goes in on the wizard's License step. To change it later, use **Settings → License**. + +Full walkthrough: [Install](https://docs.collimo.dev/start/install/) and [The setup wizard](https://docs.collimo.dev/start/setup-wizard/). + +> [!NOTE] +> Collimo's containers have fixed names, so run one Collimo per Docker host. To run a test copy beside a live one, see [Running beside another stack](https://docs.collimo.dev/run/beside-another-stack/). ## Updating -When a new release comes out, set `FERRULE_VERSION` to it, then click -**Pull and redeploy** in Portainer, or run `docker compose up -d`. Nothing -changes until you do. +When a release comes out, set `COLLIMO_VERSION` to it, then **Pull and redeploy** in Portainer, or run `docker compose up -d`. Nothing changes until you do. Releases are listed under [Releases](https://github.com/collimohq/collimo-deploy/releases). + +## Alerts and notifications + +Every alert is worked out in Collimo, so the dashboard, the notifications and `/metrics` always agree. Rules set the lowest severity to send per tab or per alert; an alert must hold for a delay before it's sent; quiet hours hold warnings; and maintenance mode keeps planned work from paging anyone. + +| Channel | Edition | +|---|---| +| Gotify, ntfy, Pushover, Discord, email | All | +| Slack, Microsoft Teams, PagerDuty, webhook, Apprise | Paid | + +Details: [Alerts](https://docs.collimo.dev/use/alerts/). + +## Editions + +Collimo will come as **Community** and paid editions, **Business** and **MSP**. The paid editions add sign-in with users and roles, inventory reports, capacity planning, the VMware exit report, alert thresholds and more. During the private beta every install runs on a beta key, with everything on. What each edition has is on [Editions](https://docs.collimo.dev/reference/editions/). Pricing will be announced. ## Help and feedback -Everything is at , including -[Troubleshooting](https://docs.ferrulehq.dev/troubleshooting/). -[PORTAINER.md](PORTAINER.md) has the full reference too. +- 📖 **Documentation:** , including [Troubleshooting](https://docs.collimo.dev/troubleshooting/) +- 💬 **Discord:** beta keys, questions and chat on the [Collimo Discord](https://discord.collimo.dev) +- 🐛 **Bugs and feature requests:** [open an issue](https://github.com/collimohq/collimo-deploy/issues/new/choose) +- ✉️ **Anything else:** +- 📄 **Full deployment reference:** [PORTAINER.md](PORTAINER.md) -Something unclear, broken or missing? Tell us at -. +Your license key is checked once a day against a signed list at `https://license.collimo.dev/revoked`. That's a plain download: nothing about you, your network or your install is sent. -Your license key is checked once a day against a signed list at -`https://license.ferrulehq.dev/revoked`. That's a plain download: nothing -about you, your network or your install is sent. +Every image carries its software bill of materials (CycloneDX) at `/sbom.cdx.json`, and each release adds it here under `sbom/`. Security problems: see [Reporting a security problem](https://docs.collimo.dev/reference/security/). --- -Ferrule is an independent project, not affiliated with Ubiquiti or the -other vendors it names. See [LICENSE](LICENSE) for the terms. +Collimo and the Collimo logo are trademarks of COLLIMO LLC. © 2026 COLLIMO LLC. All rights reserved. + +UniFi, UniFi Protect and UniFi OS are trademarks of Ubiquiti Inc. VMware, vCenter and ESXi are trademarks of Broadcom Inc. and its subsidiaries; Proxmox of Proxmox Server Solutions GmbH; Synology, QNAP, TrueNAS and the other products named here of their respective owners. They are named only to describe what Collimo reads from, runs on, or sends to. Collimo is an independent project and is not affiliated with, sponsored by, or endorsed by any of them. See [LICENSE](LICENSE) for the terms. diff --git a/collimo-icon.png b/collimo-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..009ab57ce03cdece86c4e8c9219093f64ea31eb7 GIT binary patch literal 144456 zcmV*RKwiIzP)X(W1rW3>nR0f+*?A^{M=phY$m)Pt6TGH8byZa5t7y1|CSEjJwQ zx#@r4mO~A@C6l(op@yZ99I}E9lLUzZAdnDERAm)VsH&_-=FNNWIcHDrwbmSCd}GWx z*IN7Bn~9RGg~H5v*I8@M@gCn8bMJF5pT6@&fdB;}D9c!*Ivx%N%rTY9rp|8-T6Q$*G9v9}9bsG6ByhQno z#!Y^)uoC39Aw%Y6;eFvn|5%p_iSyW@A-Lfba3~E8U74x$H)re^$MgKXoEjfJ2qNtmpGcLA1 zhfU9-KquwTxfd0oR4qD&je@XIZ;S3#e5_f$Fe<5I($c)Sv|}I?r0|NBN<$75n+VTU zk_D3Hj!@>gNmX^{_F?m+V3qUCjpTX7vsKHki)9&}H|$ou+fQY&r7$;Cg`IO7!SfnH z+B--;ZS}^_;Fa$0*telPje%?Il?+QVNSGzx*HoSNw7ksO5~6>1tjMj4tj;5eS*e6M zTXNmK>jkKm>e0+Rh$3Do$pqOG%{PMuxJN5y2gvI~On^rTBPbFVY(S$>)K^1h_1vHf zF;7g}c*IBL9aO2*3P3L*gBQNt^nCIoX@$@}7(F}KmSUf!zr9y~uN?jJbBWIJmfZ&x z`|py^2KgI=?jr|HtyXPI#xI;pXz%6WLc?vFtegy|nXfSLdKmj}=hbRqW$e@hYa?rl zSD7!KH}vFv*WSQ>^3kmWM*HpFYY4ERKGpuwefs znv^1~tmmAp8GFf=*{v5uy!@c%$%Sqn6ZS{N{-6%p{3_Xy@lPvJCbZmWGUAS>%5lL> zo_n2nuPf(uR6dgB6R|&yCf>4$8U%E@D8rSx$c-G%k;}qogZ*84g#CF`#FX&9J9Hu9 z>bS^uG*|uxNDx{6D2^_Hgfv|*GDfL=T(41JZ4Qle>`|q0hZ6n;689%L=Y5Cs4&^1z zJCzO3SL%jV@^Orsa@~P73)A>agIa=*WJRU5C_spOA@VyG+phy!FQ~h~_973e(OEPQ zkjJT4rka2~H^h4PbRBzjK%wXnqYBwWj6xQjhIIfsb$~}gL^((Mad}z=ATj;GOw?)G z==;~X1#C5w=8f<;Z(GxuS9ZP4Mwjm;59#~UPe#l49v2DnX+^k3eop0ZCHG!#<)(8+ zK&B(_oOWJr*I!j?&p0-8+GmjvrCK4en~~|}zI!G8{~y$Tj*9&& zM)pkZoi9z^b*v6;gh((D>x>gcbuPWWKia;(Qd~z{sg4o#kNWzX%a4f$(mxpY5X}5lQ5D)v^#p7{_stW+OvMikRT&2|=E$$evQ6nKF)5&Lnf} z?(cVd`l^=)_VIO&Y$#;xJ1*Hh?^?+Cr(xW`*V@%`mn5)#mN1ZZtC4EAviF=IVbW$! zF~DnrV0&hbjuOzV13EPUtR_J6lWS7?3$S4=CCAbcHI((|_Oi?3bJsvcL2D{+#QE&kkOSKz(hqm6hV%9`+yYziat8 z%B%GKUxD99NT=8D4`Ge|@m}Y>Fnl_(SQ^u)VWX_>xL2b8-F42zQXR;gz&~rPuhYRQ zJ80Pb#-^EA6h^OKy-g4A)noD@q!sU=bj5TA!@avhGSA@nK)vP;_V4%om$hTxzo^q& zCkOlc{tNc^abXUxvF}eAb(wpnUBE!>`)eSj=$txwK|b8~Px8@4i!Dv+l7Ri;-N_&~ zL5Xr(?e#-ZQWYCnUMW#uN@yMHUZy)51DcC+_WnMPl4`HEzmHx|f6(8DMk4Zr;FE3~ zac<(5?mXO)(Of>^`vVGPjq<<+GenjQpm&y#q&kp)TN9+S0iL@r2TM?!LrA}opk-C*od+zw zUq;b?<2(QqMWI_!1>h#c9kchxv#G_oQDA-%$6Ckat60LiVARybqrVR1z>h&-YvlFXKwK=n*wv8b(w`5A_OaXu`VT;{%-&LXPc)UFu;1ja$*}!0ZHQ$-zp&nOB z6QZFfpiRA(#w!cZdRCXTT^k&r`fK|BAlcPEFDx+|yBfiR!e2w*U*%=FD~=KMH+_FZ z?5}*`;eG!S`~E=tnIFJaypS@Fj37D%+ZmtnFWmPJax(-}rKdWAd#TGaj8!u$z5X)l z^|x%HgBJ0?{(g5HUJ>X>&|@6Y+#xNG=4HqIbLWG-#v_LJk>(+d=9F5Rd6GPP;_5kp zte+D^3u&sxY-w(LNFl~8R=6hcz*8ee@`6weKssjwDjxH@C2#;<2LK-Zqq#3Wp1t0p zL8lHN8z@Qdh`J+P@R;O}3?`+m1ElhsHZbMS6@Z({nSE_RRQ1Li@d@f&i>z+5vQoU; zgV&v%H#h4%Uahm7y_POFCT@iUolC#JX-0?h2pTb&UXC;bVU*Gzlf?G#^{HOcAh>RB z#wx3y&^V&-&-3c)E@*k1x$x%sd!6-oe5rdXuw2{pXgH5L+QCOAC!GhJC6qp6>_6q9 zb-=;1U%&6K*gwL@Ws{=8Ku9hL`_tnQ`*Y{oWKoe|<-*9`-S@XK_5EFf-1j%Ra0YI> zbyfj{&-wJQKiV##7_kljRRiu>?s4ROa1W*EFUr#LgY4-X0X%Vx z&I3Xn&{{I-W!a16KTBYV5;bPJoKYj;=6QhH!g2;sW3kGDGfw}Kg!MpNhevvkR~7yF z_5D|uw*(=cvCUSBSE=jrN$I#xT-vrb4;@T>bqDs(#0|A!FRb_aUDZ`2#7eDXOPp^I z^m?wA(ABw!Wt}<~>(Ldps995DCq19eoc9g%#QAPcgJfRMHPEKT#EvDP4|xY<(!AZP zYn#~rxc3_fyqP{pprvTx9le(jjbo{sRMj|fOhw``~I-(6cf6pq1V^< z2XAI$&1Ra}UZL-AW7vdqvdct$kMviPMCT0yB0x;X=G#?13*|(D%c{lxR5LlEso3A~ zP9{jA+89Y~^!kyI8X>rc_V?j)mRY`}nVVizwiyK%^ilI*UYdC!L{=?|H2&$$dEY=! zobTo|NG6Uf$&TdnzNQM+2N!uv299xBL>lu!qNYiN&n$Y%p3 zj!SR>h1i~_56FQ>RG8j5!X$l#a1i9rW0G^9v?xzW5nz65IRns5L-)UbajfZMz47Dx zFUQ5}_SdcyZir;g`#bMnKJs;b-@ixJ14xJ+|ItG`2s-bDB!*J@W4$^yaGp{hezj0% zb!^i zk&xGT9-wk=ZK-1poeh>V0P84Orwm(te>msGx^?ge>*KmIz!?~ZVHx|wHd|)C5@j&U zX%=RS^10skhbQz(n-iL_KfIb5^!+KrLsB=e8-1V%qLLuSBh8bnxbF|g`;PjFMe2%@ z!glofNuI1&Ksue=jQ!EU`zmuHsE|?-<~pU+-9f2cB-Jcn zRtFS{RA{_1dTyxZ%{{8uL!$vl2BW*|IuDRWFC>56D|nfo2MnTrs;eljQU%b#ns;~is)|p#?@v3YcUPBJLWShpJquYQIU}!)mlKurxG+NL(z%nM?hEU^ex6(O zhoiZ(iFo)WeI#pr2B1O2m7I;a^HA0lwa(|O&pYdvPW`dGAWe<3&1tF?R;Buyt}d4& zD`Ks8r1}O#s2CYg?ac`muDn|Jh5nII**9V7)Qd0{kwI* zG-?G<3g-Y&X0F_(WF4`8&C*IRpcz#@?Y=)=SKmKj|70IR89oq{i8G`Lt%Y^-w)2?l zqz&v31SRpPS!A`>UlQ^n@)J@kSn2Q6oD~_zRwvh%Ju zsN~Jhe!1Uk=1VB}os0eJD4uoKULCCz?@H!yu=DQaBVT9t{S!f3FLYN{%j>;-CR?Ky zguFJfUP^ZyQ~HTs1A;tWggIK&yg4q{=uSK5>yx;@hr+W*u6VjN0ZW)A|2nS$b(8@6 zwntA7)=cYH20CwaNr;a(=K((7!D5er^CVIQF{}gjuau;-RRv5*i++{qR-}l#djogI&F~#^5wHYa($i8=>;ZO6Z1-a*Y_ zj&=?NzY)6ApJU}d&b&X~t4B|ahAl@Uu0zE$s0q$HGZ<*o*+Vy3000mGNklZgX35RWjhik31apAC3a(Ot-cvS;~ufTR;RXf*&`pM1G0$-KUf zCD#G)dDf$92eMiRu>4KV8YPl!*?vf#%e!qI;1vLfzMxkM=irpxy9AtEDI+}u`&Wu& ztM6ZEulVj7aYm2GtM~ouLYprn`7q+pSG_w~U)Vtewq6KNFv9Aol(7F9M4WfEu!Jza zX3%bT8(mX+*t~oqyq$NwIv1lkdrD7|&0IwmgC6LzPx_P;b})5pz}}vJfQA)pwA>hKmViYbA2q z7)!l=toHgKs^gwDu70D zKu9MX>3YxR$0>h42>W+l5XqdZKfiBz|3?@5udWjb+IqPonfBbJC&X2Pwjb)Mu^rD^ z^Oddv5#rtIEY5Y2jOL%fC6x1C*ZehKtu!{q09$vS6TBAkyA-jR4s10%y>HF4Nhrxf zsZ!r!y(8RmCJFKLIC#j$_QDo9<=|%>a}KQL6S`*PrEpLxK0?m!`?ERKHI{W?`P?zA zWvz()=bx*>JZ3h*uVE=A^A2_F{U+Gxu+S@3dIh#ej$qFH~0B0L<@gM@l z{^I~=f{=Q)uMp8ZL-dv@9s%v$9mK)JC4a7cf8k#LuufW43_34l)dd+gc)wJuI*&@G_ydq zOq#nTQzkHLr&B{<^)o{5S@nk=oKhW-YJ%-L04A&TI)L=0x~P%I>HwC1TL)0m;GlzE z9pGM{qQ9O2xJIN&9va}g3LHN!AqQ?>X$`#_aV!0-yYtTF{U5KV@4uHT+12;ov(nZJ znaqs+&y?Q&Yp}6Aw7>uA1Yy^1yl1>`ks@62zF3OfcfY?*Ig{GL8^rn9*TxV`_uX3a+Va?qeuak3Vu)ju09mVP93LtuN2m8xw z@B2%)Pwl=6<5qlm%ACqegZ)j`DhHEU7yGBaKg$G+2poS&(^Z63U1q|J{Z%EprrSZ5 zmGfH~GBLpZ1$%n^L7qY)5!R6s2pZ5^N< z0hp(_2L;d4ZA0{fVSgPzt@8klLMnfbR56Za*_u2H@_B%1xpN+%6#%CS7ng-n#Qe1K zc!Ua_SJM@A<7;+sD^%jV^LWXIIC=HHe~+N8ZH;E(u44PpfQT-?QC9o}VIpyBhWfyo zPS3sw(J&H}PrSe1N}A{5oAJi|dBo;B7Jkj++P?d_0Lg5Vna;IeBkbHk%lZQuofDjQ zb$1SyTr?HJqNi=!=X^y0>)T@WJiz+T11X0!&#eQ<(;t2w5FSeP(_u~z3NZn7Qwc)# zT;wb1<2(BPfj(OUiudbSxR)KN#H;lEb$ktdf7V~q_t#jD7W<>=`>T|qe2558=CJup z4a>?EMPz!nlyFl4f6AhAJ?QmQ=-tNqs`rHVvA@6X*4po4BO_TyQs~T!r@`$x-$4(* zGmcxI^SI~vcCRo$hYQ5*vt(ke05s<%+h+zXpT;G+VM; zxLSMPBP^;^5AxB8C^`z)1Xw!{5UT8h*DG69Evi#sR0oiSCy#jO_XC0qRkKlUCb5+> z0G3g{!h`kk9!6ff(i(bqW10S2>&sK^_R4+#^SEmI{vE;XTWRx&L}o{idpX{|XtNgk zcUgP|3O3i{ReOm3HIBN;+Wpb|6B?P*vp3sy?P8_0H9>=!Ug_%7pEeP$fcqTomc#0U zpU!ze9LwwYen9-0RRGha85KpNITZC1_6J4$FdFI?iG6=I(mIB&T&(~W5|H}-3ze`= z7G<{C+hJS@k=VulWsLnT1H8K{A|FYjs8%(8p{u39k6{KVD`Yy(5VBEWWMYYWG++_^y&bW zCq+fqwO0JfT_r@~8GuG5mp@21q?!156;JJybzV(ZTFG@^*f)Hc{_|L0Uj3~EecPHl zF85U;sJE5QLuU{mne+uW+_?Kt*o%>lTWV6>uFbYDLMtuapZChx-$~e-x13=^SOIFH zmF?=QdA^Ta-jGT64PWK{tIyMj6)6p07|+ikr>z5cZkR(JToZJeudxgosTad9%~r%! zf1Mp$g@r!d^8i-w_&i{3C1;>0j$A4L$No;!d3}HCai{GH>^*2?q^y|%c?_D9tj2>YW-fW~E^oUwb`YOL4jPn|*Z`~L8-P1~E4+D_%XSE-1ANh9nJLO{R< z_U{_Y2%{wgx8CbFfg#PSd=?F&>F*bke<9eGFf80SnmM6hMqBySJP&tdG+*qH?$_~^ z@3(tl$Ne;CPB)~~lWG-NN%M_!0>qj?HQv?%Jnval8iPmsWp=Ax+^GXf@PfJ~Lv7G0 zBYBqlTJ%RtWiyjn0W9-a2fV)X0H2#|K~ZbZ_X7|&Ho37*YdoCac=O#agQF7t1HCIe z;i1R^(#os(ZNIy*%r;eB;_M%<(D&c3#hh-+ByYU)g;(2F|HBpJCjLE#`I-;3!$StEo?`Q@ zb@pr(9?xFCsrMwBhtvVp?H^hPsFbD(po&L@1TpMyJizidh!1i9ny*uToe!#2V3jQxXrl*dvl0K{>C z{S_IRSCIar+*GG_tB?JMpX*;VRf3;a-B7Q;*JakZ>9pU|r*VLGJ98TeL1R2m+KltE zzAq zDgZGS6PRQbP!OwP_(b~trNy&b8w9%#eSgk+TdRNykPSKLJoWvT^_#wbf8(x9!b9PS zh-m85C1lo}T=p+QBGT{mck8qLyC!}~@o9tR5p1#;H*R+tQ^0-OpXd1&M|&jGmFMz< zz81=O=UrRXd06t3I~(v!u+Uj7BU&W2ty)gPI^(AXj}*@$tzGr@>Ii5}4pFxIz8}!P zg8C067|P7^bDly#xs;*<_x&|DDjjvyjB4Gn9`*;ZAMh-eQI~UU2p$vmFXa_K?~fpd z07Ib}MKgTv`y=-K7onQi1G3Q6XYyHO66KRfW9-k}&rYx3?JrzOZfNkn>Nnwi6xA0@ zNWq%mcCWgVGq#SF9?)?`);vdl9{aXGXY*1rC*Ki)Nh~~|A-=jns1x#WudF=JL*RHe%MYI8~?7p?Nu>Yfr{Z|Q$ zq-;LUa^QV>!Wyi(_T$7>Fp?g>JGtEAox8MIFYQjNy9z;(!P^hU`#57)orhYj>D&JN zk52hIr`uOqm3C**%}3AQimmIloelIUObZKF(tRFwa5{KoptbQ{9ifynIjl)ZVjq4> zIrX7~SNd?UT64?%58)F(&Tqb77yH+Dm;b`C?J|P;{-9-A>@TQ!RqfuE1QPbg7WT(0 z_Wf;a`u?yAph^Rv?iQ@?zpPMHCZsOHBa3eo#`{X3_x&N=UjM?WZw8l}1i2~ij=XZ0 z7Ms0(p)Rm#O=VlcTu6@#RgN?Xjh1#^*-99{nOE(M@xEb#)i^6Z2lM`jratI%8f4Oy zn540hJev9-Y0$lrHO`(JEQBnlP@pRu{gWMpkMxp=yD zkkmu9QU|yW5ZVgs=K=1;fH@_JwuI=4oPzN8RMyITQFQ_xH}zIO2L;N`9?NyYq6?VD`|?4%=IWC4&Wa ztaR^1J9x?5dJxqC{pHKH6bE7`gzXxAZR%og9ia0X@s@XG?|DG|@gWGH>HgbJxx-Z$ z?dpE;{lxNT%|eE7rS|<1vA@L6u_U2-(gZBC5%zyAeSeZe+OTGFlY?~n{&*dI{{#XM zkxK#A`~E=zK~~CdMp*q`zijsUffn)EF2n#@ydRt|JwkKBia0!U000mGNklyR!)Lz?BUN>0Z_CcI}g4c*1zQ2ce8o~J+alS^x%D6oAYBj-d z)c;608`vaz$8Hs~MkiRKcn4pDM>tBD7M82OS5WZYIv|dfN7;KGFjW8=o#$Oe>GRRi zE=(US_BT?6-d1dD(ZBRUQ0)6FJrJs!JY8n&uZX6D{VU_Iv+p19BVym*42(j!$^ka7 zHZiZ?_Wf>Kja3l`6%=ylr^L#*$QeL^(ApsvDSU)ppv|y;HqcziPs0mp6 z#e!L?r9pK~m zJOIQOTwwE$+X|q~R2tBv1KPu@=_1)}_5D>kB*={=A!cU}=vjA(=xwF*fIWTvF3EZ0 z{zFz5S8|Fc4rL2!fA)j^2HO{*2|1_N-|RH74n~4LAF&?h?c+Kp1Te<_y3DBCKAtme zBj$cS=KDArNn_{vL63y>jk_;&YJzr$wI$6dgOw)O_>jx#Vb98SfH0OdidUHLGQhe^ zbwFR{c^&0_XC0t(izF=>oQeL~N^z7FrSs z`{#^T`G=w;hv4(rV*e;#$3e@6l(9L7r>?G6lrS|l8+#V4BVb64$sz2Irtj}ES4-+B zQ`M&ON4JZ5RAURA=`(z=on!s(zwMkYNoHAOe*8xSk z77hx8;i_@~*3Sc^Ab?v@340t{JU7NjQcSd{VIA{%cow+wTsS=|8`yE|n*SZ8k?kn{^QEH#@QyfeV#9_$aUl??4F_FtlNtpJuaLv%Cj zkAB}j0P@(8tT+Wb`u;v|h>(o^z3*RaY?R-$(3*!!^>G zyFm{S`ocE%aND`;xbNV+dw=&jk%oraFduTw70)82B)zVLA$!gVEZ?hU8;w^Bw-*Z8 zj9QU-D34}=&56`j9RQxYN4TeWR6*le63+vu8qkHK=R)IKR0h!M5##R%6pt{4VsEMg zIQnna0UilMcLcrj0C&Q+0uat8HA+^xO`H%6E`M92e3fHqVE3YL-feA3TS!x?_p%9_ zuaYJqqi$|xF}KcJ7HPA*ai6cmibr0zm}I*{ZU#L1tKzmuz5Xo!&U~3A8T;F~)xEy?X#FugX&iI9#){8h;hbQ7gASc540NvUlJh@` zq!X+ZV)kAkNSpjKTo%T-M)8ok?(+OddDwXXyY55k0Ai*Q{{i0Hn(63bf4Ho}=YJ~Y zb@bc_?)x+9gzWA68}?s9jV!c*x?0{PR6c!`nvz@WALSUfLfiL;EG_Fs9v|HC*so^8g#IvYeZ+a^!YwfAkd`A{N7#1(q>&{^YYdg#GRzv9UBywWmRN?TXd!kIm5 zBzbn};i_?)P*zk}jIFxsNc%bN5t^4=qp~aX_2tpj0bA@?D8p~d2f!Y zgnYFQSoV(CU#DUTCG`Ef*dJB_fTU0<7aPG@C+4o$_qWfji>(5j-}i^%)22fT!%Aij zjQydRzphh)9026Lf9y7fah8UUb%Wx9b~U%%&xrk{*Xu8ANOkqx>*sj~`*-j@>!`|> z$=Lpbhob#NS>mE`{#MES_e?XOS0O{SYI4dI61F~{Uv0bqKl?FsZVlTXe9J-du!2F zo;>Fc0~`&t%QWQdr@<9Ao_7{nTkg}HuZ-*5tuDh%$N89=&N+d;+V5Zcyh~5}P{6bN z5JtYFuA@ws1B&nrYq09jt2PGRR>U|eSzWn*0 zc@(48-bEk#JL(t9wDY@!{bwp_UeX&t=p(1Te<@L<3sHUS@A9%wrdR4?2DY3WdeGSD z`_~mp990e&_x-Vf{oNA8$ENRZRhN{#pYfMGMnt9pDj?Jr@jgF7I!e9%(B({Z6`DB$ zGF_xi^M$sI>(QN;_4$I@dKer~OeftrUSVE_bA-99)Ca5FMQNn^z@?WZOp@=N6Ho-{ zYqr&Xwh)VhhGf~gs@27spjxINVcW%ty$-p{hQRR?c37eGJL?xKmS)|b#+`WotNFh zDBBe1SU!=nfpZ8NGV%JqE06)C!J!_NtMm_8>`HRE`cjAtzj_^T;D{f_dG!|i+ji>7 zmR-I3pRj)=)%*Sc=<`3G=4wjQdB|6k$FQgGUnnw~(&nv3eSft06q>P7v$t;s<;Bq% za^Ih@fA0Ik$AXOgt7TL$ka((nyB8d;KIr!ux6iBu*f9 zxATZTu3wf2dTHijQgH;Q5-EH~?@N5Ms=UYN0fmL?o(`1uJRk^k^*lgc z*LeU(!d5=LIv|_@SSIl7lI0 z`zMl{%~*2%^%*q;nGEExzExOMqrWcG#s1CeLqT_M?^D+q{rybOfSmpdtQenfyfE51 zT`eJ>{(Q%^pVK6zU5}3lijQY4Z=4P6+LtY`PtfKvo(bv?B1Ya8be}k`+Q&<-2((Km ztH?S?H41H=2e7O6>wqyeH4`jv&1V1|>|djQ)Au*3>KOa}qM!YDk{t84eSf0LK>+&L zA6x;@oAbiGzCQ{RLC_W)>t(a=kE(UsER0G^&Hq&nX!`!%Nkr)Tqu2Lu#Y{3m5Bn>R zq3`cf_Kqq#y?&CF3y875-WJ1{kY2B!W5G&)UlP(RHh*w`Kj8X2M>~h!0SKEH61mT1 zbuMS#U!OBQnZf}_E!Uf$DeBD$w#IXU@OZ$jtmR}0b#B&DEvL08ggT&86ToT$vSfsL z(YOz)1FA>FI)FV0(aUtzjq?DVlYY-S55P(tfHTemWUUTh_15fybb4x%iDv*JVa3AI z>0Uz7*dHA)(0_jPNKD}7yd-ky@f~v5!K2oUJBaPm?1IKQ z3&lsy)X@%d;>#-!Jy3>{Gi|uj&UrkGrU$GuqVPf24(iTgptrit%R|lvHumk3vTvE{ zA|*QE1H|gP@2dlLP(D<}x#t0qyD@vc4eOQ%%{hpDe<>s{>P>4lgJS>rA*utCz$5mj z&P?oa*LK&q@1L-LS-8TW?@#)!y=>m)2TEDK<^!io)HWHd3M3zunm0RV#Y8L4A`jPNH@*JiB5R27P4&c+NXvt*Zh2oldgrN5=0rM>Psd@=Gdaj%Ytkwahmt>`tUtRK5 z&jSGSP!BO&*}Hs}m9u>OBtR;I};RJb=A>T|S}C&%EUXErGx$TtO7~0kbd8vY9oZYxc(44uNa&WT+{8vO0OS+fE){P zSKh9A$9E*?^D9O6w1-R}OItk7on$npm*&y8SJ+v6BqV*z;SCNjbx7=C5m}8c2F_C{YeB+a)G~a0;Q7 zwZ6ZQx>C0^fvZY$ANxbVbrNI$GVb-es9ey*ZrfR|a}#%q_ZN%Z-QQ38RbBX2?R-2A zF?%80clKQRbL^}M24mokCD4;nE6E3+6Clh<`)&!4bA>O@5bh-EQo!bI(bYcYA2C8G0LpHN~>G%c1=THZS5! z+~3MBnP5Qk4jz+y_V@Y=@!l>(VoL%#lbiAKTiaH7w(~-tsB_HDPg36iHI8iD=Ms3& z^F9yz4(Ms;&A4AmbPcpnN>6LMHjXQ@<&?&{N~WzP$9~|JT!!2t^}Ae3eJ&^lnuSK5Tn08lda_YFOdp=RTn-^8-3Z@1)j?fV0+;{eEG zQWrj(j(z`N>!>J$JWYKDP2V4kXDb()X(ZG=b!FpPgf|N)iFuEGe@O28L+$Jp`u;%b z`@_l`2wDWx5w0SsC?8=dQD;{1zRJyXK^kv|mX`}_MYq;`4LsiV2V zqhg|V-pB0xWC^EYd+y`R=Lh?4P>ykBKoV%AMA0b9S6GFf=_JM`-SivF*B9 zTc7(%i(FPOSBON=V>wpxlZC}OUb045?lSKnr?c^h;^GmlcjnP2cAJYN0eXA~?<))G zn6Up2nbK3ccx>O4GSJ1^zTI7d9CmYX*79+y>htQ`2uNQ#Xq_#eZE55YBf`(V-|o9M zwp@4*khxwRS&}=h)s@cNAX?GzY+&@lV6U>t&G=Q%zUNc`d0+PWGOPo-v|!H<&!_{~ zZp+%U_OnBaT&i-N2dV#EJc_#i`7BEe`vX;@;-CBx7&YQcE?%m6n0w8dbuCRQL7~G% zQ4$7>#l{-T(DwbQ?g3a_qM3Q&U4IZVx!CBLKOq8@r&$RZh08%q9F9bqv4n0W$7ofT z1nl4W%ul^xb4Cyq^;cOH#9qI2@V?IBqB5>YhNRg=#6h0$f=hfvl`Ywc&fBhcZ!C}z zif`spZf=NRoYNlP^KjQ;5%&{Fg_1R0N^2Yz#`8o+bB=KLmSCZr5Eb}Y}Ww`d%{pO zMoW@O9ZzQfU#VCa^uzw;8A!Vv#-}Hq_l< zK#fFjKyI6BhOgPa&?l60-+vj0*nhz$x=Dlmm%Vy@f8w_~3N$B2tV)?Y_5B@TDepm^ z-P#t&h$Hp=fiCt}nGnW_2#7?Gu)p61q5i_yzp2N)dn+DC8u3KANkWL#A$Ilp^`&N> zF+LK;=ef&2ciu5V+-~_QVhrb<5m@^vjr}#HQ!DhT)rgV zkUg+ydvyRuHYD#3Op;8@YfvbzE@uFl!{(AEb0}|p2;P5wv}CRaH{M*^ctAmeZ4-h0 z&DN;MBycpuHV4fng3ysf7rw7AL8cN6;OU|5dEir zjpX2?;j^+w&igm+zkTMS`batz7{5APe|zI0*XcaqJVE$gUGXm$ExAKL1Mbe3PrnYZ z2M;CT4x`rSu31Y!-G4ORsHh*76_?QNHJ#Lj>zc*KQc^cC@MgIS1MI&%G<;qNGc^(>$?wn+(Zh zE@SpH!KAoPpE?L5y7yx&2vKRU4u7g4c7Z4}V=y`%Zz9^5a^ttR=5Pfxb7tjv z`d7dD&ENh@?|khuClY@Aoge@1-~ZkB|M7Pl*`m+awoC?eqVw6iE&Z}JZ|!R}oD6$< zjmWp`;T6WsT$t3e8u#)j{0X-Q-f#CBU)`W3U`{^)83wEqGel!W-RK!IH(QbYu(xm5 zN)uIi?05lqwXkx2caJn0)lL84h_@}tb}z4W68+fLX}2TP$^>0qEGsM(!1hHrt_Q&z zFOuOh*(c36*57Ql-?2Q$%~cw@E3IwbM#eph+V!=+_VvH@zxp@R&HwCw|DS*7|NZS9 zs|@zqLBcTl@6;EE@WBsOmf2h~WB|s_M*{pUm=W&^9Cam<# zOxF<->wx+8jNiTQU&l%gcdSJF-NkEI6#Gm!e1(*;`FJeo~^KbqSe+|v`&ENht_e0giJk-9w%7L=FN?59n(`__;{{i-Q znO7;*y(m1F8Xi;-sypaIE4}{WYHT~svAH#!8_FH5y2&0MI!P07n(|0{?OS!OD36 z+~YK!cm-LjE0I<&;H!8jsnH-s3A21u`w!;<38n(OVayltN5EG|}J zR%$UYB3O=tDH$bu*_i|Rfw(PmK6L-UqjNxBEu>%L?6>-{QM1t%2D(qUARn44uJ?ve-qdYPkCuLStR9MJbJz6H&EOp>nxsEO0>MH z?>_cd^|>bCsk3fuG9?2DaZPn;ITM{OUU4CzuHc!uwAdfSuhI|j7(|KI_e$?T|0*k%8`z`jONid(NJ66zgyk9hZ5{h3 zVVlsqW8e3?-?KT}t zuL(RdnitSNXkOr`#XQSBt~f>sbwKo7M$8FexNMs`Aj;F^mOMxoO|pUsGRVZ&4Bkzl zmv~V*ctl;~aOiSENTjW3I2yt;MCQT9NPS`KuN45e0%)iQ!j>vc9gX6UOT7DG_R*Ls zZ-yEf)iNx~1A%MHJt5C$FZIj)&Asj?-~9=i>nHF3#4H0nUkYB-@uiT?67~;yF(Ryx ztPPt7F9JCC^t>pJFu#)MS6o@gDm%zauVZvfFrGhjBx;q54tKqa zg+wN`CgD~i;S93`JvMkn$ADTm@&=HiFQ?lyXZw`y*%jM)%p#3<1k}RVrJ5Bzo{$P> zNA+T~;_pf|*8#=)=kPiJ0X?%IY&79aIqg0SFyHh2cN; z+=JGC+>2-#S@9@z{EF~C0>&TUeK!=zcDrX@UgucMX2$bZ8#(jIE=~d0Mx6&iHWJRd z$eK!eWX-~*>btUs2Fs}yB@xe+Y=LTe0rPh2fNc5hD3oaeb}8gp0K6OHQGoDD**Xsh zV#Zn>;E{v^8xZOM5ML$;@=BySKq8V3GN}P+2`g3yxJ6B*^gadTa?mbBrB$VaU}p4u z5JnB^`4JIY(<+AaW+JD*@nCt-n#EB+Z;&_Z|3EBTpb8DDzdpZf^m|rVW?%iyuYB|G z{-t-m`kB-GgXv?S-+KQazu$eC1vg?iJ*{(TKj+h7o!9h-hCdj++9yqau*3^g3`PFK zI^8GE@wHA-rjGDk-F`4<1?qiMNP1@P{XP4Jd86`8P9J)a779fTpMy}*UTRwRbF-lN z1}jv>!s~$a_+YE(L8ZIF_*Fj-m^UK@_pkm+gq~f7gLlht$r2bYo;k)M4CDkLKm9T| zc2-A=r5zay)BTXUbStv>!D_rhkO*g8G^4bgsB}`aMtRr;gs>CxHcE6Zmfla91YSL1Zna)zw-j2$Oxgqz0KvhV8{qhQkE000mGNkleRCOhQZ52W_cULJ?bB)PQ)v`>Wlt_@~fhVz{BUqmYBjLWP0 z@9!H&^f2Xc@vV%n?+RK=k!XoK51?T1#*T&J4+nL?>L%+OM7!zL0kT;E4ERmCZB16Y zm``D77p&Qh3;nz@7tp+On+9iiZ3L6XBzP~PA`K`+{?qH@q|O45)zrsywZ6DpG`1`5?hf2>h*rjrCW@4~%)o3Hfxquh7|)Dv8W zG?&IENwy1*d0xgN&~)S(8Nu-sW2+tWQIy93-|d@^=wZsSb!M>0XH{Zor5&{Z(p1%2 z)FT{ww%XSi8mt8%i&7IT@zV{}8rd?O|rh?INXYR2z%q3xVnzw|1a`O=l%0!3qA*bPm zb?KdRb%-V{FOe=7{+?aQx-2Sz3~T&ywDA9SoCnnWfdUd?rg^+`UeZ0z=BxEkc(-nU z&?iCYAY*?vrzOYMoHoCu`vq`r2?mA~P_w<_-(vL58NU6@Pu{rRsI=0lH(`J4%IW8S z;6j==Kt;+Wj>@l-P;v1X`}1fbR2dRR$OrCSfb;NztDwAsJ(T zlZgkIl0N5S^2unW0F3t`>2p3NH)QOOfHcWSr8_pLww-5m+?jV!whOpBM`tdtX`a`Y z@f?HtV4drTQb+S7?N%du>j1>c4{jS|ExuF2xh#|pFt*z?s)bY3>(l|#!@tPF)##y7 z$PlVWJap=S#?#ReqDPEEXESCG(VKwKji9qtXI^g#Qj zVxLqZR_Z<9yTT6_u6AJmE<9UXzJqzg?sCrJD=*}%Z1c`fr5o|(czYm+ z)#W#TFnVGrD>j$ca}9PD@#NdZ^#kiIjV?w49?f6n+OvM3r=@&6vIN?ddgCiHxx|jUt^K{gWJg-gH-yi-O$uPuL$SA0Cse+Fn1<=`6>K z(Gw%nWRqbmqdIleVUIBsJPLUr_kZ2mv*kZ@zO{a&$7I`&{%hw4c=$QN@^9g=QNr8^ zbzL`=U$PUj9JQ!mW7z@)^qO02W7XAjm#D&h@b)|a=2)bD^0<}r0D9@1^MJZWT`5Nr z>7EA^4TP}h&F2AXOO`~Er^`SNs$&X0sR9t+&pU}2LpshbiD!C5g&=!+-<(SafSI#d z%yP1WwD@-SZU_6@eCs0m86E86orxxFJK`nDLD!6Z|HLkZ@cILvujz5TOy$?-$xz0o zF}?=7xlGpVvp(I->zfT}BaIBS^V;U4_4m*d<~^>LhekDlVH%P_OXoQkiM6Q%$U?Sv zYPn2SI$UVic|f~W5LV|0TaS|Iog_GwfonQmyDldF*g51t+TfZ1DNij|-Q9`EJ?`$=0BPARD%hJ^U}@_BpSM=M_dEc-Iv{&oTL*j+ z=K<1-Fckct`U<|8WMWG;a)@;R$w6gKeTB9HsF%DV_V)xKtd;RQ?Z%tS3uioRla_xR z{@vks2d8WFXY4;%B?t@c3u|)t^XmI2;N3TrGp{Z^K_)BPo+GyNc>UBzrf1g``x;j!D@wtVwsE0_hF>jU{dO0pVi;*bn`d5^QaneG11A^r#J^;PqV#M%8Q4@Tpv(S zde}KZs~xo3bS<;Sqiq;Q?pTp=D`a(mxh`SeQumcm2Y{?ye>nSTAODW)fOEbdKrdO1 zWnQnc>eT@nEenPx0pUCVRvU?0bd?EA8ij~!KMUkN5|xAT4rP}sfJ&#+L6A;YaeGDg zqDO@6JM^Y8xMUkkMha}rD*biR0*}>;Xj_=v=O+s5Z*5T`|5NSz>mv{A`*$d6Up4vA zs{z^RGDCfhuRfvHvGF;HN8(nEeRk%9z4E@Ry886zX?qGYu82U z@v{LnK+4mbJJD0wk~=R)ISlH6uE>{vuz)t@93D^S0h?m;^-IYP+FPbi&xn^)0gT9* z&j2FkO4thCg`Be%Y+U4JBf8ih`uQKF$==lLYB`glC#dfagR|5>CCqD`M}iBwK^--F zSw`*j{c8kQe#L3-NYD7CvDf#n6@aS7yNc*ye{cn$KdgB>_x)@1C+sf-l~fwd58SwN z-`@<$qydvjgZ(A+`UCbSQHhNW_V4%lOWW&D7+=XZ#Dvf#&z*E^cjSvD8M102%%e`PUae~U6e{(MVa({ibB-(R|)W67Pq zt-il?oRoLNfMTo)y$}$JVLITPzCW?2x-bESzW>6C@)cylqhY#XuiuS}GZQ1ng!j>4 z|3b*LYlkk+nXgi9GTEoj$tVY%ceJL~oy#XM@9f3&)cGbC%&AMG#CdZzfPu6hel`#c zp?Hi|4`utoxDFr>otMxtIyspsDcoJZMzbaIcuyRA&I9;XuMRK^WKVC-13XHgkrh0O zHg!OhjN43=gVjI{!$CZ$4&eCdvYp0S0i>R|Qi({m{iD#FTq!=%?Stn_C~W)2E6X?7 zA8Vx1{^1AVZs527Jl5$a?615J$l;w6{k?4y@49Bh{z?9UG4sQ|fcCwr`*PoZ@6|UB z@s4vgfjTXHI~>Tf!$FVVEuFTDefsnMwa!r*hl_?c8wq#ofN(Y-jBU4xrj32G<~%^s zXM|Q)r>C-+c3zH>dhmHb8BrAE&JKNM9bli$wO3I(yVAV$B{Y=7@H0^d^m^h-N83xK zP4syb%HEb&Qy<&}S(BFb!3$ww-MHq`N-KA-de|RY0YGhnwlQiI#Q?R|LBRf@@6V?l zNK)q9-o^f?cuMU%_Yfn$^9yP|@E=xelKcKumkIk9#JRDjKX6;*zJG|64c@OhlD3n( z7zg?ey4C9ka>p5G^!mH<)Ex=e@9E~J5fa4V^Jw9p)O`|LTOX`&(WwboGC@{qQQ*Ea zhBX1&vw?tZ3uzhfAWBzVU$H-15m}eKzVm?P1-)In8lVXHpz{D=SO zRodLM!g&D5m32;XUO-CBh3N(r}qb|G(XuT+SR^)XXAaetjeU;L#3>1XXmOE@Yqgb+}WnJ zyXG03zUsoC!pQXOy_oCGr8{qWEQ=LbiJBU(fBxl)w;ca~IzWHEN>r525DRw~-otN4 zhP`5HT^wos!g#2&>#F=a;u(H3V5tBA!eSllUwlcI-TYQ{YN1?Ob*Vd6+m4` z)9AdUV}BU`LLG3&zl-(wLni9b?_RK{(p~y0Ji)7#=9hBl=}W)IY7Ol#r`xZcGH@sN+k3F5aa`uPrr{0G@nKfwqBy# zux^JW&z=y;KKpaO;|s{jTt0z$-V15ILb>r6DxSeHr$Yb%6T5c#o@72Y~b#WKub5 z&I6o&3O`oIn|GT|mG|PYF?3A`moE~i6+p`N@TE9g1iktd{l{#Mde);iks(K1vRNKs z&G>_cAe;B@nw1pDc%d=Po)ruzM7eF!Q!oI%@#zlsci#C0>HeTY(fHMX$n@2qmwlJ7 zD%3$1^3Sf?OQyJ`)aHXXfFY9`%=gCLCXQpq_eb+J!dJ%q9Qn1mL3lYl%^GQWN!kqS zpMN!Vz_LNv!y-S$mOpqoO5|bZ0jqKgkDGj!WU*NX_)6`00O49=%bqVQOww)Z8dcA- zI-phnsSjKC_HH;3`l`Aq(8c};pZ#~b%lyJJx?BXFEp_?gn|SA!vA+cDUzgUgih=sw zC1p`X{g6KP=aD!){r_S9=EP~7=N30bF*5O+`u>RcR7TjpqLLK-3Hw{NuJWw6!Vgpn zGw&`3e-J=}{Y#Vy+Rywnjwn?!Va%WH3G;;av%OWh2|68ZWIK%VWXfl?lK=n^07*na zRLd-;wLF)e-S$Ux=4HqIvg7$YAC4{MeeTSFTFEr0Bl(Nv;3X+ zR~$rR(U~0-zHPz%wc#oeuV=bB_Aj>3|VdyThrff3`Nqsn8+pCXPWQ8`*GCjmgeC5<;?qWeOa#w`dsw52D=c+YJ5(> zRlaJ$wbP0Ie3sLm3ba;17X_p@(a({O`&5!pu7If+WT7N*lh`WZop1yykpb$eadyU9T=^5%}WmO|cygN+n(vkxk z>oBG_hqkvdUsKLfA6jmsgD$LN_yDZGxp~U znYOKK8jk_G+sV=dimt>;p%3} z4TlR@9biki+!z3-+k?J8B%XP|)4Xxr`2k!4tS;9V&|rV*_Wko^>!Cq>-M+t}AyzfX zA5fWhuz!%7&!LDc*`YpIvl=$gedso3~d^WKD8KGz)9vk6tvaXh`PWLKgrO-7!tVytQ@&XC-PzTi8 zp7nR02awej4C(;O?k*pA^mmy!FDw)E>HzXq)4S=EdG~zA#f~*rDm~1*RRi+&=f8R$ z_8&YF>xS<#iME# z3OLKE>56E$f4A(Z`8+Y?Ju<+%Z{Uo=S<4WIW&282MFEUPm1c_m5=Y|EdLR}xPXE3* zo%mjyqW|I1&Gpkauikj`Yk&LS`^Mk?AH4mIUwrH9zwr5A|IN!c-gx%C_sj9L#{Crf z=l@$WGnD3KZaL2ZM2Uz1Bty=onzySAy()CZT&fWfFhdghs#Q$KXSc@9%u>SHFpi0}l0nPrvZRi^or%efK-ZyL+5Y0?NG{kHz~iwxu)1#AbdaSRrvD z4U5Y^j4^ETZrH(WF;%9JMh=ZgcvaC(jz)i2hSMAq?TU#-BY&hhvfR=8& zQw2c0m%uxicU`k&e(4OLxJ;M+mv+MeuZb3kl(-^ce~5K9QSpww2^jw>g_%CrYbCg_ zw*>3QoV%c%te}rNCaXo2TC`LU_6K-Gvd(IMhq(ec<$%lUo6mjz-Cy}NTwI*GLZ^FE zYiP~^?|$>IJo>^HPYt3|o;VyX=fvQ?>int|R(@q)-#@cRxf5!IC3OSI3ME@%Icnx zYx=yzc}s28a{t^yhGzy~pcTSJA@#axl3uE&s@7D4s?89U;B^371xGQnqF`5c_09u| zTP#^JQk<=lsq$Gr58!}ds4L1`y)ueKvSo5Lz_wixFW-3jxnKXyx4!-jOetY143_VLRi2J_AHM&ca(i3uZcmM% za=c&k?XFfj2CMu^(@AJ#DA6&~t;VC0ibxKEUNsu!FuEGWI|3M4XK!?!_7#a$gJ^7T zS(z|C+qYx{-IMTePISl?l{?4Lnj7@wG4ohj3FPg&GGqx4URbFEcr3Z{vx=~I6sC>4 zSGLB2T&-Fi(6SN@B6^2aNZ|%LaxQHh5JeJAyn{PkKJ?&7CLI|>IZ&i3-8w)@SHTVC z88a!rhhpm{j8=H9fc?XYaO^J`#Q+`b?=c8S%Xh3CRsj&x2H6*k)97Hq&ZU+90Q)bC z6}G~K=EI_iDdL}!flNP}FYsIrPrv+?tD8p`*H^f@njbv$EKlc%IrhW-F=C<3h zH)#-V!uTb2*bUi5`?NUZ(r)HvTyDw1ssWn!?_>S`HVxI1(T**rK?1?jTy8E&k}ylY z5S=diVlU(s6>7k*n2U&t&1gN?Qk%Dro7|0qSKc=Oj;) zVdKTdYLXA>cYdU-$|TA`z}YcJsy@>4dJCMh$tXGbS{(qb1`f8O`JrZedr8+4(+$b4 zWSmu{R@tesNi$vz6*Vj5<-xU>=N0ny6eEf$C)8imdGH9u-L#JMwbo(#lOx&U?N5G6 zdYTe|<$y=;e*WUoBe}Y{nEFB&bA~tsxdnbz`rPfYSf*y6ep};gRXE(q>YB#8#M%@3 zE>PI!Hv0a>oRKn%mJBv7|2gj|&~ z8RIY)gG4!a*7OL*0TrRYs?i`AE~N&;0p7Piq_yh%p!^RtQup(KEQ&=L@1nZAjC0qA zMpaWy*RtJ?3+bScq*PvA>|d2tY)sv>LY7B72Fp8IrBd#XAN}d~rjuTJe0qLP0Ef%V zCtvxBTwhKV!0C|S;-KrKzCYVs$d{h^2$h(}RwoNsrc$12PxVIiy)pK$QVo9SBCxS% zh44HYY%$l7f`A-d+CeDpE)wR!#u|H58J1A93n;VJIUG%sz6nDmTMctm>m^Hui};oA z=Y1nR$oHLc<1TY8Y89h%f-Kc)?OiP-O<8;aMF})`3mlydpYj~&c3*`Jk#X23ejb2` zCxS&u&J#&KO&y??ulju1yzva(0Tl-+$aOfXddZdICLY$UCy zI%?FQRfOxZfMQ@3fB*~+sy~>0ldrm0C##iK`YIzH%@)DYA3(?c(Bm=Gp2ztEp7+yd zdyX$}Uw-hz7%?q?%hNBtcX@SvIxjw4Tw-bgvCkt}Ta`AFwISB*1AgNV)Eg7|DC^ii zjy=oE_UG}dxbLM%8szL&6n(P|Z|W$N?ZAD%KHhJ!e{UouMSYicT*dNMzmteX+WRuN z-+dlozBxMO%va#lc^}A1JvU02CGRHCOGi<&T;WkXvXSb5rX~OeIBen6mSbBj&3S;L z5LcIbL|X?))J4W*NOeH12GG<2a3qYxPmE!eDc5 zd5fL6+$CCG<#GD)De|B4!2R8Axxf3_pZ*D|wH1E+^!np3e(7{veEQ!B{vS^Nlj_?D zcE}h6y*yMAucZz^YCPm*{*_h z=6S;V9qg|-hUVymGDi0uD-H9qIxp@0GPsYm`+XYFpF2mDJLYuey}?q*h^izBljM8a zfyZcRHLDs|?Mp^r*>W(h1B6`>$QGNTr`tJMzALt^14>FzyXpYWxB-TRf7qz@Z!%GN z5hg1Ulc9&k+-n*fCSi0PWqtwo?qc?7c(k4YWQ?3OVXh+?`=e6 z7aH7Od3SAJrj6!(?l|_5WU|CssbogNR}MyfNJ@ySPbg`L?mjrDK8SXFmDZb)J@;4x(cgGKxN{3p*R^bS=BpI z9U!2*NU@7@Y9UkV@e6V9u8|~1)PrRb1nkC60}|l!zM+W{qc&WVBkWK1ZHfR`;$R!K z=s=2%5^w6zf)J+w%a#<^qMf<56_AC^-|0PdfsV&=cZb{C55M>R@$QaMiJ9gp^gn&? z%W{2%%js7~Og}nR0h(^yOAE)WYVpJ`v&FWhGGu;Lt-;fHOo$06Jv(D-BShx;vQY0L zB0DqPA@)z9H`-E^x!NJ2)Dp2jBHphfSX7PJ7;RvT%E?N{^D>$j*G~8T%Db!kw$u_Y zNMn$IOD0LIm1;-wq#aNIL)ND5)~N&BDuNh-MUCqK9qUEb>z3TB0|cg0U!|=BvfktE z5b@nxNmfw|$-;F_l}V7pLOIYyW}58~c!%=t`4U3*kjy9Wt9e>S%kCamr|$v4MB(wJ zr-@(<8XZjfRZ`8H$rETZ8#%l)4ICXhOE>0eIH++$$<~&{oGyBK`qcmY>wped*Oxap zZ~wwKF5h@#s+*Soxt7Y^N6$X`&L1CNzBrv09FO^jV0-kS;j?IaBi<2t4|RYp5O{A$Y&6Sp^$@UI@plX(OZz5z z*k9`}MC@POnw8I*GEGL=I^mV6F;}xFJe!d$<{vEC+ofFC=3HHU{7Yt=qUZey{!bOa z{nQD1dHdn_|8&}>q}QkAAAj)+7gyKQA@JqJK~4t&gcJ-DWvi04zQ5!jsN`KQI`3nD z$Sd{z<5`o{+TPj382hi(k*yVyUBS>6Ay!1xzX+yeb8y?^x!EC_fD}EDt#mX8USTf% zd9xRd>_NmupHrH^cT^cl|7?Iqk)$ctV9;sOxFoBP-gyAef%DG;1gW}>_HQ1+ z9kVKxejVVlO>*P&fED?G>wrSSQoo3D0H~^#gwpg?;f&bp%~F&j{Q^xVmYjqlOcldH z-*nH1@mcq_tr7dP2-sh&_uB7lR&R7E8(Md}^t>Wb$|xQ?$nw7^rUu2m3{#CzqZk>Z_q9V2%b{la!DpW>T$j4I-nn0o7UwQ6t6_({fV>#6EbmqPp+v zIS;_#JisE1ZhzK!07d+K9-!7sk<`O5d4Y9fz;Y-q2QfLov6^|MMBXiev8THsBXpcB zABSx1%P6M@#dIbs%RB{cN(dOuYOWIduwcVztQmk+ve6=oTBO@z&GS{hGP81+zhXO$ z2V6|&*X1x1q)~&ml3w4RY|FAM=U%reuPdj&_%fXaoccMZ?*HxWv+sR(?HJ%I@5$Ab zTwP9Gqv`(X|Eq)n46uJunxPD+5d8<-_xEa7JsBo>Do5hZTg7T%{Cl zXWRyjuqvMvPfZ%5IsnCzj-VvFV&0u;i&s5<>zw&@or3%M0B26E@r;I3Q@ zot6HZ6heeyK)bw*dg7;Br>KAW-^Il#+?UIXQ|K=j^WS5i8}V){rE%~OaaOI0NYUs| zQ5DnQgS^1y<*CDSadW+S3~>Ma#qsv`{{C+I8)24dMm*MWP0k~|q{nN;^J;y6iZVQP z3nMxNE%wiJN<%1bCEb2>#QRxF9a$t%`Fs%Z12YdB@tW@M92>I^H34`&l9FkSrRx4W z(8Wl1qa9kS2(j4a9=RTJ9ssjyviX(s0DC*glko~emqu2pcF#-)C#<)~BUaA?D4GXE zl4yqVi+lzE%BdwjADyigz(mBMkS+&(+k^sQuO`Zx&_~x&JsLVmBBP%8^wtFS%jE%A zhl@v7myfS6o?c%*xjsBToycAvZZ0n_564q(konj1kQlv#fk9o#nKo4bp}v`~(@6m4 z&w`#J`_I;n0lrwj4KV+{(D~QJsi&35qdF1UQ|eO}w+$M(x0_3PKv0_n23m7UP}sipoNvHg|*dU|016E zfrvg5<`Mv*v;ZMK5cb!sKA)jZ(f{J&$&I}A=;E_aFTU`meCe%=FTO2beEZ_vH{>&q zFP`3%M^_WvzMQ{$b#T-V;Xb(Y=t5QN@wiD{xr#C-3bhI-^D)52w*kKV-r@QR%kPAk z@0Gx58xgR7 z&z1_zj_1{Alprg%v1o7R1PSj;f6TrTnMiXfn=y3bna=vdF?h}TIRW#YCBqUkc}j+Z zYVD)50pZ@afD>zA#++O_=K+fx63K9no7X(=Jix2oR0q3{sDUspPDCKo0V*Z)R%zrz z_6&0Z`bROtio8R&1^5ggeQG1}uKX$uXzBp(2WS;iN8=ZPF(}ig3gB(@d$@FQ3XvAC zwfYf~f|*Hph?Ydku~S}};q}ES`d^)*Ki<5#c<1Ti-8U|N^($BZ)~`PK>%a8)jq8hN zFOO4`1#+B!srCIV)T3`J*^*km0*~%Lo%%-R&vn*gfQ@ehe7JlY;Pz!XwT$lX#qB1> z-^#CtP}>YhHIt7)ZXxKo#dNKwWtcEpI8CzX&{LfN&H0j#X<@WxRWX#0$(H&Sl?Br< z->)@yjeWU{=C5m9-%D>vWPZoklZnvAL)r3qz~F2kzt(4rZ8cd-LNHA7!_NaKZh9}p z`%7V!V2FfWR5ba9aRF&g0t}-B9eHXc|7xY3FdRH@p^W(raie-Jx^;l&T_jaC0=T$& z@|JZ-C?_Vkdo}bx0=1E&5!a1mNP4YQEkdvsfY#GnZAL8z zLhT2I@MU9BT{V_upJct{YG&Y#UK)BGlkb0iEHP)~@AmUZXP(BpK* z`}i7fJwAN)jmy9H@4WS!-+07=IAw*u_@(QA`t2zN980;ILhWHXt*w8L#buYRCtjR; zyB0J3>@fHI=dT2x62R5q7@*9@06+TuZyjHJeE(w30mu6#FN7+G1R;VXAD3JFL6Dmm zWI@hhiQmjFSgAtYC*4+>vTb=1L`g$*R4Q@j$WgS1gTYxywk2`MqT10wg$D1Bv415k z%%c>dT(XSZN;`9$d7tKa9MKR2+;G$%Tgk+el2*bUEr_HJt!tAtTl$2eV=X0FRB1>q zuItr0fDN2%UMLHivFxq`IMy*}4i#!T1CRvw?Ut<80UQ)5R}t@#UnG7rdP{WxLc|En zAX0l+o}hkiD;&aZ5bN6_s(zuqBr62eZ%ec=k|tq)Sl?~t2Y|76y~9MbFcn?oZQJHj~=jma^?JRq_vRd^gJVJxFL z&b;5O+}jt;eC7OL>zrUEQ<@d&NLm2+JizOKRNZ>IBrPysAsyj`P{NI-Ihtex0}F{7Sh9#ltq5jNex;UEFajgYsMOPk@$GU~hmZY}Tu__-=&HXa{GKI@SIfeCa ze&t4-|8V`Azw+cSeE#ZmLh#1T;mIinTpTVB%Xh@wZdiE69oSY9_E!nIt(=~iu>7g3 ze|NmSyMOWg<&S8`k%jMe&Glv`*6UvBwGO!gIOC2Sn ze(8&;w07hEUy|7y?hL;wH~07*na zR6tE3JeN>i%vBzjPz;0;yMS>@+0l56bpRtdSB$B7{uEHWtCZO*J)3qfidLAdt@ zTL>b)QCqgy)YJjdGHaeN>qSI4LXi=B>i`gK)z^gUfW||U#dhlenB}WSAY(g_oXvI2 z`y`^ef)2j|ufiKVC(@|{(AGL8w^LVp`4kY_lBGzniFG9yE7Q7RVF8$J<>hr$38I7u zayp$j94{{pH&^oX`tbDn;@|k?P77$cKJ(<_?uhq)e1CgiUfxX~1iCNNr-3wnSsY}u zp$K9=;3PMEVfwt${P*4ua&>iaeSNk1ZGa#D{Rz1?# z-aG@rs48TEC0OI9H%~P5sb!ABoVji!)0duQR+6>^WwxGfdC2jv-3fwjiOW`0G%(b8 z0eK%`Shv{D21IUUBE-#7qCADMQAIhv1o>bvyP*xzKga95@R;B;&H z&7e3P?cUvfwEAs;C-1#?Dgw&o^xd&(t?9SIr3CCi%d=*v6Jb_MR?=X9vlW8{%xcF< ztnXjkR=8&LSR*O{U7FIDJ4@eAG`bZ+j@f3QvPDcjIYN;waj!qw6~@tu#}?@i@O#OY z`3cVx4Si~zBQ*1rpIJU`;V#LQ%o+?+&5FD}V*hRzmqSe^h_EnOT2lw0qF1xnejT9U zp9r-&Kzen68=Al0VC0gl5&b#_U&_}=Zy`}^tlww;C~rHHr-`qE3~A6^bv$6Ti`htk#oJ~G(p@*7m-{(^*i z`d8#}tq!P2F2n()_CWX!gzthymO_@Nazuce4c$VxBTG%K2a3Ol*vj(pG&$Vg-@m+- zXD{*5i{pRuXD|QZfAefC4*bP0UH$id>E@j$*KamjRBLzTR~@3Vyj910*|~Qx_h6@r$Q6(FFf5E>2nFaA5o34vgFMl9|b2 zOKTZ@?7!%ua0FocAl%e+S4%~3$}d8#U4r=+b`TW_*$LQA`t>3RQ6ggh(zt#?tkIU( zCk4rikWfE*aVm}r9v_TqnXhwRhWAOo7@Z&VI8}`Y1j9ioO0v##4j_$~zJ#!ITDzm8)zH~Axx@QI`4cGacfTc8$C!__9f>K8MlKy!>wdY(10B8xy z)^+ZAK#7J(n+VTC49({O!E#JK1?-}tv^fxxCHrIueIXuOCM zps@*&2py$!99a7?UH1-MG?oCmN0*7q6v^9c1^vtiPO=0ES(Iq&8` z;U7V^s-4L1MjhZxR*4mT*P;X(gjbwL;6we^cQIi4^~x`9<%@4!eCacn7+ha?>*CLTcKoxS-QV8H?Y&HY$#MD&PMbtq z>`%2};4X!|Q*gh)#pTrDx$YkW%m%XjZGdl|Du6QmDY3idYXp)4Jff^Px3dyr#)4Zz zvWbxjVOgP+$Z6nLf_*f~=q-tWmAK1S?WAul1Di>flgGv|vqj}m2AH}t!lc?!2#aCF z%$d(iGj|%=TBI}PbAp{G1ko$w_8}8!eauP@Oav{*Z1ig90UonbN}~RxXmmz$Y?i9Y zFrqy!b;A2Xtn%32Fv`(N-kBo@27@5yH>iRh6prSrb%65NJp&+48xySRJb2B>KZ@2i z=;sP?>$Hl|YH2T8Ow)%2bwb71oSr;&+{@wac=zJ|bP`a0`tk8cAKm}oe&@rVe7yFF zpnv~29)ID@!`n~fjYnnv#nBfR^PiNF#wH^6=Q`T0fjf7Y8cL@~ew5Sy-<{~X-TF4b z>A3i+%zqj{+|&(7SRMvEKQAjtw1$Gz_g7pKt)af_7AEFViv7(d3Pn${%R<@Clt)V< zV1MIcv+r+q0<;lF#4(pBclD)whNLnX#~n%7za$$AbG@@DVcMrNhq3XR=ly*}HQP|T za!$}x16fMo7!XcVszpgR2SB}&HRy)CXxThSKJoJaFcJzCfX?ex2vo=FImyTAQ6H4H z0`TZ$?rXfqI>5cd_-*QdLV_T*BUa~yvlnE{W0hN#o>1RRa%a2pSS3ak0A11B)niM@ z_9k_Jkpe>c_J@QrE%ypI(~xDrbCkx)`6u;ntbF`Z{>s;`F}NOG9o~3!@kigkdwF*{ z3@Eq9GXJW$W5_PvW%I0%`GRp>JZev864UP~J@s~`Zv#Aj{Pr)deH-BZ`N!qui_=;5 ze12R!83(n5okM6+*}4y_Euygomz(Pa<{N}88Wp+BF~t5L(YS3y>@N)}WO<6Cfo_z^ zBb>NI0)_5ncas(R*dNKpgqQFQM|0+VIA`|uJioqgk6K_*2Qb$qR@lxcQQ47j&dLZn zYFX5gG){348l7_;5Q(srLLDHqzHn> zcD};=R%T+|!~8n(gE&qdu!tuAb?ShIM>hR(NGk1Oe}pptXJ?_ZB#T*|mlnIZl^|m@ zAfhl3UOGEv_*gsiAiB%4OLEnF|U`1OP^!?otfPnoao)4je{Y8?Upp7iSW`KZ9 zhf#*dD4!XZb+A7SK?6uG0J1vTb2RUboHZriAH3DB?_)z7X$_q^0P$>~WXUAyb!m!y zXEl+w4lwT^L#`U%IuEFpnE*z{#nl>19c$djN*w@c7PX7KCVSHW`L%Tb+%19TcH&+0 zfqROP#*w7qm(@?+;pN@^-TXoPse7|nu+q83 zS7TMnTZidaL!S75?J%>Gg|H#rd_Q#NfLNssm`qjq3%dd|Z&BwIt z9ci6*{narFY0Pi`Y+#KVrJ<{fkf+&flc%uuOUFXWSR`!!Zik5wvfHK(=y5}ANf^Da zf>OFNNkZ?{0YL)NMz+!jC^%k4w-Nb;2R$x98Zf`cBX!0~JP*j+RT?gCp1!5Am_rjw zO8ir_p6i@SL@GmO)*R?Ifz+j?P!NMt@bG0m|M{|u>0|Y$e;tlE{_2;9ji4tta%#N) zs~_IqPSpeMPpJJk{nf}LaToY9I^CKbPnk@Y@AOW8@%Pk@y1u@6wES&=FCJw61=b$F z$^zGZ`Y-W|~TL|gYhpdo^~iMRy-9Xp`DXXMfHA4!<_ zHI1N+GAcJkd6KN(=&$BkU{N^R2^;~K&5)gPc4@FbSy3Jr%4sf*jRg-1Ru?QVNVWRy z>Ri^IL71o5M-_#&6-f-89=lUvLCl75`dc; z_tS%w269S{cgYJ7wA^}7DXm4Z?fJ=8!@KIjW!vFB$W|>p1UoT)5&2bF#4~`%W0ITm z7)MA%eh4_PjL!hzp5Izbl$3fkj4SgWPw;|--OLtU6lqbWvZyB<=3f(fg5Vc&`04ZG zFMaXqohKIRj8WP+~89dAMp(L6AHo(>8 z<<0y{fqrrI+W;>%WN#wn_@93Qbd_;=|`SMgJdtc>nkR(dk?O zqwDGd|Ks0!WBx^XgrpK4J z&%U>Q4Dc0PUQK@<;4pn9c&6)s!qs01u|d4kTJcjQyipmWVJ*xaL$h zXXY0oB0P4OL(?on=rP|JTKX6f0WXDee?^cPZ{#+zJ#cPH-tsaWBx~?iwf# z#ogWAHOZ6T%=3Sf*~!bD-M!~~?zx}aw2~G4PnGIdUR9SWe-9P1x{M`lcE`q+Daa{A zL7k`wi^r8=fGS2N;(8h+o|TYyc+agfOfDFoJV@?-BE=@k^m~-a)_FqJ0p*8C`LTi@ z1z@pBu+AV{EZzF{U1B<=HuKXj z-li(yZ&qF)mZ~T0FlMl;dF)_g-(VEjvIl$B(*9sqqcF%Lg@NL3E?YWb^)wp%p<%KP>$ z9cS#569KoA8GBb4ZiUfcPgVWxG&*iTU+;Z66^sUot2#bw0WpXtcy)XyA>(;PLM>Nq za5^`XJ`2s;+*v-qE}4v{6cL7$fS_j`;$jy5;3_kpx421@?%TVaarwxhMMAyEzWo$& zn~69WKwCH;8jbzzaVhY#{>CZjczQn_{xeAA0_`>*PmHy>5IrX0k4wfvQXNzTPoDV5 zvC9G|uej6$8E^sw_yxs(;)z6heLsZR6o<#V7Vd$zpG}BztDj*~qR%f<*q-oJn$)Yc|paNXoM@&%0-Oy*C`?xbG%N&`SSc z@!l92uMdt@8s_I4%hEph7}FA*091wO+-&iKykCAU9kNwfXRIH;|JXnru!ZPS;o~)v zMm6wUC^SPH#10BNIwpGf1YWMyB6+IV)PI%z1q;SsRXv(*jHwbR;t+j7`uC$6~m=1OGeQQn) zHb>{|VO!XI2*GOyyWE?hZjbI`&juH9VI&w_GNLNL_vjSyjclYik*)3vNeFfkaB(J< zBZgkG94lWLc;Uy1@tga*0ClzS3`!|`K1OL%dLBXjA1Pc(ZeQv6c&3^qABo0N82sLR zBk2Ty_DL#^So%)US*2U%8SnBr!|HFgWC1~QDD&U*J)H1KfJkD>aFJ2d3x^S{HT@3f z)%^B!6>Pw*v00Q3a2U3!lFwKR!P7{q>Xi?BdUxz^(}?z{9E=a5LI zFY=eb7O{Yy)4Rq%#lf;V)RfTWd@<;D!iDN#PYJ=)`nd<}#Z^wq+EY_t2<#5$sWwzw z+C2EWNo7?vZMIWNAr?!rOo4X4k9|A-!zocj@n&R4R`=_ljFt9>z73W>yBT6-+wR2t zop%&ME{kO6!sW`JE>_-Y(T@}~6*dVKh+<*OoaJ*1If|@EA5nX-q5Z-{F(Tn6)?)ae z)a;*eA)pAqJ2@gF7&Vge#shCp%H54g&X;QI!F!k#i0y4Gz+uI(&JCdU*v3laOt6Zy z(&*z3%CokLIW?5_W$f2&`SMNsb4>lkc3vfB_tN;=YOu^7-1V4eM>ybqMMB;hV!-Wv z)1)c1H^1}g2o`Jb7NLuMb$c-@D=6HL@gh7<;)Z(GYTdi~c*4%of?HKJ2{41}>&q(O zk;5!)HGOEd?fN>eKevsIU3<}E%J*<|?nm)tAYD@|4NCh?%Tfx>yY>nhK9beMY2BRY z;J9vaySn1eJgd>+Y6%Ujv`F;XaP%K~6n+M6kz+`f>FLAlLdnD<>PUxh$psDzxdvI* zUOz~Kv47a5c+SOJZ5VbqabtCfZUfSyx^dKCY5Cd)m26t&34MHqQGI7L&$d^*Lt2S7ZU7%~G+#rIfc~ zp~_tdw9V^wE@Bhzs@qHi2LpRZ$1)CAN5ke~54r?d%H7l*mxcI4iUk*hU!yV<4uA8g zcvwDGOipic6){f)vlI5)CrhNpDl?7N#)k?89aJq8ulmmn)eIcvV5pm;hkUpAcL3`)9u8X{dgW`^*704J#bj^URCA=y<}O7t$OSu=?j3#XiB;$W+2bGDJvsgTC z^Mb##wUzPv)YfAHnCIXE?A@k5uFBP1l)0A!!uE(`r!AGYlJ*C;BVV*7-~ZE#%9LuW zEpy2!KX!p9)rtiZMn?sx4r(_j^gI1MswLx{65{%Uz!h&PV_6y*S5+7*JNsBd71)^% zG3-%(9=UzR5)*+8LHGXOg#g{2CV=k#_#Yf^AAk1o2yocS-)Z>=yfjIv`LIjavjm)W zo}NTf$$ys>NHcZ)u-_m~42|B3fyK-rqi?oW)mD(7Tn&|U`kxX|e|c0F97`=R==cYH z=MFIweEGEN^c4^>jq(~}4otGcqFa`x3Msb5Yith2I7>JxXcS#m$>QGNZ#=cSh?(9= z_OEg`1@hXmx)$$S+j(Ip4sT=r&o1{<&@m!&v0QG&dP0lk=KR=98g7Jk`?W!&OI(z8`h&RfaIxFi; z7f4{Y-G7sIYxl3Mz6q1c&vG@-@+<6C-x$?=P^m8-F#hVR*z+ZfQdZz!b4(Wb5WD1+ zVt@7WOgMYdiBVgTh9~2Ej1JsNyn?a(@#r2I#OBa(oH*L|5g-2eH-O)$HXDmzQ-2hG zoyvGT$0;e&ZkV1DP;J1UeH?D#lb{c0<>)$#S9VLAml08Er$I8F$w;fIKE^MsiQO(a zX#&ms4tEYP0ePBQN~(wUl_b*V{zw|Fo&EQ%`SfwGkU6$UeUfB&s$x_SwLb|rK%{7C;h zj4Akms=s{Dwmx;x29S&tV#REaa7KBh5la)h?1OiA8Tx54@6ft}-tJcYGUp5I`9hea z?xNK>UV!5~&G)3J)t8Ni`SY_m$as7HW{i6z)3HgU%gL36DvYD2bZ5WHFcnH$GIHR; zxPz1gVPuavyUbI7R|lRsV;rjpL1BZYl&6GTWXhzFza-Kjna*ErxSk@3qWk8-rgy#qh&2 zdhUrC(v{EkA1XSeixnJ_qPSj^cF0AA8ZO>&yqSYpc>8Ri_Ukfcbg@jR!G9Qg+@j!# zxTki&UzFFEvJT;gD5ctpb1#YIF9*8}eW{zs<6&fg6h#)!)vhp~8qA=BpuhDKSx(V` zsX|m`JSQn%#q_;hv8p;NVdum*Y&B&lY_~`JjweCGMjFxe(LaP>)g8{^aor-GavWpg zG*|}W8SMx=nBzz3*dss+iT#aObMngpD$OnJb}a8_%?DX?`{11vhj%GW#r zL0E&OBLK54aHelp@?ISI>8o0o$IeRcExYSehM7suUw+O=HfaY3JL%PPdN~2^e2_G? zKgPteE1-mz!c${@i5>BKC)mo|bFm>47WJq@9|xA=*iWM{}gXMOtd|f6N}fiIOAy z7b~&7%}2=#WIH-udzur5ZxRwgOSmJU%ir7NRT%GI3I(HLeOImXJ<)s+%9~upYE}w> z4nl?DfUJ=j_$WReQd;@{95h5O<5B87p>MIAQ+&gwJRd-DfkIFG%kGI1Qh@SYh)+;~ z2{n#Tedf8)m)hkUc5CoO^BKt61haY;&&cRQ{nntT!~y5;`rQi)w&XOEyChm->TnYZq0b)1rM*LkD0ks z#C|;<<4SrxUC{-;aEf{BLW+QI(=pcuJ>grIka?Kg;><-93E&~exkQGO3D9DF@NB=8-SAjHTA-N1=w@1gAthI2($R3IW zVGtBA(@sj=;mS38N!!RKN_U}kRd(HI!_nSp*~368G0OBS@Ga8Sp6Whft-@IhSsX!o zHXF_x59m_9ADdfKH_%|~hP;&_}*AG;W%r3r?8lY1_9=gDgQE43bA zPmj^i;iQ^u&oR-Lm!{(1>U!}Oc4|ecKgKrqEe*nSdKsCRiTjzK-oN)}FjPf9p zVn^f2`%U>H$Sv%hOE{7?CT}Qy*Hp?-#**yt?*vU7&Mk=8(&YF6TLW9@iCmLT0ck_enL{$p3cX&f?Fe5CS;> zJvJ+@WKG%ios9&`+OMo7fYTUs7 zDYHhnQSgWJUm2p>fh;+0)if648ucy=qBAdcB-+O-FBpR|=(3!wikdSE;BO@jdgh%A zea`x2s3C}*zDO&#fCOgt!>!a$=dIQuw{&iLwIqZ(!PaWzTRQZxj6-5-77HKOT)W6u z<<7`Fhk}(RO}5(Y#p|Xn1AmV(EKiB~cM1_vwtxaO0CV>r%&FM-Eh48)-YO+Ixyueu zCv!_}T`W4ES@=}8Ai(QYU8BYT#{x6AvSFzRa)d2dc>V!%=yfJ9i~2;YsG0n2Q+y6+@S5DX8Fa!vZi5P2drjz}Gt=;scV;cncPW37>zxVdpY%$(enn{{15V@!Aq=NF9_AHqVMHE zN9-xpQ59K2RGo@E`Y0UNa$Q}z$TGT`8a=t+K<{ryv+SuK3=b?$r2&o#&W)TEmy1SS{9-%ism3zfs z^d>(#4b7ecZjHnea%nlix<|V+p@O`tYH_fz#M9stVR+!d$UvF1H*{zy9oDQs>&iFc zmJgT6F;S!!8GS1W!g6&tdA5EB42s-mUWG5=TkE=70(60&0_+m_x?Y-W zzi9@28Nc*@-G8NAd)3{WA9a#)I#bsiVBEj?_S75s2)fzN)*7M=J^fFWfiJuLAKYG6 zuUoVz?Vo=bn5ZaLuSaCe+bUUIJgWg|ASXL7zPGS1-zoss7D}JJ3>PE+xEPY%v?PPO zQ=`wLjrU3Oor0Lg&yX;1v^*k~yd}c?!57YU^52qCFWxdKcA_FKgD$J&QcVu{*z`j; z`G#$Kr3?o2eM0sE@@9e^)sU=T^hD~UG=_VPBXGMyfN7K{65p_*+B0#iCAxy1} z(uE~0bCHKJ1Y~kdW#OgG3oo1in%jxgw)MF?iA`&<+2aIGu_PJMGUcfa%dESxpKqou z+uK~r5e$t;mPdLysTxO>!DjQ$iYxDU2)qyZ2Qeq@(aPXxnzn!s{F_pjLY^*=66j!d zyH1?PA1qe=th31s6CNIL^^{vqp#0SP=j(=7%0TZo&|4AK<9kUe}xkU=5G z88(KiIN@kx_2tGkPTM;K;sdZIq~3g;EB`_p;?EN7rzL{GczzhNg;_?_*4otZ;0Q#B zPY>2cMzsF9nPfc*Ta!4WMT|tDm~-E(!w17>+3Ma7T_rHnJz6i(XcsY>tqb*Zwl?zZ zE=bt|Ml377H$*>tM(+i(;)az+7ESt}0-syNZ=c#X^MJkqPgqbh@ff3#c7jyf{Z7b0 z#__6Q3H{`8@uOotIizsPYg54gY3GSSJW~wQLm0@m)gAFYsbDQ}GVb^}p^xkvFW55! z_aE@|bW{KNw}klXLUybY>c|7P+6vkKXd)9)#B#7x!t9aa+6N> zCd1xZMPhob5{QR^9QM5y=%P*BypA$l-zfHIV(P{5eB&N<~dIJ{1f_gBW>Q~*=$Aqu)2DIap$5n z^pje(0ZK-%#(Z;fqQcQ7aYM~XL#0v#Ov#Q|xO5c(4t0gb=8C0_wDx*AlXOoW*T0ix z5p%X|ZWNYty7dGlM1KmAr!)8G? za=Hn=wRU%A06TJ)1Lg`{d1gNaB%BF=LylixJ6>1QNnur@TTBHRDgD0~HIA2h&nE&p zhq@Cr`Pf>JfD*Oz{Awyk*bDua|JIR&#OZz$h%wurEV8PJh}+Y&YA1e0AnSljeID-f z;X%c_dA6uc`#Q)vu8<(G9{NK)>ptVD_IcD)CE>js6Y`{`b&(kUY0w`^wkYB{FNy+E ztW!V=rY0V0QkPr=Y~`5z2P0GLPj1IKh_Jp$`FJyCEylVQ_9Vja%-g7^1eT@jhZK2~ zML53u) z-dT_)Gk=d0P>~mSf)exug3j8ek$Ae_eX1|^Vi-+$&oT5a!c3Li$N%XK!rvW8GqaAp zm=2p1*{6gYpZk-DfV(5K2n+({)#D*nqVuKf2YJx4I(KIH>XvSdD?eDTau!)m?XX9y zT;ThY!x7%e3l199v)vsm?Nmu*YQPO=RC2;{yx#Eow>BG##Qk(h!k{iVV)LmPLS+t3 zLoCOEi&vsY#=IpWl1xsXWHNY{ueKLcnRBoUi4KlgKm3~oi$8DNb4C-uUqXdaS_LjkFdE}t`^$wWx@jkW& zmQTM~1bqi*GDPybV5&K@S7T;y4c+O@61~2+grfb8=iUKzWJ5;(9kjr07{QJf;ceo) zl)Pkj+m*tkbl<^buN5wY_bM$PiL&fOi2wR}br`E>?54|JPXGK!wK<%}T6bBaKloKb zp1<;Fa=lyp!vpd%XO^=7(WN{KA5P0L)iW?BU4(;-W}*|+O*o6oXtn$8!h&2~frOP< z4z&(b|A2`y!&G0Zz6eu6ip`K_u((k_g=O-&6DI5*cOG{3NgI&j`MF5KrP$w@ zTC!cpJG0+r*Gs(B?>5Q*wu1lo9@+=Io`pW;i)a;oy=zV6l_$-nw_zvXE4f4@E6&Lh z0zNc!{8x~RDh_13V3QGJz=vEyj*I<=xv|W^uKwcYUD`IJSL93;KUheyRYV8i2*R^d z!lewjn||GF173Hoty7dp?V@0FotRBDDGXI4=}b3V)}lLhhW%Uj{ zw}zIqxj;#Kw#o4EOHNWG*4IBBKB&!e@oB5=?l*N4+(I`mG>MrCD(wEwjiE!s_n^k85i9Np|na_$GPY6?~w3#=ko@Bah!avbx{WWkJHgXjV8-k{fh zlhy2d=R-H!x4XcHS4yZ0w21Nz*2omGkFPf#x0#X4*LA-iQJlNIbjk~Sx>kPMuc-zP zWbjjxLk1p8Y9c-#pE`v8&kF!GHROB(-$5!n%38z&rXP1~V6D1Y4u6d- z7X(&i@LoQ28$3qn#Q_U{zU%17c0quj+>;&;KRb`scNdOQRn4QNL}VgfxiPgZdaO6Q z+wEN=2ItNbS|g$N_?*T48DJ)|4GPgj9)GCd zR2Ce*>0rlX=w?3 zMN9(m?~k>;AWa1@x!1x6>r~zB-(^c4?h}5Q-er*)Ec|126H9>lxIt^D85>oUfPH#8 zOR_wkrt`C{8`NnY4HWvtBR zI#-AoTW6|iNn@Vo-+~!M(iq!xD^ehjm@N^-_kokk=<5cRfuACUxw%1?O%-Nhq9c>h z&rF#nL^uPKbSkN6kwI=i0S>67zemrz-@Rm24FnH6XVdBO!6tc6QD~wJmAEKz<(55> zYOS>UW#jsYIO-2l_$j96bK?9j#KC_ixL_HLjqSewqOtq(l;qG}@qp%=7%8<&$b*YW zz~k|N5vTHv*OVj1WAuy}fJWzN_*!c2>1V%hxLO^*fdQh`OCi_ad zS7}GB7iE$6TboN)(qeMWas1kU2u4XPoI13T|CfI4m^TLbKqvQ+<52UnI+Ai4lB5VgZK3Z4c&Ig3eMb zPN06+vd?sFdnTHat|c(cqfzEcu@;fbHmB|VWZ8tNkcQh9BQ%DhX$V_10hosPkt!(; z@?f*bYyL&vb&sbdsi6<`*B8#^2GsH*nJ}6?J%!|M_KuC%@wj|I~i4LC~`wFZ{E3dp=O(C`Q=d-zf0q z4HB9#3Vh};eH)`(GxrC_0ne{FfZI2@3|cr>cfOF&ZY}W=g&v5c?JXrNRZX(CzUc&W znclLQJI|7mUs=S+_$DjIdS<@*ui zjz;oF#o9C}O}YdvHnKy{ga)bjpQ@vknY*1EZ?ai!mWsP~!y0Kgc-c9PUj+Y5NGXmm znI6Hd2n7|E7b)VX?;mRg6p_P1{;oo3d15FYbCv*m)a%xdWq&x!KAfQbjr&n2EY&PqTC5SX$baA< z+Qq;eTH6xMNS!zFceKffsCA~)9LdeMWHBEnru zRUK-jpsSdSNK81wajm$?rqM!ilE|f1XDllqVU3aM_maruKIGLHd`0rOfd_7tU z zKQDP7Xy`FNzZ!_u7lJRHVJ6ea4ATX-pJ4He@p)LP9Oi$#A#XyTBE?}{Q@JucTTVKH}6ZLp#uOCps?!238*ij_;$wMIB{bQs*TJgII}e_X~$~F`ByJk;zE#<7Y?+5!y7YyD8zO$!3(xw5Iml_ zTUX2At!p$V0899|!34yeLBTd>&+&E#7VHGpu_>qn*nikR&e`@rp9&I6SG!wEk^B7J zAv};H#z3YJUkd3^G?@o8tWMc_p*5lFH|J7A9Hdjwhhtga&_lv_*y^KYRV<5k_YUJK zZ!qH9nAEY9zKyT~y`1RJ6A^JK^XOG+JmYC6cy<1tEpLeDj1iCH%Rlim*&{TmU-5ng zDvbGc*zPwv?-yC3#DCM6?G z9+a*E_wIR{qw*Z1YI&5vyKV3$RGzX5_Tp_q#^v(^e7#RyeRijh^Y`c01<$FFQ}7H3 zbk&U3HplLSgH?xyX7f?LKcb#6CUifA_q_>Aj+sMJC8)^;lACSfep@_IcE}gNF(Q?0OD0M9e7yJ(l7BF3f`~fLySa*#d5* zWq;%%tL%{-h9`Ur6K3<^sbJI$mDHJ2Q8Pl;cE~+o#7zZom1FY{{YYPzI?+W5a6g_C zVwdjv0b(^grK0|%k%VieiwqkIj;M+4iSqwZ?Hlu4zA&Iz`$Vi+igWJf$H#g=J~k+%)nZAzl7A{Inn6h`nGm8H`FJKKQBoU+o_)u7C@ z5wo;N_HC5r`rT}}OgEaLQL-KP^_tyRtX?G6_ojtc%w-&BImk|ms|jhUkDz0NjxKf& zk4f~5JXNe}#7X{aBGF4%_rMkvnB#Nt&ELn*`{CwkHesyjGzPloB@S8K?08-y4c+~+ zwFz!20X{K!QEpO*1^W2=05c%pmIlCc4RAW9v)(xq#D8F|bRo`GST6xcsL$N5Knww1@KC1hh_%y8_U|t%fk&l571ou$;={qg`rf1S;;1EqxWzQ>+d?J zvXFR~HH@3-;~zI{?=mBkf%qn=1W?Ep6qkO}gJ>@bK!rXQhq;7iCgH1bGrZpC_gqSxbw zgi`saagRHQEs*U&(LE3_2myO0ZxQTu)1QmwigwS$9gwxQ9H@)guo;mJpd(iRX1ECx zHlJd*-(Rz?Nb)BlVa-U7xcifj2D?r_q!si0F+x2<4=Musd8(T>R9V}znr(<~d&2yW zR!EH0X29+ZR=1a*A8exQk2tx%2u0c^;IN8Cc2lc0S8Q|nl@E{;f}7hyDf)UOya|Ik znVz^H7^Ur&XG9K$#r*d5l~5_*)9zW>v}wCvK$GGG5x zi-F!qCwi8DB1PVT7%$Js`lnR|rKoCrvK-a_Y+9rg;X|0UYi+-=*1K@{F^|U)QWwa9 z*()hO~LsKs5L7Iv)=a9yX z+#8mo&r0GVj-#1H|BUxp{7#yLv`FLaSN;rTCT%vcLsL>L&p6L=&Y!yMak(Nm4+KWQ zJ3Mti9UCjT3!^g}7uQGO$FGm3kB_E%h7vluT|e4=`ug%;O(vfw+$M=XB5Mz=NfaPV zi-mL{vsa2r%HorlJpYLX0dTewWJ5H-Hz-95Z&Pc?V{m^$=BmiMQ2tI0bws};H`Ck5 zeWAu3&$)IBV8!T{saavsV#EI#VS4?e(cBj4#dIjhQ-x3??vwNJG$Q) zqC_VAzw|P~%l3}emSQSSv9%LLuZlZyNYGQ(w-lmD zT`rs7b(<6Io2=}vSjoewB0tes+x#_+QY6Ez`I5xySWohCR1fqp9*{ASb@XbP`t#@P z?d_{ByIDU21Lw+B+zZ!w^4N$jk7!w{p}GPJOG{ z+kK2kna{SMIFUCmW?vF#tQ|PQqSrKi_t(^5*;53Ew@#{R@NNJR@sN>=`GzUm#ezJ! zt&8*NZ&?>Y_#YRO(@V@8&H|6G1+^YGG2^|zoKj>WdT0HjQb>c%ET-A#afs@eS-|)DZe$PXq;ce;$@3cb72%7in^~zs+IJe3)p{V|ySGxY zLNaHc&zLCQv$4}qc*Y2XE3#6a6^a&;$sA!&>s=1b9#gdmL;s%yz5JYDzs&h)_Je{@b^~>2 zFFE;w3_<0mpI@7Xe3#rYWIQC=zUU6fH;0I+$YvY-s^#>0*HJRTLy>rLGzZ#;3g}kg z(~vCPPK>Sw2;&1J%wy(~ZaVpgo7)vTG}fGGfmaO|n~)R4*yn#9$)Jbl5$M6|s&Hs= zy8FTKzcOc~l2cYo)TG#c)%@K?Av>hjU>ksRYcvxs87A{T;0RuVDQFY;ral6T_g zPh|t4kqMLImyS)Vosqj>k@}6(3n8boDpI|g8sl<{6YmA3v|tsTS17hSMxUeQTEt-x34R*X?FI9-m;^EZ^29ru!Pn@=)|_zF4~lx~oQ1P)02up$AE&U=e-;#(otaoc;*03?c%IZY*qd3muqDlX+|=anRB~o{ zLiimOIFdEl*Eg3eiSxIL-{jY9{Sb58< z0$%lHuL8cH;!z#e;V)Ts3VrSv4HQ$5*dv|9=?tih@$e&Z1TBftxnfT!z?Imum`|Ed zO2t*t%K+MBhXFT;5+Z4Ehg3TodB5)F+3^NmY-t%{z;NGuJ*`o>$X7a`pBW)&%tl$K zlf%Y9ODCWUno02`*;@GQpN*dV*2m^RDUxUvM?3y08$BPXb}5~s`z20VKAvB*L{`Zp zQ}bEjzE3_rV0*DUV%K=auHq6oEU9d~sZ0ad3kn=|N`28jSP5%e*pQvYpBC7CEFQ8j zSJPc^4b!DE{RX?^Da@DAI3A1$A=P(;Qj^RTg}S3B^QmSveKZSTuiZoCb*Zh^d3+YO z1V0UfLr$miZ#&*8fbu0>y(06m*}b_&qhO-DljyOLk?1S`ZKJ$X84m>^TxG-H8#|`S zX~?L%odCEK>rrD!>#@5V?X5i2yTANtX85$i65n;XC*WhJ9#c^D_X}nH;a_G_*TrUX zulQa3rra84a#hG6q=IH7DpLgM0Jzd+Knk~hX)U#S{GqU6IJIV&vx6GNR|J&b@qYd7 z@V`r|4mk5ODzdkUL#|8{&aMLg$odN#gqm!t)J>8TQ!+N%ldXe1Y$b-^zdCcy7&AE< zY(|W#>-|9$gy&@t;%A?~k-K_<+x45f@?rkuFn`K7 zog44_vg0ymFRy#Z`lp6+4bDIxiGXUF@;zwxkg@y&1<^*_3kI&}-x?m$15w|$2|o|p z^NyzIgrl#rTIkXp9(%r1IymclBhBxk9%f2~L@c^qa!xuPnsH-&_oP=4L{2{4R7{Y6 z;-d21qYctdo6=$gzU(gkEf12or^-sYLN2ZBI`NmEDKFcxeor$RRo<^@;`xNIQW_v= zsCWJ0)*qg_Q}ZW6p|0PBX$#!ki%t{VT$T&VX)$xQm>tHFgIU2!`VZBCh@U;`yafqlvA z5R?1MyEBim&;JNMJ@pPiUilx<@Ln8kvtp1*GlW`ys`99Cb7$7=jnpvqB%7AXa0k6E zce{4wkxFDXb0esbi6LfCE{%NHtNNMovt*JFyPqMdl&p~9%kO*nj=+;U1LC;k#m^&- z6H3yRnkuDQK=H-eM`L8CCXwp)ppy>He@#{FELy409^E@WHBNQjwsL-M3HM(`DE6Aj zYa&0vW7lApDs~0#i`$59NJ?LZ2tD58;X1T(RKJ>5+#xi}HN;Z#`^5Z9t;;!|+aa^5 z|61Jn9lUT)+Oo@1?V-1JKkY@IDy)1Xu(Ql6I-Z(}ouH_1FC9P_V(uSf*;zTPsSKKW zO&(-Lui!836JH;Nm9Z6Lr{L&KgQFZ z3}&0>{Umak%C5u1vMkV9DOxrWSM?7gHY@uV@ef^7W4W2k2VhF9?jpo7vXgapzrG!# z;DP*HnFl|J*fQsZl6%nOr$>cLc86k#0VF2h8QQm*!=oIup-lp89a{3xzKlF=|Dy1L>I4GxVh zu541%zgTVAOtfc5-L?EY03C`qaMG016w%&a&{X=xtF&1Dp0QF;-LUAi$>IKomnD;R zYNj_c*&hvTq{oVsjggDwg?N30R1+8rXEbAHQOSrH!}~86#k{M_+(U|~m%R0F4s)bk zhy_E&P1^O-Q*R99dg|w{C?2ga5;u*wm~z7~*?0xvm1-2R_FW7*&TS}WN%?(*V?GWyb|lbSa>zm$V+x{_R?+g^=po>3Zr?fZ0ykBV1ni`ufbe{6E9Fza)VUPtt}~i z4O>WLz{9__Xy%05?@nC zjnXnTVgubf6Al97C+I-;{(ga6x%Sy3x+|k!X__*4S(DnBSQX)9B}Kl}dLHU_HWrE+ zG(TPrNh8GXFia2yef(WQ&p;Yg^nrP{G*9Hj(^f?;pSrl4?(@4;LwP8cGwQ(il20Xg zTqBz6=~4Lhrur7;ZoYBvu`~@KsMD5=B(bR<06T)r0V6mzNA`wD6fP{;D!LlPqen(m zbO8e|lq)W2z8^gufQ%z4mzHa*Q#66}+RD+9(vPC0rVA%`{-k-7pfM%;;ybojBWE2O z=B5k3&q-))bJu0m6k~|u=olTGt@x6sbOqim$>h{HGBt}#m%NC@`RMCqi<#`{d8ECc zZW5g^`uKvP+TJ0WQx$4^rj%t1)2sCH0dRF)-uW={&LJ~}mY**~HA_ik>TZ(WkI8A1 zI)G=&rn(Ui(0b)8bWCFd%ZBAvbd83_@qJO$)9tC9e%#T8X3-V~B<5vE3?t~3vX@8U z8cuE&BE1s-r~{RpO|NA{387E^xK!i;z-f#=ow!q_*@xLO6V7*swMjbGzJ3|Z2yE+q zpKEh-?&Xy)o}9bF|6sSYIN=%iz3JPd*X>LICr2F31K-v6mYN*xpt;QhpT|K@?`yih zGQYRr_Tj3YeUvbN{<4zXz5Hhv*!;F}mAr0gA`eoFpVT>#Lr5EUrB?!xSjZf>0t#Ja zk@QOhnZX&-PS&TiI)_<{a>V1F#Hs&M$ATz4!mq&6x7CcaYgne5u~y68+e0yfHHR4& z!|YWxSGAKx=f+7tDAf6ze8JDso@OuWge@W`8dL$;T69rY*lHOUc%&E+@?ZS@GTjnA z=rB@LR;jC7%thW#R)vIj6AqQ9*2JJ0{tUUMC-jTSZN?WF%^U5fxj^rGxE`ekFMdi61*q6?ilY!o#AQt$zc zhQ@T>zMNw(RF1+0s`qv34HGYw%ICc&aoG>S$#TEiTk=IJ&EbgswZS!rRB%h-so>Lx z@D*?~qmM~+qBv)3)Bu-J$}k_fa#9&IG{#Bwe$M}_GB$B+a0T#oQB|uKRZbS%t6`^g zAdF!5-Mq=1V{;tFqQBtJKkdm#_=y#`D|NW}=I`Z|_;BkML=E`66rz~(TB5O|SSP~a zyAA=*PxOWcbD;9~2n!=)Rs~#%+2pBxctq4Gk!p0O0IBX8D_OA@2Anl8v#1>KM>7<( zpPrnup7o5f`UyDf%15>}2UdUfY#3UB{`f~|BjTWx@rXj1@ia2czsq}87SWku=`Hgc zBNnIJ`d@ybP%P``b0vS^9S@NXvr%>9XGA)!fgtQ-vchY$UFO7u4i zhZwi}Xb5fa%V(535B=4zEH(E$7-zL)TXjHV-C9s#g+l^NQTz+c@KTd!@OJ&57x0)N z=2w0+qH>g2QaVGJ+g$q{++eYuqh!mOd%wa16i1v@XSL02Wsp1Q`#b#lxij`FZQx+e zIMSQg4n*l^QS*qu_A7i|;I9SVkzZ$6|GsPTG&HU=Lf2Qy+9VmvLHeDiuZ> zabR*j-^Y>GBJUXxvWOK_wdh#EKR1T6=x7bjq_Jf){rziv;{-DgY5qI4L_i7^^#Yez z$oR({Thqusx}gLm#ns)K+kwcop9WDWvEm}*;V8^9P7$qUeE~e`#FH;S$`eTY8$gR0 zdU?1t`k0n{qNh#6lcOgR7T~(yE8*|ocE8i3 z=p(|0bXvevk(sPX-MOB4DDD(06w3jANWvhRh#?u{QH8AzXF!b*af^75n?T4QM#h2e z>0CrI4O2M_abGGTf%FAN$N{6)K-5X;h3^Yg5l`Us*6$k7-K11BP}iCS09CL)8k`u9 zvH`|m`DiIrR&W(Vjl}FDuwI1|_*vPD8yhpOZPmV1-s}ExW?V-jd$~>fu+c4?X8(gb z`42Dkzj}7;(XexevRBVGzV!}t2ZMf*IBM@6)h~?9L0Q@y?ZA8*AVH3s0OK#E#E$e& z96Z=tUj@Yfs7?jtcHkM>3ot$RNxuI@n4WpS%^$=2hp*duDH(^z`wO9<`<3Dky3zra8m8IU6KFAX~9*mx#2=dAT&jUEt(C_!}-)|p0Kspx2|B44JwD%u0 zAAabxKsY6htjcT0@!*HMo-)NxECmdT832PiCH*?Q#=v8I(lk^W=_mRA#Obp?dG`;0 zY7D?ywHYT4lwiFisi7d7Gn#gjm|P}I>(dM%kkQ0T0Ll+g%#9@gy)N55FM~8#TmxE079fBM-HYg9ya4>NFqOWHmjFiM<%quUO!)7{e5r!{1C@&j z{LuXm#{OQ|jA`6>>>rbQ6E95|@!jxVJTp}qX9;l1nBBf@rs>*l(bnnV|er9jyc;(N$?qC_geWH_Ig`+1=N#_iDiGe94h z2X*}8cK>j_jLb6Rpe)A?iUOy&q>{4Q;WrXf*Y+ez>*LKe(%#E=CY3vJVJAk_J!B}x zKPB<5C!15iup<#n4GWtG*Z@Q)DFa|58vu-x14iIwuSMZaQMbE{E1}w#2igEeAo^Ng zN{9xi@|@cJ50nGI@9#k4MFId5+W_P?<-Jub>A5t0Jik)x4>cQra!#nr0UrAY8vw-E z-_v~)ecAZ;Mqlu9z!3HiLnnQK81Re40G{_meQ~5aMN2@Lu-5{E6mH4;@MISO6aiu&8@=@`N)Elyn-vKK~-V!AMU)+uxdTW`Jhmwmoje zR3xqH%JzKpk*>E4(tV0Vl%k4>;J-e&m(OebsX{qT?B{q;K1+>~}C`2lnGi!vo6AW?tAG2q-CIo@7C%5ouis2*s&zwYh5 zfwWaE!~VJvnx(6;w21%<5VUKpZ*rh2s$B>u4JxRanYNbzjH%fGY&-xJ8vy+w$N?2} z2wo0=iX0%V)7_y|NRhG7T%|~!vU-wdW5fxvA5|nUc9a|-gi|Pzi62@SlbQ{HTUzC0 z6*(XpXuj1`SIr0DC4edtA0+`mWd!%K0l*0C4}04HMk0DUteiG`apQX10P38~ccA`W zwct6xEY{$@ZFS4`cKHWyY@a=l&2+{pg8svo+aKKO69aHUfKvq79?QH1h6POr{q37K z(F~Agac4*-M>9a@zyVGXjBy}z+C5Bt{CbT2Got&fu1)9)Teop@Ql1#=x1ygoh=4=9 zIjh$*WsOd0&}e*e?$_;*>a@BqdWJFX;UB~M!*$j60M+%3H`X2YXZ=rNY?0&C7xdj6 zBVP?^_VN3pYyejDLe)F7+MP;~H7^)@AtwMawXqSYk1;sZai<-tXCEa8c$hncmmkg& zpghB&9Oz@z6e5`bUoN^?xr3kZS@K=`dn01&UO zp#6uigZ8iizzFOgm-L{anc$v)=e;9MlOFp=yiO&6z!hWcZzC=mZqmLmFOB+Apc-h9 z7d?}1?V5I0-dczM{*CV6es%ARF%$pn2Rpliq&ILpz~P=Wr?d9JrvduC{_6eq{sTH0 z)&@!q?S=g&{m^0anuz^`rKQ7VWB@=3fcb$6h-ox(z@H8&u?gK&fI&0Mzy75FV`>b5lpn6{6~CQTTF9{iQE)8EbyD zu{!V%V*^k*Ai}9tOMoX@5xoMI0DNC`OuRJ1BN=Iatc}-$_62-jf(;;M-+M~{Ht-CO znnzI|h)Awq0V)l7J~liPL(hrf21L&pNA+ruNZ(bJ1ID~JaDH^xbOzyGVRr`Q#xAs* z=4V%WUp(1-?#Nhz;{NJ1MNVG{o2+ zBF-7481QsIqW->ho~OxJKuq^d#RgF6OBL|PJl2?MUwmoNitDyZZ;)=Mu)bY%8s=a9 zZ2Qdqv4KL}qyEM#6U%q-IB^d>f}j|bg;Tz}0%Jl9x;Jmy=U>2gm0k)E4$z#LO)@+U zz&3zrb;c{;k*_x>T{l|fhzFR2O#-O@G2#w{Hep70z-k~F>Ez)VO+O&+w8^aHlX1U% z`Vr!8ve9_Yj(^f%oP!jmu>J|YM$HxxgdOS=pFfgkEl zZb%{v3#()U;6Ek)To`~73?UXl4v6m8KgPS8_h}-&KqP1AcbV%%q({*%YdQUUmgm1=1En*@v?M#FJ?}Ul%!sO9PcLu@K7vP~l`C zBrmKMtY=lK=Slr&d=b$X(0Bh5Z2<8Ij^o4rX;Is%*nebShBR@8ECIv=91VAx{jDrn z-zl%I+CP44`>%a|62^S?PbI(gLi_iB+U*X~UXCsoyBHeOV#de8VCUv_HUr?TWf{ae z)W@Xl1N(X#Yfs$^2o*jVO8|uZ5mBlHz`ADkIng~4(D6e-PAr>8j~)My|MtV*58lX` zWDkSrKdR@0?9b+rBgg;8f9GKzZXz!oMCj=Q@BgTuA4-5qy(CW(#Qumv5Pug$Hqp}! z{G?mO^g_?a3nJqhKI4FHDk2{ebJT?sOdus>)o zxJRLdChALQTfo!)o^s?|N8gQ}wii{5`ckn0z-SvlWhF`H9$*6i`;=?|5K90M)Y3MT zf}5@K|5ySDTyZZOfLxHiMB0B{wale)uQ<|eV7FIpWYFF&zW0HB@mTBh{;`UnUtem! zbv-9VQ0goJ1x6V{ZIH9Pm3$iDz<~+|Rfy4EIIyw296~UTob^Y%j-(__wPb3N(%}Gh z2{m#oAW0yArl?gT;4(ag>z=?h)6qKmU&-?y{-s$OUNo$ufAT?l?B|y;;v?-p5G6(1 zFO}>C#CN-a$uS89plLU$z$1h^PD0HYe zh$aD>3&{5WL_ENRWvM_{IEOq(j1WR|5)*|)%bzJo62enA8Z4_GE&b9N#zKh0NxTHe^eT11NM*0T3?vPj<5m9 zD372i5ubSg_V+e`p!xDGgGaUjP+z0@djPNFwt4N?UVRyQ?~pvi-o%tKCfn*lt6@7^ zBm58elDeW z>N-)1<7%Hrx$d5pQ_8SGk~Xs}cPfRH>S@vk({iOrnn}{P&`ONE(lp@eCh!~t000mG zNklXxff;G({20{JwLVK3fNvrcNS$c zEqhod{i0}=&^N~E2Kxis$lOHRhEWQx`$3#Lt6U*?d`5Ssq*TiI902c63OIv0AENuj z16a@`>YtD$fDo8cWizC`6x1B=T-BAbYLeuJnjGNu=A}MI7!^}Y5ejToo?z;qu&p8q z=-!Jmm0HfLj;_pU%AsL0Ws`w@8ue5=C0ThYAMD_#ld^X4dfjW6vLF9mk zw*e?k9ccsLj*1*mLzEyKSU6P``+K@?0tk=n9qL=qXq zbU*YZ(vDU70$z9tRRdKU0L1bTU@T=QQt0P{UB?4D^`c0yV;!0q`8KPp(v54UboM5VAoMKr=(& zPf2I^O46hQVod^cP13_Q323kfWu;D&_!R4&z)`ERU)A&R*T;KN7ET&B@#OZ?9;nBD zJ~K97Pc2<>Q|Z{eTZmHTy!SBMHDSFpd%3P(y{q zoOzs^8YsLKX*TGb0dF>92%>0`g&z?f-Ln-mW5Tl|>Lt5XKr`=XX@HWa@KpV_a*^;H zuNt7=jL`1zslz-^s;sREDoJ><^$quwvIK3Sa+C;RKDp(_yD zfp0~p0dzS6$+Kt%*uPJWY>~Y61a*XvDWXU$(@g3{PX;idOzG$u!?ZA2Fg$2atDHJ< zYU)4vU;gT!5Ab-eXdXX#_J95lKBC4y(et57JrTvkk!1Ft7E5sWJxuTE;LM zg7l$s04Uuzfppt|{iOt`+W>sK0lW=hNHPJXmsJS>R00sH1yJFW%K424{QNC1myELk zaKpKUWoZVc=;rBmFInF$+Ku#IyuS0l_~ukE1_-{nt3s+MJgBSnf ze;N6~KM3V1!?WoB($h5{&=2T^WmBf>{4KK6q%092o#3}{kwXMZd5?wva=JPiQVg^lfQ&CjPS{@Y=3?Xl{aqW&~fIlxpi#~i^nX!wZ{M1^@Ei@E ztuklRn4V!b&|y9&cRb>C)a_!vNkskllX6|p1Q0-DMV+;7~@JvAHufG7bTOvvgfx>`-__FpTKTHC!{mgq7!(?ShTLQNF z82?8rY)Cw>5RWs?r~hz(xH*=PIud@##K3PYt*4;;2jT&gqc=e^VTnCj6qbbjmF(_n zlnc0LrqO8w6u&fl9L;r*0Hkj=UMT#v5$6CNg#82Hcz^_;a6j-57@=o}J+Qx*9;DsT z)Ao2{y@jLu0wb{hSo;L8D#QZL7T|b5caUv&?M7zrHHv@r)1ANjwJBp@YQZ{KIrrabv*x-Vo2d6m3r2Y013wEX#heO z{xpDcV;CB`XRQQy);g7j9-TY1P!`1p_f~PSrB-YJMUFF`)9P?EqCqx*)Oy9E-)@`} z7$RZXXw(PVMSQH696pmotiF0rv)OcJ;WWt-S745dgm1%#>Paihew?;S#hIL%&X8;@Bveii5x}N{!O8-lz#s&&~?nwH% zV`g_5!^63+cWqJT`Cx6exv&87tQgUT|^y6GqTN zTnBhI>(5@NH1n6Mf9d35XL4Fz+pq~CP>lYDB*B`2b*g1L3TAOprd|T@%O)YemMjg) z>3~fDLhA!Qz+BdlG#U*d0<@sooena9i~^galH1y$$5b|=^;8Witc>Ueg7x*+^kNvI!V29s&nies*1nN69UCEmhpMGnv= zM<1R9{O;2{2arVCe@{w;h130|RXN~MZ2(3m3gE$1FKQbTGT)a-PZDjcr49OhelX`EEm_;{>AlB=`dtI;btA8{5oj&FrXJf?8iDv2`U@oh{-t0Z zP#~^HvR;Y+Ky|tkVD?OF^gm==ZxnL)c=1pD&BWwWL zRBfFy;6Tl7O%9;Dj9($rHY?a4;=Tm9;N<|SjsLmOK&tHaVJl5ncgyx>@_<00 z?c}e#l>YPA&4Aw3g<^2$7A&3f075^!!BQLZ+9#`{ik2*LBnM<-4``4CAR$6EC=ew1 z{X5tG>Hm52jn|FNwXB|8??GLEf{IJ<8_<|e$1#9bhCBezwV)6{-%2DM zh3+lCxdW&d1TJLQ#0Xvf_tZa>{?9^^YtU;t0j zm3~S|w<*6Ms4q*pSTL36%V~jsayDNl6JX}>vPf8B$nbtcH#yFOfoKwpCYg{Q7pmP# z)ccnltQbl+^eEJE&(O=uM%bTh!etnUk#fM}+5lv=d1Q^JJTgiuk&#v~^*qCJ?zy5w zp6T>d8I6bMQb$>XQ*xAJ0_L`s(pdF%mELu0r)YYxuw`{iP`NJTU}Ud zz|U6tFCTBdbZl&V2=}L-T`T%GAHu$V-WiY6u@hYAy|-6yPz+YcWC$WpZj zWI+NjMl%E?EC1L3jEbt)id2X+#GlLJ!Z0dxl~ zwj|hrK`F8c1d5bc3TQ><_Q*ZP{(!i?^titCz^7sjw$^$k5%U0}IFe)wFB8yf{d@WE z5pNI@S}F#mfABXZ_?&53F@7No0e!!zUJ&&!9IbbRknHlBlQ}7oDgqIG_uRtWgVq{H zA26dVj#yF9kpWTyp-n$6z)2O3gA{Jy9se-I^bDOEBf8Hg%gUHSM%2i{unj<{Y_I`9 z%ma98J!)3GjQ61IXVE*@*%q60?zDkWlhzRC8giX2^E7i^$N@Q@Yci!uWM0V=jpLKZ zOo${K=sv`90C?>iRA{uZvi9QdROA3@x_NvXfC>fpUN<>?H&1!G)q_@6wj1St|I?i_ z`)8chcjU)C;jg}!T;GIz7w8B_UaYT~x%rs-<4wjq-FyJN@z@0@k^_(*m_%HF*gtRe z+y8dw-M7>l^jY}{E<2NxFaFwBSR3==t6%L*PIb4p_^-PkytncF@6LVo>ox~gF(9=- zdI1swLC%8EdX%u2Ny#7&A3>W;uj3v{hzBGbkcaHRS@S>tC;xb1|Nd5|T{2`=QMY8! zEfu+5Ds_I?>k7jkbX};wf2k$wv6aVi_u*+>cT~8{3qtc{fmvWn%mrIu*`oEw000mG zNklwEISrq*NrHUG0rjQ&jy1K;*UdadUuQ}!tcQ+3P_$$Se&-;DK zEYf${#?IP%`~0J z8dHtte6!OgC1e`8{y*_q2)(~Z`YyDe>W(yX0iEsWNi5KVGi z1dooe#>U1Bx7K!}tq+t=^k0$eCip`8A|yP}aZlNOUu*?QfvTODPXx}Pmz*#|sUGug zzuf5A_1*HudiihP+JW((g-Q6$bLC7MrW&^GnBe-oVWWYiz`P_iKc$jR03>tnVB!NxA+Pe`bV*`t|XQ*PqqiefhV4C(*2*j{Se>o8OG@+5GYM!(vEfF(9Tvy#!J) zA)JU!%lJBPE!18YqRQZ1gAt)iQGO(?b~@QPcH%^*)3JVk3El?~6%$hu)!fo`h_3Tq z8++Z1yl$iGR;&IxK!oie=ot7N{yIGNb)tlp0%p?zI6yXuW)lpSN+6lsstnDD;WHNW z3kA$TO)QR+rN=?b{l>kJpF^^~i7}FORYXk72i02=| zQCySr()0?*dUhi%JB|DYAHs`Ao97OV&lq#8c>8vlZ#W)Zc31D&lZ%G8TKJgYPKV8X z(z@U3MDY`%{%+eh@CwER#e>3Vx`AYO`J!-rzhgfI^=Gno-}vi)qtR+P%5HI^m0$kL zzxBO;{Rg0UsC#8OA*WAg`YqYn1f!Ic9tM?GH2{{Q7;utQRkjqYFu^0KsDvRB!%#hO z3ZHh1ZLpz)xFm1Onhln>qF$#Rs&%2N%nW2-|}$RX-MQc&L^)Prvq{&%3*0j5=*#MN|kp{su9h}dy*+%ifZ{JEExNSCU{D~Ae6}5 zorASi^OW>XpOwGN(kXn7ojrSeap~yk)5p&)9zA<@>GQ8xa!_$ws@ZIQ@i)HN>P+-@ zcKH5$bKNn2)?JvAjgqN2qN@p%Nk%D&<1P7`d)2zN;&@&fO&U}Z(aBmZUd5#r!jB`58g zqt2-7H>M!`o|ou1<<$J-e^D5Y$ik8HkY^w;LoI(o*xvJl9EE|LLM>s4dSojOyx|pW z1I~a`EEGnme>v(ruuz8B1|YluR4xOkQA{vHHUJt0%4QB|QcRMGv^kwN|K9O0#?;?^ zoLF#SYQOt&^}D@o#|%E)S$%)|zGDDglnL^#bxi zQ0T#_!K+96-@T2#q~-Q{F*TF37jR&5R#sbF+Mz2Cd7UUe%ATnGCx<-#;k;m|bu*G6 zEYcx-R(_nz6H7}+PMtpH$oJ`>YU%i{NTyY0Vrm%f#BEWAz=$8W>@MP*zT9j zu32rA-+8b5{E_VB!dOMnD@Qgy+@3A_cCfwHpPF%ev><&A^8gaYL8ap-Es34b_T~eJ zZsgd*EWx;fw0@0|EJ_|L@h*Dy>z|0$&MYiATz~A$=@X0Rj+{Dm>ih-LFc>edgWk{R zxIHy#39j7V*mM%W@Wv>YRn;ayqQFx( zg#qys<^%&vTUTZPC4f9&Q#}U|f+AI^Kab&)ode)?$re#pW-#_B>>i(qta*NFpZodu z0qzZUS9aDe?ySAHeGj!m<)G)70pxwO8K8p5i3rYUoRed1PSAy%amZ{%W1kx9SJFpo z1JG{)@c{Qar^U+h#%8x{H_h_h!S_Dwe)IfTMbM$n#^>fYU*B1~LsR61fPyHrm)b}q zf1*00Jj3S>(V~LKOi+Sy#2=;j1Ve}zj${SqNEjf7Xm?QKjP>Fx`u_;cAbIA(D!TdQkJCr|v&U;V4@i!Z+Vs$&3#zknhj`g7s}U=2>}L|{eE5TY;SQZACL z;AsQLH(+~m+3)qzoo-{I&25X3zOL^2b@LJ024r~DhXg9f9iF}fK*NV4WjO zC%n&tNueGXJMv^p#wf;O$Q3yBXKn-e@O%^~nzZA*C;=dt1GYz|P`3f71TYf&n}@Uk zc$orX_^YFUK1!J2s_fdqrJdEcw{AZ_br7ETLeR*f?{oQ-3 zgDzVOdd_s55Bg|8#`ro;UsNPzACJu;Cnz)J1avZvToi&XGRWP!tPMnRK-g)azYzaY zu>r80>*Q!RyKX4TZk}xS&H8RR(FDvG^P7{&7#7el{Vz@5xYpm;XipI6=O2#t2VT~H z(vnO7hJ^WyZ2%+(q?Qhm(@M@Lus8rjb8SBj^^f{3NtzxxapKg{5-M{RmmJLBclZ$A zlBo1-!(LO=Y&}h}vG&}Cm01+|o$J@HEid0(S-C;w`n`Mn-v8Zy`CpMkHN5-odn`k| z{q{SK0XQ}7xtCuKS`ms@Q!wr?nH<@mT~ghS1fH~t7zM&w+BAYcRV1)1Z|-bvrn|fE zUi|RvxpPx9GoE{SUr7T)C>6pRj7R#6l*e7S!`Jt=0RUmOkv4;ekN_Uyx`B|Pg@{6- ztv6nrLbVOK+bWDKJ=!jniJ2&lkRe1%FJyx@bdrp9M86A*UPtu) z&i!7)i3J0v8tS5*fH*->_5csw<(5v~5qm7jHg4tAF)mvb32fXKP&t6nL1j$hU*a(V zzg3U}yWQrj6iE&{y`q(-Ygu{mPVw5M!K-H*Ule)04m=!Zwl3z_bOGX@$H`URh!`qO>d?7n@c78l*mi6zAN$4;NdFqtX< zFveGWucBHVbJS2j-m-ux&>eaju-7nwCZRku+9zA{9eJjrgH?Lh|J^1BI zmkW~rPAr{wH*~kR=-p*0W&l3dMQbA{KTF?2O_{>!YCR!CVww;+rh5p_qWcO4u7N@R zFaQ7lUAxn1wcE{BtI?p)&=eKUNUmTJqGPn8zBEAqq8}#dtY=azt+y#Llbm5zv{8YP zSr3BbuLh!f1bgdKJXEecM7|6929lRR_;X=73WOeuE7{+o#0YPA*q15=YAMjAQH}~z zWC*-i5cQ-(!ex$T7`*Pkg8#82B+zeG>UbYnLQ6h%jH?Anodg5vq{o>4#vlH`2+A~@5IEI07AFm^F9lzPznsoYV000mG zNkl8J+D!_cA9b;eb%dgE7QKJ}dVqvn(TJ&e_xF9J*h0 zNPl{EmT7U|3XB*Ou?7sGDi@d4XJ2{= zU!5e^uB_yQ2Z22FuU@@&;slx&&OHCZTR-}tp-JcX!z>4w2*g`YfK6lrFn&>yOiAyf zq$RSjOHN>`!FiM>S}XscxtRbe8e$c(Y+Uq)jfDFj& zM})4W{nBE54O5~YQI;Y@ZLkLsO;;J{e&XdghHXOXh0dxRAY;yR;NgadXaEEE-aOsf zP1>1lZ(@v~|Jkokj_XL*RhxBh>zpiS)@QK*U*mBV^09-=J<&~>R0=g35 z^5x4XPo8kMEWP}>w}1Q^tyjdG;NudL2%t#Yc#0}v8%5b7I^t5(4x=|C8xkxX2}aWZ z9$DgZ=vE6~G65DUOM8yatO`{wbss4<2OAMB8%S}C&^??F970~eU&wv^hgzgi)ms~Dh67ejG^f^J^pi@3FK1^?om67opE$ej>@?sOY z6Jc2x-!AYz0=lAN8$gYz>uS|*+Q$c)LA$)v2eUSJ&}z~pYj+V???2z*4}qIqVD=dQWNbIeJ2z2Y`I$wFdPNO zRkA&s<5{zkB?FwcBDLZMf!qu!DO=&o3fzZbd1#azfZuZ3x!wS>)Nbq+tt@%_dj9j3 z{!1suc6l*>ZzVZkNQq=fAO}j_fv^kR^!VI^%qSA{L^YvQ2TJuZAbw!-5|0x)fS+&& zXxhaNT#}oSmD13a)JVw|G{vd__R~<``>zv|lMd87a({ZsVf=H)PoJ5XnzT&#!0(zw zGedc#51?Cxt2G|b+wERoS-G}+={jNjYnPV0yF1l;JRY<4>wDJEzVIT4Y`b#h3N}YV zwwcSzm%s6iZ#cebz z0OD*3`7Jp;L=TTKSVv{Mrf@XZ89AFt+Dy|Xq^-1Zr@wu9XT808rJXj9wWk*+7EVvh z9d1rNMIDjr%f9A>`*~%?`w^|-edYj^dw2qQB_M1I}Ozx~&x%$rhGH5v>8ESe0*!K6h^3L_)uO z`P!Asu5$O*Ez$q*ho27+_S$3BlO#R;{Bso86)rDdk=;&tqn4MK@t!1E`rJ#-F3nj= za4|rsJOG6Nqp(l>Cm46D=$V)x0Z70D6gP=lF%T!k1-mC=qp-k5m1u>f6W*s>Sgiw8 zC@#Jz5prW$(d73Xj~w^f%A61_5^iU8RCQ*7C3u||rPQ9F`bhwOikw&At?ru`F&1G; zM)U3h(?IMX#rdTQ%0V2J!FQNaIvPG9ObbvV1u>GwC=sMUGi-DzrLn4vAjfw9i(fjr z+Ke$3ZBH#05CA}x`pfs8LOuXq92o20NrHJ^q)8vj9%562aiMdQIW~|djU;O(i4zN& zX>zx>_0Hz)cG{RsnrA2H&rU3mj;L+SXcGAtpU98s1nP)-n;4I%ySm!jb&QIF5jlQ< z@ZyM`CQ$PiGVBrLG_dZg?oE#WIZ5Q^hWUe^ zcmLL}bw)PzNPeSX2MucncSv@7OF)^hZWooa=x^XmN{H+M z;aQSmkflaqogNI!vY;t08+hEjXh50^$WZ&oqj<7^a_e7s^(&{B7SEhJ=P3T-g$o|V zE4o*yuI727E8p*b8cV5ncXqBia)0^C)#XcE_Iv#*eG5Y6Q>>pne<5o$-TJwE?|!e} z_lVdrw(aem)z#J6nW;vzeSC3g<-Paa0!T}@By5UeWMTE=$%OS10En`pv`S1^!EL~& zAh!}NPCzJYhlKPq3*axB%roEcj@2 zMA^RclcRJ*Wv+fiWtVkCfYxL5BO>E^!N<+m8yr2YxHsU>MnasZYbcPgxeXRw@_nO?f^+?jJr?#BWAlV{E} znz+pT&M+d3sze`jo=kR(Xl6yP3M8Kuw{F~6Szf-1KM3&e-MIrJKIWq?&%X2`{+lFM zuU+#<+Vi}Xt1ELa;tfkLea=m=9n8m^@&> z_IzW!4dA0Z2Vko{Gx{w6b{#8)(HrzRcW5*<#Q=j47tqKtk6bgyxRk9dZP>J(Wuzn8 zXs@nxvc}QY^wQ+Qsm@2PBf7G){=v@u>%A@UC@s)h;K~7pur6{mAhWfg6h9(V(KvFM zp&0?&#ZqZqexjX|^z%GTvaPOdrqIfYKlu61-~Wy2#;6cMP6$|O9ckr*LDCu!-7gsX z6C7d*z&$z5vg!HR)>$&C9@AlU3ty*y-Cd5a+xe0wCrSKT^hlCfc>q2G(wiHlg zhByIA0OAU2t1{mwx87(pPMkS?_T0HMOG{_ZpF6#{IKO|tRZklu6pS)!2XA!z2%3@e zL}7)qWoTo4-4XhgOP8)*zT!%!%^&ppABSEqIs*Vf?rT@CvtmP$FSh^c%Jt7V6LErk z;!l6?_cTCALAjYYZ>`z@81J%zR{{xm*+;noK@E;2Meb|3P&uXa^xW*^+{`RJsjyx% z{_LLvkhpA2K@ID90+wgojA?T)T1J9-!Q3v)@k&W2c}vy^u^f{y1!ge;cwYlk8on(_~^X!Dv5zT*eI-+0qI-;Gm4|ngc_R)_> z3+J<7>{U>I8N<2LF$U4k;qYc%H>JpV67K~X{EY`zy=KE0+-Fudl8KiGjcM@fd-lXU|e@5VJGr zA3AXob2KH%`n`Lu+3w=a+qby;$ImWVAQuC|{ssB6OSnMe6}+X_8Y`J5_f1}w;_*rD zXRNj$H0&NQG0~cuo2kbFg1CHU^8t|kmZC9p>u`41@s+~C0VvVg+qL zw<-N!9TMZz3mg%I$DJ~|5c#x_v1cGTei-CB+9n?jH0E&SM|lpQCIQs%@zSK%REUo| zMUrwvsdRSZBt>+Z;3*MnoJu-{zEce~949bjGe{dZ`dBu3tQV?kr*asp)Csqve2b zO**pVF}{yPrr48lJ)fkfD~`TjzUa{XWmh`Ijsy6mKVK7M^0m za6l{z)}cgN9EcGm?ZarH$(>=2qo^6?f`-_K%BFZ-l5~=3*+j8`(3+AGWe^Df_KXGOVNT5kAcR5M z`e^3>{8+G%V|3ObHc+wV6lBg=79-G!>Ed(1@Ynqu(^VPto=npcC|w~Y8EynWqV(=y z`||dBXKkgOX2)97i%v&0F?YD}5$lL{*FV@^y^isS=&V_p(^<280Hh;An6-~Z000mG zNkliF}Ic=t##@W>!BXepaCuQIX7?cBGyKkD^vfVI$@J9ddeZ9j6Xi%6)8o6~k zuxwwsdOJISvET$`C3u#c9C^@fpEa%o`r>n5y!y$B2LZlen=nR{EqRYMP{cBVMC7=m z2njSdv zEg32k9MIIHls^)kveID6m#sj-RrTlE4G8$c;!f}Stu00hAK zi{yq#=Y9=2xN}BwS7V!sOow7*L69F|%%5@Br3nGKi#+{ANFVH234rXng1&hPk`zF9 z8orb4y+tlc9gO4883GE1)yNNmlaO1(BXl?%3n&Nx ze$_qkIe;+|0Dm`n4tSqmqf3fMjYJ}ji;YRr%z(UE5-3vgXvY**4kSBeQIRxBCTOJ% zr!2bL+j)EIZpW!Wk_P$_b>>e_%+7yAI-)tJBN{jz(ejS>BSId4YNFCvUP{c+Tw2E% z^0XWj7{Vhj#E*!FEH5!m+)h@mH`0~+`S(8PedAoqO(jzQ(si`qH1h}T+8uMqnafco zCn(1{KBWFw;`X+ReRvW>o%6|QioQ}Kfg~gWSQg>X0RtBbpG9%g;#ePVKQ>HN8K7tT9$?=b$E#YK#AtoVzO1Y07J@I|Z6d+eAHJCiAb-P+i^eCg7a zWkmOvoj&LCvNOE>(t0#AH$Oc$Gc!BKBz|IQYHr^?XP2IKS7v8t7Z%FkwQYva7DV;X zBdwdX!Qnh?FSrcu@4LWOfqlIV9J~|yy<9xPo zesbY=#E)p>;?CNo-L-905Mcs?9tJ4IV5LqV=wq_Z(s8mP;Vj3N4FXQe+3CVY2H$&s zaQ;wZX4>gNs0zB0M1S7Ihp*5V0fi zY-plsM5u^|$Qb*ldCdl3f7x}{l9Q)SE}c7f?)*7N?j6QIeB=nPE-SQ%))@=ODp*>^ zL5fHss)2Q9uDN#gsw4D{=r23Ee`)#t-FwCaA()}UQ|X0Un{)FB+Z{EZo|&DQcNMD7 z&dxB3pP4ow#yn8Q9V8e7k({p73MxC6>fjM>Kwu+2f__U&`GEgU|)PN8MI7O05N0RW!^0C9Ws=Ku(brW^|h61tv{h=8ZcfLzy{kkOv# z)NKHt(tH52FGUt9s`G0EJyT2$iuh(hdM7Bp(6wrS4{4Vm`2d75Q#`mhAAm!CgXk^4 zgnR(wuz&nj)kz+eEoec0;4 zAHD^D^Hrz+$uLt(f;?azwj4Ju3D1(v2Mp_f(!>&pj3ugi>ChMM_LRf2bBY080U1Vz zK<8ukb*F1g>2!)5)RbBARU%old`saQV)J z3}8ce(Bpky2UuHMbL9Tg#fw)QzQ1_!>Xnt8sNr7idFYlOJbc(u^I1~PI2iBBS%>Id zb#8uYc6wrRN~v}Yt;aYwK4Ct>8lh4CLyxTANQ7RMGU|6dYId_M5`aS(y{+~2-Rv(SW1=#^t$D+ z2gXoVD+DD8p9D5`{obl$0OqrN03xG%Y>m?G1o2;0)g0|^ zE4l&B_=qf7-}{950DM~o`vdG{12Euc#q41NfLOTjJH#+&6FDGgmZaVMWvj@K)?Go| z65p7R+>|=IISQZ#lbt(F3ML}LvjxtK>?DI0>WH@A*}Q{i&C=$Xi8+i%)cI(2MAv#8 zkI3nWy1gdHtVWO0zS9cxj-}3+G}T(eAqA z2iv8@BkEzsg2E&5d+F=7e)Pea;Dm>7Y~4GK?*c ziANu4>h(WZl6nU>r@>>`n6{qcPigihflLJn?lkUc&h$0RwSAKMp~HuqKIi;}^XDAR zzi`2+cN|1zgjGA8i0Gb_K#HfpS=7ivAk}lC!>Y(+2b`5w5 zru6k*x9jNp#@ZT}Oz0hn-&kGUa+Gxqas9a7VcJLgNEg5+ZhRB*0;X1IX#HJGX9ctZ&@Bd+W1&0NQ$51ooGi z4?ubck=+6!Nk~8V-iJR2P>}<4&c@gPV2lmG*DKgxwz<*!J&miOb;XQKDaiAMtmg?j z#A5^nCk=FS1m{+bf;ytL z>%9#;v4;+sWg}~*7AgK)EA7vnbE_Z&)3By7Z?{*Hgg2F;qh4sfBYTLeJJlD^S(5l& zL_-sD^`!Wq=s{E%I&VV$21V0-ixa5kgV0X!?V`1Nav&UUJahl^5UtU{n2bjIIRV zhBV6@exILb2#+Y<{eoB?YqPWS^HbB)3CmC192>1AzqTU~q;+LO;ff7)7|DD5yyycI z{_bpTZmw@^tgmgZA$aHd7M2L%*H>3_rys2KZn!>X77m>_!ABfc*VdWSpjQP%Iuo$Y z2u$~r1aNZ$ir@nZ;T(W=s#L6?WZH)xcZ7-9HZDAb{)Odm(j|qWau4nIdJo74pwgz! z2!2XsJYKF+up+Yn^?U$U35rr>!8d+#iz;u!&fuND}_*(Z7*6-fA>uCLlA6|4A|Kf)iudZCBlr^|cnvLfCzWHM( zP9QyZ^nHGg>H8e%XIy>K!TCtHJE|VgqOM!8k=9r#yY)H*tw)qStU5t$z87xrH#d-` zudl6A$&}sEdPm+@x7}aXR{5-LW&Kx6s7ciiT{;bwqp*f@U3B|BBKw?480R&i7&Y#% zJ3Bi$Iv|>fscA#R!uxXJ8Jz$?C&Vl^c=qonjBGtMsIG)EcKopPewJ9{V5j(Nguc(L5 z2SCI8;Cuj##47m!0t%P*u&l`q6upSYPoa#ZE2uH`@R9zSJ!1hu%mWy42sf5eWH)&q z#5RCn35bLX8B?g(0Q^g0>>roXF7T_;Pa=3J5{UMpA5l(ECx>~99`FU?4WyzlZ~z4T zh*Fac`i(Sg8YdZ~s3S@m&X)W7CixLH+e;ntBSIZf1D@W;J#8slaMp-!n%ql@Tg~oT z<~D0_Z?!csx9g1BcxoWcW}s_S^J9qOQz$L`k6=DWS2I{Q;#bZ&G% zVl7YuwL?XQ!8lO(szciM*;&N(g>bd8fA_oD!E1l(ba&p3s+By2I zMA&pi>#f{{?(Fyb%jkB0>Eef%Zr-?Y|K9ypyM-8je(uDH6Q6tebFP8}-hJlh9FPoC zuKTlE7qzay#Y!C@Uj5ZNME8ff{#i>q==U8VcVyj_8%~uTRT#)`Z*C32s}Y~4WmBn@ z4r}wcZ*A{@qBoWRjF$kYb-O#=P77CcD@}Htz+p91IKkGKF$bbA{4uC&Sj}jFos9}g zC!BD62=-7R`G65RQ@ubSt+ZI+{V|GEQyrb)ePVOYW6z?GHFrz$6eb2JY znHbzqsTV8Uth!0>EiMF+D3PG zC&&t5$JF5=?)gaSm{y+l*I+PUzfZ<$vUj*n*HHohWB>`q97I=8pwfm|Kt^Iz@^aNI zF|1RNi#W@rkzmlWFD&^R;8RjQ4(}mfOo*A+k`xPp=0tysKDPSzp+75*kqy8 z*AoxqIF%2Y2`nZCvpL5rceZiVj5)E~$wMho|5UO#kQvF^sb+d^-~73S+0*}rfASmx z{KXbJz36m%@FScX(S73S3t3-CH)Y6Zjr@a8Dq=)p;!Jt&B$Hx_K3-M`^C)#tx)#@s zg&J)I&{>x6DqzvoH;+e#?-xk&d0Id>`ZVk z9euY!{x&+00W%E-Ij`PUqWXk_Czx{rgZ1h!zj>IfkZX!yUrInkKA;p>nHP%Ud%T~+ zz8Lw8%m={A0`5e_EIiq$}2f{eUr$! ziFkk!>fdmr)IgIESE>vafm?#-51W{SL3b>l2%|{l2EBli!m)#-Own`9xZWL{XdRxO zI6gCVc7A4YZsyp`WCQt(v9Fvbw{F4UEanq_C;Co%8R9G0M8nvGgNNdNxA+dL6tcMxN)WYhPV;l%44Nnxpj|$h*2Tx~jJcj4jP4 zwchD4!*-VQqO##2+9|ZV-9YgcYU1)B)gR`BDS(yrVnXx;nL|OyWR;~-96k(8ekds^ zdw|kcq{;#4C{vsdzzpXDNQ}413t3~8$jE#EqDAoJnfrj0lG%?9d@*PO!kRH2eUr$- z=*L#DxN4FWNhp!GK^#z~5lC!88dN?O=koz@lq~_UO!gll9{@c|n55(bV7SFmT8L{A zq9-Mr5nd>=0{MIkCMI2w;^T+Q2VlHDM|iJrU@2vMnUC?T_|kJ>Yl9pBx@}Fw&;$0@ z!GyXmkjMTqAK-nepo+K^n}C;1W9l!MLYSt}-YQLz@k~L_>4;3)r5O5Y zF(5x8)D)qP$dO=3on&xF{D|%1e49izD{eZ z*_dlJ4^DOtOmsSp3{OiqDJM-j7+%IUkp7#b-A?qt0q%F zm@>sA??xgHCg!(JA4`clHPD1$+|GB_khbFiiKG4vXAEpN8cotN5zVK-?mj<}Qh!t* z=Q(+x6SJtRxz!8i9quGqGR^z^7`L zsBa)DAkIQpatdOCfHdJ2k4*1Be1J`)pXCF1P(A=VIv;>xss$Vaj#={Pd;oT2J^(!j z5Y~z8P$6~^MIB)SsK@~xRNIOiU_92-v8dPpynvucL>88p17tpeNT;m9%K?E$Ra@tw zrc$4n?uWiu|K3QZsR%DpWy-~3ECtELS)^s3aJB|g)nQaci+J3XPT}4tIK!oB4l>Sb z<|KpHw{E)1e537jL}w@Fk9MXzNhSG9mHML?Y(*<7a2rqmR=shU2V_F`4Qqiiif9j% zEp9+@quh13pd5uJ>W|K^$oRa-IB?lt5At$`5OroP#;^Qr6UX}M+3WZ;a51$|@ z!2H4JkL2`Gfk^n>3${W$!{FUKWL9{QyZ$AC%&~<5* z>-DJ@o^LwoEo*dUW=@^IfFYoJJqH!bUhn?Ro7YxW=zKMP%`tJ_kj^qRD0yBfs|8JT z45W0ESx=@DRixOG9er3gU&_WNz0l0`1o=CgbN!XU@y13;$@r)VH?s-6#kwci{u zSn?tB5&ofk0H&G`AdhfcbP_mhoM!GM0AnQp z8~AG23Zw6=>4G4#B0Qika%bsF#Mcyif|!vRI8Bfn>;jLnl$g&f&HI^gdih=>K^lwu zk7HK%(2wZP@vK?nNNZ}TgU1UFHKx+Q)nk1caeL+jZcU`He%LHn>2D&@{&3(@jO&YY zpMiB2yp%Y^fHGS-678-Jpd{OXoD?&3Ku~!JQ5nJYX=D*e!w7S{*+kX~J_k=$yXBU} zT-M`y<-T-O1uSK*2bK&9@+v8aa};zsq0{M1OmxZ+tx$5@YdzBD)$0LgL2YG6@<&wH z`$yM@?|-!K8a>H8vKPk3_NhjWeE61_k$DT`jV#wkW1>%+oSkj8+wRX3Gc%{3d(J5h zfDRL(Cupy?)7||y|LmXhjvmliGe9@cjA8+m?4k~(9A^?htu$lk9Duf&Q&yBVm85vc zMjSRec;q0jw^H$z`79p*0Mn3KJ^=R99iIQ1l8_ER+z11&~#|KOqzfPk6S1f zr1$#U@9o@mmV+77Iz2UeYI0%U}{q(H(6Fvm;A zUK~IN!b=dk&xj+8t@0P$;PDEq*7dtX_shGy)xqNiQ}v9f z^umtqMTAjfg&BZ-n>&Rfm2#v~FAu-%zBeg4AA#SalN zLI~xF!{tysUkA+vjolg`j!$hw^5<{zq5)PzB00yf09G}<4U<9696=wBgqP-kn zuk3N~2zAsAqp!ylrwmY+gXrnFN3F2%cjK7s_m zH`U)es%?Q!&;|kaC`JAZ7`~IPInuxDR56zGnq^sT*pH~0Iz79&pLK6+@4Qj2wqSB! zWA6CG!hCyn0*Nxlf8N*!SC?!tf%f2(xtd>9RyhGv9O+A<8Zc0FtoKAr(tkJc{F^C= z^vl^i8f8S|!h?gghE``0$Ds^yZ$K2p0d0Yy3qypRAwq=^NdOQ_0KQ+k?n^(Z zM!frNxE~@k01-N_)`z}pYZzR)CRFOiNAjukB9Z_?Pb(jNVCy zNhAW>r&9%_DukhM(6W<_!UDgv*eF;kgRnxga8hZa1^w=}$~gY#*EIPNQ#rsy(voSD+vAF)&<` z)z{gmWj_@Z%#op=mADQZnGu*Sc>1e-sa3|9u@)%JJmLuR zKs!H@4@C3huh3(ZKh?3V9d!kU&_Jyop>p9mT9IH-+>#l(cX4m>2ErIIWg@=WmJS_*_R?rv@5jbOd#2u=dfQ@Bubc^nvH#F}$H*vP19q-4 ztFQrVQ z&;S4s07*naROSK=B|=_cfT%PliqBSG&J3JmQeu2pLAe0^{jqw+mLVDpEh(LGw?5G0 zh!6N+{Gpg0aW1ox{5wgHuUi*ld@9@9&q%3>!jr^Xm@!GnHd}yqoGsXqh@Eb?w?n^d zZ|`hxZAZ_P5tbO4Bd+_|fic%rS6;o&vVy17;d-R;gFyF3UYC(6BMo5*@#e3P1BkDi z$aiJL^`Tx@J-Exj6^1>#@%}R}yzr%Oeluw_w>LJfy!UQ@x0?_8&JGNN!QC6z@7}!K z&-D$0>cMTBXC(Ea||Qoy@^T>=r5O0LKvX4OG2@5+1|Kz!!dwB zvmyn6`3S>4kGn2S2*}-hgef6C%wiI(;*@w#adQe1SW3#kA}vKwb_|382aYtY>Rchjl-Irv z^c5?~qrXVf0mZ{`+V0bupP#q>4$nCO95c92 zKA@}W>CaxF6e838zP7uw3tkBH6Z}-_PxooRqWTx^-TmBGzv^~!cYFKNJMTEY+TGmh z?`#itcDB}68=cA4)Fi{$EaOnHfCmD6bP~YnKWW{T za%J`Y+U*;+53nitQ_gJ+l6L; zIW02*${Qg12g_q)S-)yR)H#&{{Aw|t((48ovH=LsHpA4vik&@$9jQ03V`mtF{o^}f zlxCnN2k0k~C-y4Gv~5gZ_K*PL=EE3yi0&usi*z%i^Nx+oG?PZBk+!mIs+mr;vYF=0 z3;Pehay)Id4QSpjKE;R73(0k|FX?#}#T7X^bq?^ksarJzQn?V*mRv$5Wg>M- zp}vy_&|9A=G$~+E9aH|>_f|StI@!n;COZ2k+J|PQV1TQ#9O#~JWIzXolffXNn4_tW zKCN3Zp{PWSMng5!rJVc4lJbyK{2xNJ9iKRQ>?m(~j85Ao7{Hg{Mj8Zg{i-q@0*a;X8W}Vf;b6eDTViJNI_`+h>=~ zP0!BMbp6IWvne5mZ2-KrnGpb|-6Jyz3tI&}q13>jLa{+410Dh13K|Y8Lg`@_@f?*j z;id650BRVFISCxo$srqnqGpK8K*wt^8e+Y<$QS%>Ed?nX2)Gc2YykWcX&DIC_BMc+ z`paV=pp_tT!;l<52*>lUzAE44XcR6sGT}KX49c zA(JH~M(7nt&j%EWA!nRU;TT+HyVtw7HRukC?jY|M$ROq?I!C6bPR!4onV&g-V8Ow| zGA$kdFoS_YOZvy)2TM88udztA)@U}GAcKnhKn@4X@nEQE)df{3+>7h}9uNA!!z&*7 zX0v(l(4m6|587yN=``T)?xlJ>n4-}z@w?wnqsBBs5 zrD}n|&6I`^P2aICR}GMkrV8FrE)E)*xy{r>L_ z=?DogbCI6T2FP9C`OY$G9LgFL9l_2$^)$^PGq?#yNmurM92%X5<{W# z5L#TUr;YxH{`ETfF*3$A5y)W?jJ4UDnifPZVU)tG3sr<+p;r%wI)>3yf? z5FlWdANI;f`0zckcU&#FG49XN+CT}w(Q2W;M!1hn(*fC?QwY$;(kkp@JO(8HSm1&4 zf)q6zr$K&U70#e2uC1;w-&_6mhwi!^lm+IyKe+G0frYboR$h4S!r8^ecBd^OEqj0z zGX4;akG}$Z@<4JGIB_ClnAz*~Egc+l4?*uk8)5;0aC%=?s1po#Vd=!)GEgIL%9Y() z7WVC%Us$LY z`2dt;(;l+Q%dPSrtq1ZI5qi1bdY%z|U4D(Ic2xK1K~`NU_?*{F86%AP8)-mgb%lHY z;Y0OWJ^-uv04xalXU-vc0O%gn`*15|k1$fPVYOSo=EbpAsI&rD?h1GX8qYORxw4M^ zA=m);&dl#>h~)sgmkq!_3slm#HehGE?6H54RRyldy8(io4d7vH0RFw6iEG~i-8Z9b z08p_3m_S)T%W7YSYyh6_5BEiAA0{SFQcNhpz9P_NJ9Uwt^10zUE2sr zeca0K&Mwy*8K3N9>L2Y6-6M`WGcoKB`bzz+!f9)V&|=*Npo7L5e z=k+N8@X1riQtGe>MflYs{{^-lEhg}k-BxLOjYfkf^Z=peFX){6+pLdut=-lK)<(hl z_w&0ox4RA8hDp64n_SdB{)Z0J0jEu)At)sG3%`gJO7aZ_Ezug*mJ6w3Y9^suK_zU_ zsn+~|s??vhi%>^TT{9TQ&QM33h)jH)dh z-Ip4J88VvHl6<9k|dhP#Dwu)@TGjqC_b=? z8NC_M$sw~dGt-o}R%lkYdwKcFk6!zcd)JMdH&^eiw%X14`GwiJS!XLozCd+O3*#)v zVUi%=665($MQdb7)p_mt`(vzRCnhF46BCDz9c6waqZ;v#e!sUtfkih-de|gkg0E2K zuhs3%Z3&~M`1F@q@AbMoEKVs0YWyrE-z>=LrT#X(8)$zJF#yVBQkIIeAZ7+S4jhtz z5I{+>YuO3R2>nA$j22;3Y8%U^4tb`+zBTdw)%_d@l!racG zqN_spVFW7tDyrNc|7NX6elaBh|1Cwp0Y?f#7vySec(K2eFVqny1gPxK5r9Yl#%t_t zG$!EJa~#s6mJcB6%dic=)NKGma)1Zbyw6AVS@)YUH5-7Aov=}rxnx#qeUK7@&L=z~ z?gPYJF6LoU`tSI@80Dg&1HL+14j7&fB*5h4lOpPO_TCI5!#UL7XiO6DpKk3tyKwev zr>FK!K)k-gNA&)53YXA<)Bg-IbAQgJWF5#0eUtcglKK$i{D}F;23;)=ssnVTDt&~` zV`M=h_IWP0fxHl15NjUUMW_rZr>i3$>btu;Kl;&+-A6{u!pW1z&z~1&aQ?aTCr+GT zPgCkI_Xvlqv>u^&dw{HaN7K(=IOl$>&gPvvcP~0_KpBAl^iMD)q|hFxR%$dB_AM}H zV3sgT70U3AxgjT~ra{q=N({BS^}8sp3kZwIhR_jTrzbR;&3y+BEF3rh`UU?jewdpb zObtev!jL^^WfR2+WE-1nYa!siuF0oW?{#;$#qCxLg!0M>HR^lmrD~_#EBY7>qB|IP z{~uleVgt}qZ`}1lPlo|Hu1L4h27q2<80m~W7iHcp>3>pojNy&T`W{1#BKpsDC3L(+ zjn(a?D@6E~t_|a7#N$X#5nyGLdupp{Do@gFuq_E?P%D(*>hk1(fIZdn?8^Ws@xTRS z1P6O^LP3#?1a!8{7b%o8%1N}F9cz?)06YqY?=Xc42({FF0G`JB_5mmhvfdV4VGWj_ zIqnQ_l?ny@ihUv*K+GDH`ah)Je5{^*EcUm7A3(H)>-WDpcl>W1eev|foV(@n?%F@Q z_T~@QuiNo906%z@aq#uHZFEXD-bTwpQqtsnCWpqXKG)1E@0xRM0{2;aRGt4KeFU92_kO`Q=cMkAx z7+)5D5d*Ci34r{BWUm+-MiR{4^($9aR<2zA<3Ij)e7)UjFP+Eyz)Ma_IFF?x%7Prl zlZSQjU?OhqX))LLAK34He(ft?VS4Q#>gCIqDL?Rs%NLhF{NRIIH*eXI5+ooeb_`*5 z9y7yZ7Wlb&&J{c}J2Q)=`)7t0kF0y;0nw^v9~k~?DKstA1&jFwU5!m-Q71lw+2`kK z77qUD$Cz0$fR4>rwhxIWs6%5 zZe>J2$^0_P2cQaQ<|xsr5h1fG6lfzfFOA<4#&SLYLur`|g>?)004RHsm4$~Ua$_}` zzdW6)qbvhR6XHJcf?X09!e+4<<%Gx-w&m`fxS?F!58%M}#i4$hMO61=mH>zPGxyV+ zY_%rQ$)_{lIrZwv!!I1k8U`Nl;pviy%EfLYzdk#2=b)qTCM8^+=eUj1lz2eKKKtav zpV}zTr{GY!GU)Z${h*9OHuH~T00SSqA6*IZ(t6!bp_{6#ji*P=4^wygoL~I>7w!ji zx(*&X$Rffy${K&_^l3_JF9}AhdK>~o`UE;((+(zzw~vA^@%jJ5CGy|;Ynk`oae zS8!s&wUw)=D`R$A6!-4ly?5`fAK(Z#NgY|j?A-L6FbQW5nBTYX;^#lVuzw#!JPA~4 zsn)?SbcoQ5?yd+=00cY%F?=!;QA~u5#LUA^bXZ;8-rCwEb<@@cixF#% zVYvDZr9F_52OHOKU%htZ%o%rOZf54ro!fpt#xpfLJ4?Tox369WQT|we8o;WKpL@g$ zLgtI;B82}iYSn}~rm{TUg3g#B(Fdx9ag+>!45>`(a{B?S`uUj8VbNqD+QC$Ov z=ylFvz}M;M;=^8-bI59=wNK$XZm5BKL&1(5sDLFQo5b&uu$a4hK&6w*@p|4b$#Vn0 zi9&o{_TBXX*4=eZ2H@^-cn<4>f>Hvwbpj61^?L4!m@vTob^`Ru z!c;B}-KV%X63ZWq)P~7g5MriAqwrVei0G+XGU|S&{%67i@J~7V;gHWhn}Ows80wWI z@m?Ze&yUX&)^Fdsef#FE?|$dIf-=(d?9$@WIj8f%obrw<%vrqpg5I5m;u1dbmpU%YsEd3p8z>K<*|SVeQLU9Mku<>cff;dhi3oZv8x za>Ly83}2aNB~gfAJs^uM&TnPR;!*i{8&otMJcx>>s%#`B zO|a7`ZEb99u4BGp#~8LZQIgo+*l@xG?~S?HnTRt1C@N&$zzpEdwQEBC%fJJw=Kxqc z1gsb0HjwWxUBpnJ6a~moL^&By78cBzv!{-qK5j*>u%F^{0EGG3T+2(E!}HO|;olO= zX(O2!lFop9e@J>NA*W#U#)txp5!CM#J`>I6G^+a#EbTk}wKG!-6YwY>M|kgju(AGLkrdNSm}qDFA?38% zmen{+{?T!+Op*APx)`jDwJ08G4*CNtp2#Kh02T!-F@OOg5cD=?KOp)eM}OgS2$UPd z1W67Ay*{Azca}?`QXYWr#8BD`O@;0D_1Zu@}6zuavMWZY~Q?g9YzZe_}PExkdqx8 zGjM!iN;ONI3o)6>on|MFM9(mr(9F@|0Dv$lG}2}|$3$InOJfRx_expAFUHjL&8;oI6d z0REKKa{!>?zUY7OL|AGR!?|0X?(GCpf8%{wjACS^-JSqdV*bc=kk0z+_QBWd+o5_r z06U1t6sVeE#PtWo{26zh75@fQUu;OtD_R|hFs2dENkq?)`=7&L5J zD^-n+xU$p%a+ClpNuj0scXGXONLi>qof9r3UccZtX%uH0vZH0VkD^>(U;oh$e)!t= zf52Cqg6R0k6HYQ%JmSMS0?yXyQZrdg zq~j3tb7-d4y%1#-fJ)4tO8l0xrdjf2&J)l`k}ysczzb}m)0&u>o|v41g9jaLIrq}% zzWm#}|N8&?-?)2b=VlnG-?@GR<_?Pxpg*;90IEf>euPQS!;Hfw9JmB6!y+UwUpRH< zWGtG-NIxP#);we^pmEpjLtYoOS$c92BX@ZE5`dIuI2I7o`b5MmAhQP@ngb&jXt+5^ zxD%`rPAx!*w^8xW5&%DjDI$*kfaeHAUCm)3cm_wE>-Kv*rl`RNptLW>{-AGAiUXh| zKZ4O7kB_zicsU@({?;!P!9ku|s2l)eYydHpw^b&5Wq1Ag=>t&xT-jmiSfIYQ0Vq$3 zu|F>#mUc}_mR_guadf}g&JgvZcYk|wU;E@&PaS^YFruGF`E1?ax%}rVYgaakozx6k z8RTiBm_2aPa!Or}24R>1V8kBB;++6u@caxafhc2_HBsliWaJnCowkX5hDyrxjS9y8 z0MmZh0ZSKz{0p&j`iGS|?eJU)tQ*xO~Y82Tn@BcU`@FnG>Wum0qmgz3YBp z{Kqi^CoxP-Pa|(|)(9s+pfG_yt}-(}Z(^;H$T|_}40T0FyyKYL<#J@CgElCGd8vpB zxHZ%2Oq^I;x_;%#{487M;qJAoFn37w`9Z^P;~w#d4xIx~O3yjL$n~9Q6!C);oSoT1 zL?t6J$eS3!sUstQ2{JhlzM-~Rv`K>XE_a=<7{z^Lblr8@9~;d}ns^*8_Vg>Tk2-ao(b zR*dUM^+hkxprg(`#lxkhku;iFiliT1JUi2^)=cNb7mghJ(h0{8;88yP-Tvj*uHJm( zR&R4q?3%KlHEh$-^Va0lWU?P9HZNt_z+;q7VQ-wt6nQ{`LHo&Z!m#&Iz44shYeH$kIoXh_i;YdSF2Cyf&i2mFe)9Soum99vcOt^+ zvuDpecfm0O#~Y3wKMvj}O6~z!ClQi0QG8IRu6g0*mtXw+%S{K1D#7xWSJXoJ!m?{UxM)RbcelcZCcrpk0waiud7fD$(2LHj`*l_cNa` z-tozo@L4_pxznl=g5jn$?5q{;VNHeP1MtHxPc!^DV}d4Bb$E;gMT1wR+a5972y=&f zGQVf60>V(*J!}9*af0tW<9FG09{Z~t5FT2S1B5zrQ@tEusti;8lsssyqcG~v_t&rf zqj$gcw~oDdsx#;ATP8QqAFN;Vqr>}0OORc}(hQMV{K=9m%aW#Pw9wMa3LjMWFYZ6{ zjnflzV{^Wb{Nw|B^X(g#f3VVB?e;f&gI%zFN7pekyJe~w0A6zI`302Hs^Jt!l+KW7Ff zO$0*;9(f4k|1qjNea^L&mGAxOw|N3vttLta&VI18wCKvkB@8{rp0$3{c$}e_T4A)* zogu-olQT<;@Y@3JR`1_mSzdM`0+%Gyo_lj!QYCiK_Ke$^5gH55RB;AEnGA^8v^-(b)lc zEpvX^wyJlDYye{UkMt#hekxtXCRJ?!9@i`LkZveH@n{QbOyQw?flQ$3UVewsvcfny zK)PVZ$^k!IzxIQ*t0QF;fI9L5qOhvZ*<-V3zjkW= z*#Jp>$c zz<|35{+U0m-d#O(_(0Th?8}`y_exR$2?#4C%{OO!bvA%qOju^Mw4F5TmSra~ySD5= z(goWFvrAtNOZj78@AZ0b|KiQJe(?)`egB~Yi|5XtUR)%uuz2#!8Ft?)!|F0#9TDIs zgu46d`~sdh``j14$jD}p=QpojbB1N7FT!&9^6LG2zp7sMySsOHckc0dh(L6t{$Ko; z|MihGr=8IH?rYz_cW>3HCtF!||JJSRD=Q`TYo4jqt*a|;`E+gBwzdal%ax^Vg?s>B zF(TBB+rYG57B`ob#$aW&F? zjDDPCNu%A!I;it$PPRJJ?ao5y%&(t1`23+XsUV{VezxvzfB0w1_b=b?ZFKwFgTYpB z&@GCABkCCf`mB-J_K}6pWv1bjG*GBG$LQVZbCZPNIcl;=y zbL+PI`Tlpm%j?aFN+-{rIlFZ33}XBxSI#f&15IRE0z~UXtq4$C&lu+8*r}85$Le}> zAlIpkRxaVs)yvD*u3SL_%*S8^u3fx%*tOHziDu)?%ggY~y5fA0DaJIkq((xha{Kn(E6Xbn*AXZZleD6^P05P?$(f!1^6 z{}WSx2-sh+BMjL9ydVQM!q-p*=XK2PQFfKL*dbi+;XshhN5~DMv4715PyrXC-#e;> z$`-MtKt6b?%jx`^g!+;CHyq?|O*J~Ro#S6Re(a0Knyp7u_dBG&^4isFKfmD=KHaTe ze`_$}pYN6zXLo>__z=%r#SFkSzb_e-Se)xL*m5c#+ zwJ_cH6~|5b{ZbYDZHN6?iO5bSqD8Xp1m%EuuAhN=p63_eeedFX@B8acXL9!Zd6W+p z7tfqKcl`8e^gWFcgT+;0RlgytuA1-HS#h8L+{@3s^b!*zH?TLaUAuPqvQrs3DdF0s zOZS{9xVm3{IpxK--u&Wk{-&#(ICktc>`Up1uWR{9ih}2UK78{{ChhIgcEtwZ75Kcd zf&{?J3P82fMDl388DRthsMz}ef8KuUz3bO*Wi9wDAHbgZ0LZPD^*mNLzKpIVip8*% zC#{|jAU-C?h>yNfnwkxujH$meq?!caSGiJ22)ZI$)tmd>1)!zJO;(#O%#Z~oPi##f z-73RGHUJp*1=146*Z}m!0kc>;N&+xYmjetdR8kD-(@62tLSrxLeDF+ft3BO5cz*xs zub-Znc|>)8UflTkO{ebPUEA$%q0YyV{=x2`z$1Rn%!`)RENi63nUE(AFFfCFP8JmQ zQ+tE~Adoa;aLt5M&J!mYmj1{6EVgM*@_WS5kmZDv|%Msl%8DymW zchp~w^MKVEe+3&z?X{o2_L`UGUir$eomo0}YH8{8(&7o`2Nc#gwffPOm)=Io?nulDXC9Y5$n8YB z;7sUDM=rkk3*IkXD~J-GAbMze7%wXF4K5=!w7-t@1|8IlNDXudSc2i(GAWa-t*vkW z{vWkE?RKl(Y_}VY28K+@aI1~Z2S8g?$*A^8iK3@4K;a@ht+h6;E29#dG-zE}nXfA` z^AFdzL0Nfk0N(oWz{ae;d{jOF@{Gkpz;yE7{gO-Qe+t5jM|0@cI3Ga4QMvf9mXiVa zd;q1Cln;Q6^_mZW@(K{Nqpx!#Xbl9a7=64RMJXzcVP;2QZ6)>c#el5@C53t&Uw`yA z01J^EFw~w=eF1qUFFX3+sjj5qG%*;*tBlIZGws=TdS>+x`Adf6yJ|Jqo}-pxx*wZRW6lquH3q(ut#oULO4{blGtdG<{`U zlWo}d2th;|r9%M`5J_nmC?#+c(jX-*-OWaKw=_tXNasKrq?AS&-3R zAzA=V>gWSjzvo1tALI0lgItHdslq-K-2m|iUEw_bl7{s% zu->gvz1nem(;!_Iw!qCQ&_cHZWRT{=-DU@9E-wuGdoZLBOFH8HXv8-MU_&LlMY|aR zp}ROzw|8DiC^lKkW|+#|i<18lrP{4>Qv$M;zZK(Yq*pAma}it@FQKTX`f)H-dI9C{ z8u{I@lnj}vSn}v)WfaQs-*V@@ZI)g`?X3to?9RtOY)$Ii0$nFK;_D!sWoI&+{n)T8 zM-3}m$j*@pw+AZ*yB_Y)GI3iZtFJyHd!G9D$D>D@@kLfAEmH;ZdZef1ESjPi-veL% zw1e2ZN65KMQjqw&MC9f5%$X-6CoA0iFujSpPzbreuV`kKbBx7Fj zx!Bk@3(CN(9D6sIb-3s6ggJbFcXW0ZYBrW+EV0x6FeSM!gNY5etJ3BKxnT;D7`^sR zUQ#SxZSk$ou{V~XsXuKhPgRdT*ZdsG!%f29K_%(>OG})KnY&*9H&Lm8a|C~^!?ztg z@?SQ6+HmeneOcz1Hgh?lVLO+I-ibEZ^NbfPoq$cJ_oylBwv&2jas zgt}e4aPMKvC1|K#y~vB z99+CPc0k#*9bWVgZv{S<++f{8wDvb7ZbH~-f0crYum@cvih3B^20eF(H0#UmQ**3`A>iRxMR20|wZ zd*qgR2x&KB1c4h?7L1}ws9gIAI=XL@V`)mg%_Ejvg2eA+^lcPl?O!3x)lkF*5#zt& z5hkSx zQnD6B`(Ve> z_s@DLANRaEs`baxan&WqT1%bl-3#Lf}xUQ1`5q_VWSjUvi8O8H2@+&pgxX zdY);K%>brbd>=cdQHQ50<$BXsy!sf@uSgYMvj#m4$QW!xEo*oh?qtmGRDb9ft&YMzjh z3+okx%~wclv_GLKj;6Dc8S>CMSks{EIxweUId+=%BsCFpMI75o{N?pc*N_=)fVf>> zk?D6Hcah#pMkFD}u)q7(>h#^8M+GGQnV05w;K2T)MHV-?U`}$}G}f0pL`Cy{H^obZ zCbTUq8K}gG%I$V7urUkr)2hRqIVyAFStW-KvW<~kRluV*XER7Jau~MQd(FfwUNI$k zCf2{THKssKp`K@gRT@#H;}x@aKYy)WrtaVsj0wTQRA%>oX#9o=!q9a!`VD+$-iVj_ zrpCR^O&!)RjezxMCw)(qHS)!r*=>o@{)pf9BEaDLYti^i;?nr%kqPes5oJ1x#M6IY zvPcnw1SLDaopdkEYT1txP^Bm5b?e%Akw+4 znUSX}6s&dio)*1&RQ!HJ%O&FLHi~*rIHirD=Ba`jtx8wQ25lldscBqi0#&fhLiJ=$ zmZU#<_8-AG?M4gR(GXef&)2dCocQ*#h}V|J3+*X>=FH~Cyq5*lG|4Ra*%W#yDSS0| zz<84XF~eF!$-+3;8X@j38FnYG0gqwE@ufLNu?OaPM?DcKfsAWDUs-JToc?>auRc|X zl?io}CRLvCovx9c^J3sv!*#s!sHs0)Lav$XA=>vh9;#aAa#zqVe6LgU!eSEGokR|? z*$-@x$l_o}fh&0183Z)Q9PUecR91IsywugKHyy~eM)>RLn*(i9PEz4#ihK*tWL9CE z0q-GD$jw<74b*R>;UNbO*N($-m#(p;+qP5fh0P%qGTf#W@v`<2@`R<`zks~%tnbzp`lBECY8)AO&_ZKxvz^_PZe!>TRgsFb)_o$vj zsJgCclX(12)=MTm>{pH-)2UacDK2{Qwiyq7S{0^k8;rUM@jx;gu7Mnm2V6ky-d;Uz z*xg^+^TH?7^iIfi*z}h{+4o?A8dS;W%O&!P2Ya<<Obp&#kESwvVZHW z-FN(sK3IGtmfjtx%a(p%{=9Qieo6bpT;?6D0?`aZ-a*^%21HGfFElERL$TdEo)3LQ zgq)h12LF5xlGR!T3czC$NtbD#cS z4|0zFv$l?{Z@8iu@#1e^A0r#xzMeb$>zq#$);~`MTv}Vt6j`+s0MCVyfM44SjuWuH z8Q9|D|A}LzC237_j@6(6QD&$xI11|ktHip*(-Ul8v-I`tsoP7vVgW3y!I&2UP@zBJ zOLC^S{*QL?exT$IPZCf#dw8$izpPwRe8DzJbBkn;INnYh{mKGYjMN#dkq;s>u3V*B*fet@K0O2LI@f-F#)<90sUUY*5+}3 zwBGSlO5_lu=r?JUlSz)Q&@024##2f9b5Xx@F_spkp69!JY-TGxeY>|enUTRTF|nG< zK*Yo%4ni|_J{Th(;_$^B;r)EU^>$=_kE_tcGH*$Dx-6GI4a#ei9)v;)k{Q!xp0!n* zp-h~v%%m_Y?+B3Elh`hdMDSq}NW&m^!whFp6(c6%t~Zrw zWQqCW9_~aPzc#5j?Yg3EQ%9NN0=##7d>}U&4ao*yp%49cK>?lu29LjaJLsNnFMiL%Cm{P1@{ve^j#Bb_%47m) z4Qtz@`~=G|>QO#a=u*~9u!ewSp=r1NwN+R65icV?P%#M6=bOM;rc zFe+HB*^IVs-mOH~zGO{2SE~8^pS*4F%OZus`4-hRG=VChl;A=@RSVVS=6=lAR6@)> z$DRC1`rXM5s@W7_2*226vNh=SKIMd>5+Pd$?c0QB`-58@+i|wo)Ix!`Z;S=adP-S zQi~=Fxds3EffLg^e)G@N*O{oKB76D@C;9|eEwm%C%~A%SLrPt4PRY%ldsKyYC%-Be z(^leWDRx~R%b+Jt$#mR^RuI|R8b}viOZ;>>297(jlZBK_0 zW#?}i>T6#dDycU7g+I+JnWPKg^}CCk8c_!8F;PK3PK73{7bes$t4Y@F?ZkYr>;bN| zH9&(rG(E3N%(S~@EVz^bLsP=?fd9k@oSw)uvi!uA17WM_R<5>IUAkBxA~tuY9t4|I zs;VPX1=9YAn=y}l5UwczuEu12|xva^fa&VFwaS1*}3CV z;UOXSzs#fa4{Ni3mQt#oJ|0MW=KkveIV>9)g@z)bM zs>Em1>iPQe zkeD+mY`ec+ZgJV7+Xra)>-AHWi!#Q{gqgqnjo)oDTk_cjg}i)&_rf1ZUX>jiFShxd zkrH$%%$DY4d1P+fDYjolFY;FIRRG4NxV&;>Yv?kGm>k;nVp`S<+Yuv>h-0i&1=@AD zmt=aq$iyHP?0q?U`1kj-=cLS62a}WgXL}2SJKu8`BM$9lSk8K3+d#Np^S0f`4X-&m z;!D2L>)+Ikk&Bdd9{+N89t|qak&C8#%9lm*Q7uh!7i!`Le#PEyPj4Y~2{61rHsW-H zCu4#%)QeoqK#)+WC-!6Y;Ub?n;1N#qtJBkaeZcd^OITf=|$t`hYv(rYcf+_JR`J2+d^7t0EQ?M zIm}g)2cYmf0=BD4J1ci5zW3msxAEJMl46Px*w*ZNpN!nLs+gR$B-t8D1EeqfYw~0vMd$RXnyjhX&CK1%u|LP2GM+zbLJU`o^AGhrI>kX>EiOf;rx>$C zmEi4--pQD)yG)-maW7Cq+pZ?22$CkL0Gh41|4$*t@3vaYEYK`+nA74MbcJ>lWuVHx zJwXT24EF@JwYh;#KS7pw2~2J{A4$AFiP{=F>LiaQ`Tj&xnHHeON=@xP^{#7K1m(Q( zZ&(Tmvn`?NS$C{ridam>RgMCnJ01c~5BV6;XF6TJ}aMR!Zpvd~V}CAPkv%L3pfW z@=D7vou3Wjo?bsJ0?5G2wv2DVQO;L1cJ0Z+i+}l8*EhthLHB=oaAICL+zq`$hq1H& zW)^aE4A;(uc_!yl&;->;aRPEsO~0wmR`4RJ(H`F$T#eqEdu8porR805HryU{*9nblSwCd-{aV%v*;b9*KU!62tWhpL)8)RsRVW(yy> z?wN&zYN&y4o;KpJldCMiYFd)H{#6f)GQuNnK$~Xbe&oiYNDfFACzug-^Yd$B`Fk|s4y5) z|Hhj^{8Az_$O%_&cp8c1&cB?4M4~!mRB*|IHMKZSc?l0t*tY9IGbS!Vd1wR}mEZX- zaY?+><+V33E%?bkn669Wy7CNob(Qi)byG`5^0;dPYV5rP>6$-IiQDhf!u0+fu(VtF zB8zJ@hMURsx2w3P#V1-q$-lqoN_o*lPkzT4-%?~ zoW%!ClU8X7#tkpw13CY%6m+sn!Fzu-L9YVt(p)ef4IfIwztFaqJ#4$6h|&mpIVFSX zM}6p`3jh(k{gn}>flrtE5j>uxfJI0t%sGVSKq|6?-A1fxXFcKyvhRb< zDtXeB;yT|hgqtzx?q2FT$C zNb81|F!}nG5axoj$}-IWGvL*NudE}M{Me23mPz6pquA&5UYvz#R;g8(ZHrHCO^r*> z?EsA#O7(0JyRZ~uYbAX3JAv14RIkKlF+WIg8}R#6Zrv4V-+d*M<DTrYbohZ|n)FsUHJ;|u|A7yJ z&p%l>>Fl#e6Vi=;`cjOav*=Hx%;EsEcyfVKzY_IetBc3)i3L^s%~u)Zcq<|o5DJ$c z?D%vrCfRL}{`4V7fPAQ;d#%^XPGb`j=(7!hoDi{6f4R8J&+4746JfBX{5* zIMs88>84tqzT(`{1#pMD=TR98NZtLd3HU9_3`G zBF2V0-SVl)_Vxa8j!8=BD|`nZB#Rzz+SEU{dOM-Qxz6S$I-Yk1pCjwqO(wo<=j8vu5HMq!W8WvE)=kWm_Yo`L1~4 zi6u3YaOqagx?mL| z@78&)gVk;Qmo?eeQ9rAn&Q(Fig%=hEY0(@*@p#n1qxKjY8}%u5rp9Njj52o%nLb_E zzY}Qz&xfaFYNj@q_URn?*IQ#>FfXwgVV@6PO9-#W5Rt8dPJwUhP2ReE=FvZw^U2D3 zu-)aXf9PjHZ9-8{^uD^#^$G;_!4~%49?kD!w!;*vcse3vmI}&n*@Z_Yw;R00Q&tf& zNSb#Gk#%b;;t0oaa*P$`{ZJkCly%yJ6OU}vcp&KK@2D^;4)B%&fNX!rEk`sh`nM@5 zz$pXW@ZJY3MXvBOb2Xak{yg%<)t#)G2%gj}*={gHG&>u^H(6a$fQ_|d?S>oAT-VHT znN7^5utb?WnTH1V(#)vnk6dvNT>o@mvW%0vm}x$)QF#iRx;Je1Nf>%)9T9Lnm(^elfa=h(OHOWOAOA6>*LF@6VQ zm0nP2$4$>}7t24Ab(AD+7lhWp_C&!YC)76OG00HcQ#zgz%rRWlHxo4(iF8}R4DVD~ znk|>=>bsz*r?bV0icSnwNNg3-OZ8kI4|CRD`?qKrrtn*(48m@fxbB1kQHHg^QYLoY zn`4%@rT%-OXqAa$LT=z?D!^F(+Ygf^1W$A?2QEG{?jD;>Wv!goI~!j1mB>U&Ya=Wb z#CWek81@v_nnxCf7e+tjM5uT{^+LtTtC>59@q49KGxjE#LE;X0ohBI4-gIML;;ZsA zCkzwjN{=yRSQ{%}^JkFN{8|+negPFV%&Pao9nz6(1> z!PeI5*1_G#ZF3pNa9i?UlTRE-ncooFCCQI})LcEx4C>1GPfh&s?EHp^(NuGkpu=N zBnQ8UWZ_bMFK(?sy74rT+9Xmnr0b-)elbSmvVV-d?*FiWOF92!u0MYa!)n1EZShJOl zeq;FgwTnf8+?y!K^8`ZsKT77HGISp$IHKn!hPnJWP+FGsVhMvIf|V)%@BxmvmA-Z! zJ`7~MsA%RTslbXrM9Fw9Rx+!C{s$jENf320MWe5#de+vT``tBlvV?#(hg(K>Sqbo^ zb>nFwt-fU|8Syb(W`B9AIQ5WG&MWmWpC=J?!}E&nIJ?;$nGn25->hxEavw6q!~0gk z?gMy2IX~)Vw&5BVCjTOx`Q5zAy>Nz<*tGfL4>O1_(j>#K?$*=MFuBW0ZeM|TGofVk zVljvLD!=|rSt3fx8u2hFJm{yi^Tjm6vmDC7e4>({Kn(9^&JE3SU=07dDLt^$LAhr4SMw{ZPr?V z#lS3d#*;EWdy1dQHm;f7HNDirAKV9yrQ~3Mj3M*HqQ2kH2`xqT+VES0OFW3BY6F8A z6plA@P{zA_Bola>eo>jXu;vP3_=kPnE9_04!nU{z~v zuW~0ps?AG!c<%jPoPLuREbIkgfFUPpCZIjdZkColO;PJ8+7Tz&g3L#;HR8l}!nb;h z#kJ2aLe+Gz2?_tQ>;ezU=VowPY%*I-j#nphunP?R;`@rI&Y-*eU>8X~riXLwS2Lkm z+Wm^rzZO&-SoZzNZ>v%`qNy|Qo$1blhdgQp=>sLkZ5y>?OTGBM+QWQlHiJ9fb5LjFjv#oqeXJ&2=Yb{|}Fg z_irDi3ZM25iK$4XxXlmj1Oh;UM|q%3iWr_Yi{6Z$sNg07?8cmVSah zD4oA7ek%4nzD>q^9nP8T1N<6flwQ$xD!fk$Ys>osa>oo-H5ABPZBay3W0z^;yVfj- z&*3eh4-$L!D#7XVe~s9$P&AMqjieo`yeNyXwEh;=gp>SBT453N`(fU`oC<5V-8$(r zKOI$E??%Q2_a@9j-KD<9JI_7Wxtal~8k%%7OD*|*KMp_lJQTeD^>YLI8qS!dr$WvN zwj-7r;E>8Sxu*Wj2_7KMBh20!sw6B%8#t&oWW_u#pW%ys{GFWPvwk~hjFz?jpyUy6 zTHp-d+VI<%{x=G3EGvgZ0g0dd^?`mk<^A|oT)_Ny)h9hfr)0i zuMv~VssG&Y;nh?6f+1W6ur2{klCfJgluA1TPjO=xz=wt0RT8%{Ukb|Nr8M27`hY}2 zE+tpB>uyg5WB8b*(Hs?LE`6neh%VGbL*3^9l)p>q>RL&dNf+F_&5U$BP}97+;Jx2Z zQX1bwqL)L!37k*w!%-H^Bw(E!&-Wd(t{2clkdgKXS+K=t$^7+2g^fx;$ZSsx?Ye$(=gfmgC+)n|eH{u>5K+#DkaiEF52A z^cdp#-i~f;`F)*h$ME8qPXx$KlAGe{WUfw!(@LNAw?#%aPDu$i`Vs$*G9OSx5{5C- z#gSi`lg)BUs2Xy*5*-4~sAnU5*kXZ4R2~wQ7qot|L;@p~f%BLMFPVYU?=O^Gn1$oR zSk>VHI{jJCf)$@~##wJU!`5ebI}Kv5nYjwbeVI{`Pm_4#n{njBrLLLi9PpyyM+G8) z0&VNqcP1TI&jbm?Dbte6L><@-E0!H?|9i4OQ*d@-wgS0lu*I?p7q1HgHP-{Lhp+DV z&g;*-MQ8u4uAc4oe3@ao7jyn<+px;reqD;trESIX7V}jF{$?1o5^} z0CGKGZC&CU=yJ|5F)enVpX2Fs-h5m#Q<;R+9c?NR&{k%my1%_AokciJ0&%|bMZ4fn z?r|^Qh5vn+UpR3))Qe4dBZ7E|%h;Vi?)c)FHX3l+ejrzEDB4f`!F3+c`_^%26A@1K zi1x~nGgnZFkN?f8WSZ<*tN++w2rl~tVRj@r)sLOZ=i1L|ZuCX1lVcpd_xz-C5DOZO zWt}cQcfaZEn>z9#wX`CtVHTkFCq2N~X8quMR;H{qMSg#AVk*O*_mM;;x{OhCZW=TL zUh@55Kk)avlg#gyioP-uSq(24YU_bbOl6JA0rWHelicw~JFs*hm>U#cD6{qCMj9rNVBY7Ur+_1w_E>Xf$i&-BQBX_#}%L;VQPn zIzYH}`c#AM&*w41N8&eWI5H{29iKkHUoVC|d3=q-zs)9SAx2-B!b6}lX2>mur@>Tu zwcLe{ael}?zHIa$Qa-^8^LXxSM2r6_;*Zb@{sldL?Xwie;>AmrHXAA-j z#9%nx%M=ESuOEKijM0QsTy)Bx6D6S%Dzgq^O2J)g49MgEp4FQ4fWqHwa2fE1aD=ZX zAovx@zTgTOQnY{aZAk9m%LSN&}MDg_3h&F~6 z`5^%jhY#R4)evSUoJ09VV%rF?gB$3XLMTPC&QHowajNKmTLrQ$m&OWc_Kqvaq(Ndq zgU!6gK5fAJL^jM_XLhSK|I!&OzsyI}HlOTj@;zhiC`WnuGRxQf592r=r20yv@q|F{ zF4|XiPHs}*IceJ~-JNdMLC1RPy_HiBstB3#-<0i7*lmDswfjhKvv?@G z=>FqwJnfVd_j<|w$3fd0Z7q^#uqN4GENN%2-}gFaBL_v@QivywTpm0M3Rms=N|O6 zLr(&8HL~q7%!g0`V(tYY+bdn+t-MiodS*&G6Rhh`T?4&&KS>F$cj78QPtx1h&%50hlE{_NwukFqO?Xwtn{hC@gBhRopX${XZG9lTC&Y?egk& zIPW1i)~+E%J#ULNhLW;59^BSa9FHbPii~CLNOis2iXnS;?8Dwa$nviA)5j!p?bgV$ zrWTjXVv<+!KeQNR>DKH&uoxm)IkRVK*zT{KBw*$d~ zh5qPi8SMsc{yC6&uUk#aU8etj?!SK{gdYI`%K*oDf{maM?j`7AOui0m?}Q>bIm>pS zYB=`*Djt)$KILe8dw;U!@^*?PHw=qg8+IT!*LKf&U5Yv(N>%<`v9>Jz!Y}tj6FwDi zRF^*ubt--N*H^r6;RMIRv^3a{0o;HWDLS~#_ut6BZ-y1~*`6z)rzqf_2kdsbGpM3w z#cj`Q5K&TmbxfebLLA*Vq5b->P#*M7QveWcBhm_!wZgkUxgL91ipDV@XDUhvR*@h( zQB71U>XX!}Wh%tEZ7zT@&cYBrL3`XE+OYyd(UE9A%c_?I%th%!nry6HDf`VgzWb((=V@fpE}kCCFoXk82opmLPzE1u@*tynKb_j?Ni(#jP;Xylsi zg_R4Ny@e)Y#j#6^?Fu#;hX%BLQoK+4Q~P27By#2$bbpEo=>ft!IL6NK8w=s0gV{N1 zd$N0dR*jtwtg*U`-)g^nAfGXMY*g8$vUWtk&Ks`h@*N^)^q5?8MqLuegyBECqDPN; zACrI2fBvbeQ=IHSn`eerKLrJIC{pOehb~OJ??@IAoy&B=BLt9O$lXi9>}ONoBcw6^ zCa1)`BcbAZizo*u265-I-s1-;L67W4nP?pUMcq~PO5-I4w~CFsxmY@ofp4E8q|6PW zdO`o@dOM9kT@SxtHD-t^v%E%E_B&%2^yV50kw1n+zO$&JYcF9gG$Ck!oCLMXRDWC1 zGnKIuZcpZvDKqP(Z-@yCeup0EO=8g|&=xB^{X2gIDQaPThqX4t!GlKcb?*GSkKQ8v zF7I|%0p7izBM>6uK(e}TxSKIV{b=iRpKvv>(jtNF`h%n!x)s23T$oHUQA(T7}gKmz{ZWeZ#(d?1LO+tGp2 ztK4Qu_)3_fB}zOR-P;hF_#t>W*pJxL&p>mf)S;bf)MZz{3^1Rk{YSdz4?6n}#F#UF zbgXak`V=P=rM1pi2vY?RBF*SZGs!2&!LZZrdnDdL;3;$wg0HV5;D~Bje7{ce$x^nJ zQQD3FlN3+o!po>F!w>t#Du@4v1&qWD;1^r^u4{yS+A=)FI(HA5gVf6b7hm{kz!%{j;?;BMtS@VX5>4Y^K$ z`kxxy`aLX^DnSDtc24gKyRW}H!|T1$SCNR6@R!@Q--jGW_5FX*9AsIPJZ@) z`aREGZJKWI&|mH4!*nd>0lqZ*7p#JurZ5geC(=A0%7um&8!(k-WfF|zrBVtJq?>{D z#XAMlZTgw5u_6H^Oo-pYZD%~mllL2PMTq}qdPB19n_IDg}^cxKh3Y2yusY@v?4Tus$^eI^0T!}+<= zfTtHf<+&-o@8abAYQ%4amDxEExWc#QVVw1#OW?z9;r$k;+tlSL5H+=knP`Aq=ifQ6 z`yqB_v16Od*>EshkYa^@5RX*INz1a5a-NRpx!icm#+)fl2N=37XUo^#6?t84bSr4JN zpu~SZ-z>ks07EyvyxDg%Wj9%ga7wb?*z%Ae? zx)@Eh`Z8;qS=R4>_6Mi7lp#FK?oXP;3=U7_EFu;UV=oG3jM+#qFVN} zA*HR)0}p)MI%AnTaPfuM7y10vIPwa-|qxRhR%O`t3Nb~m`31^e}@i8MC*-LY#l!JHYNIi$~i(` z9AUOhS5ec7{{@;(3@feyad3#srRPBqq2F<>TlpIL800=k(e%-PG}vax5C%20ngdNS zW5Z{DNCBv8x}*W)@rp!>Zb?_)rnf~dGy?t3|H>pmgRT-VM=hegh~YGtw6jJcEH!te z<_-es06JgS+uK#aIp->fSGxIpLHluHTk+FBi<7BBetGW1U4yTPhha?RBji4?UyTUN zxN2?#8gve0>Ast+Xgjat`i;29;C$f~PmMuDXp##C3_tf`;BPjZ=9B;)Z;x~)vG@>l zxM;ngLjD=wOTpRjU#NaUlxf=_dg0e4I16`YuSZvKd;zto5Ugg}MRkJcw5xgg{XSWD z51~USi#Z>8<`KTz+*4m&Waq2+^W$yg5(^HJ;eZSs{_qsZq7*KBb6o=7Kz1y5uXQ&o$K(z0 zT`MC!t->_>Pjo4!ALQB*Ot*gznSj-R%RpX!evIhD$;rPJyCBhpbs2FH4VPX-6a;7> zS`F21he=(^mblnVf1w<%e&RiPhx%vxB|veIahcLe^zbq5?8XQx!3S&+Oy zQ+e_yg`+5bKn9ZtXu4o8^jITly+cux#KckgS+s2fu&;K1-*p!Cj06N^5aG)!dtLL2Q%A&ml%0<^GaE*q$<1RjF=nfu*Nub!@pVd3yP4EOp+*ZD zC+mC;@Y(Fu$Z|yRM|Ug0nhj|I18V!)f!&1h@Oit zSszo3pOJPnDU!2Qvq6{D20(5$dpYW!W-v6*z9{?QMFEa0mh0QK;bdKa=1Q@aa-XmL zU1bT}j)KCQ+GH@IGEryu{buM3KJ+pK(eD84_B$U-yE;R|4$*8!Ks}YS#fF512D|Yz zJbN(8)-zW6WOL#gU^FCPRzh(67jqoPYxNf4;Hgu+#*f z{tW%M{cav-7e?iKi2I}koT2O{_mE*Z?;PiU}o#q z1WzZVwb&tDb7!9Uy{xX3`6`J%e}hgoi?H@d z=0rgCx$}AEol6o&J`_G3yibEEHADR2yZ<1V1P#8T!QAlmqAH-hT#!R)?18o3P$C(-qx+}jiLK#Vxl>AOF=a)SUTuwrO;XeOq9x5i+POOiQPg z@bFUd#S&x^K#f!-4n=OVRPCn!csINRbf?euG@j{v4F9;L?n^ChhG6D~oYQ2Ya& z!nHzUbdC6q+!R@3!s{DK+YW+Y3Nh$H(B?GcCeBRaELR3`R=S8efOS>))IdRj$B@Gw z-t)8RmXgPQz7&it-^`_o(zaiutCKsKs5Vj*eRJQ4b6tpa=KBMihdsdnF*$Ym7!a}x zE9aWLb2(c`qG0I(1sO&}l*{|ojEab7`@eM(9ICvSu)<9WED)%wZx@W^;Q<+#ziJs!JzVzzD_#F1YUaCXf&@J97_o3gU9ILO+&&9?j3c25N;89&sp|6GRAg}lu~c9!=_P#;9s*}dbI9z}BT=JIi3hiG~JYm%7U}Mc5!V^ zHTgunD}~UK3RhCytt==$_*!2+i6^WwAe0OHKzmH~PX+hl7i{PWrp*k6^}|70(BYf6 zvxu{()W!6|F{^i&TKkTD9D?%k0mPHqO6l{!{HnlPhZJf6Zlt-GK+Styd#f<$T=^2; z)CYk?y?6C&f6L4)aQg2>jp@coFD7lQ3e!E~LxO~L(K4NoAdkK0Q z^71xIlY^P-g$>{tl5+w;?IBh$`lMxUz)JAVGa_>7;BqNhL;T#=Y#TdEko5_vPrr+# z0cDPfwbIP--nid3ygr||gciO%yJk}14)F633q@HzYjXdwN9Yq(dTeGEt zm>O%S8@1eaz+M$vmZq_T!#|xZu;uXXXI#xL0V>o@H zak; z^(nmk_~m>;DxsZ|g+i9;w81JRZvESahJ_07S^YxiEj>wM{pnS2>%`hxXJeIO(XfN5 zO3$17n4-kyIoRKNh%+-vDlix)ve^y>Ju!Pw4qB=1eQolJ2E!MyTZ4qW{V4mk;h>}1 z_|?c?2i^np?QMN8`1v*bEz!6vCKfkV)1bFW%x`x4LsnFnQm00# z%DUIpRI}&WnF`q53-kd;P zZ36%w=XA>!c5xz8cu1*;?XCb@PCc91otb9E>wI@`^q#@Re>~joI$M{dC>*Ry=nN6NKq$#287O`gLOoCpcq`m+^iwV@Z=gir(Rs&>e zQg?yb@4Y$Z`j2T;bp2s1cl-8yZQIh1r=hU?4GyayxRYw5QMw0nFuTh+9boe3#23?Z zchYoD)WS^}I}pyIW~u`zw^bz=a#B?L0=ybZV&i)>VOoEVE8f|33?nMC40s@12ugwR zR<_M!L-tQye*+fGbUv>$EKR7VI^-cGQDD@V$c31T22+!ycl=u3Yb$H|o%WNmy{7Sl zPMz`C--!a(Pu}4fJjzJ=c(qF}cD`7bo=S4ismpOipDyp?fJeReVMiw}Ocsu#f{M5M zgZt%l)ld4DA299YLFL0Ih)s)_>znX<##o%yaZ9CxLE??1`MOAg42qPUE^fy1;$`x*Rf|Pt-BxXg#)!@v+Xkk_W+`s$62Kxbr`N_CZ2q*fW8TKIKW zY27H8Ul59z%H@L~#)xZKW_*WlC86krqc_@Pos_5Lh$pWS@`(={eL-8&M5BD_W!;~C zVVC#dF+@3Z8$OTBLL}*h#As^`d#nd-l2VcK2Z1RA@WwwRubfk7zG)Y?@xTZ=yC9_ ztTda@2ytjp!3^LNpAQe27uU3FSU>&VV?vM|wFC;S5^e1E*V%D8;d?0_g3_+Vg)zIt zqk4YH{Vb6Nj4Wn~Qrz-UU$67MA&_|Sv4uPB#e!WE+Pkgy8u_Ez7Dgc+SMi#Rqbsu$ zWu8pPK85$bHtnFIyFWy{KlBxzY$0KKjTG5vE6a~`PMw{@>4}M}i)otR(}TbK;=S;_ z^LerirZ}L_UE49)fkUSDe;XUZ2b}!!k9zO+%!2otfUu*QLfoS}81oYP;`F=+HY~~$ zYc?14D^8Xi8QwY{CT5^8TK0bYhh3WWBbub%iEpqvy1t`_2I5MSq=`Q!LSW=o)7i5n z=3V!HtDo-xXGf*U&(>CNc0sRZ+0p7hN^UcRq2$kkt(hhWe=DSADb#5pjD(8QUzFJ% zavm8gPWV^unc6f6ryCejmZu8LBc>alw#%plf!cc@kX}fykU>LSD9R9QOhgwS1!p;EYsX}4<->WWzZ z|Iu_+aZR>udy| z{~T@fM7De`^$@LVZ?L2HHuZB;hEc24C1mA`d1hYayQbV<@WkPp=Y?8#ON+Uaf8DZ{yH{(g}JN;e3LB5E?Po1+cfejBg@9-&{r!O5+{`9zmF77}uG~zw* zVf|guKBr~KJta-Kmz%&HOUS~vfu3ME>fmlC_!!SU1P1##;$qRi8aejIKsA=Z;x7uR z9cq#LUXH*(hSh&IhSX)RQtGij18Om+E)bw{;nREm^Zfkk7H&Kyvl{O9(%nd~r?x>( zto!u}4f(%3>{^?bz%1(R_rK$#H;T=~I%dG9fFvO(e96ReXb=yO?M4TzsE~KN#B7elR(1g;o zBljl$)x`k%M0G5eXeEEA=Z3s_;amodNgx}WtfI)degjgka+4n%F2G8r)ZS>%Itoo~S7RVwwhVyrLcwEdhZ6spEmwFQzHw#T{#? zSEtlyi+g>&kUW;ABuB7-Bk^;kf)D0Mh_^qf;v~R}^vBN=WJA51n>#d`PQcB`s%NV{ z5CB`X*2{|h_k#2C(WH^cNpW44#9qc6oI~h0>>~BFKxMO{9xY`W9}jLNHL!sRdmMeZ zg9neo<6|}a^=qD-)|_GexVq)4>ais<1~CMgVMgO42K%G-;#W=oJdQfz>S}XCNNZcB z%s&`k1j07mgZ3fsp8Ng`qW`tfhL{_;Sv4bJtkDw~%GcPM-A|%0hDF`L$zR}N?iRjZexGrZg1K6u}(r0 zTyyX}RRq9~abaRkfu6L1{8=uh>F|(wYuj#(v}$o?g@Bqv=m_iCPpmM3Ib!yxA%%A{ z*sDyh>$F{i??x68AUGv(-R}l%Cj0MNC20V0c-x2AtQ^3UT^RwZp=)X1eX|PllrdN@y~6Y5lw= z{eyc(l(@4YzF1GK%yu8^`$Py7?$i!;^aD7br~K}2>Uu`Jpyr(LtT~B43e3h;TlNeP z_ayU`2$F*{)E+lps^uSFuqyC{(^AM@N%}bKZh-b-GB&)2Ytee;{l zC7bFPh!a?yG~+Czk5ms%TPhJ!tKJVzf#@wn>9H0HHfUrG+~vCm|MZj%-trH~bgi^S z>`2N!>~x^@{=N^%Oy2rxw;87UXMb&=;1>qgM3LXpxVvoBKfw_je*c0J{bPf*)7VV7 zkf)BJ3G`%*=@oY9l0d;!Ep}whFVZu!wPWUhpooy~MFFJGO2z<)W5u~=_};HOGKSaQ z`eVthOrMAiRE(=6UeCUsDR~+P6*ZQ(tl!)zKj8p90jCG``fTdjva|S?{ zSIN*IOaA@m1ysGew1uc5s*+mI@{ea*Cb;47@f#XZQZip36PFEk?OJp-Jztj$qdku) z;j#8sK*k+mmv&-rsJZHLh`$f`VH*BrH=|+f7T0+|dE60JNeNB2UpaPh3Ce;xtnicj zd#LXeat@GzFXD^`WW2hl)b?z2UFxZI*_kzr?U(MnbLzByzDn}yMP)T)O=G1(d<4Eq;}B98$ETi8NXPY`?$L(Le!;hI_l9vCopk?^Q=l+ zwJ*p*bgUs9CjHvDwFsmm+dhTwhI}+)6kFPltTFpAttdT<=QmeqCR;s&2TJ@%pHX}}F zH7hzJz_-6v?&h?{4QFNd%k#We)SnweRJYAWc|T#*InIO!gxG35uP(Swaj1*qP~I3v zO9Q@ox>KuV0a~!}lMy{G4xSY@JR4xBt$RuzVqr;;#!lNQb6%Bc<==v;n*e_V0PCL? zHIMOAa6L(OVSZUJ(?iWitpzQYK6#`tES;1CTX3K#d8{JXm<(qS<9U#VLiruID?^zb8^9 zGT)o_$B(k}1~B5AdpKm^w){WX>>y#cr^~+;_0J{v?sygs&TbPbXgg(hV!hvY6#Z@= ztgmliS(dJ^ZgNUA)w9^;MEz}IRHsg0QI-Pg6SF*K_Nm&ZbM;0`*5oF;t=AmHRY=Ik zXjP4>>F@oxEhEtH0_pG`=+KweTQ?Bz4i0AeCKb)|Sb)2b>Qmk<*-b)fO+}gQ>;}s% z{WiAv_Z9W07)IhZgV*np9(=qdh5J`-8P~=AZ>m>8iM+h5JO#lSCX-l+`8Q1wZHJy) z%v~nxwR~ueatj@mWIs3UnNXku89wM|o1TG4oeW&y!mFm{^S@hIL!X)$U1Y`c;IwZv z;f!%gIFu6sLl&{qw7q&3vjH|4-VDE|mek0Z&LBG;)c#26eI- z8wYM6>e$Nh#$U(P1X0I_u#nP2g9&S6WzW4*o!DB%6z;(_NQq~tD}6@T5d#UHsk z&t;rISE#rA{H~}!LOz6vvq^CWacF9B09Ohg|Co>s)?Xz}q<&R@G=8;$)+@_6-E?vZ zbAxbB2HFiNa(m3?BraRB)!pR%ZMGAfuqiT7&yljoz|0$t@M{p@jB?LLS$~C6ri!M0HL4rV7Ox?!#*O$YB_H!MuC!rlsE=SB!tu_7Iw6$y z)_2ERsNt?#C0u1U5qSM^=)fPR2Zj$+tL^evNAFns4XJbanc#rp3j;6Mp~v-;z4;iUa3Oq`g!o~Ag2vj-f)RU^=z z|4-ak$(lPNIb`WrMxaKEqiVY%)ndgl>}8x3jotF}m+*8Yq=#oY6FWbTt1@f;tHZ?8 z*%?=USjExlxH=mbx<_vuZA$NVQVsUud6v|N;nLHB`^(c^C7r|gmeQA=<*=UEA2QE%h{o5L z%x4E3ws+Y8Vg#h!eA!->)=O&n*unTs^% zmHwH+)%=<$&(TGypg80R+E*_BYc0-zxZx9g;V0Iay=p}ilH9y`G)m0-k@h)`jtIrC z_afLTT~yvNB_*Ud%LOSrI%fvwOQ#v9FHWJb5m|vgKjf*AOb2G`X&AV~_-th_7}ReCk5L{& zX^x}X~E|JcnlJBSz`hnJs!;k(H|!Ltbo-x*`D2GzQBr6F%gMlip5J#JI+dF-#&X_uNHq{&7x~JQC{ZmCp zcde5p;V-O^I&y{Jl&&sqdKJNpUad|et(hq ztnWB=#x3HuDU<~|Ou2jK7RWQAHW0VEd4`+`9&nfpiGqLdkg>T2(qtE@6fT+3CGh!zk}m>veooNB>I zR}xI_s1YksQUh)f8)(&RvsaC)ox3U=YEW*y9zr#rJCEfcq@zk}`T~rhT;9CgV!4Wm z$@X88hdhaj)&MkI0cT0fp2dYyH{54TS}8Uo00fvjJ6eSHC)KyaZxtAA33jsu)CO(M zXf^cc{0LjT2G8xON%S!ne`XFpThF6xg(t7HQXXkgPW~C=B5mYb0)M3P=BBG8#H=M_ zM}z{F{eOo)BQPCjQIns0?_ll^-uDJ!E@2@hw>&HEhK#DM(oAW{2b$w<*m2!; z&RkxlyqrcHK=JxCq9#MNn$#iKKce5*rg~5jM{(da*MPMlr76Y4c7Qoe5-?L~)lxe5 zha^&VbKP*$L<|QeiDd7tT76nxtNfjjAC_km;l9tD(a{7N9UhYQ*xs#`vDzcL{=9w` z-!$++o0IoDO56^>^0t+b?<+ez0>Ru^iK|rmZ1QZPB6e6n;*7M*$iIv()}L?}`;)fD z<3YCbN-gAX#U}>2$>=y=VOQ-b8~n@0>R`XINBh$&(@ra&jgE&&n$$%J((!ckpB-Z* zaD1uKSnPbJZ#wXBGkm0BWYkdKfI_eQg`jsqh&JDyU|Y=6{yPoP8?vhRRN<&1(~!%D zk)R;14jffxci*$$9JfC$&~r9%NTn6`OZRQP&MqZZt&3M^$RmNFS_CVa^(JE<&K7Uc68E1}Tz z+hPO3ntLx6s6m(KYA+-s;|Au;zuz|I%h|$P&adH+{Fj(jv;~VVW*U@{#pODVs<_X! zu=hzV2zIjp-GthWVs*ssM&8ZNpCU0RzVHUMQzPj0*0L2y1$?f*-A4W~>==tNOmGmD z(*&w8k4q#zb2qJ%EZvA}j8RFIP33Dc|J^*LyPA$C$1BA{etkeE_EpK$&Mb~0sv#w! z#3j9U9FS;1J!_M08*Edj7knyGox#loGS{kP`b?8{ZU9@b}{9$5d(qtS9P$;%3qfvWTHq4eitW-_(hXw)B2T7DL%w zArX#q*rS}dbslCVa;_S@=~QRk&%URe=pi-teIeCZLplxVAE8ZEBrUIJP2-(8O+Vf? zeYX6vNSj8dGS$i`D#xd$Y$9O%zyclvZE~2&P&gCm4gJZ~OeTZJ4gteiyUOKA60zbH z1@Jk@&@W}5N8C(*^)5fYLrI3vaugW<*2<8B`-`4ZMVs!MR>Y=U+~kl501SLpPFi* zE?o(vXq~G;N|Ydp8RhaLFly&M6!}^!xh{v3rjyl(E=F{y_!%-*Nu!K+V}YFk-dg%}%FICe*6> z{$?&PXQnw+q?Xj^#^SrMesiBU!TTKJ7$D%wH@sJml^W`PDoT_P#ooO1apUc0c9r<> zZC;q=q8#I4mQHL~U(L(jnur_X*~i2<_k=Xj27JD^>?B`8a=*DF_}}u>J;8a2BP!ty zohw54#qQG0dl34P+a_rwmDUg69P|zHP8|nQe-j-`LrlicJhV)D>*t;3G!@}Fa9v^F zzgo^sg`CFtDWQ<4gEJ^B6I&4wzrxbwbgG5L~^@8Bi)J1?I z+$X7;bcTr?n>5ztsN2B~X;rTXC00wRHIa-s0%vrmd+WHc+jQBr&{E~Jt4u3*Y#}?O zRxRGwl3La7hM0hmfwkzM`^pf4w1eC8NnrmyqQf`I9SWbH-9xnpJvz41VLlGym~?ke zzY38Bn7&lIVTvMjuCX|Bi0X2xGv8NF?UPJe2PBv1y}H(7Opf-KTWC>ZEV7gi#2x&j zYD6Y}Pd6wWDj)LU74A1mMQk+3Xo}_(>Zj>AN`H`f?Xl%{Qn) zkJ*me)eZAYknek6DQor@86Sx@j1m@iD=iACmoZ{*o8E;a(Pw65{WnpA_8A)4CysM#2+xSssk#OlI!a}$KspZ?ai#!LM6UlX1bS7In8LdQ{rx|CDD?+njqlU zJY6}m17~FRC)K}WTyIbTHSn346q|aa5Xk`pjUubdvlRmYqtDx#%XFa{Z93EiUJYm1 z4L619M^GOjQK|Yrumk7wVpm#AaJskF<1BsnY5hBG=c&=wRh}^qEf^Wk51-^o3X1aF zd3=P6hUHp}+$d^KB+y^^qu{8rjJ|=4KOoGn(dxNZFhRnKvVJmc8{7s5TC0{u9BG)2A0LIrEb+|z1;@2!G;l{{)2ElXI&>lh&ioOKFs zhm&P1b#B_>XuVE-S0hOKiOevnEbODziYVIYnMk3*9nFp_zd5g+{KSB;;k3A66IO<(y(P8_yb@uD$(+eM0hCsx&*d3#oPb z!$;lZ@+-GaGZPM1m%p0!;0XHm3CKR=FzH#|plrw$&X`1X zNPS|dW9O?7F5sn-8;XcmEh3xpqbLSav7kX}_J|kVD$j>eB~2y|Y$^g(PjGg&v3sDW zjUWezLT!v>JEOy>UnWoSiMbIg*Xe8@UAe2fvZ{ zkey?&B6vhYeb1vX`IKPcA4~BFa3ReK=oDs4`N)};aSiG~YqwsM?HKTSsa;W(U(wJv z*4bSo@k937*EmJZ@sA2^ymo+zT3aivc=+p;K4nrzewCB5r8!sG=uaxSXQxl=2}-a= zgx#m*WMufL@(7hZ`sCBF^fO5-kjxF0uj$M8Op1z8WeSV#xV$LUr&gcp3aJfe4Mf^e z)MYZV&Q9O0^CT3;Dya$D8wZ|55T!SQA~e`mopFma*h?xQxC7#Qw=#b$_k_SPYTW&+F`9bI;G^<+w*gG| z*+s8m4f@RhMm16ID2TiIs5pEeK1{ZThrw@r_az$wivbzlBzsey-# zlv!Y@fgVa#+-0Kw{eywd?7T}Ss8q$UnIWQxkAGx-P{im7%}(~)EApDfRLSxPq%dcM z@w9WnvaK$H>VL`kCvxd(M=6RL$J;P|UM4vcfMW~kKsS41ktQ=dc%BS-Yrt?`)?4VR z2-!}}lCSa{ZK%+mki7b<0Q-IEC!zbS{&fteObR{@PV z9Ue)O#<be=iXEo(#?9VI~;SJ0$(Fpwne26{-spEEx&I|+_eKFRD@sb zx7RVS{84710h_;v;7}RkBJ@5Pv&5K9IOyKeo?mQ>sUSZDS)Q;-qz=vky1J} z4)2&69=ud_<6~|`f%8-O82Ru}**k)X4$hl5dnFpN9wgr)kXrPMP7Y~UM2!O!dGe?? zp2iTeH^x26ysX1kXYO<_sa-*zw0y*=;#dJX$irvKVzp@z2`l@JR>7y{i?*N=d2gW~ zHTrKpHQSSoNDY2{aj8Do>v?KaGLKC$rWXI?_n+Ej(ahX3GI_EUixawR5KSQ2+@ym4 zW7i^o17)z_DiB>Si|P)zFQ<`dL!P3cyYSLBl&9|&iXY2rcA9k3&#nvW*&$YJ3)bal zD_4#1PS|Gfw8lW$^9wxvO>l3e^0DBI#G+Gy%Y_bl=2Z$c$8sUrBPndb=id4yuW=!Z z*;pd*ILqB|qLdAIvDFgSeE+-FlqY3<~E?hi5l=g2L)J|@_#@R+Va}Y2;M$@0FpD!r7vyije;@!S+J?syh zd{|D;dx&*T?nm|Ap4$P?%h*0_sQcv|uD32Xk-HDrur!5>T=`jS*vH=732HZ>o{~aY@SQ6MKs8Qy@6XA!v zo$f~VtfGk@H=1$}@Bo(Ezlk4^=X-*VUzG~#@GqO{PIfYdGI%h5TBTi}{3LW&_Usp} z69@0qD|%5;UDtM^!7XMA{I#V>j8BX<)40K%g;Opswwd?^^U+$RaE*@OV!`^)=fN)I zaGrBJd6BOAP~p(SdP)`q3qjEsLJKI`_;UDkmN%I>!C>IRJEA%?NZsS$T1bZ#gcS#3GBFe|jxiJ(>cnxH}Vi-2XN{Oj&9UDx@uR*Fg$A89(jdnv>=2w^nSXTnh!!535uVe zy8{CcItq9CeFJ+|L05aP5BkYIF(1X{LgC?|*0%lYbhdW5hjjdU;i3Xcv#{$>!)w1G zyBvddMoy}dD6vyoxr1MN%|vpS)u-8Y>8H;yujP~Gc7kB`#z`W*xR~Pk{h_8+Ge2O2 zw|+fojnawZ(@ybR&Cc3Mz>Epks#*fh!iqNDl4p`m%S>%e@)on2y}{${k=Okt=FLtM zT%XD_d1$VFyf_p13X=~|^&fDouaikLnTYv{G@x_ZmLFhMa3zqSR@YkqQtbu#=t zBD%_fKX&MW!oMb_gY_ad_=g;1%i36qGQDvj#!xBDO!D4@l8?id{pyFuJG0C58`W=k z#=N>T-yrQ93|=(n9=#sybUFUSn#2{|ou{xR$+P*yI7CKtc%|uhd=9$F16g629!(5z)KvDJo|j1s{u7s zm(;Ac?-(j65#OJci4<@L7*mahJye*9`5T*ZGV-cCJSEEv^cf89s}HLuX48&&Ug1=p z{^jW8ad=DYs|8jQW1*X|F33cANS1jGnnobY2#x097{9!27(nIyNB(caPdgB{H|S1u z&(b&I$3;+CHtI^#)=T=o^Y_GjtfQ%elA2s4Uur;~2t@otCs~|WZV**Jg6ta{^a?Y^ z_}JbnX@Agekp@T~ypJsv8XWAde9iDz@b>v^N=Su?LlOBA_K9tXmJi91&=(+U&>Wzq z?&W?ihxsw1@KIxE@kL1_=#t-m8^}bUPC*~H5_i1dNbJ0|ATT9rN*+Wz(X$x9i9^gL z@QY4ELerGkxR2dfUNF!jNt{lnwKE1e`&R98`^Mudxq!JDXl{CvG@$lda1k@&GEVUZP-7T#n)KZr&XkU5>{`jp%(@~ zbnTaDwwzwa#_EavQv#FK=Q?>OQMJ^09V@rX%bJ~i&BhC24xVXHd+BU)e%M<)2{;vc zt|-c3ZbYi2cV*8e{9=|(1FzxBDjW)Pt{YfIYJ90|-OsDRttpJ73lBxg&+TMx9pG$f zP~57FqUs?vzo}O###^Z1dmSu%CIJxCj8}aeXbQ0rXref zDQLl&ANwTbM6)z->*r?}g?7U18#+n%OLJ4AImcPRn*XE_t<*k|9PzTE&|cOjy}4PT zih6;?#TBr;ZuScv*KLIaFKjHt^k2c3wUEvXA6rmoJKkBto^XI`d#MwU|CUoNH!%gd z#AFJNo_eKND}FnVE&nOFuB8`;|8{>oke%Zp}|3?bsIylF}*&? zDa`_xc0yc#wn&ii(>ZL-fxQR%Xj|gdGZv>B6{vo{P7j9qDTjfxfFXO!^q3du;Xf#G zr*La)z&G&v-zShK2$c0nEHgCxWlgA)fx|<^pu1ZyY5R5P%qpxGTu=CXgEV7#8Vp6e<`i2jnImJ7vPwoA8u%-*4z~HGp~JeWZvjSKX^tE)!}$urwCX95K{Gi(76Aj! z1TNkh(DZQBW#f-F?2G0aesLQ-?gHcc!*e3F%El|}bU4j=KVT{mr))(iDwL!A#li0r zBcMgI+46mNzh7`}Ia z?tc9)t$fF{%UH0J=?h|{1dKZt#OKh=eWgh@7I2kL-;HDptC@e4_bG;*TWKduM^`Pt z|GU0GiixD~m>)zlIW^ZqDHsBq*-^~tC9(3Vn3V>scKDOznzz=%F~&(onGx={<$w4svElT|hU{#>^Z${#hYRz52TP{v`k6nRIi zxH3=o=!nYe6LHz3$~6%p{*xkDYj^9EUxX#?V(xI3rGK7}7h^?MH0q{0`rv_W)*UGI z)|4gnb7ad4?Am)Q-RjEbn0+B%ah#pv%fT#taV>JB(~MbAg&T>YqE%_y`y?^maw#)m zqXD~+u(ZTc7@Mz}h)a-sOmA>3;7fz3Pcz@PCl{MnTY_E84 zIxe=i8!ke`Rza&tpt?vq3(~u;AsXR<52NnN@$X8L)+VsYek6P-gE_5e(>y!Eijk0* zBG?#F(KTRLS+ZLzgN@DB#I@xGt-)cUOK?J)jzZbID_440Gu3YFhb4H zfPU|y#?YO;Ny2@|9oWESG`iBg7qw{~oa^F0V;8|_=4C;>av@{c*NFMwLIi?Q7p{G9 zv?K=qTgF_>WMtgXj3mC%2t@jH8rt0A)$gwoPyPn1+gGfRT!$u(h52+R7Bn$2=f-81 zlL#3u8M`R7RtaZzSi6+bpbNr(b3a)oU!kvQuQkugBG=gb;D0JoaMMrj4+fV~TMU?_ zxY4lOz6YVm>cwLWp&>%C_JrQ;qpaN{@{tO(a$DG+v~;ZV80bt=nDq;|Tje53d z#ZLqgwT77MjtapW-^5q9?w{DeU9e|^GUE!tB(7dWjF5n{cdjpL{CJL6ziYXxy?ReM zY0NRIoF1#9)2x1NAg;Yy8nu(WYyT0&0wK;t74t#+RgFUBQzTn(9#% z(tWv_=Lyz%^|qGA@&PV@mI#)? zs2JGwZ)Zs3gH15%*amas{T%n(2#r}|nYOoN`hj5d8}aAonDgPVs#N@hOA)Ff5vQpB z+mbQ+2#a1Kw={9MRwB>STD+{PdQkPfTKmbB;j(FlzYu8w_uJ!8r(V&1{R3+c;a^8Z zfx1w<0MZP{<@vt)N87Z-MGW?o9imBVYr@6{jZ#vOY6mht|1#zc(o5an@6#sBU zk&;dJh09fAk$S?H3gsvruktH{_P1O6rqsnKTwUF=zhb#xQA7&I?W>c1DjZ3UBaw2l z!>C4|#rxbGO})?F1}+~6oDvxpldA=cn>||8b1Z~})NbPo(O-Z_NpzaB@i+)|D)5j5 z!eov3Tg}U08I4M%cC~m*TV}S_lA>#OgM*GZWiK=S6Q!Z&nWRHtzc99fyF+6nZ~)P^ zZ?44J|2Fe(LPFd*hNl{K_=BV@e}m}|OZ?4Qw`joEFjH^!9ba)fol&9S$9J>DH>P<3 z+X*S}Zm>#_B|YsgKQ!Yd2l*{aJEpd5TmQ_9My~v-A)VaN0F$-l&P9hv97_q+)h3u9 z8h-i72#ov?MSTZ|Q>6aqAqbV@q+ONEV!K)Is3BAuMHM{>tG@ssS~&1sC#=R|Ly{kC zE5pikox6&g>G<+RWqVpDD+#ZXLq<`pFF9VXG8n~tFL6zIre8FUiUaElTgdQGnh}C& zzQhnZ65_87q(n@vib~l~-SW7AicLQBS#vSlzJSWj2(RNNH)qR!c2f6%MD z_e|Da41Ko(=m*f+Mja-UGZohD)b*|>t=ON1-sQQ_evs$Pm(UCm(glOV)rY`NS{9eI{LuN305~gZ z{yF;aH8p<@U)Vv}wQ8a-^2(^YyF26(esyF7yx)q&i0u#wm2dRWT|EN|64@XkTHZi| zWmDsiETs5_e{+g>M1p%#=d>{|IZt1?7bKpR!)-w_V)G3v^bT+sV-DsiTi}$| zEG|Tt$_fsnUQu-LbM1IVM>Q?9uN8{u1hIxki}n$(0Y~g?*9fv%YG`jcpSsUw|OCbGRPt)FH%^2$cJk!B|DMgwT zpO@zjoP4RQ@N|%mP>h93L7tn6mJC0$_Y#5Vh{`%RAK${8lQ1DfA;p{qR32?VIITmxcTW zLL!o-X0rOhbS$pvm*ttT?~?lWX@9Gd&QOcBGSU5}_JgP?3dqakl0IeP52BoKmE|`O zIWyav#kE=ll^ zaaWZzB<8SRCi>Q0pn5y~F2`srLw>>2fDaG5`C1*AjX)B81BYR1Xf6^V=m=TlQOW5A_h&5WTZ$gpHxLBi})h+}e&%h9p;KZsD_c>f}%hoFS76 z$!AM5nnBe>!g{&Z91u;D5rW%eRZS1(x7dkP;%m*Ex5+=HPt_N{;0FSF7g!Q);Mt;Dk$H2pN*Fe1u}qTF&tyk zSRr^Cqth4zu7}*9mp6Ugr!hdrwX6TN+3VSMpFwvLM(V`5AO1-$!m#s9+ztem|2I5E zP-U}$bks(uQ;99{Flueek<+A(Kg}NSGJ1$HbjFQV4wo)fElT9=A9Xe}=f&TYihbJ{ z8WXFaSeBmYkZ8vK;E*wNy6Z?{zd(ImQipNkBju0gO_oC`zJpTZ;7qm5wfbP_Mglu!E_$}u=QPw2REY8mR z6W?B_4}oU~mGSH-cMMo2*Ua(p1x}=t+$IOox95~&kzj*@1A2KT)>5%CY@E77YTdI z;0<`KfF$5s2_xtk0!w#bJU9QlheiQb4Cvhuhc~Glzq~MDe=MC_;J zo5WWqjTY+pgiV#Om|DpCS+n zXp_Sz2?C-0(M@!#QI=0r4|W^A1x1o)l!(6lK);?U#h+?T$m#tk{QDyJElrLhm0L*d zrAN)i8EKzGa%C@Yqpo1=8EcVgBQ!|}f;CoBH4XLDxU1=HeKcrNe1ubueur`3q9L*f z5b|msO*-(f430oezrncBP-CFW5#Isw8q;m_iPsg&rRz43*qbBwtSo4jkw8BNIy{y| zbZBE{(BvJgl8H3>=GS~FnzZQSg!>N*qqntdC7&I3*7v&ZzD*1y;QZd;uBT0Ozc0F} z6Ux@V7TnYDcmE3^Pw=n&NGlg1c=eNU5Y7QVsl*K$6ZX8%u74ez_@w>G@n4he&Fd)J z2Rd(e$gQT0n#J>pq3S=Aoo{iA6m-2rw!Y^&Trp`hUyz#K5;ZmSe>IfCsd0_}lW9ms zUFcC|DngfM1}^^G?f+`|36RUQ`~F|d-J__u?;f`96&Ur1=|r znF`SJpL%~&_rFfDbB7A!U{uPq-l*OkCDom6-_>t!+1npfj(I?sVRZ#RMeiC9Ja~8XBlbdq zZ;p$5W1)NM9NC%IT%-U7(G?j2-X`uBDNdBjOr>{Xq!Z-S_(DQrLmq%1J7j~mAprcg z90#Vl ziBG>jnK`@k3yP_ z(ul@~stCe6#%#9o^$$dc1CO9wp*_)Gxk4Me4X9T+OpU&%il>>_cN&Q@P6HFi3a4$6 z$ERagr)Yuyc)Z`fz=1CRAWsBp`w7||O9)^PX*f;1=tSsOwF+qo%Jh4~kEiDGz6CNp z2o!;2Jbi`MW9QVRKQXYl7%n^d5e}NcaV)T;zbA9>Kiwe=NY+r{YT^Bz-Xw ze^J4&p!ogzzuLltdTN3^6&E-MTAuLS_8^GP`~Z{GlyuO@%8qWxt!fC)!_vQGT4T^@k!ft$<2*Yru5)nWxCWVjb=i*;e8 z|0(|>g;Jy)*~sb}Lv?v_-uJkgF=j`r@pVn)&>6*E#dJ#h@WDoMI~ecPn}(_-gZXL? zY9Ht(kM=}N-xCX@a{q*Fv^ETZnm@7_z z&-w#A>@4b}N1rWU#AYtnF-)!k`<`>nDIvU~AM0rUUQGG@-lj`UAmxCRx_LD}T$?9g zHow^z=4riF;=bHSx^%03UClI~B^>?pLH(U_r{2@a@JN0jhX97L6g%PJ_7)0rF^gN6 zKeU(Vm33Nw*QC54uRLNYaH3rGR-_vzXISn{A-`(Q4dmS$bc&>KU9b^;e@Th49DvQNcI(i1$b1Qc7|Kd>*S^$1z5FcmobY-agpL1aKuS4KF!(AXgIRLqDEC8bu(JPLOyO>D?=(x4eJFK}ucFeU2& z#Z_?spdWt~yGXPVq*YQV0tQ?d~*J@m*G z=a9y5l+?4(qDiT;!jBKNd*~+GlB%k>6rh&jW!>EMvB6lVz<5cy>pM0C8(IUYXTv%D2TxG~0;}!=wLnzBCC1%~`t{$M zjfoE(=nB*iK?Vj6$RPbe#_{B_P%+a-dW|?%>3E7ec;fD`QY>`ohag6$pb39UxYS^8 zgmTuO=+NPf86%7uYL@5;aQ!SyMNoRxdnR&93(NJ!n)gH{LKEC(C&-X_jh7*;!qLpm z%JVmaQDXTn?bZ`~KlCJ5X5(6X%#ZrJTFGCVsBWS5ooDA*WGZ1UK!<2qFq%r^08eY2~Fx?&_^V~|LZXQXOQid8YJrccb0ds4seFEz5BMyclF zPPrE`T5%1(oJxgsK5hz9<&biEK}nM_Ii#od_0Wpq4?ONSR_L`kCSi6$XJOUA3|>-C zX0Mu_RJMYz?zG;bc7A9vm z-xbJo4}d&CpopNVcc3YCUlq67aMuVOg>gy$&7!-UATN+a^y^dUV=R0y$#urrqeTL6 zg698t`U=0M{{Q>okbwdNkx;r@x?^;Sgmg$FEeImbKoF2l34xJj~ zd;cDf&+q;RclWh>&-0w;IVUBBs%?)xb;r|O{$g3G##&x}`ib@LCdnWHfW-8o`kpG7 z&5n@xF7{fulrKW~3N%nAq8G&_s(kQIKx7B|v6 zpw80`>H9*^C?@!Pu;=fYd-3O=GfGyDihs&)(kb>5X%fFTlZxCQ6F1As+1J=a$7?~K z_(TK_5aA)5C~ZZbS(@8DE$(H0pAc5=I^zF4WzkOuY`<+`Cin~c(yI1}EfI%+yAvcj znj>J5T>#t88|MoaQr;zc5EeM|?gR3LT^Y zP-zxe-2a4uDp>T+>dgY!*56aq8r?S?ftMIwh=-g?b_w|h#;BI!{w{YOOV<~xSEW|` zt7yX7K zD2ILPaR<1-n zah%pBuel&QhS9VTl4Nka(>c_j;qTD-x-D@^nN;3mVB?Tf=T~;bcTy@!c9G3y0_~q7 zPgD5*>7sGTzf=-r)HUc;N0sdEkUsFF&Knr;P?w@1cZ0B1{~I){4Zh#fe?PuDih$qk zqTKpTe;D10yiau9ekUj@6^;aeLflRuDiH8xP^PRtDDqb=AU!YENDldvR58Gkv-I(t z;oEG&zYDw1CjJ$LQU<1ndde$3n_>4(s7J&rXY;e|QYPioIgJcVs_| zJUXPpy`ZL8(>+t5G4DykcMO#Z;`jC0hGtn9k;VPef1wpcL>t3w;eV)1)r}mh{1v4p z^tU1>XM_z2+%$^+Fw_Y%CxnvuUjga}}$`$FVw z^XQabZ5#fmHTHP=4`bW-ID4K!klQj}dZ**DETPX+#F6;>F~AC>%B~?Yx5-LKGsZea zKmNlniTTGuc)P-2Ee<`(Q0XN8=5HiEuSn&D($YX~x?G!=y8w)>Ag;r#xgFIr z9&k6$2SLp?1YX_Vt`>=$t<%Kbz?Qe@;Ba_zGoM$iaQB?m4TBN^@taN;c_zGq-?zX| zwV6*Q$i)mQ-|=X?#HnNBlUL8UPx^dKUXo@-d}HGL_clhyE2C#uGb!KB`*?gRZ(>RYeMw3T7j zp)f>q$DJ28SHwn_Dnx?7wHhMohRx%+cJuaC!rel@SXiW6rakFv!i%Y2&i14FMrx-# z;v7xXyI4$5whi}cD1gi0VoqI#&Yj-b+1aQ4hv-rs=kSd_Ke|#!t zsIqu5I+f9o*WNV~vQpwBLq;%IvJuNPae`G`W|(+0&RjN|bd!ExCl$J2bXLCDnXO-; zY1;NCg3WGjeN}&*p2mF3JSdu>I^;cYm+Sdd$$qozqmWxbe7Tw9siSr)v{-t{mN|RW zDb4>JoDNP)^k?2B|GH=GpCy3-`~;GJH5?F#O3TPCj?%I zkrvRWNk6kuF6fW`^26a&p4$~L&fMQC@iaQzy1es}MYh^i#IBj9J*7`C z%`2E2i->1<&-MM2MR;n@^7{)ks-qeD3SHXrGWQHYRX3DcK&>z;zd%xQk10D{?fm1< z$sgVv4X|5~e?d~BUC|ci!S@HX%Pd1P%^hJqPKAiFoo%;|wS&l*2TV!?XYG#oNO7T-bp?!j&96F;hG={P}`$A@{LzLy2` z;9|j2Z1y}YT`u!Lo^gz>W!COihHmvg#DK{AF0wb)r)domQ6k%%3sDSvF7v%>Mb~qrYSKef^eHUNor9% zT?U?a3atYN)FOM*3vP?uhkpKg$@J1sfO?nJOb~pI49Ngd6=$~;!KfqE?@8z911zZa zGeS0z8IPD&Wd|K=OElp10~WQdlyz8p-} zDg;AtO$x;K%S0hbhSelp;^TTldM>zpaDQwbY_CyONZM!pyQt6%+}a@`9chK_8UY?{_<_sKfjYZM*X^VJ> zxDx~PP}ysgJ-^lvaD#q5u8xgO*m{*q#vd7ub*03jYW^jo)Cx0#d0bp)c zFl>$E=6Uhg03#$^@2w(F=GP|-&={q;u_IOa!Rk7D8w}(#_RtMQL*z)pq(8uG{~6+rHy{_y(@Vcy{ErK`>ovcJq9CX!$X!yU zqvzL3(PZ)@{WxL!sCveF?zOXONSz~_c&;p5=0!TgVznbXuV+|7zkFmVKofvjA|b<~&? z!b<=ftL!~hB~jjsNg)1Z5XWfLRw*~JoH%Ix4u3)Aw z9UqiW=7stt;G|S8cw6;a^OEB)v)z2}@oW{9+n*)07kU%&fLZvH-5WAvzi))rxXNx= z2TOLKIuK__IC|Us;p0bx{)}y_gWvstE`(n1FUX%>YNgoh{>fK>{z%k5%tk4JW zvh0cIEeO%_+;Lis@C>U8RLe^c<@y{cr`u}yoqslQs5B_h9ksi+#cht>h2C86uHKA} zdug5#iujBI_!Bl}H6ssc_Si2=&xv*%XjXPCmO9#K>6lljYVz_}Uv%7aLeF+m&DIRJ z;+7p=mm)qQT9?KHcXcXGW=lm!u+R9?jy(6O&CDe66R$@F#KpPRtWDvXyL_u3cOOiT zP>bBg;7Wg8aJ~8bFgGpvEhCJAc+@}{Y9C##4nlb-0U1MmV(n1ZbRMNh6a0jR#q9Z?CWJEL+>6N6!LpS|AVi zcF@0-z05sF>vxBgN6YIN;HV6Ti-aSVFUxj<^8}SQ+I)iM`gJqAhQ9g9*D6<(=RQUGCIx=Y;v4@`T*Mzz~9G$Et-E5ifka;K9?~fj_R%hh} zY`68~(rH*Ke#G94A`7UZ8u|xH_=f!1v7(1UjQPcBC?>}(8)f$O%l(tV{=tMpw~b{r zKQ|tV?DgBmY0Eu1>qGtJo3MnARgE$-TA}T8<&P`p-c6nW5c58(4yx~`Euo}pVLs5@ zBpcgyN_zK*)R1|k<%0R)6RF$q$t+?x;FI*oWl;U<2#`zenJBIKxXS>7i%RL{+} zL_zDdc_82Vj?^d@EAsVow#xlL4|g$)O>s8+#!K7@$0FC$EqWYXgx*F^WZs!SjH8n_ zZ>~6(FErmB%*Rzczygx@lcV4tYt7IwR1$h?e<=7|q#u7C`g}h##zStgWSu>zgF^lB zgI-n?iibp3!r7z+;GVz|=UF@?~lSe`O*uAftT-@6w-f!Vol!+;epxj32rSkb`(YOcx zh*fx)9HqI~v&*!xfUZjGTlIkdch72z{N3M~=48{6Sh04DhkKC_OH87PCC7xoZ;@75 z-vUg^>+N6S>W*5QT$!SGAEF#Wk(6iPTff{>TAB7b22RCDJ++j|V{YT)GavldEJU(q zx_hV|yY_`meS4cyQ}OaE$)J3#&W90=Lil_WY2jcJv63sNIZ=hpkP0|FT18M+!> zHhy2VHo2v+FT)`|n~#!Ic6FQ(*JQ1xix72$&Yu5m#{a* zWQI)0B;zs{8|!Pzv$zPDkd(U+c>CXS>*$l%PaVtrPWuBJg=0xt86jw!UC8s z_!;N3bOLgaSQ&-+7R-S6O199b-}ic-Z{n9d)ZagF>jCphs@PMsBv;W;2Z)%!+9dsy zz7a$$2)8g2mx5-V3VE;JtGy$9OxW!r(}~J4rLx+#vw~)cSV7?wvq^5x>D#N`!N*^6 zPYf1`KT5*uv}9%H*;Q2K@0SWvjrkFAeJ(u?5S@EdEh%{I1lOhd;PnV!7Qc&A5uzb% z@q3;2^dlxp%VKc&<7>Ki$<5pMgZc8L$Ib6d|K>X}Sv-CA!}zko7}_~0zkF7OreK7gFF;l9aBl4~0|{?oXLchy z^09C7A|9TJ`k7Emi_WNy1ow0oa4Q8?MRQK7|C=Gh#d@7rY72No+4^-CO9NL~K)*H( zL>K-GgSAAzptsVzM7cPTUc-s8vX;o-?Nixwn5>}>qzEr2n{i;PP&Cm$UOe?3x)ZE- zT-d`+D{VMIR18D?Cu?N1Pd9-MNt8Gv%xu2$*H+xOaN#6wJEzBc!cY|(jXE9|hUUcG z=^e;1pTHI}+yWXT*@=sopL4i4lzS$A634=Fp?8nudK9dy>`D^?a7onC+ab( z;c2pzon7z_#2l;i#X+!9;7YdhMKw`26mi-Di8n5!i1+rF^$RQHcaQW$W85*4Pn7el z$_Z{$+kNrjiCQzTDfvT`1NfE|9E2I4`bA@qbu~3#k?chu@91Q-hdL<`{gKT!0E#Vr z-g814Z?b%0jGmPzqa=V5*u(0c`}K&$^T9s@u1#}Je*zMW$oJP)=(yVRz1@S}kE3_j z@0k7ny98q^k&7_rxqI>+K2s zNf6@C7H}zG{s}F5j`*G5Ry+*6=iCbsUi-dNmy~H~Dki3fnU>Zeo^ZDZB|^q_4G%`; zURBQtdF`Z-olnp4E;R#DugxF+rt+BkANV$zo*j`~#UZ-?Lmq+1AKl2+q<+`-3k<5+ zd!smf3Ec^%8$Zy-?>q!0&?>o}2kob413vUv$*6|K~@g3=Im55%MP-=t-1mu4%8DM(zTrShV* z2(9RgnsUE!XU+@B2e{S6JD^!}<*puoBb0V>V-s}E-d6Y9QPRzpe2IDQIOEC&Oe8l- z@jnbudp13Ka)kZ61@^L>Qe#1t%bMtSI8spWb3nA^%_V;|JxW&#+KZH1%p0!~OUJwA zRiG=keOsrC%JPk&bT>pLaPP_JY^q9-Hc-!&i*_@75ZO-7`>ayytbM%r43B_zM_>rR zAQWA6^{BYv4ON|^v-U$;%!ER68oV++GjAq7g6R*VQC?KNZKF+jv1#JKPh#n58eB$m zhN9ZA7wo`iaY-&EnKAdtD#wIw*ZRJ*7tF}`fW0dPtk`XJQ^+eFj6+uBlD*C%?; zpyFH5y~0vpWS%Sq;(MW>8>fAuQ7Uz$YwJbM-m+^GcqwPV+r-BzqAhGNuHQS=8!lra zG+}XF^VISCmw2Dhz&lg#IWS*?83jj)OdL`+I`>U<&ErRlxH6P2>7?bNHpS%dVrN1r}o!rH` z0kZ_lX{3U@fAEa}4Rgy#+?r<)IX=Y|%=Bdi!FhSFEq%HBD-4PXW7CrsSmGe|CSST> z(`7=$1z(W16_*ZU*j!7>&N}Pgm4!IT*OY4lYXbRQ1&{n36B;{q85YN)?~U&L1AObR zx~y0}+aV_yu8HrZ<{7^c6bwxf>XfXMNX?OaxzNkD8b;~Umg6m#*rlx&T7)bfo}K%z z8mqkNT9K_LaOus_E)V-KJ7VZ`v@s_{vNqo>^$hc3^+C^Aq1`K$`v?&&xp9)wug9el z{Yvyd0Giu02fLrhj(r=%&W*(|%Wyzv0^K8nB0u*~l?@H9ulACyf#PiM68{Ev61ua| zXzXh~=hRuTo*ah31A_+i!w2cVXf$eD5TV(LYo&=liAMOlzndQ^t9VM!aJMPPb!0}6tv)JyfX=* zYK1;Vsn?Vk6S%^GBM3igs*jM)yyuTaMY{?mJ8yv&lj=Kl zxQL$c{6&&qpqMGyM0oVZb%X65#*??#|Z0|5ZYe4{X#E5FdDiMP2}DcbYm8a!k5 znvgOTMrH|_(0I8d3!@~ZjbS|79cbl%k2iWIJ^J0)+`TiIlnSQR$gUM+g65!pw^`}CK&Q%$KRdXn3T(dV4v=|7e@_+!o69~?VXK`)I z^MQ+@#jT=m-O?pLK>%32q7{QGQS@0~kj!R3ZN!4DEEV%Fw+EMAC4**AZ&7a(BPw=^ zyvj&@6+GU~$8j$S*C9Fh4=7)rl+13l*X=J0?kC+!7sJLR(Gw_P@;5&U+T*5gko8$; z&EN6-M>U;-YFE2?FQXinh|xUnjh=Q=jA00dCxH1%zvIeV8BgfNjf??Y^UW&ldq#_= z?s1DID@2HfeF9R%8k6Q?oi6uZY{$}WQ$)V7=wO_Bv zX5Ai-eb22iXepn)cS3M|B^^XV{3#Y0^I5V7)5Ep&f;<4-!z-XV_RHb7%R1Hvu6HYB zzv@KSddLriB$3e*I#YPI=XQTk(jmEQLHwSi7;*^Hze%vpbpTyl!jgk*)5w`5MuCy!#^cx{PqhYgzA(MD%mfuv$s(}WYuhv) z25y0DoX-~Z@rpC8X)v9^-YJ|9&pxttiAMQ{w3LKHk{TNElWe!O)WegPK7ZqGmi8ac zIjOw*d4HWSRh4YK^_Cyt%6X{y6#kmVg4+?|iJZAM5GLzt9ZvjZ{?Fx}5~D>OD7&>g z*qQ2T+_iojO>|(Id#%R|Yi=(imwKV6YZH7-Ehi|}r1thvZ2X~kb$|0#&u#z|$yA&XVI&ZP4NiLDWydDbQb;1lewqL2RN zeaJ9q<~TL(b1`E%s&RdxV*p=itGvRZ8QhWFhZ3DQKV*l2A9&XjtjeK=xf+KVp%aI7 z4=V2bI_$3*WzPqS{<%2QX-m3=&um~O9kf0w58WCv4a-J2bK>qNdmeCL zBZr;n;{a0dSk(0o$sCmI#h3HhW02N*L4t4Sqv~+3ZYD+ix0#is4+Yj0=b9Y#k`f$d z0(X@Lq?Yy_wL4w+1>qZSzT4>$nV!2U zId=E$KLtLHTl^l^bMKl=GN(CqnD&`3in$WI);V_dAh+R9HH@!P%htDSecK$HNQ5cP zoc-(=sr3x}aZT)NyZ5tdwX1XEETWPHBL|w}?_=Yl*WTuq@57O+)}OzpXv`pqt06|U zCgPUR3L@tjBwqOG*hUhjZ;G(euu)K=J9?&R_)HZpp=O^bl>9U=PFu;xA;vGm(Y<5ig^`mZArkGa=a z!!E&dHqgs*{5!z0dH7wa7F^`-XA9^F=$O`aN7o34cMw>!Vcya)4qTBaT@P1kI+3I^ zn&I}cqkLr)MNugy=#-avsjko~ne*lZ;IDfNl;q4f193%W+X#~TeEDuOUvrw*`|k#o zfyIRi4a=bvEs&W`t&=e&ze3fEufXY_5$L-7N-3{sVNf33Q!#J2Cp{=;BG9{wjQ>{@ z;QFFcRe#&;xchLgUh}#b1=~=$ZxhtD+P}{VB}E(^=9sf=YQ!?xWRF`> zf4eg5g^W~&3UB9_iE?Jom`3;u^9~^!GW|q{@e1wwh%|MH&Z5q>K@BsTGQrJX!@#ng zzF5iQ#3GI7ZuJgpgTwYY)TzgmQadCFY=nDz;1?rw{^IRSwnxvO%b&Ve*$yOmjfx*{ zroOtKU-Vca@6N!Wk1ma~MKReC zmjE{$qRZU7z@R~~U$wadUu@(8l9X6swJ4DTLC?0K$45;HI?PSdCT|fp@Ire;Jp3uoV75}K7qLm; zG^TTBGvi+Me(h(R3}j+jCw2k$@lB%TH$_$9XSaGequ?9Yu*vq%b1ocqn zQDp}}I`8v;Q_3(cRZq`0X}2(rxVy=syVT zE2)ryP8KiPTfeHvy-vrHT_3=OB1Wp3{M3yWuxsN2J5gd&=Lo)G)*o zilXj4jg%{I?|t*@M0LG<$<#XwD)OEP_~s5VA}V}@GD#IDUPb~-IPWgNK`i5|qzqm# z4$DR2cdVIx0>f1@0_^a98=K4(a8(IeahD>WmhB&ffMNs|CYsImQHnf_a`72P3m62o z(`t>$601cj{XBo2-4C)vJIk$B(-PSXc$$>FcceW;I?R4*R0w$@Tz?y03QteyX zk8?1X5TA6b#%+XqwbI^imvn84FV7->WC>S466Lf>k*I=*mx4(jInN7S3KIFYt8CkT2qxOOYYMc3(nIg{0 z1f@;1&`YZPr7e1v&k85!%3*~wU>IQG1E4o&Ye;V#<`1(0oFaW#Eih{XL^PK{3Z{4^ zr1wH#nGV_{NA1=pmPk2LIaR)^yp zq6=UJ7Okk#nZK_$>svXKO)x)bSpE0UDfMiiGXt(L@hG=c$t(Gia@4iOg>(V<=;>zR zsj1`CJ6a>orD8!5q@_u%WbQ#ySie9Kg5r95?8>hXe628)1alP~T@FY!y9{LA{H*v_ zO^CaU%seH316ksD|1|L>!3u7?+GvQ!~_1V(ryQK z0>;Hh(-MT$l>QQE6CU`SfiNk6^#)9CTB)T1Z;ykTi$1|1a_G}*a4ttQ`BXG^H?FqjE&4e(00Pz{^g)4(` z;n}QN&yv?)$)Mfed=}nB`*2{iZFf^$%D}f#NxF2nE2nt`0_)Y2t*$($a}?jpU!Db^DoC-jaUqHLP1dg+eHz(F(!@Db{`FVl-`qTrPF zr)OaKB~}GO8Kc~0q!x4A0jLbR5;7WHObPgSZln3!TGh{wD|CPe2&UIMsZ*QAEdzFq zkHA{ksJ7&c7yj$Tn#$_4SK=gICsO4%_f5;!0zHych(%Y5BojjGIl(Ol7bjo4=ew{j zG}_PCh6r0h@joss_NR?)p8v=^-uT3jxLGo5EjcH{cBf9rOmt#dM(glPdouU^-4ErW zITEqUEGsj&4~2Xr`s5nV90I^W-!SIibMMD-*3alj#7GwLI_)7cD*0@Y2Z1s_z@F1` z`L811_2yYppOGq# zl=?3s)NH5PdETaw%G^idzs%ssrL!sc6FVn|_@-Y3%~0ItGGxF0HJT*-IkP`~{!9$A zFR?R};1T%|wxpk^-Sy^m#!6*|U3%+~N&#L4Y1^&}Wi@mfrxm7RjocS%t^P`e`2G0X zvPG*V$E-2)FQGR=RiCbKwqNjeqgIW#$q)^5&v)>C4=MRt9K-T{HIjd|1wif|w_)-s zXsP%zn#^zO($|(&%S8%aF#>&YPv@0I$ifR$EVMt)2LhB=EorKRTx9Hgn|76cY-_&A ziRvPy+DLMs|AhI1Z4GMBGKEWn+2pgo@9maNKc1e>&&+9gxb7*MQ9wv3S^KxmHju7k zHaxDCO*1)TR#e^T?iOG}u5Ri@G2R`s#eMfQ?nJM%Sp;fy<6L!OnljEMlIczIylt|) z+COs-a)bwyFE#qxtwNow9LO_xcClD*f!I$M?r(emqbFV_I5}$&uPVwD40$4m$&un$ z6a%s4BLUSTD-p%`w4awl;38s7Nnv4*n?re0eF!YK^q%KWnOqLRS3zNd<`wTD088$8 z+!yrV6JehtT)8$V#y(Krk;ngHfQ*=a=*c5KR=OFnAw1q8um$H>04*f6S5)Qz~8xfYa#7P~BWVH$_6%d72H6Tsgs>Eo-d{5>`pPm=F4V9RyY zEiscMe;+zkHFvKbKD}t$&3(JRy(icq@W)@&6YX7!oyUH=-Y@g2gWc0Bk@Tk{6LtnN z=y_{L|1t*2O(xr)rh#$>feKvoz#L@Ib`$AieScmA)_DYhXvw9+W@BX~K$u?}t4C61 z!JaejHxeKg(q4m?WEk@8Qw`O%`aKrLPxt74=(rn>)9C8bA<~Hqt%wr_+haa84sAVLu~ZGF*p_)bt|032Mzu)+N`@ z3;F0C?MYihf4|&NSf!0|qOgD}BI%AbX@W3*5xh$#OGUZIc{eIdCh?#s(pci#aKC{d zWT}77+b?HW3%ZyU+dX0K|7_f9}eZp=@uC4We{FSO<3vGg!c9boRXc}76KPPRhJF=%;>2E-*uEyVG zmSL}5eXlka6g4PNA*DCNX%zN;Jqa;|qT%v{ZeKRb-kqUSN)f|~#y4O557?uMqY0HJ z093Le4}mOkZm7T@rLmVuEs`<{3dA(6pp6HcdYiBO&qzIBpzTp4;6>gQiqDtzhphm*hx^i{9yHlR`!^7#cVH=UXX61h!9Ule>qHU zB7Zv~WlFn&t?Slk!=w4Y+OjhD4P!|Bpi9kY>>-L*9k1H-5^tBUYw4sM@w-SZb_Mq9 z^o-L)#ZUl{zcxZmV|mQ8S)#y6RzdN1=kpid7i`ZO88Zk4vR(-MWqX#{KugpoHac%( z9QQc{8PulW{7#Tg;1%@_*5`ijnkzyjzBd{wmm={g|+M0?99 z;ktZOIthN<3F(VyY2%$GTKiu4Sb9>~B##f&DVh?y!m#gy-o{ls#;Xvo{OCOb>+J8E zOq)J)NTUyPufiB|F=kW&H#{6{o`uqwBNMz+EZQ0&-F&PZFZNoYpz86M* zfB^^+N3%g%u*r|}djb^KS0MlPlOhj<)cj%rU-?()c$@V}6ex z&Bw5Rt=9Y(V{O5EZwNk*Opm`9_XynR2Yr-=sg~D`98_43ofPco9eD+~hsR_eq@5S9 z`Q%s?74jx8R5;wki7lPo8g}z(4%;bwsgmkNwJ0qy*zr9$ZC3fJ{^@wZ2cFPB5Qw8) zdbx%#G#qMAhM6Z+!NH+|0JGY8#yu~tbO$vUMQ~7YZM(KSnjRlt?`TFW1+p!Ur(EH<* zE!2r&LE`AaCX;a3+K!fb4W<%Jt+Edq1RI;x1om!<`<=_fGO6Dz8|4`l>pei9d!k7eU@N18%^iLPEI?ij|Ev{l4{Sn%7@m3P&W6v` z@!F)yGrSt*2&}MC!PK?aP=_$*@cu;vR`3YBEakML`R=A9T~gXk7`1|^z$fkBpUUyK z`1MU*mY>b_6vg2YbGz#@2w#R|XGkHDJqh@B(348cp~&_@puTNcPEC_y6*8}?331HA z$0fpa?M)LF03i`#nnlb9>SC0`ZZ%w!a#zPM&=)1xdTUY0EmQt6k1_;kN)%Yk*Ds%+ zki=7(ZhMk03fw>f=qyZL03+>25zu`Eme@9y;FGE>(13Wl&8Nw)B7dGPjqhIu z&Cn5kvEu`82!}A^r0AtWf`Q-5UMHjtVZ~NC$7I~NGxSLhq)sxI1ynxT3qW9>7`tiY z)Z7RSQIr|9*a1dv!Af=RhOnapdIRqd0oe^F*7@tT_V?E81WfElPW+(qF7HAm&Sfj; z6i7UCitsF77P(~%#eP??S#oDP^0@&6366iLZ!Ex;=H#fWPktdtHXOf^$>k~Z0Eao8 zXOSd60@({YgT7M(6N4Yoyh8ws5u+b+bTrhP?hZ+3*{-Y2Qi<8re@lk}xk*TD#0Ki9G)mFAcxJf_il4z4T^4qmWQ37aGt~`i(5c2}yh= zVw_>?-iMGThwM#TLm4+et#+(eUp05w-If;`=<8gglA0kA*n-)tzD)fnH-Vw7%&P$s z!XwnFc4^$3$_h=aUSC0?IsO(WQ24I*;J*8XnwamJ=$~WUgih))+=jWjKNep^7elqy zF^v${pOV8y=w(^A^8=K~SfHcn;^KSQLIMMdW~$B=7Q7cQqwnIO5H zD|^Qyip>66GDzj*_}E?rtO3zJjqmT$tl$Tcg>cJW)-5*L9-fx8yrAb{!xs9dYHyCRxfY;;}pP zx~BUT%iW%jy8VdQCq(_GE$@4Qc3$2_YYw_IuoE(A(a-&*YIdWmLM*OTB+@HJP+a1j z*&Tx6f^`=Q*GJ~%E>`ZTX+gX*VaJ2d2?zjQ1Q(xTjbox*=T&X3E~Wh-K{paUKiEQY zGXX9%79t`D<>ZU1|8W6W93qWmQ%N=XZNW2s==#GaBgSqfcDbI%HWkgXR~+f}teCt!mgXqWoud?tL<$6ypiv$ZOkj))?Y+H@VBK{m@z-W^8l=5O%zeG2eQ z?itOPJ&nUh79ex?b(+Q}ON2|g*q>+an`j-8xrCWBmJy`$e7|5iOz&Vf?mW3TOO>8w zh@y9%&W0NoGYez%qCb|v#x>DBK?zcl0>jyQur|crb;Z|!=~5)72%1WrOBku=$Gaa zdzr23Pi5E+BGcalN;jf%s3+?O-?7Gw=qEK4-e<{KT5*VwK}|W#c~i}r*seWo za^%fEz`EOlEdx6vG;xP49hAvNWfxVjd~L*6S?Qpx&$4gv7+D=BZ#F4zyAQxi#4bf* zwhm178P&SLHO-UAPq~ud<-nW#57!wawNZ6rb=89iRXx+gw-V!Bju_3;sACb@YmzwvK7?y*_q8$n|CET z4P#1?b~-IYTj_8x?VUL0bX8`Mcx7OJ*K^Vs8qH?-tNMnX|L=z#B{7FKg1*qr~HL`ftxnWBjhbauo_sV{|xU?svmX z_=Ff=m6xo&nd56sV3#VfQuTJWW1d^OOois4Bu65MMskdh;DPz#U4$uY9Z+O;#m;6s+9FB+A*WsYbk4ph%nbo-b z^R|z3AK64`5e?^F7JkDRrBsH9`c5ch#I-sQ3|IdC40d%;1??N)@YL!?9a@Rqzh|a4 zg|qSy3(@PotW}Ic4l?X|LQ}4)PGLVxhg!+YxL*Y2fwMH8TSiMYxhBZmgr?XBHkGZP zN?J(1y^qJdRM!)m6#2o2lJz}V%_QBDL7Zs>qlgH~^>fKU%%n{4MVJ}Bk!@-IG0dD4eEXqrL#RIoctD}}(V%?F*cCOY5F ze7QI7FlaUL`(!X>RGks(E09x;NJ`}`jl-;it8aaM#4hgWzofiVCZ^Si!Z4bC+L#hM ztYS6n*1N41S~tgxKRdBR<5Wk2AB$X1m_NH?{QoWFu6s)aMtIIK4x+9V;0Kj=Iq8pP z#7f5(#`^ZIXj7~kKLcAKAB;RSl>QBxg4;|V-XC(H{0?# zz~Vnj42ctt$VfqA8JnzvVc;`&6!8g2{R$9W@;+rV9;EU#R!R5AZ~#rt(Gx{g4%&nM zA&W}+NJIqoaC%}QaEWrG#C8Br#TS?Vy0F;&Tv`;o5m?q~4B5r@u{nwSS96Gycq>5D ztVzT%Ik(qIe(z99J14R@`VDYMp#vpyNfTj}!*PKf*u2v4Ai(~Xz~r$`TiIpg4HF6u zRm%{Vd{yXDIv1DA0?%+I!zvNPE)BLut7kJCTamtrT!T>hVt}Oq+-^MQ1Otkru=_mG zF2`rX6<0G-LAcC9Z@)GRn17Kq6uA!lLwz-Dd%y&y(5&aHUWw1150rtVD1CVkk=dml zv`g}zcRk+l;t)Ze37ip(*ioz!Rh$Nw{R%Q{mJdx)<93=&ELORHlDIMDF{ThZW%)k%+K z7uoWE0fZ}i)cpWxRPW`JnDCef=+d>sk=(3R#S_jg5AX=RZ*M@?YeZZ`Sec@JsK!d) z(Hx@;#(Ey$3<=_S>=T53Pz%=SkujyNPwlK$&RIg&-%)>`_9tVGXh7(1ax^~15~G?v zHYLBKzTaSf1k}}HQr9S;t@Ufa*GB0p`D8R`@O~yMKgxWAchA87KAA?!(ozPHgFX#+0`i8+scUy1x2c{9JT3V| zkGk6fOh&S^sa?1|cby(y+mKi8kxv*i5_itcjojjXz<42t^q*YFoi`-%yW#4F#oVd} zBg%&n`tkA5BX3GO>m^BJ#@1>&_8*LL?(AohTn{HXr%A>C)acDzBPP!zEfGB@=-)N! z=xmh^_5(75z#0RMK8^h7_XA+rKxXu+vI8$cvX(0ewckX- z9HBNs2C!#8Ab5Okxvn?f58&3TMnK#T$ci!;eYo5LIq<3icN>aO23q9-?hEf`RCQ& zGp{WFi1IO~r=+wgXIhb+^?kyO&((ZZnq5lB#ZB^DfUO( zZ`qsI{j>8EJ%F|&ydSZD^7V~g=)AhW%O4H)Pl;56Wvfo))ldI)6%5hmw{#fO*D&a) z-@uR{xqi|e;c|c@0hH$l?FV=y@TfS-1G*u{bPlG{_3J8n<|W%vHp%DkokCb2-Q07l zeMUO+U)~S!ewq_^hMWgCOlfP>A?uyVtQw=efmwei16$1e>v2q^k#i&Z9g+_#*jSeI z$E)Ad(6s&C*t#`d-fDQX0*i>JW@_dl{EEHUe?Vr=t(O=IYim@CE@3TNGV74u&wDub z3)ejWSU_=>HBQDnKxo?D4`4_j5%ojb4{-0lXFmXl`vH!iWznqdy#Ju0NBaRe(ofNBLM`vk5IO+V%V zJNnk*jQs;zf!snMj532()#C9%oS)4*raW_-+iSKY!;;)9`C!nbutV%gnh-R^P3U>n z`Ult_j8?tYkJf@lR>n}#vAujWWHs%2xO%0v%DTfzo9`L~ZfO81lM-GO21A{!^ z83@HW15K}P*o_8=L4RZ3=fl`vwc}iA)JQPElGBz~ibp92_fJu^dB+}x{F12EU9JDr z9K*R9ynkYhI2T*JDeJQm#tz8k6gs8p5lxWK$V< z>rq$i@|^tuggn5P$tMop!D1sud4Mv?8364E^mzbGJ_zzjArHtW_5(~-O(hWqtMb73 z+B^XMTLD%xs&#gi(2!Sg9*_uOHL|Uep}xx*o+AfjmlB4RUqywY6ld=fh(?X_fIV&0 zAGH1c%tQNlPUD>Jcj*4C*05w6N`3%BnoMr610*Y6>73Q~8|**Uv|clt3;E_et?*~9Vi$RWfN4VUl#rgXIJrUxS%sg9+36t;m-sxl$qMQAI zOz7Y=`F&VFMd$`O+Hdv-Dh*sY^(DfL^-ZGBx_L@x&pP@DVcww;Nm9=^?h}(k+Gf;# z^!qH1d`cQDu^^a6+UQqgvTAe;X`A1%gDoDWuk{OGs^NR-40Ew-n}TYbCQ~fEj>&cZ za|uG=E07sT9+0_fGMZMRUG=ex^Izjq<4&c7KIe@6GeL?c4I%lb^?G0?FYc4 zAI{kiAT-oQV4KDygWxoVc>r>Y2tt)m*EqBd`eI3%p(p$>kM&?KI(1m zKzsEXTbypTy;M8NZyqOU-gj)=>g?vu+vJDP9A+5_<JkdclpvGh0h1`0jc$^$Yx zA|sUhu~nHjedRK_4EO(@VAq~O%oT=tL&h{G_z1US%7>humP{*2lQv79G&~JfYQD-s zM5`5~Eu=*wO>4BV*Vv%X)zSqutL0~I)l%G><;Jq4Z`RjYC0Xkb`&X;97Ku<=a7B+3&buPN_eXjGx~lVej{=cJgjaZ|#PO ztJc=~c?au^T7RG+w^q{#XfMfZxn2W@VT;s>XF||W5aFyEcZPc10m=D1No055R#i)y z0RV{g?o46SPCs-%AUokHtU=fh2p+=xzO)pt`aHm5CdmRG74gCC2XHHTOenysfnMK# ztpor75CBO;K~yEQYye?DfW)jw#9BfqjA9yeqvKmk%P984ZRH55d76Tem-b1{-ZxK# z5d*yN0U_!|%{~EFmPh*p{hk4uer6SGy?>JjG~S=~k2`AI;SbZRCgbzf$wWd?ea|qMQ5QW$t0dd^o-)!6dd~dTDa%^K+f-Nd&*~=PNcNs zIJqw840Ccwza(lM+FJi!3I_8=AwFCR4c_e+V5fMtZWylne1x-@kr-fj)JBmEp!(JU z&K2FwdOC4Sc>wnA2iPeMc^<2KylF?!w;Gr3ole(;8fTO*W zW;R zHVRD7LE7Ft=Mx-iTkB6`S;oIwA6aFK`eWT+?7ge|yJrY>|LojM>i&&Kdd_u!!v1di zO$Gpyuy^~@s*!s7x$FmEdb#_@Dr?sjj3=8N!OJi?Y*#WQ_p7Xjf|yM_m75|6oWCCs z#wU1S`qvS?hqP`TncrqjyS;&J2DX@)Q*q9q+oKHnjo9+&49MI5i25^XAH?;xB%5}7 zR6K0RY(_6$l{88(Qm>TvQLsUSEoxF%HMn~RE9524e#XC_p%u!2WWAh7W>1w*Pc|7; zEjRbn@E(9w#3Zn)PbpU<`00o42gpE~yuU?nYbpDa%Yo^B07p5fhPjB6we5ZYPVNU- z1|U3&e0V>=*MlSm$^#@~A?^ooP5^5~Zl#5ftL-ok06UK;&xC<&!;-@C0E8%xHV*(H zHO6i^w(x~D@i0P+ZN^ABx|{&MYJ)!VMt+c*KBKA@ZGq##N1#8WcFx@_L)ws@`++oE zg~3XVR@Rjc1FcXBoBBRl><>neo3(zVPQwxUCPc^nWI;VEaIXc&&Ss(T%86L9w9(Rg z5^aXetz!Sa?yugJ*P1<5JDDG0ErfogepfFAUs^`73;-r=YEPU-xHD9@XBW{pI|iLn zmP}M?Iy;BKj2VsrO}lf1(^HLjf2RF_FjqtR83UQG?MR;N4Iu5{am37dYxIB#9(eTg z?V;l=`gV@L-QRKa;y#O_=RACm_q+C4s6o{B2JfF3X-;^k^{4(hpPuM5W{CeD`J9b= z_sPVE9@hQ&SR@J+d0BM=Y4lu>gw?F4728%%5%&XR%!D7^egNq~mhpD)2Ux$^4{#|_ zMGx)XiO>uZXNvu49-#WCksJsuS1q60-ayO=^2qylRa#luA>xxI^??X2PO8T3o`JZT z9aZVUo&opMc3;o5I||%S;d~yRPvLw%dHsC+NKe~uxEOIt(jeb4tLb}R&DGlR>adlK zR=mUhToq_FD)C-a)WE8lh^W8QWUXwFzjKR#4b)f-dEtIHuB-Lu{uzJn8=(+Fxk8|o z1L|k8vew&R^qkK|-JdKAjQugL`=^js)ppGQ?5rM%;zT-eI>W1Djn~kN+VR6U~d*l`5g(DAc*d?Br#CDN+C&M4ZNs=J)4iorHUa@%5yQBR^UJ7-`g znc5F~10y;|djlQ6V`g?UiRU~4p}fJkCp7Q_>-QAy;izf%&x~EeZ%iA9WKAFq$$6wj zz#hsPIy6rXDI(AxPf3hDC^8l|(JJ)DOLR)1EmDb#@lSc0h-@$j=qsR}JFfowK zEjMyY;TZ#}LV6yMFc@9dNaO%QKn>9(+XRGNf#Kdj%n1Tgi#dUzyxipk8081>1vlLt z_t9X|ywz{=fUciL{oI^ktUWvby!ybNdi~jTe72R`^#{_^Hl=-`2Jh#H_qpF|vS+&Ju)kZx&}!JSq%Sj$tP&CLrzmC~J9`^<4GsIJuI}&Nrmy>> zT~jz4eNL8hCx4YggZ-snxb_Sn`wWOz#=lHX$2*^KKVa*=j)dTq_6;x@NpGW!tZny= z^Pp+FJfI(OH(PTC&L?w3azkgE6P(bQJ?(i%Pw9gvo{_R=9rm2x9{&Mt&-Fu(GpFtG z{-hmKyqBIp+eoV)FpRWpWsX_5#Jrd2JU%-#O27KdiHGumW8ytpvMADo?@E^|Gr6Tf z9-u%IayoH4+7D2?P;a6_1qS;83FqtwqLApO(z{W0}Z+H$A8(Jaqlm#r!5_|IJHZ)O;f-?Gw@f9AwA zLAIT6uY%(50U_StyTh&~J(h${_&Ut_{&fU-TyF*RgGya`YkfoR%G2REB&ollA zb$`YCAk~OWuC`4%qRR=}Jv-5Yoai{~(NdYBpc*w`l!%SpX1of;I|%s)gB z&weoJKkB2G#?H1L+Mi(jS-UmlUYe!Noo4EvM|gkNkfAj^%CkIxfzvmPSvfJzS&X@S zhHJ6o$V(nPhi(z9j?(Q1)V~M?vNUvB@vMxKyZwL~*r-olFY~HLOj;-KIEH7~4^V3B zp;fjNqj8Qo0dn)it_WbB2e|Gc$W2$-AGE7yGS@bxSAOEBfE+w2 z4%~Np-Xe=1Cu3-{<~>_fG3t&FuQ4V=kVJT7QTAcN0ClVZhb^`?Dv>v&l{}`D}H6 z@gY?e7NDs$dw9@(rP#3>hR+45Zt3X*>-GaM ztlYVjct0Q^J_(@w0%?>7WVT*~JAg*7Q+opldjp*wv~5#4C4|MywCJqucjR+UfTo|K z$467CvpnFuJp=SvLc6|-cG2|B1e!Bw{;DGTV9(Fy-KHE3md8K>9mY=$#?KSUgDhxI zeV;9{*NTu$Hnsjv>zWL;*VvI(C$X<+1t)6#0sE)MmDE1XklTLD_{HiYTLbLRo}_pf zn#@~bZ=}@^tow`n!9nSm0et$WEDkrN;2Z^_$K)^b8|aesZ2JLQ_hCYL1}LxGMd#+I zdNvJLdI+6QN%Tx+>>tlZ9P8x^Uv6_Wc(2Sr5JxE z=Z6lzeS{%~Ao;xUHpLcd{e$OxdS=d^C;UzNQ|vz+=K)Ompq&Ms9FYdn>}P@3!jQeL zjlKH;sr!G1tOzaL-~E_PNN4=q9x8UjUBQ4AMe5>kLr zp$j>IM0JkvyxxQey8VEd2Ut$+k_=8Br}hRA_isWT07TiU7NFf5$Ze&SB!<|AoWKOf zSTC?5a&TR0y?=u=PgI;mVojU(w`lsHGvhvfMCV7;p1~=)J_s|K_n+1DQ_S9Y1-q5i z6%U%wX-KH`W24qD1^_(2T7Q1O^xKY0@IFlLrz;!I3tnt)ce z!TULQJX(v=A7Otmwp;fAJ`ZRGLo8gabc|zO^k$uHwMt{Qo~|BgzP+ zZh)(M=IlnS9~cc~K%|7w#Vv&#*J*TntZN3IPO2ogY&oI*V*3V~)9#KrefIs;n&Zp- ze*HL2NZKO$Qr51^DHF}wuG33(I<}bKt}N#*7Tc=lxq4`ml=r`tS2dBUzC{4j`p^5> z<(CI4fA(q36n$FE*2e*}dwf|Bc!0dC2bk|^poMH^xJ7~6dVtziG;simm_TtG{Wn6k zU@i zPmg~_0A|f4lYvuyoV`7E`;ioT_Aj}4i2LIL#ZbK!yhS^2vY*xUPWo#4mb)Vd-Ov;V zh(F<9tQ6KwH^F9;?-y_wCc0|F9&hRgY6ths?OFMAboK0g`RlgE@Q#JM$4xC;ZTV(3 zX*Gdz{ZLD{-|&~K`8WD)CEx!mCK8?^^3}F_WIoS7lVw;X098EzbI6~l2hdIX_&al| zN1gxx5CBO;K~&G66$gCGwurYum_Dz9t@rXm7I|Cno@PO- z#Rta(H#LJ1J>P9D0j=NtH|VNe84Tk5-L46-fMkI-Nd!KUb99pIMSh>@QqzoP&73r8 zZ|VD+HQ;l>Cq+*X5KdM+aZ;X8J-PD~Kao9cwDtYH#Tdb==={s_$ZXjz%?wSFW6JwK z{CgRhwInO5EW`*vc~zq%UT@~ZbQtS?;p>S8r+Pq)1LFK)9s;1`D8HUq&^Q1VNmUDX zPtA~Kdp^DH2n*WNN&$*!><6 z!Kq*AF%;~({@eMvKX87gzeBHnS`|rB7JX@u{99s0YM2 z;JN3achtPVJ`>RmHjE*-IN+H9-rfz$Gg3B9GiyLw58&3%I@Gp0+_0$!FowaikcA|B zBDVZO)o(1s0XWwN%*!y^t>kEg+Q1YioUISmzuK^i35 zni({fa{WlTes>n8Vxri*wz~4NJSb1)oWI-d-uK7wb|_mFwmdE~fj;jawgq9Sc^OS> zIV~p^J+14C0ARD(?VZWFYW2`qeyi#BBZv3PPHVY2&kKY%XlSrp=S{xadp3;0MZV+o zD;6qzjyQMpH4puU##$T)lRB^zRw`S#@ zo9byFMpGQHJm0y1-G|BI>*>OEJwO;(g>lV|oat-gfFdRUhHnKv^N5Ln0k;G=7Q+4# zY+?fQn53!=Aky>HIs7L*gp@{<72MYeRIkjtT;Qq)%Jc{{KwE$GXGfdF9ql!t^sjgM z^xQ8m-^UeQw7QFC*9|feN$hCnOAaTyfkw(PzduMryyj?2n&vfd1UlsUNA+zF)BbeO zshOU&a&eLCN0IB7(&C-l@zm(lNr@rF6qrLdUb3>cOV^uCHV@&3WhH-J8=zkNP=@=92fOxquv5;Ws==(QMv?6@l|NHd2rxkOOi0Dgu$^LLzr-7uI z-rp~L|H;D`zXYabe-4@+M=4dyA!x{f4OxD)}(9{F; z&cxH2$LT*%99^g#9K5qdii#6dV%(U7cXz@6{=`A;Zg_AkoQxL!O^X^xnptZvcDeolhpxQV1)5wxid=v8_c_Iz z%eppe;A5`X3|E8Saj_fh_$*;~Kj$4ghO@-_(B-^6R%b@!pYn(6dca&C*wzD{Uu>9# zDWC`d^9Byu;O?t=n?c1z87jK{+^uN0*1)lN zW4&cfRt*P&<|_~`*NvROg{DtI=z{x{M#8x4_=>yN(wc6Qo< zkVD-Ju4FN->pu;rpWAFj0I?o0ntFhGuXtL$dmp(z_wyR2hI)42*8|pV_TXsry#3a# zh*8D?=7Yf7vZ;TrHUNtW`1ZzX71YI+pVfaCRKx+es|}#YT25)ctPQ9?#q?ZjS0|AC z?NB9`L3|7c%*gG-P*pSF%TPEb2moc}3-ms2pdO5%CvBxcq9R}SqwTM9^fjMt?%wy0 z9i82cLry>C_ffaCR!HgZvn3f2sq*{WMorE@FJ6jVKhx8~EJ%Xy@1yhL>sZabc}8QYTGTNdv<(~!;bjMeN-*Hq9b`x!&LJiMX3>5&)J0O4Ob3Hq~ zYph=l_9u7#yNduOwY;!HJz(u;TMt+_w({-0u)(d11Ei}5EI-%P16EFXq&UEKC@~JO z8`#AGBi!E5IDl{XiT=_d=taCRgkrdE^%-F(?c)G#tJ=VWZS-y?h_3FU42^~SL#uXf z>I7YWRt|Lnrw;&b>jcWED7&gNN)ssC`aw7wu63R=V$Zng|1J7v-Hvm&uaW2;B}TG9 zdncVB%`9=&gsM$hek^^v%k{70ib~syYMDPNdV(73Uq|PlO5Qp)gDj-ZoUDObiIDLx zzw==l$vTmqEXSVZOV$rSwva%yqR)=5BLFBTX2rzhMAlPZWjc&?zwoU^gU8_Ri+Vu2 zlrA73N4gyy*kRc~t?jtm@Rqqn&%w*e1GVq(=o;HN=M_VF!%XWrENTN<2b%o*Izi^( zhQ56|SFNCzg65c@>6vW(tF+_L)1Q}$-Q6Se=DC+3OW$h+YfI1~8a(-I=v(gMVE0Cb z`2e9Lt96YbEv)|j(_Q%fj^jkroD!|syvphU9-Tri`x*d0pBryQ0I?o``+C3w_HWk% z9xnjavh|<0B?;EN54hHw^g0f(Z-l^cK#mDW9>XxC6=H2bj`aY>wyF(a(U>uTV@2DA zyx(w+2@bV^L7CiCComaFmY1n(pfQ-HjC06DOXJBBZKow#|I+=#7Vf`JkDlfo!Mh2Y zJU-K*&B!;>;S*<)t$lpf3f7iFqd-C{wQ=s6wO2WExqgIGFv3YGU^WO#-~V$$VJ$Oc z4?&i#0r~q7)V@CuXAgOQ$242B;e3B*16`(M*-rp54to^=z;nwU3X=h$W-PxIy6abd zQV)Pb?Zj!%4)HL45(jKn)81^jg2Va+&iCw;(?lczjtQ>o1iu5@+oy2zMsq{_*R;%G z-h~s@FF#p2r`Bcmm#-GIrD(tBZa0zR{|NK@`R`aWIkFXgKRdnaJcIM#vWCY$-$VfR zysZadUk`YGv0=}|W?8VDo;US?4;|_Oi08_(X#natfNyD~W%O|X96dW0atn6NkPO2U zif2&|$T7jfxvCA!*0{FX0Kk~XI>C74tN6oRlqoYSDL!~nCtw=GQFsr3=vSnMWc}uvg zf3%!rSI0LIz!HvOq~dt>_W_G;y3OKnxAQV|{=PQg=G6a)H*bNv13Pe8yr5h)6Wvp< z;Ieh8Ho%xHCu6=%^nM3;#b^)2!n4cpruabjg@c~FrN4Qy`^P>17QN^2?&*+ukFbR5 z&g4eg@ArLvpZA!w=$qY0IgxuKod~J?eWIOazGJimP7rhbOuvF*`2pDCS+leD^;`-p zBeNv$A^?!zTGa!_eLdjQQPu;9ws7aUwe$vy^#Gz>900l@*DZ=V4%pNKy!CfkJig~2 z8A}rfaO+nX;WpjY1`y({K{$^h4sbM9JGG^X19D7&NH5P0Ar3%WGeB1}z{1UFU*jR# z)IQJ{9i4OE+OKj9{x$#lFZ6R8`;q8+*Tbuu@0Ua;9AX z%24Es`G3l0)#f?@(eEaEo{s+i!%s%()MkIbkeb~uW|g*6|8xiE>E>^I_ zlRg67<8uD1ho%wvrEmQGq-v3_*z~(HKN!<0N`8qI;%x*FAF2nSsRziQi|w&Z zm>U^Z4*=H#^eV@?&}TQj!WHe|ycoD!5$m>mj117l0T?6P#vjnkSAw@1bsT{3jnE&4 z1X}j=SpZGhV)5g^hE%5ZcU2cWGJjIK`5(Xgy* zppj{0de9DU=%2LXqCe4@bJ@`ujTmD!IsH1nk8OT`+TUG%U%a-k7I{sROlK{f+PkzG zfmX`{X>$E2e1C*9&Emm?qvLRCC#k@NJK_L`Z!ezyLVr=PrjFkPvsv3d6TvGe*h7vdpN`qt}*&WY^x z4-{VioEa$sP*DuP+5JBk0Xz>Gp`l+LNfQU;!6@H~dnjLVaX^j<4oi_a#|@|FX)GS9 zo%3&=GZ0~^0{<^%@dA^dZl!8D4&Zhp_horE@xlL2n|IN+zzF_6nNN6n+p?s7`n+2} zQsla6Y5wC{U$bmWlE?YQO7w1&%V7#B^db7bn*nKN`40d90RR7mHr0Xv000I_L_t&o Y09l+*`>Eg(i~s-t07*qoM6N<$f)1)u)&Kwi literal 0 HcmV?d00001 diff --git a/docker-compose.backup-smb.yml b/docker-compose.backup-smb.yml index bc6e4fc..d7fc6e9 100644 --- a/docker-compose.backup-smb.yml +++ b/docker-compose.backup-smb.yml @@ -4,7 +4,7 @@ # # BACKUP_SMB_SERVER=192.168.1.20 the server # BACKUP_SMB_SHARE=backups the share -# BACKUP_SMB_USERNAME=ferrule an account that can write to it +# BACKUP_SMB_USERNAME=collimo an account that can write to it # BACKUP_SMB_PASSWORD=... its password; no commas # BACKUP_SMB_VERSION=3.0 optional # diff --git a/docker-compose.hms-docker.yml b/docker-compose.hms-docker.yml index 98b6aa1..b6e2ca2 100644 --- a/docker-compose.hms-docker.yml +++ b/docker-compose.hms-docker.yml @@ -12,7 +12,7 @@ # IGOTIFY_HOSTNAME=igotify.example.com (only with COMPOSE_PROFILES igotify) # TRAEFIK_MIDDLEWARES=internal-ipallowlist@file (the default) # -# Router names carry a ferrule- prefix so they never collide with routers an +# Router names carry a collimo- prefix so they never collide with routers an # existing Gotify on the same Traefik already uses. # # Each container sits on two networks, its stack's own and the proxy one, so @@ -36,9 +36,9 @@ services: TRAEFIK_MIDDLEWARES: ${TRAEFIK_MIDDLEWARES:-internal-ipallowlist@file} labels: - traefik.enable=true - - traefik.http.services.ferrule.loadbalancer.server.url=http://ferrule:8080 - - traefik.http.routers.ferrule.rule=Host(`${TELEMETRY_HOSTNAME:-telemetry.localhost}`) - - traefik.http.routers.ferrule.middlewares=${TRAEFIK_MIDDLEWARES:-internal-ipallowlist@file} + - traefik.http.services.collimo.loadbalancer.server.url=http://collimo:8080 + - traefik.http.routers.collimo.rule=Host(`${TELEMETRY_HOSTNAME:-telemetry.localhost}`) + - traefik.http.routers.collimo.middlewares=${TRAEFIK_MIDDLEWARES:-internal-ipallowlist@file} gotify: networks: @@ -46,9 +46,9 @@ services: - hms-docker_proxy_net labels: - traefik.enable=true - - traefik.http.services.ferrule-gotify.loadbalancer.server.url=http://ferrule-gotify:80 - - traefik.http.routers.ferrule-gotify.rule=Host(`${GOTIFY_HOSTNAME:-gotify.localhost}`) - - traefik.http.routers.ferrule-gotify.middlewares=${TRAEFIK_MIDDLEWARES:-internal-ipallowlist@file} + - traefik.http.services.collimo-gotify.loadbalancer.server.url=http://collimo-gotify:80 + - traefik.http.routers.collimo-gotify.rule=Host(`${GOTIFY_HOSTNAME:-gotify.localhost}`) + - traefik.http.routers.collimo-gotify.middlewares=${TRAEFIK_MIDDLEWARES:-internal-ipallowlist@file} igotify: networks: @@ -56,9 +56,9 @@ services: - hms-docker_proxy_net labels: - traefik.enable=true - - traefik.http.services.ferrule-igotify.loadbalancer.server.url=http://ferrule-igotify:8080 - - traefik.http.routers.ferrule-igotify.rule=Host(`${IGOTIFY_HOSTNAME:-igotify.localhost}`) - - traefik.http.routers.ferrule-igotify.middlewares=${TRAEFIK_MIDDLEWARES:-internal-ipallowlist@file} + - traefik.http.services.collimo-igotify.loadbalancer.server.url=http://collimo-igotify:8080 + - traefik.http.routers.collimo-igotify.rule=Host(`${IGOTIFY_HOSTNAME:-igotify.localhost}`) + - traefik.http.routers.collimo-igotify.middlewares=${TRAEFIK_MIDDLEWARES:-internal-ipallowlist@file} networks: hms-docker_proxy_net: diff --git a/docker-compose.yml b/docker-compose.yml index fd92510..fdfe2ff 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,7 +1,7 @@ # Single compose file for both paths. # -# Ferrule runs from its published image, a built binary: no source reaches -# the Docker host. FERRULE_VERSION picks the release and is required. +# Collimo runs from its published image, a built binary: no source reaches +# the Docker host. COLLIMO_VERSION picks the release. # docker-compose.build.yml, added beside this file, builds from source # instead, for development. # @@ -18,16 +18,18 @@ services: telemetry: - # The published image, at the release FERRULE_VERSION names: 0.9.0, or - # qa for what is under test. Required, so a stack never drifts onto a - # version nobody chose, and never latest. FERRULE_IMAGE is the registry - # path, one line to change when it moves. Its own container names keep - # it apart from an earlier stack of this project on the same host. - image: ${FERRULE_IMAGE:-ghcr.io/ferrulehq/ferrule}:${FERRULE_VERSION:?set FERRULE_VERSION to the release to run, such as 0.9.0} + # The published image, at the release COLLIMO_VERSION names: 0.9.0, or + # qa for what is under test, and never latest. COLLIMO_IMAGE is the + # registry path, one line to change when it moves. Its own container + # names keep it apart from an earlier stack of this project on the same + # host. + # Each release writes its own version and registry in as the defaults, + # so a blank stack runs it. + image: ${COLLIMO_IMAGE:-ghcr.io/collimohq/collimo}:${COLLIMO_VERSION:-0.1.0} # Ask the registry on every deploy. A fixed release costs one quick # request; qa moves, and this is how a redeploy picks it up. pull_policy: always - container_name: ferrule + container_name: collimo restart: unless-stopped environment: # false turns off Network, Protect, WAN and the probe, for a stack that @@ -39,6 +41,7 @@ services: UNIFI_USERNAME: ${UNIFI_USERNAME:-} UNIFI_PASSWORD: ${UNIFI_PASSWORD:-} UNIFI_SITE: ${UNIFI_SITE:-default} + PORT_SLEEPS: ${PORT_SLEEPS:-} # Protect on separate hardware (a UNVR) needs its own host and its own # credentials — the gateway's do not work on it. Leave these unset when # one console runs both applications. @@ -69,7 +72,7 @@ services: # The outage archive. Fixed path because it is a named volume, not a # host path — Portainer stacks cannot resolve relative host paths, and a # named volume needs none. - LEDGER_PATH: /var/lib/ferrule/ledger.jsonl + LEDGER_PATH: /var/lib/collimo/ledger.jsonl LEDGER_RETENTION: ${LEDGER_RETENTION:-8760h} # Demarcation probe. Unset PROBE_TARGETS leaves it off. Point @@ -100,6 +103,11 @@ services: SOURCE_8: ${SOURCE_8:-} SOURCE_8_SECRET: ${SOURCE_8_SECRET:-} + # Up-checks: ping, HTTP or a TCP port for anything with an address, + # entries separated by ; such as + # CHECKS=ping 192.168.1.20 name=printer; http https://nas.lab:5001 name=nas + CHECKS: ${CHECKS:-} + # Sign-in. Off until ADMIN_PASSWORD (free) or OIDC_* / LDAP_* (paid) # are set. See PORTAINER.md. ADMIN_USERNAME: ${ADMIN_USERNAME:-admin} @@ -127,7 +135,15 @@ services: # The license key, when there is one. Without it every install runs a # 30-day trial of the paid features, then carries on as Community. - FERRULE_LICENSE: ${FERRULE_LICENSE:-} + COLLIMO_LICENSE: ${COLLIMO_LICENSE:-} + + # Several sites, for an MSP (ADR-0044): a collector at each client + # site reports to one hub, calling out only. Unset is one site on its + # own. + COLLIMO_ROLE: ${COLLIMO_ROLE:-standalone} + HUB_URL: ${HUB_URL:-} + HUB_ENROL: ${HUB_ENROL:-} + HUB_LINK: ${HUB_LINK:-normal} # Notification channels. Each is off until its variables are set; any # number can be on. Slack, Teams, PagerDuty and the webhook are paid. @@ -135,6 +151,10 @@ services: # force; see PORTAINER.md for what each variable means. GOTIFY_URL: ${GOTIFY_URL:-} GOTIFY_TOKEN: ${GOTIFY_TOKEN:-} + # With the bundled Gotify and no token, Collimo makes a shared + # collimo-alerts account and its own app, using the admin password. + GOTIFY_ALERTS_PASSWORD: ${GOTIFY_ALERTS_PASSWORD:-} + GOTIFY_ADMIN_PASSWORD: ${GOTIFY_ADMIN_PASSWORD:-} NTFY_URL: ${NTFY_URL:-} NTFY_TOKEN: ${NTFY_TOKEN:-} PUSHOVER_TOKEN: ${PUSHOVER_TOKEN:-} @@ -147,6 +167,8 @@ services: SMTP_PASSWORD: ${SMTP_PASSWORD:-} SMTP_FROM: ${SMTP_FROM:-} SMTP_TO: ${SMTP_TO:-} + # open or all when SMTP_TO is a help desk's mailbox: one ticket per alert + SMTP_TICKETS: ${SMTP_TICKETS:-} SLACK_WEBHOOK_URL: ${SLACK_WEBHOOK_URL:-} TEAMS_WEBHOOK_URL: ${TEAMS_WEBHOOK_URL:-} PAGERDUTY_ROUTING_KEY: ${PAGERDUTY_ROUTING_KEY:-} @@ -189,10 +211,24 @@ services: INVENTORY_AT: ${INVENTORY_AT:-02:30} # Days of inventory history: a year by default; 2557 keeps seven years. INVENTORY_KEEP: ${INVENTORY_KEEP:-365} + # Capacity planning (paid): forecast thresholds in %, runway alert + # days, allocation limits, and hosts kept spare per cluster. + CAPACITY_THRESHOLDS: ${CAPACITY_THRESHOLDS:-cpu=80,mem=80,disk=85,pool=85} + CAPACITY_RUNWAY: ${CAPACITY_RUNWAY:-warn=90,bad=30} + CAPACITY_RATIOS: ${CAPACITY_RATIOS:-vcpu=4,vmem=1,disk=1.5} + CAPACITY_VM_SIZE: ${CAPACITY_VM_SIZE:-vcpu=4,mem=16,disk=100} + CAPACITY_HA: ${CAPACITY_HA:-} + # The monthly capacity summary: who gets it, whose name is on it, and + # the host "What to buy" plans in (empty: each cluster's largest). + CAPACITY_SUMMARY_TO: ${CAPACITY_SUMMARY_TO:-} + CAPACITY_SUMMARY_BY: ${CAPACITY_SUMMARY_BY:-} + CAPACITY_HOST: ${CAPACITY_HOST:-} + # Rated endurance per drive model, for disk wear: CT1000P310SSD8=220 + CAPACITY_DISK_TBW: ${CAPACITY_DISK_TBW:-} # A copy of every inventory in PostgreSQL, for Grafana and Power BI # (paid). For the stack's own, add "postgres" to COMPOSE_PROFILES and # set INVENTORY_DB_PASSWORD; for one you run, set INVENTORY_DB_URL. The - # reader password makes a read-only ferrule_reader role for reports. + # reader password makes a read-only collimo_reader role for reports. INVENTORY_DB_URL: ${INVENTORY_DB_URL:-} INVENTORY_DB_PASSWORD: ${INVENTORY_DB_PASSWORD:-} INVENTORY_DB_READER_PASSWORD: ${INVENTORY_DB_READER_PASSWORD:-} @@ -202,7 +238,7 @@ services: # that mounts an NFS or SMB share (docker-compose.backup-nfs.yml, # docker-compose.backup-smb.yml); BACKUP_S3_* is object storage, paid. # See PORTAINER.md. - BACKUP_NAME: ${BACKUP_NAME:-ferrule} + BACKUP_NAME: ${BACKUP_NAME:-collimo} BACKUP_KEY: ${BACKUP_KEY:-} BACKUP_AT: ${BACKUP_AT:-03:30} BACKUP_HISTORY: ${BACKUP_HISTORY:-true} @@ -213,7 +249,7 @@ services: BACKUP_S3_ENDPOINT: ${BACKUP_S3_ENDPOINT:-} BACKUP_S3_REGION: ${BACKUP_S3_REGION:-us-east-1} BACKUP_S3_BUCKET: ${BACKUP_S3_BUCKET:-} - BACKUP_S3_PREFIX: ${BACKUP_S3_PREFIX:-ferrule} + BACKUP_S3_PREFIX: ${BACKUP_S3_PREFIX:-collimo} BACKUP_S3_ACCESS_KEY: ${BACKUP_S3_ACCESS_KEY:-} BACKUP_S3_SECRET_KEY: ${BACKUP_S3_SECRET_KEY:-} DASHBOARD_URL: ${DASHBOARD_URL:-} @@ -230,8 +266,8 @@ services: # Stack environment can start from what is set. Never a secret. COMPOSE_PROFILES: ${COMPOSE_PROFILES:-} WEB_PORT: ${WEB_PORT:-8090} - FERRULE_IMAGE: ${FERRULE_IMAGE:-ghcr.io/ferrulehq/ferrule} - FERRULE_VERSION: ${FERRULE_VERSION:-} + COLLIMO_IMAGE: ${COLLIMO_IMAGE:-ghcr.io/collimohq/collimo} + COLLIMO_VERSION: ${COLLIMO_VERSION:-} RETENTION: ${RETENTION:-13w} GOTIFY_ADMIN_USER: ${GOTIFY_ADMIN_USER:-admin} GOTIFY_PORT: ${GOTIFY_PORT:-8091} @@ -249,7 +285,7 @@ services: # resolve. The root filesystem stays read-only; this is the one writable # mount, and it is what makes the outage archive outlive the controller # 21-hour window. - - ledger-data:/var/lib/ferrule + - ledger-data:/var/lib/collimo sysctls: # Lets the container open an unprivileged ICMP datagram socket for the # demarcation probe, with cap_drop: ALL still in force. The range must @@ -260,7 +296,7 @@ services: - victoria-metrics healthcheck: # The image is scratch — no shell, no curl. The binary probes itself. - test: ["CMD", "/ferrule", "-healthcheck"] + test: ["CMD", "/collimo", "-healthcheck"] interval: 30s timeout: 5s retries: 3 @@ -281,7 +317,7 @@ services: victoria-metrics: # Pin to a release tag once you have one you are happy with. image: victoriametrics/victoria-metrics:latest - container_name: ferrule-victoria-metrics + container_name: collimo-victoria-metrics restart: unless-stopped command: - "-storageDataPath=/victoria-metrics-data" @@ -318,7 +354,7 @@ services: gotify: profiles: ["gotify"] image: gotify/server:latest - container_name: ferrule-gotify + container_name: collimo-gotify restart: unless-stopped environment: GOTIFY_DEFAULTUSER_NAME: ${GOTIFY_ADMIN_USER:-admin} @@ -339,7 +375,7 @@ services: igotify: profiles: ["igotify"] image: ghcr.io/androidseb25/igotify-notification-assist:latest - container_name: ferrule-igotify + container_name: collimo-igotify hostname: igotify restart: unless-stopped pull_policy: always @@ -360,23 +396,23 @@ services: # ---- Optional: PostgreSQL, for the inventory's database copy ---------- # # Starts only with "postgres" in COMPOSE_PROFILES. Set - # INVENTORY_DB_PASSWORD and the collector finds it at ferrule-postgres on + # INVENTORY_DB_PASSWORD and the collector finds it at collimo-postgres on # its own; nothing else to set. It holds a copy: the inventory files on # ledger-data stay the master and travel with the backups, and the copy is # rebuilt from them, so this volume needs no backup of its own. # # Grafana and Power BI connect with their own PostgreSQL connectors, as - # ferrule_reader with INVENTORY_DB_READER_PASSWORD, never as the writer. + # collimo_reader with INVENTORY_DB_READER_PASSWORD, never as the writer. # The port listens on the Docker host's loopback only; set # INVENTORY_DB_BIND=0.0.0.0 for a reporting tool on another machine. postgres: profiles: ["postgres"] image: postgres:18-alpine - container_name: ferrule-postgres + container_name: collimo-postgres restart: unless-stopped environment: - POSTGRES_USER: ferrule - POSTGRES_DB: ferrule + POSTGRES_USER: collimo + POSTGRES_DB: collimo # The image refuses to start without one, so a missing password shows # here rather than as an open database. POSTGRES_PASSWORD: ${INVENTORY_DB_PASSWORD:-} @@ -387,7 +423,7 @@ services: ports: - "${INVENTORY_DB_BIND:-127.0.0.1}:${INVENTORY_DB_PORT:-5432}:5432" # Postgres sets POSTGRES_PASSWORD only when its volume is first made, so - # changing INVENTORY_DB_PASSWORD later left Ferrule refused. The first + # changing INVENTORY_DB_PASSWORD later left Collimo refused. The first # check in each container sets the password from the environment, over # the container's own socket, which needs none, and marks /tmp so it is # done once: a redeploy with a new password is a new container with an @@ -396,7 +432,7 @@ services: # password reaches SQL as a psql variable, so no quote in it can break # the statement. healthcheck: - test: ["CMD-SHELL", "pg_isready -U ferrule -d ferrule && { [ -f /tmp/ferrule-password-set ] || { echo \"ALTER ROLE ferrule PASSWORD :'pw';\" | psql -U ferrule -d ferrule -q -v ON_ERROR_STOP=1 -v pw=\"$$POSTGRES_PASSWORD\" >/dev/null && touch /tmp/ferrule-password-set; }; }"] + test: ["CMD-SHELL", "pg_isready -U collimo -d collimo && { [ -f /tmp/collimo-password-set ] || { echo \"ALTER ROLE collimo PASSWORD :'pw';\" | psql -U collimo -d collimo -q -v ON_ERROR_STOP=1 -v pw=\"$$POSTGRES_PASSWORD\" >/dev/null && touch /tmp/collimo-password-set; }; }"] interval: 30s timeout: 5s retries: 3 @@ -411,7 +447,7 @@ services: apprise: profiles: ["apprise"] image: caronc/apprise:latest - container_name: ferrule-apprise + container_name: collimo-apprise hostname: apprise restart: unless-stopped pull_policy: always diff --git a/sbom/sbom-amd64.cdx.json b/sbom/sbom-amd64.cdx.json new file mode 100644 index 0000000..eaade8d --- /dev/null +++ b/sbom/sbom-amd64.cdx.json @@ -0,0 +1,47 @@ +{ + "bomFormat": "CycloneDX", + "specVersion": "1.5", + "serialNumber": "urn:uuid:ec368b99-dd5d-4021-bd47-4bd6e7cd2d00", + "version": 1, + "metadata": { + "timestamp": "2026-10-22T17:26:30Z", + "component": { + "type": "container", + "bom-ref": "collimo-image", + "name": "collimo", + "version": "0.1.0", + "purl": "pkg:oci/collimo@0.1.0?repository_url=ghcr.io/collimohq/collimo&arch=amd64", + "properties": [{"name": "base-image", "value": "scratch"}] + } + }, + "components": [ + { + "type": "application", + "bom-ref": "collimo", + "name": "collimo", + "version": "0.1.0", + "description": "The Collimo collector, a static linux/amd64 binary", + "purl": "pkg:generic/collimohq/collimo@0.1.0?arch=amd64" + }, + { + "type": "library", + "bom-ref": "golang-stdlib", + "name": "stdlib", + "version": "1.24.13", + "description": "The Go standard library, compiled into the binary", + "purl": "pkg:golang/stdlib@1.24.13" + }, + { + "type": "data", + "bom-ref": "ca-bundle", + "name": "ca-certificates-bundle", + "version": "20251003-r0", + "description": "The CA certificate bundle at /etc/ssl/certs/ca-certificates.crt", + "purl": "pkg:apk/alpine/ca-certificates-bundle@20251003-r0?distro=alpine-3.23.3" + } + ], + "dependencies": [ + {"ref": "collimo-image", "dependsOn": ["collimo", "ca-bundle"]}, + {"ref": "collimo", "dependsOn": ["golang-stdlib"]} + ] +} diff --git a/sbom/sbom-arm64.cdx.json b/sbom/sbom-arm64.cdx.json new file mode 100644 index 0000000..376f0f2 --- /dev/null +++ b/sbom/sbom-arm64.cdx.json @@ -0,0 +1,47 @@ +{ + "bomFormat": "CycloneDX", + "specVersion": "1.5", + "serialNumber": "urn:uuid:6534cc79-5942-4ed1-a18b-32762a85fe4f", + "version": 1, + "metadata": { + "timestamp": "2026-10-22T17:26:31Z", + "component": { + "type": "container", + "bom-ref": "collimo-image", + "name": "collimo", + "version": "0.1.0", + "purl": "pkg:oci/collimo@0.1.0?repository_url=ghcr.io/collimohq/collimo&arch=arm64", + "properties": [{"name": "base-image", "value": "scratch"}] + } + }, + "components": [ + { + "type": "application", + "bom-ref": "collimo", + "name": "collimo", + "version": "0.1.0", + "description": "The Collimo collector, a static linux/arm64 binary", + "purl": "pkg:generic/collimohq/collimo@0.1.0?arch=arm64" + }, + { + "type": "library", + "bom-ref": "golang-stdlib", + "name": "stdlib", + "version": "1.24.13", + "description": "The Go standard library, compiled into the binary", + "purl": "pkg:golang/stdlib@1.24.13" + }, + { + "type": "data", + "bom-ref": "ca-bundle", + "name": "ca-certificates-bundle", + "version": "20251003-r0", + "description": "The CA certificate bundle at /etc/ssl/certs/ca-certificates.crt", + "purl": "pkg:apk/alpine/ca-certificates-bundle@20251003-r0?distro=alpine-3.23.3" + } + ], + "dependencies": [ + {"ref": "collimo-image", "dependsOn": ["collimo", "ca-bundle"]}, + {"ref": "collimo", "dependsOn": ["golang-stdlib"]} + ] +} diff --git a/stack.env.example b/stack.env.example index 4ed0220..5ddb232 100644 --- a/stack.env.example +++ b/stack.env.example @@ -2,7 +2,7 @@ # variable, this file's and the rest, from what the stack is running with. # Required: the release to run, such as 0.9.0, or qa for the build under test. -FERRULE_VERSION=0.0.2 +COLLIMO_VERSION=0.1.0 # false watches only hypervisors and storage, with no UniFi console at all, # and is what to set while trying this stack beside an existing one. @@ -53,7 +53,7 @@ PROBE_TIMEOUT=2s # ---- License ------------------------------------------------------------- # Empty runs a 30-day trial of the paid features, then Community. -FERRULE_LICENSE= +COLLIMO_LICENSE= # ---- Notifications ------------------------------------------------------ # Each channel is off until its variables are set. Settings -> Notifications @@ -86,7 +86,7 @@ DASHBOARD_URL= # ---- Backups ------------------------------------------------------------- # A share needs an overlay: docker-compose.backup-nfs.yml or -smb.yml under # the stack's Additional paths. S3 is paid. See PORTAINER.md. -BACKUP_NAME=ferrule +BACKUP_NAME=collimo BACKUP_KEY= BACKUP_AT=03:30 BACKUP_HISTORY=true @@ -106,7 +106,7 @@ BACKUP_SMB_PASSWORD= BACKUP_S3_ENDPOINT= BACKUP_S3_REGION=us-east-1 BACKUP_S3_BUCKET= -BACKUP_S3_PREFIX=ferrule +BACKUP_S3_PREFIX=collimo BACKUP_S3_ACCESS_KEY= BACKUP_S3_SECRET_KEY=