From 9894f6f52d4e21008dcba755f312bb755aa75795 Mon Sep 17 00:00:00 2001 From: Bernard Benson Date: Tue, 11 Aug 2026 11:59:00 -0500 Subject: [PATCH 01/20] plan docs --- IMPLEMENTATION_PLAN.md | 856 ++++++++++++++++++++++++++++++++++ WORKFLOW.md | 230 +++++++++ WORKFLOW_DIAGRAM.png | Bin 0 -> 1767220 bytes rewiring_decisions.md | 25 + sde_collections/DEPLOYMENT.md | 187 ++++++++ 5 files changed, 1298 insertions(+) create mode 100644 IMPLEMENTATION_PLAN.md create mode 100644 WORKFLOW.md create mode 100644 WORKFLOW_DIAGRAM.png create mode 100644 rewiring_decisions.md create mode 100644 sde_collections/DEPLOYMENT.md diff --git a/IMPLEMENTATION_PLAN.md b/IMPLEMENTATION_PLAN.md new file mode 100644 index 00000000..b5d7ac76 --- /dev/null +++ b/IMPLEMENTATION_PLAN.md @@ -0,0 +1,856 @@ +# COSMOS Rewiring — Implementation Plan & Progress Tracker + +> **Status legend:** `[ ]` not started · `[~]` in progress · `[x]` done · `[D]` deferred by decision +> +> Update the checkboxes in this file as work lands. This document is the progress tracker. +> +> Companion documents: [`WORKFLOW.md`](./WORKFLOW.md) (what the pipeline does), +> [`sde_collections/DEPLOYMENT.md`](./sde_collections/DEPLOYMENT.md) (how it deploys), +> [`rewiring_decisions.md`](./rewiring_decisions.md) (why). + +--- + +## Context + +COSMOS today drives collection curation through **Sinequa**: workflow-status changes generate +Sinequa scraper/indexer XML configs, push them to a GitHub configs repo, and pull scraped full +text back out of the Sinequa API. Sinequa is being retired. + +The replacement, specified in [`WORKFLOW.md`](./WORKFLOW.md), is: + +``` +COSMOS ──SSM job JSON──► crawl4ai scraper on EC2 ──► S3 ──► COSMOS DumpUrl + └──► DeltaUrl ──curation──► CuratedUrl ──► OpenSearch (test) ──QC──► OpenSearch (prod) +``` + +`sde_collections/DEPLOYMENT.md` is the companion CI/CD spec. Both, plus +`rewiring_decisions.md` and `WORKFLOW_DIAGRAM.png`, are currently **untracked** files on branch +`cosmos-rewiring`, which has no commits of its own. + +**Intended outcome:** COSMOS dispatches scrape jobs, ingests results from S3, drives curation to +`CuratedUrl`, and hands curated content to an indexing pipeline — with Sinequa removed, the +inference pipeline dormant, and a repeatable deploy path. + +### Confirmed decisions + +| Decision | Choice | +|---|---| +| Scope | Pipeline rewiring **+** the CI/CD machinery from `DEPLOYMENT.md` | +| Sinequa | **Delete outright** (unwire first, then remove the files) | +| Indexing pipeline (chunk → SageMaker → AOSS) | **Deferred** — likely a different repo; this plan defines the contract only | +| Validation per phase | pytest with mocked AWS; manual smoke tests against the real `sde-dev` account | + +### Decisions added after plan review (2026-08-11) — confirm with team + +| Decision | Choice | +|---|---| +| **Reindexing (re-scrape) flow** | `create_configs_on_status_change` has a second, `reindexing_status`-keyed block (`REINDEXING_FINISHED_ON_DEV → fetch_full_text`, `REINDEXING_CURATED → promote_to_curated`) that the original plan didn't account for — P6 deletes `fetch_full_text`, which would sever re-scrapes. **Rewire it onto the same dispatch/poll path**: dispatch on `REINDEXING_NEEDED_ON_DEV` (P3), poll it (P4), ingest flips to `REINDEXING_FINISHED_ON_DEV`, and the migrate task's existing `→ REINDEXING_READY_FOR_CURATION` transition takes over. Keep `REINDEXING_CURATED → promote_to_curated`. | +| **Dispatch record & result freshness** | S3 objects persist between runs, so on any re-dispatch the poller would instantly "complete" against the **previous run's** output, and the stall timeout has nothing to measure from. Add a small **`ScrapeDispatch`** model (P3): `collection` FK, `dispatched_at`, `ssm_command_id`. `results_ready()` requires the S3 summary's `LastModified > dispatched_at`; the stall timeout is measured from `dispatched_at`. | + +### Hard constraints + +- **Do not modify `DumpUrl`, `DeltaUrl`, or `CuratedUrl`** (`sde_collections/models/delta_url.py`), + nor `migrate_dump_to_delta()` / `promote_to_curated()` in `collection.py`. The rewiring changes + what *feeds* those models, never the models themselves. +- Every migration must stay additive and backward-safe so an image rollback is a complete rollback. + +--- + +## Key reuse points (found during exploration — prefer these over new code) + +| Seam | Location | Why it matters | +|---|---|---| +| `create_configs_on_status_change` | `sde_collections/models/collection.py:871` | The single `post_save` dispatcher for all status-triggered side effects. Four of its five branches are Sinequa. **This is the main rewiring surface.** | +| `fetch_full_text` | `sde_collections/tasks.py:159` | The only writer of `DumpUrl`. Its contract is just `{url, title, full_text}` → `DumpUrl(url=, scraped_title=, scraped_text=)`. Swap the source from Sinequa to S3 and everything downstream is unchanged. | +| `migrate_dump_to_delta_and_handle_status_transistions` | `sde_collections/tasks.py:200` | Already does delta migration + status transition. Its `pre_workflow_statuses` list is where new statuses slot in. | +| `queue_necessary_classifications` | `sde_collections/models/collection.py:692` | The inference on/off switch; its `else` branch already calls migration directly. | +| `inference/signals.py:5` | `post_migrate` → `PeriodicTask` | The exact pattern to copy for the new `poll_scrape_jobs` schedule. There is **no `CELERY_BEAT_SCHEDULE`** in this repo — all schedules are DB rows. | +| `send_detailed_import_notification` | `sde_collections/utils/slack_utils.py:62` | Already written, **never called**. A ready-made ingest-summary Slack hook. | +| `STATUS_CHANGE_NOTIFICATIONS` | `sde_collections/utils/slack_utils.py:12` | `(old, new)` → message map. Already covers `QC:Perfect→Prod:Perfect` and `QC:Minor→Prod:Minor`. | +| `s3_keys_for_collection` | `sde-crawl4ai-scraper-v1/sde_crawler/job.py:65` | Authoritative S3 key layout — mirror it, don't reinvent it. | +| `JOB_DEFAULTS` / `merge_job` | `sde-crawl4ai-scraper-v1/sde_crawler/job.py` | Job JSON contract. `None` values are skipped, so COSMOS should emit only non-null overrides. | + +--- + +## Repo structure after this work + +``` +COSMOS/ +├── WORKFLOW.md ← tracked (was untracked) +├── WORKFLOW_DIAGRAM.png ← tracked +├── rewiring_decisions.md ← tracked +├── ecr.override.yml ★ P9 +├── scripts/deploy.sh ★ P9 +├── .github/workflows/ +│ ├── ci.yml ★ P9 (replaces run_full_test_suite.yml) +│ ├── deploy-staging.yml ★ P9 +│ ├── deploy-production.yml ★ P9 +│ ├── rollback.yml ★ P9 +│ └── secret-scan-history.yml ★ P9 +├── sde_collections/ +│ ├── DEPLOYMENT.md ← tracked +│ ├── apps.py ✎ add ready() → import signals +│ ├── signals.py ★ P4 post_migrate → poll_scrape_jobs PeriodicTask +│ ├── tasks.py ✎ scrape dispatch / poll / ingest; Sinequa tasks removed +│ ├── sinequa_api.py ✖ DELETED (P6) +│ ├── models/ +│ │ ├── collection.py ✎ triggers rewired, Sinequa methods removed +│ │ ├── collection_choice_fields.py ✎ statuses 21–26 +│ │ ├── scraper_config.py ★ P3 ScraperConfigOverride + ScrapeDispatch +│ │ └── delta_url.py ✔ UNCHANGED (hard constraint) +│ ├── scraping/ ★ P3/P4 new subpackage +│ │ ├── job_builder.py ★ build_job_json(collection) -> dict +│ │ ├── ssm_dispatch.py ★ send_job_to_crawler(collection) +│ │ └── s3_results.py ★ fetch summary + documents from S3 +│ ├── utils/ +│ │ ├── aws.py ★ P0 get_boto3_session() — shared credential chain +│ │ ├── slack_utils.py ✎ new transitions +│ │ ├── github_helper.py ✖ DELETED (P6) +│ │ ├── bulk_github_push.py ✖ DELETED (P6) +│ │ └── health_check.py ✖ DELETED (P6) +│ └── management/commands/ +│ ├── preflight_aws.py ★ P9 +│ ├── validate_deploy_env.py ★ P9 +│ ├── dispatch_scrape.py ★ P3 manual re-dispatch +│ ├── ingest_scrape_results.py ★ P4 manual ingest +│ ├── import_from_sinequa.py ✖ DELETED (P6) +│ ├── push_to_github.py ✖ DELETED (P6) +│ ├── sync_all_with_github.py ✖ DELETED (P6) +│ ├── load_urls_from_api.py ✖ DELETED (P6) +│ └── generate_configs.py ✖ DELETED (P6 — already dead code) +├── config_generation/ ✖ DELETED ENTIRELY (P6) +├── default_scraper.xml ✖ DELETED (P6) +├── inference/ ✎ P2 gated off, NOT deleted +└── config/settings/base.py ✎ new AWS / crawler / flag settings +``` + +`★` new · `✎` modified · `✖` deleted · `✔` explicitly untouched + +--- + +## Phase 0 — Foundations: settings, AWS session helper, doc tracking + +**Goal:** land the shared plumbing every later phase needs, with zero behavior change. + +### Files + +| File | Change | +|---|---| +| `config/settings/base.py` | Add the settings block below (near `SLACK_WEBHOOK_URL`, ~L346) | +| `sde_collections/utils/aws.py` | **New.** `get_boto3_session()` | +| `.env_sample`, `.envs/.local/.django` | Document the new vars | +| `requirements/base.txt` | No change yet (boto3 already pinned at `1.34.31`) | +| `git add` the four untracked docs | Bring `WORKFLOW.md`, `WORKFLOW_DIAGRAM.png`, `rewiring_decisions.md`, `sde_collections/DEPLOYMENT.md` under version control | + +### New settings + +```python +# --- SDE curation pipeline --- +AWS_REGION = env("AWS_REGION", default="us-east-1") +SDE_S3_BUCKET = env("SDE_S3_BUCKET", default="") # crawler output bucket +CRAWLER_INSTANCE_ID = env("CRAWLER_INSTANCE_ID", default="") # i-0b6a61d95888886f4 on dev +CRAWLER_INBOX_PATH = env("CRAWLER_INBOX_PATH", default="/opt/sde-crawler/jobs/incoming") +SCRAPE_POLL_ENABLED = env.bool("SCRAPE_POLL_ENABLED", default=False) +INFERENCE_ENABLED = env.bool("INFERENCE_ENABLED", default=False) +# pipeline-scoped credentials for local dev ONLY; blank in AWS (instance role takes over) +SDE_AWS_ACCESS_KEY_ID = env("SDE_AWS_ACCESS_KEY_ID", default="") +SDE_AWS_SECRET_ACCESS_KEY = env("SDE_AWS_SECRET_ACCESS_KEY", default="") +# declared now, consumed by the deferred indexing phase + validate_deploy_env +OPENSEARCH_ENDPOINT_TEST = env("OPENSEARCH_ENDPOINT_TEST", default="") +OPENSEARCH_ENDPOINT_PROD = env("OPENSEARCH_ENDPOINT_PROD", default="") +SAGEMAKER_ENDPOINT_NAME = env("SAGEMAKER_ENDPOINT_NAME", default="") +``` + +> **Naming note:** existing settings use the `DJANGO_AWS_*` prefix for the *static assets* +> bucket/credentials. `SDE_S3_BUCKET` and `SDE_AWS_*` are deliberately distinct names — do not +> merge the two. In particular the helper below must **not** read `settings.AWS_ACCESS_KEY_ID`: +> that is the django-storages static-assets credential, it is defined only in `local.py:63` and +> `production.py:48` (not `base.py`), so referencing it under `test.py` raises `AttributeError` — +> and it is the wrong credential scope anyway. + +### `sde_collections/utils/aws.py` + +Existing COSMOS AWS code passes **static access keys** (`tasks.py:143`, `health_check.py:199`), +but `DEPLOYMENT.md` assumes the deployed host's **instance role**. Reconcile with one helper: + +```python +def get_boto3_session(): + """Default credential chain (instance role in AWS); explicit SDE keys only if set (local dev).""" + if settings.SDE_AWS_ACCESS_KEY_ID and settings.SDE_AWS_SECRET_ACCESS_KEY: + return boto3.Session( + aws_access_key_id=settings.SDE_AWS_ACCESS_KEY_ID, + aws_secret_access_key=settings.SDE_AWS_SECRET_ACCESS_KEY, + region_name=settings.AWS_REGION, + ) + return boto3.Session(region_name=settings.AWS_REGION) +``` + +All new SSM/S3/AOSS/SageMaker code uses this. Do not add new static-key call sites. + +### Validation + +```bash +docker-compose -f local.yml build +docker-compose -f local.yml up -d +docker-compose -f local.yml run --rm django python manage.py check +docker-compose -f local.yml run --rm django pytest # full suite must still pass +``` + +New test `sde_collections/tests/test_aws_utils.py`: asserts the session falls back to the default +chain when the `SDE_AWS_*` keys are blank (their `base.py` default, so no `override_settings` +gymnastics needed), and uses explicit keys when set (mock `boto3.Session`). + +### Done when +- [ ] Settings added; `manage.py check` clean with all new vars unset (defaults hold) +- [ ] `get_boto3_session()` exists with tests +- [ ] Four rewiring docs committed +- [ ] Full existing test suite green + +--- + +## Phase 1 — Workflow statuses 21–26, UI colour maps, Slack transitions + +**Goal:** make the new statuses selectable and renderable everywhere. **No triggers yet.** + +### Files + +| File | Change | +|---|---| +| `sde_collections/models/collection_choice_fields.py:80` | Add the six members below to `WorkflowStatusChoices` | +| `sde_collections/models/collection.py:333` | Add keys `24, 25, 26` to `Collection.workflow_status_button_color` | +| `sde_collections/models/collection.py:797` | Add keys `24, 25, 26` to `WorkflowHistory.workflow_status_button_color` | +| `sde_indexing_helper/static/js/collection_list.js:317` | Extend `color_choices` — it currently covers **only 1–16** | +| `sde_collections/utils/slack_utils.py:12` | Add the new transitions | +| `sde_collections/models/README_STATUS_TRIGGERS.md` | Document the new statuses | +| new migration `0078_*` | Choices-only `AlterField` (additive, reversible) | + +```python +SCRAPING_SUCCESSFUL = 21, "Scraping Successful" +TEST_INDEXING = 22, "Test Indexing" +SCRAPING_FAILED = 23, "Scraping Failed" +INDEXING_FAILED_ON_TEST = 24, "Indexing Failed on Test" +INDEXING_FAILED_ON_PROD = 25, "Indexing Failed on Prod" +PRODUCTION_INDEXING = 26, "Production Indexing" +``` + +> **Latent bug this phase must fix:** both Python colour maps do a bare +> `color_choices[self.workflow_status]` — an unmapped status raises `KeyError` and breaks the +> collection list *and* detail pages. Keys 21–23 already exist; 24–26 do not. Change the lookups to +> `color_choices.get(self.workflow_status, "btn-light")` so this class of failure cannot recur. +> The JS map is worse: statuses 17–20 already render colourless today. Fill 17–26 in the same pass. +> +> While in there: key `23` (Scraping Failed) is pre-provisioned as `btn-light` in both Python maps +> (`collection.py:357,821`) — change it to `btn-danger`, and use `btn-danger` for 24/25 too. +> Failure statuses must not render as neutral. + +New Slack transitions to add: + +| Transition | Message | +|---|---| +| `READY_FOR_ENGINEERING → SCRAPING_SUCCESSFUL` | scrape finished, counts included | +| `READY_FOR_ENGINEERING → SCRAPING_FAILED` | alert, mention devs | +| `CURATED → INDEXING_FAILED_ON_TEST` | alert | +| `* → INDEXING_FAILED_ON_PROD` | alert, mention devs | + +### Validation + +```bash +docker-compose -f local.yml run --rm django python manage.py makemigrations +docker-compose -f local.yml run --rm django python manage.py migrate +docker-compose -f local.yml run --rm django pytest sde_collections/tests/ +``` + +New tests in `sde_collections/tests/test_workflow_status_triggers.py`: +- Every `WorkflowStatusChoices` member resolves a colour on `Collection` **and** `WorkflowHistory` + (parametrised — this is the regression guard for the `KeyError`). +- Setting each new status writes a `WorkflowHistory` row. + +### Manual verification +1. `docker-compose -f local.yml up`, open `http://localhost:8001/`. +2. The per-row workflow dropdown lists all 26 statuses; the filter panel shows them. +3. Select **Scraping Successful** on a collection — the button re-colours, no console error, + and the detail page **Workflow History** tab shows the transition. + +### Done when +- [ ] Six statuses added, migration applied +- [ ] Both Python colour maps use `.get(...)` with a default; JS map covers 1–26 +- [ ] Slack map has the four new transitions +- [ ] Parametrised colour test passes for every enum member +- [ ] Dropdowns/filters render all statuses with no JS console errors + +--- + +## Phase 2 — Disable the inference pipeline (do not delete) + +**Goal:** `rewiring_decisions.md` item 1 — path of least resistance, keep the functionality. + +### The trap + +`queue_necessary_classifications()` (`collection.py:692`) routes **three hard-coded collections** +(`imagine_the_universe`, `physics_of_the_cosmos`, `stsci_space_telescope_science_institute`) +through `InferenceJob`; only the `else` branch calls the migration task directly. Disabling only +the beat schedule would leave those three collections with a queued job that never runs, so they +**never reach `Ready for Curation`**. The flag must short-circuit the branch itself. + +### Files + +| File | Change | +|---|---| +| `sde_collections/models/collection.py:692` | Early return in `queue_necessary_classifications()` when `not settings.INFERENCE_ENABLED` → call `migrate_dump_to_delta_and_handle_status_transistions.delay(self.id)` and return | +| `inference/signals.py:33,49` | Pass `enabled=settings.INFERENCE_ENABLED` on `PeriodicTask.objects.create(...)`, and set `.enabled` in both update branches | +| `inference/tasks.py:8` | Belt-and-braces early return when the flag is off | + +> `inference/signals.py` currently re-asserts `crontab` and `task` on **every** `post_migrate`, so +> disabling the rows by hand in the admin does not survive a deploy. Setting `enabled` in the +> signal is what makes the disable durable — exactly the failure mode `DEPLOYMENT.md` warns about. + +Leave `inference` in `INSTALLED_APPS`, leave models and migrations alone — +`candidate_url.py:70` (`inferenced_by`), the paired ML/manual fields, and +`test_import_fulltexts.py` all still import from it. + +### Validation + +```bash +docker-compose -f local.yml run --rm django pytest inference/ sde_collections/tests/ +docker-compose -f local.yml run --rm django python manage.py migrate # re-run: rows stay disabled +docker-compose -f local.yml logs -f celerybeat # no inference queue ticks +``` + +New tests: +- With `INFERENCE_ENABLED=False`, a collection whose `config_folder` is in the TDAMM list still + calls the migration task and creates **no** `InferenceJob`. *(This is the regression guard.)* +- With the flag on, the TDAMM path still creates an `InferenceJob`. +- After `post_migrate`, both `PeriodicTask` rows have `enabled == INFERENCE_ENABLED`. + +> **Test fidelity:** the existing suite patches `queue_necessary_classifications` wholesale +> (`test_workflow_status_triggers.py:428`). The two flag tests above must call the **real** method +> under `override_settings(INFERENCE_ENABLED=...)` (patching only `migrate_dump_to_delta_…​.delay`), +> or they guard nothing. + +### Manual verification +`shell_plus` → `PeriodicTask.objects.filter(task__startswith="inference").values("name","enabled")` +→ both `False`. Confirm `celerybeat` logs show no inference ticks over ~10 min. + +### Done when +- [ ] Flag added and honoured at all three sites +- [ ] TDAMM collections still migrate to `Ready for Curation` with inference off +- [ ] `PeriodicTask.enabled` survives a re-run of `migrate` + +--- + +## Phase 3 — Scrape dispatch: overrides model + job JSON + SSM + +**Goal:** `Ready for Engineering` writes a job JSON into the crawler's inbox via SSM. +(WORKFLOW.md steps 5–7.) + +### `collection_id` decision + +The scraper derives `collection_id` from the seed host when absent, and uses it for both the output +filename and the S3 key. COSMOS will **always send `config_folder`** as `collection_id`: +it is unique, `editable=False`, already the AOSS `collection_key`, and stable across renames. +Do not use the numeric PK. + +### Files + +| File | Change | +|---|---| +| `sde_collections/models/scraper_config.py` | **New.** `ScraperConfigOverride` **and `ScrapeDispatch`** (below) | +| `sde_collections/models/__init__.py` | Export both | +| `sde_collections/admin.py` | Register both (WORKFLOW.md step 6: curators edit overrides in the admin console; `ScrapeDispatch` read-only for debugging) | +| `sde_collections/scraping/job_builder.py` | **New.** `build_job_json(collection) -> dict` | +| `sde_collections/scraping/ssm_dispatch.py` | **New.** `send_job_to_crawler(collection) -> str` (SSM command id) | +| `sde_collections/tasks.py` | **New task** `dispatch_scrape_job(collection_id)` — records a `ScrapeDispatch` row on send | +| `sde_collections/models/collection.py:887` | `READY_FOR_ENGINEERING` branch: replace `create_scraper_config`/`create_scraper_job` with `dispatch_scrape_job.delay(instance.id)`. **Also** add `REINDEXING_NEEDED_ON_DEV → dispatch_scrape_job.delay(instance.id)` in the `reindexing_status` block (per the reindexing decision above — this replaces the engineer manually re-running a Sinequa job) | +| `sde_collections/management/commands/dispatch_scrape.py` | **New.** Manual re-dispatch | +| new migration `0079_*` | Creates `ScraperConfigOverride` + `ScrapeDispatch` (additive) | + +```python +class ScraperConfigOverride(models.Model): + """Per-collection overrides merged onto the crawler's own defaults. + All fields nullable: only non-null values are emitted into the job JSON, + because crawl4ai's merge_job() skips None.""" + collection = models.OneToOneField(Collection, on_delete=models.CASCADE, + related_name="scraper_config") + max_pages = models.PositiveIntegerField(null=True, blank=True) # cap 100_000 + depth_limit = models.PositiveIntegerField(null=True, blank=True) + delay = models.FloatField(null=True, blank=True) # default 0.25 + concurrent_requests = models.PositiveSmallIntegerField(null=True, blank=True) + obey_robots = models.BooleanField(null=True, blank=True) + include_subdomains = models.BooleanField(null=True, blank=True) + + +class ScrapeDispatch(models.Model): + """One row per SSM dispatch. Two jobs: (1) give the poller a freshness reference — + S3 results older than dispatched_at belong to a previous run and must be ignored; + (2) give the stall timeout a start time. Never deleted; latest row per collection wins.""" + collection = models.ForeignKey(Collection, on_delete=models.CASCADE, + related_name="scrape_dispatches") + dispatched_at = models.DateTimeField(auto_now_add=True) + ssm_command_id = models.CharField(max_length=64) +``` + +`build_job_json` emits `{"seed": collection.url, "collection_id": collection.config_folder}` plus +**only the non-null** override fields. Validate `max_pages <= 100_000` before dispatch — +the crawler raises `ValueError` above the cap and the job would land in `jobs/failed/`. + +`send_job_to_crawler` mirrors `scripts/drop_job.sh`: `ssm.send_command`, +`DocumentName="AWS-RunShellScript"`, writing to +`{CRAWLER_INBOX_PATH}/{config_folder}.json` and `chown ec2-user`. JSON must be shell-quoted with +`shlex.quote` — seed URLs contain characters that will otherwise break the heredoc. + +### Validation + +```bash +docker-compose -f local.yml run --rm django python manage.py makemigrations +docker-compose -f local.yml run --rm django python manage.py migrate +docker-compose -f local.yml run --rm django pytest sde_collections/tests/test_scrape_dispatch.py +``` + +New `sde_collections/tests/test_scrape_dispatch.py` (all AWS mocked): +- `build_job_json` with no overrides → exactly `{seed, collection_id}`. +- With `max_pages=5000, delay=None` → `delay` **absent**, `max_pages` present. +- `max_pages=200_000` raises before any SSM call. +- Status → `READY_FOR_ENGINEERING` calls `dispatch_scrape_job.delay` once (patch at + `sde_collections.tasks.dispatch_scrape_job.delay`). +- `reindexing_status → REINDEXING_NEEDED_ON_DEV` also calls `dispatch_scrape_job.delay` once. +- A successful dispatch creates a `ScrapeDispatch` row carrying the SSM command id. +- SSM failure sets `SCRAPING_FAILED`, creates **no** `ScrapeDispatch` row, and does not raise out + of the task. + +### Manual verification (real dev AWS, `sde-dev` profile) +```bash +docker-compose -f local.yml run --rm django python manage.py dispatch_scrape --collection +aws ssm send-command --instance-ids i-0b6a61d95888886f4 \ + --document-name AWS-RunShellScript \ + --parameters 'commands=["ls -la /opt/sde-crawler/jobs/incoming/"]' --profile sde-dev +# then confirm the watcher picked it up: +# tail /opt/sde-crawler/logs/watch.log and ls /opt/sde-crawler/jobs/{done,failed}/ +``` + +### Done when +- [ ] `ScraperConfigOverride` + `ScrapeDispatch` created, admin-visible, migration applied +- [ ] Job JSON omits null overrides and rejects `max_pages > 100_000` +- [ ] `READY_FOR_ENGINEERING` **and** `REINDEXING_NEEDED_ON_DEV` dispatch via SSM; Sinequa scraper-config calls gone from those branches +- [ ] Every dispatch records `dispatched_at` + `ssm_command_id` +- [ ] A real job JSON lands in the dev crawler inbox and moves to `jobs/done/` + +--- + +## Phase 4 — Poll for results and ingest S3 → `DumpUrl` + +**Goal:** WORKFLOW.md steps 9–11. This is where `fetch_full_text` is functionally replaced. + +### Completion contract + +The crawler writes **no status file**. The reliable signal is S3, **filtered for freshness** — +S3 objects persist between runs, so every check below only counts an object whose `LastModified` +is **after the collection's latest `ScrapeDispatch.dispatched_at`** (P3). Without this, any +re-dispatch would instantly "complete" against the previous run's output. + +| Object | Meaning | +|---|---| +| `failure_logs/{cid}_failures_summary.json` | Written **only** at the end of a completed run — this is the completion marker | +| `scraped_collections/{cid}.json` | The documents array | +| `failure_logs/{cid}_failures.jsonl` | Per-URL failures | + +Fresh summary + `documents_scraped > 0` → **`SCRAPING_SUCCESSFUL`**. +Fresh summary + `documents_scraped == 0` → **`SCRAPING_FAILED`** (a zero-page crawl otherwise +"succeeds" and would silently produce an empty collection). +No fresh summary after the stall timeout (measured from `dispatched_at`) → **`SCRAPING_FAILED`** +(died mid-run, or the job never started). + +Document shape is exactly seven fields — `{url, title, full_text, content_type, seed, host, depth}` — +which maps cleanly onto `DumpUrl(url=, scraped_title=, scraped_text=)`, the same contract +`fetch_full_text` already satisfies. + +### Files + +| File | Change | +|---|---| +| `sde_collections/scraping/s3_results.py` | **New.** `fetch_summary(cid)`, `fetch_documents(cid)`, `results_ready(cid)` | +| `sde_collections/tasks.py` | **New tasks** `poll_scrape_jobs()` and `ingest_scraped_collection(collection_id)` | +| `sde_collections/signals.py` | **New.** `post_migrate` → `poll_scrape_jobs` `PeriodicTask` (every 5 min), `enabled=settings.SCRAPE_POLL_ENABLED` | +| `sde_collections/apps.py` | Add `ready()` → `import signals` (currently 6 lines, no `ready()`) | +| `sde_collections/management/commands/ingest_scrape_results.py` | **New.** Manual ingest | +| `sde_collections/utils/slack_utils.py` | Wire the **already-written, never-called** `send_detailed_import_notification` into the ingest task | + +`poll_scrape_jobs` scans collections in `READY_FOR_ENGINEERING` **or** `ENGINEERING_IN_PROGRESS` +(engineers flip to the latter while a crawl runs — a collection must not strand there), **plus** +collections with `reindexing_status == REINDEXING_NEEDED_ON_DEV` (the re-scrape path from P3), +checks S3 with the freshness rule above, and enqueues `ingest_scraped_collection`. + +`ingest_scraped_collection` claims the collection **first**, then mirrors `fetch_full_text`'s body: + +1. **Atomic claim** — the status transition is the lock, executed as a compare-and-swap: + `Collection.objects.filter(id=..., workflow_status__in=[READY_FOR_ENGINEERING, + ENGINEERING_IN_PROGRESS]).update(workflow_status=SCRAPING_SUCCESSFUL)`; if it returns 0, another + ingest already claimed it — exit. (For the re-scrape path the CAS is on + `reindexing_status: REINDEXING_NEEDED_ON_DEV → REINDEXING_FINISHED_ON_DEV` instead.) + Claiming *before* the write matters: ingest can outrun the 5-minute poll, and `BaseUrl.url` is + globally `unique=True`, so two concurrent ingests would die on `IntegrityError` mid-write. +2. Delete existing `DumpUrl`s → `bulk_create` in batches. +3. `collection.queue_necessary_classifications()` (which, with inference off from P2, calls + `migrate_dump_to_delta_and_handle_status_transistions` → `READY_FOR_CURATION`; on the re-scrape + path the migrate task's existing reindexing transition promotes to + `REINDEXING_READY_FOR_CURATION`). +4. On ingest failure after a successful claim, set `SCRAPING_FAILED` — never leave a claimed + collection stuck in `SCRAPING_SUCCESSFUL` with no `DumpUrl`s. + +`tasks.py:216` `pre_workflow_statuses` must gain `SCRAPING_SUCCESSFUL` so the migration task +promotes to `READY_FOR_CURATION` from the new status. + +> Replay stays safe: a manual re-run via `ingest_scrape_results` skips the CAS (explicit operator +> intent) but still deletes existing `DumpUrl`s first, so it is idempotent. + +### Validation + +```bash +docker-compose -f local.yml run --rm django python manage.py migrate # creates the beat row +docker-compose -f local.yml run --rm django pytest sde_collections/tests/test_scrape_ingest.py +docker-compose -f local.yml logs -f celeryworker +``` + +New `sde_collections/tests/test_scrape_ingest.py` — S3 mocked with a fixture built from the real +7-field document shape: +- Happy path: N documents → N `DumpUrl`s with `scraped_title`/`scraped_text` populated → + status `SCRAPING_SUCCESSFUL`. +- `documents_scraped == 0` → `SCRAPING_FAILED`, no `DumpUrl`s. +- Missing summary → collection stays `READY_FOR_ENGINEERING`, nothing enqueued. +- **Stale results:** summary `LastModified` **before** the latest `ScrapeDispatch.dispatched_at` → + treated as absent; nothing enqueued. *(Re-dispatch regression guard.)* +- **Stall timeout:** no fresh summary and `dispatched_at` older than the timeout → `SCRAPING_FAILED`. +- **Concurrent claim:** second `ingest_scraped_collection` on an already-claimed collection exits + without touching `DumpUrl`s (CAS returns 0). +- Re-running manual ingest twice yields N (not 2N) `DumpUrl`s — idempotency. +- Re-scrape path: `reindexing_status == REINDEXING_NEEDED_ON_DEV` + fresh results → ingest → + `REINDEXING_READY_FOR_CURATION`. +- With inference disabled, ingest reaches `READY_FOR_CURATION`. *(End-to-end P2+P4 check.)* + +### Manual verification (real dev AWS) +```bash +aws s3 ls s3://sdecrawlerstack-crawlbucket0d63eba8-lhkxqnh8ophy/scraped_collections/ --profile sde-dev +docker-compose -f local.yml run --rm django python manage.py ingest_scrape_results --collection +docker-compose -f local.yml run --rm django python manage.py shell_plus +>>> c = Collection.objects.get(config_folder="") +>>> c.dump_urls.count(), c.delta_urls.count(), c.get_workflow_status_display() +``` +Expect dump count to match `documents_scraped` in the summary, deltas created, status +`Ready for Curation`. + +### Done when +- [ ] S3 completion contract implemented, including the zero-document failure case **and the + `dispatched_at` freshness rule** +- [ ] `poll_scrape_jobs` beat row created via `post_migrate`, gated on `SCRAPE_POLL_ENABLED` +- [ ] Ingest claims via CAS before writing, is idempotent, and populates `DumpUrl` without touching the model +- [ ] Re-scrape path (`REINDEXING_NEEDED_ON_DEV`) polls and ingests end to end +- [ ] A real dev collection goes seed URL → `Ready for Curation` end to end +- [ ] Slack posts an ingest summary + +--- + +## Phase 5 — Curation triggers and the indexing hand-off seam + +**Goal:** WORKFLOW.md steps 12–18, and a clean boundary for the deferred indexing work. + +### Files + +| File | Change | +|---|---| +| `sde_collections/models/collection.py:871` | Rewrite `create_configs_on_status_change`: drop the `READY_FOR_CURATION` indexer-config branch and the `INDEXING_FINISHED_ON_DEV` branch; keep `CURATED → promote_to_curated()`; replace `QC_PERFECT/QC_MINOR → add_to_public_query()` with the prod-indexing hand-off. **In the `reindexing_status` block:** drop `REINDEXING_FINISHED_ON_DEV → fetch_full_text` (the P4 ingest sets that status itself — a trigger here would double-fire); keep `REINDEXING_CURATED → promote_to_curated()`; `REINDEXING_NEEDED_ON_DEV → dispatch_scrape_job` was already added in P3 | +| `sde_collections/tasks.py` | **New stub tasks** `index_collection_to_test(collection_id)` and `index_collection_to_prod(collection_id)` | +| `sde_collections/models/collection.py:733` | Move the Slack block out of `save()` into the `post_save` signal | + +The rewired dispatcher: + +``` +workflow_status: + READY_FOR_ENGINEERING -> dispatch_scrape_job.delay(id) (from P3) + CURATED -> promote_to_curated(); index_collection_to_test.delay(id) + QC_PERFECT / QC_MINOR -> index_collection_to_prod.delay(id) + +reindexing_status: + REINDEXING_NEEDED_ON_DEV -> dispatch_scrape_job.delay(id) (from P3) + REINDEXING_CURATED -> promote_to_curated() +``` + +> **Rename the dispatcher.** `create_configs_on_status_change` no longer creates configs. +> Rename to `handle_workflow_status_change` and update +> `sde_collections/models/README_STATUS_TRIGGERS.md`. + +> **Move the Slack call.** It currently sits in `Collection.save()` **before** `super().save()` +> and issues its own extra `Collection.objects.get()` query — so a message can be sent for a save +> that then fails. Moving it into the existing `post_save` receiver (which already has +> `old_workflow_status`) removes the extra query and the false-positive notification. + +In this phase `index_collection_to_test` / `index_collection_to_prod` are **stubs**: they set +`TEST_INDEXING` / `PRODUCTION_INDEXING`, log, and return. Phase 7 fills them in. Statuses 22/24/25/26 +are therefore defined and wired but not yet driven to completion. + +### Validation + +```bash +docker-compose -f local.yml run --rm django pytest sde_collections/tests/test_workflow_status_triggers.py +``` + +Rewrite that file for the new trigger table — the existing tests assert Sinequa behaviour and +**will fail by design**. Cover: `CURATED` promotes **and** enqueues test indexing; `QC_*` enqueues +prod indexing; `REINDEXING_FINISHED_ON_DEV` triggers **nothing** (P4's ingest owns that +transition); `REINDEXING_CURATED` still promotes; no Sinequa method is called on any transition; +the re-entrancy guard (`_handling_status_change`) still prevents recursion. + +### Manual verification +Drive a collection through `Ready for Curation → Curation in Progress → Curated` in the UI. +Confirm `CuratedUrl`s appear, `DeltaUrl`s are cleared, status lands on `Test Indexing`, +and Slack posts the curation message. + +### Done when +- [ ] Dispatcher renamed and rewired; no Sinequa calls remain in the trigger path +- [ ] Slack moved into `post_save` +- [ ] Indexing stubs enqueue and set the in-flight statuses +- [ ] `test_workflow_status_triggers.py` rewritten and green + +--- + +## Phase 6 — Delete Sinequa + +**Goal:** `rewiring_decisions.md` items 4–5. Nothing in the pipeline path depends on Sinequa after +Phase 5, so this is now a pure removal. + +### Delete outright + +| Category | Paths | +|---|---| +| API client | `sde_collections/sinequa_api.py` | +| Config generation | `config_generation/` (**entire directory**, incl. `xmls/`, `plugins/`, `tests/`) | +| XML templates | `default_scraper.xml`, `sde_collections/xml_templates/` | +| GitHub push | `sde_collections/utils/github_helper.py`, `sde_collections/utils/bulk_github_push.py` | +| Health check | `sde_collections/utils/health_check.py` (built on `_get_data_to_import`) | +| Commands | `import_from_sinequa.py`, `push_to_github.py`, `sync_all_with_github.py`, `load_urls_from_api.py`, `generate_configs.py` | +| Tests | `sde_collections/tests/test_sinequa_api.py`, `sde_collections/tests.py` (legacy), `config_generation/tests/` | +| Docs | `docs/documentation/sinequa_api.rst` + its `docs/index.rst` toctree entry | +| Scripts | `scripts/push_curated_collections_to_github.py`, `scripts/update_has_sinequa_config.py` | + +### Edit + +| File | Removal | +|---|---| +| `collection.py` | `_scraper_config_path`, `_indexer_config_path`, `_indexer_job_path`, `_scraper_job_path`, `add_to_public_query`, `server_url_prod`, `server_url_secret_prod`, `_write_to_github`, `create_scraper_config`, `create_indexer_config`, `create_scraper_job`, `create_indexer_job`, `update_config_xml`, `import_metadata_from_sinequa_config`, `sinequa_configuration`, `_process_exclude_list`/`_include`/`_title`/`_document_type`, and the `XmlEditor`/`GitHubHandler` imports | +| `tasks.py` | `_get_data_to_import`, `import_candidate_urls_from_api`, `push_to_github_task`, `pull_latest_collection_metadata_from_github`, **`fetch_full_text`** (replaced in P4 — safe to delete only because P5 already removed both of its trigger sites, `INDEXING_FINISHED_ON_DEV` and `REINDEXING_FINISHED_ON_DEV`; verify no import of it remains in `collection.py`) | +| `views.py` | `PushToGithubView` (L509), `IndexingInstructionsView` (L517), the health-check/consolidation view; plus their `urls.py` routes | +| `config/settings/base.py` | `GITHUB_ACCESS_TOKEN`, `SINEQUA_CONFIGS_*`, `XLI_*`, `LRM_DEV_*`, `LRM_QA_*` — note these are all `env(...)` with **no defaults** (`base.py:341–354`), so today the app cannot even boot without dummy Sinequa secrets. Removing them is what makes clean-host deploys possible, which is why **P6 must land before P9's first deploy to a fresh host** | +| `requirements/base.txt` | `PyGithub`, `xmltodict`; check `lxml` for other consumers before dropping | +| Templates / JS | Sinequa config link in `collection_detail.html`; matching handler in `static/js/project.js` | + +### Keep (deliberately) + +- `SourceChoices.ONLY_IN_SINEQUA_CONFIGS` — a historical **data** value on existing rows. + Removing it would need a data migration; leave it. +- `Collection.config_folder` — now the crawler `collection_id` and the AOSS `collection_key`. +- `scraper/` (legacy Scrapy project) — **out of scope**; unrelated to the Sinequa retirement. + Flag for a separate cleanup. + +> `utils/health_check.py` calls `WorkflowStatusChoices.get_status_string()` (L90, L119), which does +> not exist on that enum — a latent `AttributeError`. Deleting the file resolves it. If any part of +> health-check is worth keeping, the method must be added to the enum first. + +### Validation + +```bash +docker-compose -f local.yml run --rm django python manage.py check +docker-compose -f local.yml run --rm django pytest +grep -ri "sinequa\|XmlEditor\|GitHubHandler\|PyGithub" --include='*.py' --include='*.html' --include='*.js' . +``` +The grep should return only `SourceChoices.ONLY_IN_SINEQUA_CONFIGS` and changelog/history text. + +Unset every deleted env var in `.envs/.local/.django` **before** running — `config/settings/test.py` +inherits `base.py`, so a lingering required var would mask a missed reference. + +### Done when +- [ ] All listed files deleted; `manage.py check` clean +- [ ] Full test suite green with the Sinequa env vars **unset** +- [ ] Grep is clean apart from the retained enum member +- [ ] `requirements/base.txt` pruned; image rebuilds + +--- + +## Phase 7 — `[D]` DEFERRED: indexing pipeline (test + prod) + +**Deferred by decision** — this will likely live in a different repo. Do not implement now. +This section records the contract so the seam stays honest. + +### What is already decided +- Trigger points exist as stubs from Phase 5 (`index_collection_to_test`, `index_collection_to_prod`). +- Statuses 22/24/25/26 exist from Phase 1. +- Source of truth is `CuratedUrl` for the collection, with `public_visibility = true`. + +### What must be resolved before implementing + +1. **Where it runs.** Either (a) Celery tasks inside COSMOS, or (b) an external service that calls + back into COSMOS to set status. `IndexingInstructionsView` (deleted in P6) was Sinequa's + version of (b) and is the precedent for re-adding a narrow status-callback endpoint. +2. **Two things exist in neither sibling repo and must be authored:** + - the **AOSS web-document index mapping**, including `public_visibility`. + `sde-api-scrapers` has *no* mapping definition and *no* occurrence of `public_visibility` + anywhere in its history; indices are auto-created on first bulk write. The live dev `sde-web` + index already has a mapping (`public_visibility`, `vectorized_title` knn_vector, nested + `vectorized_full_text`, `collection_key`, `division`, `document_type`) — treat that as the + reference and pin it explicitly rather than relying on auto-creation. + - the **validation script** (Phase 8 below). +3. **Field-shape mismatches to bridge:** + - crawl4ai documents carry `full_text`; the `sde-api-scrapers` vectorizer is hardwired to + `data_product_desc` (`api_processor.py:87`, `sagemaker_vectorizer.py:135`). Either rename on + ingest or parameterise the vectorizer. + - crawl4ai documents have **no `id` and no `version`**, both required by the AOSS upsert/diff + logic. COSMOS must mint them — `id = f"/SDE/{config_folder}/|{url}"` (matching the existing + dev index convention) and a content hash for `version`. +4. **Reusable components** if porting: `uploader/text_chunker.py` (`nasa-impact/nasa-smd-ibm-st-v2`, + 250 tokens / 25 overlap), `uploader/sagemaker_vectorizer.py` (768-dim mean-pooled, then binary + quantisation with a seeded rotation matrix — *do not alter the quantisation*), + `uploader/opensearch_client.py` (`AWS4Auth`, service `"aoss"`, **not** `AWSV4SignerAuth`), + `uploader/api_opensearch_upload.py` (AOSS ignores custom `_id`, so upsert requires a lookup first). +5. **Dependencies this adds:** `opensearch-py`, `requests-aws4auth`, `numpy`, `transformers`/`tokenizers`. + Per `DEPLOYMENT.md`, the tokenizer must be **baked into the image** (`HF_HOME` + download step + + `HF_HUB_OFFLINE=1`), or the first indexing task on a fresh container fetches from HuggingFace on + the critical path of a Celery task. +6. **Deletion safety.** `sde-api-scrapers` aborts a run when deletions exceed 2% of the index + (`DELETION_ABORT_THRESHOLD`, added after a 2026-05-22 incident that wrongly deleted 1,359 + records). Any COSMOS indexing path that deletes must carry the same guard. + +### Done when +- [D] Deferred — revisit once the target repo is chosen + +--- + +## Phase 8 — `[D]` DEFERRED: validation script and QC reporting + +**Deferred with Phase 7** (it validates the index that Phase 7 writes). + +Per WORKFLOW.md steps 22–25: compare **total document count** and **document titles** between the +test OpenSearch index and the collection's `CuratedUrl`s; post the result to the `sde-data-curation` +Slack channel; the curator then sets `QC: Perfect` / `QC: Minor Issues` / `QC: Failed`. + +Note the QC statuses are **curator-set from the report**, so COSMOS already has everything it needs +on the status side after Phase 1 — only the report itself is missing. Neither sibling repo contains +any count/title comparison tooling or Slack integration. + +### Done when +- [D] Deferred — follows Phase 7 + +--- + +## Phase 9 — CI/CD: deploy, rollback, preflight + +**Goal:** implement `sde_collections/DEPLOYMENT.md`. Independent of Phases 3–8 — **authoring can +run in parallel once Phase 1 lands**, but the first deploy to a *fresh* host requires Phase 6: +the Sinequa settings are required env vars with no defaults (see P6), so until they're deleted a +clean host needs dummy Sinequa secrets to boot. + +> **Note:** the earlier draft of this machinery is **not recoverable**. This clone has a 2-entry +> reflog, no stashes, and zero hits for `preflight_aws` / `validate_deploy_env` / `ecr.override` / +> `OPENSEARCH_ENDPOINT` across every commit in every ref. The only prior art is commit +> `08c3ef30` on the unmerged branch `94-add-cicd-…`, a 51-line `deploy.yml` stub with a placeholder +> role ARN and everything after the AWS-credentials step commented out. Write from scratch. + +### Files + +| File | Content | +|---|---| +| `sde_collections/management/commands/validate_deploy_env.py` | **New.** Fails if required settings are missing. Once the deferred search endpoints exist, it must also **refuse a host where `OPENSEARCH_ENDPOINT_TEST == OPENSEARCH_ENDPOINT_PROD`** (that would make the QC gate decorative) | +| `sde_collections/management/commands/preflight_aws.py` | **New.** SSM reachability to the crawler instance and S3 read on `SDE_S3_BUCKET`, using `get_boto3_session()` from P0. Reports each check independently rather than aborting on the first failure. AOSS/SageMaker checks are added with Phase 7, not now | +| `config/urls.py` + a `healthz` view | **New.** There is **no health endpoint in the repo today**; the deploy smoke checks need one. Minimal 200 + DB connectivity, unauthenticated | +| `.pre-commit-config.yaml` | **Fix:** the gitleaks hook passes `--config=gitleaks-config.toml`, but that file does not exist and is not tracked — the hook fails instead of scanning. Add the config or drop the arg | +| `scripts/deploy.sh` | **New.** The single definition of a deploy, in `DEPLOYMENT.md`'s order: fetch artifact → `validate_deploy_env` → backup (prod only) → `migrate` → `docker compose up -d` → smoke checks → rollback on failure | +| `ecr.override.yml` | **New.** Compose override pulling the Django image from ECR | +| `.github/workflows/ci.yml` | **New.** `run-tests` and `django-checks` (`check --deploy`, `makemigrations --check --dry-run`) on PRs into `dev`, `staging`, **and** `production` — today only `dev` is covered, so the release path itself is untested. Drop `init.sh`'s per-file loop (a process per test file, re-paying Django setup each time) in favour of a single `pytest` run | +| `.github/workflows/deploy-staging.yml` | build → ECR → SSM → `deploy.sh --environment staging` | +| `.github/workflows/deploy-production.yml` | staging-digest check → SSM → `deploy.sh --environment production`, gated on the `production` GitHub Environment | +| `.github/workflows/rollback.yml` | Manual redeploy of a named image tag | +| `.github/workflows/secret-scan-history.yml` | Weekly full-history gitleaks, report-only | +| `.github/workflows/run_full_test_suite.yml` | **Delete** — superseded by `ci.yml` | + +All `deploy-*` and `rollback` workflows gate on repo variable **`CD_ENABLED`**; until it is `true` +they skip. + +> **Ordering matters:** `validate_deploy_env` runs *before* anything mutates. A host missing +> `OPENSEARCH_ENDPOINT_PROD` must fail there, not inside a Celery task that has already half-written +> an index. + +> **`celerybeat` must be recreated on every deploy.** The inference `PeriodicTask` rows (P2) and the +> `poll_scrape_jobs` schedule (P4) are written by `post_migrate`; a beat process left running on the +> old schedule silently ignores them. + +### Validation + +```bash +docker-compose -f local.yml run --rm django python manage.py validate_deploy_env # expect clear failure locally +docker-compose -f local.yml run --rm django python manage.py preflight_aws # against sde-dev +docker-compose -f local.yml run --rm django pytest sde_collections/tests/test_deploy_commands.py +bash -n scripts/deploy.sh && shellcheck scripts/deploy.sh +``` + +Tests (AWS mocked): `validate_deploy_env` exits non-zero on a missing endpoint and on identical +test/prod endpoints; `preflight_aws` reports each check independently and does not abort on the +first failure. + +### Manual verification +1. `aws ssm describe-instance-information --filters "Key=InstanceIds,Values=" --query 'InstanceInformationList[0].PingStatus'` → `Online` +2. `aws ecr describe-repositories --repository-names cosmos` → no error +3. Deploy to **staging** only, then **rehearse a rollback on staging** before trusting production. + +### Done when +- [ ] Both management commands exist with tests +- [ ] `scripts/deploy.sh` passes `shellcheck`; runs end to end on staging +- [ ] Five workflows added, `run_full_test_suite.yml` removed, CI runs on all three branches +- [ ] `/healthz` endpoint added and asserted by the deploy smoke checks +- [ ] gitleaks hook actually runs (missing `gitleaks-config.toml` resolved) +- [ ] **Production DB credential rotated** — it is live in committed `HEAD` at `SQLDumpRestoration.md:101,117` along with the RDS hostname; scrub the file after rotating +- [ ] A rollback rehearsed successfully on staging +- [ ] `CD_ENABLED` prerequisites documented as met (or explicitly pending) + +--- + +## End-to-end verification (after Phases 0–6) + +```bash +docker-compose -f local.yml build && docker-compose -f local.yml up -d +docker-compose -f local.yml run --rm django python manage.py migrate +docker-compose -f local.yml run --rm django pytest +``` + +Then, against the dev AWS account: + +1. Create a collection in the admin with a real `seed_url` and a `division`. +2. Set **Research in Progress → Ready for Engineering**. +3. Confirm the job JSON reaches `/opt/sde-crawler/jobs/incoming/.json` and moves to + `jobs/done/`. +4. Confirm `s3:///scraped_collections/.json` and the + `_failures_summary.json` both appear. +5. Watch `docker-compose -f local.yml logs -f celeryworker` — the poller ingests, status becomes + **Scraping Successful**, then **Ready for Curation**. +6. `shell_plus`: `c.dump_urls.count()` matches `documents_scraped`; `c.delta_urls.count() > 0`. +7. Curate, set **Curated**, confirm `CuratedUrl`s exist and `DeltaUrl`s are cleared. +8. Confirm Slack received the ingest summary and the curation message. +9. **Re-scrape:** set `reindexing_status` to **Re-Indexing Needed** on the same collection — + confirm a *new* `ScrapeDispatch` row, that the poller ignores the old S3 output until fresh + results land, and that the collection reaches **Ready for Re-Curation**. + +Steps beyond 8 (test indexing, validation, prod indexing) are **deferred** — status will stop at +`Test Indexing` until Phase 7 lands. + +--- + +## Cross-cutting risks + +| Risk | Mitigation | +|---|---| +| Colour-map `KeyError` breaks the collection list/detail pages | P1 converts both lookups to `.get(..., "btn-light")` and adds a parametrised test over every enum member | +| Three TDAMM collections stall forever when inference is disabled | P2 short-circuits `queue_necessary_classifications()` itself, not just the beat schedule; regression test included | +| Credential-model mismatch (static keys in code vs instance role in `DEPLOYMENT.md`) | P0's `get_boto3_session()` is the single entry point; no new static-key call sites. Helper reads `SDE_AWS_*`, never the django-storages `AWS_ACCESS_KEY_ID` (absent from `base.py` → `AttributeError` under test, and wrong credential scope) | +| Zero-page crawl silently produces an empty collection | P4 treats `documents_scraped == 0` as `SCRAPING_FAILED` | +| **Stale S3 results ingested after a re-dispatch** | P3's `ScrapeDispatch.dispatched_at` + P4's freshness rule: results with `LastModified` before the latest dispatch are invisible to the poller | +| **Re-scrape (reindexing) flow severed when `fetch_full_text` is deleted** | P3 dispatches on `REINDEXING_NEEDED_ON_DEV`; P4 polls it and flips `REINDEXING_FINISHED_ON_DEV` itself; P5 removes the old trigger branch; P6's deletion is then safe | +| Duplicate ingest from the 5-minute poller | Ingest claims via an atomic status CAS **before** writing (ingest can outrun the poll interval, and `BaseUrl.url` is globally unique — concurrent writes would `IntegrityError`); manual re-ingest stays idempotent by deleting `DumpUrl`s first | +| Deleting Sinequa breaks unrelated GitHub metadata sync | P6 keeps `sync_with_production_webapp` (COSMOS prod webapp) and removes only the Sinequa-configs-repo paths | +| `config/settings/test.py` inherits `base.py`, so stale env vars mask missed references | P6 validation runs with the deleted vars unset | +| `factories.py:49` has a suspect `tracker = factory.Maybe("workflow_status")` | Watch during P1/P5 test rewrites; fix if it interferes with `FieldTracker` | +| Migration rollback safety | All migrations here are additive (new model, choices-only `AlterField`); `DEPLOYMENT.md`'s "image rollback is a complete rollback" property holds | diff --git a/WORKFLOW.md b/WORKFLOW.md new file mode 100644 index 00000000..f2f93a0d --- /dev/null +++ b/WORKFLOW.md @@ -0,0 +1,230 @@ +## SDE Data Curation Workflow — Dev Notes + +![SDE Data Curation Workflow (COSMOS + crawl4ai)](./WORKFLOW_DIAGRAM.png) + +> The diagram above is the canonical one-page view of this workflow; this document is its authoritative text. Where the two disagree, this document wins — the known differences are listed in [Where the diagram and this document differ](#where-the-diagram-and-this-document-differ) at the end. Deploy and rollback for the pipeline this workflow describes are in [sde_collections/DEPLOYMENT.md](./sde_collections/DEPLOYMENT.md). + +### Phase 1 — Source Discovery and Setup + +1. The curator identifies a new source for ingestion. + +2. Update the COSMOS collection workflow status to **Research in Progress**. + +3. Finalize all required metadata for the new source, including: + + * `seed_url` + * `division` + * `collection_name` + * Any other required collection metadata + + + +4. Update the workflow status to **Ready for Engineering**. + +5. Send the collection `seed_url` to the scraper running on EC2 (the `sde-crawl4ai-scraper-v1` instance) by delivering a scrape job JSON to its inbox via **AWS SSM Run Command** — the instance has no inbound SSH; SSM is the access path. + +6. When the collection requires changes to the default scraper settings, such as the maximum number of pages, manually add the applicable configuration overrides to the Postgres table through the admin console. + +--- + +### Phase 2 — Scraping and Ingestion + +7. COSMOS generates the job JSON from the collection `seed_url` and any scraper configuration overrides stored in Postgres, and SSM writes it into `jobs/incoming/` on EC2, where the inbox watcher picks it up. + +8. Run the scraper using the delivered job configuration. + +9. Update the collection workflow status based on the scraping result: + + * **Scraping Successful** when scraping completes successfully + * **Scraping Failed** when the scraper encounters an error + + + +10. The scraper saves the scraped data to S3 (`SDE_S3_BUCKET`): documents at `scraped_collections/.json`, failure logs at `failure_logs/_failures.jsonl` and `_failures_summary.json`. + +11. Load the scraped data from S3 into the COSMOS `DumpURL` model. + +--- + +### Phase 3 — Delta Processing and Curation + +12. COSMOS calculates the differences between the latest scraped data and the existing curated data. + +13. Load the calculated differences into the COSMOS `DeltaURL` model. + +14. Update the collection workflow status to **Ready for Curation**. + +15. The curator reviews and curates the delta records. + +16. While curation is underway, update the workflow status to **Curation in Progress**. + +17. After curation is complete, update the workflow status to **Curated**. + +18. The **Curated** status triggers the merge of approved `DeltaURL` records into the `CuratedURL` model. + +--- + +### Phase 4 — Test Indexing and Validation + +19. For collections with the **Curated** status, trigger the indexing pipeline against the test OpenSearch (Serverless) instance — the same chunk → vectorize (SageMaker) → bulk-index pipeline the API scrapers (`sde-api-scrapers`) use. + +20. Index the collection with `public_visibility` set to `true` in the web-document schema. + +21. If test indexing fails, update the workflow status to **Indexing Failed on Test**. + +22. After successful test indexing, trigger the validation script. + +23. The validation script compares the following between the test OpenSearch index and the curated content in COSMOS: + +* Total document count +* Document titles + +24. Post the validation results to the `sde-data-curation` Slack channel. + +25. Based on the validation results, update the collection workflow status to one of the following: + +* **QC: Perfect** +* **QC: Minor Issues** +* **QC: Failed** + +--- + +### Phase 5 — Production Indexing + +26. Create or reference the list of collections that have passed validation with either: +* **QC: Perfect** +* **QC: Minor Issues** + +27. Trigger the indexing pipeline for the validated collections against the production OpenSearch (Serverless) instance. + +28. Keep `public_visibility` set to `true` during production indexing. + +29. If production indexing fails, update the workflow status to **Indexing Failed on Prod**. + +30. After successful production indexing, update the COSMOS collection workflow status to the production outcome that mirrors the QC verdict the collection entered with: + +* **Prod: Perfect** — for collections that entered from **QC: Perfect** +* **Prod: Minor Issues** — for collections that entered from **QC: Minor Issues** + + A collection that passed validation with known minor issues still carries those issues in production, so the production status records that rather than flattening it to "Perfect." Both statuses already exist in COSMOS, and the Slack notification map already covers both transitions. + +--- + +### Phase 6 — Failure Handling and Reprocessing + +31. A developer reviews collections with any of the following failure statuses: +* **Scraping Failed** +* **Indexing Failed on Test** +* **Indexing Failed on Prod** +* **QC: Failed** + +32. The developer identifies and applies the required scraper, configuration, data, or indexing changes. + +33. For scraping failures, rerun the scraper and continue from the scraping and ingestion phase. + +34. For test indexing or validation failures, invoke the indexing pipeline against the test OpenSearch instance with the required updates. + +35. Invoke the validation script again for the QA-failed collections. + +36. Post the updated validation results to the `sde-data-curation` Slack channel. + +37. Repeat the test indexing and validation process until the collection reaches either: + +* **QC: Perfect** +* **QC: Minor Issues** +38. After the collection passes validation, continue with the production indexing process. + +--- + +## Repos for context +- /Users/bbenson/projects/sde-crawl4ai-scraper-v1 +- /Users/bbenson/projects/sde-api-scrapers + +## Workflow Status Progression + +Research in Progress + + ↓ + +Ready for Engineering + + ↓ + +Scraping Successful + + ↓ + +Ready for Curation + + ↓ + +Curation in Progress + + ↓ + +Curated + + ↓ + +Test Indexing + + ↓ + +QC: Perfect / QC: Minor Issues + + ↓ + +Production Indexing + + ↓ + +Prod: Perfect / Prod: Minor Issues + +### Failure Statuses + +Scraping Failed + +Indexing Failed on Test + +Indexing Failed on Prod + +QC: Failed + +Collections in a failure status return to the applicable development, indexing, or validation step after corrective action is completed. + +--- + +## Workflow Status List + +The fourteen statuses a collection is expected to move through, in workflow order, with the `WorkflowStatusChoices` member and stored integer for each (`sde_collections/models/collection_choice_fields.py`). Statuses 21 and 23–25 are new for this pipeline; everything else already exists. + +| Status label | Enum member | Value | Set by | +|---|---|---|---| +| Research in Progress | `RESEARCH_IN_PROGRESS` | 1 | Curator | +| Ready for Engineering | `READY_FOR_ENGINEERING` | 2 | Curator (triggers scrape dispatch) | +| Scraping Successful | `SCRAPING_SUCCESSFUL` | 21 | Ingestion task | +| Scraping Failed | `SCRAPING_FAILED` | 23 | Poller / ingestion task | +| Ready for Curation | `READY_FOR_CURATION` | 4 | Delta migration task | +| Curation in Progress | `CURATION_IN_PROGRESS` | 5 | Curator | +| Curated | `CURATED` | 6 | Curator (triggers promote + test indexing) | +| QC: Failed | `QUALITY_CHECK_FAILED` | 12 | Curator, from the validation report | +| QC: Minor Issues | `QUALITY_CHECK_MINOR` | 18 | Curator, from the validation report | +| QC: Perfect | `QUALITY_CHECK_PERFECT` | 13 | Curator, from the validation report | +| Prod: Minor Issues | `PROD_MINOR` | 15 | Prod indexing task (entered from QC: Minor Issues) | +| Prod: Perfect | `PROD_PERFECT` | 14 | Prod indexing task (entered from QC: Perfect) | +| Indexing Failed on Test | `INDEXING_FAILED_ON_TEST` | 24 | Test indexing task | +| Indexing Failed on Prod | `INDEXING_FAILED_ON_PROD` | 25 | Prod indexing task | + +Two further statuses — **Test Indexing** (22) and **Production Indexing** (26) — exist only while an indexing task is actually running, so a stalled task leaves the collection visibly stuck rather than silently unchanged. They are implementation-internal and deliberately absent from the list above and from the diagram. + +The diagram labels the QC statuses `QC: TEST_FAILED` and `QC: TEST_MINOR_ISSUES`, emphasizing that the QC gate is a judgment on the *test* index. Those are the existing **QC: Failed** (12) and **QC: Minor Issues** (18); no rename is proposed, since both values are live in production data, the Slack map, management commands, and the UI dropdowns. + +--- + +## Where the diagram and this document differ + +Three places where the diagram is loose or wrong. This document is correct in all three; they are recorded so the diagram's wording is not propagated into code or docs later. + +1. **The crawler builds no "config template."** The diagram's Phase 2 step 1 and implementation-flow step 5 say `watch_inbox.sh` creates a config from the seed URL and overrides. It does not — `watch_inbox.sh` only watches the inbox with inotify and launches `run.py` under `flock`. `run.py` merges the job JSON's non-null overrides onto the crawler's own defaults; there is no separate template file or templating step. +2. **Phase 6 is broader than the diagram's box.** The diagram's Phase 6 shows only the indexing failure statuses and the loop back through validation. The failure-handling phase above also covers **Scraping Failed** and **QC: Failed**, which re-enter the pipeline at the scraping and test-indexing phases respectively. +3. **Phase 3's step numbering slips in the diagram.** Its steps 3 and 4 both land on "Curation in Progress," and the transition to **Curated** is only implied by step 5's merge. The authoritative sequence is steps 12–18 above: deltas loaded → Ready for Curation → Curation in Progress → Curated → merge into `CuratedUrl`. diff --git a/WORKFLOW_DIAGRAM.png b/WORKFLOW_DIAGRAM.png new file mode 100644 index 0000000000000000000000000000000000000000..10fe1548beb8d3b90ed0434b712b99ee65dd1bc3 GIT binary patch literal 1767220 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

ueOyCFp;G40{q#-7`*c!}C*yJrE0-pbqgxsr{ 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

N0kt1BXMB(B^@`i^5 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

9CzL|3z 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

0+{E0>@Uq!9ffNe^ zj5CVMbBhf~8Czi>(W+1dGML#U%M$CLdDYlfrrvN{Dr-RUAu+PZVn$eKhgy2h8bK*Z zSV!rqwyaA=3-Zi51NA4|Mlz2rW7Dz$E|eu2MHsCn0RR(mwe6*dN#kZrY@p3p=Y3^= zZvRXIZ7T#LCi0L&TND-YL5_;F2q!NC>JJiKNC0WdnTb-$t<6A&dc3W_)D4=VrmwlR zBtKKaL9sUDDaTE@uIsoQxmr|emrj7C2%YJy2LvQ3)e)=DzwqiI2k$p(hi%kXK_G+> zLa6wh48v|BkRq^RV=@Q=-w%Qy@Poh)d?9=x0@ar56go~C0Ju8#G~`uD1X6+!QphmU zCWI7127w5K@O|I&0|3Zmy_ReMVP2A^eY2)js!swS2t-i7xjxg>3IGef{O0XBZ@YyB zBJcwd2pIwm0LzyzefHUB*Kb@80D%-iAUw}kLCI_;`{kDl7A*b_0Hl;cO3x2G&liC& z)yXa-r4R}OLIi3(Sja|@l+$@Hn+h@Fvj27&Wo8@Lu?lr~J|2hFKdsVjF-u+wR^KM( z^Zr9;O*<6vSq>z58w*ES>P5;xT3m-&?UJMbAyE?OEvhJ7&z#o=2xm}o4ZOBt2yLd& z$(O)<32rLAcKybiZhhdkdmexNy-)u6YuR?ghXTMSAAdfe@6fX^y#B9Mn;v=esWpH9 zy3Mem0C2&1GeyA1kKgm*r(gf-oA2(p`{8{LoVxW^TU>hH3;;;E4tGdm06?WhMW;+Z zYP+3xZ*E$q<4Z~>AOHxGL6DVd`Jp7=&kz721VJY7{BB)4^&Qwpwl>U~al+)o_v_ZR zV_9(#LypK9G63k(rItC)=B6e^30*pM7&T(p7jHg(^_3R`05TLohRFAQ@0W$&oG|5x zal4FI_RliWy4KqB8#;Ha9yw~q>#n+X<+{zwR;3DTyyJ{(rFGyS3WbPz^+Rc+Yi~@N5?(b$E@YD~V zuPc(39jiKa>`+%(R^veFg3nf7c>L>g?)u$HamE;T7&4G*J)e<&x?OF{s02F_dgdb# zLa+Rjk-??{(4jvab7(ECNwy1_i$Wd$Q7|M%R%<{o^HH`{n;1>oSv4YETOnlq2@QSA zsHE6JKN~jF7yECrrW|rD7$f?U-Nfi79=^z<3-VsZTa9}Ef3l3MphNs|oLfv`Wu@h9 zX=xAX`7FzDOcv_mDY96?8f)FaQ~DsbC<~9EDPX z2tWoTd<+CJ7Tmrce)T0QlvqL_J-M+}HnkG@P{OdxrN?fB_wNRg4WnS{yjLkB>0^aE z!g)xF{UNOZO|g)m!W9h^p)2C6|x6Kw-$vAmhzFX2aFm6z| zOjzbnxeas_L@+ac00_BLmXP$~3BW$NIOhs^)R?Q`)130QC)ZYO%FJs^ceF|2ZMro1 zG*?b2upKQGADZ?}F$T=|gE_!NEU$z)NWBZReuZEK;0ZuzM)^+{q9hWMgp?$uAzsA> zDrra+GvL{}E~YiZxLFQaB+-%Z%Ho4+xWfL#By-rMbHWo5bA(Eg)J zc1l!|2UVu~piio?ADaO&!37&66MD(1F{cG3%<^jN zfBQP7>@1BQFVbea$=a+CfcmX13bY_ayL_w}9VCs=A1;>+PijjVdO7hglP42(-%vgQ z2x&EEiT!xD{q?9x$($O}EOLxjK*wj}h)Ent))VoV*l}iyYQQ#d- zaDa%URJt^JLWaSjW3e!y-fYL5D70XulztEZz=MxJb@Xwk|MAD)0H7ix!uq4)1a?S} zYp-X<@pcrlQ)5RX0FX+#QV7Oe#k;+G^?Yy6i>hYVb%}_% zOiBy_2|%1903#$R!>KnZNi8xDA+nfR4GLjWn^ByfFtMzHqC=;W18G-c?4G=$w{0?w zKm*8K1Cfu4;&50RAqSYYnnqOTeaLWcQc|~((#)^P6d%jDbQ7eG<-u^HL5gNzkN{YC zK9CY9q>eMfXe)i|$gey~7ebu`+MZAfkB~9a(-#C#R8-i|+;H8jn^SJ_2~&?bdHUf5 zwEupS?!M>tOK-UK-uvz@besz=Ja4~!$N9d$_3$m;p7X+tb1ypXv{PBe|2 zW#^<_0szKYQBh%WwN-8d7OqT~p;a41m&wPI+~O z>oS*P=T4O%ypA2J@4V}pGiRPZWa#!tRM)M`^AFz-L=2H}1^~6yWtC-Ri@*J$Tc

n{9-{_MY+QrDQVDvK1ZH#+!?dZzV^CnI(F_+(Ye+OC=l}C z{l-22%Fd%lj{tyuciRyGw;8bo0DzF?HPz{YRDsJn*ValQIcHfR2KVg+07p+gWX`@dV-#$GyuHR78xfcPHmlmvC^kX)Y0f4vOo4fZO6FYURdE?EuCm%ii#b+Mdch6lh z$zh7hjC(+~Jk0MY#pyjk54o4AB(CJ*bz1AV;>I;VxKV|N~ zl%f$xrfE~&j`3N-lZ>%v4FKu-jC2bvT`TB-X6Pt9yigsoC8OnI)b{wP$^4(?S#*ne=I^0r$6yNy*j@lha<0AUuqB3C{3>UcPe4IB|7N-0TNY8DY03;V(yKyHQ|b*G5J#viH9IH2ko~+))i-fjV9^n)3Q=46|?ekpbY)1$E>y@yS zl5cY!nkPnd5hXCF?Lt*5+?R$$AvSxA<56RMr&xv{3^PgnCMrS{A9mCwB07vARE?q9 z3W@-H0uI192O=5fUFOGLGS(1=wJc(>NYB^=R(GP-f$XwLIfkIuDkmgq*>f!}O*QQ}#fdPGp%4>| z(biX9*#A|4B-+g*1+}DV&solE<3T>O=aGBuzypLNa$t&SJ7d2YLQy=XL)B8xH&I*L zciYHK0`RW`0idlCj6ViFE}Bc)m4r43RwT|4QfU8#?mt??YGhNQFA>18K?uPxUnx(} zmNXD0dXnMuHUK9T3>AV1&;cQ&>%iuX4f7ZLxN&nM00e;uk)kmv0g-^ARB2-@?2_7l z3=oqvlcbc0@|C>61ml}wYF}~W9ZG0}GXEpF#=(r)V30#giKcDAZVQt(`(VpPOhD;l&t-#EnxM3d1+XhA|&mHgJqdQ7wyQhycD1 z0Px}qbNcn|Gq8Ve0N@U5Xlhxw_y-4Y%dG|%mlOj@09>^AJHItEeCSrCWhFr%9LHI` zcHQEI-}UX=vv1!%s$Ngf{4W=FuIsS5z5yu1Q0hKODfJXO;^v0NRjb$6)mB$llx148 zE7xwQs;VFn)Hk*kmlS{g>4M&Ux~GeZ(k@f3r;a!sbfiDN)l|`)Y#J0+M{<}Ce!NqetBt$6!Pca{@$>5-LRosR8*7) zLS{Ta{?0PRp_n`*6{hdEb1DPVZ!|Dx5jUkLGDOr4|vh)H=L ze$N>5yliW0Yf(`#=iKuGsj|=kr9=QOgijKH958`71PRC}+BZx46e0K&b{XRShh;3G zW_uZla>I@Qz?dVYtg0x#>Y`awjykNQxTsIhuBvlx%02Of$wwV=;Mxrv%F0TsD=So^ zK@bcW*z2|DA6mV3!=_D*6%}QjJJqQE`hKwOHp4%D|E0PPHGUup(*;2wCyw1|(U_``A-^PaGo&Il~FNjTy7^Cu^%XRtw2kbq1mz|1> z3nUR|aMw*2o;>yNRFT`SXV(?0Hgu}14ulxGMgK3}f2yLS#P@^KW=uQoq+=>ei-eH7 zju}1w-50uatcFnfaR7Md*gqVD{`;ha9n@ zPtUHOezkD(rsh3&-w6Q5?Y8SL-+j@swhDmMJVS!4$xMzZIyQmrxGj?FzU5_*gx0~_ z2zR1!+akg|<`WSR27n%hpaPhK)HRqoK}Q`+Op>I-`I>cW>Nhp?@7FI7fs~f6Q#3D$ z`~Y;yPk1OSO5_weyn?B+oUfFzx~;xXV>Awwq&s-M#lP9 zf+^Gsd5}n9{X$5_kSSwSnK=ZeMN`}wY@3nu%FM`T(xBKLNX|$BkxWE_LPHu+N5^!N z7;RH$99)n>xUReS`=8%>d+z@G>^^WnU(fRZks)%n8N(F7jE1rBjPB1*CzQC+ zKOqQYAhJ>QVBf|}OacIem8({E>C}a!5P@VInL3Z1aX=0X3As9XKAe41A0h&vlng+v zm}=&`JF96XlbLf9(VrDHAmSJ-%&AAhgxebcSA<$Epp$TF6 zB#N?_Iw)Rg)tJi!76UTI;{D7?cn`m!1RY0~q(Xz4&PvdTL4M5O&TpC<`K9d{V911^ zcvcgD^#gTyfQSHzF{X60_5c%3f%(>?EsCn2pFh2BBuvxQqv+IC?{rBzeP{ z9f^W0xkMhnjG~AXhK^Pnk&@_LqB|BB=%7nZ3wFn`t(h$%6M=$UuFO-J)jY-vN5!nb zx5gWV`2vd6Nl2h@e-Ld9Da+5c8l{wg82EnH%a)Xs5|I=_Eht6K5kUPNqEZdKmGFTO z)s~c0ZS<>+%kV*X6M3>KLMEjU!UWeCW11PI5MkyGV_`0ZRLg$=F${X35JFLrIyM3T z)rse-8=SN7E2a1tLj)5Op<~G0a00`oO29U&=ZkhdTpT)Lcu1b zfH1d11@b_WBnh5RQc6m>0Df&{c~L=u`ih8z5CoV`xq%R8%(`;it~(xf(4N_B7LWy@ z`OQ?46A`Ih>=h~6#&Zs3s-0qu=MoPaU`*}igxec{pyM^jF z60K3FA$)`ow^!QhNOvC4Lh)~nrh>;5 zvvI98tU7xL0RaB^XZ7~mZ&O`WDM@bJwE2XSW_>z;;f7T!4m&@5o>)+?0N1nRjw*RHl=?&}GpK$!K7oR(G{f70Yoqog~Sx%{f@ z=f3}GkKWxs`{>hdT{}Ga%;TfC+bZLETm|RCL_jc7%LKo2$vgkk_{>z26r#<`Z8k{q zj%~NK;mC!R=V?AK^=Yq{5)YHrq7?zLt3&``#F;c238WMRB$08{{)pH0rI%e^T2j)~+=8e!7h?b*gFq(?0mD!(B+ojD^fy}nhi^!0P0j5g>WK)L z-po1=Vo*w1TvRlC%YnJLD=955DJ=$lOmHai1L1I|TbH`7ojVeN6oNFaiV6$*cJHFV zR40wP4y&uGQ0eN7q3R<56&9q53TjA7L`j2csD_LAvFrZ&Ag>b3n z(=^oSbn1`;_L;Qb5#Rjq$A}?)g%BKBaY5Pu>2mIt76Sn1e9*u?>Z{u73VW;(ArK;+ za))m7j`~9?2PCMw3L(V&Yw#@p05L_8U1OOn3gb2)Bfd)~fdA8Ai z_v!DJ{kfrU$NtR?EoEKOXWYJ5x8W(qnGkaEJF71^;`O2qZYqUMYqO8v^2zy6?hQ;u z2tY@rVlfd#8=N~!m#sSPq_aPMe=epq3sTu9O)f$r`9QnALYcB(#kh=^R=y0y^Z&?l!B0pS(;*6#>@}I)C z5Q0FsuKU9eKizQiU0VzuFmOO$-wyyt8L~o%REoXy;;VN*@YGX}-CNtC+F_hA6zV7# z3A(G1+{z6?fh7qo;v}miT6k68ZY7PNXa-M5CH=q#=%V?=W32A z>Lmdn0s|=p=c(ZLSJ|IS!- z?^RBWqt4L|LDEZ?h{$!_AAbCKQ$tfhL7{RPeBbNbv93qAPL31pIbaY<+Er67u;oGK z1}G93w%%K1!gCCAY*e)u392XzWA&RG{$9GguC7B}Z3iP@0YFOWIL^vds~0Z%u5a(& z0|)kPZOw!WBkZA)#27;W#+k!75d}h-4irZ2Lk7<^VbpY=a_ZV7HnR9R8oTH)v&hp( zSUt-7)CcQDs8LR)^6QjPu@I=Er*R!*!WI!ciJr6pf6~cm*B>(o%3CI4z62sM3=I&n z$Z-)8NGS5AP~gjODGWm32gSw37hib6s+H?*zx&Q!J$kgZW)OifBomS(64vrFmC+UI z4Gd4OHM~nif-vRa^NWAE>Xmo@TD}q`kW_3fA9`cnh%I_wb>O7YJ-W7J1IEH#9~m;p zJI#P$w8NGOAzQ_Sjp5}uUUMX)mN=9!IV0yPEQMiT&3j9F*;XlH^tY*ra*pC{Lq$fy zQ_IBgu^lXfNJ1KWH*B*l7hMaG7;J6OQpn~+GK}tN+pq1oPt=bj_|X@bcw&!kEHz$l zo)=dK2~6cR%#z^6^hgfy5x%T1^RlqDoGpwSCfY|plv;)e5fCv%wVEN?sEkMg6%`aN zUAFYnOE0VI)a8;(FDm3t;CY;L;G7tzkknYaA-2#m0=+k_O>*r>OVh>hA7k^yUmyVE z+}`>|t+bO;GR7RoQLXqvps>L?S2|0GKw&$TawBv~i40X-#lGzNg_I8G=r{l%rSScL z5ExS-Fph{p5I79gDpUaEoTXB(5K@vf#-zeCAiAzAr9=eBN!cw1LZC!qS*#ugGBs%w>E+UXp26{8YmQ1#yvWzj#kUjg-Yp>3kd+RM% zH8w4~_~J7<)Ks2!>bZ@ZT7FsZVe9(kOO`Ev?1^W-{o&WEufJ{Dl%p4Y@xdK8Tyx*u zkAL*(mybOD!k1tD^xo?)eEaD;2k$p&Q^RH*Y`8}ZZci)NoYBiq^(P#^+f09H<55Cp}=g}?o=|+nzy>QWo)ioV2y68$|Ebx6HMGy#kzb7SN%A!$O9YmG zocuJZ+uTQQ5fY8YSG4D=j?97pd0u$yd0y7b zW-^&mV{or1m*b4vgL9LH&E}Gw2vIPvHlPvX%$ zl_c9ICNe0MME{Sr|BjcM`2NT7b7qokyS-m}?@d4j0a1!5*b6Gs1O*jQ5DOLr6cG!G z3igV2MP=AOaaU>0qGmeb0iUT#PKmRAo$R=r7wh0j^ zX%Sre{q}pWTuM>ds6#{xQLR~zh};hRx@ya|pQ;RlGlpE}j3JRf{jDRPb=}y%|KPx( zBY#@``}429@W+~Oo_zL+-+ujl?wt!XLz7b2wylJRErcy>A}MTPnpQk+#^P}`_3^kF zkDIn_lO#llM$P&6E?WQ3RyVt-FfGe8E!!4S3Pr`HW!aV$jm1sd^73#AHxa5DJoVMG zY<2jLB(hZ^QYlT-vMgH(CtHZPY1P-q8ltgSEFO!SoU@OXf4Ok+bNef*G)?pJtD2@| zIeA#6l+v<=D%?%9mq>sq32bQ-5iuDubd?CqwykJ17LCSj%Sp@{4n+zION~GP03Le$ z>32TtgtZkjIdDAAPI0PDZda|V+gPs~Wq|Kak# zLdjoKpLG92-+w8;Qwsn35Z|=tliQDu&?9lLhlcmKU7^gZG8&jEz}D69;zcn1TG+P@06|BP7TG2MVa;K&{(BNOaUB>ZbW=1)FK;SYw#^t$x&D@u z`k!=Szf%VGA2MjrStkz|a>|HvH*Vev0I^sM047~A<*KPSRaMt2&qU=11~)HJLdzX# zHeIMfJt*Cr5$>DlLwpkiAce}jE7h?`Uw*w}%%xXv-nwV`7t8yfJYwal-x*_yqXFRO zpMRS$Y3j$He*pltZ70fBp(V&PT@zC1y8hkwKXmHSYr%p=y2j(CDW%6_B#+t)ANlx* z^9baP=%5LIum7icn=UUr{|X|iv%mZ$AR=c;QLA2HoThQ*dHPjZ@}NRmdlNVQhjEx@ z!X?{msgEVONxs)0$%(*(M)0(ii&A?wl#nPWXaib;EZZ_o%Q7v?Qs#lfE2e2$mLqKr z9IjsW$+G@^`!0U?5ymhS45~l_wFaX+U>A}DP-*0yR8S;^6jBNovg634#%F%;&A7!c z{kwBNGlF_h4;m2Uq;uem|MaohAU35k>vW0LWArf}Gw^rw~rPF6KW$`1K)})k{ z5MHzW&m@=Nh$)9GUBJ$FIS)%IEz5G)|A_TE7P#l|sP~l;a^n0m zQcS7vxM^CpXFR?>%r}(Zc(V@7w?5Pd*K1Wf4PSjLdfsPWd`G|l@au0@4La@o z_Feiu@$8GX5Ic75n|Sq&Ck;FQoKaW&xo#_G?8_BD4nKQ*-xJT6b;pBMwG9EoSh@Pw z#ZSF)#nm&IR#A&*G22{7y&$ zVoyE$=B6z>7-RP?dTQybA55GwqgS7yZ@l|4BGWa^FpQ5r{_5EN!*00wj$hYoXt2o$ z1pi#K?$i+%^yoS8^mE7j_SbrwaM~@icOBew-^0(1yJE(+ox4K8z@o*^wCQ%@sPWTx z?moadXPm$N?q>ssjqG>wd0%|J3S9V-RG^=el19x}CW^`^h8)qJK*KSOJ~O-4g?#>%x zX(XSid;T&gU6dc8h?GHb&c;esKw z5wJi+h_GhOpS$+&zh>%`#wGbpnl@_Hu65kB0U!_#Bj<>C^2q}u`NhvKedF)H)|VFM zop@58+Pd28>_B~OP3u;zhMhL(t~=(988@k}p+N%(I3cJa7m=?aPn^#28DYcJztyWURN+d!`s>m_$z*B<&u0bf7 z&UBIl2mwP61_FUVAYd4prg4pPjcb~wan2a$8V4c`0Re@OYu5aA$*7Ajy6~cno400V zh19laLdlrqj$w(eOXR~uGU=Plmy5r-C4hf0Q)LzcqRJ1&7)xEDLbctDCkHPe03t)i z-P4l&rK{tU5i$r$2at0fXTJXu$1OW(nOhWh){8QT+DIfcf9?&JoI3&lxbsjVR3W)` zj>x@ua*y25Z3i-r+`&P;v!C5DK^3!&4Bd95+60(1&Zz>Ld0CvCJY0-(rvAqm(=`nM z^70FxdGx+s-8x7jwM3?I&N%u{cP{IS+?}!C)Yy2Xx)gbzRpKXK0*jn)8`)&ZLyOu4QLOgb?3<``xL-PP^vX zYiwZ$f&ryZ7yvLr9RL75QgzS~$1+z?>GlnW_U)*Q1i~>HV?n*{Al!1%o41XBdGEHU z7SRZ0AOiKVs3k4QWKB)ND0#y@!vh>pH0s!O8w5+FJe0}fstsi~z-i7B5ZQr7N z)OkaH|K-d1cioOshJwLRFu*zIoCOR$U>L}lrgOv4gTX*J6k?2V&O@PKC=}Fnos{Ro zaKZeAd-v~A`x;b)pke69$g*uA1rcc)N5&%IP{1&JJWjTd01yfV3{AI%kVKp@L{!ML zrfC{yfM^)HuJd3p7z_p_P{7b~av{`sQ2jd?2N*22)DOIS&L4M6jiU zjB$pBp>xh0pT?0)DvC#j!y!a8G=mud;2Z#g0V6*@ub?0=U^wxBnx-L2onc)=!=p={ z-SqFji0GcGY-EMQx^75?G1(T8426QhKu~eCrfGqIp#qVT&5#5)y5#L7)pjwFqd@@f z%}o5_yPH8~x(z^|boM~Hc0t|kLtW*AR=l^SG=TiUDI_< z=bST7Ky!!1xFsxG$X|c{?VNMYzIfE=J^QO840R$7KrAS=5CM{JtXT5s0Rn8<2qZuN z#3V)lzjzB?dxMQU4H~rtsDX9=K!ZTr2Gb-aamTL|t0y;{K`BvBmStC#Q`9aop;Q!152AU17&3qD5Q~G3s5b_sAD=j zE$%VBB(l`eUbZcr6UNB0MBKD&Asq8cy1)xjI1+B%vSm?ei99$#jf18enyzzAXULtnV5RRJ&`kyO3IaNC;NW%F z&p7?GVL$);i=k_VrYW$R0U$62;HG7EfHd+SW+J66r7eWU*?r4@xc|d1OwMH_D{k6# zRkbx$4K;_VW6`KU26@HR)#jX6K78-rtyuwsh!}7{=8H2y1e8R!kPg{6nH$NnglXCh zF|$5qHN%-*(!#Y3|y!$94f?H}5|I`DW1>G?G#>&I5)a-GgA#NhM7%ySXP*FXv~@SRfGK z&ar!*D)HIdZUh#%4ykF`+js1%kD7qYFbr}vOQt%~p*KwZ4B%v-NopAaByj{#VryJt zYLXR@V~ja&FQBh>w-_Hton&|?x~quCXF~ZYAtU(cwJ>QXQ3By2;*6Nii69aR2ZI4U z5YRM*^DCoIQ;G=z4UOkzhlCIt)~+3S;mC_FzND(MM(3P_tpPAeXuANQn_t@*E#HM{ z1C=}xX(W>P?23z2pu+`~0QMcMx_AD)&%OB3>F1pH^O`@$OqdA(Kdk<9;NVg1I(EKb z)aaSBW-of=B|up8*bA3kI^~p8&uD*4w<*`$U|aUmSKgaAamtXvC!IFpw6PN=ul(_s zSUf&q{59Qs95emK=~aiTHO^<=I(yZsza~z;tZnNyW-JN-&prQIicK;SN-st zX?gT4g;v~LLW#dd& zMrD!l@}9x8D`OQN{dm8o$)5~XB_#Fh2se^?n_yu~qj3MFsrpmfngpOEWKZ(;0Ow5C zqeF5|c`4C=0Dh^IDA0w>DI@spS_X+F1Rx>{EsfdgrwdY{4$PvD0|#-$DV%H@EdQRb8L^^sl}n zAa#U=Z;Ug}DG{X1h@WOKk!m^N!1&d$_Z%dCO)bRLxEZb^RgI8F;OT6KzJw1>48Kn! z`n!tYo|)ws9SoQu^@gZ_=Ro*Wy3A)2Pibz}dYozYkW0BE`%k44{o z=bfK^`Q`c>ZXPpwEC2uqMC2T}r!v9WkDr0w0gf;r4%52Kl5w=i)#J{g^6INo3npc; zM~39r`kpDFSYBCnis{fV5WLZI=0`Qyz2%Yv`qTGkkb3S1aEF~#MhkGIRr|Kh+O=s4 zt}<|1hk%LAJBZ+lBc~l|yNP33xKcHVIGoiQ^5W#xSY@Czbp1BxUnkE@!jMLH8q`92 z;$1}a3AJ!26b^-)?YcgA)Wwi}!oGRj0RV)s%Xf$qX+&LuPX*W40u8Lp*1Qp{`Ut43_aRA85&aJ7fS+aP^7hisL z%gwi(IpTB(2Y~}H(hLMp$FF#9nm0IrjM=u>wWT6nFCq~Xw#@@Nn6TlOgRPHgH}k>M zq%Hpad1pmMEGLp>+HnG5TVludeE>j$1WI&=-8(D{5j9P(tF8WM*_S=~3_Q7Sr&u&D zgpef5igFv57YZpiZrWj6X1A^#q?CWG`8Qf0JK=;LYyaLDD=Zmzi-~Wu~)b5ZQHjtP0O~# znspmWON!oq|HHn=A9vhw-JPB9L;*uTR9XAdD@(g|?s(F`zKpTezpgDPC}>(<6bu?) ze!Z%oDDRlA9sgXnzNn!1haXn%*|Brd9(e1mccrw44n3uN*G`8kEB9B_)K%Ag z{`rct&O9wE5())_KmPLPnm^VJJgHxsmQAD4SXNf}hoAmhx$2i*-8=R~OYuY(y4Qt+_(GRPC z|6|QRr=NOqv!-R1WpmCFvz{P&hdO=4ny}1^8c2H5B?2GP=E_mm4NV|! zPUWfQzWe_aF_*%6t^~v62YuF$^b8&3oL3)i*syk!)SPX|$cagiuA`*Z7ZB05?fUvU zGad&-uImla_?vIM{?#|%PQQA_6<1Bl%MCS1#K(U5Ouwzo@fK>Us(Zh2co1j}5vfRCNx&Jes;oYBXup@9T^tFAY}*EeKtM;tP$(1* zhE-fSB8Gwn0-D0MObZcL|FHVr`yU^8{P874xt%+YkEFpxHNFYcWn#Q;xgb+e%oC8CJtph;wrcFP3?~PzE z004}0l2X@oAc|Wy=iD@{7hie%&p$Vwa#A15wsj{&4s6qY=IK|0IfYXuo{vDbkcP&Q zaUp~)B$`Kf% zIwHbh9LEZDhQ*dLD`2eLvG?_FR*TwbsJJj%U)!!(vx!6cAJe4hV0GP+WncZUexnu$ z>G=iw_U?P-i|rI#OiXi+d^fO|%nH>c=J*!0haO=q8d-WSV1Z{4b?EreS2V#t_E zDCT+8?&npjR)6;KXLsCjyAZ-BOE*{wy;5vf4+Q}5(os-ioH5f0 zDv7evh~MvFC!TSQ!8B(o0iGqSq=Xlj?i(aI4BqgjxaUb7^S6xv5e%-`QR~3|{f7f~ zRc(XLbp%jpc@a>mwHXFdQe9o`)-4-%?$`kU!C;^v+VIBfuYUXOH`Aw1n>OWI&;ccp z5KgTO(OESCfFwDRSSqH3I7q^3QwGo13D*orblW2wB9elnkVaPF(@)*svrFq9T{~WT z^{r9UntRuhR-M}4aNX3bpuS=4-*?~p(8O`)Eqd_T88fEOo_QrQ+_G(FAYeSS__1Dn zP8@yl$QF$XKmFjdhaZ3L&83f4*Hp$D>c(AswmM0Y>)PG}yLxnLIp*9`)nd%kPuyD{ zvu$C%`^wvY|Fg+7ZN{KazkW*|y0cMv2}gFu(9KZJ89SxFg-m?4dyYDP5DTu{P zk_zI;A>a;{&A4e=08ro1Fk$?dJ8!=}J3D;J>3cp|{>@oujClR^x5kV*f6nZgjIj{F zZ)-OmJb3W(iQ`9{aoWHCZWXckwkL;>$k%Wcjf@yH*{nW(W)JnrT_K+UM&yk?0s?m|%odFV9a(US^79x=%CK zfYQr3iZt-o`#-NtEj;2^A3B`?t;3{q^@e1)6i@np=B@=N+-)@FzGco)Q4EvLaP=(P%>~Cp+}pFMn*=vGd$>PTRU= z=cA83YsI4-I&^#Q!%y3_ZQZ?dyQiL7x@-Hcz9$X{hm6|8l_w48yRYKFS6_a2`iN8e z_BrTi4aOl8+1B(_ver)gF=bSmbp&_a~u8y6$XFb-2HdmIeO$d8#k`M=iY|~pF9Wv>SJ{= z(-CMw3QNQRVDH`o3l=>(;3SHpA_}WQ*`YR&&%}pE=BbECp77^&yMlU zd)f#kEKN-Mmguf)tt9DhzpIf{H73Kto}U3JFL>ZUk|c8-($q%!2hzz7owD}gw=Z2N z&)<_I>oci`{CrhqcPX`3Bggu|=b7u7J-HmauEjttn zEL--)q${UI^0O=U@1Hn!?EUx6oqpZ*efynw%MDY4LF4+HW)2%R^q8)DVS(Uw?3aMNTAAA2-iEciiqnmCai=I^(=c=FGb3k_*lR1Y)rNK*bl|{7_v}^TzAT z_UzgB`io2E-}B&I_b%z$t=pqZp8ROYpeG++w5|H^HPhz&{`=q6m52B3-@jn~%w->b zGXJheir;yzS<_RclwRmuGJc&T%M-2(BNfbUv}%*u3w*CQp%dz zy4u=?f`a_-fA|5UJY~p;GOq zXu$D}8gPXu_vqv?)TT{4cJJEXqIK4n-~8O8Tf4&i+#i2g|NCF-MhqR;tVwa) z6r7W%>XgdLMAa!Kn2)%U$?_;1kq%oYn9HZvG4pB>dG#vZw*gA>@=m>a);G2D0vriY zf*@e(plC=)2v?_)G)-GK4BIvtB4~PjeZwm( z=m1GL(Pxfk|LC{B|K7S+3rD21A#R^}O#5s5c4iE9fOe&YQ=WhKr?s2((h>+|uh_hM z<(BQ|bZSdPF2)Bek&Rj59L}ia<>rn&_l$l6PW)=c>NUUqF@D^|1qFG{nw0?nNkD+@ z+qS>{<~v7J$i1GlIy7=+8g?c>0MK?znTdldYME z2$-|^nz`;55rMN6BH4EG;4@Uo_Zb4vr=NZ{Y0_nF+P1VEXr3}|6Hyw2b8ZV!Qy0~A zt+J|m-EZrJZ3BR9+X+FIRH;;J5a=;RqB%*ygOJP`h~VxW0Z2Hr=_H+?>@;7-_cvj@ z`Apv=LotP02q2NF4}5HuGAt?1y!(SPmIwgCx!F56|2^`QQ^=00P!vg$oYPO-1UcXY zOGzm$OK`4P@wm=3Vz_VrzMF5G`OX`!ulVI>4He-#r(HYC-IUsd1c5qYA@$rB7n;O` z*zn$UfCbDrG6XUfH*@myI=5>XFtoy)98Kqy)ivwaZ!#_O!ja=mVb;atC!Ku4p^C$Y z4jdSA$^gUA3xsy^XOyumX?%Ezkcqw-~7sdwyY?*#3v)SR zy}Ebbvwz>en>IJZ?e?8IWktdO(CgS^*8H_m=j^jjzq;<0xg9!ps;-ae!H~u^%Z{5? zG}aI`bZz&peLw(SL7~3%^_MFyxM*v2eQiEeA z$=UoLwWK%R`>G{jD~Z$068K6o(BT^qSCG40lxSO0O(|dfcz;qbuV-+RUtFc}Cpy?S zDlT-M>(Hjz<}KTI>^ac6UGv?058Qe8!&7I>22)I!IJUIBY|iXk_E#MmI{aKKR^Pqr zF~|2kzH7TiH{E*Ef(Ms;+v_CLjt?F(?6hI0O`m?{KihVmeCj!k%Zj71XnC`?(Rf@) zsgmy4wqS@Fuz1{T)~I~K_zQ2m{oa#?oRyaqY1O7hZS~>8!lGk(b}7owQBBqLfN3?< zH&oZh%;#Tt<*zk=pFVt;I>Ip)k9Fy8~ev})C*^Dzbac>qveUS8g~ zi6uej(4|AWYo=TkFtkWG003FpIj!2X}7b&6e0sMFr_)GvI z&!fd;J?@R1|3ohr-ATrKJWtp+Xh6O&eDsxY1PdU;O^@$=LdTnTw{?EWkYr&b7m@o%j-~fGqD%ZA$sA}9v zL?=-SAv7&iU2VVr@-H@Y>3U+5G1E`pw)Ue~w4O6&3kwKrTjj-Y^o|1|yM(IB)i^VP zI_DszRL7{QTmj00k7Q-nRn@EBODTk{j6SjnpL+6 zr5!uAd*q3y7cP7%Hz#lL;wLw4-@A0_;{L~XpEC8<#g9CB%E|o-^Ycy9iiEVAuDf#e zPrqGq(K%OMHr6n-Q%^bNjN!w(c5T1p(WP_ldT`x8>o@+pW97;<&p&(rse_I?Tv=%g zF@D0RlLig!(xp8B_|F7LvBMl1ba2$nW(WB!^n}=RiI#k9?!ws)`KM}`#A}dX+vH`0 z#C=NQHMg=N8$4j)!pA=S`sd1uy^YEWpMP#i*Dmb< z;ES)neD=k+Z@GTjz!Q&O`0%5vfBa?f!}mY5Xvr5}f7iKFn>lmuzVW8(#$9s08Mo>i z;#t{Q->qCV>e6fG-a2E#xQk}oH0#-=FXtB&*6gjw%FD|yEQrVBH{CM#^Dn+BE-Jir z=A0#qA8OjF(MO-WUv;SVrW@~^JA1~!0ew$D=fcxZANI(?dCNZk?ux6g=O|)k?3^=C zf9#bk!FV8xBM&U^Qrk0QA_Z@=^2 zm!G|FOY_cKA9(z!XLIul48W(JTwGjMa>hBAv})aU&F{a?yJKc<{+TC_xZvUY?rzqo ztj~a9y^im*am&9|d-qMfcIv#@GoE?vz2(c^3rF%Nj=T1)cb@Llp$!1UO>5~}?`+?+ z;qZaV@nf!j`-7!Ro_Oi5JLhK?G@E_v+KtLvAE3=nbuN>-eVnaZj~m?pguBw zJ^JNA2);Gcqdx6>LIbF+uDxS;=WpAdaTtO!)__7HLzS=-lo>_98J7UTfF25kpMC0? zEn7AP0s$2uY+Kgxefmwl;;Mc%il=Sh(r$7)cv}7=Q*9)a*hrr1wayr zAyYN^j_@ukE*gKy1q?YS+O=i-;0+}o+6?IA$!-+R(G6AGouX28WUWg+hZl~c;cjr{2sn% z3Z}6w0zkCBzP!BrlEKq*bzzxt&U8W`wF{a^ttTq0^TM!0cS^6L% z2E!o^Oylg#(}oT`dBFRheRb7@$^A|^?xd4Wc=`Fq_V26cGvxGVpLwf!^YWKoeE045 zo<6ZpuS+k#&J?DwWl+~_%@7XBp|s`HYp=L+@(l+o4nOha!p4ougs>R{=MXJ0YoiT$ zc{v-m?y9J$&dbXI03v(GfqjyQ1FZXJy&lk7v}_*I;rBn+sv%hQ)0&!S95`Qi|6@ak z4!QrXn;(6A>BEn`AZ$zLXvfSzKm&mM?EHqh+RLvUGwqs7iGUkSXBy+|ipxh`a?zPL z+&pjkb+U|<2X(3Yn1uNx&1N#_l&(aM4$}GW90ig~ z2EiP%_d!*TPp3{Ng|vpMHmY;rRpxc?#SC?U-^fe#%M!qxAC>c=8QvXVafv24RXS%~ zK{~*lxQ+ngBsrPM^&U+HCtBd__HeY<`DdR#_KKVS-ms}l`{w=o_xb3(7kBO5Z|HiP z7EJ?&o>N}%(z8qc*|@Q`uC7Ddw&kTIKydlE3x}UFaNqueS=o_hjmopLLWtp|Pb}QC z{~$8V&(0D6IoVm9u}~-k01!@U$AqyL4mh!|Y1?JRg(M*o4suO<=CS*O!9X-_BI5Aj zLs$0tyf8n%yrlTt^Um77V~@tU5H=zML;)~j_|RUxKdq`hT$o!B3IvgHNpS78Q>R>c z1xK-!HLSo7B(RaI5dcpRi0G5qXXZk^eqM|aLO z015>Hn&AP0>0X=HB7*)7kPNyB|5Q8oGYi5v+I_%F*r-e>eRXcNTH;*6fztMum17J@4oqF$Bvy=Z4G1E zxUmziopyES&Rx{bGR~N;X-t{C9v>?Gq>dj^Damv#uP6(dLj6dR8JDIo;lo#c{P^>g z4?a1uO^@Q1?Q?(pdQVwVjx8l1=?3@r23%5Cf=`7E8%Cf_>y{fgZDEWN*@n(_o$DG0 zMANeJa&xOHYE%RukR)3IfW~;Qu003#J61`En#%esr(6`Zt?J5H)VAWn&dScVL9}ku zs&RSg2cLdX)TGVWaTn(2=U#Nd88_ZozUt?n3yMp!^K!>tI;wfoMnV!vDWnYO#_C`H z5Wp|Hd{lX(^1`CRR?V9*#zLX68I9YPErdWMX-NPuG#YWzkRF{oYdX)(&DpnS|CLu= zbKuaS_3Qucb=>j6Kp-nGHxdXnYuqRp41Bu$o67wa*G;?ip5p9^nuhg%{=8-T_R(W5 z9y{TR^G1$av}k_+<9iZ;Erg+K0I+u5zZYI`?tuQs13;hSdNpeFVQp>Qt{n%qZrgm- z)zgaev;SQ44{*Jvu8uKg$8D5QQd$HYva%xu`ME+``S}I++_&h@zkaW*s1rie)HR%T z+R0s>eP!$=6Q*8!<&0}D*EnxdUf!%pV??xV;o4-LGz{p} z`*D<@o}=&w9?|Ci?+Q#c(dQ;H$F@TR5;40=_b!vJJ4ujK4V3DzCfC^YqP78mBz^e) zhc)YKEX#_Cc;hBbUwicFAwy0Kg@O`*BXME-WmiHwI0MZ9016usA|P>%v3-(G>B|P6 z4J&VgLtDT$fr4PV?^+1Cg`nw(;HDjAKB<*ZK&rWtYyy)&0zhqp`OV57?!Whr0Vnk8 z+Of^14gYF^KuJ--jW^GG=k<4+KK6U2?vrb18)o z!r)rGAs#dWpDzFArI+5Ed&`XzFCDe$p=Ta_@_E~|bX~vcrfU{IbhjmN)Tk?8dF9pD zUVU=Pq>0Zz|N1jeE$-8&>tAdBw&PZ5eo;+b&26)0b?@BanaA({V#PPtOuJ=ZzrNkN zcHF#W*MNZoUVP?}M;?9p=|>+MbI}DYn>UKZ;<~PH_-Es5FTH-pyxXT;J#ovnokqZT z|Mg`{mOSbqY9dhqe5?%BD0 z*StBm&%FM&Nmq?};+a>bT{ZdS6MiT!%>@MJL~f<59XSds*@kyaniMwrKS6RH4VrF)B z&YZdPCQiJxs4!oZ#}PP7amdKaM8Ob&14z(yZSBS_oA)1tV1NrjmK{Qv|M7|$4?U|3 zV^rT`5uje$pb@t$&d{{uTX*j{9E}x(f|jsJfjg)`3I^yLu>}C6&IM-3Ikznfz~&%z zjp;@p6f_7R786-HMqX}q%(5BhVO^I1we`{5NXVAbj9Y<#uIoAgShggRrY*vTVObV3 z777^Eb+Le^g+f|=G{!mCjbJQp?b>s&WwS;kg&O`~AW&9Ts@zYt1-r7QAwMSqD&Cw( zL4KB?oSYm0W=jbG**RGNP+c3%%???X9kXoCcsLx0#msOxToa823G(yv^7Hd7TNs9+ z@=?YF1)XiLAfyb1f&gGyLf5%;7sXXf79z7G=46Gc>gvOxh{3_KY)#{VV2~Jc&cor5 zpH|csJjRJ3)-^Ol!eI@7h$MhzOU6;tG~2W+%i_U6G$!)%BKs?w-5y-_-)j>SUkVH$)qbUZ;_W}SvFH4fQaZ%DF^@v z0VA+;_s-4RH}BfH6A>Ds(VV>edluX?`jU%7!H@tTO(R{`Y?}d)%JJgZ!?d&`s$01Zn=5->1UpG*Sw~kyLR|s*|Hhe zO)o1g9d+@TbI(0z|GvHTw$-R<+3eZ#*Zj5i-19G}t2&&Mm)p2$)2LPb&buG4`09s` zmVMNsMJGv6U0E5!pd^Vv8rSM$vEf7dl{GG|jhX}c^avPwJRS!?m^PpTBtFqp^lqRptIKzFhwF(@#bWZS2I$Z<{;+-;Eo?k?$o0XTRGynjkB+eNi>7gK~laCQJ&I=0*gb+edeqMf` z-i4Bg0a|gBYrG&YPwnalgyMpN;(`LNRE8`o903QIfxMioyqqim*tut4RZabEw_FcE zoNI0@y0b)Wq~AMz*TSo0unJd`LqBqG@ca->Y65mIHBK(*H4>v;z?a^gsgr;i%CW39e&4vkwC1oJd$OJrzTu{J##U47fI?>=4g z_@kdy)WzEpg#sEfATA^$WKdF`1wcSjW%6-#tpfYhL3|JnhbE4_aMUH2zx~_P zb*QX$y!whUX54HLk}(!A0+uZT5uE@u&U5p#B$2S~&6~HJJ#y^GQ5W^@*?HCK z-`;xfqlWtWy83#O5DXZSh!e%@>vQw7iAdvIT6TVJo{%D(6$u9eY7RJOLP`QED=Dh0 zt29X>KrmqJ+_gJDFHc7@f<_=P zkKUuiO*|S87$H;GBnfRhKfid!4c8PE*}JwF&qkrczyGxO{Ywm+@!oHH#fVWFu!@zCM&*L zsTl@vR$pBkj|d&{b;tINxZzW(&(&%gfZ`Wt3% zShsn}k_Am07XW~1TIy&N1OVoWs#LNBpoA2qWHQdQr#z!U$MuQA#2}j))|s%*iR7e*N^zCr)V8 zs2l-o#mJnYF#WA}jtz6yaa6smWp^@`0grQ?fi0o`>3G~Ex;F})2a}NlKQ9Mqp$;IC z2(VFCFe1#8Ij)vTUAuO>>@ERfS8{)xxUA6NZ$#u;Y}A8{%G3?4ji`4=m=#@4UfwC=Y*X3d$`xU}et&sQ{V z);ul*FnLUmj)VFi=T&W4R$fldu)+QQ`0MYxA9&gb2hKTnL?B?)RMsqh`0;%Q_O1A4 z^?(8W0n~n6kdm~377hoD0N=K4XHiMn@ZqPGmz543cH)Phe!6epUdGt29eeM*{oa@v zU-Q?RA%h1Px?Y%{8x9BBwQHFb2@|8N>`-Ar_QnmH5ALg;f5&B|rNyTW8*=iXWy`-@ zenQ{g9on=!ZRpUlveFa#pRn}B*S2oo+NyZZ%$#-m@~^(W^@i!~+P3=k zr(ZgD>pE`ixt0(U#*7SyLcjjDCa!+@vIK%MLA@zW3oLk-{cdPoGp$7@0C@ z^rAlaF0I@=VjT3`76v*R>1oyZ_Z! zp8w{nZ|}P2fp+cMzW(a#y?Xb0@cw&ybZaXFz4Fo<*Ur4Dps=7(S#v!U)Peyb`TUD- z-*L~w2&{XT)-OK$==NGHq+T)E=gpXS~7!151YTmI#D zcP)6NXRq$>F8eSy6nbFcy@LiE%Ncv(=~wT5V3EPJzJ2=b*|Y7=IXCz0(Nze^INP#y z=h%r?b?emWgHM*Buy31n`xO%}-nezgnde;i@rQ4e6_-qyG_5E<=lh>lH&oTky6v_x zqt7Fv{d*3Koit_ZuDu$_`{&t@d0bMRnMPWIBLAMSNbw|LwH0L!+*q2MonZoFp3 zoK4#{H*MVXp$F&m@73kzTNm!!weL{P;a`9KrCawtPb|Kpb@Ni&wz>bLHF6Rnr&5=n z=+bhvq+hNSPX#zq8IY3xIA455VuL!w76+$%z+UYBBEMUBgRll(ljj+ z3S|X@Qc5Cz-Hhv|Pn}lQq+H{gqyl$%r9_t>}JdgIZjo?o-+-vND2=-#2OhfT!}q_;>s9#N3r}v}c}Pex;_NfI z76=7{YUpfR=$a-(eC);NG%714lFn*0=TeASGiOM_w(Qt(@yN4!bZXVDM>hh9Nqh9A z<1E0s2J55u-yS+>fRu9bgo~OqD}DCWx7)RDdDdB{o2Dqt&snhG_Qj9A`1i(bVk+-~4vvPbB2n@e^9MX~hsmjk#pm=U?aL z7Ce0alxB^~n>A}03TAPRNsitTrYQv)OZQFEk%W}%D2qM*Vl$SIjNu;5Avy|%=m#0V zk1C`V$H2cS!T-7s8b0FXwnaM;KuRSq?oWd zW5@v2!RtV32@zF3P3a7^2PgnQX=(Ab*Gy{NqOp{q43YnbrAQT%})7{ToeEj0s~DK2m&M{=1c95PW=Sn<$6ZL^VxhoKXWkV>yx9+FsKCJlR z=gNx1mH;X#)`tx!7<*blSuU@w7ly_V$%&Us0=_Ys#gg*1B~O`ekjTg7es)iS=)9v6 zl7`U#YSKt1DoS0EOL(!#FL?zzUyp2+crG8LB3v1pkZ2+KZ@JI;9qXfCzMiIFlHe!8 zBWfA9ng4UehB5`ErvI8U*GGTrXpo%y$)QrWV+=ti`a}T85jX~HR1y;ycXqI$i^@p? zsemtrs7@Fo0)U#jI<5zAxbc=5Gp6O`<}k)$vA8<56*NGGOw*YwR-Fbg4_Qw1x^b(# zqQ-d#wuqo+kZBc_Wwkl6IIm^z<4vOB*Z+mdlXqy@2km&POnBB@|c zM9;lcxSX@iXZWduCrrNLit(5Ian03TJGJ|F)0XF+dZ}&44pXlf+q^}KH{W>o^A$fG zuGs(ChhKE+-d#%BP+Mo~4)A!OqGH#M9p|5SW}n`jKL7HEirp2OW@JZ#HC0u=|M^dL zPPj*pZXzDN?&dqMyL$2?4?S#IV%X4=4jw+-P*bf^+o;@Xx~>b`Zr8eH?_+vgapg7l z&%bN^zyB9x0CeeRgvJr>+`U(X($0N~&Czn^jH5CE{uc!L!aQUJim%RUKZWzU{- zb3hLs+`YA?Npk>b+p_sHFTZ}ukO60$F?jrhF)zOO#`YcC$Bn=7n{QU`*;moKSNMU4 zAM4n$}U}%xWdP-ntIjsH{4!YT5|je$361U6I(WH&dv@WcYM$1 zUVJqt5*{&Z$YW1EbGV}B)|;oBmRZ*jkH@Xzk}^$LpMU<{#iK_4vvKRU-~KfD>PchI zAAZa2_pbeIEob`M?|=H|y7f0qzqVJ8jvsxxvZgNj@*D4bzk1!w>#k_ls7U2JWyHW; z<4$l(+9IA`Tpg9j|DV(wcutWk<&MHxey_$K`g(+7Gu=q#ea;M$9GvAkQc{*75V|`S zP?8g10|=N~P;l<~7tWtQzj?F9!9YL~357;*jwHdh)dCKvcfn0oLJ}mQlpsau*mL7= zKFp&g8VFfPzrTS4C*X+L03g1aD^{(e5MV&pY9*BAvi8S(*JE%*!T@Z{NO!!Fj!DX6Hw|SwnP=dbn)j`03Z*e&_9XEx2#?;6W$8 z^Ug;%%)0xOQ%=5f?wq-IFRZMoApm3$2yjE^wzRm0M!-N4v1lxA*#Hm<1`xHfvXXDV z`*G4$H(xt-@`#}Wub+8`X%hel%L*8Qtn45FaK<%V2PgW8q|;rpqcNVF!w@6kfI7%n z*R*g}mfB*E0G4HymKHz%^dr-+x#F1@-oA9wj3p1<-KkBh<)3`6=^8L1$u|D`ucqsf zaD;1`GVBC^W*A)4Y}2-F$S*GhfMCF|ZQIaw+ZL8(@o-@Zv00WCkHuIx4*>GQVHvHp zqyPXR!K#l%LP2oj^OKS8lqI+XQvf7r|NnoN-=_2FZSdbhh6qxnmSYS7xMN(QYakGF z`oa(Z>Z1+E9@lr#gAaD^-Zc;m3Srx^n5MaF)#&66@pcHMU+QKwZd($#rXgCKBV!E0 zk)~~$_h{8908my^Tvl4TY2N|0po_qxaa-l2_8f12;R;Le@~*iqE)t-wYl7s@zx-Zt z@X+kpH+OE^(vC;hZ`j(pRm-}%x|uWQbZpc5_Bl7ryZhm#&%Qdh->r4EwUe*7#x})= zZ@u~PXJ6blbN1hBH`K>s*WNHoXZ-Jek!uy=3&{x8HpB(#x;9`R3d6^GY6A^vFF67BIwv z6^B=U{}TcL@Nd5Opy#nYUU~k>+ityk>hv4d{j%bnkC)#xbM`}zEG#a}yZp*qYU*M| zMMdC7iNxdf&ntf_Ehu?n@q?eQSas8N(|Yylo|BWcVa>W&%tSCg{qU16UAsNF@Sb(+ zwobifN=|OhS!WDA^XyCe4<7L1vlHL{^t&0i+|{{zm+VN`6NJ0>RzyuR6f(AMSQ|5~ z#~-_A*~eeao4@d^5d))E;T2cje8tt{MqhCHUH3dZW9GaUo_e5J)5h_*83-8rDr+to zbH%a8ANTa*^B-9B#AR3B_T6Vow{G3>{wLo&^3bdWcinvMg_ECs?)5phUae_dZ7WuE z%TU?Zm;qHvP2Kbgk+lLRAgFUS>$zxTysCM*nQNbt=@&c zEEUPU0@q=qlx`v-P~YQw9^1RSVQ2)?T2ehe#Z!n{#x`a24-qkA=g8q+uiUf;ju78* zlq*v#3_v2J#%~0WZfK?%?|W>Q7aqSaD<|8sY)$8&wv3`zWkP6?udN;pc=(zp?Ie)S zwE=y4AK$CHX`9kkHZgHc3mS&n^6fN&2*8(C1%MDZA#nykO`A5=IRnpC_W2mfyiWM& z>JtYgnb3)Ua==#37`Y?EP*d9+(M{*6B0xwXeFy-+&>O2Hu*=&on3tWEmz|~TQ3umV z8}p2moz5zLF3L2U8Pv_up=$@xQ+GXxI#my)o(z@LNJz$?6e*-PF7aprSn?_$0762> z)s_Y2D!LMfIeX4Yoe4r3A`s-~=0Ebt!}+;++1c4K)3j|sRNKzgtT30)on4u#B5-Gx z$bmm30T3Ah_Si=U@4IjNzJFvC05l1lBWJ5VuX^r{J$K*K^6Wm@we@6haB*E#T*8t* z`k4FXGJexw$Z z_^P^@X-Ss=Kw~U`0LU08Km^7TTZ+&zt{5@|VgRIROiJ0IL&uk1dZ}BtuAyKk9ycx1 zRu)=9jS#8;J(4c#5V!)}8*(ft&FM9;^;>`coSR)H4Egu3dp>^Z&*7JMFKU`=*2bTn zySye!1^Ie?LtK(<)FijZ$*s+}&72rhMYiay)A;%v3I!J2IiqRQvL(+hjaJv?<>wAR zb?6N@Oa_1nblmraih`W$6hw&y2gb$@4f%}^5q{)yyp5>Uw=I}6#3wTcMA*iEz54-p{+kA zkpU5B0Pxh44_|iGbr*~s4}xx;d2=urnsDjZufJY3_4*q+wQJY7af>D`n*%^WZjMBu z#^=_VH(W7eW}g#I>eQ}HS>t9MyLPIpk4~F5dDWV~E*LrfmYFx+a`V&|mOeiH=Go6Z zzqB@5Kl|2OgCV`5qUMULZ!`?nx^0ImCXY3AMnt-<+d`av%E?uSZ(8)k)33hsLHEv` zhUDbeR@YuU>ikVRcF($V{+zjYaMEtMZ6*K&!{Ot4cg+rmf&uNi8?T#r%e)g$I`hd# z@11||9rrDI?29j!=jY^|e%6S#ZClpXHGKHl_m4mKa(*~>-kmqKYgPK?SM`rCezi^O zHZ!ie*tUhPD;<|OL(^4K8Lq^sZ60B|79J%1l0^R=v8M}3mpt6^{)=Uq@(lP)jTFu0 zKAuvHh3=s(!5`d%^Uw9!mH?J^1pNMSRW~gul0^lSh zSQZEY&OUM1gmTzVAdnQ6R@}LM;BdL@T?Q7EYw+z_xvMWVZUXUI`O8LRHt2`}jSfcH zsB59D4Uq7i50+{}xOoo{04&RnHq@*2#aOhVIu?(cRyKqHpr*FAcHco;$c~-5FMa-n zA*T!-bYlN6KKp_MYuu!9yS8oax?@4hW=#j5IPjZqzt1fw%nAkDb!`9cCo6XD+I80H zL!Wy3>0LW_UN*6Lw64->F#T&poO8>vnlx_Qs#Q}kpkw>Cx~A>ewqx(!Jtqw4lapWY z_nO~w^9vEcvSO9h714M+!0ZDD4^$kkI_?>_(J)BOkb?LS;`xVj1vO*6K8_wK5iIsgz-1hl}KHGj>&XW_(4C-&;z z>8WR)t*tjtJ>{g^X3x8L{8f|3jd}2qhkEzyJ#ysPhpH;7>Kl|*V_9}>ZH;AHOw-6Z zaK|0@+`nM<(wATQ`NvfY7tA*;vnV(F`%gdm?8~#dcWGZ%TC8-3rfE63d0%|~)rX&d z+kZeG9?ClJqDv=?xoF9wPZksvpEBeG%eI|k&=XPQF12K!_XMS<^OT<~jQw`ks6l8i-73B;Hm6#(ai0XH#M zk_PlOQ`b0Wnjl6DZ6YRE0E`bm`7T~lKlhwLLs~aI^_UKeKir3e#F#_`?yQx2E1X2& zE(0igULjDF5N3!HHDF8#0Y%o{0c!*KZ7GWfzwe|Fw3*&Yg!AKfJJQi{_Ij zj9UHU?~zdUx_|y%|Idy$UViqN9-VZ9zw!Eex~}iqxp(*n(^!m0Qj=O%DWx1Y)ebS;wod7#j!$&N*+y>#x2C03Uq3 zyiuDDQ?9;@Y5dTk!_%(0B^Hl=`Sthv_iuauy-!yc=WpAw>xUJeR@W@PY~rZDH*C4; z>Pe$689QalcqwHds2PzU0OaIm<&`v@ee*TB*;x}WA2oT>R8z?3UwE@i&)%aiI)edR zJN?r6cRgBCQsBUH07fu`nts-qXN)*?$l$>PUt0R|+aG*7Y5XO6FjQ9`WgLMA#*ZI+ za=$(U`W*lIOE16l=DX$1n*6(QUAN#u*PuB`lb^Nw#me|y8mYnnG}B8fQX z@4UCH(xfXczqnJ|7WdqFW4FF%{ITvI)5bG~4?E+uL8Zm{J-T+?xwo=D8q3RZ^CFQl zH4{!Mx<=)Hq5jM)lbP|*U#iQ$35zkKhH~HY6$1e3>^ZJBu%f2W7j)Mj)DkBUA~0Z* zWL|FmoH=)7XJ;1`7J`&!G)hu3Lqq9g4u5l8vVnIb zr`X>H-!lkD&{>e84j_S7BwubGa!1(vm_51C&PG=vEv1#1i3hwTGF5EK&RNH&Ji^h^ z8S$4Ru$I3+N0UpQ$E>~}As`Y#n^w(*6jDgW5Rtj#n|M*EY^aDr2vXaBIA_T#RemZF zLI8lFb3+gL8?O%J^Z-Bdpd+_7=j0t{*iZM;jhj-zf8=>vED2OfJNi8#H~qrXY`vi7_YC4gjS^Lii<`i^@6WlN1s_2E*FW3%jiN z;O}UCJP^u?Rz#ni`~9bH{gsoaSM0CY`d4*cq|k~*ftXEl$Z5Uu8%G*y6v$L|5)R=qwO@K^F z0>nrpJa^W#@ng@C!Y;_k4+H}m=ZN^gJ-1&qd5q4q7L7}_=8cxU{#;dcRZdn;v!;y! zproYmt=E?p_$(n6C?SYiH*faZbC2!WzdxuO&6_u8hy}U9=bw3G-+_IRaKzB`?3`@V zvLAo)5w7uYIAjaarE~i?pMQMk?mY$hc{y3xflx3Q(6b_;m!E!U-QOD;mp9Tl4nJ*3 z#|~}w?>~^0mDQp}3q-te##Q6TUDyz9C@U^5D=qfsnlZ)@$6R#A;FFFuO*20~pQMb0 zL&0F+wwcpLo_|JFWmS1uS+nL%ZDF5%=BcNhIye#z#Y}U|$TNC(>llqiyLN2by=#X- zCmw6Y;zdP8Sy_=tB!qzPzWDH=s>-ZzR%uC*u4`qbMZJ#e+N?>5GbxFDRX$7I(X<&Y z5ud!t#3O!2_%A4Sx>c0K1DR~T48}(<0l+c6k2!FtdjI|d^Y6a%kH7!A;GA>H8@JrMd)w*fjgFbtg1cwe)>U6V^_rr* z!d=_ap^58=c)z{YDJ^yw9Xw|G`VNt2u3fFXE3;@nNeOP`$ zVe{rq0ASp>i#PAzf8))!9n-PB1=ylp2LVu8QrfR?@BG|wK-bO~KCCD|zkBEQPdxF+ z+`At*|B~_D+qda*Oy7zF`>&cf_N!GtUod9eh`|HTJNNXWqGA9TK4RFI-_}0(z{8Ep z3dfJTXz1=>82Z9{=iUFvV^_|&u1(`cPd)u)k6vB=TKD&9!%k`1vDcPZ zgDsmkGIXwpBw%RGnl$1}tB=M&%c`u74LD;=2%?WYy5!hi?IqBR>!wVavT^b?*WZ5Q zj0xi|Q1l-N7&lJ8a^1R3*Iz&DvrpdqeA%m)PrYTvZFh8R)8XAWAI{4TSe6Y4Qc83$ zNHCW3IgO~%ryUa7#ary8ghYpwTv2J>S7rkt$*1z)Cs!^207#IwtIfzIbxde?a?EWN zk=wO%Cx&R6765Rab3lg3T#qv@r7e#rDBS(01OWMwaCXQz)F9%4ETIMLXtYy@wg%%L zEdQ}{QO^94r#8+GgQg4DT8xAO;eeCAKpo4gnBK9UyuC<{UQ$+*QnXA6lW9CBKM$SP zLE~r`p}M*nL|IszXPRbyUQVO(A|k7yp*|-!r(^dHrfGqsP%s$M1M!$CDNtO}Xy^U| zfq;J3yqPBrI$_7oz1g`rkwCzV$4$#-oNF34bR8KQdVnF2EsbC}6beLRG2PIE!3Y3U zR@If1G}Sa-UtgaU3fQKI*F~$VYYIx+wQSv@>d@g4!v;>Cd~v|QtgJ{R7_2zBt4;eZ zfq)^T6eNRz002m78Npy~c9xVfD-tpS1|ZZ{)@J7va)f9s*1A;_gMr31>5vL>#sILS zyuh;UoJhF1q^#yp1xL=fCT+<$AYi*rt%VR8=bd}@+_HH?O?7=Z9IZ+ZC!R@abZz@JZ=^iKs4QO_^^PM#~m00KhU$ z2B2{coCD`-g8~teZJ`3@+z}zK9i9vAo^?*C7PsGBNa?3H9*K2xcc{oWkSZifh1ntj z2qBO$hR!kBs>=$VR!)<*|IDjLxmW3yws%Je+jE&Yq9kdl$Q}knf*~V!Yl$W7U?BM9 z%dda=&3B)?_ey?lRvM551VB=v+8{@Q02#x&hHBL%A#AmnN$5l@N?R2UgpwghR1HSP zQ~(e|1VXfJ;T>M=rZ@L@%K1mlf)ElA)VVSK01mI2DHN9If*YTd*-7^S3*P4x@7_Pc zDX(~SL-G`))RhqgJTfv!ev~l*CM31q`{NE*%5M%@x1&^0Ii+{t$CW<7V)iTj4Yi|O%>aKyAteXhfgzHdpLM{kNL zWnrDXoO@p5QP(s?jGLCm6X_UJT@kN-Psq4}72s%7n?^RiPe;KR{u}(@AD9#>aVtsV z3!lvOj7YD96ed;=B&)adR;Ycdf=CjiJW2p6K7l3Qb4XpCu%=FucJr93<`V(f!UdS5 zbDLZmBOnPtDB}|HBl@$S*53EPp;%>3q(vAZT63t{vP?idl${d{=g6|i!EJ};J+P~3 zX|Qj5!?c`bUIrl55xkzK=j_`TR*@9-zZ8U*N63GuEy2zgYF{i01^3ws-TT9aWEXGhauP$wzn~<(W*qOc&o7Ou*#l{g@xPo)t)7QZi7c zQ<}VR_Y0wWvac$K0gz=|h{!lobk7(=ciSRK5*A5803fC0?)W4;JyHUXq?B!Xl#QEy z;)6GQT2hu3aM@laKDbZ5yJFwGIZXu zdDHZ#fMr<(P?(=v*sF(EUz0}VO&TS# zi!#PaN<1tqF%e4Fl$I2imJ|bk6jDejr6?~gE-!PQmqJ=XD1gtFf&mC2%gaj3%Sye{ zq?DFrl@=G44m<&XEXx+Q-L_4uwryH@P0Gv7&dbeC>8w&LM8r8ZZCsx6YbY4#-ldcC zB!I9*Zca8LShkQ-8l3g&(Fs6#ywpQINd!Pb5|M1ttZ|EGjRD9OA|8)__1%ws`t&$+ z*Z|WsHO&pX^vH_&8Q$e$bj50ly1)dstObSx1!rj>Cn z2zaOeZ7;%1Bn2h)m0xHuWkYC>#o9XGgyL?8DDL{;a%ty<%BWk#iI>@K(I-ZasZk+^E&QY zciyivp@%~uJrJ}^>-gi2?bfw(c2)!cAG-gp zfDyE%7(Mc=6Z`hAtE(+3DwG6M zD#*>rx&SIc)xP)cS-P%Smffyh%Y}E(+PiOGeok&_X$b+fZ`bbL1#?27AOZC3*5&!f zABsf6LXxfIMG;DJsZT0c4A?0vg-FR&Zhl$U_3-$2uB z07BNJxUg|So{$o~!`FPHpq_R6=={h5)P_CIxUT7f6ruq-=Ne}X_4S=PbhL?Hc;(I8 zW=v^_Hf-IpJuf?}X`@E*nECo!?_NLk^6J{!9Xt0lZ`r({Ft>T@lESROqPuR{v+v+{ zD_3{z*zw^0Lq>ox4vy3y3B&<_Y%=5ZM8G+iu?7Ml647|f0tox43{@J;G3qK&j7$DMD->f=i z@PMyZe7|-5?}O&vYzZ65(l}E)mEU;ty<@s{W@vx%;k)Oacm8q5cB!d3+@nLg>C-L+ zfNxj*+Ni9wrgj^UturQt1S_s7+7LHwL4e3KKOdo!9K|4r6-wv?oZT(K4< z&;*bYgblU@03ZpNYDSVmc6*&RFix9XkJr~0zY6xAbR7e)itWlCB(G23qdE)3yKtSM*O~V;O#M0u@hZo-6@7QiBwJ5t6z+J<3f|3A8UOV}+ zZk;${Wck3%xCxvSxj z{y<7&JQb2&VCwaMOyiUBev+H!BY&UqFNsa`BWR#ec!7A&^!F$NFaSG z(3rVDiC-|$hm@wd%!A%U{-@|fbWdkXG@26CIH0=%N*u%<5Sh;ka4d6G-JX31P1|bG zq|w^-8xB@f9eYfdtgMKG8ahf`0s#$MMBz{f0E84$kQd3R@>Vin z9$e!rIIx7E^SKb<4^Z(t4~d6Uz2S6R3w`uYiciQ9ck<758+Yv3b;hZKEL(Dh?%C^p z@#dQ?pUvceht5wKCMn$mNm2&M(1`cJuL;tf8}f$B=OvNvk&Gxx%CCOekwjf7WK0=^ zMat!vT;Sx^c2$v+z)wj>H@?S}P9EDaCzz4E)0N4EbqQ?YL<33bK^HCz!6ax>5=C^} zc$mHN^8VOH%V<$jf4DwU&d)lp<=|f7>MDBfmE9XQ)MghH=_Offf2(}oP&jx){;&i!+tj={1l%g6T)ke3)GSACHLBEcXf8?@>R2_ZOVzEMTb z{zgPEtPtGPKYn_#Z3~g9*HbKYby>EpCDaDG>vwJnG6y0|98lna*8n7?P&jEua`mH# z-n%|3@IJTnc>M6;isSmVz5dZtB89pYx0%Mh-nwIe&io=M zqlTPZ`amu{DThsQf|OEi9Z&ux9>K=k1}*x4lt84ihN$o- zH}$U?JYPlyLMbU22!w(Gb?9(@UJel0LJ&!kl%JO`gl*`?{JR!3Z{G5f(H8^2%P+tA z&-#rmnzwvp@go%#HFM|O3IL(-qh_4v=N14!C=_hdvbm~42w~eI*G;eEIkEof2n2K@ z0FsuVtn5gSuARNni^r`{(8$gT+qO*v1^M|(I3u#Qt(pUX6p}Fp2=TaCke6GSpQkWS zWT;-r$;#@|sXYLgrde2!4@8y}wq@o-BDrnb0)TA`MB*HCb91C55<=&^Fh5T?@&qLz zkSxg0D=y4eD0bC0L0=k0EUbNP@}TaMrEbW$hh+&B{eQDZCqYz+jcx|HYzJ_R8|ZC>by>LMWW|# zdrodD`MH5_j_Hu_Q(QgaJ(y}%CV5=m<>?)dGo0``*EPz-CB6^RMv#7^5E9FQu5xyb zOCm{9rGjyo0o*eiC6EMW3n_&V1dNhBKG(xgXq{!-J}Bvwt=NFsTQun3G%s~&Aof|FTd~pcT2RcKDV&2MavdfOdfaZ z>;=oe`S#HEy~4H&N=wSiis#>b+uS?uIqrmEwKX+OTQ#?8lODdW z>6o1pAwhsbfQ0}EEU2-A6$b&}g7eS#c=^{IkLg`nl(+vtmBEd=sCC{sr!W8dhyH_3 z>D03M_T4-0oHe_$>hQFyZ@A^w>#v=9`My27FBv;-$L4BU!GiT3Tym-m({kz9qJho?- zu2Kp_h?`cY*3D(Nz;_{JavL@Up^xKUt4LYcUt7eGTqv3b!0jjRu$;?%My-l3dW47Z~4tBw<4Es(`{4VV0uI&9a1MC0L!usLx1SuN2?pm z#~0o8(Xvn9UG~*ei|^~!xt&U^=)y13B{|3V2bb`J!5{*~O)C@(KK{(}8~@!p^M+|f zg?W}`GscJrRXDoSKsPG|^Q>QQ9FnJifDlM}A#e#!_x0GBV8w@NBSucFk{kMtKt{k= zyJ7SE`49IwzE^Q!ju2kx5P49G%Zli=$At}@AwL=^q+JR8JCj2~>Bbi%FIA!) zfqLDNQ-4iC;uFvPzg|QhZIc_~o)Af%Aa*nvx`NB)1w@p}K6IO46W9WT000n@nClce zI){)XN*j!z@#U(D?|!Ie1!1ecHWZ1^yt?rf=jIn>F#sqmk~iJCw`zYhQlKMf-+WiQ zdR=UAx1bQhJ-OUzJV}yD%Sfqd{D;-QzVgtLQ0Yeg`nmf)wm=y z3OOi)hxnnw2T75Sbo09>Qh{PH5D>!g`4ccHdh1){RYlI6xx$K2(>Nj%&P*gJ&IBzv zB|21;hDZH35=zOFtrUL-0!|2a-Bnt{6CwDP&WRn@%(JuHGW|HFN9UeviSDHy zW(>&5U+$8DPc0CE3L*FDO;6Z6RN)n+)BzAN=BamIPZP94DJgzQd@dJT>5B_;gNB=hl>_{m+Yhl{j(tnO{p7#U5$7Ke#HLF;oVC?`b71 z6Viww5HSJ(MgXi?AH4cS+WH%9`~eQ`03yn3id_b>md8MLiDRues2r#q`QGTLRwv6P zkU~h3ii1td21>Nfwk*@K4a3MUYjVwvvmSfm*+9_vX627_=iE`4pRI?o7Cv(S*Wdlj zIsEeLnnxEun3oq3!WKe$W)(7Is1R`EJc&ENm9feYQfW?XOGqhQqDRgcfix{k1uxk` zs6;1{$g(Vl%LF1rjdR-;35OPeF@^}1Z4-e?T4Gt2s)rb}g&^Ao@D_)_w$)i=D2b$P zDahGrC@##ZAtfZc0gU(=rS_H#<_-P*+t`&vg(aHO?K* zloYou1VY9X;O3pcuF!b^V94Te(-So+s2CG0=%3eQ$^(acFkv&IYbSZyCm~y0nM5w# zqQ_Y2-iMbGAxW_U_$b^XH2`oE^m;N;Qo{X64gFIl7a(vYEYSu3K#duITA#Ot6jBQC zoGx?|0fB>+BO;-GHn0~Lp-KK1s+L;H4aQo4QX&Ue21W96oO zT22mfU5bX@t(p$**cJd7B1Z&3sYHz$I5qMFY5_)N)E82Y8#ijmuwf-d5v0(4^Jaw% z0|2CyjT)6d^1wYILuU+U-!i>L)AE%+|JHfL;6MNPchja#nl@za>>1sAcK!V8?>o0` z_s7rczWrjwxu>6e{+Yu%wQIFz?S_D%_3Yk>F&sRw{|E29!Z;E!L)QU-F-8QvdUbp6 z?bi$)2Mp-o*lDMW{c;WfS_w5%IcJr3amOi)m`|no@+wR`2YfW`SSz&fgIP~P= zdseRcvGQPb+xBgG9n;m&wKv~-Zs3W1Lm^|~qB*1gI-4;ZII#cwZ@mrxojP`U_th6w zjlGXO=8d;siG%_HJ^bN^uPt1-Br89!UHf*Qe)?HWT{I`+WEQe*Nx*Ks;fjEvb56rg z8Jd+9ZqdBSS6_Y7u|wNfTyo90XZ~$@1$mW+_V+#hxK_;@6Vd2V=XL4cal`seIa#5$ zty_gcp{7mCmw)nJqekVNu~jQRY16W~ZHr~^z1F&QOCqUj+J_&!-l|0lDe2m)FB>?p z@77J*a&oeJ_2?D~8B$2j7%-GlUOoAe<9c`AvSoX_HZ6Mg=n4S$Ettu;QBaTt0JCnq zf@wx>RtSJpObI)JH22Z?k+Uuw*)wwAN--UMKPAHue#0!4L5@@lK?*K*q;dfK=#5Np zyMv@T*&9)kA0QxfJtAM@U8_@>`l-Ug4Qn|0#j6(4MFAbbhHff%@B+gf zS2yu?vIXw8!_9f)i5u_`5N}M9E`~@ziuF8y1t4X{T!-3442UQg(4CXnAt7!(TRz!l zN(gj!-NV_>N>%R9&;!Z~IA>FSzlBYvQU$8tH{r~Su|Mx4-ivR%0 z-Sx$Lr_3Lsufx7oN$<_Xz5mg8EtNCV>_|uPc)AbV9c#&xaFiZR1*EL-?BqL!9 zDFgrsAsIv62ym9@wV$S?ltKzpS(BvHHO?6)07+z9wj{|J({v3H$rj2-wQU<2r9Iahul*}^tW8-Q_*X$BqJqjQs1EgyaQ<$1SEsf)!q>V85=$O^AXswjNBqSCCejmDa}qdK=q;Iu*c0R{`6 z+j?5xyi0}@ytk}&*{g9YCtw7FJ9owZSX(=|ThQ4$%N(U8NeU7qRA3%y8sG5G#@Akb zcjWnJgUX+%Yrp=y_N(P9=G}e+sT5ht&}0ljh4ndNi8!mTt^ebXe}<2!2Y|R~ktCI% zT{jF};|C5L+_Ga=`_^r;vO-G!2qB3CV~lg2W+ITn5INTnAs&x!*u1T@sHmj4K&ckn zvH^%Q#ux{p%G$c${`jj~=Z*yhIV6>8Q<#YmQgX%^V2Aw2G$6H3r$7P#K}14IwX!TzA5uyIojF$d=7bSu z!^d{)c0&0-tM+eNv$v))&X{b|xun~G=1n{18xd~CZO_ZZw6>8K@<%|Fh$vCpwiC~) z1~6p6e1?&~AMQe=d!CL*KdN?rk_AW~sst^O5M&Em5vrzXn#PYlhDz{|2TKzGG2cv* zvK2k4rSQZA*q02ZI!`!uA$qW++vybDotT{@+t2AfS(YHOmDQqg(tvx_IXOxY5kT0& zYgIDYcthiQDZctLUJ3dK*YS5jQA`K#0Fw5@B{0nYz}G4B=WBpBwn+`j#F9t!CBU<% zRYzPq4AZMcbr2CGSlW#+Qgp`v0l6AX2d7Z&aw_rJB?P1r>o5YuoHFb_oH`CfD+U0h z2hoTC07wFq;O5A8Jr{3Gl433tdm*T-HjGGZz+>)-FN6rlm|+<4xIOx!^9;lI?)y~| z;N>f?I^(oK05tld3mFTo{OPwqD0tnB=|fNI3m~N=6_3go^PLdldT~B~LJhTplz~GG z$cb^5gkb{rN>PzwOznW++_Nauhm>d$buo9fz|SF02xEc}66+SKC?!k;Bpe`yjCeB2 zi7wRWvIaw7u5e-;Q33)qXIkf)M=^y}liTCcwY!hi9~KFL zqH&`JA(5bEv&L;kjg;i?|k;`GtY93D>^_xO=ARdV87$L zb?pR58fWpi6$%7T9@rlMY>IImJ9lW?y?X~$yK@*0W5;yvbWGC_qYMa9m_Zpk!{&dNIWtk3g~=5pI!s{^isu2 zNv&EmQzHmO9on_@Q#iSsxf03=JmPc7J6&5PI4D)|AbQyH(d@Pq2r1*|^e2-l%Bc5z zwvA7wDud1Wg8uj&AO9dAkWgE49K}JByc6@lXI`X3LVgBMYq_I^$yGw&SOH3|Bn*95 zkdceLA-JHL8&vKz11S+;mNH68#H5Xh8$GV#g%dK!9dM@yl=wgTlGYI26qMvv? zN5=0Ur@^qUBc{eRk=6_{J@?-|vt(Zk{3om?F=N8EaqMH~0l*X*@T&>*b9WNF=S+b5 zLI9d~H@Ul+zaFJKiNDUe&;Je41Xn>O*A58-($7e)bD*Z3AqpuGF%k}e6NirqG7AL* z0ASg+I>sRo3IncD38;4S&8&jcX7G=iAH$9Ahr{gBdfNh*4y%~FU z04N~x$gSu~=N!H8;D9r_PeCc1n_&l)NYeu0r$F z6r?Gb|DUf6=9em*GR5O0a5_k3<|Jc9-9Z88Y4*} zpd=7N1_J>I0H_RcwykSg(hRzoj*HW{Lev{f7pVa+`GtE&2<1*>gcscQxMPyyi>n^1 zm|3-qL_V__J(lp^LlzDj-uprdDOF4sxa;ALL`9Vd!f%Qn(ZfiPPl9fJc4O*dWui^4 z{gliaUMwE?Cn#YzCw@y+kO;|hp4pB}a(pWFBxWh~&XZm>6n0eb0Ep%%gaf z=o`>EuSWGLVV!3fd$-@NDeqO`x`dw4_EqRPd+r{6x2cdIGlz1~160AXZ3Jc*n#axv z01Tv*?b^0{`iTb%^K%eUg`JWol*pSd@;X6I-q;MbccOOR@c9~){Il0a7J%QXNUJxPb(ToEAQ2O=e`TaXl_@?R0Td!${7 z<^Cbk7)p`_hB14@NqhGkSi5;=eo3hn2$^-!O4}w~*8+wX3PG$s7Hb$ceCS18+6XCx zbcUWI0s>Qln|yob5-TDA2*R?Z0|k+kE(;S$NkG6jnm~&led^x(9zOqqbKZIXy?qA` zU3%$du~>ZR(lQaXxY*vg*#K+5*&a5*(5n*DtuK4CyR&>l5+;+ctBj^!j^=@kb#?sQys0QlKFW_ z=qqb#CtZ2%)@^$OA$`#!i$`B_adtRJlDMX@cxl&Enx;iawrN^`j59$}+Qb+j!r}e9 zckI~HwQDds#MV` z%-lUoB(XT^93g?u`GE|XhqfxY0^Yx=T#+O@DLtwn$%jvW`{^X3gMWrZMzhRhBEIFo{tIvIwMN-wy-nZ0QOvv6$OLz&}hWScz=_^%Wd+}A| zO^z2N>`Teyjg%_cQ;=p(0o7r2JRin3RWZ;&u` z#F83@NBQc%p9xg}NG;Z-df%WV{pz+4{ruwfHrY+{|Axt=8;b&icw){I?*BN6{N?q5#`|;P0KKWYLv~V~C z08*eWBmhWTn3ib^n+UQZq0hfwIq$wD|7_eI35VjQ&AArIihTRiUr)X8=AHwUx~~85 z{p#O;TC-#4-rc+RS*9?80SOq7n*d-K#-D39y#LW>lBA|_1lYUp;O@PZ4RQPJ_dfmp zhoAiiO^_tva|cb^-m-J=-u<<||FQn1*O%2q&4A8zT|?B~eEZ`$cisQv&wuE;#u%%v zt~+qBcJKa!FTe8c@4v4#4C9B@f4=b2Tbf}Qx+a7Shr?0Re&vl1zxZZVR(2L5YKT2L zw63mc`0j__LcyRqh?Xdsd3>0(LlKEzl4b!?UrM_FA2A5@T}hMfR;DOE1(nP2e5L|3 zU4ZBhBv1n15kF3eM{YPJ{v`=gf+y(^AqAl)R6zm0wq=Zi@ODc$&ZzG{r@;V-xc`uO z=r95^qy=DTHU)otbx%V>@cz5{^lBe@?~6mftZLA6vM6p7G7z|PTf^Q%Hq#g)FgLfS zYt2f`LFFpe(9Dzz75aT+>R+N*L3a&JZyi z3je!l^O`k(8KF>CBve=5@Z+jKHgB!iw0%b`8kbUrLLnm*-nMN|zzBwdLCdm1MK};K zhPtlBYz6R6eoCOSH^>6=d-o8KR9CPN-xiGEOKd(Q0xH=lMgpeFD z91i{b`#+v(v*)iG7zPA0BABLABhaz zCmkY5JdfzHVmb#VJ)N;cU%%09z<*?9w;Ujnj`mF$G(Zx3p$zU|y1eIC7MRQQGBwvchl1lN>v{zdSnJbm!}GF1Il)!9Oj zv;zTs`_77Y-e3OuTkqG^#{-6;a0}nu`AkIL_^Vzx8Iu?RBS0xhShfj{m5;$-C=dwv zCf$qQb%Q|?#;1?K9JwKpVK5jB1OgJIw*iF`^Xl}Q$VtiZ_4mJgux!P5D_4KN@|RfD zQV1gfNlC&x0S5qCl5xe7;uVt#FMSlf0OS;#KG`%OO8yQB&XMdkm$IyKvNxgf|dv7tfi7AQ}T#8a=q4Fe^(31j% zjkbxliNZqg9lD&*FXZv9k6!#V?#&GOSXs4?18^1R%@_z_gOr82d4+ko!nSSOCL-Ii z5FkG%CnprNElcHeV~lgo(TxR_4ihC+>$fcY)Z*C!o&xq!0J*k`ih`Z!LwU{De>J1uaU#1J`WoS~+%P|yelHO8FulnJUp3qHJjC5KRVEl}5lGiDj5#7kBUoi!vMs@6sg!xtYuTW>6XfB;WQb zO)D=^uA+CA>_$SuzjPW8J|09*7o>ByyJ+c{0ZA=UO=PH!bOeUXvPHi}#ZOE;x9>3> zDk~1^^)-10E6NV$h7DcH*uH(zwr{=Q)Hx^hig1)fkdXm<62i&+O$Ct@;C8|qRd8wCjMv}ck z-@9oDg8P=M%Q6<~C?yYza&9C)?momBFb1xc@Lo-Bxa%4vflrWRhp_WhQ{|9(V0&_6{lM& z3Ed3Iqu}$ulA7WBHPt3b{(AIF8AmCORf1;Su_Ygq9O*hTzdD!yaMBc`&TEZ-zq+?& z+K*o%`02_m%QqI_YL5)lzr7_uilX@Pl`B z?$rLW$=84N!;hhGaQ^*^A9-MIuWp?i8lpB400_dEWlJIinl$P9Re!9@E6#cR=@;*~ z^~MQf&)u|b@2uPBE&uj=Az67r?oBsM`~1sqz&x<@<+l%2);#;v!dG5+>(#eDT>8S| zrsc)A+%osoca{;#M#W_hF1)+{3CFzj%3IGr^IXd=$NarvL+zo;1$WJwIQD#%b3`Q% zl8h07rt!nobqgMR>ih40%+AUG<)=DSgt>MZU@PApYzAydy2T{&2gpp_|D#QmlsU!y#Wi12gDkv=1MmH`W;xagBA{PZIu}DwS=XgNTWSD0 z2_PnQ78FM0@+(`8JGTkI|Hs;22U=0Q55V{{GrOm52lvw5-QArkrGiq5qDY7|*oYto zii(Pe0odIl3W`ApBA|3Pm)rNAvoSNz`^U!FbMA%j=Y4;_6=Bcr?Bvt)%=6&>lcl9a zLJgwef-wY6^76#hLbFB%g;HSgnw#|#0YFH>Ik&>fSb4^{VG<$%;GMTWd}HHB3CT%+ z@7dF(U7Kago@iLN3S)G~j=!hRT_`0=f z(Z$D~dWuQk@SDcoc+-%LZ@#$o*Bw(ISbQm`xO!H?@+Te}G@x4~qWgRbrBq1x?5j-+ z7e1m1+NOEK=bn4=iDzF4m*g*A^w`#|zpQ_I&D$G4S@_Un35ls@X~EK^OWU+mZ$1 z+VIM5U?t44{wF}K-AEFT&X)2{Ji12Q*c)oRSIsx;s?Id`}2q9z}^SUl0N znV7{L9gRdHpb$zR@X(Uy-dVR^mkfxxeEIY9=gk^5a)@Gk!Jw292oOg%LrcxID|NRF z>?Tp7-=`AdLkXI$2Lit7_b<#ZDt>19BNekMm?pQnL~Tcm@}|d;V7Qd3!Y=3J&R+0n z&#qnXm~b-}9IgCc#91UqRN?@Pu`Br{FTec8rcHk)R>+DJp08EC_KFn`_wCV+o2KP@ zg+w^inGmod30fI?ZB>nsm=$sUu}r*RNNq>h_Cg*++att_CLS@H#4sgm(9~TlCzF;V5RjN1 zdk1CgxpEq^UVG?ac{-6t=>Tsr*MMj1Aa@!;QzY3dCR=@d*^}>VxO|avXO>tbaRBp|3N8=`S3cIYk@}M?M~cB4ofea zvnWb4tUSjyOR_X{LOkb^F^Z8fgoGf<&Q&X|pEUCA?f-oG*TFNFbG4#UB$%F(JfcV2 zF`b(Cs#`6@2i`&w#5v65b;XZpwsU6`U>l&NR|SpQUo5k*L{mzuB}$nUZ%=S;N(l&xLTBE0$Iu~t zG|i|{qgqlZAcR0f&V`gRH7)6_w_d4MwGyRNQHVq-gd`FO0T7@v`o?R|SI9`W+#KB@ zpp-(Okie*7ZT=7^8K_I_T<&ZSmlBDH5-nq#WstN+Ve?`_q?8mbLBuOZl_ThQ2uxH5 zD_5-ae(%CYd8Mv#xmwJ%aU9*hT$)!NMv`dHtsm(6be7*~v`H*F>?^iabP6BmBiAl#gM^alr4&BmaY_=C$?T{fEsn1PPlF4+y|zF z0{(MnFBIe#SE-cs`s?f7e)GM>vuC~c_G<|t-+~1X5kk2h{_npd{d#m+|Jt+d+qQiB z&37W2$ruw{SPtRVA8Qnc4;{XI;o`GT&Rz1*?4P&o`RI#HNeKzJjK1NAZ#J%f>(!=> zn{3>$9ssW9<^Q|?zX_v8u3!7SM6qr25380v^yq@=AAj-PZ-4B*aN*+g2bMH#*7Db{ zH$K1Y(f#|5Jon=3791pm5_0njpbT`nigV0VqrK9ea^(SHnJWq+Wgx*>ViNaZIb~wo z`XA9Lwj<^KbRL3dU&?{_|Dz4hmg@h|2Uo0)Qm8WZ#gE$63#5dctqgi#8D0$~Ix za*$#2`ImXmeV2bVEbkdrv2(v9UQ}v}z6RkOWAz@0PJk0z3IK$VoO8o8z{O)Cg)ji% z^y$;vxBhg~;6X3F^z@ayg8OI8WQ^|Fv+w3xrqroX_tA&uW>?NCD$GktN>o*)cds6w zezf7OH&!E2mOcG!vxW@@4;!NTVadY_@0&Vl|AE7IO_|rVW9Og0etX1-8y|gQ#nmhM zKA&QVM;9(!n7jDNZryu-_|A(r4H=l3mVEQb8&!XB=CrAE?!QNJBP+Yo>KC8+^5eH| zpD_NhCCf7_WKEnn38}ne{OuEOA1%1~<4@a8oHzpj1m%DK9@WCy_MLma`s9-jKYVfh z+s~z^r%}h*hEaOcp#GVatF&v|?&)VAY2K**-P7kEJ$T`j=O16P?9o?NKKIhApGqOo z@o2F9zdTE1vtY;F+p~=_E19xHL~e2}xTfp6p#y*r zW<=8>x@K}yaIPq9|9?jxduH{?vlkSF5kiW?y5FCmGS!-H(=fG&)hh%5DbX;vX>u*1 zN3@95qU(+%gj7}a&p&n@KXH;VYU-SuoO7;g5z{cNWBRrHwmyo8fRIqG?=kLO>$wx}j;hVVE*%&co;*Vu?+}p_?vP$818n zkb{mm`M zXNfj%>mXM6H>4CPL&}g)B(7cNdXxg4x$(@FEx|f!2@+z*N~6?@a%lgdlu%~7+t|#S zQpTuaMO$RdiVbQ3q?91h{u``xG~jWdjC%b<5!`<0$|M%p1ISp(+r`S5pAa)7TjN0K zbq!+*^Z8UMMYL7vpbvtO_8+G+(W;0;mTenl45=dkke{EwX6@TsxBUrDL{6)2DJ4iG z0RQ}V=+TFl8m7g_kWwo{k^>%5ADqH*DGCHVoa5+jOLB%SIkTmCg&1N&N(-0R;}2jed{_ksz@PG zB4d&$q)@=r$PTSZOi`V)u5aSjGqs;9#36ya(fwKVJ|3g&NkQtB$oZVv*Ugfm7Sx4izRzl zN49JqKW9o~RD17YxQpZF4fsFwTMr+N>cg&R#seRFJ0XD?gv|b{Qmdf{wy`j z1BZ`q-?4A#4TGjmxeWk1v}>g*%tEiYZT z+NFK#w8T)=$`!9($;;0#IR5YMvp5&$4EQAtXs7YPso6a^1PYWGjf zxlsJz?fZ=tbr;-Oxp(K_AKzZ3rizS$$pZl;A;17p3KY~~U4V!{B(W3~06-)Xi77w` zVHlG>xzGEzeU|DN4{=jB`u zB{c5Wv**V3@BMr5(7DT3(y}UMrl+-U(frp*m!WdrdGYRggOLJE4z*pJEpwaW;iM9l(#Yiwtba^ur`s)!cz)b8n#$92c^ zHckjDGmLA#{XZ_^q1Dam%^ti@4Wx{ zhPU1ud+ZMY5EA`<1^_}zLaC~#R)dm@U@+ix6%|Sp=97p*2wT(?$Qb+c?|+|v_J#Qm z&VO*>jKq)+0P3xMY3r}QB_<>wqMfmn5Fls;&O=0>&j)}$pK3K4@cRM*E5baMl!gP8 zo;-hP*^@7h9Nbq`D@!S#dSbDvDrqUn)_f);gseUprm3jb=^JXAJQxZ9fUcVYIkOVM z5+bEc2nIg;a9vtjs$rUepr3Q0Fsi5_&P_w-pb|z2*oy`#V@&mT?9j4L_jUkq{>-VB zFRuM-&)%VfdIkJ`;>5X=QYs3wl92&`;DRw`>2N{oaC&r=QSmdB=%>W$p2^LmL^}dn zMAHx{O7#1E!Jz%25P~2C0)DqGYeU#YRV?49ASx7D3^NWZ5u@o9oZ=o{7mF0vyF59s z;sry?c0oPDcKJkuz;*YSqFrR=aWUKI?H!J*(AlB;?e4h(y~Uitk?lRPIBm8I2*ggd zY(0}GO~bS}k;)XNFo~RVA*7^~_?!qNrYQ+QAp`&_iVD{9F{&yG1;V8jElLsqRaGcu z0K~LTyaEtFRZ*D21m_YZAXp(yYzwmB0KgQ5seX&6Qvw7e0b&@YwOX7ApHD%QrfCNz zW{jz-0svObDOFVgz~W_$F~cx97Z&aC`TagsL4Ys5-n4bg)+Zi)*dJh0ppb%d36v?S zpE&0p2>?oA8U_JLiIvt|L1}vhT8F$WU`*jc z03u_G>SF{5B3cQc06Kxg`tc+#3o6EOIMdWgDVk zWPy$iG*K`DFC%ktHOj@VtwOkm63R6lV6^^nuqN)eBPfHz=cN6N5@O42)c)x(Jqz@O zltBWGE2K8Akm{|Fa{-hnwxKGn+2|AE(Q%}-j$DF7>G%8n9(pK*Fbu(1bOXRrF)X(- z$3#j907|fcoLU(_Z1-U+%?tQ^KA+DQ(acD=G(9zi3yxqNa&}yJqD$r?j^(jkhOgSn zHvuOQb7{m-7(`=?cuNA|0`m)s5|a{q3QI@`2phjKqRZsu1kErL{3-yLrl}|jWy~~9 zi;dBuDxwrGz$j( zG4hhru{hm?02o3P<`<@=r6`Kxniwc!Il1`(pD!5l2ZL6KbM8HK;Z=4Vg(%*(aD62N zV^cs}Q!?~)7-M5~*`(ZR+9um&xJbETq%-#a)m9N(-?fx2^!y@(AR~lQH^u@uMr!wL zCLxX?QwRbeDFq>j&ksI701z+%RJ&R(KnP$AP!b@B5~7n3B{D$%$1yo;SB|l)oZrqg zJIoNUd|4Z9+GAVdEQd0Om0D{BGYS{@5gdy|v`Vjm*!o8S&l1Gpzhl1f@Woij@C@ABXIoyl);MAr zYuxC{b~J`t*|2WcZx?5ZB6K4yGu0}TkPrZX;-b=OHLJLvF(N3TKEJB^82~6M@dZ^? zQFS9ywQ7~Y0|qk6TefN2s7d`=HLB%Zz0{;xJpcf-oTDk%bTqhT+FPLhfD-Ui0?fxS zkZh|2>1i2+(!!zwq%4%^v-WKWf*SN&hX)Z6P}(lQmW7vKFccu5NGZdSa9UbYR(96@ z{r^sxx?sq#0i#CrNe(4%-?uL<)#2DQiAZnN|hrX7p zx_fB^U`!b=N_fHPf4Rz*j513HTD@rIaw8ADi6J-fg4eao5H7)S!#PK#vT}O(zne4A znOtl4!x8ixu0#O<>sAg{uj4lCV0N0%(1k#twyLt)TW`ImPJ^0tYt;-U9P+7tL@X}M z_4|E5z%Vq^FqoQDvqsfRxp@`R(;i>)bchpe)Ue=dez(_=n|VN-TeHA-+s?4k7j6 z1Bo8$E;AHYGbn3Nv^FfGnc@H(wu_FVP;_8u9YwTq=0beZyqIoAQ$od#CwhDfY~~W} zwfmO?-m#+~-Xiuh^oR&CV|OhaQ8x}m1V*We%5UBS+oXq+y+tr!SP0@Y825 zzqRqRc5Rw9s9)#5gU3Gp{L8eIJ2N9YD{arg+^(be3d+I6b_u=Ni;qWAC9)vv0$rc*``0HstFwNj!-n;0*Qm<52?*4QE}}3h44#sjV$FJ5T5@4=sp|J#%(z2*K5&gZ7zbY;%88>ElMrsP@Tu~H7RsQ&E-?1addvxzySX>nH z`>I#1^!twe6|%C9A3nVIpMR%JxvfHG#`l|l|6$XXE}h#A8{8Kq4+Q*24xf5??S|~E z)X~Fls9UF+5aQb(wru_NuYNr{_v_aM5Uj8gUXjVm#Jnm^xdI%Nb45S*Sd#xYAtzcz z6w%ynvGNq)vY*CO7_WD^VmNW_Af6^|4EFGBN9ZQ;T}5|VY{A??yBHb5K_{mkDTRcO)h+X)lxF8OS;GMg;aei z0Hmj-1p)z!`bjAzA&624!5Fp7>)F{A{Qd-2CrnCmnhu8jqqOisvD*m|=fL z0EpeNg*$`*I2%ST<8cuIB>)gGtTY5DiGxKzC}UJ9v;XJWx{DpE-7WzDDW%WnJAWy6 z`BTsTv+sc4@9)*8$9;ECN=XWsrfFsJL66G^A%qf?=u8o{9A$x6u}hp_PJqZ5yKw31 z(q${QZT$_Aj2Sa}(Zc(6!=QvX$~SfGIgZQ$Q$|mjFGDa#S`wlZ`OTNI(BM*&%A}V48NgYzpjD{0BIk?w=K`*3qr0@x;!TqbnQAZ z#)5LIA~DaMdrSKB0J=wra>+PE*E6b35eI!-T(i9g+%LS9l`&dG+j8D}N9(+BL~lxg zF`xt(C3eh78&bh`jBq}o)Qa>?d_H;b0Dk|4Jak-M$$@|$s@G;6+p?iI5MKaFOHuU! zNFW64IJdF+P_H$O(f->3LA>@QcPbz@G%_L4YVC5-H7{pn9psOiU80EOB9|=(#HQu7 zh194*9aTMTQ#g7mh<*{*RgZ@5DH?a2G={WB>vHA?ob8I3XYM@3Ojq1&J0v!C-n_ZO ziM^#jV@rCdbBvuTD%ZO+=zi$0B_y+giYIuzBSV#inRXx;C<025>MjCMZ0&y)fHbyO(3XC~)0t5s>+ zrrG_oA6_tXN$;JY6f7<(E-EavM#u#RWGDfdg-CB-GW!6~JNZk#xFqD8CbmoHsCdHkO)Js--< zuDEU6R>RN`AY58>>B3n+V3ZZ)73Eybr<8Io&Yrt?;ljn?gS$6w++^4G?ep%xyRa~C z-(P$6Vhs^XO2Z|kB~2UEM=3x3^4mXm?0$67T%TVRLJ~@duvU)5Y$kXt#Q)ze`xqg5 z?A9?}ayC4a-2%FXwiEx>!{^HX(8Fa&nQ#B+VLALR=8N(%?te4N#o&_-zFzKV5jskV z5LhLJHE$8vyr~43ij)}P(n^V<@6ABryY1NTdX$U;dHX|pDw)C5vm z0!$%75{h>4V~bc*0z^^(Xxy|>YD!?`il=H+eYR@F3ZK9K`TBR?yJhr^06+*HKXL5j zxl6UGR@}F5|G5(<8aHT+hPm^PU4QP{+o@g4@4wr0<=m-+Q~;lc}tj-2Y;zUiL5|9_d%0=j`h`U$#RWxw?>Rsz{rsCB^r9=esa?L5Q>9AA_Fq3; z_T1{Za~9t?v}Z!V@2*ND64|r&KYt)lyGFHOFt}jhk`LcrdG2b#s%M_+J@mGKqPn6Y zu$V-Z2%Z3~Wer+hMjy>j=nCOc{^ZK{F3Gme(#6&pU%q_3J(gC-5YA{Fj+E)G4gk>F z+%Lao>Ku8B!5pWqYh4JAMiR@mF`C5XnwTEX;+zE|)XL}J3Q)vbwabXg<}^cRg6;0O z4Amo=f~Timan$;nQlgvY8|ybLU;dJ!hCcuH$4@_a^P?}m&O3kNn=fWiN zhmW|eTJ3s8h5289_0tFMzkc-e*bMC^0VMB*4U9#l%akmgVLwMP2+}jj~+icdGfT48(t0gf{PbCLi`EGj-4Df zphu@}o$sCcKyE=PA@aTVKKYMsKrq05`T5uG zo!VTvdU?^J2OHL{)46@CmtK8q{X1WP;tPihdiUyn>g@SD@1A|)>_s)8zO&)el`9_Z z-nn&Qap}viu77*ur=g_anm0bwH8E?(xRj)nr7TrM}O<_~GmCzNufY{?vQ#Obi9joI7{?*oE};q)$Kpm=R^}>{*vC=f3;?hppPQ z?%lmJqvYtxb0?3T{%h}U$;~liZmwCq3Lx(MYu{Vz-#>ZsSeuqDCQiJ)cFn50_UyfU zCGXssQ#=0rbIfhG_V3$g%humtU;9=tlrVGFz0DgnDAEj-F#zB~ghHWRyZ0}DYDIc# z`uusb>ej6Z00$2pfAx(w!jZ_mlkaTZvMCq%-H+P@H-`@Dt?9;hKmL-G5bWEl>!!`W z&&6^jNMl5(RO%tUcga(5F&6H0+_c9VNIHRghNI{t*1U~=r+P`-1 z?%A#T9TUeyO2ew(cQvo%ndetrxNz}?!Gp%$GVD@L-sUZT4({JAEhXvX>GQvA+j0BY z;b+cX`sAx$Dr6>q@cw(FH?>=+tYGGmC=FLA27&!RuJ4e0w!52S#v!z%w1`HavYSk06Z zFLe;#HDWj-07ImV0(04)b7q%POIdUV9gkd5PHqR8BbGy=&!_&id;f%qGs2wTbko4g zxdqRzdUf}%-OsLEQ9V0_3yD$+A-EKbGF4F=6Q%8ut*8tLMU_L~KaW28M5oT}dv@;_3G0+mA#ION%RvrN3JDNRoQl$N`9TCAj8Q2q zKTRZrC_xs{_22&7wP=nH5v{0*ma~IBSqP`kUD&hZ&yi!trXHPM_bj>65E@ zMccQ1f9v>ZRXVrXwB?sOCQf+&!}mM2Z^bBG{l^oN0;Uw-efx8}P93^*?Y#S+z4zWT?dNSf*1q_JUu9fy0w56yp(id}{rKZ=UU_+W za$-nYDV=OX8wIdjAEjvu%W&bkzvbrS@7!}BqG=xECoL>2`ep0ycTE@@2>9N7^^FE~ z>h$m5O-jjy1P}_N?)fCw5)ILREX#8Alp%?+W<(2?XLR$t!g#!JJ|>P#5ryt3!FTY+ zqnmrc)B}yuG4DlLn-y37+FDPH)ajLkW0ffc#{lPsJ$1)OqS$BQ7gB14lOu%SqmSYb zUyIWx&EkmU5>PTiV0|iC`!<_92YU7*#U<$XJ4Sk^?$`||Yv5LNDbqAjA|en9s-h@N zu~TysXSm=&SeLuHJ#;6~6Bf-85aQ)jcdcAg2yr5@m7P%wn}iUIF^hD#B*(4{k#kN7 zr3`H!scW1wb1mkU%J1D2v1~kL1nRO?xc?G@cIr@X6;YcZ0d%bM0MXEO_QcV0+p%jG zLYRgrq*PT!Q55Ro7ha%^Qcf?sh|=S03NNn31O7LI0G2zSab^Kmej~ONciowc!MNCN z*a7>LGL4kev8XbK(Fak?A@R0TaMYnFXvef2qxeOslFe(u`G`Pt-@<+6a$;-Uksvb0 zo_qR{r=ELt-G&bdWo_HE^7#YzO`VimRQSfm51Ej?`wzPR{%NYBRIgpLVr@SFRIO5_ zU7KdQri~nV!|`($zxd|6O`CtrznXX3*qaH#d2?sv6_hM~d^rPX+@N8-di66h(?*TB z@#*JZ(Kz4u)+?2>vr|*kb8`#E-hS(mpSncXTjpf z+O=-cxOtPbo!0e8mkupC=O>OGe{bVw_fNa8QpGeO1hIl)xblrncZowQJYeFi zPB}7!^U%vb+ObhvP z@`}53={om;X+lcH$1a~cb<6mB0s%a(w7UZnB6N7tUX3)SwOkbnD)2)yo??cj?!wcc&$fKk~v0Pd@X~+C97e zD#*K&vgK`Qw*ge*Sq|K{%pCw7RvcXV+>laqPs26URRB#NrX7ZhUR+JAI2TT)B9) zMAI%@$-i*v(v4%r-869E>GKyWRj!~aQS%xhr0;;<3+FBGH+0Oq8(v?x?uD^;&T8Fj zWZva-2^A_WnlnjJ7#EyU;@Fa6=vBFTXB=30sIaT86BjkgS2AKbI$Q(4;;%9=7HuH* z)41bxPLY@)#X)|wx3M_lHi1|M_KD4kVia@$bU1G;&U)`-G$fDU1^`yfDRdAI%R{+X zi)KvK-kO|mz3V_A&OhDjc+03#TwJhx#S4uaH+}upXMg$Smtep*pij4rZ@=H6ZTl%x z$2M(PH!rvF$t8~r9X8(Yj5uQ^(Ify>woaW(_pM+_U{JBdh^{ z6mr-0zsHWf#pK4y#~*#?lTZ40@9^X1&6LoJSru*^epA)zl^qT%ZIF|aGHP-WkhZ!f zB}O#e?^DBCc=z7_N=m~3ke`$D-+`mLZYT;laqL9(I`vL(@y=FOW{yH>4) zgg~D@qu$=|(TwSn`VZ{!&F7mQeBhpD%^Co}`Lh>JoH&)3knqmN58mDQ@w~ayTeoih z_+wAaocnO|=8XVg+ty!(3?KUH^Y?u4(Pt}GzSgyK=iWU!p{`pHBe?i`|G! zr%!L){Ns|RmftgJ^o;5AUw{4W&K=sMr6jl^w{+bMB`0k9Y3Gsii!NV0(WZHWCm(w- zDKT{V)Ws90&ON?lZr2Vinm2E>aM2TIPo97I`K8IJp+$?A&tLT9FIztS?wg-pe16^Z z>65zmXt#dDmup^m&%Eb0MPbK|o+Ln?TlrYy#2q8>FcKTt6a&sQdC^B?#=hPVQl;D%VYl@P<;v_QUZvQI05-%K+uAe z@}Z?>95$%Wi!Z#k z@!gMFcWQU;%<1>u{dCRRRb4u?dH?-S&!4~0uW$di-dK0;%%wNqeDRlUzdirVikfwr zh7v=j2^%(iyylH{9Xob9boB6(%b$7T(Fbc*ucn&@N=ys|zx?LMc?%zJ(W?3B^XF#V zKllCj-#&We$b>uZt5v(UKOu0-gnM6lc4_}U-PWz!;8V!ZLA?#b{N&TGD`lqk?bY@5 zHLq{m_UGtv{&1IO+r(U>pb>f{<&tAAxw?X}1fB!Sp z7i3H+EGiy9@xDWcPqt{+;=#w3?bx;N_0`Lc96fdWglQSs*^QdknX~v|e_}$%HccOx zF}Kzi?{?|X^1y*3k3RCm?YE6MbokW6i{|y{GbF7-<)tfL`tr*ktJSV{xi~Uq@||CQ z^GThWRhO=K>C106-86jgAHVOu@4m-A{_utGe)#pZ7uWV0Fi1&Eec=8@*_E#2#6jfzFgyjA}fB-RcgD{0rVx{I* z6~$U!iO9L2gjhl3P>28vaw((`h-jMJ8lruW0}!Rmu2y5klMkh(2AVc&{J``F_8mA< zu|fqkA$$31Z0Hh=*&YC`XaNBK1WxNh1EFj;XH{u-RHgHEOh7rDfexRaug$Hl6ZhC z^MMCR?YHQNeQ`Vn9Z2^;EqYNn4xt<^QIhBv7Wz=IVysc-K~bj+A_!qgl*lMjLOJIP z7SOe8NF+j&l9Z%mDFh%;L$ZrGaPeDl@&sMJl-w`^N=iXtKnS4(fkw~B$8?GS0Ao~D zg6>mI(*%_anQbm}bb>gA0KhS+TE^9wH|0CaJ8wN^*{H+{u01D?;ky3ITu9Tj!VWk_ zUIK_R5C{Mw7s6w!MO(DB*Tt?)2uTPsrr5eBdaQvlx`frS7)is~O8|n@v+`Cw0AMGt zaO*&cTndFLl*K4Iv1S~r60e?xQiy=-j%}w5cOcBupRzi;Tdu4z^nbkK9EP0jQjd%l z-81z{OL4lK{S4wJ)Rwr)7zxTTK@g>kFzV%gU|Zxo=GpQ_W7%^YT#IfH5f4u)=R?~j z9aR)#I^ckoW1Ne=a_ib!?lFkroX3=gykauTQr#r_UyY5?Z%uE~Kbdz0%6(9^3xc zp5nryP956Uu2oe?IqQL`ow{^jJ{I)*hYTIqu49L!gg_`5Sn<>&yZ7!b$j@upym{5C zl@W2oh#Q9t8I%|b0Kn*x!`iiPU88zsMOD(%Q{!eJArzc`?)yhvjxmZ=y z#N@=s9-hYr1blPQ|=xog+#zQwQIik?Bj_EiHO*< zXXn~=YVG^?KaiMJu|mt{O*JjDW9Q#38aGT#3PmE?m|I45?c6y%J(&<CGG)?j2M+GPW%#h0h7O|y zDrRTB{KAtTeg3sDj2ZXbZJJoSR<&l0>aBg{*`0swtell~-_$9ggb)C%e z*Pg0XD^yu=>eZ|NcjzbqtX-={!0!V@pp zWhfXNG@$?b_da>%g;nEky|q$yMsiX@)!KDx)~?>KXII12D^|!j{Liu3a~2ZC&lGX& z_?gVK)E2E;=H?fS7(NgHatjKRlG7Ab5mH8UJuxLQEiH{wI_ZvyPcL8k`{q`&?w=h9 z_yPgnvL_$+tIW>*0G0>>b!yf6<&VDzqX-z$bV8_4p;=iOC}oAzjEuB2!!U&qx?v`! zBq9Q1G$A>0+}Poxh7Ytx94RVYx$;EFPV$*RhdpIh3cTfYMb5Bb$#Ql%>Q+&yvVz@7;y86SQ1!}*IB zz@~-(1pPiWBQt|C1pri^uSeg()22*JO-bDJ)3(3%{&zJuFD)g(yCTIU#_i*V-!P!L?f`KA%*pc}d}`aTJ9q8c zSEoVk1#_oRMj2(BfBr2J(NvX&l9GCK?=Wm=cL4bM>mN@aIr`V$iVw_OaNyvv)2GjD z-}!g19$gwXZ!u@?+{u$}yKl;*P(ZnH_|RvcedUgccTK-%a_^pa%m_u7(ZkJhfzzp+`oJy6vS`UT;{x?#$_T>RhB}X6*QF+m>H`J9pu7 z!0#_8(npUPe$!1ua&mGPE_y66Iq{Ck)v8u~*%J>%!aNuZ=H?YV`@$=k znHj5}Uw-+@g#!ov({l# z`O@mwmOQd(?6_Nh`Q_KchmT5-09FJ#RX5DFZ*TnjpZ%YIygo5GY2~U{fBb3_5ca{x zpMU%9k3W3(d9&t?KK%Hz`|n?H&)wrU{rL0W2loHBesy-G%+Bqa)v8g+ud@8yTq~NM zDfImOTttv4Og%Dx_Fc`IH!R4xy6c|<@2!8)l%iqdwtwz95by_6kRfKnVjM4{fxY|89|M$KZDxMpu0fpaL15GRlfcokQtC+OVwDRn_0N{qfhH18ZJg*``$!DR^?o zKW6x#GpEk2eE!utri^RXtf8tX65&$L)k;~J1fZz6#HXrB$%(lI#RYj6>(s8vIX6w= z^E&}Z0j&6^0lz;n5IB1H5FyZ@Zk+~o>*%J`4Ko<@6Qb-raHLw5?2NROh;C4ysuK0` z)qE7ZVs-^<@f1n{KswkB$;eD+ioIW|X@)iP1PP+#rb+#3?HUyU zVEouy=FeVu^7PpXX~`guqFkmTCEDDH0u6FK_cM@05JTf!2qD^M#%3c zlwQgytXLrh0Hj1aEv&QDgiw!p0svwTyJ8tu5n}|nwkjR_3ZtT>qgJ6?14hj^-hs!! zVr)AW$VxzK!nyOIW&={YCUQY2L8L&5WhY1Hh^R9i z2!v?i$dMDL38HT3Ss9r%YgI!jC0bOLcuq=MgNlYMvn5LjV29a9$Bouw3@anTdbXvJ z*r$!{Ig4%)JB2Bwx^Dcq`KJyY+gHfQP=Wyfu(ApPfDlqumHq$z7YYQcRjXoUSw{Or zE22b+C^%<~QECMhRl$CP_WHZ(N0b!W1g~t$Y8#NOz#0yeVhjjG2d$`z0*W(Ycj(~! z5vFNUN>o*G4=-Ezp!$6O9y)a3pZ~gb?_8;3wiHO&b-flyG>p6hfl&fm);Z3brinyp zc>FSXKO~-Ld=Bjbchu3Vygs7ycUeivYd>*stcQyAzWm+c^3=KVN_iqfcmXn|P@Lok z;0V5D*j~94gfWXA^~1C+Cql@i#8Ag}t=uwF%3#3XsckFwCjeBdQV9S!=NT0;GAm?A zDGbB(`_wM&TX$*S+A3)nrmh=V71D1Q)YpDungk#-Gkxfge%6yeNP*kw~OsR_4tkhgp?SN_Er7%t*`1OgBx=7_C;Niq%%Y@2^vZzW2A%Bj8lO1%U*UQ)b9?&K&xLdS&Rq9yy_7zI(!$xJjQd zX0$~6M5!ePxv$cblgHgW+*%SLM6Yfgdv)t*kHy+LCIrA6vDeGFJuByyKyVU)kf@Xs zd&RJ2m()2B;VI#uUepX`|6}hy#fnbe?sv@l1xd2^Yt_JC+1vzAJm# zTALMnJ~1)$+KbEEwru*=2VZa5H1nmGo^08yk)3!<=S`OU$Nx1JMJ1?rAnnu z-)dA-kpU&tyD`%O=OHwg_tI{geRhq zl+;ASG!@3yyt(nsH$U#)y+fOp&Gzg%=u`cg!AlDZSTLZQ)+&KOZf%to7Z%lM)YLKt zr=_O*RG(oO5{W+;6o6a^K#`J?BrPbWgd$Kv5dod^m8Qhnb!w}s%DG5LOb!GS1Q*`P zr35s?Y~8&6h@pL~Ct4&D2nHpHgpi*brVxIGDHK40NIKFs#T4um5&@eTpTV1MR{WBilV}j+I8w> zW~K`%2_cHY&YU}Y`uv5vCXLHTOG-|v-MB%6y!`xq2M!JyJfK$1>Hsiq?C2L?d+XGN zt67=Zg?S~qZXjSFpi;&F!0!(~$^UuD0`*!KrRw54R-{-r} zzt*+L58rQT*0OE?zFiF6xP8pX=T^S5`RA=CPMvMtu6?~a)k}&?M%^$B08XAdo0d^A zDLH7EW`wQ>c{Ma9aswQ%^K|Bh)9{rtJyS+gGT z`IUw(+cJeJjMi_|v`wqV1fXyKo@?HES5;|BLV_{}4XkrkWt)lN>(>(~ZD#`lKrp6H?hr^^X{Sy%P`hW_n0P+IXo#pXt;UJa zh#;MKeEaqvs$R8P@7`U6kO)MWrm86IS~lhgfBm)J&y*F%G7C{wqaf-`;(rM&CSh=9KEys?L~t&zxBc z+IQ@I=UsP>A9st&h@$u}UAQ`P!Q;FC-Io~j_37Sq`J)eAzI^4ON1r-$Rx7WRN=}O*%k3Dhe;>D_!D&0Tx-lU{tUFR!SymA{^!<;{ zojSPUnWc!hb?f#{U3(@a_%&T8K!gzq1%pEe5BhPzlZGjL3MGJ2aw)Mi97#=4$BiE| z`M&#ea&t2?Q#eOeWtXnzU%rypw|jfP-$yC==*w^a+_|r)u;{|s3)$JJGiFX})wu4z zhmJn|%&Sj4Hm_=x?7#m0_q*?Znl=4SX$sxc7CpTD_>n`3k1bj}zjNExL`uUnd_HDy zdE5A@w~rk?WMI#;7cMVd@#62>_oO8Hr`>(W@S6tt{EFa`5RW?qv3X8(C(*m=aZup_ zk8*)Ey44!B7?7Bkj+=}Zf65UZoe!+=f>CZ_BM!J+kzkAuf?Z+EIIgFyfrB2dCn^B| zO5-rpzU+iK1kN1g4?Y-32m)0=i^vA`=tGMktuoPy@Qe51<@Jz|NQDoM9Fy}G(QiM; zl2Rnh+0a6VB}OYpM8?>e^A{#goX!Onhr>Q9hYTLH1kN_hD05}(l!an}^)9=3jdEUHP4eHl1O@lFN6KJsXQ5Fm`05DC{ zIxlYJ7Wb*@j_tdrOr2FwqCfT2W48<+sB=RFJLj|2Njsc?SL%;|W1nf75lxFk zB8F~fc;H+Zy1|9uLWCollu}4Ak>wTZ7jug)=N9J`MIxM=h>|KLx+v8-P=*MRa75R2 zRZ$GnC=G|hk%(a!nx+v1(=Z~MW|=k&(=<#Iti#w=if%+85Q*rerQwp2(uk%DAxzE( z4C>XsU1KRxRTM6`uIpCLFMGx8IR=MeltVGf+MCN3aIcut;I@n+5hb7vn`qz2m>N9g zz0YhQu~VE&M{M)9=vv>Se`2A`z4O}jCCKP2;vF_Zc^K`!i-GDWh4$3o(hir7IOy)u zJ_?@Gte$oqbR&ciV2tPnHmebM^@+MIdZm<}EWlztCEJ%(H?dM3Ut-V@R|@mb7k2EI z`Qk&h>Q(e1qR&SaMi>P~31igCAFnV%Rb&b(3>YCk#wb8(X*gUO)*_k~(KJo7^GljM z=SrTG(lB&G*G6#V^YvD-PFia^W=UmebT{m>y zFgQ0&GZN8sUDtIz645<-aRd>=5zRDoB7~;t)?-c6HBHxb!_bXLM6=K~9FFL^Zta!p zx*<%Hn+5^UG(8fDXqq05L^NGDO;b0FNJNv|G)+U(bacSU+IHrg8-~eEQ*a@K2uC8i zuIsv?>pD35=g~!sYL#U!2g)3fLPW3kb`%(h9Wt!UcTqsaIEb}S#fxR=d5wrtN?8t& z+ilng=*SMy>M=@V%LP{(Z7FrS9)(#1Kq)PgT&yj?que7Exs>fGgLR;??_y_A@oDkOhl^=rdNj(BkKoWJ+{e)>XgNpaEQ#gG59 z_W*S+MPa%r2KVbW;+6^X=gwR3@YA1sx%u4>zPNSVJrgHCkY7-gk(yRoob%)6-wqr+ z{^ERwHBX#@?~Ce@r>#B^zYwS*Gmn<1ca3Ilyj#}?b`YGg-cfe zpfnsV2^-;Xr0?K<8{S;|{zqTu7DN^;dXR#zVS|Q}NAmNphBZxLOi>lXH0|?8#E}6A z3T`Nr0RSVixTKhKt|&}!Gol;PW7!1&LJ0~ZH@AQb5eY{$P3J-afTl-^iVG2t5U7}y z*|~kIwQp|xcJtO#r_Vq2)XD&19osdlTsiyupZ;9`;dkLu{mU;lT{w5KQss(C@jp+&dS{T&p+FK`*ZH>sqI=f`EkoHT)_{Pg!lKA)N&j{0 z*UP

HNj3K;X*Nykn=%RH;;17)58!owYtVf9_Ixa*EGK6-r8ri=~vBt_MRw-7u^e zK<-Rlx^l((-6opyHayjS9+y@`of8facS@+(0%ScVhnny z$%%=VFXimn`!4_>Wd->~fj|%dgp`2b^Z6@gXaBeFfHl=S{@NP|CL|<;YF4Xu`uKl2 z`C*^mck1N%oJ$v~R;%8)Vci3N{Q&@pNr^=zC42VnmnaKzbC4)LRXus~9HXcZ0D?>* z5lu5p&ZTJzA*C#dL?~qnQ7WXS3caL%@9q!IyLZ8?DXUg3Z`G{66egvzq$Dha5NIMH zT*ydRyIN2b33VSCIuLylrTz} z1mIi*eX37kCr+N(xbE$Wnd$f6b4Px0@m=@KI)6F;mtS^1_w2fPv+sHGv4!~s;pHn= zr=%qA+`jXTHLELEu2HXkohMhU-0;C?exL8w(ZklSetb?l%L?Bfacz$GFA7L`Q)*|WEIubzt*&g|R2?+YtmSn=HJKq&&4 zoQJ~^P1A*t<*t#*ITylGdJxg%+?r&Gl5>s-oD0)5Eqj7t7~UGBkcMeUM353C7zP(o zaxM(R42Q$IZpmGULSD(qlZedc`|0Oji;9W}0Ycp-@bK|7moDWZf)HHOv~a}Iiwr_Y zUVh%Mf9^Pa?lPeY0GvL1>Ee|<>x{W+nBj1wq$F$@rbT`X)8LXDh7pO_h5{Q+t=>wh z>3T%dOwO%Q2qAUdh(t8Y7$Sr;xovon67vg6a`FnTeQU!ob=?eyb;B?bky4UZSn$n{ zTYlZX2Y?99rIg&{jMCiv{8g{MSy;lKe(JFnO&jQjq3cFTNyIcvi;|i`n5Jo(rl#rK zvj-fzvswn;%B)=!)UW+2x>69YM_sd}Yjq&*Hz_Mz#bC4Iu`d8Xys;47oEP>HB#2s3 zUA7eU?2EHU+r`Qm1A;@Oh-=FzGYtCxcZ~2C?U>tVn_4mI9)EJi?wE?~3J6%6oB+s} zeMblZMj2x<{kGh*84?0+uvdiw0E=p*&ipXOtXAA*W>#_;LzWrj& z)o)(;;OoM|%LbSdP=X(-R`cI9B;(%k6&u%3OcN<3lmJpk1GF)e5Q-G6BOJD2kyv@A zq@x--W2jQOa^ptzDYepXF-nQ!@kVStC@tDa04Sj-5eZVt2oORo(bG;Dh`=m<;P?9+U?xaFq68#Jfg+XG`CPCvkpU%y zFe;=307YRIm^jm5MJcwd1%xp|DV2!C8l-0n%VXa4?8AE&DykuSb~y%RZwun!(xUZIUEOxtcej8X zb;C;!?L*lym3w!G(DN{U)6vuEYi1UKPaaK6NvmDIK_Czyg#NwvV8{M9D%|KZ_}0!H zo9E``zxc++di5JLYu>~<)dNT+%Ai7@Uh!CZTI%X`@AKC-An+7l;L%6tRD#MEt=iS^yl>8|8B>=$bbm%>dIJ_JE!FOwGU4BU4?gkCs#UM8Iep~VBM;B5Q@h5F z9lI)Kqy$t205UUD(vpG{5C9luQX*v(1y4#2rKTkVfKOEu6GB!_K<1;Ssau;y?!`@0 z0tp0z3S+1$gjiXlAtfO(H6es3DFxFoXU)9p;?>+KvlfLE7F2_eKRh=f=o>M7$oD^Q zzw5ratD835zyIG*LPAnXvS}J1O_dS=C=EyY_UZY^;u-I}_u0 zy!@wDt$ppCkIYhS_NwIjKL7HYA1R9Op@$X-L*Mw`XE{ZY@iz}gA!Hc~ zR4iN(SB{Ah&aS`9dQGT|=Ya8bqW7)GXTdhqIX}TR1jP0<2B|#4ii1&Q+;IPYzT8QO zk~IQ$_Dull^Z889N8dE)?G2yKTJ*%2;X}Up_S>GldM%oB?|}Y&7C!RCzJ2@l|FbtU zJ?o}ngD+pc6rEL2Tw4@G2Mg{F!JPzmcXxLP?ry=|H841Y;O_3hEw}|IxV!7SuWCN{ zpeSl;=AM0acd!1w`)E8dO;-dH7AB?m6V4W0@@OyyHz^4tG_VpOgCyYcXJ-2E{xBo| zuBXA2FZB(qH+@CfiNM%l1j+Yse7GyDc<0)zMlVKI;8Pu?D={8f<_@d zJvB+Y#XraWWV6He*pBgWDy!RZt(1&(A7{51cTYtYnv2Ph_dpE}#BTNX+j^$^4K4!_ z_xG*l%@!km*K&=lMJizUGDbetppaMLG2zzt-E(;_CgC({cWW-yW z%MtJ?E}gfUDYstwx$Z#Vb@J%E1K1Kf10K%NDWsqR-G2(u(K-J){6XUXxW|BLX;w(n z^RYow^z?*Vv#*2~a5HS=%k%B;rQmvp@534D-N_=!-=3v~aokOBAFu4_+RqR6e!2B(E;~CrzgClgaiYy-^x#3x!G_=EeilZSj>_qNtu02Y zdV}BhTa8GF;Nz)SI2S-7(sWvBP&)|@UaOF3i&c@t=V}^HV?rQ5p2)$KOf8ZpT*yOW6k1rSFNHT@ER35g;Ol9^sh0Kri5-Sb!VQ|d9 zhOLE?&i3pGK~nKMKyM*+UTB?y{~^j6W?opLKiTHZK~p2@om4dV6vZS}-l8YKycgt^RwpY69x1SG~g5^K!H`A-Jj~xS|V?< zQNLKILJU^NQxOYVp1XKGipXtwdmlGQ9{z%bmM1w;{*l97Q(kTX24;cXZnKZ89ZM_{ zHEfgg&r}GuP@0E=97pqQh{belv#RiDVJwn#1z5@$mi>Sb9Zk2afy0!(SZ)3m^yb}Y zw_!hQ1j{c+m$!0o5{m^sY)!w_m^rz_Q@yv2m+!$x zP2svZui^xbmG>FPp4G+G8=Vj3?AxrW4~UX{fS^bPQn?V!3==6X`>QrR;IT-E3LObk zUhFw3pew5x4VG<4sME65w2yZ7FQ?&Aw5ol$xpv4RP1_Jf{V+Ms{V6d^V zD#VY%=Q(!2mU>iWf=EMe%c7MuK%@*Tba)6lf?q~Qqd)`f3JP;rL$c&QmK#V6+RdEf zY_NF_l!V?wH!l#O)hC!K^Ha(?**~M$_SMk)=PI$qD$~M&&=r#Pxl5*c>t(}(JtzfF zxPO6J@oqbW4D>=%x_x&e3B!Rk5#N^(5d0^o^Nfe>Z6{S#+Md$GAH%sP^WE+b@l_OS z(3Gl>re9SF1pS}a0?DAHP)Xou<@$c?4nT{R8D|z7)0gKne~QI;$!{w?D?|5FJ%>}8obYqAz6R+_URj{~%T5U}o(=knmNUB@GF#*+wBmq=8-h+Ot8Cpgel6~)0m}x3rnM$xCeOr*zn(fGp}+)~>yK@u^IBIr{F**<`h zjUWH=i9d0>Yt4h9epmCKXf0LFpt`i(frVUXUC>C;DvRD%j}8{^xH+j?Xfx;bGuDjy z^mA4TE|D-~!5QzaiB`;nSv^8B(lB{NdEM(RC_axfP72)`;&sBM8VHc50zqY6|o1UJFQ;c{@ESZs%~`H zSY!X=?QW|on#SMxZEn%1Z&1ST<#wt%QJ3J}@A|#{le>+s{D>-{hO7dkjnLN z!{_hUyZ8&knLy)eliZhNSCD@DZr(l7iZo-phjjo)%`eqKJ38luu@akwQV}@ms5jVK zef-;x2G4+kPwrC4B;eH4^M@}-*2^_OVB7TIXR!i-9NooF{wTD}>}+7zHq>u28FyTr z%;8yY6xsPHz=xTb!`I?tJ257Se2hqEqgnMjhN#44r@XY{RL@VMmXxF^@L-m+(ggZ; z)d!1#fgwgF1d{K3+lP32o-fse=cnlhEXh+0M%oR!R3K$6n8e37QmS|ozWTyab}}q5 zMi^M5Leu-aETU(-ek{~Ds!<)DuSu|(fK1N0Eluv z@9x|H891BF&s5Y@VHS#6^Ti5t0jR`d(h4UlMW(7Iq8*%7M%wR}b(k~_Z1ipyD>}wz zTfg6B@Uej-aIw}Q$G@usZZ4hAHnTb_QW~Gad_qGJ8V8rNTA>ksfO_3E4rR|p@*xAU zq!1}m5;1T|4#l9eW71qqExX>)zKc5KBRHi3AmRNML<%GGARvixMF@#VZqtA`QP zXuo-}#uT7g16|De&;8-g7bFasgH7 zj(EDl{pB9GL)fo2wYko=(x-fZ4D9=x-`0?%HplsP4S>Jkqths~ z3T&aib?#}InH^3;a8ziHjo7{3sws88^bT828D$F`ykE7f+hqFQ9{$t1K?EF{>zxvF z_^uY7XMcYp@|f(#>F8hsI8Qp~T?H|=**S=Bx21&deBV!p8CKgLj%S+WRuA4+{I+(K z0A~N&@7soe2|-6jBzYAxyQViKv?_A*J2{RJf4M6gh- z)WbzZ22RbqpG8y>>bTxBEty)hRd(Fy3j^x%>K7$s9Wo0oTNI}R9(F5gx(q55CtxiU z1$-Z^R8*W}QWcDhI=m-NPVR}h*V^QUJ1)|}nOO2Di`pIgdnrs^E?d)4_e8vIM{B%1 zbVn&#xn4&pOE(BH=NbHyk>Xfm$4gZWR{!`V;gmVuE`Jv*=#mEZfxQ|^nr+wFx3si? zI-=PMN4u5lh$xr8zcy&=Jf|kz2{^uiWd?q(^HD;J#n!!d@l}8Sejab|kuIvdefl?% z_EH})yoN$M$?6+7(@A^{scv^CB&BySS$9^k@bzI6K?nZ`TQw97(7ql1 zmTvqDfi2gp&dkirPB!|!eH#Vw)(#L;=s%-mtyOAv754>Zc`wjsApK^(W9WHbEH>z< zjJ<`${UhjoI-r!*oy%*Fu@?^A?zj0qj>~j+3S2~U8EKS${&fH7r(3226uz>=lrzL< zG;R5=hQX_zQHDm77peOpZ)i#KP#P))`mpKdII*5>;qbAb}Po?WPZ4v9ecbB0?<^ zg+(W9u$9Mf;!cW7O0ahKXg<9LKl&mRfJ0y3zfCK_!5L6%j5uuMqk}lB^cqYC<@?#O z@|kl*X(d21fDJ&u+l_~er@&y?VvSu5BZMvrXi4U=oF8LPa3-I-^Kcu(W?I+U8$_Xp zvfdNP*IIaJba^xM;_|Hwk)M3y=pcF6K)iLf)}Gmz@%+o&?(zi$VTJ`V+wgjQ0bNyC z;R(ZGVU0!*N5~yGPmx{QFfhv*5BL0{2Vr1I%7>i4Ac9IUIQ-M(5I{lX|2`?nBR~kN zijwx`#(v9(4p3%bTxkAi?*cp}fTs;9nQc`liklu4@ZHPGD!%$W{G8tfk1bSS@8Vim znqwe@(@o_FX?1z;MdI8)LH^j@4!A$FU1@cel+1LuNJi7uR&}|P^g2t-7(&9q1dDYtmoFO&ce7Hxmyqi!fzZ?~i0!Z38$ z62|g8zK@TiZ=7Ubj=iIyV;rk6LN}u~jAR)57ObSVX%`G`= z!*S>MAUkVq9+@Fuf?Ss}U#ic0;5k~3u?l(-qv&n;U6I!y$stS>0o{*=a)pZ)W~C^s z_WkcFZ6DFkM2|O3RP?iVT_sZ{d^UuaMQ>xFB&!yxB4Cmq9t&e`ooJCqqO|n@&jFTkbsWx4v~54tb5W^H?~~Zcjwbb)e<`cco}=3A@YktL&5kC%Vd9k+Ez)xR@@?N$GTj0+X|NB$ArDB^Ni8rDgy>C9$1MfvioK zahfQNBe8Y)ht*VxF#-AuT7^TV{z}!~Z)ybb;^ey4)_-}G%B^)}WLj%W3u{Z+duj`7 zxj#o8wj1Mx@AWcpALxp6Da>_*MJkQYYZ?=Vzf$L|U~2;&pLY|G(|+?b#$i!N&kJ z?So?L<4o#M;S#MyGHxbviT~wj;NKE=&14QUc2eMqiID?pD1aC6L#0?#dv#i>c;x|5 z2Y>+x<}Jz#*N2P1Z#P(mAR6OIiqEktERh5Kl$x;Qi|LhRQR0=Z51AG|A$qt6Yvnp{ zKy$!BN(fh<=#;HVX@u1fg%b*6oa?5HKVK0FPJDF!diFi zMr0}Wbn+#oU{{wJ^3 zeXuycs~`*P9lbMKfDP;><*3=|M;w{GZZIg>*sgjf9 z&hDOP=A$Jc0(Wi;r*-D4r(MW|&qD4jG$iQA{p<=35^>CJUDd@~IQcl(X#}0IwQk5d zb)SQn-ucA2x}(6VPP@gs;k(6H`kCRvSaXCU7in@>Nr=|RR>vdASo)GwhOp@ZaoYU7 zTdA~+@{>OhiRyOxnI^P9QiQ>(Hq}) zK;n>zbLTUBKRi;FY&bCTy_r99m5R^F6nN+bH?}kNJTsDazaHyZV-q?&*(Z$dVJZox zBK=23y!Ku`lX}5;5%Qr zX|WMZBP%DT+j1e`cW$~kcKY$~P1Po@NJ$_j5*C$2r@>;q?FN@#qrAg>j5!>yz%gtcULx$&MZuZxsgzn2%Oa3SSRtbAd;DI64H(A)%r(ZJg6hJ`%8Zarc z#^&|OeWb;Pps}RKI-{1$^-mvvqAQJ+%MHu+-dx=_`gDEMsZCfH#ONf}6Nlyd2=PCa zYmXfy0d%yq($Y0To>y#0TdYF7+yZ*8JF836vT~3&dI61CGlE!PhYH-^t_CLV4pJ}Dl3cy*10 zDWB4LotHB5Z+ZN;2kLD@t!7sEKhq=d9BZ|B6^^q0>7(|EOT6r)-MwC8$z6=Aa6m?_ zIIi7Xb^ZB_B>iPNNNm`F!1-k_n_ryY=}>$Vf+AW@ZmD_|AZvQY6Y#Z}M|Ar=Z#X?( zs>CF~kxdzPu5=wt1D4||LjIaxtv(k&Rz1)3I?h9yi2(kMv)z;+SNFrev~Xhpn?g_4 zwSU3qfs2*4#=U(n%!FStXe+`A7ahLnuB?avAo=*i85!d1M>gV@q z<8^N->jnYQq0Lm6xyrnW*N;T|H5ScfqmN4IYd{@kC3XsyLhjwShWHR0t_yaH?LRlT zH9rLd%;&4rs1-AT%HFC`I*y;;ub+U&)7)-maaMRx-qeFFftm zj5^PD6^c-VE$1BD`!c|nbnSYzdS=IBjm2H%#X(HyZ5vn*pS3zJiUE~dSpgfI@6|jz z=Ra2)4K^2ZB7E=9reKU+*92UXW{*pNa*mFV3BHdN8gyi}Y+l#%X1!5~(-DPa zMWfc%t94Xcu4C;Am69J^n@t~E@N|O!CXATXt#3r{+&nYIFP@Q=uO_jz}quJzO2N68|VTN3mjkKlJyOA)V` zi7u^W%%rPS2_*hgHHyn#qzh@C)|9K=jZyd?j$n|Sa(SE7lkRG=5i!YPKlYrR`hmR z7`5UFznvbv)w?R3&hT=yTHe96`UH5y%_1xygL$l@1sJ(JYMp#M)|`#k{KNTZo&Jn2 zT_d{Z4vWEg^M~b!P{&&)SSGU^PpdE54!iqBC6pZbikjr2C0HuGY6|gYX|NDVE_HXd z>HXdq>2>M34Q^rk3N4x~9zzUAIitw8F%6=eG=hh)M-?Cy#xg;ecT>lsq?d+E|Kuct z2LU)W0=-jtjtLOZ?gknyqS43-%S+3*t>J%ww2{;`780|Hb>Y^TH8ieXOzSlz`iv=K z|3Ym2VA)4yuFab~hb@{vxY^>6orE!+ulWS}HGl=KGZTUW0mn>e2yi{1R}6r|)z{G2 ze^h}29azjyjgoQCJ~5y}L6DFsdV#5N%gckeDO(^!;Yt-TH6y|jA$q3RaA&uIG00UA zCNVL^X2{?ioFIfn;e+ZcrW713`CP{3WY7SvyFlsJFaTl&L-p=DStWx5=#FSXEDxmu zk8gst{BJWbVoS)ZC|Gr!-#f1cnUCoMze!BgSwZHDSsFYao?nRlnfy}s!Cgyy5@bqr zo9A&RTiT%ZY|51}0o2*;02fY&Maz0T-HzO8TCoA~qGq3^#5lhK8|lWWp?> zR<&Z*-3accy}feHVz{S}!+ha8LqP;VF)-?u)5fxh3agZ&)i<)+T@i+{NSGIo@*LbR zdkm%LOFJCRCV`lXF`|ntAjt$J+%1SnqjmOrZIHO!NQ>nm9PLp|Kp3i)!-QYg3$8eK7~O4Koo&T3{!{Rf|Pd%4-VpF$jTRAXRe=3YM9LgKG$pH zr}yo0Iy`((q)=#Y^iblmq*#{}kPv3VSUps^A){^Ov?=whD&$m$TG(HTK7mwaL(z1_ z*-Q1r5F){u09I2WsyGTJj2{bWp-g3+UBWqPUkx85$v$y$vrujr<{A_TRyMx;rG)&f zLDm{}JwQRtgD-^+!jhAwRA1s4((YQ}00m|(k}*Zo(iKILhSj!Wrv;-)%OVA3Wp{kl zAIfEj3=%uQ#Q3uQ{ojKwt;$A!J^6W4ZI?XT9=~VdUv0N&#~s~rwYFFI~<4Y-Gzsq=;7Sennw6UI~hTAe+NHXv5o131oBwXKx z6Lc58IKG>|wDOg3l&PJ(X1JO9wvhrz)2PVXczdD|T|?3`z3rhsW_^_UNW2;6P8$~Jd1u&2_*qp6I6tPf|K zj7DlA9wl@k7)ZYOxI86kEp>JS3FR~I9Ad_;fH0HxeLM`@CtGB_!z{`AVLV$tt$Gpb-X{`2`lMavW} zs1`00nlhAms<*+`vXn{8ddE=WsA1x>3DLj&E!+fhb0z8&Pad+$>~8Ov{M&Yzlq>vb za{E71^?h{Q{1iX+T1na+mT0%Osbt|YA&bzYDU0SW(yDX;2LhDKuUNT!xcC7nxWK+Z z+v_pxO!fYxcX$M0(67*yGGz$#N{VObz)_{{$Md3vns7*X*8`?ZkEwya{G<#vT&+^| zquvN=|Bs#GhMXQN=Cs%gD!awlAAvVY%*Fgji7VB+AR z!$Ok($=~gGLF~ECVS7}M+wSf#u5OW;je&t8)&2fH>~r3Q375h5(5uY+FX+fKhd1D9 zXWMtb0Hj=@cov_-%Wk9Y_~&n#QkC|4;pkYF)cWO#5+AR-!$yT3pX?}5F{a;On4|pr zW7_mf&(rgP_1w9%EV5z-YlZjT=@Hw-YL`zM&LWBLcadb?1v7PF%{t_0#br+Yu#$y^Pry&PncuIsTZ&rN|m!;tn(-4lH0GIW2?c|xM zBv2Rvm+VS5r<&vgcu-vry5|Q5fIs!tewGk{BeYx~^)R`XV9R-zPe zb7vVt?0>tc=P)uUE2TsoO*_q#u6(brqT^M(_JugDI;hC}J1PX7sY=NAi_e}`!gKZy)eLWeD{0Zo-^I1WR@Kr1W^XDKj24HPsdZif|GgPk zO-|Kb9i%>u>`Gw#1&zvSKBfZQ|wFy(h?$AUG zoCstyj2)Tw@|wG}2Az`-sef5k8tB*C=r7oYA0t_|@vmNu7(Yv<1%A)YVtM9~bu@4e zPQ5idi1iq&m|cDLy-mh@^_aw0sYR6BOu_893TThCm2UNCkqT@2N=Og&#U&F9$C1n* zCL51vfTdY-hhKN60qJE?RaF*31t^_V8EyC65b`;;%UWcJKqg8|`n)Y#T0RC-?d7_2 zZqU&*JDXaitC-17#zE!A!S!)qV^1IRZ93jdg&=DUghja?c-qCy?UtG z$Ua~83Mer833B8U8ok$2?cM-Sk}SFEavMYA-5n(%9+zEc2t4ju$6VqZ`xe2-Bt6-$ zhY~}7qttLWK6aB|fyNCETNDz(LQ(Ir!5A&zjv1jRg;JH6VZrcF-SwiF%^PqN2L(?C zIdh;E@VE0UEjNHe-muDhK?ZY}hNdjs7-T|=_58ZZkn4Auk#{pxmAU4=6dDUggL!;i zHS(|*Qr1p~{g!E5Wss(6>evQ+cZmhu|1~7^Ot$%!nP=@6NTOU-(1Wm2#5epd<|rZ( z)N2gQ2S$t+D%77JHpP0*A4^(kg)kU_^|i`dp3gafR+Y6v%)VRl z;PR_G7FCS6T;!_KwG%RE+#_<5PW51b0Yo-%p;biH;zj@M&%vqLFY|v?8<9wg5DzVw zE#TJ9a8(HnY@Z=`2oMa|3YI9l1PhH$B`SDQReYIL1v{U45Jxxa3|Kfw$AczB{x(R z5|XYcwJi=^79P+9vBq-|1C{0QZ=?eeC}@MSsC7lKD{uP)GcBY+vUCN2BQ^{HBHTiE z*qj#OOB^du|0xm`3~+M+E;e;2Er)`J29^X%8;Gvzlo5_a*+g%c76yp*Mw0Saf+6ab zTNa35=nf!NR7GdZ4~5~-;HBYrKFi6;$ACgP9E$w&!T90Uha0C;V7==sDPrAroSo)MTjv|U~A-Lxch z8XsBui$!X-qkFZzU2|-+-EUXJq{erI3pME}nr*6S2e}3w&$~Yss|Zog zH(QL~+Jl6xmN8K^s?bzLqT;I0jeH5wIUOl?9{?|ar@ymi>?1`nQD+ieL>o7Cj0FzhC<&DNnuRzEYg}M zHoR_%F1Q>gy1Y3A7@CZx95^bpSQOMWbQZ=m7Q63Xfn`OwbulHi+wpX@%KC9I;@D~I z1uYfxVwdZSXU_`%@sK}ASy?|_vuNc}&ykjPlyI$NICRxf178K}xvw1C$oGwb>ih5` zOP;bQ?cv2-h3)tv1C!C{8_-BS98b(+{D(F-fgW7#wU+_-F(7^)YmD;(Zi%pL|IM7H z|%Go+Jw)3iEH5^H!j>|`hnpz$n<@=gp`decIY zmuPPzeJIEp*OZ#kHY-wtJ;VZ4WA!nYmK5PcX@io`T%WFk;SYy&NH|D1XbF`h zHB~h=wGTcQyCtCyzlYJG^L0MZZ<>n$Wo2byIDAg0t<);LmiOC=gu1?M6G*dxU;d~? z0xUM-xp`3SP{OLRK*^g1l7sK#jOUI+kNILOAH=ue3qF6~Fr6`Vs8VeL{6YrB8-6~< z)@C=0MhV0M2-8y-6qsW0fc0gq<>F%UOiw<;g$CsNdZY#Q=`LV5j|as3%Sfpw-|oX! zssGuXIu_q+yp#;|8x8=;vIsMpX)cUCY&fqn6olU%E_(fqmcId}B)E`3C4<(>s4m#}VyzLo z>BfZ})Xgb8ktoejK`r?>cM=dP>+;&h2GAb($JHFPN%7Y!*DIQ|mDASk5iJVyvw)t; zIc98!N@TL+)`tS@&R{odW_FcjTV7ZtB3c-h2uJCUOWXjzo4pGopuFmkisc>7```L+>R{&gUAr(GOPT!VT!cizELnL7U zZ2^IQl2e6#Pqe0h5bT~G3q=H5pNGUe5WjkcFz_e2#fFPKe#w4|cZbm@g@eF{52UQhGJmUyebqQ3khDu#-|CZs;S#EH6 z$tJ_NbGHx;zrVly?nlJEC-F^&KI=jiTCX!*l4Gi3XTM3F;sQ{$QFNG6M@2=z6_HPs z0AHZeQ5+HWwL2;4^18&xZl?9UR-}urXgEH*)$%#p)RJkTQlseCuW#$C7fQsQtI0}? zqSn04N3>ieu{gMC8*F|Xi$)(-e+#dI&ZaJw1I*517Hf z&gW_Z2zV-m3e;7=G^t&eW95fDaGszUiXc>owWKdMOC^D z=QfimWopzJk*+`$@`h9v0Y_QG{u%PB=ed{d*-elArhw~W{_USidW|osIJoeb4*2e3 zdt)iYKHF^)H|LJ4#TnKJ8X6v_&pwkOUkKPsH|upmU=ULU??+AnS~t9PNe5-9v`ls= z+qaw?XLSx5pE~Tvp{Nt6I;2603yHW1lprUkg>_gFpYCxJvbfZQFpmhB)Cfky%g%kw zquLf*9T9ysNat;bV685Q2$>;#KS9SbGl1i}r zENl&NS&xW6Xbp)V^R3)^p7e_ zrDZX_oA>Loq5$T)I;2mgX@mr=`IbW%2=oh#Uq;7PqS$%2PguQ=JzuROaH!_Cu8g&? zo>%8>m(VxLDrRzWWw;ma62r7(H8KE&yJh#M-G+xdBvx;L`;78^2&&!c;-alN`mf7* z3G2`PfrL>QgFtQz9Tdo+sj-i|Y%lwXN!Xdcl7}EoHzwSID(|>SPE}<{#UWzbpR`n9 z)))xL;Mz*5Z)#|^o;VPArjc;LLa&#ne;VCn6Q8hxoBfsGNSo|z?xC4a$~tf&9p*r2 zDfXpe`ac!S2z$D_gFtCq9y>0E&;aK$=%mpk07p#i0b>y&s*07TW}@FP_jQE33J z16bWCsMQ)m)`WmId;f zcPLg>CP)3bBOwb~c9Y6mch;x-=JGE4$8Vrolkdo9o3>UThW9O^XrlRaebq`6rY(}& zKnWzsAS6xUQ+3gcc*d`;oVZD9Ik1~i3F;EtDw%YGlK2xqu~|iA`?MPwF7{%l z4<5=8&KAqg9`zjlwwsSvE+Z~=U#mNd)a5^i1pVH8iGNgYKVER>u+fMSzYX4Y5@n_> z`ol!a9=a7wQ&I#7jbEVdyYrybZw| zf7!a&y1bm=HX`^vH2XE52lXqz`;~0kIT6*JxkU-9tSbUS{|`9NYiBZvTqOwTaLG8` zWl$h3fZlGocx(e0hvkp-T4f_)w5{G8EG*yPgZz7xWS46VbGVF*?#65#H-uh(kZ^uH ze-IICh!e02LhvM^97@$c}ypH5c5e% zKPd~lOb&-3W450>NGYwYiwSKS2~8nBSa|blYIRk#w?A(zw@7f9lGLtsv6iad+b)~4yzs^&+dBcjyc)6*=a+;EmvngZVL<1T6*PhU2B zx=%VY{IVYE?ezk`#h?G?FN?(6r-QgDXt&dr?ZumGEyn9|X`JB}yS-4?5Kb)0^NhfR z#u`J~4?Vm@yO7d8LX5E_O`3$k-0CM?u#vAJLKEmbw9$a;_9#hg*@3A>3$L)GrxI-v zdshD^ZZu44H=>Bz%c%U!9{$ytEOjFN7!&OWEBHL)xC zIL9O5fMF^2fu*5Pr>RbT&iKHJMn)$OPJiXeoZR-wDQ#Uqs!;*N(2kK=3>s- z2-3p%w4aWaNb9Hf3Eh4iLp3!m6`Zz!-fWLoT+H%7PEexmo=2F}LUMc|`Qr<-wKwV}ECunXa}&!+>R~Spm9Q5(b~(zxT`39t)0kAQZ;Rgt zO*RA+2>T!K7oCV8_}1p02kmzK@M$kE6(E2)(A) zAWDO_7{j7Omxi%nM#^H@MMCax44o!NcXUG=Y5YoOMu~A1F4y~=40@@R+;G7{VJ);ssqy`v%GR2jFN{!C_ zOOuO`r>+d0$6oNh%Rh9YA`%RwMJeOg zpshR#t+mz_&00^a`b_0Z(~GEaee|3hPH0k@kvtv3JPNoHXq}d?&)aM+Zx+Q9K;T&f z!TXFN9F&SIUdUoKhyDY;J||`y??&T+nIcY{JQJnk;nZ=perCPFGRJG^P>xaHVxad8 z?{GqwJ;QH&0o(bcgi0uNsVpmv#OL@*iX9rn{FM+?zQaK`K1)GBp1Q;!Q2X(FJ2&8L zz2K(rz_5Z_wMsN_9`DnR{8A%0MHavLnA=o3kYM;rb?fc*m6pEu;6Tvu{o6@yoMZRZ z+8k4t|5I3r0q52Jg6(1w7$`|7QfF6QRirAnZTC2{TT&PN=sUUD|FhEQeo%}Yz|rH~ z7p)QCclp%9)N_A(L=i9akWaVTaz_3;TRWcpltSaG{Chn!lhlr~0a1b^xw-kEQrG1Q z9fjgp%wFg1?6}{{o$W@ajKo5oI%}EpBsbe1aQlm*Y}v^V1-%ya&(-Okn+6P-Et!I* z_vUHwLdA}`B|rVH{?t+Md7fWRzL0P@X!jJB(q_mnP$nM>%g|?3mRGYde8HIzs zgMIva#h{T$(4ZKp!Q?)9zLNp8wSTeVQ#lCL-xi`m0`DHLLGWL>>U*?3K=pa0=V&_RvC-y#{yeoiWB z&=ACDT=a)Wbm+EEkWk7q+ODQ5fPt}4wb;c$-Sa^=l`2YmWy^HP=%@5l;!1SC^nn46 zKUHtoN76LQ0(~_k%2xz=4paF$T+r}1mD%v%FXDqm;@=l=TO;`RpY2jGe+w)VsK@l_ zD&c7S76?uxT6iRy47c=6NVrXHjZQ=yYw$hgVnoWzQOcePoQ|2^G)(I!a9k;p*sv%} za{7oLheW`5WeBPaHbyEVeFKg#K58Ug{CfQSz4)6P%o`c!h0IKVEZBHH3CX^+y=RGDlpF1m5P~6x!iO=JCK(n0~D`YQi#xt>j9_GQM0(Gyf+X8H)Ol$iax;I48O!1^Uo*GXnz+>}StU zO*8)xNYxD!KZ8{1*l=Pl;j{>?4Eqbwj^QwZ`fb*BSRf?m{d$*VlZ>%h()EgaP>KVB z!j^5X!Hp}pk>jdsH{xiz;r^}Dfo;%4*cJDT`4xiC?yXM-HKZkSjGhrIt(l0DL}2_a zfn`?Mk|5F?K1=IbA?%=>GBgV~7qi=yV@owcnhhG_;;W9(e;Z-bBGd?%l2p(nvw|Kd z4&g?;hC91oh$rQS+9;(7K7p9cGKW zDp2cV7e?JT=8Kguv0_5Vg6M1~F#F6IpMqB-W2dx-D4x?oPL?x~5}WHuJN_VQk%xYZ zWf6z}rHqeW+M$HUtbvo@)Q<%>yUwIZWGr21M>HxP%`(p(A4|sDOhHDL!b-urwMh(B|rr%5sjM+^OKMM*!6gaJTl z-O@qF_A4zd(KKRAQ<1X}fomE7kOWPk2=wodCPd~~SAj9619xZ!T$fb_rCH@2^)ai(cb3?Kw2x);+xQxVZajD>UV2~l0wNcxOQ z)3^p25CKacI9<~SoVCxG^B$SnxpB7Ni0H=2moIqcWl2=GtWKly@@OogX_{*-1wdpB zHSi3{000ab(_A6#9?b>-P1hXfAWc&cgCWy39U!o}!6TESNrPbbz26~P`fqC?v{B)E z54nQkKQE~CJp=R?1cGv?$oRxv6M-fi%{>(%V5%ShMxM&&twNNNkg*2Mv3ECn`JbF| z5H?FBe#WDTsf&-o2KhG?P}e+ZA8~AtE;Nxan%fkPYHF&Ii4^BNS(8}!?CZb%x#s(? zzwFqh*O)OU7Z>FpKd|r1FTQMA*40;zKc-)=gp~vU281M3A?KfW*4ho5ueo7Hn-)#B zZ`wLz>h)!H3KMZdk3`kFVhqzb=TQs{*=X=+%0SlK|DKNOM+&|`!@!e}(xH;(Dj#0m zzWhu#nUjlk6o_$wU)TWY>jW<1QRqwBBno2r4}7uUrO#f^%`1*#)QX!jA`e-IkL%UX zW^DDgH8zR-#?62IbNSTQX1{p#g7W;bq?Kfdl1T>4!+=2@Ld}ejA`;O7aQEIrd-v^Y z*swwUx+N;4$Uj@RTc*{lQNvg?DoNmf;25>e6$Pf!>%aSr(osngkRt|ER-0_Kxdg7i zR)Ae25vdEEbWQgF6=Y@K!9URnbSH^~Z4-c|X=+a%9nT0)zYD1n0hbRKz=g1sKdxzX z7%;tgL7_bSANT^@I{e+8(7tp4qXj$WscM0vSWc3z+d)ttBgmM(Ou-W{mZ1wR{|%aj z#>63J1UE#5`(u(gw$5Oc02yMFFo}H6+7N z8UEb!ub+R$+4CNL@Z@2~afSr2{Fgt9ipnm$@Lbb0lSxC$q#zm5wA{i1jp;G2@7lA^ z2H3o5^TGvB6&K~UY}u4Z62ryIe>qZB@$7;}uD*WS6Hh(++!GJlmZj+oq)aA~`zz!5 z5&r%MAN~I8%Ja{^(6(($IH1j!e=3KVWrbV;B&>*50V2g3i2Ora?UFS}xoqF!A)2ECcF-+$O2%3gu3(K?s zKuXCOlR}t=O(cK){rAdv&6QW2Zy1(}d@o5BZ_NnD{iit?qBJpJWvo9C7Xj%^dTeodpw@$IHb0VRl0jg=Tr7&$v zl9WKUw3IcIq;Ky>Kw%4A*AE;z^7xZ4EMC04annZEU3+=&ZtcJPddd1tyW`2q70Xs! zbM<9I2lcmY$-HAmQj)tah=`C-dEgEuaADgscNtn}qa6BY?5U8*HB~`=zQ5rNgqY*d++o8x)A>H z{!9MrqkrOj;98VCBTz_i`UENipMa)m03fAgjIH|ZkD8iz?;c%qa&mM{Q#b$V5&fRI zkG5#h;`A}YI0HeFAp!%C2$Cr+T+>ucIp_aE2+sMkmA}6D%3GIScvk;DJtaw|{Kh;w z2~r_C%?LbnnoE)-0U}6ugAXBSk7MpqXCRgSDFF$cv$O$7ht5R@k_ZuXJ+kKSjh}q- z$)UqXnl))OYQ*qn&6*gdsS!s8-sx0#>4s<76W}h#29P9xfHX}@B#h@?e0Al@Rk29) zl#!>58hN6$ZE%mGE4z)0!oyP@L`?wX1d>yug-RN}|KXQ=_w2cP!o|)(JeSOz0@BMt zui;r-55U91;Ek-yHZinFvXQvwM38BGPp<}#77Qli(~PkQw$_JiO7960wwuXkG6Zhi zh~VOr&S3>_?gE43%z3bOpCfrkXB?RvuD+;4IAf#4NA+NX!FTRKxHW$Ru&bh?52R#ccE`U>V+4t3!doZn&vV zalxH;+}65zLqy~Z9{b<@&ph{{Y1z|fT$fv%|Km?9>J%1?AAey%L9P()DLEnnDJ0%; z`^|lNby9jiN1Su_%*Pi#l`>LSO}MPIs6^AW(@z^cv?{J{)w^)qnE+gEN&x@^6hx)P zMUOoCziwUHktG_G*L&!}*$bb2F*g>yd-g4xw{OocEYLLle-Ay-ylIoXSoFdB@9of` zt&nu<^vMldH2LQ1ZwC$R-M8oCUAuMa(YfUVcTfA|)2|T4%$YZq)~#Eoq!0jR&ARES zr(dXBx0C>`yyD`#f@0H_qfZ&~{K9#!EPBf}jr;DJb?h-c_a8hw>z1iKdvq2;6ciNR za`R1{J9h*C6`rU=+qPF;cF8B7eUVo;cEu&*8`Q4{0M9)2&g==6y85asnl`Lw3ps1%^k&VQ z)>J2QbMk;d;~EguDJi+;it%M-B>>QAbhqZ3k zmdLp!%G(Nc-AmQQb9P3bK3z zB9^(PGmFw>Hd%&Q^M*?D7ou|dN(Yqgzbev^0EqC&_R2jAK6pyTI74Qd36`H5-+yq> zz+v;RxH~5=|FjurZP>RirA6`@H2w02cRuSk_QJvE=vo9_O+eky;xP^|=idF`%W5N4k{`Wr+&O2QIl4|!?sG3LN+s-DZn`=rCnhY(8At#I43S8xD=jIr zw}B1ez#cfc3J3uBfjFH}kV^hgXrKv59ndpP%ReMUQV4X}H7X|;?AeUvc3D*I##Kn^ui>?%iKfQdnGAsA-aOCZ!-r zhG7|osq0!vQPEGId@}yBt9NbNwsG^G8>dWa+pIB3aj4?RPrs}faq^Jk26UZp`8kg* zcq$%G#9}c5K&~A;bZGMQJK_}w|6H}QPtV?yub)_59T!qCCl&x2DXU?_`ctmExLv#M z4?gnvP32_dSh;w2@emSyR>wqyIYH{bcNI$Y+2gOd@%*u4rrmH=%a)Bf0RyruQw@)Y{-l6iyY}ii`MEKTai*gN2qale zye2mXt1GLu{9?u#=iC9TOiLMt6e1dnYEgan#`TXq{dOcGcJA6TXuvV`>z1}|((v)e zAHM(ohbP>0$2UJOyM4;FrDer+^7H21KYPxc`)`~3$cLYOdCN_ck3X(&EEc6?#q4|M zM`LW?{=N6yb;l*=pUD7G2x;3MAxYbE6(wNk;Cty@_Nvac5a%pqTDQ);_lqxd-w_d`&Hk;1?HQ~RFdh1J6zd&5*D<9GJW2Ie!xxlS@s28D^qi- zbdR+9YPR2jaQzN=cO_3?ZZMsjgl&DU(h=;5-vIY-1aL#M6ZrER;$7MJt@Ew-9k~^H zrMQiEhl0HNytoDanL_jdxKn<>*yT)*qsxUf6Tf8`@Nx=_U3h>Ty*W#cEL5M(nhcA3|Cs`eh$wTBdJS=u z6@?RoRAz45w#&=P8kX0yEX%tx0-U4bDx_neo34)}B6_xRTL>uxAY(4+x{}>N=Gj~1 z1Jm$h51<8)lBj1%3x=xphE+CyJpdcy*XFzbU_ z)v;Qe5%k&%s!VFEnfr)kAq!t7QTT7y?B}?DXCrYpUXP>oxWp%ch>@gNPGr<+*2wqF zPd<%A^TRJjv2wB z9y<6~@6RED-)e9;W43LNIccc6={{wc-8;8^;-P!IET(NUWLIBt2@we)F1_%401#42 zAum1Wj7!fs!^bkeaX$uz2u_v)hkCTA&nY-!l>aVxWy6>HEK}z)|;;PdfK>A!*k9U18(%N ze!Y73>(vtgDl00B^YbQNdVY_tZB*u(ngr*pb<3u+XH8d6Y}=0Lx+GapkUx5)6DCp! zQB+uP^Q4JR9$|CFyLD;btxJ0$r3a?fQOerPWC8dNuAR76#9j-W^RyRtL+NNDBg17b zBs8+Y>x`BYkd{`Be~QT4;l%(;K^GYY6f(7%LUs=VK&1{MGNuudkWnr2*76Sz9o$O@ z1{j#nn3c>cD7bChv>uH+GJt}de9$;buyy2^`^Jy&jqE+VUO^eTj(d_M^K?OSP!|9( z&P*F;-#K^TGp`LfVbHK{9e-W5dg8S=?%B6@){IHpH*ZU&h=?rPGEGa@b%tn@<)IuW zP=YO-08f$_W16lpL;?`DZQIhj1XbNvC!|os$2sSmJEJWX+>yc-DoQKo91*u{+i6&K z%chNp2tWZKn+Q19bY0_|Z{D_J*RDOidvuG&A_$=F8BwDwC21O0i&lj^&@|4uhU7Za z+V| zR8e8hfrI;x)Wqv*G0U>mjcgHJk47T|q(yj1Nzsvm6+e8p{H8l@y=l_riDV)-CwKq8 z1Iw1I8g}9d-+Z^Ux+Za8&*3k>S#sK#;kJ-MQY4yF6w8m+kylNec)|JO8q}|I@Zb?$ z*OjV;MAEiXH8o9|G@fO%nm2BMNQj&vX~>Ykwk;u}h{%zlL}d}SESrcd z+m=EwWSlceR1nSk_WK{-|KzJXW=^~M%5i`G_0QlF&-!l3@+Qrj7M7Gun|#&f7oQ0( zVju}B9Fs@#5IExyAkf;K)v{XX)mPaqXy{gj?tX(~YVyqbo`Zo;(d3f4A4jaV6m)P3 z>Jo0Rq$iX;gqVf9c?-xv{8Nc=x!Am|pQmyoVyhRiVFFJ=rq zb&s3{ELP!wY7{n9Lip>nzWDt7=&~Tx68{@YdlS;R(#Fm4?K|4kx_mE?C%|!CNrc(7 z*PtHgVyZx5!T9#g#$^+hRo^N_p zBNfz^*wM%S|CF+5(Z2beh=3g3jU)+;=`&{Be(D*go;u=002p)fiPhDql9HlBM=GaI zziq;VO9u_;M*yW|WjVPy0HlIUMIsR?q%Cb-Lu4SN03u;aff$KK+`9*$xTvUcu&MeC&g512^e>QG;>V;QF4Iet>xB<$&T)FDlwxuk0QW7#i;I?fu zj?sv2SeCGbrg0*&h14|-8LHD5oO9JqbC7cBRT_Hx`UIpDBsEPVQZtK0%!A1xcMk*yNJuG!)OF2cZfP?WJ_zIX&E0w- zqCfvyACJfT_vslNI`VGnBOvC&1*brCIU93rwUnt@pa&CN>8P?Hf@KTN(6((AMeASf zvl*|+2MvKPLD)GhW9Khj=kj9!^T z00nlKyx-nFCZ+d0i|`CcHR*|I2^bExfB>kX8W33)mek36aGtSypS^k&$-AA)-=sEGLWuo=(@BL0O#B^O~yFaI44S` z3?L#&LQ2k=u4_axWtqx`o=T-S*EnakkcMe8MBA2#D*Pfd3=2rQcWP_89zg`dHq~e& zf|L>g8AFY;>Y5tPx!QBkG!7(_$)qynODPT0Vj9=DGk{Xclwqn}UG7G8G)&XBY#;(; z5nTr)+qRK&<uDk`X|s@S!A=Z>AbyL4=Eq_R4qYr3v6hRLKsB$W>YXHN7j zA*44K0ALuVW!ngV3?rH@L8{B{G+lF0qK|C?KUBC^=TxDOtQ^J1h4Yzv_8l_ywcJyG9U@W$#oHMwjANd zHNPauLXD9mEial}zvIfQZtvHot0jzzRAtxS|7p|e9f$VRD<}&TDkVea zYLIpk~T@OZW0?V>Z+txImn;TJsnoJs+=5KWp$=qBgq=;!6kx1mF zSKh9wseEwG?S^F`fpKQ1=86B^BW($YIk{dy6S8c<5ml6YmgbL60eVX#6aSAi?&|4enJ6eDWutUo zC(qp1f;25rarRK;I1d@5slgrwbDxm+sJ0Z^)64QY?c>^P59l7M4WK#niU?-)lrjt~ zmRjPc1dAY7?s;RMIV0pMV}aR{M2bcf8j%t>oj}&j-^X~I_uQo(WuTCi^XD=pqfNN*R-Tz4Hz_d(F>1Ua{1)Hep^+UNOC~SwtiW; zZ2j*ml5z3#kIOA7Ela-s`bVdY8O{LBRH}Z122VV6yVDY3Tb9i=7SXxeF+zqsqD!L7 zFT3E!pMJdRx=AI)^&*i7=e$F^R!=Q_X8*y;dSykOJ9m5I)#t0@srKCm)l^q|9rvh$ zF+|3Nls3ucjq2Zi)8vK?8eM(qwY&D-SyEJBrK*ya%@~ixqKH~`O#;axf-YS<%4GGo z-~W91`C}~0ltj@;lmHGLKGL;QJDIBfcFFRNZO^uC%eL*@+*|;tI8vDti&j)r4H`7y z%+betEs;`IRmY2q3d)KKrc4;0jHm9LGk@9*SF~u}BxT$AInfJF9oeH>*KTb(uU!4R zX^O(SyFaWdd)g?=-j!z5Vm1hT+=`j)uSa>|h$PQU5~N#ISIFu`&g{zC3(ai3dyA_Sgy=fy060+vm;*Bjof{E@ zi#1R)r7g#>qp?f5{~Z_y>mh%T{ULUjx0lDQ)HmZ%m{|r3bbC(_IHT#Z$Y3>2!vntp zu|)q%3RO=5_0a(tfiAmMp*NF(I?-!)Ru<`W%X6;@#ymx@a#tU49f&hZ@P&oXF}-&X zo>pHMa`jH{Njh8qw-i)zGNc>1?I2HcOKTgdFkzNG4NxxiJ8!u8tQJMlj9!z1Z0>QrFb;vF$O<*3oX24 z(sU$WhY10nAVAAbquDnZ$m5$C77({RS#hI}m4p1~zjKGQikvcC*y}AzbXBJ8ZFfNr zktE`b{jg-|-|N<&K4w&%(o)N^wTLDOImeo0YWXj}6c-k?Zq@RZ+wN%Gu+gp4Z!`@< zg=J)nty=x(;vav!;kv6<{<3QJefPih#w)vP_Pz4@JI4;_*QZx^NirvvV_KGb?K*BZ3vH|5*6sGfTh!jAz7+3KWs%q#HE4 zsY)|8Q2c#&AA%^#RQCm|n=ZUcygPuiG&uO*0EK34tG`#`I9G+JJs|7-zCZve9VH#b z{+nh^^9JDPMfuImkX(>P_#VUMWMK_{1__AnRlmrPq`-C^q6?oi zX50+lF2U+59cnn|AS4690I<9}4s3KYd0U_xcXDo_{4I4LT*R};` zplMn(sz>yQvP$YYbC0?EG>E}i6Ns9|8Ru&D6-!sn?_p8k{_?a6U*FCGVFCvx{u7?} z^EmeDtZ{^$1rGq>;3MfMG_cbi5_5h*YA&+hBdNr%7ah!ty5qM)wZ(;d-b=4K0zmHw z6*A6k65IFh5R7yUfN^o4vPs+aH;tKS3WGsJ*N~(#zJjzxB&Jta9$dR~eb45d5m8F% zSwPgbIXd^pJ6(F_=@$kKJ@JO?E(Vgxl$nzgy<_H7)gs%n;)b>K=arR54tDF>xmlCO zL{ME7|7qEZef#%z?b4-d*G>#!>-HTHJ*TRwYQ@TxJ$rQT)UmB3(lr)Oq<&tpx_Og^ z0B9O!v!)I6@^Whusjt3XTydoG_(202H7rjiQ=Bt(sv#DQE&t`$&p!LQXZP--Mi1Mv zeb;;MeQH^WbIv@qb&F<&MFoGZUAJb<+LAiO{rdJPDJnd0sN&bvzwg zQAzQxoqIZVXw4WqR8e`j;z*m8%@A?xww=GM__bk!`kgy&yBZ;lUkB9Tqf;jOoRb320>t(o^}8Ut z3jP}|3*Dbbmrk`=xFIBmg6e-DKW2|w>bC>^pH5<-KWo`G_Uk>`W2Mw)R&ms#Lc5ee z!FNiuI$OpVVgRnj>6rJCYwx`G@y|c4y!es}nl){hsH|jKth%ydz<~a}k3DAEP1DQE zin?^}kYA9$`uDYOz4P&aV|t%B^f)PnY1o{>1?P+&Ir_Xu9(#V)w5vC6`e*)wk9O(S z=gNtfae%UVbzfWb?iZhb_UoVPdv<9@D1|htYLXf!BV_>coSZ0uRB^rmfB>ti6E%jx z5DRki@11?epc76xxNl#oW(WYBd)Dc%zOv|&OC~(@;JvNewuq-vUwrw^fnD44^NYa6 zbLvbgASj>E&%Rl*?B`W8rd`K5#t?W!6PD=EwpDIH;erKEH)$}VPFcy0?OWe}=e>4a zdU4KMHf=KItTSicIOkJN8a9@F(#-}r!Oe9Wkm3i5I*4jnEk zD9Fvr`Qn=;AAIoHCF9TS(WA@ZeS095lb4&%sKO+%Ywwt<<- zxBkO0IBWUjnwXqeo02py^m`y#ra%Uq`9P5|H*TCSVbR--&$=n?wkv~exlKvWkC+8P zXO#IbIn?l?s|>qPD-f3sF*q?4_^8(V)H16G_v9#0#Z^cD<>nlMObb$QV*T9&4@bBm z>M5W*2Oy1im2glY{*Qtuqjf=ESbL z?BZ_Sx@eqj+`Mhkn;#^rD@Tt$rEi~}z?l>hG>`-uXCHm~`O=@3T9!58(u*25ZUg|k z_Z@iUwYUHNdtLKpjjy@-vREYg{zsq4l=0>p@0q4`VE>_x?c0t!_w?O+_WbnA>NYK# zcWBqfh(A zGfq2ParmommIC44y}N$rX3Jj~O+(v?w)fI36VJS`?5E{rWo5%pJbu8j11wYQJ8Ji7juk>M9wZ=%z?9cy z$i$FN6hT*BfS@+)eNqbr9tGwFO3y-r|26MXGZB&66Af%(2QqmF6ctDOx29%p7`T6i z8y{eL!57LglK>c?Bx&0+niu)xkGEbxOs|cT6#oRO4IURRz3FU<2PJ))xm>@eqHfvESB@njvaU1Gk5Ye69@F` zwY#Ev&%UkA>etUN$RX+SW5?lLFa|`DF>u^TBoe`agGYAn-QBu*%ScT3+}4yk3_~XU zJ7>Yu!-+^a5NR6MH0{`9`pmlhzE8edJZAV{x65>tDf0#>onwYYSa=*AD}ZVSa{|f* zxuvf#{HuWsvM|o{SwqJpbhJV|!$(&7$&k2?S*Ew%K0Uv)fimpo*ETe z(En+{2IN?n>M3wO*{Os%Vv7i+Bx$iey(2HbY%Y9`mVVE6?dI_$N5rB+Y~2aZIt$J@ zRT_qLa2{ev-O37YkTU=kPcf_}JN9S*sT{9JdUjRvsSmt)R}$8ZNZ?lGG{L`>9fFjj z1Uo}t(MHrb^Oewm*RV2StEGqlz?f@5^b-$^u+o(ffiq1KNg@nSl4CSPaDscek&_U> zKhfaN%fXoCDYA_q|8ekIT4*Pc67Hc-CMVAK?J!uIo|NPPF6l!$Yiw4 zwQDM4ub06;Djpcc@B$3Ns*LsJdu$>ECOu<)1qu$Aie#>q4e3u)+$fI-aZo2Eb8cn5?S0ZOUU2fLYJnedDRu zHmq0IsxiR^i~GPK0{9si^(BS()3k`6AHpe}+?OH4?~Ij>G6w(r_|<%r=qG2Irn zu4_V<KtQ7K;@Y6@2#Q2Ne}Zwr$(gs#S}J?!UWjs}>JG^2CRqeOa$w-4|bc>xu~% zpL^!$ci#Kt`)`)!l@u>qzN}uI(g)_=G5ENCJ9h4wJOA--m;BVTTc_=tw>4_iVBXw2 zk}2bfg|GayeC46T`#<^on_H((Y2T)qVVDFEi$<6HykgD+kF5D^?b0^CG;7s## zHh=yTFTePBS!u}+izX85_4}HC zHg9g;l)d=shd1AJ`Od#L&YX4MmR&oAX$|Vv=gvE)7Z(>uNsMRu%lPhVS@*XPJ?cxR z^^Cm#k{q91FUV4mr-4#kJoPKAe0ZM+lFM#_4=LE}G~kyG`y@z|=)1sV>qCG+c#F$N zY%W&{9A))%9L!uP!6I2GKy4N-K;*B|uuEV_B>L0hZ#bjZV8~e12q;1B+`aqh=U)7I z)#{S`{1vNKj~P3>Z?EpTIg!WzH}|S*r<^l>LjT^~bEEqD4O@Wpktd&E8mX!y2Y4h$ z67@f(|K!Qn-*ea80lmA{R9CF|edFtIy?f4?Lsb=Z>z01^%~y{-`t);8%`@Vu1A7kC zRHw@86_6xkJfdj^GQ&to+W-K|wyP6yh4LlIcJ12Seb*hc@3_6HvKjz-_wG6Wk%w=; zeddK%Uf;fb>qNr%dHEl$+qUb`y^EB>v@Fh;iv9zL#7Wb%cq0DT!WVWPJfzvy=U;wz z(WMtRX;@#^*{!$Vdf%LRyY?O^E6Lxyb!To~-c6Gx>Kd0s4?b}B#TQ?8>9scx>enN} z*y`Wc9zIxc;rZtnhI!w;GxzP@a?P|^{d;vQ%*|Q8Y~_aa+lLPyMgW#=e)H|(NmK7O zQt^GecMceM%&ckGaL#7Vp7;JIUlix%e)!4PS6+U3S!o?x&^sT0w)mG71N-&-^6SON zpKwZ_o?W+X-F)D{ULc4>bYTl3uxy(%Hg)QxiziIF=*k<9>D%p}Ejte!uDt8^87-PN z-goGLVaDg(_uvmdED^#;RK;i9I(1;bZkEL@OPnxt@Q7i@{qM==)^FOp_=lyPyY?71 z^tgB4|M<|s!^&|3QN?Ad)eaqkZ{$D8PQIC;d(qGPuYfTG$|a>Qs!)l@Tx(xo(RmH? z;2aQuB$ARiN93&LfU)(j{Rei&jf90d)Ty7}vSYo{rg;*CZ4m z;~CDpz5M_aQvW0H--Np0bj%++AGu>7OGXO&4g`w}>s+pJDLaP^l;b&<)K-i4XV5(7 z$t7Wk6zvI}iqB!B^zyy%{n(y_B#Zay|_AE4-|;EzPj#tliEU z3`1T^I?5~0Q$-TduAO`0$z;4HRaI5ZIe+8LkME}a-9=mDN)+;W%;)Y4r^_VsNfqDP4O)+ZZh#52IZrZx#q+tWU{PLR(|7?Bzm4z#o zt(-djuAayAEHA6GVByPpB=4l5{pUaQ__i%uCtiK&mMvRvn0iOu1`Uqw-_y2j&Lf8p z9ZseaO`A6nLTVb<^azpUoaN^h5^zh>=U;sD=p*-^de(SA^M8*nT>Zx%FTb$xufNvc zJY!D777a>E>MVHjMdFbQ#*Ljj_kkalESqw}HQTmrn{dUodT!n&=bbip&aASc+}B=z z_1hnQoO0uJ=bU~jM&PS&m(ITLk)cETRUAHi%gos?KmB+l8hPW5ciXpb6U)ne`pK7p zN2gpr;iC^fy#Imur;Z+>an3k<^r;tS&bC(B4kdir90WcsSlrBG)-sWMN8Cw03_57<#C7~B-=cAFK6L2y>SKfcz zrJF&Z!6e)<_>pM2`&u_qs|!j%Ak8*T`L#@`HG)sxZgZ2FMcolHP)%H3&nm=n6h5F`}; zVGu$GW;~z~V*qJ~h|SN)e3qO!>FS9Wrsu!9@nobR_DI+0)0UsVa)M$v)Zbv4;g#UM z3;!7yIAG+X1b_gbaRG`uO3uR0)?L>o78p-NK#oLYn!J9)oZDyGJ1?Lu+o2|ojA7k+ zykjSbMPxhyoICe;gyd~zH4Z_lv!9kN7=k);8W<<%J%SUilyl8THZDfAO#A8yFX~|tRfPUE$k+Z z8#Za&5CDXb%3A8ohQBBP(gJvrO9SLbR!y5bZw03x;0u%-G!$e#-C)diGZ@`eiZ&?2~%A!h?;I6 zs%hM%>zRGWEZgwoiobp}M_Dl~zc{B39Nr2s;cT{A@<7F*L@Je|MWqxB8L42x1nN8& zA_^fi&Z}z@re%A>DG4+NoTGdFHYMUUgOBao?7Y)%m@?!2k3O9`>FNdz%kQ{j>VW6LfqJ#<%ToxBUqyZqjJ<@3)x0sth5bN1A8&o5u`%i?c8uc|yE zh1Ifo^LFi9=jG&{ecH(Ug1jS#4xe@A=w5w#zxKi#^B;Pmcdy>3pL$ZK_U*Q9-FDrz zSM=`H?c1+^_-Dh$L_7hdCHwa5`*r2767c;GK6(GWkC*)X`QBYSb7C5}wsX!{-(KCD zwrEnPAotW!!wg%_xc&ZB%T_)6!eeXJuD$cNdy32I-E-%Zlwokj(x#a*exPzd3F|2o zz}KF{Kv$9l5fP<}LpLY6*xxDL)kl3=_i>KLj6Ks>ZJ;N^HW#Ya?U{!X!?L_KqF0~F z^anmG@fsE`At=bbu?ai5qqmBf&ndtkiXeag_s;r@I~@l5LKnbctWF6e?8`5^pmUeb zZ@l@&wtqHVbIoN}U3GaZrq{$1eR_0x_pO&7dF;tQe*fdhA!E?7113zkyj`1S6%`d@ zN1uY4&JYU=^QKL^iZuHBpDq1*cb)UVoKuD$Yov@s%812ceR_47|HuP}5AG8}bZp=D zic2q2(F!7w2qH4hqmk&?Q72aqt|X%3;-Z^xx~5&5R#Hl2$Pq6Ye_nb0@}h!#A*GaJ z{J7KFb!_wE%dc(TxFt81cjM#BXjwXQQFnl|b3rcLXA_|X@K_wDc3yZek(>x60c z>DBeR>n3(+)7-GkhGm6syz$Eao_u=w@?Upv+tIRl^SSrUIet(N%eJqcaKXx7*Y4f3 zuOLsaU$<^59yd(u%FE8nDTsac=~va2m3PdXI`Q%gHO@y3ANNTt}*QGFtDX}YkF_?8@*yC&n zUMN0~liuVO3~XJzQ&$jMDm#=|9}9RdSCyA=cJ~z+|MCden98=L-n@^d%b-X5N7O zw~|A79N6n_)GLP(254H=eRoWM=dJh7zwn|vr(dHX)F~-CSW(%ie))CROj!Kg&vWj( zwO^ke0ANYGZoPU{@x)^bo@&~n_0&mMA3S(u&~eAVyr}ot=bXKC$>Qs-zkKFxHy=J& z5z!;ynhqsdobziYUUBh-XRTWO+sISLz5C&(b&5-0TlDsn$yc3q+Q?KqF?-gWK?D2W zG-c9H%l^D^^7Ut&dh&q&{Vtn$!`I&|E-EajI=p+w?tSYw@2IRea>>Q#{kH12x8HbY z>h$X_KJRQ0^1i$0yng!Vt^aKJ=byjtpL=_8QNjD~eg4d|FN_{FyncDT=1m&jd*}46 zmt8RG)JwnnZmBZNMWd039%aCjW{Pu+*BA~qph!(T#gP@}XoW=uC3WiEea9`GI<|P> zrA4>Ry#2SowtV&ZH(!7C#rHpc8D+TUuMPLix%Z+A&Mqn{8_>Vs+*aby7!mg{Mfx)d&{yI=OM2Rm)C`<0G$;ZMky|Rg{UsL zfPDK@rlp=Ti^`zCKoRPsPmm8ffq30UXQ5?s_dWtW@mPQMmFX|#{}<+y`C(`&l4lfP zM#{8_B9SO3=Sr`NBUSzT_37WQPcoT`L?czz@il*KXx*}TVPT#mI)2bG0FX4zgkk68 z<^sT$tvgyYZ=wor)4D~Q)-3=4852_4hFw&zY{bY@qPljdqUx(JzWHb@ zD~oC@nM!F4k@KWsbB-vqh^`6SR6@$Kt+jvs_47}w_UzwVue2;TH%9_!oF6$-m6sRO zw1{m9&zaqIz(LM&@7@EEh+d~oF#t(|GscX%3$X9+CVW37hI*m ziwf?^+^nK3@H?QW`O1n55rh5l{|O#r2l%&13b-n`))R8&t_!0)yFUPEnlvqxQfu5C z8aD@bol47sWQrnsma1II9_*hQAyRP$&Ti?FS9ZTx9Nw z2G6kPk)0z`{@<9iB1Ux3f7lQZN{WxT+I*IqD-j{Q$jDtvXHqB7z;qon z3AW(Ch`?5-)|@L~+!+DobODxal@t}`MzuA6Z?+{dhQgKr#2Al8IRGST5~qw9Ir*9^ zb91AwFM509rtOG0a^&zYzWVm<_dej7o-#zjFr}~u96#jRiI+5K)L_W*$0d{2-UElf z|6$1m=bd@Ygv$Wnk3asbJW>;h>dSv#W*MoqYyOT!Szcaj+t$sMmGR=@e8Vt_Xh7dS zE0(XEJNN$6Pe0?Np@Sl^XxFYiK$<6?I9S-CS+mCLH*R_1mDdj)tSE2LaL2BlCB?=4 z`wftS&N*u=07%rz>o2@dSuHkT{|>sTK4KIFP?kG*xtQ+f_o)7BDQSW zsBOz;_3G9gGPw8BpI0tj{_CAHZW(^Uz+poMRvbyZ{`%YZ+&P6LNlA=*IK|=T&SG?? zFEF)18t`Nm`q;>WUXXDQUC2a@KC5<%M&F0j*M@us<>z%tJ1a|1+sO|rW{OS}%?2;~ zcBnAaJ8-rm)AljKDSdsR%ZdUc6*O94=)ahy%-T4FtDZT79+cSu?a?uJ27zjD!3RaW zTcE?rq8dNx_yH#!KS1TQOv^OQNK{WGlT91efAHQrf{n3lyQHLK^0il}+DTH~vO4qb zovGgT?bS_40g?&}@{~uwr5BzF0H$f4JYwi6BZd-yB=WBPio~Mh&KwH>LWufhWmjE# zfvQ61ToP#rXN?^J04c)&qMDj`|8AZ8ce^*(9wTL#hMAL_iwJ@oo^GTJ!!UAUv2kNg z9yjJ>l~YO~B_Wb+i*rvKb?#}Syh1G7(zphImSs1pSLfcD(}Go4mc@}9rd^a1xnt_2 z;HyL;$q=u-{DQP86C^>(@n@et{_NA8M?^vhNi?{3_rblpdpV_)y?XZO)w75ClQBfp z7$ZiMN~Q+)?J>A-4^u*f0RW^@1~M!yF1r7o8EG|2sqUNs%a(PEi)K%s1k;_Snx-{m z(7+*s2C8OgjuNFd*s}?etXhtmPB(PWtdi+FaKiSx?c{RH@Vly3GH}Ps#T*d zxm8kLjY}F6^BYI5O%Bn!q*V$20EG7SIPX1#k*UWVA;1;g!A`FfJPazmQ$zsHCS+hp ze6)=e);HaM-4H>p!+~cQb#5G;by$;cAH_$9G)Q-fG}1^2NOwqsNKP2t4bt66cc;YY zP>>E`^e6%8?&f`d@1MK2YuC2xxu4zl`JVGR$L_*J?RK(PSiYzmmt5b(Dm5@Jwgdli z$4Z1VD~AqBqObZ&{~YNIGeg%#POLxwbY0rpSY}x?z@Cx^RolE$MODGr$7r<~dkFfV zHqcbr$*K~sw{wZrrAVcx@be@tEjalvSGs}tC8Q{*y$kXE_}C=%ZjeM6XQD*~Dw4Cr z5#%%Gau|JMXbuTNTuM=+#rxDe5+(x5DfyD5vy@PEePc`gv{G>9fKqhS4OL}~Op{EZ z)qS;(+ZTZRWr;;DXji{}*7l0p$NuR)R*TsbmhV8LmcgxA5uB7XphA%uwpb;1Q%eP} z(|_>rH^Fdz>R=lE^m1*e(zzW%7!PB(FX%&48j0e7LzSyk4giP%G~l?zqr(ldcF>BC z_LgwooaNj#|tZtOdz&cRp*fFs&8*H1C`-R>+sv@uIs+5 zRVup%Ii8*-hQ%7X?Jr0zTm!o!1L)E1is0JuqQ@H+L6Lyx&DW{nWFuN~InKqE%sut$ zJMG|1{@suvk z-v+MO-o6DG$AA$3sBWZ9E3}(P3S!ifZA^pg&sN!H&Ph-RCf84hzGQp8*D%oJJ10AT|Af0B(DT(J|u70l?9+0zXlSse&{Cg8ZmxQjr%d5aSij9Gw6kOzP zffV;#-(lL;j52mZbZUjZB(uC_`n+DPGMR-YUDB@ht9;S{YVCvRE>lxVD==a4Dc9F2 zq>vG@-Y$_4CTO?RzPqBPM(Mr$C#cKgct`FJsfd$+o~EX< zeS+GpURJVk?N3)6Wu5qu*VU2*Of8~6)-?yLI6o}^mf#e>iGfX0c&LIEp3g0-fOgD| zj26|unO3ieqklsW7yKum;^WBO6*sN0=bjoDt$xp&`X~YA(P7!#x4o-RWwB!V^S39q zf}J;0x@GZX;sMX!`qV@$mxaw$`l5EHuCiL#J?|Ia#4BfeZUT5F8u7>5wi_|Z(MkQY z3oh$yr>}LnVgS~)NWVqp9mhe|NxEoASUsh)6a(LtK&5lt&6eL3PY9$vKSXW^bi{WqzS zdrrq|CTmhEX!0buyV9k!@wjo3=NXvaR}ue}uwLk6#UYU6Xm38_aADNxU8x$Y*MOuU z2u(ldjhC6*=x1TkfBcRGMnp~5ZQiw`YATK*vj(9fVBiZ4+JxNY^Y&#dQ+%M`qgF$a z84!k@?)+nmO>t6w>Bcu^KvWkrN3zMZ|IUnewA2+af9z-6(R4ErPr$9K#Oz2H4~cf8 zc((tO-&vpEJ6!TsCp{1!Pu{I6Yd?RGOxt|6Spr}Y-&t=mBiqf_LW)q`sH{S57Tp;O z2erQRnI7O!y$2X6O@`^$pwF4afs!&4WT5>_sLx3d5ZP#ez&`s>%!Jk)hD4PP_O;oS z_DJjRXTRKg>|?qM8R2tP0odhbbYFxCw;g*&)3!iO*V|bNMG*Z zB@R6=tRTnOo$Zf=!zq@FVU_~rrvB@H3Y0jr&U@tY)|zcS7&H44Ucpo|WWhP~7GuyO zpbTA4wW*X@mG%PjTqk}cN>M(_;yvq7(ys_z9lOP*y%hYuGUXhi@km7c&E=+k9bJ?2 z^9!}Z)vlYzi(0+Y+lxR~&zDv0X=ISXmt%nW6Yx~+*Kv(EoB|pA(k9d7w=-wKTl-aE zz*e)u!U@c3&Q1*5`PoG*cAzTkpk~dYv^VZRA8reE@ zy`O9+wm!k$>2JclCiIN{5@Jw5K43os0uR45RW-2KK2CY01uMYj&Rg6@#6Xnk{2n z^!pipe(vKJ{6ISHB!JRZS6dr7-(OX=3B}8HK?XXE&Aty?O!KM0xRWA_6M6Bb07GrV zOiey;VOqVX7Ss#_o|n;Fl0j#TAg zd>o^Qh;ZWnzjbNSaHi)kZjR=Zq~T&SQYeHaSpmi!In=-o;|nEWL;A)Ff38+m`oJLE;5W|16`os?88wRXl;+Y+k!mCW!VC>Z>5^$uBEe0~Nizfc(u zBT3WvDp2Nhv*Un7`K4hSI0ZIk+m0nw6zgYX*IUvBiYS#LYZ)5B>?dJ=W1hjX3J3B$W zM94Fr1zp-RFz|J%tD1fiOI>{=NVvrF?cJ6WC&K-F%AImuEPBUkP7PZuDzj`wdQDm~ zwuR0bU^67jba23cV3ugy`iOQEB_+V#(`5H&NRXJI@IFA63vos%&i;gc5X8cwz7%4u zgO%bpL*1q}1xYj&E!0&fZMoB?HYz`^yi|*}oOSp{c$ki~7Xa9)hh{5{4sj%9N)wm5 z9O`JLWMJ|N3L$z4d08=oRh1jgoAt@C{DCP#IH+h@^fSy*oV1bsW0dm@aKoqO*3dvbMP*le@Zp{tv;0W5hF z|Fa6Y?eQ+_i9_@FJ&*PEpst5&Qs^HBZzuobVHWJW=c>u)+s$~A+Q z>zYi#_$?s;|UWdoGoOdjL8ciU`gYd(`X*4YA3Rex>y z(Iyq+dHz^kis6)0L=a*Vdq-#Iap+Fo9lUZ4sJ_aOnNI5!uv_Ncgm%0volgGKHL-g& zEJP{Z^wv8}Om?Y-GXf3VTGGSfzd=YP%N z_Iemv-x>eG0GiAAWG*&wS}0j_r1M9u!8YZ}17#pN+SVeHWTATFItI7K+z z%25K29@+0}Aih4)NSEu%INje}=g!fF*-XATT))mpgTMQR{9PCQ?d(z*md4hF_@!r! zDJYaAXc9q;LFKbB@~!WE{9!BtEu!2}B5g>-06mT0_4wv1Q?nSqrz?+}u?*7$l80w_ ziO1?$es1!^9GvF;*)41*+odw)nv2cfx^J(h*nguA*Vw|QbV6n-`rAYSbq|N%c z)9VE((DX&GalK*(VFps!@8e!6o+)`Cs1Hq<&3{Y%BfEq(5brQ`UH#{C zLtRl_n=7{SgG>A=3ID163oyu|5Ze5emSiC_57?+|3@XZVvk0S);U1^Y5B353dnBGR zO5}4~Yyml*Seo3yu`d+D@{#2Mq&j6F3$u(351(oZ768C zG^md5sb49Ii{xX+h)DMXit?5e=}PJ2V~J zpB6Jj;l;M~_>pZ^BIC?YvI{`$@Oxc!ZaQajprwX8ehT}wC>{`+@qjc1Wg@x@Cxd%v21zT2of<-Ttvu@1QelgDr~ULLxMgfLpkC@P zeMMmdzTe~Q4a{l+8tQw{HCfm8*Zstw5TN~J;NfMo>!FZ^Gt8bv5|&l#Kg74I!&kn7 z)Ns5VzZDa*8#2)qi@dr8Y;*A)r~7QRZI-{V-*L4cW&#lCPpm*FPR`ZupcV;$OYF3s z2^u-CjJa^O`L70(;C|AkHih9j?DEa>g4V9EaXDtTnx7Usb zY(<7s`;oT^99;VVSe}ox8_J7A76uLMhOpZt8eJn1v!(b^|5-kJcyJ&H;{(0oXN2r+ z6+#6%JCNs1SNyj4?VFv$Du?c_qgpig6XEsg8o8?HKzVvi4_SQKqRdioOk?H#E#Tq1 z7`v!*oCv|2m_}0Pu?sBjsU&LnfM_kZ`3B>iKboY5WTGmPg?!MuPP3LvTJr%CgENoW z=g79NQtEGPem+at0_4TGLgN>~nipB}F)URd?DK^|(J;k}+2$U;LcL z^`Kd;CHr2rv+6YvBWoF3+vc#Z*7Fj9!b6W&I_z>TB4C?G7;6AUiPL2(q3WXrAvf7Q z+#hhhJU^V&X8Dd*lWCC)*0w+%YHjQC{Ff@qvc2{r_ATCn33y8n3<}#ZLl!zAla>4w z_N`_c#TX=y7dLK(pX?YuV=y??SB?-AgENV)<5oJdT5P5p^pii<^{ke8;4&KAKh0B# zT)p97eOqN{GFQK`5k1Mq!G3=gKl|Hle`{NogYJ7R-Jct!G)1_{>B7r|(8C5z+N0-Y zEFqAwd3p4CqOqMj(0G1I`qy=T<$e3Sc+zvT$QCUwqOB1badj|vcihpX6ksx2s?(S@ zPOke&r~75f`UuV!;5U^8HIvkS*qm(sZ0OK+HgdOF=X;+)!mQSgD2a)XE$#1b0?rYs zN_*<`{YT@rKeIR6INBG_eh9AuT5%|Hz3%^=?c}LR5=9k~TWFS(qKXh6QkCHFF0)gn zN{Wz#TG@P;Q`0k4o?TjWFFkd9{Dy>_)6708PVN7fOTt;OLaL41H6@jo*t(U;1Y8jH zp7`}x)*R`MK6FYQ!hmKSCawCp+@vR~Sy9}YK*88tPI;amRPY$^eN$ox#8c=ZX^e?T zt8x}d^AO%Eo z1NMFKM38)<4RWA70pgyBH0m#ArRgvgL&kX(cs+J9123Z_YT%TOb|l1jKEvk+iMcY2 zkB$-Vw<|W;D^*24^2llD@rBoKdunxjaoO0KNQj_yW~PvcW4#~=|vh3(^S?o5HQdagjeI&9U1CgAIlL$ z2s>nCg=eF`&u**yT!%?ZO3Q$$DHU=o<62|H>S&{pLQ zzNR7aJQm2FPD^!2LkWz@x0jpZ8Fq-)Z8Rkcv%o_Y$9O{bO%c0`rt3p_Hcifw(9ZRF zq(~tyvfEv0_Xv2X@%UMP++iISX9NEe*WxxedqPV zWiaPr-;jpGw7bFSTe}4NbDLS$s}Bta4&O!WcJl$jt@e5IWMrSbZV$13TmE<9{F*@M z)!c!@Jez~>bbY~i7QckQde5Z9L#LU34u8NCRrGfA*VQIqKbTp%=5b?WY+a-(ToBN+ z3ISTe;GG|Ku4~#|ZFE-ioyx9jN>aYXNgNj^qxD>@qCqnG7TWy=3m9evRocBbQb|-Y z#1Do;Cod0||2EbIkot_Uev3QNO;*&iKmhGvg`}3(eljn#R~K_T+zk*oZoN2u=r+7p zdTJ0EO?v?!YU~bQj_IDDfVdk3&AWuh?bS3&mu-YZLw3o zv8t|PKM0LlnXDqU=kW_%Xk+WI+}pR#=Qv+u_Q>BQ@yqi5f zmpF7JW|zxl$(1Xj%bZXKFPyBgt{HBp_$Pcbk{P4@JfcoEErsGaCTRQmuZE%nwk37s zCC(8dKHkpzRNkc)u-oFDwZzRnT-2TB*6nHyA_}E=Z_`_u8UXz|s~9gMkN!?WKRfTD zx2q8o^FkTU$v$K)g$PPoDO=-l=x)aYQG4E=4L;wT9(LHtsI7?sD|8<5`ZvaL#16D_^P9{|Yw zY1~jD3E(Kt7rKr9{f0&QH%xR=7$y z(yIw-hENbPT}Z91n)u5;pkuV1R)njO@`8exlENTxP`SXD7W+kJ6nVr1Ssk4cJff+e zcmfN>GlVk8hzb^@vh2i($Q?H{6_G3-oa~&jP@oV7L|)V(jKByxx)LH~lx~Fbibx8K zSD+;R;Xbr@Jt$~r+X-XhmL5+*;jINVXg4#BH|AeYElfzF)Ptl?+5e_*<5BN0Gcw&E z?V}7M6UccYB|emKukuxheZ3ezZeV$>qg$GMpy#iF`}G`xi33o9x5+C{J_t)^`?Sr( z2l?8cjJuOWh=sY8TPDxz`~$2jktUlXx|r{f(8HbGb+~%o#o@drMYQ}yx#aWbe62?< zGtDHW!+Zx?Lm?;?i^0?Bf9Q54`Pg>G6|ty{##oO#DB8TgTHs_Gx6GVn_U8Jn*I2kD z(5%z6)NIqb9w}$F?EK)SW&Q8RSLP)=3&Y+gdYuj!=%@O6Ucj@(6+ooL z|LC*;NjCfa;j>r#)$S~KMZ)kN_b{Czy4JJ@ynW;XWRO1T=(udA*y05-Iu3*sZzLr- zS;uxghdTgWC_y{9-7l-64(*rI!#gGd`k4cN%zzqzk8SEob{mJ#mx>fkFvise2i z_eCG2``*CnPGs|qM*cdM=l<_JEZ&e8dUfd|+CgkIN?Q4#i@n`*Gfc?|*Do4B_O&H} zv&}E9)s#v~ditF<8OhHvK|bwk{N%S~^6%3MNI6l>*(=^L*;fGE4N9+#{6rRmdNiLT-KWIgqZkDZDgBFZ*f*FMkc^E&m3DV1BeDxU*+A}Gh?S+Q9 zy#2{+z^y#z~q=A_ZRDowAbrEnRYL=6cpF5WNd zrQq_E;g-&flRkF5<4{r3k62Ds;oQZ@FIIPU{62XmX5h4)%7DN#QC+Ne{(KL~isR#S zAW)++!&6|4arYZ#9up@9u}63N`uJ5S(w`9}LL%5c)qY*A2CuZcMHZ(>O176Ctu{LBsr77a$vj-{wK>7k zpb&#O4vs63;O*?aFGbgo0H{1}0ToZuu>%FEb@4Z4lz+C06F{d;7>1p2xW#jsa)qKL= z$|Z6fV6MSOFp)mC(X{GatFKJ%enzt8FULf+BW`|mQV(WUuWWIo`bk%k&2uy$>~d__ z;XeMCA+-!kqI)Mu`p#?W*JJ0R$As_J4;I~OJ-@|UC+i&XQnO?$8Ao^wD?7{ibfMsp zMT73-@!g%*e-5XaAF!&rE>ms196{?j1r}=Db-j!%zG?~Zh#S_z#&4zbSFeuSHm`vo zmVyHASl3RjSNvGci)YcjTV414$m3%$&hL*GJ8OPx)r-*qdIEO4XXE6vS-{}o>6{l% zjD&{u-DU0Z!yxwOm}Z-~t!|%_?|y5K!WYyWoa~ey6MMfudi8}k%KM_KCp*2%@MSc5ocf{tT<|<_!MT!F;+*w#z_qbr`fkU=esQkS zGWubA*=ZyaDMnkjz+hzx(f2a4tUDFBe|VLtLhzkt zhWu&aAU6aks`Vz+GENhfmUsw}lB@^9F0pGaeAs3Dr{Yw1heDrbo zaS!Go8NyQ}OH4ffBQ$1r$&HX}Z?Oms-*F&^dlLa8>x0HF)z_QY75$co8A9b2t?&k~ z_1NVVR;*o`y)DwWNS*NUhMjBj?MQk0^hHnZq3|fqZysd)QoHb_Alvr-Nh1|7Xn_!A zA`G85MHAltBzenB6u_eadVpm^vB)xwCN7zFE(81y%Vi(bMStRWNnGV=)el@0AK z;Q|bk?>F~$h>s-Hbxc}Li<9G3m^A;DcmWDKZ|gwBpQhinVjaW0xHJ_u>UB8g`Tw@u z4;NTdmGy|3lAK<1Fc*Ru*(pN7WN6n^UuUWprQ7PF7x1wD%?<3fF39jiWVvK z0ZI8N8CQ^vo{7O~IapPd?=w}RB(I?EM^)rLZgg(qSkLtAa&v{L@@|)tpo6+Dv$2J# z6LxP!%kKN63ss@JOIE@0{h8xg9Ejnn*Jzi79}pVik`O$;Ox6x7y^7kOV@=Vl#359W zF}lB)He;a)m})CRkVGG*dIe%4RABvAguB8O^7>!zr5-zrE=t=-r0mMTLMfOavDUWD z>m#~eU1yV7(fyPSk&#_VCz-R0%QAjF0zQVzvdWqafZR#6(dO9EV^7OUFRD&!KQ^i> zKzvR}0i`4px@3+x28<_)?z~^_(mFu!Yky6$Epgjx*HDrWO!xL7hMb4BWT0(=KkrL% zlN|#3RK)Q(6i<_Xp)FKcrP0j^Qu>v6NSc(sBZl%P%OY}Iix4XkRajs-y%s&h~(#k1%{Yy3sQOAa@H)9U5r0PU_eU%04=-(KBFwAjMmvIttQF2jLs54`i&vOcVA zZl+(j7bqfOby(i&U{boj*%$NO1<`M0%E~}f$gRubsB*PVAG^CAqApwv`73Y!qH*pSqmH3X_URIr~Z=F!B3k%9RT58$4(KH*@t@9JCcb%xdnRe$^uMsr1dLN|zscc{= zEB$(jf?ju?8N@h%&ZL+iuW6p`WcBKUOpIvFCl7GNLCfqBCYD%vU_^|(B3%lbQLoP@ z-brbBx8z=oi%4|zQYO4Wm*10#l01sYg9|%%xAFs$3C?kd{}gInRHOVvt+*;H6!7FH z9v7-cvPoiPQr24c8`?>-wX+G%m&a4P*G+t7ktMTToc{_15*+s9A-L^0B>f_eD0ZnW zPE=PT)shut*+!}Sc9kGN7`Lw+5|Px&gE?-+d}Ntr=bVb<7Ox2T`|c4@>fmj?qm)eg z58`F!&?wEHz0>vh%zJFsUCQ>C80-`jdg)#y601kDz(b;CH4f`ZF zp$s%5P##0{?r_y=MBuB;zvtosz7NoPrbOsoomkc+=uI>gTZh>cUs<@l{Jba)&;AML1djLwniro@{t4mNdvE)V#C zT8yOzR^}~_@n-nDU$8|sJ`2_LJf4Q|$xIWw{tQiD5qr39oOmA_VP{Co01MU!qLIHY z>T=#Yx2`W04{PO_a0e{>`6(`SrtrIp)50ZjJtjw!z7yZkpvrCzdG$E2rG4gpD~Qtv z_5M$Uu+s{o=Z<)25d&)ifK7Yv(LMIl1r4Wxja9wFAaxtASydGc<5GM8`FhGXozi>n zr00U%+6G>Dw;&6m4dGUH=|81o2*cGdHI~?WdnJwObbvj->fP6jP!e<8?nl0S47h9Q zH?j#O^Qc!IE_bQzlzG8QzqZFS-}ijZy{Tsg7b}wrZ?z^Wbu)rki}5x#E+*7D_LfRq z<~eh8+N4HsY79HC$BH5?-U_mya`sF7>)%upKD+(=5yoO#6xQPJ^`Cti1cDK_*Aga{ z^1vD*w*Y3a_wZercb>Mcu3V9ZEKz)!K{NR7{sOmRCoGXySqXMq!Jzuytv~Xo!GNhJ z0!Y3v`0?@8U=B8j6=uI$`1jGr;pSW~Y?x0)uGR8fr$xDYVozC(LwkztYiqxhR- z(l6ZQvPC-=Fvicwf@7XacG9U$1mt6~hL5U@8=mzKS z2JYE@#<4D(A%}A%(k~_}CmBw#3hTI@^Fk+}byR*ngD9oEHrMZAJek?lXRJ55HdDxL zZv$6h0SYvVgf+Rr!o+;8Q`6_4HZJPEGkr;v=gp{(38@@~YDrE*A$`2sAk&<_35a3k zCacPP^u;+RrJ&WJA^C5lOepV^n zz?(q&aGm4!z%ujwbJ*!(T$6Z7qsd+pW-y7*%2C}-d{s9Uc72J*Tr*K?UJ>C1e8v2_ z*uOkJcAe1)DtHMNgM{D!g&+t-9XYUxVM#3&0+4y+nKt~qZ=yaj$P_z4 z{T_}v3|sgd=9Dpmlo1%|=^`!IiQ%nacy5;uKuwq~)MtP-v_RHU^GsVU57H_tEB*a^ zoNJwGyH5A%w>;Mlvr1Bc89pnFlZ~|%vRzFl9ai^ZtpqELCGNUk>OZIza~Z>6?UOGZ z%huZp^07jYq)$wdS_m%GfDG1(>4eAG8MT}xPj*vr=aXzc-mJ}Q>*zGwFE*%T5eHl7 zbY?Q9BJLU`Gp3S?x!w+)zpf%}2ts=Jx809Nm(kSyVx^$*VO4?x%930s!uQ7 zP?N3()gw5q!WJd|JY?ZNH5KP*i663Lv)AythvS7m{7hp0ais}dG=M!?Wt$`wp{Hs$ z*^Simawhlf{NA|36)|C0rjj|=BIabVk&Rl-^>|rWLIO1q_-RIUA2YME;6;Y%0B|~l zR+6CqyALQ5W@&o=8+0J0>70{ibb}X^b zJsIc{mYqv8%Flr`^RFrQByyhE+0BSv>=$9Ag?&oiyCojRvLsfE7?;(eEF@@z#XQat zNOFO`hx=w^bkYUR3HhKxo`w`?2@eAcILsv2E;saddc8V-<;>M}i#W=g2Si0HN4~1S zAaG9Bv7X057X(SgL}h0FTAn!28>W9d1G0IpkGsinXdpP0bW>_5=&2p|aGnaJJSt+j z0H|o90z#jphJdJpk^kSlO8(3VRS%!PICYdWJ%jnrVxV5AoeB)}K~WMk+7Pr=!Genj zf^ly~T6DF46f|-JoYVvgeJQJM@|*#v=~4~K*2Dopr@7XjH|ZF^29pzb(hfXv>#YPV zyuxI{Om;pUl0Leh?K#E}Hb&$&_Pm)&8@=o2036b_Rk-o6J%v-25orQc{XdO}!{e?Ok1110*sVV~d?Q5|n@!%%h6VSiH|=O(~B# znE4T_jRWHYVqgj|r7H!8F(Fv6vmk4OH8dI+1^*5UzQRfe?#)iWL#gilVRpqm_=p# z;2B4pL<_j{*UE#YnEfZ=7>|H9iE;XB z=$fjd+w@UuOIOFAL@H-_w3mQ*|Xv3E?)CFLRt>&_{;!|5P3 zW)+p6&U)AaGeJISK!1c6U2@)aqRlLGzbUd54CTNJa)}#KhE4Ou1*X;Wt4PZL`5KpB ze;sQP2rv*Wl8T!`u=~m6Suuc!DuXf;io6m`G68UbQPV~0@S`UE5jM}J<7LQ@nh@Gq zWq!YDWUh=(#{}GVX9QA#5qg28!B7GZbBMZ11B3!!*qOBi4-rpzXWgLGEl#Rof1jLD za-z5%A)^!=6~MAFn>AOv*zxe$-z?4&81c)|ljAcch1EI@sL%c)ZG=z+3e6WYjzU4| zfCgL-fosbI4}H}s1SEJQvz52C>Zxr% zQ;2@Q9Y==$EF{V+3O$z*`zz(~qfat*u$Eb@^b~H}?#gRMxdOi5uc%VCh_ns;<1gbr zeQxCma;N^-cb3TEord5RkXg1eYvSZMy0vCddya(fh>U@bp51B*7ye;0sR}s|v{~-5 z?YPI@M+8YDqTYS{4FC^+Dn+km`mQvyU{UL78X$ryw5N#?LG(X%2gb7;daO;%oDNe- zOu8>Oln{CW6P>mP;5-A)%fs5!+#FdhN3B7AYrYpX0Ih*i++tnWI(C1lKqoKvsO7Qi z@!qx;xwkps#qIgy{A$37@lHI2t-b&+4myV+U#(%?@vPvo_fsm#)$Zzq^7m3aP%+pb zzSdZNXE2622Xq`LSuJT3@RSa1PHV+e6grw!&%BR$K;aN=lfj<{v}*4VrDf z8eBI{_B7q!Tsd?#s8fMl@me=jIm1USR=|B(0(~zx`aNre^m{qzu6sDm&dDT zEAc(Ir(J4m2A8fOU`+$i8wE}vQy$-a%b8nF#(VmGPtZ6ynb5Go^{!fU`)IYJ!)3mf z6&5F36u12fFZ#Fm?N*ks3$@~cY)4eRg6? zV6ynf?Rh-j)NZ-Say-v)t_FTTVW{SRv63`M9Z=hLEqf0jR0XLCZ#d-;~EXVkY`UIByq7y+E@1oyW zSh{erAh1A_lqQecPeF8E5u-5j-caxExbnD$(!{QYSTqt1aPqWvGi!DW|kxxv2otO%>%Enl)1Kv!FY2hL7q98nEop{8fa7?K^?{qjtsFZa1p^J zGfzvA=_j=YWWd<8ao4ALiD%!<8eEA7tBOR$r>5J%NJ37Bd1$Pq0&4{TgTec+EkJsr zE7o?jfdl>tT@B_6k_@pJNs!uaA0QndR7mOEB8p&jZr-;FDN z_Z-8+k}_XoZU{h?&RWl=%GRn4p2C@e#lDHWKlh z(%5C*qZV_;u!(8);2?AIqx9BKH~Tg|79#Q9M;V>9Ao(ql-zVfS)W3x$i)6eWx7 zV1x__NdpWt&#Ri)gZbyy$8?0QC3GcMTi8Z_0ZVaGstn#N13pJM50DFy{CF>85hGon zL+0}^;>^Ohm#FS5sFgXLrXdzwUWLP~9E47ZF27GcPuc=8R3wX(0rk4OIXfB|2?uI5 z16cCxBen?y+VCHGCT8s9I@Sj%iS3mQ^l7HI{?k2vAT$D=YSE?$e8jl3b0^ zXh)m)V;Rh$cvA9iDZP9U`Y%`|`8G3qi4ZvYDcm7oS!i>DB+tLe5B`Z*{WL$wEOSbJ zYZkD1K1SD>`kjG8FN|IVJ6Bo~1Qy5aitK`bz4mAWSul7B`&yfM zmJDx3Ui!{!&XRm?qMKdLrhpW)!9uK_RK6_jZTLEtRicjlZ%mlwMrZZ!b`Ffx;$8~; zC(|z^A+JB4-r=_?@sBF>V&PNT=@?9j4-PX&`E4KOjyn$`y5=acQV#tVmPSSn8_H1K z>Sg(dT?18fHP#ZmeM3kJ+HL17L6%Xu`zpL`n-tR9Iw6^4K}klhKpPw}0CGjFco#N= zOb3#2i)D1C2bP;MEP+ST@sVf6-f;q7esP7=W5aX5T~;P3utVj`$Q>~TK7VPO`JPY9 zSIQ=ve&S$8n<@0xApc?xiaD->rIK%!ipKMJ`izD6_|m0&Mu>^XDli?6%u+8qfyx6# zc;rW+y|#5D=?$Sep0Jp`O3X>Unzkc3k4Y04-*zR6OfQ-Flo9JJP8u?;@%&VzeBbw4 zw)%ak!s-N!DY0MPe0F;@E;^gi&7o4KNotnOTHpbeT;eoV?`Nhq%q(+LG;0LQbjZ35 z9U0S$X|LP074r2i-iLW1{43x;x*Ki#>TpVxD)?Zk2!4CEv!_8RV)rNWiXzv4yUj$b z!_?>KHOLXLEb$K$0cF4f#U|gZ(o*lAcTUQd9s5#PlR^0|gE+dzKKvj)+quiiNRope zHs8+A73NJA+oUO2!H3_cM6Y!oTLG9cwo;@lSOjn?TIqL@3%n6fDay}x+}fSuFci@G z632rl)dZP8FOZ}0IsP|4S8eEVUjG3|CVlkEp>IZ-Eps>tr}qCm1$RhGo%1^V`%uUp z9x;&P;jIB4ejLnue3~CIN5kEpEsM6)r}4YA44;FXpMQz8sH|>n`q;Q#3yr}$<@8W> z3?+5G4s!jWUQ@sS5+HJqIxs~zyIp)yhvFSA9AcSG?DY$+*O<5YK$#AO+0b071ckai zD{(KhELQgDRrVuI#A2LzU;uxT!}dk5D| zkIOW;EU)vvWtNa7PQq*}7{jl?3`-9X__72XbUxMnRGBvgyjNPWo5cq#Sd^~I zd*&0lJ}>5d;kb*f{(c$?te}Kqc}9X*+2ikGC($Qq0e8cO2ZE1c$IEQ@ZYR*5!Y{{u zH*3641IK>%%Rcj6{IA1j@6_oImzQ^^Qv+1H!T*(gPUd<)RdMySdrTfnzkaP{pXqFw6RJZR%?0ReAo!VNr(@M6_all@z?s=i4 z1*$GtPymTsW>D3qC#LUsylTB|`}{#386+M*1MuR)%4d8wxbKuxN<#mp?eHa*=zIu_ z2pYrsZoTi$4hj-~C-cP!r8kjw>K6<1du__9o1YsV*V@O8L!bh)$}ma9vR^h%4|6#u z-CNrQHKcd zYq#$!jht78*ZXVL`LC?{oLpSJ9D45m=m4z)vvy;@@tK?l+{+`F&*oogAnh=G65x;< za58S#;*jTkV2oAaaYAkTqIWa#kSB50|0Mn3p+bhbV}$2>zvuyoPvA{i(_G=N>TffE zMPjQtY;B_7blZpYUPR$s9L@Xm%SRDdu~44SK>k& zu4_MBF3$Oq&Gigk92Zm-4Org0`zIVJv)}zd-DQ0&O(oJCDRYsx(B9>;Q|r(T&94?( zi{v3}LU8F}5n`N)OfQO?~I=`+T9hS8)82B1qe`FCuyU%B~t3eY>U%;FEsDo-x^U|$nQHgz5=tc1H5sft8S#@dI+FX^T(PYY6r9MLuyq}}3?8}g(#d7ALa zb3YJum8=s8$I<2f+^_eoVOg(QmDds|_d%{U?l6N-KypM}?dF>B@d1`z-LszxZ$_nQ zkNu7+72gC~oc1T(G9Z-JVh^8da)M3dz=7T#Tf>&)$BVk2gS0dvA`%L#20!?m@YF&< zUwFXFQ=Rt6?!piAWnRlQyyxf~-A)YEBI(S|*(A4g9+LS=7w=J81TH-N;wOXG%@9$?$PfwR9>DJ31 zUH~pz|6lo!k4CD~#Kb`D!P9)Z8_-V9R;Sw|*P=@KZ|m z9Ny~HVF_2E5S-y3Z;-K9b-l?&0tUq4^)mDJIZ@H)0Z&JhZ)5@J-eQwRp8&+rVY$hx zZ(tlW0|n@p90ru{U3Xh%Z2^#FtHs&0IqGHnzy7!J+G+DuS$TOa4lh5Wq+hFK3QW8C zT`lov0pAaxy6$jNy?S-7lEnvH%#A1EC2YL|*a3AfRnnt?Os=gvUk%7zp1iX^j62de zGT$)76%w9fuaM@R1QcjYnvRtSjo81rao75`mF-@TU?_E+`IX0fz7WNd3o)D1Qmf*9 zT*9?N*hX;-lS$8XCY85lR=)CqbnAm+qPy=$3PeM}h8%NgmWnKlRWe2(u*uoWTnweRR= zu0inWK3tRyr3lQ4jl{V^fars;DiAZ?|P(rPzac5~#g&zk-nNaVYPp{Hg43AfKd z1%;UrzusQsH|OoOxLV9L_IY_ciU&~2(9n9j#VVhcvgdhhPzX`xghCSI2G*p6ZU3Eh zEI>qUc)1y}qt*PeioXjmtva`Uz3ZxFoeW(^a5s!F_QCNzU!3-^miI9QN zZGcRfqUtn{4w^C05e$Equ}sR-sdSuXK(RK_R9f<*!@%Hs7ers!r=Df+an5I>)=UO; z{!6YZiB9ciPCAGwwe9wBc=&Zmz0^>wQXBjgGTRv{{7;)#VlXP7(P3!-o?79P_ zD3*S8_ss0>B#9s*C?-$=1w=(b3@Bp200s;MMMXdXa~4H1 z92}Q#!-Veo{+PVGhwq#BJZ5KlI#&2qb$4}4)k8t0Ns~q&@A#4nlqD98sliY{k>rxH zNJT|uZdPXVW(_2v{d4RzA_##R*CfUQ!JtgZ=C?oCyZ?};X@!NQAHDl>-8!|ibMtz1 zYs)BHdg&!QcYnES*QaTz84=as0y3-RS@X(5q-CauRsD}&e{0*k`Qbkf7Zw!-6!FvV zzwJNp)796ET5#9wjP#UfMcF+Mu8c+_0M=@-jjy~>t6u$Qo?4odm3q^}Ybb$9H%#l% zqt}y9tPF*e$m09w-o5yb!~bNaXR4YG0J_dI(y|VH`^%vpeyQKE?y;l)3NDJv!-u~8 zR*!0RYSw%DspUaM8aC)MKs@ zqA8*vgmS?dC4kh9a1ie&NaVw05Xhe}xigO>a9{j;R|{LK<&yA|1THbheQw&39tVKe zOHEu3r{+0ywllz69UB^3V2KiDAWso#>uz2#sLK_b_rCZ0v7bxIN;wy)a;RqQ2K_r- zar@BgvPn8O3___yn7JT;mDj#fVTS!B|stsK}5;~rQCE&5+Fb+2x>+6 z0i?`ohgTpI0*p~jH|p2Oxqt3dm^;;c7mLO;O=k>*;AR{>KrkcDgAFqf0qqTpgrJS0 zfDmHVk0KD}Ezt6unEgcknx2ABq5^<<#3Wji7DxmE!O#FiAd-nd1ptCDOmK*V0uUk0 z0)!PEA3UwKaiw47pd+#o&5cgZ+zhey?Q$DWyS1~4h1k}D$Le*^n_U3$mI9uFg%AWN zWv-3ng(>C-j00961Nkl?wNk> zLfMVe?p*Tl%F91~)i8`uFmU2*;g)UNfu(%1ek8+rd2nEdunQ?q|{ix>Y0umT3^z+t-*PIUiIu6^#lq4eCGL$k36z$ z#Z#;Am^GOa*uHzu{dX@pcJy?u?yU{o0OEH}5s+jlzj}>n({5fg=Xzfs5!k-_n^1bq zSKj=@>zK>S&Cklp1t5wN$jh(GQGhjnKmdSnUbA7d9Ur|`GdIooBqujLr+(8dZ@<{H zQ`7Usm8;ggxah72S~aVG)sVhu?Si%EJ`xAPe&s~wvuo!jus=;=_!2(}Ty$NUV`^RO zBFUC*SCKTX4N27(i2uo6iu=fM%^`Z*Xd5+-W81Po(bF!|mBy@igO9$uB5o25p=(`QV*`MNRhZQK6p zD_f`7)gZJLJv~%0L7d;%s;0tROpEz;y+8b|s^_6weXk_*s z_a8a&uO5wEIdsT^J7#5Mgr?j&uUcM>BS#OnY0=`*We=&*STLA+>U6>NH_z$QtLyOL zLpQzt)`{b1Ry_H9dV2bRD|)M{s_8mMeERA2FTC6MLoK8nm&7Bht@6czjrP&1|Ukx%kO{W@m;%iS5}1YT6jnAUL8Jo z|C7_lk1k*FG?fBVZq9vp`4fBgf6axKmr?z-O)r#HTsU;-+p}lRO_?%h-3x1U9)0P> zHgviUHb6q*WZ3uL(!&r%hk&lckkB5&~-wXa85L~fQM(Wt2V0=dBHc0 z8Sl@sKlih&7bC@)g0`mhv4BJQNjcHOb5-)GPsI^C60e7;tm9c6d&MJ!+?o;BFsjP= zW;V?Wx@cBg9DJbV}gYcrcXz3BY^6@r^9zRfd%5Cvt_%2RM5&|FbRWoj6l3oGb>xdJN~2-K-lQ#Aw^0EB=r z6p5Kl7J}=BU<3&>!J8le=4`PwT@B`tnrDfcN?tHV%_V#08e7Jgvr*Is>+GSoge(G} zIdg4V0%#&u*Fo*uuuMEC#nK>>Bnd7MfH7vSXEd{wB<5%bBn}8cCYfDlFOqa=FbUOp zD6LA}76+G1LMMa)RJE+e^Xot23tNqLd~5N~?M%SocVFh-RMx%MPZVFZq;mispQypP z8DYabik)*Igu$51xiAdFj7ug-j8bZFP7o+#hM{wVBQ@~>Q52a0s5<9dR}@7EL)Ue4 zIkv7F)Qlv+MJyHrfKVu?YTDZM8!}T<##}WZ9EnguD=WjgZUln?#a{hw;?Hn6%DKT9 zl_WV5iORCf7&U1u9F7>=@}x6L0|A9mS{aTA!A)7E$ny4GU!;UmM~@tWoC82K8bd@y zksVL4mx%2_2C(6;7x+8=IB)->wX4j#*3L6X9&`aD`9Q=C)5XcAs<&~^{{uP^AK6)W z$hE7 zS}Ya|Drwbn(n9Gu73DEQ)p9aZi;7Fq(^3f`ln`$42@}RY`^=^-@9&s(>!ghIv?Iq( zXdIq;;yH=SwQJRA*{DwYE}hpsvwmRzo*mjWF*uhP+r8&dW_Cs>80y%zby{ZXnSyhg zq3ebyDXWO6>OaT-y=vrCK>e!WgLGA-Wuzd2KrXle0E94w$)%Msor{9gXFl1!qcU20 z1>Y}+(Qn#EG+Bao`7&UJ#s(V;ClY*-ifCMoSY zCHe#U1A;xfW~a27%DMneY3|WWBq3YdLFd)6-nT%U3xG&O0tyi|dUg9jn`f?jchQ^c z7rgY;g6Cemf78zU-g$7?j7*-Y87iU9L?p3*ffc&l&d}RgfRs|%x)eq!0v8~Va!CeB zqKrwBB*}pQp-dnmAOS&%9iY)_0-=;LGpV`sj#6DWB9R#9T-WvTiVCwJL?SEZ8OcZ~ zA?5-`L`r}XA~7b*k|ayA%*^;8PNzzY$r57{10=#WXDOwUWERRK#=x)0!RPvr)3Dlf;VU?U^)4T7gG93Xhk7@OUnREOTwgwti0b-OIf0Yy1`t`GpacW5#o*y;aw0K{}1GE=j&GjF_gc3F9t0w}U1 zxSpDtcKYnOrH?*+)6Cg--Zq&V8UPON-{+feKJC`6B{2zuF>@QZ-F_lb8jZyi#odTx zZsdun>b8%z4;*#v?oYosdZGXTIOkvnL49erKzqViHIQx2R152h**e|dct<^u#uI3*He z2$oc06jDP$AjA+zgnI3Dqu&2u%fCmDtax%gA*4>dnj4;fYU}2gYu9YBbm>z7aIUcA ztFJyCH)h24kKa#C4?OtDYA(dB(-(%L;awlTbJv17XHK4A5DF^6_0Mm7;e~gWFJ1D< z_N{;X`uoylPpL7LF{W#J>t;%sDeqaB@v$!Gv~hh?T?>+`lVCHw(03vFE8-M!c&rO@(?Ap1@CEdF#!QkvWZW}gq zP*K5!)2GiFTmXO;ixn1@fUJD@;U@*hPQLl!*0pO_)vBJ$xd=$4GNKK+qW{g4ug}QN zUA*|-yBEw@_0+TLUU>DH)sOD`>?0!S#fFk$}ojw~?H9`Od z2Wtip5zSh8Cvr`QhlB`11to%*2%XUj#U;m1p4JV4h`M<;o}nY6EXzRI=`-j4`S*Bf zX{97dj50)Ilq!m%8RF#WvuDqq=Nx2NreH4IL&hXkGyeJa=;^ZsKp2xG%80?StRlh% zQc5Txi~wZ>2$YmnoGCbm+(2Pa;GuvL)x|&mo;ZH;OgN$j6d4FHm&!?!M45E@%(?Q4 zN=cF=#_Z$sxUL)KnSin^bEIbr3JcC%AcV=X>;VlPqO+io4bss?9)tpAHkDctS54d1 z13aAFDK>d4{;;E0G=R$k%gHUdyl8HvO+X8@dGIClI*X=#N???PDrhXls-6zWo7 zQY=P%uM(VLNmG02-`^r1hqx}Bi+W)^CXy#xCl5=HI;+6Z0|w&wEAjGXObHDriYzg+ zN{mri4lqV#Sqg;$N+1vn1WcntQ50E`8Ka642&IHlg27NQ6bc0ylK_A*swfH&LK#y6 zK|&azETEX*GD(s`pwLcz4ul(e*zwA4^A7$k%dLW03SFc?$)v~l5f3^_pdauPm9IO9Z~i`!_T0oy^^&)gIDMV`wVhj>yznJe>z+ zT3skACX{fY$25Zw5{-o;ktn0IYo}J3=_zYgJ^a?o>+ZSZ)TBs>&D`Tmz+CuYVQ08c7J*B z_uv2eY|p{5V{U%^)vY((Fm~bm>9eL@zx4k3)pIh1(1=8{v$M8+_-SET<=XX6Jh@^? z>sAd*%FBchf@_+t0)WBQii(Qbx#?+XsjWM-ShwckH(p+M$Lw3L=-K76K9}tJ@~dqh z@BH`J$&a`1K6>iB6fh4#0s!dK=hB1U{rKX`Z=60`_|mIe4t@7a_wL=k+;`};ceb58 zefF()-ZK!IHEmLO?tEE!r2(KBv5Ig-(({B-xN*ay z$4|Za*4Bc8^IP8kWY5)Er%!^@VdT>SROAKx7Mo-v7Y z@Z0Od$X;V1$vF8Uug^=`|Z?)d2tysHtiMg~TL@F_*8bQwU8? zv!Ml8Fc$1NG2PH3k*IDMlt4yih7wdXO(TTFG?g0$K_R$MH9a*YC6p2}<$x^9gjn%D zOqni(P&ESxpy0AB%aX(x6I`4tECeKZdDRWB3n3_FWn~qF(zMhR;zaJV8ykyh(U@vR z{g4<71QbbP1b|Rta8XfFnUWGRcWWD5NQ`kVB2f)d=-kLiPnQ|xf;&^4u0R$70fZ2d zs1}K-6aZ03j0J-MS&^e^6oG_-0Yf(^p$JqE`+PhhOt)HbSw$=wNlQ!1NJ}-zP9SKi zCNV0@5*Ow?wzFFngfNe%L_mnD8aH%%ZvqLWh5(_wGAe`++@J&~V}W3Z5Ta{3fKU`! zmKXqVfrNn05e1hdh60cfYDN|ZbB7B80HI)RsW;=iR8&SJiJ5zTg%FPZN?f%-oDeoP zsd)jGcLv4(5*&gD_tXEn902I8gyV$pWM%&6stE)Sb5d){9O7UmIt_Glv$+c6=XHtu zl~pT$G4`e&LI|a3#)<)e%dfa%&9iUaHtQ}}{cz_lt!w626Nuk@_ePa|Le`yx3p;1oB&WpBdYe<*N0j)Z}89q^9K(Z z^UjuScg(s`jYSD%63E9+pZe>cW3gE5jkn&H3ASm`NDo(l0D%GkbVJR`NW15*d9!EE zdSJ=&CssZr5Ge%~3>^98gi#rudi@w(Hz;M{h-z?7DN!UD0)!ANb|nGp00+}_P$)aF z|G>UZ%@|{~@@v$qTMGa_+WF;~(`P>Yc=Pb9etdr8J4^4Ir5l_wY6ipNg6o=wC=7!m zf^d~LF;xBejqm1WD6vRozka=2G;1s)GD6fygfSM0L%>wR^fP=ktFm-vUb`4%Vi)Jf)WCV0;xo6HONZM4Du*4N#cN~Pn8_|O{pl3 zW#^~YYLroQzN|DH2FeW74Q>GAwd-Yj`psq-$CM+02#OMD+PJ~d!-oMtqErYW%Tg#M zg>!=vs_S~w*4-wI9wa!wYUs$L{~iT^rVSc?xa;#R?{6=UL{d`H06_|J!XlUT@vBe!CWpKl^0&pGQtpMz+1bvuW!#hmRk>aN%sr7VWGClY5Dopo_pr;y!wG>x`hmc}7}lNoR)q$6x-Ma`ScL#tZ|12k)Cd z=kBFnee?a0%X{joDic}wxQ3$$Tbp&%Wy&v2GR;>Z!#S7TV)QKVItBq4_%N!yAT!;W; z&u!ei?W5h9x!GB1shk_d7tZD7=034v@u_p?S3JJ{LUCDIS_&1Y>e|B(+}XZOi}yd= z`TWMM1?LLt*Q_>g?)2{6Iz7GqwViwRrDcSwrKAQ^f`9z=S58Lik_Q&HYtu3kjY{^x z-&XNfYY8~cCqM*r4)hj6NJQGOar1%ie|c)flG^#z48uISfk?7caK7-Rjc@PXb1b!#sKGMW8#_}`7MytV(}4-$obeS1!wa&7f$IVc37^xXN9r`Nx->x(aP zvNDET(f``XugUM9isJEI?jqqL@z)6@0V{Q zo{z0Pz9GNY!9{A0edr8Gq7MSVTAPdD-QD3hN6b<5`+lsIp&rZ5_FfQg<%nb65dgGS z#F%*_Vs5qE#~)udX~GD~m_h>^W5Klz_t@HWNntHcq&aJMYR#nY-1Ev?95W*-! zKv`xtP8tX1suq)4JT|l2R!`3oBxoq`SfxkJhqXnC)2p*TeU%ZYna2SmOFt`NKXxf6ge+9WAIg1zqa|+ z0|)kfvHQ#PlypL9MrtT0Jw$*6WEPZ=bAIPtw~e}H;^^^H>($Ns>BpZRe&GILgL_{+ zV$h5^i@J1Zedy2+LB(3FObHQ!59r%t^5pUNE?L>WMT4*ReKU9N?7DUGxe+76veFO< zfM8UrtPHPSwFDSjv1;uz>o*&b*oD(adkz|K%Zy1`sVT*!u zUae+GXm&;#Q&IpRBP}2+1Q2H4Htmju4_z~1W`2I|kKg~edc^~C?wEDx;15fduBu(H zen~+=qXu=&4wWSd5yp=jbKuY~tDbt{!%x3D{MX^7_unyN`qbUK_b+;2S%XIPfBN=^ z1@rHymXoDwvFf?m0wEMsgkdyo+Gxs6W9QC)c+|DG6&Dq1DqpvH$>^~ocJAK$$ipk% zeedHRe)#RK`7eqQzC$4_MEWZ!k?^o934G=9pQva=_1 zbF0stHS5I5e=@St($Z4^Kw?x0u+&h>pMU;6eBAUg6GxpoQ*h0=u|b(EUAg9`U;qB~ zz%Er)%>&czI0}}SavfV9>Feb_M>n}j(?jJxl0>kSEL!iXR486CF^C9CQlB1|^ytwwBQ52{S2llr z@TX^1FRfdv8da2i`wnh-_v4XQ59`ybtEyV32pgPBglGnTd&@^VKm95zCzBg`K#@m| z7~H2NJU;cRSqg`hT3bV7)2lemW>(cHLqX6*JFMqxG@;f@n7fOoTH*Yxc+EGpG zy z(P`J0dyCJPOdL1DFt{YKNF@5^``g>JXx^=3t0O1QzWCCsWtEkYXjE5Yxw*NIK5}2A zyz>6#PeoN#k3}RxLZOr?QzoB2b#C|Pd#FUyLV?~ryY#-a8+Z>el1svQ2p}7dQm&=xn&CjlV2V+Y-7yCG?3_1w+ggf zGfCfiyd+lbk^~C}S4<$WLX%J@=hm$nZ+vC--1+y79Y48yuRc#babK(E4Wp5$8Sq8e zRv~4KPyzswqA-cQ_x^S*rvC8VAp&IaBlmGG0s-aEzmDwM`Q^3aNA~H`Za}|2@4olJ zoS8QeLJ?4s$-jU6HtE&{rG;ls7Zlz)`_}d?8}8YA2oyDm#7VE}*-X!+AE?=xjV z<&$kY_kQ(_j@s;7CqJ-gwh&^?niq#%IkZMj$_+P+UHRm5_ue^`QNp!Co-1rkK(&?0Ki{SZQc3z3?ZGH%?6+os>SbI&&e z`&?p{`T5>Mg~jJb4I9D;Dhe0|*L1z4qBJ8TN7am>S6(Njgl?KV@%X8Nvu6tdK#OVw z(A*rvBtis1fl`2kD=SQWAt@A)0|Hg(x$^}-e{(3RMQYW_A2ohxC>RuiON{9TpD=3p zhD~oQUACt0&_TzKpIZIo%l{lJSaL~sMyMdPA{;iWM+r*64bBZiEh{V4HG?riDG67U zHEY?ttfF-5)(o7e*QhpS)?HukJ9O~dgL7t2%g?K>8-^q?Rn=?P%zx>HH7lNY_MUqldhf&CZ*6>n z8oaoyQU}Ty+q?hkn{U1|BPaKou~#dKLP1bU!_ja>G^`mK02sPfR8nfrUK>Iff)`!5 zaLveJDVdoMEV^&V&@qoa`p}fg<0~t}rl%(s(<;IhDmN%)GSUl07t9Llf~ST8)FvLk z0b&xNm)MdS0Up2D#l38vi60O7`uQqp1|Hv*IWLRest`LOm?f#JDBo9S*TPOH*0o0b zZhb;PN~oJpaCq3%`6|xi?{!%^AH`2t5fjImM_d5_5=hTUKXtZz`=K3Ox_78uGq0?y zR0zIr|99KAZfnt|UA3(2bLY=6#!^CoU;h02=9_2dRIk;$Z?A1{zuloj>y~X=|9k8o zJz7?5=pVoFTC-NI^788_l0*RQBMZzhc2jaS-yAwfpt%>Y*4ReOjTDtx%S!hFHgI5%HMzfvFwp$)vM)=A2X!5xMcnF8~*+G z-zx|8K}3UdS(g9&>+dzIpBOpvDgcmV>EENrr`|g6>wWur4;V-Uy!zUkFTL^R3(u?` zf6ZW3)1H6j?KyMr9(LuG2M_)9=|?;E?A=+vPBlbOWSMi$B=+awqhlscJ6~|ROOMN< zv5NZ^FFW+(?;F-FwQOE@{sqmBL9n;?+Uo-d0rT85AW#{JoH%)^QT=-6QV#HP2bhcL z&^-B>F;-euzURxms;YngJN@il;rRm}R>epk!u z=f~CY)$}^+z;!dCs;WW=bG3w-%-0>hT##5qYdZ4GPmYrw{33O$pPHaxRa`HMA2moMKdfL4U=GLu~8%znj z{QQcCAA2f0J9G2qb$|Tz4*_!Juq&FiXhtXdPOq?+4)6e(St5^N_$#ZMhKDTq{XIBp!6bi~^<>j-d zjOx{+{RbcIDl0E-RBy`IYlc?O$y8M}BO?t67+fIYtvB5$O9}|ytyAkKmM?j3)v$Ti@Ko^)NY+NRaOE3aLX-Ia&vQlz}Tw?w`tXU^V{zi6%{}E#PS|p+X9N$Hm+T_ zVN*C78$Wt@(fOjckj<({vmKe~9x6}=P*-+XQT#<$u#7dY{YPx;1vVTpL=@w z3$MMs=c})ucx>@C*9;ayJaEtK-0IadLvL8W&cyN8oGG{<1WvhmV#~H|o_qP_7K8fV ze8Z#~)zSs2`{=U!nl`G308N@Sy!*}>jqBI%+^O}Nryt$6bJyrmBc|UpMi|B|lW#06 zE(HKtmKY;o2OuGFBw>SxB=qBxFdk0yGN7~Cjd=b#AjC6+>p`RbSp{(28IonW+2ovb zg2H#jn^8arArM&l4W22^w-mmJVAAPuO=%4|rss$9~@X?cxty-zbfmR(l7MwV;bjhQ)%$l)!>AmgRw7P%k>h&*e zTz3D0a4fp$frrnZDYEl#v)Qz;Wd$|@_jeDMDMz26QRG_bg|u(Z6qOV{=Q@Wq~e zv+uZ%>%48J4*U1-ec`zciyyrAmdO(oneF@LyR}a~+3m7niULbs+r014ukXLHnwf{L zP-=$gKtMyFB$03=_VJG0AHMt1Rb$6oxNt5Si(V)xCIt5HJ@CvEE8DeeKXPbaE_iWq z>5|8uY}um8;DNn3$LBY^Id}d8EgRQr(5%TvAAR=L=524h{`}>=yId$LTK(kO)KIWb zk4|sAv+aX-whbECH#a*I04gdfmpt;s_;I7Ub!_$hkH0Njytqs6fhnnhvu95?Xwm?H z9yxLLnH4LVcj(rjVI56ZLGa4T%Gcg}Ys+h!`wkv-`ox(vPpw_@$l{q(#&XV|e_^8> z2u&P2?A*Dc+h)v+#MHU7Zx%uTNSiiq{rQ)_t{Q&1q9}*H|9Rp~^UKZ^wC&XP%$c)K zJo@;8d+&Yl-dPf3!aC#zy}IAU7aj*lqN?)}V$!!42RP_CUDd_71PUq{-sXkr+;8jIFxSby~JK}U}KHKgAaBd-}C%#A#X zqBmSO@`aaQnRw$(x7{{77z_%-NKFYv!WG43r3C64+_+G9_Sc_&{BrmH9(^yr>Dm!y z)NpU33AF}j{Ed@toHYFGnKK<)HwAzbCr^I8=c}PtUiIs5hpD0*`}5DeU;osvcSl6z z$N?=+oG^6V;9OYowLu0%A*BRgf8&|vP3y*DYEY)K%(xIBgrS>Tb_5}$u&5X)wL=04 zPta>?@DoShhZL&@YyXQ^&YPR#dh@z;6X#3)Zfny)V46L4LWoCOgjfsRtS)y<7H|I( z;+#Ka{-t2M=OEsG@N|)_$C3v0CIG}T9c|d{N0kVGAW&rHrgrYv=!Y*))yNGRC=^0< zl@p?r6kfP+ro8-IEI*@qREq!?2wKZl^&5B1(_$J>DmV%RqzKl@gJ7)~5U9w~gs~%D zedE1}*WS8e-O5@utN-%r;aRueefyjlqpuuNSy5h6Q7%c0bFOm;N43I|%I^;ydiA|G zhV<_I>8?FR7m5&p0x2pjVT@8r1HoW%QE9cD^sbk7fBBU+TeWC{2H&~!%MP8pQ%YO5 zYF>1KuUY*_e$AX?$4{iDr7DVq01~5y5Um>5Y0$9I{%!B9d*VR@=;ghyXw;%(+a`@O zQ&T#1@3#KMS6eixpBf52v+mWgW3EwTsid@s8^VlCMnkJluoH0!;t*GpO#bryDJ-Ow*kFFYe#lf$?IeVg@S>r}I*{NN-c6s`-2bL{c zGiUy+!2_?>%8s>b-6}gfGaQKsA%cOxu@fgx96z~W?#vo_b?%(|;NEY(ubH10E{lBg z&7lr08@=?>>t&VVl}*dDvNBdJd%Q9n27t7bl;i&%+q?JBz$<#ys-0g_RPy;3UuR^b zeg65rg2IZF%$(o;I-IJoZ6AL)aNzJQ?`)Yec|0M+T&$gwl^LxJfBE^IPHh@@@7iwt z`c2zD`J#D~dRyP$o*D{u?bHzwnIw6POqX% zz6mH_Ic8yYjNQ9$pL+N0Q@{J;)QGV+zp(bvb}gHlDNh_fR;xji*Is$5S);m6{-bV~ zs?xMqHm>c`srl`JMYaauE)8~r2_xgLz+}YEoOacHy=bEN7i6MX)=Kuf< zZU`<2A&e13q=Zq%xM6T1%+N@TF(NSl$gP&0nijH-$0C#vFgRbl?5QumI=JCJRc=zp%Cr+Q)_R-D} z!-lMQWI;t`WXI?G8rQE002x_XjT$uk^OxTa{`l)99owp^rtA8yPrd}LqDJjn08kN* zEO}(*!Eg3&et+wz!MycH+bduf6ctks~KQ+5J^Y z&^%%l5P(UnxU6E%f`_AJWnX{uRiirD0Px})@4vAAxq|cMb!ujEVIIO@`cnuO!qmY` zW|R<3(+HtXurR>|W%Tgh$Hrej`QV;ip-|8~tlSI&D1^`r-5zw5Wd#5vSx!sKG|vzW zX4dAWhU6ST%CBBCn39S}B#8nL^CVsX2&HDFrKJ+<*a{QS`8dXo1LV4v9l&R;089q$ zNZb>Qdk^3_Ejft^s5QvL}JzCgYzvFz4h`MeVhM_33DYm@+G63*MO|a_?;L1_6rcRSQo#R%( zMyZTC8>NyOp&mqINq6r_@s42jU?EEid8&wxTgT1KGP41I_kDKZ1zq>8ZEgbRDAL zTvV@~y=LWNGgasIZ2+K2j>h{jaLSf{ql0YK-xQ~TDP+PCIHsG8QVclUn1yPLTQ zE)Y;sq*+t0oi*iJFar%CRLjj+a?eaNO|2Ta0ALv0(2QQ)+V$%8H~<*j&HuH}kykBu?8u=2U>N$f*9^M$nn3`dYdWE{Z?A4}oN7iZZ=emc2WaLy-~?AHixAWW~wLjcJ;!I4y&_~MdyO)}@kz7oGpdO0p{yN&L1 zVkvz$j(MD$+?o2bJT%lgxk{m|QDk=kk001yX(LAZZ5WztD-1)Qbo-@^H zZ$V+<(q$_f*01})mW=?w0cOs=bHRc|IXQU~Mh`4654Y;vbH@kIXJsglKfCFk`HOe# z{^shTeZt|0tjOR96q9ecASe$WdG*#;S2_8YM`N{W*JV=bLk~UKpkD3HZJSa`Yu2cl zmz@g$U+g_N_s$1r&ba026$=31+_~b1m#;c=`UF51S(Y0#Y@Csr1^_i{)D~Qtwcz1r z9=ks$D_vqz!v+oQv$#av=Iy@vbgOd|t;t{+HS276?x{<=wsdN;{sl5@xi{yhaX?TD58-N&q0saY#7q9CeeqH;Hx-A&!ZO&O`779Cz#~CwK7MYL4_U86_H1ITvZEp>bCas8v1l z%CS>_`1MGiUfmvA_ViotZl5@MNLs1{0IFsboGYwRJ;%`Xa9F>7+}OFZC-uH!!qzSC z^uMHSFer!B=vN00XccGgx@$3&2tlKwta!u5&5tj;mm5M;jmC}YFPw9eS>tdxl9rkx zOH2t$wh07GmN++3Q&ZPHwRFhUf{Y+hl5hVl&WfTMs>er)pxAp+-&1CCed51Cb!nzF`UVJ$k4TnIHAQTXR2&)ul>dY)j)Ag*3jID33 zpMLv-$BWu9uaSuN5==*J(|Ml0= zYB{;8&U3OeYgA9y4G~Z%Am>I@*Nhd*@9W=h*o4Aj5ssZZeLACGx^C!mXHWll+sNUg zZfV}C(cZ83yzu0z{+IW(MLr6|%X@YI_lMtV)yQsGzgEkZEqe6rk(Lq?h|fH;e8RQ2 z&6xjS>G{HjjqBbuZ@NHC4+e5`GJya$P-3h}!}?rRAH46*AAkIL*6amcyLF64qJryY zdnHLuPfaZ=D;qqZ|1Gynx_9Y{&2Mk{=l5TxPn+Gpe;-7+qEELE-|gPHTU&+jMva=B zDCpa^brVFOgbIR^ES)`ne%kGe5SebouAMTmYu8R?Wu+Zj)qH5tqSA`!fFW0Y|I@$Y zuAR}LW2=CIsi_%=aMjgUe!2I+lqt8bUi0WxR}H>m`)7-nt=RnGj?$C=R?Dp}sPgHj zpWO4n%4W@)o<3hR>Dmd1CE zYXY|}<^-Vk`}j)vYGq~Sy)hN2N8?=tv?a9_A)Z}5_O*X~up^Po6>X7dOi|=mxLl7` zTsU8-HEs}#sp;vdT2xmQi5mt0sG4pVdP*o%JtK>e*xA#^c-zM9nm5%nT{pz}qVixs zE-fq9qmlCk=TuFrtgH+LLy{x|B4bolwZaQUoE!Q1`KD7T8dC#-V0mS@sJNtN%^E4e z0O#Cv-W@-2Dm^V#mSje$0097;b48KA|K+z&c7C~F-tAWn?0x=xAxB6L1|D6qAfU)= z*S+-T;WMwj`fR(VwM$CNg8_NM=qt-h9=UV={hxlZ|FT|PYgEhn=kLRX7mBM_%Nad< zfZ0{tFep|2`TO|G8(zC)&GJA%IrQyMo40HWW;Q4#bR}q}LT=-+uq&s|WP}-9SStDXnPSxZbSBlVYl>YZ{d#MkxUK?T>%<>^ZRI zolT8uXBHQiFecqFX4trEhA}`*GYrEB1Qae%GjtTF1Y}J!C}ovprG~CmuU4H#f7Jf|33O}lll#EaQHdIyQ%cQaIsrgcW16ZW3RUHVNtNa0<>eI(8q`%a)zG;IyqKPG4>eovX_w&a zZD`5hTb1M~Y^t|CPw1HS@kq{(S?WW?i*i?rfm1v{Ukz5EkAE*je{|GV*9Wp4fq z!3Oh5G(lDVJI@2(c-bvTI)oQNmCjpYM-cTAsk4nKX}123G;Q@n9cd@F7h(D=u{eof zaUO9k9iJKKXOd)Y3iST)UqT4eSw<-}bZ!_?075AvgvheQ4K7f~vdj&GbD=0QlO$8L z5(11dSy4bBB1WQ70AQ2?fE8b!I%0*WF%DTKHs}9B^csdFvh6FG@VD)FqpCRB}tN*i{=p+12v`+LMUUB!eX(QVQ@ms z2UM0M-7pxV5|ea8r<9tJyLH3RbpruqCP|V+DG@@bss@OZQ9=l%%-QEo2{8nyF;xg| z*MV>@!qF&l!5EWei2zY!8UiY^q-i>$kR+Kg7LCQY5EO_RVv7JlA)?W!5J)Ih6q!=O zIgiFPAfPbW^nI9#qcN2m1|>vRWX70b7@P|;?zmwHgX@e+gpf!iA`mH|ilR_TR80d! zMOJLDmzPk8OC_FL=a0DI-prWKABO~j4 zQE`A$00@PG1V9NW&%gXyML61|X_q~__gy(;K#jaS0H`bvGem}5({vR4fxGYc{@d^0 zcw@_y$>V3vnDzNr-`_f8ZdpnBuq!SbI;fwf8KyyQgJug)L?UWQVR1!8I1-M8Qi5q| zsqekJy|`Swy?z-tjA%>^g@TI~&fmZPx0g1&I$`ucFpOw`gQ7+VbjJgX>x> zVyHR*7`hRyj1`xc7}2N_kke99f+-=!B-A-DUR+#i7)DA;3X>T}F!!w(hS8}*J4s+9 z7Rd^vYMO2y;aX8yX+Z4CD~C>V{JZZPbomt{ z2KU~#fB!qLy?6VaOUI4Bvb4BZqS9keu6ymZH|O3yO_rFdYeZ1P;H72d!9c)tdof8u zB<8+#1mHraK?MLhb?Uh6ktNfo&TQPeqZ(6d=I70vdFvCa9&X*T)tHfk5yYu8XZP>j zH~6X{0AMbh@lCb?02eV`EiEtOLd2rsP$&SDL2JI{%-Qp=Z`v|__QJt~E{R4fYUNdX zfBTn9m#+H#uQ@H6)zef>HFN|ZOsKI~X<4bR$Al0D=XGn>OiN9xC@wp2@W*D2>I%UH zLj8KR1&U}SdhEoRjFdo8QOWv^o4@<+yXRkgHZwE*$dMyal{ahBfHCGnHVM>)*79i* z2ejk1>LdcMxF<=av`;D~QvfalB*3pK3bo!l$bupWzwEW_lq8VPp-Z0mNE?cwklc1(BnIShQVQPu~_nG2QFem}hbe#&h@6b*?#x;yo z>P(`PTkZYVH+=i!uV>Dltyi~hhc+z`1wi1D#S3*V06>}jt5v;Y+qVDw^$!X@eE1dZJGLbRQ1Jf!`ebIL0fCNfn!Wq>E9+m} zbj5(ayLL1^xc3`_^A=4SeX(!XrZ?UyEV%IW>Xlbq(F<%+Q6z~FGGoew{+IQvo|nV9 zc<#9;(=$S$P(ai5HccCRvGdK3cYKzSntJt>mji&R>o2|dOs(405d|QogxG7ZznoVs zI~+xzp~TdHMe5ken%Xkl25)y}U*2q=oo1k-fATc?h%Zd~`(fp4?3s|~%pXI6SB zFDK)PHLG@fw!dww#zXt}Xjr$-7yAzm8**7%=zc>txWKNR+PwYF%e%h#ra}GMd6{WX zu70fFz}+=!W;Lzf@cg-wdNoozO~18HB_{K)wEQG$Lg`{YCEcuOYTXo z1i=akNXhw~+$|2t_|dN~ybOwQRk2(NHcCn`866wX^&Tc^3fhJVam-X-{i~2UaR#LI z&@9}lwByxwg)*^ieG?d=00g9zD2mJ|krY{06!VNxLP#i(a^YObho5}$&p$_x96fq@ zzg}%yHNXA#=|6q<-7QmYn=xzh*wNQCZQ6t|!k82c1Y|{~a)3#4Kv8%oWLiOHjQMxp z-Ld(dtwp6}1Fq;h^VS>ka&umP^FvkD3yO>1+4{kRu~*+Q^TxDLFcOY#eShcrmo|24 z-|F{2j)YRu7l$4+($(7|5DJdz+j5vGHUohgY#f8K!6A#LV-a2+O-dUb8yDwQP)qr zX8E!efnaFz^`n|MX`Gdns;P#AKouDPe)#3DYFSx*d$tQlqLL&5(DL%ItT3c(@BSaZ z{qBdm7tB!0!yj(nbK>Nwd2?>w`oYdKXD|GI_z$kC&#ilG$M!E?e&zK@q_Ri%Zg`0s`uW;6PSA^=v4Z@$L6N78e$N@ZKv%EXuj=&@j5R?4vhljgqtU zhFGh+?8PyOWbVUU;NdCvw`Cy_@Nx};73awe$7s1BfHE@A)SeZ8AxgIIh}p zLy#2XnPAH#MYoEcdoQ{9YYu*s0nkrn&is+z72pdV>b*Rfdo(1tJx+-K2)l$Uu^{)S zov+g<^Vr1rw|4#P=bjjGrrlJf%656oR<0g9DZZXofo5=XL|_tQQpl1yC;)&-i~%Er zFeWi(5w5Jrk}R2E-kg*tga(v=SwkW0*=QhySaH&sEPGj+G3L>nP6a6-QUbE9NHP*2 zob&XI)UnqLHw=RdYsjR41mIy~;u~v3kjynb1OPx$0*d1BA_5Rumdqsrk|Y6`2T>xW zG!Rh0S_EVr$Ro>=x9_~dnGzC^B>)+0l`k>tRB;3VD>{T^j<6(24h01i#U3ZC<&;u$ zg_HA;F&4CT$U9zrAe00HGAfEg%ZxIKnX7gPr8GbTCPoSdL*8ZAiX^#$DT&Q*;=lx3 z#5TN>(2ZZ1_>@k(XU=9PLgEr9k$xUllj7ec*4iWAiC6S`(B6NBXmzC?_gfRNq?!9?g+5a5*yHDSq z6UUD{cm6_NwcG~vY7rEY!~mdnevRIjcG`E~2L#B@&OCd*;Il9Gw{O?vt+(FKppkZM zTcYsEGP|#kGEh?FpAUZj$nxioA3xT#d83&#uggeDD=RB&*s#_EcTc}!(ACeq{N{}l zM;cs9NlC4&tUPk;-vRwEHw=SNDH>Bxo;nQx)pB#HSIY$yj55X~K%pDqHZ7a1e(b?! z%{y*>cf`mcm+7i1EEdBHg=gn4SgfmtB9R3PX18h4lmO9$ShsFNwXCd@r;d&sF?{^k zt7Sre`um^X4j=jX=U*SZf5pII{c>|M41)sz7XkqcZWy|{a{1krrROGIfAfzAKQkx_ z1O)QwXS)Yp**`@AA+VyN^5m)0gpg1urGDMo-kGFCJIRCvHXnK}FBtMVAY8Y3(%2=o z6d;69Qz&>AL-~-NZGK#AI?*$P4m*16LGz9{E8rX?bJ5Fk*f}RYRGrK|*j6B+gpo)r z{MI{fZ`<)1l>+C^o}W8+YP(jA0rA;q9-cO5(Xf#d8Z>EGSyFiVpJUfgncSpdoxNY} z=RBI4l}QM>X6#kF_Z^r$>yA!)Kl|yY9|YGQSTrXkgdiFNB@(-3*i~PA_{nGEMhv2c zo|%y;Nh}yp0s+P3QCXrPSt61I01|~1SrR}AA+p47ymsv8`@a5R|3Ntr3CIsh#3*8(Jb3qJMWLeiW1&yrqbVg|)ltKu7`~8o& zVLbHUjFbQa0M135)-7Im`q}4R+PrG%U3x5Hu2W--7<&1Q)9(gD)AeX1rhop)>jDji zWs|1dm6x4{V5kNh`1~z3qNWD%_B$UIpq)Q+I!%!uTlv^kLwZv}mM&ktd;gDL?s}(Q zt$f4a_N2N`{wMW+c~Ibgz|&--pFGdxKD%UZFXEDmFUqqg!Sjj$03|@Ey~Q;_QxW2Y z?EigvAf4RmM&h?=G`#(+Sh`n8?bHfvNL8d>MqTsvU| z0BD-ly?cAkd2Vh__3F8tqi%?v-8=T|-idSm=kI^ktC#=ArnLa@@drCKJt{NCxu{ny z>%n=}CJ4?sbv?W&gs72~k>9-?3c&^T=+*`Rbj}&DNKDH}Rjwa*6#%HJN(f<;c5dHX z2w@(vA~DjgRbvFuI1wmjOua!jkbr2_ypdrTx}htQG-l*505A-$>-uGvcDwA-ZUA6M zIEB!iA_S$B5{dwv8y#CW>(sUd07j!RUDJU;>!x)&w7eDoW3gD* z&MmrkZ4H3tE;%94;36+G&D>}p1kcV)xp~qEv#HG+*Fzx;u8$hrf7IaqD0obb0b>*h z05X}Ws-B&ZI_>%~0HEtSA`ThY*X$^>&L%NCk$r7Y;o=MHvZcS*m`-BsaD+I>tJHD7a``#OZNXt-qciYEfWKygJ$z1nNqwrbv@NrMkQ-15lkr&h0geEr&u zFTS*H$iTiT(TTkb$~w~BI)eZtNm5lK9IYHRdN?A?yYoH*_~4>DzTUU*z~j4?_H5Qzbk zD5bQ#B1{-aOrl`ziDis2#t2~s2Sl7W{+i6Jj0YcDKKROUW3Cx7Z|<#)8`VF5{(NRi zVCv1+u3G)Xd)q#meC@dRKHf2CaKG%#?9V>`8~|dPmXey9latK|ktHewP)a36xnUHS zMG*0hc{9^)Nh*wdxD*yhnlH zyoERCSIZ&k;~2335DS1jefTPfQ{cwFA_o=*H}9Oo&WzYmj_&W5x{?Zh4u&L_B_8W zlu#}3iWH|s=&rf|0QAmPCvm)c^7VY@n2;Xto4;W5UrQ7?PEu#W!l@Z?06DQgKyM!2 z7CMOb;@y-WW8)x}?aGato^UKlZ-e7YOPH=Odm_=HX3texcBt9H{{%VztC`@G9cS?P zRyZc@CWj1c`tfwBV?KLH=|8=qRz>V(1k}S!ev(A@sbAM!99p^qMF1#zTH$Mzt@Ywh z@{3RE0o|4gvS0iU-U+ZA|NeXkq4CK)639nqo~X(IVEWuVkRb`o_xy5HsTJJ?-L6B% zC?Z6oF-c)`^tI^3b_4xG@Ut9fy{`JO*K+&p{BRL5qvxwqTCzl4q zVN;N*`r2pjSwm`~w|GT?c6F+}oCR@y8`2Tsi5kEWC4L3uigxFnl_!%akjEZdcmIO> zTC{Do@rAYR+O!0KK#F|k=#jl&?x`p*E02~Bzj9E1wQ3*j{H!vp_3YK7U;kb$nl#U;bG8_8l1u zaTMGT73EPP5lNCX!}$Em{WE9Hiy8Wmfdefcj3M)vvzO3xVI?NFJ#z_b z;XU~zFW-~O{)Yk~0({WRXMXv4$!g4Qd8e0=KB24>X&kpQF2Y~T%(#ta!Y_=Q)t z{{HvBL$0`d{D?l9su~>IG;O?N%chNQez@cF&vLUmUi-o|{d=_MT-0q)?}7X0ckIv! zfYhy7W5v?@UVZ1|qod<-qqPv3u5sT?UKp-eLZQA(JM;^$}&kd!7uDf<*T6!8H zNU}uiINW(Psz3O^ojtp>0f5Gh8qS_`Tb&xYW+fF#e(JG@w{8C-J1Y$lWyaR6czEPh zBi`8Zeo1-7l|x&O8#%OL?P`X>Q$isV1yC@<7f}GnNKbv_!390Kw*^~&H)&XZ(S3JO zfwQv$L~1wrO_5v|D6J zsVpzb%*X_g6-8;$sP3$}v&+k)x`@@NUTxIKp)DKMiAH0Hc-^(*yI#^OBQ4$P@1&q9 znG{Ym`_UuNlK6|On2hy)TU9AZ*WCT@NYR;qP5i*aipjtAErLk!o_h^{7kv>*2u-p9 z$F01@6NC`KktuZY{k`++WWV+N!OAm&N2snDx*-UIym~p;+|>J;+nYp$%0RM~IZ!7b z5675cn5^v0XcQzCRS^ZDlt~N#5K+^0g1{sO2wWHf(Ofqj2}cM5p+q$d#w3nh2$UoS zK%y~K2oVYf*KTA!^OdU7s>gm&N+p=|Yrw*+R-JpaJ>MN5Ff&v2pY5dr$ z|2le%$$?fan*93HuKSL#igZ}T+*dos}^5=zOP5OOU@OXTk_zd zPj~E&g`)say?Sm;Gs2N5q1n!oWL4FQiY`>o$svS2tTW*;=Y0(4A*FX7GT3Y6c zrE?<@l~OJ-Ry`{-TwYOL8O=&%k*H273k3tgK%g=lO;1nF$jCNbbxKgm$;w5tX!_jQv%mW4+hTpc{ChRhYuT= z9#qDUop8^Bg@62Uo2bXfHtk0PM^LI0T`izBTynxn5a*ZByRAOfLyOp z!)~oxKD*{2vuUPx9^Cjk$w-DIDhtzQt?Fnjm;U|-t(L^KZvF8Smb02VUawoo%c+bj zWt_Zh3xznAAtqyb*Jk&A?X``QxGT{2uVaIH-5m~)NGJ}$7K=8Zu(NemV0dzmZ=cWB zOI&7xzR8aG3%z-|8GBYn*_Dj{q>6{huQ;cg<76bZt?uh;FcX`y(HS5UH(sO+(~XH9 zZ?9<`6W3V~SE*!LrYg(DQB>%waeTe)H|Y5f%yIFW3{FpY7Vli7594$S!FbN_Wm@%B zmGtee&HZfa9{H-BgUn=@38o=RP^gi{Qe&As)$Hxju9TL7q`RJP@%uRVK z15%i9?A5z=_W3se-3xiTgBe^NmxDL}S9~6^Fl*Hi3X0{m(Xp zoxn)FX zinQ}{Bt}e&)T~!;<;o?GKe99NnqghX5$BeTUXtx4gdT&G)|C{khqL9JwS> z0z_uAYH&oHIeqdcpMEy(x)~a`M#Vs$S*O;=AH3@I6iPD5$VlDt#!IzoRWqNcs%q#J z-Fja3{JNDxuN+;YW;O$i>8ivOA%qZsh`Oc=E~1rX^_tdu?5QVa-aM^An@jU@GbBnI zHmbMpn{O(@YIa6Sr%vrQz4q+EZ+~6!*yG2KpR8Lu9}&!*F96I-MafZ%ou5V2;ByxXT;XMWqHe(n3` z&2TG8NM26Xlu0AO=IU51Hn3OMfxWxh)z%SFGqmChWsJ!Lh`BmO*L7KzYvxs(eEk@^ zX9yq;A2PtKi8*tHKoIeU8%7c!s;14n^#%mgb)#e3)-ONvSX>|W>Dj$c&+gtQ0*z20 z`@sd%ohOE_M0KU zWejE;Z$$I@-BY5Ks>B$f=J(bllQ%d2{GWMG7-Nzop&icEY@EeUh(M51 zN>G5{6i{Z=24WNdDK%H&n9eK4C_}_veS7cTz5nSKH%7}#C*3@C-n^R_qX0rtB*{Fo zAby6H0DvShM9bF}kY!;t91ws}MrAXcg0;(-GRZt^)>MwfuB}W#ri>8NaU~HTh(HN2 zStb@XCQOllP-`H}(J*@e5dkFkPz9R?2ofM>fD#0O!rVbi2v9}|B?1s7QvldKYjz3+ zSBeux6sCA`1wx1-%V0}0`>_B42!s-pB=e*dj)Y1w17HqVw)+ME2@v6oa8kY?rtRhf zRsT7;?w0WX@NU~s-cyjbx&QU4ZGm|Inl}#aOss}!3wRTwMgDP9)Wn+S^{7iid=@@< zpMnQzduvnGg}$mWi6H@STkR3aIcGm6p{&Vb~u9tNA=h)dgwd(_bW*D{dt0{qi zVHhCEiWCS(HJy{R%q*)uj7dRB=Z4i403F-435Jv%yT2MSY(QFCsw7FVnD+O-C+pYE z@6xr?lj}EaegDHdZ<`zpDY7K1s{YQ_ZHk1K^}bZqwDR(b%*+f$mhZfMdN{0ZeP=5G zNRm=`p)@x;^Xid97u>yU#p)NDG;P$oSC?%cd}L@U0JLe@LP<&4`riBZ+%a8IWJ;J2 z_~DLE%gc&KjU23LdcpY%xjET6>8TIjKmV(*f7`iZ$BLzM0fZ1llBITSn^(jlFKm44 z?zuOnNsIt3uZR>BoXxM1Yv?={t|WxWj8;}gxOMtCubz`*u9-c5zW9dgZ`XLZQL|(mGY1FEJMoGB_S3oUFaSUhNCcYG3_fK?0EE5I&C$2s z`Xo99Y@WlUZ~dM@0FOV)>mo|ok;L(cAHW^vi&2`J9Xf>J4{(OA=b?%!CS5Xvb_J?xmba?D(maj@ z$Ce>}G-Djnr!7mt^c2nv7Nk51pg`_tLvR2_IH-c$S&H35@0{I8G*!SkG`O~ooeCb<)Q3B5@ml021+K3US_akG?@mcP0}k0v-L~ zf92FANwd&3i9BVQ25r3ju(*i$fSyUI2ml~4ia;CZr9ZUj&R&DA>EGv)+ooJg0E8hx z4(Pgph+K$JFi;td9r^b}c1FfG-~aHzr#sR^q0_(ozU|}P-8;4w+#oWe5;F`#)Ad)k zy#K+ro%3&>*{o3=P17Yt83;mb&$KDCgm29z=R$xeFRw5RLseA(nwlCKJb2Ki%^$5= z{meag&XgF7srvgL?AX3*-~4$q0HC6>Qf4@6P#2=!Flxk&_b+{V>7rTXm0<>qP;fkt zh(N$J13~9pH+VQ4m1G(W1Q?|fVS%7TDXmwx&dNt0=s$4e-@kr8a^&TqU}*fvp$|Ry z(B`c>$6R%Jy;?Qv)W|#dZT-(b~ldmAtW~^`?H<7-}AIOpc(jp{dV zRG%A$01-$@<%kGek|dLPY!97jQzXiTBqZvj_diV_$@t5$i2ef+Cag#T0OFM>@#psa zZ{=HH^nZq03qwi7|m#5ssh`gb;}_S(Ydey(#s;ZmrtXCJ{;y(TrniPiz1p>bfCI z%(N3_S&FGK!{DX>rj#lHrL?4E{=-jb8kLzWfD4^RE6TfcZvW82=`mGRB*}C`Afl>j z0#Ra&m}j^F5JI96l@MTzM#2%wh$P8o=ukj2PCTK6$g(ViFv~^zKx9Rh5HT8!a4t+? zDM`!>(*S^)s-hjWAsH0(&puj|;ghjRm$StWU&5GPWEEagH-t|O#OrFi)(KyEUnMEd z#u-W9qP;ZVQ8_N4uCgqLuPNI1UXA4=X!`|a1Q2wMXVy~2+}YlnouP9z!kH`)0?v+c zXB2F};H!xX`w>xC)Z^_vGh&D^TZblxTB;GyhI)vE5&~#Dxo6vnbj3SpamcR&|2GT>sH_T6Lj`Mfdy;`F@1H`3GBie4s!uA zP-1THC00%1&-yf<*tpRS^=Q(Xiy?^#+fDpsZ8=0lfx?`<0zw2@&TDh_l{m4$3Gq@1 zdc12ufC31hf|{#r2p~a33cwMN2q1(A5H28cj1bdx=n zMx&alIZuTUXHTCwa`Yr)q%snwgf^&G=jrt?{q*x63+Bye(zwBgAAA^;l{&TZ&5BWp zaiJNS6{{2xIp+Y%%bVUfe5PR2#^<`XZ$9A4>n{|Q0RW{?5sey#9t@^1N-8SD8L5GW zb!#3taOiAdk;3TSz2B6SR7$b}00M#=G)62Sz5hj?Y=!)YB5;<{Od1mc=PW2?`q$s>GwbWvh49^`&`;>>@~wm zN-KZ*;kO3$8vsCMIBcLnkaz9UDJ>&w%bQzQtay+C5{X4LH5%jXJG8y=+EJ@lJkhFE z>z-ZO2+rSrf5*Lx9vd}&{LleCzW?#pI~FY;Ids6-QA58z@YC^s{<(JiHD$?+<+c{kg(Fn9gsWw(##`#{eLxDA92A)cJGu@^ZU$?)dS}Z=Qet$(+oz z;^NYR!lH)tYjy6}>7#8Q-8OZ!rfDy4cvA?$5j(bPky$P0vB%dgT|AGYcwxgEXO8_l z@bb$D0R%%e3`vrJn2{w6O*6pstGd+fr6V-Op2a6s7}vz}Cegf0_{aug4xV=Mslw8A zRk&lH#bs+!v^fETh#oHnB`7ndBc2aO3o628l@Xaq`I%|?8L24}14Kh0A=cS6$ykQC z1z5kmCY;Z$=6R3cT|$v0S36v>ucUZHVIwv(ch}k_t^w@#L;*NXOk!`yv&(b;ajZ*Q z0mRoX&QA1e>16%nf0HopVs}kK4#e55m6%zw%jYq40J(QSoa%#P!xQICBA`n?=I9$# zyEpw6^9{XQBTr2d7I!)xhyU`(CH3059&rNTtYY=X(TcBP5H|Kq;*4y7ll+eWZ8WD?3Co}qLlTf!+Fm@s}m zws$EhNrSxggm@Y=>t(qU+`wrV&&y8nXrm!VT6)2U3H^{ba@XH4E`*4awEzG~$0Lc& zVt;KXu>Os!tNo$#4frU~lb;vP`B05FN0RIVo2{w_HlOAPwSF>YO&?^V?~N*-eH z!LlSlyQ;u@#Ih3N`Nejzc@kQPF204{IV;PSCjRlT`_Uv2H^u=F(;8=#M5Ey|=L#?H z)n)wELszbTzFVjEmvn9yqICDpoo}{lMTB_J!}hu^}ZGi1SKmV+#wAc_hZp6SZX5F@I$1{WZX0J28LK@ag%>=zUyk(<%gK8Xl0 z*@a+v0TR;^+tRiRbImfRyedF~S8*l^vV>N68UW6A3Uk++6E6bo{qTel!W7vl-rDm= z38M^%eLOEAlu85uKw``%Hwgh*Vy1Lrl-RL22somifE{2J0e~^;$Rz|qDA)&nqdAhY zBw4$;2_ckFAk}iRCyyO{uBbFUErk*yQwfF9pl(e72q=n;KM)A9_O)4ATf;8P5;227 z1{6!j5@Mdv=X9Fc!{*{3M=$qb(aiicqDS-6iC8Q z`W|{k`9;>p+1?@#Eb}I?(B)a0x5AS zL;ThAj)}P)Lz36qO<3O_Oi9Y1*8DLr2!H-{6~lUw7`@RW}R(5Q4{4E(wKy1>qX@feo z?woheb1%PBT68`uHFf>7s{ufZMRGDy7?YYbtUG!{|1Da@Rl^4pLh974PJmx1uBclp zbK%?>sv&NiGQDo?29a>_$>W8iCr)^B**!vtyc&6VIhph3EqeIL7cQJF=-RH;{5xjo zx?!?&ET(2>rmkLkXK6+0?X&NEpjI8dvZUg|xyjRRl>vMA?6xvME+2AzT2QViFHxkr zNFWeYq?ir>jM7eRTj$rSJ7&z3tc;BP`}Q?z+!_E{w`yLkPTrLxCoj5d_Knw#d;k5< zdJP)at!?YS{`t3dUjEx}thxXG*#m}*8a8H%9tj^m@^64DQB|*%pZC<7m2>AT{PMuJ zk@8Zt{QRBs?;1L&7XVNOV1~^k1ONh(r0a&eZp_(Clt{Z4j!H&WRbI}z42$gi_{z=K zI?(ig$Qc39@jN9d%G`wqLZA?cW-NOq6-3od2Y-J3;7|V)6jfG60I*tC+NjR$ZtdN* zU49NFg!`DyTN&bne5}Hy;95m?V@=UUz;6^10?Euc$Cu%(2l2V{&_ywxfPZ#QUR&1o z__$5*Em3i0m178_o77X4B=xJh`N>izKm3h&E9to$kQ0xl2=O-0F;o-hU%bTRd=S?Z z5+9%{sYtH!@-cynM&nI@_==g{7Hdh94MqJaAX%3~GF4*Dnw#aLH7#c0M&juOuR`(k zsEb0J7s7Ll9`*RT;$UP#S0wh{#m%sUt*!pIj;F~f%|3b-l0^)x%6A`E9iLau@=Kuy zQQIKIEG`)_cuC0n+R1^~(J;;7abCx1az9~%I{})c=JCEn$Gc*+%5!##HD0bW?0*rS zCfRtVU>q>yrD}jUZuii<`NPvdpKx~v$Eg~|cTQrptS{qy)}|2ne{iX%6=p_=VDGSV zUng~W1NffDS#y&6aU9^Y4H(~N$w(au3J^9aI9(kFab3w7CvX$Nq+{gTd~GlA^ax+O zI3h6u0Qq^)g9O+w;vOo!ebGeApAuzqEMiGRoW0Ciu~;Y=m^S6+f(xa8{qbA-wkekN6$OHgMVw4g@3LvQIX95BMfuM4E-%A_Ts|S_`ga`oue8#QU*Qj0lp;b>V zTlGXnTH2i3XU&{;U1pku2=y8_=yQ4BfK0N}Qtn+a|IdF;tX;SEir&u$1G2qI8i}(RJ=oyu?rFjrq7UNPW`8*ja>Ms7L)RI8S? z`IV>EZ+Lyp#+P4sZhejF)t5hb|4maS06)V8s!_Fmo&0H2Z=`^2JG9yN_17Qn*j8B*Zq%sG?YB*9 z*|bquM?y$?T4?PPkIuSl!M{gOwr$m{dGm(#Vmcz^WMy8`zfWpf3Z;|_kzb?QGiz5J z`0jT`iLUGGRzKLaL)(=vzPN4s_CQK#?ATGa&zzi-k@5M_f8Toj{rNL*OHWHrI@y(6 z=f$m|0B41{Lx&Endf0{naEF4?FAow*wd2z{1c`PaVdqm~0lOqQ_(Tu-7S_foU5~U$ zu4+7d3gDZ!NdzZIsNFaqwt56l@g7ZS=HtwgC70}W2YV%?Ppe#9ixNxvm~Hf8Jy!-1 z01Qa-;J)1xzen&%221XHN;K!;fD*Soj*ziW{6UWk&uP0?N_iXRb;LVngAc1EZ*r2s zbpVh2sGod5ZH$aH2R z00V{0X;ja_qo>ZCmt-j?E8{{@NkwHW z8dC+=Yv+rFt5d{H;0gRH0%F6WAVB6L$DWxY) zpQ&B5h9XPm*cO+R9r)o-DzHX*@1*=npRd3%}7s`nPkCc z0*<4HQhK4dq@prXGrxLFjh#7jqIS)i!C;7Ut|;`xsWUNEtyjB7N-%(E_W=+}z|?NX zPo6C)3mdwgmKLmCt44Zi3Zkg2j9w_IR5eX-Eju$auX+w;5;qJaz$7^miJUxrMpO0N zoUEMOoPZ*8&MBpULXsrTMd5{_(y~%nmTKnbhk^k_fe7c$mxQCyfJ_)=IoVl(fPyH5 zz>@Ncig2_d91d58gNmGAqgrNqxH9 zx>eJFqHr|fmayIFj+FA?J(qr6$dbrA-nmxvCUfrn4lE18c%ONfXC}qq2^Vp_$cb-! zcRoCtd?BlMTb}o6d`BdQlD52XFq~J%CRI&#|C#X?p;7&sPp(Y(W2>-P^`A{nGAjKic}*&M!Xi)}>?JTD8iGO95fZ&DX{v8X#~kTDEBL z&Zc#5Zr#?QL+eKtFF5?yF#xDttJa5aZ`$zsmXwrWP*y(qVB^Nk?|=XE@1xs}ynf;c zMoHrawRV5_&dPP`8#QP!pl{D_5B`uI3J4*tAAeQnHm$aOwv(aMr+4@6o!grMUY6f` zSIzudj4_iWA71)k>lQ63rD#P4p^jkpS(7#e#epYRJyl^r`LwpX1jlEd_?7#`E(Abp zn?3-duQGO!12aHFi`TS`p8ZR3?ti9C(@NJ+iyh_EGrz&0<*lb=($6*IspzrRze8XLRrH zILp>ufaAj%{wW0HC@kw8Tu^0a<}b;m3$OYnaW`@O@Sm_bt^iMlUN?f>BuMB2yHmWP z-SH8`m4Qk7&=sJrbHE1_?PT#Z;MG(95eNU6+R5YlBCZp>>d8TF{7aEgMO<2IdA*g+*Edd8Tz)k>%G^_F#gB4mmD;$+_CY1Ec>=g~{P@IPsOt=a(;Hr~ zloZ*!I@c=J?NVF&`wlhEZohZQDa1*a1U31K^LL3)mfJ0IPIZX?#`Qr}O_@&CzMDjI!eLVTKVLnn zyf7JgIFiiWqZbLJyTVBpcT>1g~)RuD5Weozam_mN=)BfiIc;aTWcDCf>IUCqfw& zh(d76Bxin_b3@Z~%Ba1FfC4oS0VA9nnyPUjD50jVHiK0wimWIy0C3LTVMgGbE9N>K z`--Wm8CFr286{LR3>3oL=vNty$&6{Liiqa20%A*RS(X$8w*ne&QPu97>g#b!8HvlN0AcPTOFV>J4=fa@`^L%9?ggG46vMDz! zM0CPWA_|urOm~g5@PRnCx`R->^2Q}Yn=;TXf!KK=qCmkpM*u`2Q~3fZy>#NGH(WLO z-bo7xf?)-tF|h@uBq?>d*g*&o!Wt7pKqx>Ktg1&jh zDj01px+qa}n~b?jZY7_W(3@ZtA0 z#iwyNNjD6^(ZM!^5=w}*XV$C@0)o9$&pGSblbxsLwurFX@3$?@o+CDF^-@f{_I0(p zBhkHs=(RDt)cZeNRY`5{TQBZRM5yRODev41x{bG*1o30(yR2j;5F!+WAQFR$7>u1- z44VGQ<{G+=LYQO>)QaTmw%XRDZiHQ@5!T``G=tuPEVF-pIse36+piee;_9j0Vi8S} z86r>ugb~{{>FXSiS}~Uj`mv-RTiVmK@w{f#ieEU-uKu`uWX`}NP*OAMvPd# zbU{{H$}4YuaNqq)jvxM>8wO)c*Y!c8t{>3%@&$8lzWUl(yT3Rn6KbfD=B=8pefrU^ z?OPxKB_K=myPpnUHt6a%H?A8tpf{zoXaB2y{P8CMh(QUEkeQVRm;a3zF zm*(VTjkjt9~5MFuxy+>C(b*`YmKrwFo=p~Eh)vcZP_rE7@yK~9jufNSs3sshtj+-!c(Sn(E zYvuj^=ihS{JoM#PU#G|RDJ8IHo-vrP$Ml%lP!P=LX?s_7D? zN$+|bN+~5KN>L<9 zk|h8zIOhg;03rZ5XLiL+fM28n=1E-r-JH$-=R#0wo#`Y5QfdYm z;X(*WlAIuh+~7>2PChRE5CQ;Ph$NO+JW+W&FquceoJ&Cgj@>H+$_mVCN`_5_Aq!Ce z5r$bR5Q4<*;l$D{*0WIz0!l!1M*A*V*ST@MRg;EMAvkwV1g5TIp8z3*5)g=t(4PuR zZr$+ifqzbA<>nY%Lt%hnfEHtn(bV)ps+q(?0hlwJ<zCry^z?He!Za}&q+s*}V9 z&tL_7Ak|2LgzU08o0*TOYr==euo-X0@-G9nrJ^ zV;*m-T~)NT064Qa2wYfhH9~<9kQjWuA16(O_uhwg?NQf=WiS$;6wTcbc2n&tnYmn;HT@Bah#gy zu8{YbRY}~bZg#d&<_KsnCW-SY`7-gCH$DT?AwidNU3%~}#`U;>CG@N+S%d4=+6&Fy zcE!!znOtjD-vz7Qovul+jnhJ>tKFJ=y-eUKwn|h$lJ<$yYCB_B7sgcy(OV2sN-8UH z!UQ~5Ko1@wu^5`ckWJg3(zt@W_lfe>=Ld-c6JAMi5z7#5!wTX=gGZ&>+4|_jN#$+1 z-8=39zkX=z*3kT87R)&p0!=5H5P)c*B`(Y`QdWuPiFJr*pDqW0AP^1BFgK^_TGXU{ zGcpci%#Miz00^8LIw}FBpy1rgn>L?0U6`Gd8;wR7lL{{sw`}n8RcWNm-W7x|thbDIr`4L|}|M9H#3! zA%s)&Y(9bZd;+7)Jc!VAV40&%2r$M>Tx*`g$vL<2J`vmiKtd@&)HU6NhUO^hx=w&l zMok#1s+w??x1hN)kqRz^5R6jrldq*LY<_grwBtB;>B;w!U1@>6yOr&ddP1yQ9#qHljz*+0{$DO<;Mm zi-^Mzo)SHkb!+b2+bWt6cUH&|86NTHW)xq(mANd*D4|Cnc+)vznh@91266LxHdX*Y zB#v3@F8px1&55T%Ag;^fhuvwbZ}T$oX)1sOJOpl6x@ak`&o6Fj#!GWVub}oQGrL0O z544-*qMnPFl2CW=*rWd)aRju%ro#jd5RR=4fYa`*1Nk1xKzQLB~=t%0bt9Uube9^Jbd)z zZ8PRy*6-50=il+qKZhGOtbOpuU!#>=mKXqRdi|Z5({39!_WB#wKA{Wo_~TCuA2ewD zXWIw%>p_@&{EwgRec){0o}Fq|&!LnY`SD{yfk{|+rS{`lFy5+t1-d&YU*o%HacF+^})_?e{SXlP8V<_CN{0IDP)Yn6cOY@Z(?09$k9rr5)eg^1+G+ z@BjDkzt23qJR`&yrE~9Gyyl6ux6Yb*)2$PJ{pI(CcRrXAN_}$G{ozRT+?li8+jp2d zZ^pMjeYOa~ClA6oj7eZa9TR&PhQT=}#5%dlfk`HKW3oO49Wl_mrr3j4Vb0vRJFCZv=aoC_fcSSN~^eMcEZ z0lHyuE)YQp$R_Z!d)6wMF`}DABT{M|9Y!fLbgrqInVSHRBxY`hmn4Z0kcgz~ItpRU zG7`IgxZs>qMkUG!0aew^L1#>23>YPxbB%LAV3ZmtBw41E5kk#q&few=L}7QeNlTh$ znETEBK*lx`T!QjbS%UKP-l2mZTz3Efn2T|eY>D(Tj$e(UKwmoI60h}tVj~#S_zNR9Sy|b7dAVRr)AhWxP}7EW3QJ3moGT@nS?ogLvmbokF0a~^P3lKf zomoyk*ADh{34#MPne|*)O|#&l7d3jlZ|K>C&KQfEjCX7|ulEA2HA`+77({zPjN40q zHpceJNx#sHTiHb@p}=h1<-!%S8Um5)29soi8_vv`)dbsKcg2oJy~RDTZ{uMV_z{4) zkkSi5eeFw>@RkfqG$_EXTHLa_iyr*t%#m99IRP#uaDk^4ZlP#DaXUE)R&z-L{K*p9 z==&DE;m(|rz}HQ-1(Z;AJG}>n*sZaDBXK;Vh}!S6oVoOwyHmwnGJX3zZu&*DS5ZGs{Io;$xi08Yc*&Tx{)HQp9*gjkGYevaULpWr$3 z^o5g6GFaskE&lXLEGBQa+usn|!t@PWWAE4iS`iMjO{#3 z)*_RV6U}hTLF6kSK_&RA9H%Hfwwc3CamIQa3A+FWd|l}uTjEuRB$4J5E=zk+cTFcD z=E)4gFP(`%LC}==9+x%{N{MyirX+d93W@720zerBfb7i7etj=HQ*c2Tys|O^gfu7E zxM96uC_o5h5{c_SB!n?QU=}SCLM%;8%;2#Cg{ennNg{;gRUGzlMwk-@KlmMa`ryK}SYKlH9$hUQVg01`nq8Z1_p#wmq z&iRAp0|7v+2!JNG6Nv60A(%+lp+o9fB<#-R62b^NOT!$vX8k}k*V73U6bQ93D*zBm z(PlWuN^#5@KPB3#B>{LPr5~SL$IisZE0nsT)kBmBNC}No{}3l-5;&hgRR<7x!GxO+ z@pHLz@91)yxzUpLX!*Y4^f|Hg0r<6^Q?mJ`XC5i8If(K7V&&jp1BGC%Ty(-Z+nOw~ zYpqAVsSUI%?^1}ji>iVu0~BFz0re%?M%IWXl3jQPB*PhUtUok*M2Ys zU6R*MkH$3-e9H>K-|^NZypH3fd0W|;s?8l#+ref-7Vwd?JLvwnJBTO*0s&@9RDch+ z@7}q6`&x_PiN4WTd6ksFsT7E`uwRFaOR2rv)B!y8*xgM)lx5@SoKHS{D-z_(eO99{@6p2vlfU!7i zBmf{9i*@VNZfL*m>8U{;E5CQilfVA*XJ&d@c24zveY*AN)VxQhr6-R6`T4F-Cr=!) zZte5me)s45AG|tjV6Vz>q}Q_h+B9i0ZOZMPyR~01d&;JbTh~1C+=I&(Kd@k?s;b@E zwCLWkLvcwN0OV$;rKV+Genqb<2Xwn~K(}aV(YEb-$|_@78R<$&PKVANy0mL7grKAg z5Lox@i)RWeRz5MMQ}g=oy!n!D=$RR*fBk***y-W{!v+i+-1YK)9qwH;2apTS6C_&nZ}X3sZE^)S&5wHs~6hmKzlSII$+VJ z{VIanxb3>QYtl&vHuF2`2IE1G&!TWtkt8uh>q7#BQOXp>NoM9v0VuN~jDihRtS%rx z71^n+x63FaKqNU15}Hsto{nw8Fqee7+8=-r zq9_zW@}55EEJHCLNsJ+7W~P=N6~Zjf?pq>R;a|-pCQUM#Qd^ZWyJLv6V9?f9KvsWx+slXg~V|lv9zFB9mic|1FZz*Zw2-s=0;Zl z00Tupk~SUqY1fZ`22ntyT%t_VVhp7FMh%|cqxH)Newp>!N0E}!Kvw3-Q|Dg)@=%{f zb<-ur9kfgUY&V<*-T}-7iG+}XbA>(KLPcp08?DtKP9gTT{cEp~)lB*c)%Xef-F=JLk`PXUn@iFX`5_SrZ}9W-^-! zYmYIB`Ex9)Zt z+G~_3BLGlZgg<YSqsv$Kh$povI5+Sa|}S7MQIjo+j!9no0DQ(w|Qtg zvF$fr)eRn?X;POt?C32vzMI^pdy0!M)+@!5526(c(%#nNQkW~K0X(wIUu{48I^E+T z3A3t*_r2d?LVA+yVbzz7 zU8+d!l;sSQFCnq@j-5`jpT|*&53e}oUbI?%8RBMD#Rmy5JWPnTIw1c;(JpNBlxQEN z3qTRU3E`a}E74pTKmdewXrFnA9az%G0>|d+CZ}6c)6#lg(#79g6;B*>0uaUs0|pl(a@*TuMUNuH5uQ#r z#WmCZ5S+?+2-Yu-eBzU!RY~Hg3vgfm4}002a_s! zE9kIAo6di>p-7yTAtL%~?zR(by74p{U9xd&hKS%!^mxU$hX71?>5n&zHq`TelI%jK z&mC`{XG~rF7yp?@=#hlwQs{50CliY-JzglU5H}lLwdipqlSNLxJ^S9?GXeiyU1GIWC|04V`ZOaY`#rJ=xF>y~7btrcP?B^F^|kiBJcVjbF07 z1pp$YE}tYeBnjYlsQ_%s_X!tBeh-eDK!Bi>R))hbz4}g@EsDS7HfJC@w{0NH zvSH{t7lZ;@n~Ms&SkrYO#Ft-uNw_M|IzRfoZ6BuwGaq?y{*{A=f3@e} zu%UekA!bwvBzm->6cM2??sY&x*K}3WQ&Q-?3+Ig)JLN)g zNrSqXYP9H*%Ll*s^fNuWwZ8ef(UK5cQ$3K;-DzOUJ)}q}rLkyK=+V9duUzre`nGMG z4({JuaDx(Ox&%B z(lbJeBx$dvCrn8tZ4zVTJy>=U%c^H@6;};(In_!05sG{cfB5!JMvb|ViOxbKf5?d!HHa1y7 z?yap3;yRb0zwzEeT{Y%ZJ4v?_7mX#Ufs5Zf-^PW+CU&4UzXYXm^40p(tyL0+v2~^I zS)7rP#Po81B&vi2C1+p`nzr;^MKF_qnoNGl7^Alv89W98(b}3534*>*!~PkB)577`Om} zC~W_j=@b!QdFFs1q9jRQANcO(+a6r@&^@Al0%-JMC^?~hDoGP8T= z_ct7OyEB>O<>mDxFWfMUcix*Z^Rxf``txi+A%q}=`W)<IWYoZ$@u$Srot$t%2mwKDhs9##+;i!Z50TPF?n?yK9{_LO5&ZUDt*>n< z1+`)Z)pGz9G*M`iLs9g{UoS03ApZ5i1Pwu4t~vg<>-n@;a*Z=g4eK1 zcX-T8hcI+`n-rLTrDd6M$x()v18=*6Cs-RHL{8u$3deCA$Kj4++jc6MN+wc{!wHdT zuRP9?mX=m6b$`5gPddPa5ER0;ZO68`f8QY14_Y07-f_)N+o6}rIb<181;crkbtgHb-a4_Jme_!gF+My;DLI*2o0_$4>B6x znc0s>`HafEAc0485JKg2qgz~r zIRb)5js-=IC)stNYQY+6|6Q{~My_S@Rb{fM#+8H$GAZ#6mN*t>G)1l9O3jjacvTzh z{ENs~5~^P7)e$5F3Gp`c258X3n1^#zNdrj0=|IRRh!iy5n-VKt<{K9$vVHKmPSUfB z!JybY27WwLt4hLs@cO0=#j(6-z5B;%(bw7;E}|a$#vuMnKYaU9h6^%bfIx^uJup-` zqDwJpuLPxpM|191Bq)hDJw~jQkw5@QCR2ZH*wVgzdsLg9QHWHEClV<{K<+4a)oq?q zCKGj8mbHGvpD(;N?bdsqc;xN}248e(>ozTAD<94L^n}hQ^zGiRtU>+vKK#saI4Cl3 z5FMZZzzh=r1P8(lX0X5i*&NF+%+JlGgb+$h%b=9BYTh^+V+Rf%p@bYheE6<$mkkUKg+rE2Wc21lV4r(b6xIp@o4wO)87=%(m#KA*{#*e?genIs4=U+v{NYs+j+8dr~{;+uK&RvLT zS<$$~7A#ma?}y*Uj=OvMw9n2w`^=bS)Fe~6IrR03FL&xTph>F^mt8S-=gxh-dUcxk z;uF6vUevNp$LC&p*Aa+_5rf=$+f98=>UsL&8PKy>wm(h<5H2b#75FHu#7k@CBsV;eNEJv62ba@wQ@A%0apfSJh7*Re{E>dwG1 zE<(W7)}YLvG?l9lbb7OzmF9LW#5KU$<=kW7}?^ zj1wXVNmf_J3i8kH+OA=iNeKZ&Zrg+qKw-tRb|0=-`p;GXpl&*Qb?6a-N59G~0st_q zNKQeq6^#P87_hRkqS<+bGA_{JoXb3aGF`LFFUW-e0K!;2D<^73^_~e70ALvGpRL;- zeeSi5TX$1R9L^Du3v`6w!rd7okJ1*1stFV*(~SdycO0#YJgG)qLX$BLB}z>*9*yOI z8d*xn{sRYJd+WVv)29CP{p|Yn>N=bf8bJhy3od`;Nw)~XwR61>sEY+}e0>X_008XX zxBuN4v&t)~LWJg#_m98)`rONJ9jT}UaBG&>N|gk z3ZDgpzE@jXr9RjM0XRo5FeiVjfDs~q;J`U>AvH9qI4W+tSzIv+cI^O*kXV#v#Yil| z;#pK6`QQWIv!7VL7$^fFKnTKBo^KyN3g4d@%3?p zKK|7WCA4$_7LsWmji?qv2t-%$flRUvfI`cSt3l!xCz=HDyr}SSXb>wi!27I^s~k2B zS`7G)@@8;s{U$u=A5;UGqdHLgl~K=Ryh63J*d5&|JW?(^?9yG_<;f`T??g? z1NGX@$X1y^%h+Nj1?|~E>2LrF6prAw8s zw2deL)lYaQ8vD6><0)gzFbrlGhGCkPX+nLft$I zh(GlE<|_}Pk(md1fVI2|(jY>_F!y*DQEA}-ka(GlT{)A6BK@@t7?zhu;y$g*5VXRu zrU5_*LJ46M_8#K%msWo;_uvO}_y4-4syYG8paf6|G2zsl>(%flNe!*HpKnN~)$~GfZdQkESrNl4{N(f_AAm^L| zAfg}yC{W~b8ye%Os+V4w`u614AAI!D&p&u2H)aCBfkQ{vuU>o6MMH!TSC77Y(XUIr zGh`$tWYQj)2@Zh^!36?Eu#-u-XhLcwL@*7DJAyl$nS|Skcvke4i4(GM|D?A*I9#5h zfbw___xug1fK-T+nWkyUoT((4w2KSk_uO;uw{yS$?uR8{gF!(iMpxT;UCO0E0Kkk# zw{O|;>f6&_nKY$o^Hvj{c&NCj@MuLvVPV#LAAWM)xx=ZM_0z)d`u6H^puEycFXd(X zmhfAa2^>?Ylx3L&z%tD@r@Y&5z*%PuIOn3_H>~}06J?ALzH-f~%SK-H!L*srzxv`s z_uK>kR)i*bYT%$V-k9{_3(r4u^_Wpb#f1QH@x?=S@7{RL*fIBxzvG5+_gbcrOr;t% zD*JfGTa#XY{hN883_kn(AAejCjaVt$cAZH)mIg)C|AYvG=<*^XOZ&HjMN}=B7}NVv znnamQY6Se?mmh!%RT;3#AuP>wyO;zamdxwbo}nZEc4ac|0w~c7D){`ywC;n_eJ;hi zAu3gY^nr!QusB!Omngvd;T&umY=>ju_)H&SP1d6~x|xGMAvv$N456E~zMg(NOldx; z`L+-t=-ZFFYwT(^;sKv#>jYc{`37balq6ssS%qplTPn_AI z&7e-Lk0z4<0LTECK?p-M4F-stcJDh-T|+4qLLd<;#w-*{0ze@m5aA{!Mg#!MvXV(B zQIlef%5=;`CZDE6aRm@2cUhxjr&5k1--^Ye(P$(ZiOA(XTQ+Tf@!2T{4p+!jbV4X& zk5Hi&PsorT03gUPhMPMA1yV{FqXguV11j@(%OPb3lLyvGpaH1dzT{2eS5{P^ZFKG4 zxj|`3JQ@XbCx<8j>0ZgxhlM}@Di9ojTp+qZG~rPjQ5RJ~cZs?szplD&^c{|E%QF5# z4N9eY`r?akUV8KWWFo2KS%!cBQE;IoKOsO=)KjR#PLL8Ns}({Za=D^_G3qJ7FuDF4 zBdB5|5M_iQqbYIe^I+Q3@CS0t$s+J^7`jP4L!bC&py%Z&=oFYLh#)bj35#?SQB9Ho zpg=9Pqf%r@5s8ctgX4hX03nb{IIm1}CQac5bsT0PWfXy>YJfWcHX(#$=h0m|_=T6j zjx7WPI1Ukls#GwFL_q5(0hw7?CgvoJQDz#3G8Ww6timDq;w98^WswHFVpmq9*Il87 zcKuIU#x3uIddqz(&u=sglTbnkHQW^WGO8(A)A#e#=;*BB53z=R&G4o)qZO}wQtkCj znoL4Yf@pPzKj3-Q=J;jySwi(^EaP4JonyC1^k4yKe&Bz+G+V~Kp_wrmEh4{I_|-6w z-m8Wy@D;1;MKuduSH~Ic%YU;?RNb2IP6(hu8M@~TQEyR;N2JH7E)#5ChXar(YRy<3 zdh#Zy1ua zK&`L8U1%q3KL2daj(;}I{r-mo+c*9C+aD+Q?J7V}prG6c&IP560CM4^lF3e;k1s#C zZ~y)y4a$nSV<%Fn+??DMD}Q%5)T>+Ma1M-=AE{{3sO0v$A9`-$>nHa;iP&!9dAUQ! z$0P*+FfB7;Sd1_N#4y>RLq~?4cUu25`aSmiq#awf_v(3qG|dQgLjj&N27vMd2hZ%^ z_nkK%FU-pVK-=a3z%W&lg3msB>z_Y2JpIz^iJGGTP?DEjlo#8za~A-ZmXWHgj>luR zEp}|#+UEGSg}G)dO7`sDRaIkKCONTBpXI+UT(ac%r=EG`&p-b>wO^mZ<&_WJd;6IK z`dxa>xV(Hzr8#vFjczA&?sro66MJ>hPwtLHtfwBjt8Qt*{SUox(fLEpIIV9onX)YF z+G~dQ?%VaW(=U4Zsi#gk>0{|y8q9=R_~lp^0WTv>C`eK38?FjYlbAjSxVMAPB^idf z>{uL}_Q;okeyo8IHJ$jc6?k$ZqtwYPgw6+1jbMoB7^`{71ku|ln`K=!iqSl6e%b=|D^8Q_U`{`K%_*%rK~(q%x-rrR5dX<<-?i@t8maqzGQZ4w7ziB7jh*d`WPG;~)qtVjenNe)wob zPHxVsRqM)%3p;geo8mU5Kp9=VX2Z^%JBteQENV(PtE+2PulsA)u035lwQte9adjfG zY~{L0G;jH;)phG+*RNj&K>pscXZ@dlw?D2~(GI#RRmg7-Q=E-c9Ru(Wm8-rs&()vR&7jvbCe6svy!yQo3)&p!Wd@R=u< zmK7bXNPPd(;=Js5pPpSU(@5A(O*JpfE?D{dpB;{Gol4qOa;tY20}0)}5O-Z94g+ z-i37vJi|!~Z-5@N@W@WtFq&l0h&W(=DML*;)j@#>K~_yuDkM}m6ODUiqyZHs#xxz3 z{;T#DtpqQ+(8#j)>{R;Vg1;74o zmX%A42-~sUx$Z_|?i^B8C1)wUFjlB9h)5Ybu>a8G&%RbwQB_l2-MCSMks~i^-J+3D zp+W)fK`XLXLOKu1W>nG1fHn;N@f1@?R-=k%g%Yj1j)oioDWhZPhe|GS-OS3X3;9t7o*f#X)Of^A&;VR4-7S!feb6{%JRffj*i@)Nf3luQ7W{!vQ|}4%&D8Q z5UOv10FqYPt55y7xKf6llz2d?Cx2b5$hY~_#yC`aZB;vR>%GfPBp5XI>UVEwwS_)_ zvNb(`2~oC4Zz^htCY?mJY}_xtyR#R1W@LzRvyCrsg2Z$8*L_jOjP*zN9lH<26mcd z2<||5*zsRgc=G%;L=Z?g5-tcAz&WIBuq^V+y5t2nZhY+C9Xr=CW<}#=(X0kJv1t6C zU+pWd{B!g}n=5Ll!2mgeoJAA?8#N;Y2B(RA;1{sWW`Dgv&Y|X?c|r9U;ozzpcVkU^75Nm z`DGQ=i7)5RFKbXgx1{uyDeu~j<3=ompav5HxZJD(D3DiF)tuU|Pf=n1i?6;@SygRD ztY{=!lXPys`@x=lx)&7`RMk{D+-8&rf%o5iLyykK|M0`Y8at&)Z5KyGSreu_?b4v8 zVVD**3J{6CQhh1ib6=9Tm$^J8F z0nhvj3ob$+z}KP2nz60vilCkfUFoeK>+&TG(K%O>8rnCnNLX^J??Jhf4#a-|Oz~PK zvpXD4cf)4xemBm!?RdMy5Z%Q%j=OsZ0014%Q>j!knY3-&L)6!Ezy0p}MGohL5J%<@ zN!hk-bI#G-W`P0)7mmYihue;mibRa}rhokQw2vIl5y5e|X8UF6w~Gu(_pSkk>O-wq z3ZJis8ukOi6OW-=YrBGWZ{U$`-?-I#k96DfzhAl)h`!45MK1A-zyId#c(wf}9TDJ& z5S?qC^bPrpT?p8n83L4A*);n^f)I*`Ng@z6% z$Hsj}YI37iK`c@lx13bUEsJOilu=_0)vPhG>pTE(Asi<(H1Sy5DK%J@M=tk%(p6V&dfYdh{A_`Q_JNHtN}~J7 z_wk7*o%!)6b1D@ukWcnv_PCR+&4YxjY;z{Sc_4dc{SfnPI zG7PqJ*Un)hMoxV7ZPTE0{`Xz`jwkHewQu|O9cK=?XvuF&*KXL_qJ6JRFTd*C3r38% zd@K@DQC>0jrt!V{oOZ#5Bd@*b_RX7jn3k1WP_T9T&US52oc_Vbl~t9mzx{Sib@?@; z?|ftGG|HI6xs8rMF?sSk-FlyV^BwoJKcV+KAABK%b7KF~Uw?BtC1k~`Qn>}m5EgE zKK<{x?}^c4#tuGzbWJif?bFXboH66iwd;qEym8s8^;cbY%M;JOSy@qKFgk3+Rd2mJ zGa9k3xc0s)N8dbh=Vg^wqZv`!4RhJ)7_D%O-)tNx>dP&miMVV1)D8@E z?*S0^>_;~*k&AppA>>*)AcSzv8Doz>`}&R7-(FRjSh{q@z|+qEece9G2<~QiJ zhi~xc;~=TgaU8)p06h2H>+ihz+L1#?z}4*N?TGh{o7xN~b=79oc=t29gvSUprITpJ zYQ3+a+G=|jYd64%J1ds<1+B#1-n3rMVEcN)JmRB><*~+f-c*_9r4DMlT2#NLHn_4{G;H*h@!$yaRh&wB}VM8a@!bBwDDAjb?Gm4I`Q<>S5Re zM2lnxNXHL8s>XsJLU;@Ts#|`cG9hCxJswmm=XYdazyAO za@*lf!nSSMw>MvXx?XWX`H{my=4t`yObVGUMTMJz8I)3Lb0<-mGz}8~S~Y8Q!wpx* z2XjtJeJW z$C~whPZ@mMeNX=W*QSZDyo!mM{{8xI_&wc&Xf)OJwJAC-S zBTqc_!{T2EA-2tfoU14xn9vr2ssbTEJOQ02eJUc=pZcJwIZtMSKO2$BDbnR(Nb3PY zMp2-sUedV-t)_T1`Q=OIOxA!VT_s?c=~6H&s?gMKZLg?H=3sJ@w=0iKiyRBGxs5bfjoXF9XgY%{WO% zYnT|kVj$C+2IoXKy}V-O-@pH{_SW$aU4Pxx8#XMxX4LSi>hkQ|EC9Il(hFDqGVjYz-X40v zxf3V8R+3+MK0A^;N=%4Jg{)#;_>%9`uwvG?f(0RCmz4|vB#df=|@rft5tY3Ef_&aYJdrfu18FKEqpMLozA@J#}xjX*)b=RH) zfBv&+`=%X3FF1!%;y4Z=OcJ0}v%R>*|+N5d8hV}EV9(lo$ zBZr=y@Wj%ezS_8M`JZdo&HQxEsEdYOea+=fn$-K^vo{BycA`nm>WWIv1po+}8m9Tz z<{e*sGV}E}A3tz#<eIw!?+6OmqF;TW-7c&QYT-Kd^hl<4@du&z+B~->@Y+ zJH`c{HS67V8`dma^3$(Ne$_@)=%lW>o*0n$I@RiCT#$f+WUAOVNa3Ck$@oU-1NeeS z(Vka>GWI~(#zaYiV5J#>OMk9wCEs{XFYLOe$`-_fhwLxDWk5+XMN>AbNzi1H9M_&* za5f4KhbjnwwDiF+X`))poh`Smdgq!GAJguhYq{N+QI=O&Fy)P>f0;L9>5{odgx>Su zQxXH5qcq+T0R`GA`;jMK{%-zaL}}g&&XEh?0v(5YX1@@^ak%3+4(GOQ+m2&Pn_rWS zj^jiu>&d5I`QQ9S+>s0pQYU&lre(u~5YA!xd(*GJZq&E4r~Wwq(-&WOEH@_(08`$d z@yLW%_Ut=E7?a^?nGR8a8z1oVO}et&jV}TKV-x|RvDn9-&iVd_CDH7L@vLl+&Zr`y z;J5{~gSyhSRY=b3YDFWn3?D+5UUR4t?`FDA3F*`DeL_g>N%2DUq|@YoxI)I8iz`o) zdXk zKec4#(mnh3A3StqU<(6T&A!N;7%7`*ec7+Xs;8PW8k*ZV$ zI7J}e8v0TRTw^)VRZl!>nZ$`)Wu{y}-_=KDQ=|5-CygPn(kd+Cyirt^bhv9im81Gm zKCbiuf@Bn;F*Uq_;np#x7{-0q<2d!>TA6Af{MLwG8kKn$FtiBKkK*=qN@!Ta{H9wf z5WE6>h=EsBJz)z~!$YlRo@crG+a-g&&A_^D~?yu3m_bb@Wvs~j(1ZsPk0|mIG!K8bfF>dNCVooZMnF^b~vj1z_u-qb&+d5LTpb+ zh#S)`U9^#O7hidlKzzBGUIY5Y71+nnWNvD6y`q4CB|2kdx?G0HIJyC`>K_eEhpVyNY2lHwwfX!|xTitFS9z?f@B4!>;Jv`@eM^Y1MU%8I7H|Lz4B4x8}w zgfq`NciPO)pLph(S6_W9KR+&n$jXYm_x8jmCOrPd*R#(Ua{jf~-_pKw_cz~o@wn!7 zD=RAMmz97TI@JTgSE>v2+)5>&7>KoiiCYDQZ zI)QlfXtl%1nstBvxnZMx3jhqWurlFn+rG_CB@Dv^N>~2Ae(k!y2@uAp5Td-Irm8x* zam&s>|K4glJS(2PVaxX2hn(^nw*2?ChmTeeN@b#U&Jhva1N*|};xWfpLkmuA zv;ul~uC|(vf%Eh$BWzw%>4p7RFk~Qf4+MP~w+=}_%KILA27pPxKFR=gpxUtZtmQ2T z61VOiW-3o~1S)ldL6|ers;ZPIYfKq;K$ZINe5y1g%U|ktepXgqEJ6SoVIXL3Ruljl z=4RE+iaP=cKz=NWK;*Fszd#yh_K_WM{?4geUG65tK%7E?l&tzLa_`}VKD{NI&h#!r3!gQJIbto&n5 zG-BCyDmOQ$fBzGA@8130_e&Qn_^Gr}mjyrm@YA9dZH{Yh8T5};e?Ild{RX35I<&j{ z&f7l!`fH%9UTM9-rw`1{&&kcnV~kQ{ufO^J#(%cV{Op}rlu}AdN{X0Cj%(AjPF_wb zk)UAYX63A0wmQG0?24-{iCU5Iw_H`!pz+*qf4FA!m4B}O{imOQU%Be{g5vh?%=rAH zncsBk(y2+~`dn~Ai9j5D`oNrQc0#uSpU#@ovTbWZNS)lgimFOEyba3gHmqOwhMVph zcG5s;X-0*DGz*r2dG@$G-IPdna@` zu1;aD;G8?$vdm9E|GZJNmX}|C5u^0habwHsm9G73I%xr<~q6g2gBx#JAUXvniWmzlx$!%RRMQsa+ z03hJsg;>^eE0mv%o_Xzs%@ms}CMEzVw*G}%H&c@mo-iHTNF^~ZFLK*B1ep?^dbJZ~ z5H7^>6`&&x(LMQCGg)202qL$O3UeqWP3o6ja@p|JOIAwAOoK(EmYXCI2s6y*o|w39 z!#{*j1OkK#B#whzAfZ(5@RM~igHg&jB4dmh%rs2Os9XjoO)Nl2rkt0bdu92GHF69% z=ZrGLFc@QMMI9mnrKF-dS#ji0Nl~5^F^dWd&Kq)iSxFH9eDm#3AIzAQsHvdHL@UW>j5<1lHsJ7e> zhPo93IQUs*^&tTr=|V2h%R-q3tn^WZ002P+05O?y|Lh49-+8f;rdW<82t#0C0+5IU zCK5hn`m2Y__r5an*|MyX8aqkU(l9yEO1vnJs^8;Z84o5P1LVHT4!Q}ezIt5-A|&IZ zyWR^a05B@Wk6VRn+GHMncg{nN8g+B6s_Fp{kP8*xQP!*%yd!P~00JtVTyOwfp)ODW z0;9|~v6QLg-SC2GzMZ8g01<`YUSY}YvQM&)T)3yTQ<#3SRWie1R7wC8xGkP8b z1O#n~ne3=H=tQq1ENNWN!SB36rj9V}os5tWLXs&vnMmg5X8WiPTKtt&Nz*} z1a!}2_q`|rULZibs0)d2EqFmejjaO!cYVKCm}OB)B^`9@&}PxxX-BInEk?7mvn|6ETo6JYy#EeRBXwfWPJgXf5RXP}-uv>A z7v|<<0f3yBYSgg7KYuKUTBaP<@8-;42BVZ(CJ}<4efog@{Z5WYEJttvID6np15W92 z@Nl`oSblDH#EJ+Ml#+NfzV^3;kyum+VVb58;*2u}{B%P5lEOj&FkIe7ouprx@Nj;9 z9sr!$@8mwcdqzwX5lzDc0&l(XVs%YTc03CJqz!6GX&}`H!i@J{i^t=pWe9-)#4t?m z@JmJvyYRyEA`vT_q~U8cVg(nq>lPj5joMUYB$7bqYdT;c92 zQ;qg@fC85g?yQ3@-$amAzH7GfM_?6qXZnmQ4KYy>k=Bn#ndwIgE zZ@shdhi^m@7ko4C-FIH?*`xc2OGdBw^DnfM-P(1UIPvMC;=&P^T)k!M_S}N(WxxD# z+S!Arz5B*TpMSA>>5qn$HRj-+7biS;>PbDTt8K;@B?v%;cNRcUDx{D5F@i@rnu)LM zGKyHgg$%cp+&G4hk+Fd83k3;7l0?`R(ujn39Qr0n4gsfOkG2f`iww)IPzlof2EVOsto`TtuNMG8ZW>M^X+)wO8`saW%<81gm^#z}yd!gb&}FMd zMTJ0N)w(|kAzATw!seSdZ;BfZ0TA5b!lot)AxzUC)J`VL^Kzm<&;b-e071i`rNzbD zckJrXXUO2eXN)xe< z<8YHv6r$7dZHh}uZ@lw?z9#@HLDatYI;HQ)4?X^H^QLXD7;zEj37$N{4I-oQamyr( z8Wb3klw-?o2!TnbrcJYEyLN0}xNy;sGfzVlf`dWL>Z&B6KoP8n5syZz4Mq}nB*G|= zsA*Y@I;pB2U0SzmfBa?F-gaDzh7UY&_t+b6r)Ku;V@EPZg+M|m=lr-ft$ttr!<$p4 z-*M-|E0+EJ%EX6Ll}RU&Or}zZ_~qAguN`yic^6*Pr+@op%l=4IB>+N;+%YEn zNJWLi-E(Xyq?&j#orf0hh88xyKn#i zD4{^auAL&8B!=Nts4Pa`E<$%}D%!$6T3rJGNa&(@KNQu?0|3V8_dhL}J^P!6^~$ce z@>0_@Kc791#R^xf`hE7CA5K2C=d#~c9(P=u;-W&%aq;41?K`v~g#NMSpXSXQefH@$ zb&B%NIOF7%E7ws9%a^U_*s)#TKHUi;a-~uv8vW$U|0Nu2-+=>*m#pl1Li@a&_|lbY zfBS7|kM3Q&bUcnyDski3JTE75$)%S(_V_dTIk{I|brB(iQMP*RhNB0|vkhy`{}!G- zctEp8^?v+$*;jMt)-Nu;^s)^XSK)m{49>sg1i7itdTjo`rz!(D?4NM-m=crIVi?%L|cND59s0e?Z^; zn-X>2ZZ{>;E%?rFrf?HG)GzGm)QAHPw~Y!)|>C#nw}s6M#6YR{hPt-GB=86W7Y>M$gEuZRF%RKf!nba4xvRbyC-d zHV6+f48t_MOXe~M1Q0?HLQKOjP17_CME9I>$8iXurfHg{>G6&vmD;7T%HiZjKRg#( zW#>Y74Iv`>DND5Ip$Ba!BCfbM6lqSklT-{fJt*yBMpKo35G~^+VN!?q_#T_83-zM@ z78Ou-YWVy!^?I5E<=T=6gaGA2o{LC-{Q1D{Ej30SLv9nKP~%*1X2FR5bu5Eq#}Q0< ziV$THYsKos;?-5a2=`W*DhLIlTp-{sil%hI_lr7p8Bo7|$KjWZ`Qwj20YEMxa7SJE zOmeJC_R;OF7F7}QG<#5^tS~MAhU-uafbJ(ibrg~i7^GvJ+4akDoQEHO>a4Rb1OT~0 z8{K2 zRpkJryu9Yx8}6y!r0XdI&R?+bS1tr0G?fxhJvXUKkJFxg{&mOk_oVn}@U;a?va{-y6z9fca<0ccevY7JnWc3K3-a?BWpYn4cPEfQ z5+3IwFFVU%G;UdS^0WO71wx<@*|8|2RPJTYibo@+;o-z!Mov8DNl$?yYDF59m6R3N zu}o74;Uz~YEXa>XA_@}(2-Ghvql~Ot_50!_%YRw2eDN>Km#tX6Y{lwful#qt$vt7{UC z>esE4pNm4s6V!kJ0-C0o6_3fY0J*?uBwDwq&@v4~6kHG>CB=m;nl#MK$wDq1n{&>E zdzvlh+{w$yY2LJPy|NO+pnyOLH4Gy^Co3yvQ38wrqqHC=D;|v!LbBq~{OqhcdAS9- zxkYsfaCf>IWX#SF$IlC=~wnsQM= zTAwmCDspv{7SqV&$A^ptk7~7t1PJj&S%5$TOsW%hU`a)YN{O1-sO`dF%hCg)p+YXL z1yyi*Ux+p(O7wTN>?&@n+9gn=Y&)J6pFMBkxN&!n9(Bo|tLH!V_}z&V-?P8+zI*RK zzIB@oYk&E0#`{xVfBmyrUuNgT_wU}?x@of|KQEa6?zHJMKAAK3n`b3c8*cdru?iKM|Oq3%jrs@Wcyj0FvezB2Gpp*{66CRsBea{{tR6;k3| z`^g}&^(HjE0Qv{LA#K!^k%<97!A%X}Td{zs))vbb)4Cd>O!p2deINF+LLad9+Vnaz zs5$L^VB?DB29PiWnl2(#R}UEepf{&X81%z%;3n=+eG!=_uDs%af)Gfg>{fLOy0vNo z1bH%L#H>9>E5BK_amn((R&LvqBIMxFiXDfKvWSJ$a4M@hHz?}UstJHPh)8j(ZXipD zDWS<^s(Y7?!_Phat;z4){_snSSNw7Rqfbto@kPG@rvU(A#)gfXKmYnWO6g~_KL6>* zB?ATwY}BYeCG3F*Cs0Zk|FV3^&#TKCHeUb7nnXqU0}tHMxkKxUBNcX4B>=>t=Fvlk z{@%2WQqr;0aRNz;<_#XabL>^4M--QqWMyR$0*o>4IAvv}g9e`R*Rt=2oN?y)L;9ml z_H6n4qG1 zS$4*0r=2_Kq~^_=@7eh0iG6wyLeVwP=ywZ${QieUH{UpF%;-_GzW!e_l@b(=9@@WQ z!&XAblqpl|HEA>9@w=`ZaRDZ4go6OU1lhc8=h2D^LP(QF4Hka?>-vATtXli`woQLU zVv+KS>et?wI&9b(3%>b!)$(6{`*k@1uuLZ;9vQIFB3ek3Ve4le5KnuIzxH4bup4IUNTh-;rSzNB?W2+ zsb-8%9Qz{rZ%?=SOdtW1{|OR;wj=iKaqkl10Hg{FV-G$omj5co-AsT$Bu+D4{LZ06<(FN4&CiQ|B_L7>d-%xF8#is+ym8y$ zvxkkodi=vrzPM)nrZwxgUNr2|;Ulko>Gk&q554%^sUHi@-9_t!e*e>tHrOA%KWo(0 z<5H>Ag6>+;y!TMUz44so6__ z7`_R|5S#(Z^ustF9foK)^j5k~30CM=5*+!Uq6tKF0$z_IPXfxq%IJOu%KCpu-~mw% ziw{Tmlh-X!PGDfwj9X8*wG7~(CSRn6R|g`b)klC)Dx0iMC7+u0+MdLIE0&WwaPWjK zy>B`9MnFi`q}tYP`TC;iGiFaqVJcEm`0A&xpLpC!!@8dnF(ROyx(8C<1A@CMSjb0) zVJus<_QRR8Qi@#8gpU4w)Rc`zE#OV;tJgDlHW`kC4Bg4BKEn0*9+V1f`vGt8IP}<+AfS*L zdea_cbcH<8AWJBvl3vWs>!{bKm`M@Fx_iDFp;~ z?Y9!GKI0IO>G;7Fh(a?dG~*tC5E6;T4<4-0$Hw8DI~)Kk(kv z2LTzS%rJn^eR~g=6c-o<1pv8yPYBe!cSJ-kxM`S+eqEW9o!zooBg0@ylSpjqOAe3= zVOi#|kz>FA_UDT(J8#YE6{ALvUGUwfEm}11-S^DxyLb0H_0%VxczWB8osU0qcTRR( zVpYb+A%uC&>C?$cBQ_tWio7yko<)`63J-MH^Og*h(flH{vXbt|9aE)cd?(W_Up^9| zD|`${luX)65s&{8hBaN9rU%y`Mnpn9iS4~E;+?V%eGy!zWU$cLq|FCnwn%R7O5z&YTv0#!$u9_@u-k9*uLFN zJUicIIyqNO)hV+8GSvwMpv*l{2!hlix5`pVDRuE6W9!6QNeTdfgnDiHBemb2n^m<8%t_kG-t4Rk3U9%*!s#E@-H!rCVj{93E`nMep0MllCTGF7|1w#kLqp|bP z9uUup{<3uCo_*DiK5|*Z`X%-27WX;1_jf-o8Ggy|-28gOFCU(topt)@r(H zG)>bq3hLxHZd`x+-aXrPZr#3p|CLvcEh#JfW8JEf()`Lq4KZ_1>eZ=n!+OzZq(!sF zTej}BOfwdV78K;yuUnL|Z5dQ1a+WmYaJt>fxMItFq!r765>@yZwhD$S@k|kL@toPP zNC)X(EElOgJ=0OwAnCP*!(rOSgJZ&=RY20elHdYBso->-71Ce6a`)iXeZOM|pM59+ zJd#X1Dp!?ASA*_SdDI@Ky%X-gTE*a#2PKpXK>$u`*ZRw)>;Bq%B%YIlCJ2Mlh9ztF z9UT1f^g~Auvq%Ii6CHtB+5LNT>{`DxkxH3zk~|cC_eCu-O1Kaa#_qgvOnG(cx#ypM z>A7dkSnT#YZhc_lPh8bl{xRPHx$*UB3ZCnm29q*WZ7&Y|#_|x^?f?v0InZ1`WAp)DEkKcQvrlv+N7|)JJPdWL-*XuQJdt8g0-0Vw-U$AD~+B$WzV>RXr zFFtj_h|B9WZq8Fq_b%NZdf?vjqZQF;B$-P1gF~5Zr$&xE|BJ7`>C$!3Z@y`~Ii{%vL?A^Dw|0&&Ge|z$6_uN0}jn_po@#gE38Z;;YfIo9^t{YhX!P(c!~~%$Si(r3RlpaLR`>d-OWv`R68Fe);e@^A`;|`;vx@>sM4^ z(lPV$b3Xj=(}}OX2Rzw-z!`l{?nMYhERzEk*U6vy{#!SWzo&V-uJw!SzdhxZ`t^$T z@86Y3B;_zB6V*xinIHk6RJlt;i4|#tguNw?6asdIZ=3y_*2s8;%#8ndNoMxh-{;BD z`jWKfGE`K10RpwMI3ce4Pbo0dEiB!PW*y0?eevC?q)r|HU|tcg*97-%C#H$g?WF+7 zAuL$Y^HEVDLH!l#J!)+nDykN_gp-DNW!+uk5<~LBq0QVA31oax~i&4qh{5WM@~Me=eut`m6w+@ z?}w#_j#N&6?Zv@o^}F!mtKXVB~U3hvm+C+@rFo7vxw9eeF%mz+~&r|!Dr z-lv~@@{&u>|NN`}jlJ%cz9;tRdO~~0v4wEA*F1dxZ5Iz4eB~r^AIP~lv7cakP z*oe8aPaHMs5>N-rKJnDVP909T_<|w7Enj)~Xn9Ufmb5s%@CBuSgl3Y!B;YO_)9nb_ z=jmkOX@P%JZ7xM*)+v6IwP~wb)N{au3b;P5nG^<0HX81RvM6e4U2|Uadl`KyLec_r z85a8mJPpWDl^af+W`f!9Qn?d zYrg^F01}Kw`F>~m&!3!pT%VHcA~^u=j%)BO8fkCawiAm*Kbkf7mK$y)(E3XgC^Y4W}EJ9+qVu=9&96D67d-uNMk8kPG zsN6Xt1PYD_2!sM4rDV&N?N2}YMAKFsfY4q0b~SBQ|J-xWtyfme5#D|8lUr`SBe$@i zUfsIyO`AF4$rs*vYf_i4?O%L#%6<1fYQ*zisDAn8JMVt#{_AB(QHgkzevgY*2pIcb zH+7o9T6V`k+FNP()XVFWO9Xw+_hR(^AZtU9=@#~XxB^k~+SH-9BUsh1bQU3Q?l}Er z^xR>U2v8A)d_%gDTXxoL-!1^60tgkrYbpkxUN*FEp5QR&4(U+zF~`IFFbskWyKvw z2*DYpLJ$sMFebUzad^bC*8aWix5Z1Ry!+Bc=k_nJtlGWrVBLCURmtQjg9i3LxljMT zUGICi-fOSEclDK*v~S-=pperHgaBhceJb&yXe>aNX~bBIBnlKwBmVG&l3zx71?UN- z+SHv(&4h%S_tkCqh0OJYs?>T+0Q9sVnfjvncwqoMfe^4S5#&ZM;#RFei3;7`Ojo+l z2%9Py3{SPPEHJyM{n3LvVey1Sx|VKu#I--PsY)F{@1m4YYTbAHje-mCqEU#9u}H*H z<5&7_ zWxHo}xTNT}tE@c)0LsGazaTg`Aqo$elVRo{0Ga4j58u^hb%iI!P<6p0t&EX^^eb#) z$$|IJCJwY3Y`S)TE%;WDa^*CLrk~uZ-RN6jyaID8t~=#VQF`TdtI4Z47L9RA4buR? ztgMJ>8QJkXKqD(V4l=;ao$OdVY63MWa0CEC(KHOf0RR%!DQWaDV%RCst7rGYL(Zx^ zdT3DpQ@i)Ys#20Ma%3zb(>V~1?y5q9rfIna++O=+3I31~9|H2LY76nf3x!~p<=R@$fg9vQ8s@C&M_#|y{y%rzrFy^h+MCGE<{AVf>ioza!b_-`jE=wcx--t`|HrxwrNu?vx^$F> zLQ3ki9p0^Lr~l3QqI_-#%Uc`DaVBrj435YABJ>v`K?S-+$GhZV3QfG4i4_&KQ^#j|ssEA&iog!w2<0 z<@@hvZ~S{pNoh&9uE%r1OG`>-e=&X055Ki+)2vIUcJsdeXv4-WjhZ!#T9NEn6cIWe z-};+R-&_61UtKyM*R*l{FK15KxM@p+2K8dmXl{14$=KX4X8f{p4LZDU&(3uU^AV96 zi~M%&^97=Im{^$j_1!Z8{po3( z03l@NJCDCS4XQVUTCoh&uhUu@gS#r55Z4%07AYm9cDWa>)$OQP^RZYJgY(Y-AcI3d zA~DjisqGnKkyy0 zN+}R1D9jbqDJse@D=M5k_5Fgf#-|PHmz@oOD+yR+Nm5bIb zTg>@v+HoCwzd7ao!Dsf1#iJ=aR9KMz_m-_mk$m;VH)qb6At>(Iv6B#^GEvi{ag)}~ zn#bd@fv5Iv(Y*1W8~#BAE`(tilcs(+d-mMYl7>C|oqzDaev7hEV{VB>qvs4BluRal zOG^!eW)H|w^vDf0jTRivfYQ-7z{;vZN-1ooK<&qW`!s({k6w@eglz1v?~~RAKXRwt z%-}KUmrMwj5oR_06AHGcLG1oDbW^*QON-XYiv2I>eidmVBVeVwFDzXBQ-xh4=MKPx zNZibhWxe|KTVMSA6*cI}9c%44p-8#onEBa@|6abg@=!^3k!*?}xTiD_Lfn*dlu~zK zCciSdX|oRRy!|4x=trN-EiEkq04|VoE{TdVMhR#e^#mb=F$y3vLUPBpIkzaG`MEjK zXv70vns7oOAwnMACj0%ToaN1SQTn1!9^JIjc_@C4{I<5(Ehm zg1Z4Y07StB%IPV=Q6Mr(EXxF9P%FzYm^|Z=P=f%x_0F`JGe2GO^E}5%nU*D^FvLBl zOhzFHs+Ej61*LDi`dp_@%@37V=I3VR=jI~7j8DG0{_2~?+%)ciyRL~?#?~FX@45Sl zc?%abY*PP`hn~E8)TMXbbL&HoJoDPKk6$}-Sp9nWj>9PdBtX@$`T^`rq^J`?=<_ku z!@ru35TsWEZXAjb;&}tL=%N4UAo&#&J^5Kijsx^I*lE5i>cxG9Lr@;tt$O46i3k9c z5UE7Ut3+irfN3y7lZUID_sY9@bp4-~SL`@!j~q}KwFqI1b8u`yDFKJ>-Nz3c75Sw= zIC?IXBz3vHU6LC!%!B(6mmfW1u%>0DMTXo%M`<(~0f@-7J1B&=Vg=lsi7aV5rokeX z=?FwblhH&n$tV@7A;y?tnB|pK`MKGEkW8f*W6^jlVRH%)FWS zzcdz!I2y`Pi0WdLfv}1c1eu&84CM&K=Hy z5Mmf^G$EC=bF<@wnURPA0EWR37-J@5MDBfX9De9PWqJ8g+ORGFSP{ztx2;sl7U&w` z0tuxwQNx7;mDS0tthf-Em6g5c(9xV&JZ7<^oswARTnHf|mO&x$`|34U3_mLti`FT~ z6M_o?kKHrYG>k|zT5-5MCp%_YCb)3~LWm%QAbM+ml&cWXkfD#YlWpynE2L^;KUIZX z%dGAjb$g90Pi-MGWa&1$&wl(Sh_M zqoI;|CF#b9*J8k`CTV6!C|syp@1FAxD)}k+=pbG+LH{i;Aw)D10VP(5XUO`4LA+>T z$mKN*%BYnodh5IE^0V*Cy3sU$NCP&OLYqI_0f%45kOyXXu1jVhl#_gc@?OkJl}YbY zs5#I5g*4*S$Cqd^sQ`lhnB{S}&DrrTe^?*12`B-%Vw zx~!{*q7F60Pq8L2BQK+PAt-^OM6FfNK*x6Kl@$*gI!FL=&MBcMbZFPH zU2B;v#c>?NFg*Inip4s&Z_RBkP!tv9(}H}?xj~5#qIuKCO&c|&lu*i2DcfMQNu&CN zfZ&c?qS5L2RtO@QwDa?G1`OyWE!1{xo5_^~1|cn*H3oENXPY#r->6<0rA!De1EZ9X z=8fvfY2ci!SZ;O$$94#1a_9^q5JZRLTDEJ`oKYrMO$*K&)+@W{qQL+HId9pjX|v{y z2qgeSW^Un}w{F>_MYBc-D7a|TqEVaXjR+xx5_yJKaZ$mUr}id5C?!I0nJ89DIw3^8 zvXZ(b#e@>hIRVn8Q+t#Ny8+v@Y%0?$0EB}Up0o`{tKDZBIR*tuy8oja4G^@w6wB+1 z`CkJWX;;{F@_Z^HjD0lFmb-3U= z+_e>Qa>(Fe;@|;3VWLqjfD%Lm2BdLg8p}b)ArLy^l7z;CFiK2nC+yQs?R9GZK{wxW z&pBuPRwp-~61;8P&8ME)t){ZNY12kIIoW~>#%OkKi~xyRQEt~*@u*?2WXg7IhfwNp zn?)!UJY_qSk_e%Ux#xxxaKMdM5JD+{kX;mr08o-&=g8s1mSq3{VXU&EA}1>g00^a) zWmQ!t=YBK4U%%c3dD&5jYSSO1 z;LH#qKE;8Oi%K*GNYf9521ZwZ>Ph;LVyu-=|C18QRG`+t!m(P*(6r~Dct(`c2X3@F zX#KlfsRal0#~G%HK&7xpZ$>L4DB%Z0Z<`3fbnIimmZSz_T!_DRZsZ^srGNxDGEX$AqIL^^=xM3KUWkxJF|C)62W$re{nB2=l2*l&Dcs#}!%g%`t6sE~k zcT_4ZL_jc2%d#R!s6b*EX2h~=$Dz!KMy+@(5{X!Z5P@#$EQgDf!yPUNA&DeEdZfxQ zm}Nyc=LRz@(=bgV60raXrA#hF0sy&*qp&oupdhb#IP2NR zZ!Ij$%gV}X*QUkPw_mvKno+sg*|Wd?=#hu-YEV{Z@L2<^YwX>7_EAFBRJg}ip4j&< zopv%7%S>Y$1%{?>GF+g-2GTCd&~!j)Y43$w|5vjU(LJrfcWuLZHVnVpEP~e{336n* zj`FoKAppP~6b=A0h@fECoIg0LV}0|5nR}Q1UIhSA(?PphIKY8%q`*mam8eN@0F_8l zNV7zm+60uE95UqW&L^}VdhW%O-~PlFF5r9j9k}l1yBoIX)Vf`-F*n?0Bc1cjcLUEF zzGnSqL|nOQ?fJvUuKs;(O-=HmD{jm$ZrP$uj~8EiCmM;Q90xfHE+P?YrqfBCyY-*{(=yXA=Y97>=icXBI{MDSvbOC`7%+eFDv7)W3x8|Zy?=vdT`m}Y z<$;5T5s^~*{HyObY}&a;|8qW{JwKWiRpUY!rHru!KP_$5woix7r;fVuzNGEs#sl4ym=E)oAM-i67Rqn zfFQNH#4cwQKqEGtx>1GGbb@s2bz>^1o%rmtj8DB@jM+UTH3Q4I1g$V0IIq{Y4_$Zz z43Zw~fb@GVz`AFf(UnE*^6Qg0K*h0cvpz;NN7dUYh`tZz>)h};#9sYcJIWqW(_}$F zv?m&z7`(i`$O`;^D-hFVUqGA%M-UMl&QmGdPT48jPNi(ywz)crRQ6P_$dzn}LZIUa z+u^BHDw#?pQ>j!cCC?64XE%F|yI4}+{T#Jv8^QwJRCFgTIMjQoD+o2@9vOlfDz6JD zeHJggglS&9tkd&+l>L-0r)weabV3U<+Og@-Z@`atsPS@74OZOeXZH19(1{2%Q|g$I zdI16m<04p@{zdPC+k!U`|1EK(7x>kPF-)(f$&x9%XP0)9-GGg7U$*U06@eric57w7&SGJsE}(q_4-A0C7{aTzjV5GYy_{c2-B`K2^OYJ@2USv?R=}dJ9>Gq zsnAbw5*7diWHwL7afHL|lq0yi6M|4`3tp2-0f0b`02~Dh z6da{4NG4OMlr85iIY)W4Xew!Q?&c-7ZO(;!6#&3-Y(R7z!MWo_u4Q%)Nsp)aYb{vO0wu6WQ(NVch1xMSqC3Z!? zUIR@!WK<{MStP;ONG8$?)u6<2Z3G=^D-|yR3{RXCr#bA zdv9S$S=G^lue|c+ym{Y`9&_Vg|7<<+q}~7k0tFZC+qQc2zMEft=7ATVxbuoj&p&+R z$W_-|+NDdoRLW+|pejp>J~ScWjLHKC0HxP_edG#9Z$gUr23STiflOh9%sdjjYAX?S|H;Qr!d3hBP2q4fvNY-rJv)Oic ziTgN~3s8j+j?yjwaNe*>KbiLNl~;`0v}I2`8W9|kkVBQ#S6(~5tVzeg!>;^mD-@wUP>ugmhr`$@4KHoxTHz@2OfR4rY1!R*|K%#wKv_}qC>C2!$$wQ zd@UhhS=N_d%|E`=>BC0c^7&Vb>eMN8SIoKayK06RY{|0UZ++;6jazmb2K(&m`IlTX z-sbS*&r8p{^oC)VT;H+VfS;DEj9M&NQ$Z*ZTu?#`#y%^K-DOEd42;Pto-j~pJR*|h5!Sc1R7;l zo90o$@t)CTHx4fafKz&9cR3|iBRC)h0wB<&Xi&l(MDOebA09#oFh&!}RIBC<-hAu1 zK|{~J?z*wPdJLMsa2X+F%eL)x3i5vWaqi2{KmPTX^WS@CTIWt3wr=0`?t9Y-fiLHL zvwh>ncE`87=El4K`RlLs>z9nX<+|rzeEEy7=EbAY6n6~MEU&75W9sy6Tef{Y|BI`} zTwx~?hmMwCHTKqDe*EQw8Sh>+{QSjB7A0(4vu4dt^S?g#{2?#D_H5K7u~_V#cV3(O z)eI|M=ix`5VT>3C`+dpm^2*BTAH7-Du))$#2vUQu2vLmL2 zh#gPpH1(a=C%yLCf(1*)-~D7+alzPYt}qSf@+&U6;_~6U_Z@84uH6@(e>i#4Ym+8U znmcC!mznMO7 zW7M4)Zojw}o+BzUrpoyt2Z=5H>oF`%88?$P_|Z-D!B@N;=zm%z{uO+p%ol*bT8|7i zGxag4`Lyx_rNm%Np4ekqrfHd`Vfa}iA++pF-g4VvjGCrlnx=eDUUE7L6b*)lL4^$95;yq1+ zTHXxxjJTLeE1DL{O|K7h3d;n%4^k~RH3pD2=d@}cObiF?m20JuCnZ1#p#-Qg?)~_o7v~Jya=G2MH7k>5I&)-~o)kUVsn89X#_|D+7 z1_D4d8vXo}4@O)(6ai1|-R*y0OuAWc;5T zZyh8Zs{d1Y?;TH7dCEm|f&N3C=>FE`Ron{Q|7kKMb0^VKLi zgI(RD!#B5#eCE=@Lwa`T*S_Ux?VDfUzsJ|NT>kp-(^?nA9KjKQ5@JwlP`QgH=%5io z2)Ow;Bsgl}H=%OH05eTPhOG^gaywC3S>ZuW38joO#tg$SEz>X!W*C$ilu$+}b@`Ga zQg`u_M3_8Jj8R7A{3fH61%`m~zs<8w$TQi2qapa8)M zazIW|02hFQ04lLWC{dZ9<#I(rkrJTHubffJ4948W7QsORAcUyZ7!pWE2mu5kKnNnW zlQt9T({+gCwIL4?pt6qiKN(3i6HC_?0SPPAz}G3!@((m)fY)E2_{U%WjJa-XGLf7*b<+9`8-@um0hO z#WQA1sn?+R^3h{PUwc#1vGWTGlF6!gPW-QpTW`Pbu`j=x_u})z0i#8-9MIOesj^p!}z?4vwX=3<=S#V{dTP4^cK%2C|Vq$5t-2 z1p9&oRDd5cafg2gJ(sLjP5}+pbQ3V$xFTxyGT6D`9oKkpZy6y*{r64=CU89qIM5By zSdoBSJx;3a8k;A90%20i(Q;9}DY0eMmbE9f=zdAp;ad*udh*?;tE!XCWQYh3?mM_Y zX{Ssph5^z*mGMCcK*~rmnY#Oq>l{1v{7aK&&HDJdvA5nfZd7qe;WeXfKU`7y!Fy9) zeDURRw?6RIr&HIhS@*)T6E3^@=CQZj^5laLJE`hdUU~YfZx&p4&G`QPPdVefGoF0t z@nnr1i9`Uv;f`qI;5 zJ5d?#Hf-4Z$;WdpKId!#uzBO=1@nFo#M-ca-K=S^4jpmB*c-<*Y*asyOfrI$P{9!a z90!{=Z`Qe2_qD6n4?cHjy(Z0Gd*`G3Z-40KJMY@Q^{-JQM~U~RTsUNa!?`?-jsx(T z>X)8>Et%qWs^ZeiN4(W#LNbv+fOt+^V%0rU(s2kOlu^fatcbO1@BYUhd2Zwtmlov5 zlS!K~B3JnlMGM}9c_y;StT6Pi8A(p3$zxGtnzI#Pp5UR*TCqTl$FLwtDC2#=`c>~L zZ57gRpnI|qU=EV@K_(DaW+?(dJVIkp1OUPb5|$M;7$dz}W&?oWc;a#K5krbrEZ#*3 z5XuPh+ya)DZE)@Yksu?Hr;58U%I#}tJ9d)>b>DdLv9Y5s9edMlx88K)%uhc(p>v1Q z($bGV{_>|E7pEM)efPn-r6t48JL|`VKWy1~V8Mc)&m4T}!F>lln(lu5qIs&LgHV?A$?bz5ChhIrAziDpGb003c)Gq9#mm;LUb*_<;R9wYXZ@dB8aHnI<|{9)-?;sq4?a8l{PTuiaCRb@`tg_FzW@Gb z50^rS4?g)o_z{Vtu_Uog0TRU+}> zyEE>%?Z(S5J|`ZJeEZeBNmFMHIeS3ek~%UWix9#x*@fqwIcUI%*WPyjL-*a?qxEOe5;h50+2hZf`VEL3hVB>im#-Tk$<6=bTYjX z^jU?Z9e=Jjuhj-JG$#}gUbKRc@UBsirnv8<5*024f}Yjo!J-@~)Vx|5$MC8pZqBuE zxIn{8ATbkW5*m8pw7{im7!UwGDE-I-fWJgv9}VRxxuJ}J1n`_VEhM6W6A+lbiuy^f7g3j8MF7A#Qc4;%sOME) zQe>%$gG`$yF%Z=l6F_f8rYi_^K{utVije`psVDV*?~UhMHERHB?9iXsAnqMWXhKOn^RM z+g(qT`@^le=^~k+uc}=_a);1Q+m|_SfNmIjl3V60Qr5GV#44!xC4O9o5QT@tfVOaP zg>rMfFWUUsK6O)BDsGR|syMdSG!gQG%oXd;Wy+!>x}4iI=Pmrl}pL$$bRT7P|k;J=a1GFlLzwz|?lN(0eT=H4}7=I0kgEE5q1^y{|4V zWNvoW$tQMS^5a*@WFjX!M+lyqlM4Xf&ikw&KMzm{gf3k=eE;3o#YM%o?TonSf(y`d*@vqV z34)NHpJy=YaNeX*{jWcM^YFogWu>M0`FZcW^6b%y3WKri?Ce-Py8qyT>Z;TW&)m|j zTPGoSS!pR_lymOM2Z6{8!*-mOEt*bz_OVFBLPW!$`Uv>Us!3cuhUMNTt~dzEQAtgq z@vp_W)h)Q-vrNZA`md#tw0ONW_AwU>J^j&VUVdi6-5ol% z?%1XCkBb(cJ><-K^~zc{Kkmh6A78p+XAK}BznuNO;QmgBoZQ?$mM{Bu&UX(!ct`U_rH2k5`u5wom`WH{G#1Gw zy!yNE=Qe56dfleo-FtT}DK054E&X!Nf;XqmT(e?LpWdAxf9Pf;P;<2W*Ci_j=iUgQ zGX4O7P(n?{OacIC&{(z^F=<6js;FMuCm*}3Y5ihkCKud{MG+B!2!y2V^z71h=-{(< z@7VFs-B+*qYr~7LPdo3TiyydS)V}=(sw&H$oiO3TAp->Gz!(5jRaa%@=e+jHv)#J3 zt*EN1Qb!>Hp5?5)t3`)@qh&IjFs)>Y+gc zLVpARYC&baVym=-Y~7k9xp7{O55KZw>bLv%9jv`4BsPUC;1xDT zM4L87Sw2+P$O%+ILAY7v2t|~8nUPZJaE^q;qmkY{I^Q<#hA}sc|9kU4j$M7uuu+}6 zcWKt9?fT98Ov40#llpY~dhUWd?t97+{EEv*ZriqnC(8{h^2HZlrxG<64?Abjpi>dR zWQ+@kF?RiDEmEWa0RR9=L_t)TEAn&mUwCE8>yxKE`r!RtIyFHXTeWMGN+wOyD9q2@ zci@1*Fh4IpVwsraJ9h3JcJVDqtUPz<*?(@{xqtT#0H~=>5K8LSFL4~FUP+zehV^%D z+nKCMm=U&k@vl`Chb@C$dEFS3i0#{U4n6N2&N(II_%C*zveI-~E_Mr95(xyHg_;EvZxZ-lS*S z{`k}CH5&$;(i;h_*PyI^!@AEs_dv(?C$3(-w!`tQEYonfaN}f}dhlH83>4>4nx-av z{RuuhhE*c?TG21OXFLsb< zAc$%ox71KXSreGaRSN(CLH@qT0maGMkqlbck!Ua}<56orr1k?70SXzqs0+q-LZhVo z2F;@PYf-P);?t={rDLYatYZm0-+OS04z+_T^tL^sKre=i1=f=y`$Mk$LYw4N%2Ti>S&1$oi{@Tnv{GLE`0ivZz6 zyfZ4H3|$OdsLe`y`biZfE_0}Hb)nF(>xYzl2a)KqB4bbW3`YRcanCS@CZJL5?#awx)~Zz|4bU!qE>VT=>wbb`Zq4{^_oV&Va)%>D-cHr#;gOJt|&oQ zH0kA!DXK!0AJ%NH+RJo!xGsz}9Vwd%gdjCiMnn_@2mnA0pwRMqrb}JEXh=?KrbrX}wf}Ep34ghjB7w5dJq^Pu{*l~C= zndAZqA&gRWVmJVx5Xc>F3r+wG>TP&LdCrwExl<;)rH)=gcApnu11BfWs=}D2u9WDeS3QCw^F!$INbvX`4 zKmyb-+|_mnfPfsi979H^oDFc{Ko7_0(TLn~D*Gr`$pL_HD|bVBa`_$r5khWAm1&?E zWdxB3fkJTk2!I%rQbrMl+`;Plb_zTRz1%+w1SoN{{&_M`T7Qfgj8QF|=aO~U97;3n zNRYPu0Z1cJkJ=%4DK3^#U$>0LmD+Cr@TMy=n3!o5gKGd0O40R#y$UH%6$eSzb40d7 zfC324nzqWD^kQnj;5?R%f)gPGBM6io*hdY6L?S>b)Kp{Vw&bY^GNU{}1Q2eTIfXhI zPe9ikMawelmXJICoeaB&8gK7&hdGESw;CWe|T=qm-(2NLH0ZJ6OEovco|0V!P?Sd|y zqK0=&?-;7N7S)Wh^uV2#0gbb~XYvao=ESlsGXjDG0&pNPOHkZ%c<<5ed%j<~;85iu zMwoCoa6m!9LBdIKZXL@sC3LbvDS(BxRSy9vBbH_5=jOI+*XGU1&o^$>aoMW1fBgQJ zVX#$y{CUrPPc2=x{LFLCYj<4R%8H75rKM%XMFt}!rNt2|Qj>Jbj~;E;zD>i1r6_nw zNl|uI9Jv4hgPAGYx%Qe%KK$tIAAVTWyW7bhefb@=jOxmS5sCb;=$Cij`><`7ZdZ=J zI(g)9qOyAH<{dA*F!}dC{=90`@D|ORtp8_Q^X83WF)JR8v}jgepu?3&LXd}Ly2gsZ z48t&-RMNKXsA&MAX#xVtE2z`7L0y4@AVv(sV2pq~g90f5La1E0+HH@yG9GWko=MRP}DYWa{%+kS;VrtUb7vnQ((q@DLGt zvw!I?rju^aB?vT8TP4T1FwMw529WY^xLq}c=o&--0REA!a&5i49G?;)@c72D&Rw&S z)=*3_E4pC?U-)6=vX7EGcRB_mTi4a>Tat=pMHu6lO4e^;_3DyGshdU=QEl%hL@FPF z0#KL+d-;{gJ$v?Bwt52r*s*m-UOd*UMaz$7&dSZs{`j4j&KWYGs;V*)jQ~K8Zrx7n z*XN7rQ#y9+)TB`v5RzS--??+UkEgyi?d^%rKKo#wKHVHHC}V`ORLZWXN({f`g2fBJ z=+mdqq}N_F%(xKv(I;P8k;vilisxRP0)*vdWfS*Q6}D#G`ejSLoAlcAciwcRWthU@ z0Kf=IRvrFj`6|OO{@J?y@Xn28_3E{3+5jErq5E#1`OZrpzV-5*cimREtT;cX&UfGa zz!z^xDZr^v5G5YD89~g~9<5{16_RZE^2WNdW>6NGM zi&znx6F^ATBrs{4mdO}<{D~J!o3?#-@`RhOzsdlc872@S4|$O%17gzNy6a#pJ65l> zPEp;uFHZWvGzg(|{&x#nHf^32%i@CDwgUk3e)y%|z+s=wUI2s~JeoLo@JRdPS}t9= zu2=8VfBtzn0a*IWs;U~NUV~Bq*tUK5ks}qLVh+NUZpY>+MZ?<4v;fulks+T%Gmw3V zfZc<=T;<}4*bF|QvZDga{6f`hRVa1fE)tL;UF)IufdI(!Ruoh^a|J*~cSam#5*Jr5 za7PG%2!spd4sr)k$T?ROsPGy#0{z-Cy*ET_)P>peEq!(8$(yk1%pkx>x)ky{t1L!z zD|IbPzZw0Nw97@ghqPk_H(m1-Pzs_TPFF7Eq}1_E{2%wBmnoJ=PgIFU_eD4C;2|y8 zkua7+cTh1{fT%zhCjmG;$)ht4q%lr97wEJd0#&Dc&^R&u3RV)vt=_JWSXo$kFc_@L z?}FdKS{waWlg%9t1l21@qfT#YJEXS`zD{+&$&fe!AcU$|l;_rZsw~`Vk7bE6za4=N z7mg4D)v5xbmJ9hEC&Y!yTVxu*E>W3|ITuJF5{*Qx2m;!UgYwXN+u@E)2#H4{v4|y= ztlSyudQ1eP5zAmqhP(vIZG2MVdvP2D07E+wg#ZX4Ow-8DipQf702vvl(ghGgL@hHG zwGagWQVIqIMu1VE1pV}R05T=3n}5kQD%@k}4TCX*S*9U12BVZwYA|Xr8nrBWP8TRV zBZBR4!=Mq%ViX*kyVxc`DKJJ1lNl!C$Wy5lA`&8i2twp8RsmW{PeKS|j4@_e763R7 z2LcA85zB~LW>!2FkH;*_lBvU^5i@F;@u+1O6bY*BuEaE%X|jlAMJ$stIfo+U5pg%! zDt+iUoO5oPhH06E5Ft1Luq?xhSe9kF`N<6i$~p>Mp0k~aH8d(xAC%dkzf~KLhq%~} z$@$S2O)CXHqDJz;OKVtRK#3`}h|#m9kOGoG;4DxPrNAhm3=jk%X1}vyAHSOtf+my1 zVl)~d@hHv9C$SjXHXb=DI(LSt?_+i$A`;4gQlu2sGSYOE5g;fam9jx{IwdHC<2VvC zoby!5miZYaww1psu6p;!C6Umg^DlUYOZ|QhJ z6_Nvx6HZPtnUWdgeG63TPf7%$?Qn;4RH~Q~nzHRgGQ~L%V7ARuNr&4!Wjk^Z5sk)Qj&!0S5WQS2{uC+-t_uBU(?5pw0`O?Cdq^ znl*Z$)PF}Q`ZQE1GXsc&Jm1VIt5dda$6AVnBCR3(y?frOSEt~ycc1FqtV`Ye(q;e5 zuSq6BW<5wa7>zft*U|vy2*<5PDiMvmgb;*4%H~&IdwcWdt?#}4Dn_HJ>I5cg%IcP- zY%%tlOE14{XjLMyYyY9*I)#i9YO$nagA|_@i$sjPyqx(zF5b0gfBmxJO&hmXR##`| zWdi_$Fb!kX?|*jb-f`plMMKZK{KXe04>@ZJFi89f@RBBO4O}bxyEADjFO?47TlScKa?R@e1m)Bf6kH3EU%sI0@`TVY5)-mRS5F*4?-F>Z?>7hdb!t^10VzYiGLzf*@+ci(fvV-GyGY}wL(*8kPKZJTSa7`|%t z>Kb4Ys-{hv)@#vb;@Rh4 z*}U5jQeAoINY$$ougTBLvQsu93c>5wEjyBOt{8RWeWi7`Z{OU1;JKaJx696svUv93 z^G7x)tGo91U&r6^K#vnT1Hh0WLpyan`Q;ZM$<2=0wk@edrdsi+&{KJ+2-)K)B8e#E z1nLD8cVu+f{8ws;XegOq3t4+JYs6&=L=XZ9b@P9@iq;2JwdUH!D6Mo|t+)%~Wv7)t zr}U*JKooDf#W|W01}50$JeA_nn8mUH5tG%NG6K|%IR;(xU}u$3A<8Tu`UAZOK}XDU z2ECFR@*yNS^p|yPE19OmktUbIqpOX*KCh=&_U~d=Tk4z9((yMgcwI=NgbYC*_XP~m z<*~$gEl-2hrQKBInoigO+a*m0=>`0o+GCwx{9gO7KoA^4NZMURTxumi0IFkfUk3j3 zhd|ML8Y=$n(#TWAnG|)AKm$Ifs$mWq!umi2&B)Nrw9_-SuPVkNapL=9LEb=ATlW;d zdB!KvsE(wk7S!bf01!%)0qkNy{Z-3f-6|wI=q&H+c~6R=W;S3DW14IW-_W5Vp26;M zk}hbF5V->m!V9LQY7aj2%aRCLOjCmpk{C!2< zJ&jg;jJWedzS2i|3>9*Lu~@XS#{PBr8q;8HTerxLN0W)9Km>u&Xf)~IufMO)%g%1o zyb%C6j>DJ%1WeO7T9sV$$C{#oyjIN`CsQ^cq&TmrwDYnp!=y4KNC|bg*k4|en-$BB z$2fNYNF-t%u1u_7zow|LpjGq6YTpkK0L!x0Z`r}nY1Om|0CM3fS)vpHt8@KI?#Ush;swRyZSZeQi%E8_HjuM8| zRYx(!>(;BAmz#ayz)@QO04D^2lcGAg5sRf#b}VKIq+2%c=4dx*+Q_5;0Q(PAmX}u| zI;IsdOzPN9VPS4O7C|A@j(A1&z9r$wB`s5{ry$fyb}!hVbEB>w)A_VE4HaMq%_yr? zMtEMC;#{w`Oc4as$U^Un3lkbdu6HAdgbP6kJ^wPJRlDkmui)4JV+Z$BAqWz%qNGg= zGJH6_;tD9Pi(C*wkT9UktIZD`XrUKWtFS@ENGR2!gaPaY^dq3$`RYnp1UJwvJ0LuF z6I{9lcPc4h6j4NAL^t{X!V*tCC5%xe&=J)nIwQhOlW5?9hW^)#C?fheYKRIbcT_npl!(?q2#k)`NA&y%R|#j( zcL9)<`qOU)jFU8bD_jhKq%#D{$vKY`^|sX?^f-g)PyO912)g|ez?a6DhFfX4gx;ov z!}SP5mYCjj-~sXZQWYhgT6I{m`lkeUqNWMk5A5N)&nWKy=GaLFv0}0KTVK6jUVWHE z)Ewz`niv_DhHk9yoAl|A9Tb_TGBOxF45ZdD6gh zI(BIP?bma%@`?`~tptEn(zZ-ho=Iq$IJtx0- z(3u04E?YTr#6W3bB?7|BNTz2JkyY?UcY2GaEa49Cd;r53{Ba_-J zJY6^Zcatlv7SK)C+AHzcO8@5GId;>v>K=XeJIH{_iOaO70)QZ>BU348$2!V%#X=_8 zK(x6yuW#P$LAleX?2YH(^S+!j|A#&M4)p2T<(xD76M`3BFeE20ciGA{15Z5> zk(o@!&Y(}P?sLBQu=5GW13)BVjk$6})22>U!_3pFpO#2)t9emo!%a{Mr z<+w&2+BW^>(|2dh`MzP}dgE`tX77Q+gt9t?d7n(1JZIjIEm}0WRR;TQ9MOr@L)hMaanht@)H zN~u99A<(*6qq#HR`sTZz*Z#A)Wupdz&p5TXD4!7c@}oE3oBr9lzqZ_V`}G%`b9#1m z3;=GrVO(kb2C=9KfbJ4kLfohvYX22|g{V^LX-Qt5L!t!|5Os+!C3D6&MP^Eu+CD_g zo`DkdLebs$qe|$GWuQ^d79)X|)ql@fLtoG7?I@iD0E9>*%!sgci}uX^aQT+?hm+M9 zjal`Z6`nZoxV{(FPbO@_shgOTczLva#Dx%&juw)U+qGM|`U`ya$14MxNpNMm@4*mI zrbwotAu5lgXD(!b2twEoLJRsxXrTfP(7+qs-&#pUo8co6h{uNCI=0(i8gz%7S2y$&)f5W)v zGe9QNb{zsqiHM;0oKUYjieCu?{f%0IteuaPywZ5n4|Ro*?jEIt?uuQHT{70F(;@gd z0MiPh;yERbj%kzB-bpVIsPj~SiPG%$03<{Mq86zef<(20wUh{4A=<0W$@!001`Dv3 zXnn@E6jfzz-bJ8irRi>~Dv;UC3SJ~U3`95m&_63O+F>7IC005wb2m%JB7BxTobnabuKXmxO5iXoot(rgf_`_!n?3JiVL}Sqzv;H@J z{5@6G2|#Glp#J?2-gE9*{T#|YW>w$kE=-}_U_zTR8oA`-S=O8#W}X)5CSzdc;jt%ef7l` z4w|`H)*W};anp4pY}+xZF=N);r=EH~$+5EhaBfcQ;-MGZd*3($TyRb))x-(mT*M-g zr{A6a_N2EDl~*~5s>0m7`zJhd%_T#>o&W27ci(-a(n%y8iZv;R|M26Sge`8mdd$xK zN4T9b7~FRI-DAgG9E)17yfy93NpBvhsBuy?RR_0RFk;mE?@YYoo`=8x-|WgHXVh>K zdmnr9rK?6?k`;@tUc2%7>uy-Sd{sQ29kZ-wUV6Sq&u&*>%)el09+VMQXgojh`2 z!iWbF)m_cGOt~A@1Z`Hm^!I~(!~GHA!#aAzv;_lO%ci{Q@GUtLHpu6 zScU+guLBWC`f^y}MzXy4v=`YRC>{(kBHq)u}h<-}Fop zWiq<6H@?2FS* z{%P5&2yK7qg+ov7+g%9$%G39s)Ti6xUsm)wvF}CaoDKlzoqNuiXF2uj)&YPkE+0Ph zobuf4topgxAH6r}-DxvRN((O=KD7LBW&Pp;05D9`al~a8pO>3k_{*|2cbz$C*x-Sw zWa^X?dweu?^2{&h?mc*T%&5x-pLR+#Vm*HUtta+6;m5_xI-k&W=vf0OA^lG7J>$LC zKKp8Jr|w-wUU25d&6|atKtv&s%R{vh4TEyWY2K**%g^5T$(QqrN(=9}c0?>I?f?ut zt$&jyO@Rs`sO|7U0|(SAt4j?6gfPYci0$yxPCfCNS6=%5$0hX}m7G1WZ{2z&U(cBz z>lMA|oYPL~-OaWg%BbLiQr4zbi_v56j7GC+l8MTrM~jOKkMDS#?buoI=skDd)c2$w z-z->kr2Oc}%PziX=#cvLO1Ey`{?s#1$FplTiA>hve<=weswV%=rn*`<2D{esYUaDXR}icgRbpC_dDD=L_=D%vg#0!k3^bDkZG5&%Su#iHj8IsJ^&`o*FV0N^UYVx2k#{Z8qj zpaaV^&mMSk-=19wp*h(xL`+O=!bT<%Kf*6Dakh(IS2i(Po$nb}zuGnm1cZ99g+ zN{S0^xcaiAm6ci1m}xQuB#0;V>Dsl+@v&%x5YnT|@$Pw^Dg#P`(xN+Wx)J~^gLP=z zT<*^7*5&y2$F(vn!=Mxqe03R@yE49Lb78KX*E)2$h{ke0c9n1E*~)@k+P$f>5Xtnap5gD zjH*c{v*R&uFp`YjN`1QNy*F4-eUV`8dVt7VKsN=eOn9=%BM$9pdT&dvG0$VzEyi&du;tL9C zvZ}k7)>92sX-I*Jo=9P$I*=YB(Izd!!VvYIx_J24sdYU9?17|J5(YroGy$Y!6#KO` z8mKKTB$x5CS0?ackgUC$G2@82kHhe4{1l*>f4yqebbdG{l(f&UpTMyQ(D%(k)F-F& z-Jn7cX0H$d?d@=&7Xd*yO0_U|hoADX0m5J%J3<$piTC}?4Aa-T!5U%)0zl=Usefsx z@L}@`1ZU*{T-%idfhFp(Ht&FLAt{y87|TNi(WcyWocPU>&CE3HP^xyFd2<5B|&s*2_lpD_}4{D8t;X!V}To3hNhqjyo8=K z^({5^DNWA>dK0>nZgZwT@?Iw48z2x6g@lbzLXi+cr+@hQ)mPtg;=lp7+<0Y8!hZa* zXK%dz#%5oB)V6K&H{YId(+%VMpE>A?k;AG};_bJmUNUmjq*o`7y!foYH*UM{;U{aV zt0ql)X3@`!fBtFlmMvS#iaQ-XT=D0MAHQ4J@AUq?9LI@ABL|O^Pn$Vw^FM2m7>Ic2 z@X@Qs-0|)I=G;8~jsg8oTDju)2OoO$Ds(=0=e3$dV#?GHzxd>nhaPxPnEdt0@BFrW z#n7_{0U}WP=f-WzSFRd<{$LptLqs72rEgN8AAVYT z>#a9bClljux)K1kZ{M+X+paezJ(ri4y?puaPd)wQZ!1^McyDq}b}W@j5dt!|r5t)f z$^Je2wr<*d=Y#jQY1QbZm);zIC~-I9?(Ry6-~@M?yy(^~SW>h9_e zo!|TLt%}mp+i!pP?6YTl{Nd|&-E+s*Z986n>$9JK`|G^vr*~@Cv`e=`;!%y%&Wnag zIN+}K86Vv^2|;SkAT)1NNG8!{D<+@a0&L+4sBF8-%j4)-kF$c+xj)DNAO-JuM35yz zaYYE+OGyAw3X*_@MOfIwIHU(i3GN;@0zlhVUkNgJ)@SuhZyf>vSf-_n4)A*rbPD-! zOG*+_a8(P*fEZSKku1y7G|m|(P@5!_Z!QQnGn1z;!ajM`I$uKiu*-*}?(q2Qa86Sh zV+Hy7VQuA><8EsO@B&0SbqA~okJ19f5NvZU*zEr9HY}Vh%R)rXb+w5iTgL@@4Y}of zE_~R~*M^mgZz~0Kf5=A&7`Qaq4@+>}HXB#9_x*?pUK8$0}{cR!s2rqm%`y`$>UC+~mxjb|w>cJ8iZj2l{n z7sb-MD-Y?}`?wLug0)>@sgrKDMi|} z%8CllJ?(@Ojv612$MWM*TZlu)jo_RSN+IR2A^j16h=j1ac5Z*$4VNQAG!jvf;MBc} zLWoA?Wz$YS;e?43VzFpM=VsdC8VwrIt6TTZ$z-yuxR^1tZM(Rr@YEBInJ{KVUS3`_ zqDv`tjgK5TsQ-Xou~-xVYHRCac`+58LD%(Y)Sp!evTx5rI(KZtIqJG@nYJ{|?p-_e z?ABQT5!Wn9UAlJa+NGl+6vj0*;6;T67oR)jjLFC5$D+E1Cmc0q{D=XZv;4fcWvk!| zL_oGByL4)E?;Y1`oCA<8B-6E6JZejU3}ReAeC)`PLk8Nmm6w;t8MB4mvPFw4FS}3$ zq2!1F>O?F~JZgf9nd-ze&AR;Y|KEv1D$4&gWG}g^kpJg)IxYgB3{DJZ3DgRKS{rV1 zjx6q;6=&as#vqXrU7Bf6-r4E0_?q9p+RcrK9@CNQh#DnRHM{pW>l~eRU7M2+%_AW_ zY3&3Rc4R6#rW6n(V2F~WEy&QcsIHNek{IL8MKiHzMClk61XneQe3b`60+B4r%OjAs zWl17G2r!bcZH-}hae&5trA<3x=z!9)Y+d63 zfIx`0ZQGGZzOb!yS|Flr3&t5|SX`hkr4`7KND67kqMDRKN_E4LbE3_G2T~du2LO`f zAsi`XG-?2m6v8zvLD*)@U<4|nDijyy*(&0L<9<-2LkM75LgP$li~uEwR4Q%g91%^^ zLIh;~MiPbO0nziy0RSRODLH5P@tC@uz~P`kxJFmJVV0!z6^t|D+3-F99Xx78$G$;7 zS3uhab#9;tmnJDl(U?Wxgbi$0AaG*s`re=rZ1XD3t-OP^XGB#~uMm0nJ`mTKnX;d{ z;pY!uTwD?@i^cTfC`WZ;w++dZ_~wI^`}ft{@Z`}(sZ<4cPzo_L#N?0=NeNO4#yEzz zvrAi|yY87IIllOYI^++ItHpyIb)GqEHb4MQ1RQXcwd?P54$`Q(7PieeXMsJ6zR2@e zvw8bV zBE#ENf{_8ddsjR{$|T4Ck47(8s?$FrDJ4lDP;oRk=d0IkxbuOh2M!(f#)}V@l@tO% z=XTAPEL+j4RkOuQmfv{CgNGe`#EZ|~UszP2A&wa~V8#WP-TuE@k2!qY?#i8u7A-sf z+-WBtd+4x1J?hRqtx-h<0T3~UIDg(h3DeRzW1MZ;xb5TjK510Z!m`td_{v*ve);)F z&%X4+DJL9lXl&$=zKtu2r=E4*gb9b8dcqN3ef@pUzWuMbVp>gI{fWmMR$NjH0Gu;h z*q?v-?Mu(UFy(|}h$Lg&vV>u1O0}UAcg@)zsB>)Hrp<*jChI!3Y2D(mBPXs{wK-zw zd4(lcU42pWW)*#U_vqa9^Eco7pkKdkPdq#4uU~%n>iciTj_9xJe8QL^B$9XDdh3Ld zL;CjZVhg)*k$0cOKS%*xbJsHEq_^h{ldT?$AN~x_RVbNjn-ZI^)a}`}XQOpkME=zWn0DFTR*E zE!m)>UJ*2H=ODSvsu!MQUkw>0>>WT5Vp0)&MplSS)E3RtQy8SaxJ=CsE zGXQwymD%5a_gnWa9a}VS3;;WJR&Ln5`^4i98{EH}X$c}>3qQzU2DOA@SNPQIG7e;l zj7(z7d9iqg=Oz;-y2R;HJvw1AGsriqfdFcvvz<*&fdOsfyqZf~`x2R44*(JfL4d@W zb3lUtr9=Q=jNFR-m;Hh$)Fs~~1JP(CRH?c`%wN}5;z1#HFt{$H5Vo*wThsKwz#{e-Zi+^u0ASfdL3>BW zW>9Px;$+a*L9XT=0QCib$*9bnHnw(gyD z^Rm0oy`yJ~Lo6%Jkw8l3;V}q!(cRv17x00}9T)F8Ah+t4*2uq?~D*?<&XGRra%ptvBeyi}UT0l~7Y{757}7L`KUwshPF z49iN3L5Woa+ZIF=F$`gv1Xxgz|M!9g&%E$TUA;*prDbtMQ^NT1W6z&AoKc7IVNLA?VvL)h-73b#>Nnj`u zB~$W+afU)jNir5Oz%V39%d!y}NvUqo<(dvY@FgjwD}yrCM$XmOOt={~qJkusNohG2 zhh6H=!I?p;sX;s*z+a(?Jg%n96&AP64WoPVGG+Xj0o>i36!?Z25(u2zhZuq+KteMm zd$o(ae%~Q)kF9v?%c@oDlF2$ds#DWe{K(PG&YIMyPv;l|N}B)xAk|%3Zc$E16UUlY zr-3*kAxM%!0wB6qgE$U!H{y>B$SVgJle@{s7B)GOIVku5I7%WR1rn$T-yD&MY#{)U zaZafAf+0h6RHu51q%qA=J3=M}8CpaLAqbck7KBI$S0^hqjEp&>j)E>PXvAdu3WA3#v}9^5CM=NNq{8v2)9l8r^ z?yS>v4N%6T@uK3Qh*j{vh2xAfge80Fm@Td9e0iLs8Sz zA{@DE=A`RfO7CrFo(LcwivfVToX)lK$ucd@8RwdhlU*2^F>T?cbaL@3dfvp`qt`&n zVb7Bfa1W3U6eGntL;{B>RT z7YLs`_bAh&4sb4ekb~t-v@|v;(6l0Dzewrn#){HrFl2 z$MfL<3^(1a*Y9FzZYh)#f&=fKUGwke9F?l*+&pV_4>}2z$k(%q7EP$vq{2h ztn(g)9FH!N4Se;mM@GpR-_fK0964MTBY!pm1M4ZfgK-=;4Hgdp#^;#5^1-q!7-qk~tP88Y!;lDe~qaUuc^ zF!zstw(qE%b?5)eN($@ilbo?m9ols4&_>s^pMRN`u1{Qd-DRc4g>{Lf##zgzW#^nV z_0%&j{^qA&#|-P+w4(Ue@4v3xcR}+ejngG1QcBB`mHVqCMb~cH_UV`3pLon+b&2H9 z^Zrik-<{vKQ?j0)89nCdC!RXv)QNq1b$#~P zXE$x#)4D}PVSb)Fj8LDn=l(v|7A%oW8JbQ+hN17OtZrOh1OS$0yBpU405#5;rs+BY zK=1B{Xk_o$v8QpPVqvB7^78pt`zRN_z5{R}MXT;)Jn-Ow&rH>}W*4;o8fe zd-0WbKK;6P??XsRAw@cE>KqZ^*u%z6IO>?U-~HgC^QRi|xKua85O5S~(mAqNJXTg( zgaEBtG>*nFol0oHfb_;q8wbfFFJjoKbbdh$0Af)iU01DP3q;(zdv7d1-l}C&0MIpN z0RsS$G7F0G3kzcapmgq!e=c0KZ0++;J3DJ zwoT5s^5rN4izv5k6(E#st>lv#X6DURR0AH3hAA}^yC4JrF^GPg8of$#^ugm-r=VO_ zdRWnw2FTt0wnBirb_anlg09C3y*tu##7IEraFZJ5SKj%gL)(@^2lVlp9Ryn5Hv&o| z&CQ!Ow{6oh7K<8&kxHi#xrbPhX+Qru?~p?}R+N_k_&Xca%R)#1(li|abnh@ta45oF zOvfeUZNv)8Lmz_?fOn?Rv5Qn;C~b*4GKLHoX&|IzK%61+$h)6>Ra>*~)RT{oMWV@c znmfqe3to|t5D|nFQc87Sinns?j+fs;e;!=3OVfB=UE;yVo^IW;#aUBNHcg9j?vqS| zrhS+o0vPx|y$v~k3I3R=T-;xQJYw|$2SS4_^x<5XAp(ybrf{}-Gls3BvFX5Xv!uj7bti#29CctFspb2*4zvDTGC23n^?twm=C;sJ1UD=Y=2w zKy?K>B9e2HsE?VHVs^B&}dOA|hwR7zrU-H{zF^+W6fE+yDGZmmlBk`u%H%eD=&C zcg<|ouXBtM2}zoU8b`)4v||Ik<_G!$007LrFv`oP2+!jzzjui4Xt}pMDL0W%ihe{> z#yIC1(=^7pVodc5=Nd!C5jBoFN5-96IODp`b*?LV1AxALdVKumi$%pz&bhAZoU2XN zPJ12F_nXE6G(?6fd_&fxIG2I}uz(ZM`%zh+L;%1UXaJmuF|Kh^u!-_e>)U~iOTQWf3i%j6cl@&`ou78WHE-{ zr(g-0H1BG;Y(p}nDLm@WYE+P9-6~bgMXwYO6oC`u77>6EGPZ8vj@KUgA)lAU4W6d@ zkwqle>3U zsjZ_PQ!>VD>k^h_E1>LqxZLmHBfgBG@k_@54HJQTQ!FXn1PH6vY*?^#?Z2zmuivyi z8jZ$cQR&{6Q1<}DX{)4G~z%&LK3-t3uo}c z#+7f+G`;UonJt-U3 zZ*9?}@qm6kh=}WqKqiwZ+p+*)_uhR?nl$Rvp{*2xBMKpjsG_2{xTt8&iq(xO%CEil zvW3f*4jM50spnoZrKM}EHj&u1XIG~leGfUL!wWCG#5vozY4Zmkf8L|th>D7ey?d)_ zs_WOR-7;|SAONUOCWR0}h*&H-a`>Q48#dWCo_)q?jVf9U9yH+QJ09G&bC+tYkn)31 zKmYK(54LVtH=y6hc?%YqHcUPHf|E{}JZjA0pMU<7u4}e)?>qsJEva^Y&FVFqSFBuf z*0~o5=_}9XlB3XP+_Sq!UjuQ?*eY89L%U5{Yixy6yEh zK6>}VPtG{|yi`&S8PLlV5RK3&C!crh@n;MiKK{BJZco(L$Kv@2;`1+lTD)@Y>1WSa zy?XuBsiz`hb#>i}g?}D({L~|lJ9X3%$A0tk9{^C+xXBC8zA%2`AIfO53z-4(j>=g!)9%G%Wz7T0zL5kn!+_2eNV!UeKg>=;UDNup#~Bi;{-QLGP3S zAYjOG5I}_4@-WDkx#|q`y@9G-WDH2;>nqh*#z@_h7SM4na>=cIU1vLxl#Ef2Z@KfaC!b5E(g>hk%xM7Bp12|zXul*Ac#Xe_%uSp&xz5-`8#-ZHXtG|zF3hl@g&;8BH71XA9ppyUhI89bAW!B&J! z@&;0IQBiSGQTFe)Z6jk^V8xpJTHUKt)FwH1EIc=xU^7V0yEJoxJJ8t(~_3LqW4>C{iu@a=3lsm>>`ELNecR=HmTKs5`h`Bea9 zFcLK|TNvIj1^@u^fJzU+*{$t-af=VtKmWjhxny8wRd{m;H_H z?(8^S40IH{L$o={2~LX7M+Zo1DuexX{{)0i7DxQo$dW^^zULrEa-`Tnz(!xrIAv1c zL9o$;3`vk?Xo>3d5AQD9vAMQG^A`2>`*;x@aZZn}qsrBLl^g5+_-&0@m(J7m{nhfb z7yj;d*l~=@06Ah15+D)+Bcd<9`SGELp8ovP*Nck^JjwRgKZ`HD;-=SLdc19$77EOP z+Ij@)OfPv`;V}CsSwsB=Z}Lb8q3PPKx7|PY*WYXFlbnkdEn8i6^;J_RAMM)bswzZ> z?uh^{x%l$yue<7$laGx?A`s||hwT8+wyjt!cF(NY>7+Gl)=lN*rM3uOIwYx*S@ zoqxvZlWkiP0fCfKAmXfhW{(~{vUkrzbcU7?j4@lvY3E-)bilwF)29+jsZQFss|gTT zI~7ubdvZk)G6N!KbEv1g)W#G~UX!<>>EM~UK?5T^@&_(3r&r-lGrK7}yG$Qm#2kSRgn=n4{eh}$1ie-8yg z#yL$tPmcL-NHUO=re)bea?W&3^Oj3(Tj)Ah-3nS`E;)KwRZXc1Z=@k|Z!of}ZioWC zPGxdLLk9B!FA>5ZH@M@MX`D2Wg3ZWAiGH?>w*ns=!Q4Rk+0Mtz4B$^BdS7#9KWGE- zpqRa(#sFBh9f=v5&JmF#69`h;re#N?q!|&eX_jp>W*}!w3IH%u>8P&73-XERBncDctqIgo!fVI?b`9^BSv0v<<)zt5*s&e+pu=StlMsRan9@e zYibD50*uFFQaY}0Aq3-Eemss`t4*ZZw{QLCn=d`~_!F}qd-9vlKYn=jBSVJtVaP@g z9Wd$miAxqOefpV)TQzTT+2vR7+P3|HS$BN*-EZffd(M|%eAc5^XIlu)n2@r*zNW6W z>X?(xO4L_2F01(Py|)YV?fBdnBQ-Zzu=9~$KjsgJ2 zWJ-!iG(Q%P#_|daRIC*eb!oG_tZ`vsLCe<7A`!z%C1P<+Nt!}@L}2d8F*P4MKPzj~Dch0&|ag;l{u zBLfn_N}U`G!dWw3^sXcDb*mp0)>CJhs^2ff5#hn1P}m3o5QPx0z43ngPVENt>MVp{ z&iIpQ2}D9bDW#B-GfqH;j)_EK{rb%eAd#$FzG9`J>zpwm$rd&OTGHIMcMsQe1h9o9 zBF6ml3M*{lE!&jSO}o&24jwx zS5u^p=m{x-NNr$H7{oMfK|)jeYZ$MpuGzh}wn;@vNl_l-ngkS*0O0elzxwU(`4^mb z`iUnTaq-OSSFT&1wgpGDEZbCf0Fgm%zNu*rd0MuVWGh2cH}v1<&Rf56+vt%)TQqNi z#5%Tb->6ZA8f{w$VM|@tb)A!ff~zgZAP7UGN5o&C^^Bt)u!_@&8aumMKmirEBB`s?V9VVZ)aYq<7RT z$P+G9K$o$DP?9lb*;f1F7FQl|@yP>D+`Mn=rafDd>2!HfS;t0g+Ba@p94Qpi_Pla{ zL9WbTTor-Bl_ZcM1~P`xJ(LrC>>_hz%c%F=g^JKWZiSAsBj9ZfUWgHp1fi12LoiYZ z4_!;|c4b5Wa;_Rj$Ic7QukViw`V#!ZL5=_oibGI`VU^7sTBZv)8bhTAk9!31lRLKP zifJ!IiaRf1S`3eICfhWiW*VgCoJNQX_rddkWLg4&swrq+LB^E+clr<1D2OvZ$*C1GDYYAOvPDWGXm~2)vMS zgeyF?K~>kl*!Vmc7Un}6SkB5wn7=yWEj zY8n(oSHCHeu zzx#3C^y%m9+;R6M7oW}m(xxSZAcBaYMGQl&A8g-QxpVhE0{H%iA8PBYL&uHCi$yKV zvTb3SCL-e+S3|jR(+)uHJM4(otlL&yn?#1DWdnc^f+PVzO-j@!Eg>Z5OiCiMjYwqY z_MMegl@g_yN_&pHh@tD6#yH=$edm%DYdUsl*REw#+p+;s3Mqs@WQMLW?uVptUG3;` zZHD?d_>^sFwU7`YCbPH{vN#QqvaoZ=cJ zcfb>OBOx1q39%SRTSXiV>}zv6=y^bNT@U>N$UsI69SCe8TpUh7Ac^96aR5lBOeG8e zHE)A90O*FUXLS)&>_`A9opTHTAf*(xV4Nf4?x;}KU)5C4apc~57gl{a4FDme5Vodq z*AeDSh?^}FcDn*G6D&(2VT))qqNc{OY#}59Xu76pTnQ!c8tB#Imf>=i?;m%mD$9fQMlQ z3%lPk9KinF(lixi3`p(W{axb)j%vSrrVa?qg%%Z z?z`*QNyp5%;HqnHxb2r8KLVt-ty*^P*>mgGZ6ikx+qh}#`|p1?=lLfF4(Q*hQ>Pz( z{NaTcUwQP=yE!5hbRS(Tqx2!NI)fS767iDW93P8Q}@tXZ?ZprD8$ zTy(*?Bn9W1um#sN?i_D2n>1_v_@j3e<;5D8mmboo17pBZqNZJP={fy+93rIv1kN>E zT6Kx^J=a{aZ2pp$-+a6Oz&;UO0{~l?g9i_rb^EogS~RgNTLmer+rRJBlTW_o`kAq~ zE~V5ot)g*xRaH&O6jG{i`yiz#$j<`+VcGy71tEkkId$-#Cr2`ggd8K(eGHk851tGi zB6D8zk!ofUK8v|d67(K`+i)*tNx(D(_JXPj%PbSe^wFow1e>9i?{BDx+i3{%M7 zJ$wA{&8Njhg#aLhh(`?oD2PQ13*x9D5otO{SEMU%*F%py1;7Rm=!FQ6K74O}L7rh~ zmT6hG9gjr;B6al%NkY>MgEL!L@mLf9(xwG~NX+xq=(;9sTWLbuw$v^u+ZOS76aXyK zN~g{Iyu7{ptIwQ%*+a8#95J+io)LR(&eO3-6abblU)82V>yuA8rggK%&pmOUL_m_J zEf_*UL7r_3(=t(TO9~@m=$uO_YwPNai1EvB^PYR*^*3I5re%w!Lk15TJZNBEUK{`r zSw!a;VL}MYvKZ$Y=RyboipL@VkWQzCZ4VjTr&YUl|14a3+9{JfVd*W52d5c>S0iMp zo*>dwfHr9OAK0JZL$3b|hD6A4%J>u&0uvZyzswSXHX^vTV0aLm%qmiopK|mhu#y?7 z%-b>NI1nMAb{;-`_^IcOJ9BdXWBRq~Q5-3>ghhlJ z(-?AeZdpVRlc}LZ*XQR#6?N>=f9ll*;CemW#-OWI-H+he`ksH%)5op^a%v>E27l(z zIV=k9`3l#nRG|&Yb1SNs80Uyw$z63q&kgM5Rgak!JDu@{Ao$UhcD$QvgfVbZ`q$<1_b^@_s)-*B(=x$I$a6U^ZK}ZrL zghzeO^PnHe{SY$w(5=Ls;^3hoCF$JVnqKpAPRv0hZwxR4vS+DZ^cB88=&FGZTlp01 zjZTo#hp#TI9s$@%5pS+3OT|yB4&o4ED zKEUIsfG#0d#=D&i824G)CBVqx0dIItU5wOl3h0j3PyAZU4T%QBq5uBhK zNCGym*|U91WnRQEMVg2+GAtow3U{oqUVHMdm!9}5f<;o0l*EwL)z}Mu--zh!@O34p zqeguLi^wKIqvX{&?FO*0Igb0#DSDdMqcG#0UJi-Iy0000a<(yRZlnHQaX{Z$ve z@zTTRo`2!ZH{J5ryd{84*fvL2TvT8fhAo_!38 zyu6rakQpMFn|9`8 z+p^R`YQ)fr3JVx#$y5pvfBk*#^b4n=nlyyH+g z=_W`eLD`q(EDJsj{ureHEX9%0*9I#MR^&6Xqag!Lawk+3AGCl_jg^_>+4gdWwvkIdf12|_dfj8-;0+|KItR^OGs<)zWo*DrTu$%{qgHBYm!h> zQXG%Q^78WbRMout_PhQ1_c3(7zorfV3Jda%I&9qKmtC}Q{-3o;8v&E)blSAEcr=|( zCzJI=)T~YGR4NsVMu!X?v~tY~zlQ{-kOjp>BZmzdJ7#42_HERNN25CDc=-6yk34dB z<<4E#-#W|C^{5`{*SFV~AAKxXq^K}IFB&N?E&1)QWpjV|=Gdc-W(*}r&4|XMMo~e$ zNkzq~^;_S6=hfqnJ~A4OmX{S*l$S9tA__+Uuq`Vd&z~@6=$PRHyB^X3NdQ1h<3yB~ zmmiH9@pw#yTU9}ydv)z{+pX8exP9+~PuA8ah)7Cd7}3U!%FD}2N=u5oi1;OCB`sSv zZd6{{q*1vo?D6A9=w!e9-shb2SS+e*EI%*r*Le#zY}uyix_X6c3_0^CfGDIGbE=0- z0`oOg?sNcZ3=o`Kl4r^KZ3W z2&+>H)gDMHL=GZDfW^yK@2jpGF{rwo|JQ=Wx*lDzYW+JOe!6zu zmUuh{1jKnFotBac^7EQDYbJ<@WF(?5S-IxdKmIB#%-8j(B!-Cfb;%Du{c7Rje|24B z46CZD)~w#RV@KuEWh)bAx@D^tu}EAmLhNtzI9AL`)$#V{O|uU$b$0U2Rg+bpK4dBD*YTmko~83)$Hq zK;a&p2Y>fe2|*_1<}57-QDZjOWl>=0M_)U;2CPrc+^R^$$7mgVjK0zJmlgN_vgTrW_hM4GhaYOstZf3G^Nwhw8^q5Wr|eVwxv)V@gTTzIt5!7 zK%&l6XN@O8T8Qk+?eaD;&kRQtS1A!ux`%ClkZh^a-#334vaAbyoVY7 zD%a!;CFe)C;RHnJ@S%sO1KYBKuer0}Dho9wlv#L?ATjVe%-k=89v=`ya)y>= z@7}V{PD*5C+d`NqY-T28Nz;Pc-aYNwM~-RPrno9qrE?S{h>@^i)4E-uI)hW?4y}~3 zW`Au#QQ4NwTYvd&KG(EVD*eX0U+>*j%Xoe=kpu+Jv8bre*QxuMk3L)E&rVVuLNG7v@5Hs0WqR$v1oMR(lzVWY>CHWM6TF%8zM*o z*wV6unQmH9a_^njmsga(@alVYb@fF>g%-hA-~GC4*IvWW6`Kg#E-1`Pq|IeZH<*_A zXYsNv+ji)>o=BPB{_yLTZM*XG@|^3&+!!Q^m^8+Kq>z#^NT%(0e*U_RyXG%k0RV{7 z62h4-0s@o-6=mi5`T0!aTXybddUVtFy$X(xt&+ly zMx&8PCydIRt!L_Apx66Cl8zuQm)0$MQBGRZF0 z)7)++|6}FWABcu^kRy9?>P_(ANS2c$vlv&bA}R>rj=V3s2pJ(4gb0jkH^HZmF-n6i z!L&gV?Wtua-@=Ap2uDl<$^(m_qyTDb<#$g)YCma)6O2YmPw)sSY$1dY>XPew?|=B7 z2Oh7fsRI>{hUoLJzCC%$d5f2BN9!T>IqnACEa=%H8+BFyq1-kDfSn<(e&sICtLsS+gG7U0IE&Vy5}xIwUz= z*}i$pj(cZ4wP$ZVB1vJZ2$m40pAbj5gcIbE1279^CGYoO9+y6YayE-7bEz|rUcpsN z*~LNwIw=!3gV%9?0W1g=LR|(YTV{7%c6Mra@C*eCciQh`_;3d^y4G+a2n>^lr;s5a z=~EcaLWTJ3x4_KuT87g^c^@Lkxl~xWL($viANr` z;_q*3_U%3QtjRTXbw%YxJ9k%Vnl|&IbJna~fBIR|7cbwqwW{We?|wPy)M>kR@44-c zTXyZ*xb4JGSpVbJ`{MJp5FBeUj_?sncg3 zb@H@HlV==v>ZSW@lhw86jB~F!cG5ZLUw-S+lTNw*rhDq@5}c#j%eP_cj`J_Ndcvf$ zPC5Ik(W53j^7xB&^+`k5@4oNxDQ8`H)142FIpUOsOIPo&O}zH*hmzyNPrUNlyPsFr zr>38K@ekksvTFVM1xuFw`S+r0Z@%ZRCI4P~{hhP!e>fU3mj1iq*yAQoIdjIKVdH1r z_jtt6-+b@mV^2Es_F0b{J#p$QZ+!U8PxHR``upmd>MO3i<+V3In!j-A#FI{c`~43Y zW6!?)M&IFwoiugE@I#OP=BGb&U3>q7FHbn>ypyJ0bnHoI9(~-IpML#oG-3cin-vvM?+aEsX<%bdpB3gQbSI=gFNN5 z%G+zS|q*2wz{ zL3Hc3(L0|fol6+pQXFq5gofVrN(J~7yaohE1%0OyN#CZRKpu4%iriTS0Fr{#zBuqM zY;+d_J=x0C0w8(9DoYS5cz}*?&&Lwrx-!5mG4K+4qZG!6-l&CPgxg|rI_Owro+;w` z0o+pD6U6THVBp#saEd1g44QAm=Q1L)xywgF8L$s>r>xF~;(Q?l44ebIh#^>(NTh_Ok;eatG3cagBZY*u{l^iAccbC84x0f z;TsSGuX{t0Gvy%H0Pp%jvw`Gq=Tx{Ys|Q5tE~{R!<*+dW_U*5E>5X@fJ>lrT|5~tZ+ip$cLTYDBzx=zO=Qb)WjmC^Q&py_;ap~FT z%q%J{TeN7Qq2ZDRKmGFiKbK!|V-mDx<%JqXdiU#b=l?F>Uz0lf{7V)sUk~Z}lTSJ6 z-rKJRA(RtAHH&eyWLlDxK-D$%CB+5(`t_STcOD{q^V4tF-*C5JytZol{de3sapHIY z5JJXckyY!r?AX0^TjiE1Q~!SE>4)l)sq<&dw1FjRt0ql6{?d!5my{GpNyy#FMP$fG z64N*$Tz2_QHFf4+fBe~_SI^HreaYY&kx({(AVMh(!_eddCxshE?T(!v4?J2zkbtYm)$gf^%lm&CDW(PyyR>{ zC$-(l)m(nmu7;`PK#vZPFiX${OFK9_IZ%-QHD@j1DguvlmfB1 z!b`8%>BQds^%u=Jt9_ehhR$!j=@PE9yB>J_(I=iu)Yl8iZ@T5iD=s}Vl};bhspIgW zgJ(VV%sU@{ym8H@?mc>4b=i44wr<Det z2mptVANkUYPh4};?PHHPHm2jQ9lMK5nm+gJ92^lf;V~#lV(T5)$JLZ@hZ@%%Fryn@+)M+Co98!EICWeCDfsZ*{QN5sOU7PQ0zsz&{32zmyNb7sC7NFEGw z4NISF!BtNoJnWfQ!Eyt@8N+YnY@GW>rsWFYfbdL^a3Dw+E;~y~gk_*_C`l=IY~N8@ zP#Dp5BGJ1~zngEo<@TGeS+!>U_uu|}`>oghyK>dNvu+wbc))cx-+%YLvyVIGPy~uC@x(8}CYWXvcN!*4yu?+n0Fpi3k5(vAS8)WIhSgCWgw{6){N=?@p zGLpi!Z6eY%9k|kNj-Uvc#Oj<5puaNbI`loOA`l5F&9ucBHw?{{d*G6b;|!G& z5T%sTwk78pIkED9$)MyScSXagD8pP-*Z)N#1_YM!Y}>XhJ9ta6@A2`i%)k(lE93l1 zL3*IsaVLaH9{~WR_oM5j6GAfA$r#EXa3uwQ$+TG9+fK7FN)V!DVwa#O^|TB6{UpkC zumq{u`8+gFwIFY`q<1qRd8m z+BN9z%?g0+xu`t30T@KB!HcHAGswOCu4JQ-GcDX6fBxMAS6(4LBY`7xgDO0S{hA|T zfI`6Uod*a!Zq2|Pp4&J`Y=L6^k@wej+(#MsJlkG!a|f-Lkd@*u7X)??2l|eISs{@4jL)J$JV$}YF4qL483o$w%rsFJIr?vdBbUOcFS}+$K+chn5!gUHPAJ)XPySh7 zTeW)A=9?a!+@9x*SQlJyS(i@T&N=_IjT^UIaN*_UjVd(GF1_Zu+Un#RFFdqq)Aoxmy?WG;K1Yln z6&hZ~7z#wtxW>6jD{_^;s};$Gv~@$0w9tS5&rpSY0K7a5a8cM3;&qA;Qq(%&pZ9t%V*y3 z+;gv9bM=hz*e5P`v30 zX*6$>j`K!lBhjnclMEPWlK&4WaTMxV;0qFfBoN4%T=5%N79fBoK@ufRcH;Gr-vj{& zEntY86XRg$xUWiVU8ObY09*%Y1LLmXbWhQ$P(D&#deMxho_Ok?e-?M|dPpo5+rDSt zyg%ljd%?8sUE6cUii-;YAdyI^Q_s4gGp^Z^uDSeDB8nKgEk!gEiA5p+(6n*m@{(e% zArTpde<6}(S-P&j`_{)T+qODl!Y}~n-M#Y%Z$FctmnVdjB=h1im9svXB%)}$blaEV|;dizkd8G`N5Fz58lPit+#;FE1X6I5igJ z=XrE)+qR}@YKNYx0sy3xhGuA5L`Xpdg(?)izlRavzla~R;`JQ77dr>XQ6{r^pE3NR zr?A4-L1@X-$K=80x%C8!^Q`^so)Y;imJNNglN+R&$b|sGdOY|O8l?ky-wt9h-59*S zSd)@$DS!y1Y*JD7@clPVoH%abKTEiV1N!$JHEeKRT(?ZCqO9b;JFY$I$kEG|t+XwB zK>vP22lb5_Jef*YG%B5S$8|>^J#N{*|3;1Y`0-<#HY(eV@V^_bR+rIr>fHX#w_b15 zsDy~h%gV35;?g}kb_0N}@zYM3*r`L?pMIaWXLn^uQQ??Tqx$ygmPn-H(b!d&oHJ~2 zzeP)zgDr*)={I6Xf6F!*G9kpke!bp#YtHkD@4YqW&%ggE%+EXWh{H-s zii8kq5_MglIrF0WL?Sde1g%=N{_x#5n=~$!5*n2kz5eXVwTO*?aPzurBoYibOR73F2!yLIc(u4SS=$#uH_zPpGU zYU3dyD(h+HB^OMdyuTnnUrifhNJNAB^nUY==W1%}fNVy@bgi_cxVRwy{dZsQ(5{Vb z3�lkKQ-$&%Yy4->^FQlM!qRvd!ckR|A9*aZ_ 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 z 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 z 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�}xYc>elu{y{Jp?H>&B<^~h-HQsoih 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%0D=7C;v>jDUlVQ{I^x5u_!U?dI)`JqimB znmP5D86%rpVl3H-7%wgQWk*xPiF-`DV7D0(u%xtY)tX2$Lun<5q@b9?dD_R-!e#R(~zE?2~x~$vDDbg((bj@3qSwr!)>j<{Pz24hwl63 z;$`bMwg7OHc9bVlwUbhb#E5Ri)d$W!?5uxY|NMuJjie0#5h-J~GC_(V*(+rPmc%3h z<=A-!|G24X-Fsi|y6gDA?=>wfi4{pfngs*Q+VzhjK`;ynL4xX{k$+u$;4z#QS|214Qz9zy&x7|EGPM8y-u~ppS3WdM>&`=WFO8TfN0ZE{aF8Vug4{e! z1cA%4eBuzaYtr_7&URp?fb(dOtb#TXI^AF(>cp7OZS3Z&%-%RTfP@Q;Qt+t=T4Grv zq`*GyY*Zq%<+C^2Hdg^ z8iolkHIU>TtwfTf0pTzSI&fdEs6o6HQzijGB&@Hyk=q(cD?IoB4%~w*%j?L6b!7-i zN9;3CglqVc3vkgtsj-QT5CddI5VO(PM%9ExpV3o~peezY$$RgOqN2>oYV8SjlCWDa zbTSR>&6Q=yi}0r(V@D%~j70ZtR8~P>e1z>=(6btD05uV;Ff0qE1T(WDVX(naHcHCH z{s(cs!QK0zARo#hA$+nk$O0svgH292R9k~% z&)|37rhngx;#%Yvz_!^Vob&>D=TaFTN{_T0fO%kl-eW$m-9W=e0*uNEefi(fy$;X6 zgohuZkV&`Q3BwJ-)UZr#T50<5?HoT{33AwTnh-Mtl_pdK2AM@s9z)kV$w!juH)r>d zZwO^#u-O|_XO$h?Dec^2t}{l^xirpn)oDN8mZRV|fBHlKzOB~TM#~usJoAYG3kJ8w z3c6RFebSjvKJ;+7xTt$gz1BJ;Ddw~tdH7N1&OOI_oJN9^AtSWcu=ykZHFTe*{a*R_ z?Gukb#Zt&0P;tqLmkf#a1CVkO(ERn!i#D(MqjB|yy-(k#HQt78`1Y6Y?Y*_(=oW4{ z>FCpc0AgtSdHs*e zep+Q1rpr9sv5EA5;8_d|fIy^F(wWhJ>cwYXa{688yz;?wk%D~32~t+hoa#iPb?AWM zcb%+Pb{?k0C_^ zpcsNaTe@h&(myUd?$U;hTkn2$!J9w4d*Z}H4xD-5=n<11{q%`9o_@_y4grkh$X%u# zFmaa~ue&yEg{zAyY{%AioRiKW2Ooa;phMDY41vY933%3S}RY=_>pk|mt_kFxfNON}tUt5)d|QvwM&E=n;b))g^~fvR zufJmJC0A^o{C1DN-KUnUfWt~_iw%Gq8|_cN z(neml55J6U-e$*B#xt+AP90p@p5VBh>N7yko>mwR7tEMlb-;|gjhj=Eu;XUva+HR$ z3-c0(9T|Q2zQXIT+vv#J;vxs&q9W399dFktmbI1U{5i$n{a|ff>$Jr@JV?kI{akK(bj?N3iLFo5wIwZ+fT5DJa zqQwG0aRs5>FijEy2C)#7pDzFyA(2YZ0Vj03^yGr(CMOX~7Uc`2ukI3}F?)ySPw(^88!Z=}w&BXVwmo}yz0_*r%*ZLnmBm{thYtzmhtSjx zAtWoI6cfQTNZG6bQ-Vme#C0MC+wqJ(H%QE52_!NsKAXR%^`Ep)3}-7y9*t!AW)gz* zLc-0L&;=1Ay#sQL5&+CDQKh3c7y%%oL-P@|fXoqI`lybVb{I(4Zm;Q#R9$&L{mB-| z-NEb`j9{$+_6k)=&^!14e#gxpH*IKEQ1zpV&;I+o@w4lmz5Dy$ep)|i_DMp3qNT`n2=V$OKRtTy!uHL!6^RkKJ0`G zr@sBf&tH7J^732u>N~7l8shuUHr{;U8~?a{pZb0!?(Pth2tpGZ1}*ty)BpbSees>6lL*DvoqqV%5UPu#k(?Qds1+qA+q2|Y#@{o_CTj2>U} z>SI6Nd+n!*wW@Fc4mxwp5vNbJQ%arVh~;B!!C4Jv=!$@6nZ64+DhR}||+o6TS)p}dSe zX4~-6P66RFXm= zH(5~D06o+UE+EG)EGMMQi?RkMV=m|;z+{Bsddg}IX}|!$tUU~lofQ0g$uKz;hwvPq zDH8SP8|);!7_M+$dVx4)!?9tQ0p8_>eM2)#gA5Z&vq};(j3^nN$pmean|U$)2<0#l zgaMf3GB0v7VM+k36&oh}CGh4!D=@=~kU#mpj>AB%(cdW<{CUf|%v0EMzxP+g^@s2H zefnqrYfisNwyExY_7o-0fiSRnciuAl+704B$G*MpIv|D|++^8SRUks>&%Nh@{!`gN zM9{GH*$x4KU{0k{GsX;ltp3bh5f6F9On9p z;vGsY+OTbAuUcr5f;Kj_uU)@k=I9Y&H(jZMlt!K@wUmqgSjVl6wH4)-6!S+81mGwo zgiI5LVvfg>rBQ3xpgzyP_|BCte^Y4XA24pvH;aBvB^}2r=>vy}!K~O;I@#8`*U+9b zcA5Igg3rPQMTwLX5@JA~9*dSNU2ogZV^Mfewwc6XHKge3_x18!wi^)(Wk&TXV#?M#|)i!{!Nd)_xa&dN7t1W3@R`F z*FL*WAJF^gf8O)Ng2l&A8J!;r?MNw>25C(~G$$32GzFPL#5FECXxCkP_HdU$Yu)BJ zWzq0i6GzP&(Bsfso_cZN&u8y4c~Xx`KzV-JL26<4S1DjzWNT7?1x219e%(`ga z#$XU!PiMn|knEnL0N5HsRgpOUWZZER0K}63U~4!I90$xS1WCf;A7E(Y6(VFn3S52_ zh7IxFw5^@m+MR#j49he|@9KQ+*Gg2qqB0}nztlt`euN}uz%Xphl{ z@9Bfqh;Nr5-i)ouDVx_Rz{oG}DgGnA`rFaX~@kcgFr!nE0R%Pri{in0QCs;RbK|NS4>WiHPD z8y0-de{4ekdN>XMC8bv=jME{r8PW?9iANCRt0ci-Q0hRpfPW&FO;8;h`P!eSymVeP zysOsfwiRjIO^6PDN#1SVkT`HK*~v9s2+QnSIQJXRuFN)od}CW{X4YCmYaI+c6fVgJ z;W+}p1Txq(QaEA6p=a)S@*}t3bW7vpLK0p z>mxm@d(d78GP|HYR8v)4^WCrCuWVi` zAv7?ncH$-T&n+>EuDto5Uu|77wa>(H{U^Qu(rZsHdNpOp7$sj?^x{7szjj-EM}A&Z za@c9HQ%))#OSC51^C+Jziwq0o9%Kpv5qS$CgdoF|!f=mwBW6S^?KsY!GxwOk%U(@C ztSbmbO%VZnc$i#x0>V8%*X-D;y1d8ap5vws8DC=M#S;lr8m1vkY0VwB%is1q>Dq?amkLAVIwbPCv*~D{Q46B2S~tf zaawM9@wOKiznuWW(GqQ-tf&%T}Ua@Bg_|0U<F6d?A{1^5#iu;c`oAZq;A>nvfD_98!7Wsg-NjxBa{+F=nuA+Ztc+RZ0jdj7llR zM?WW*Z;a=eM5K>BuHf!_DmHCyzx&p8DFEPY+mb7PNG@Hk_P=2LmH*ky+e4o(R1U#O zveTBDF)w=mO+D|ps@DNC!jA12k|UucbJ81*G}>dTxZJw<(*Eu18toVi3joa-Z*AYy z{=b)Y2tnhH8M$b680zu2*kyO7fWF ziDm1PmL*J!)-{1+2_~n!M3nY07QE85rj_%fGCwM;ka+Tq=7ttMWpdPLv%gzmheM*U z(8$jh?=EavwILOa2-tRcp{T2%A^prTBl7d3vZ-0U@nzC+^aV#2O+Bb=#g8q`Evlgv z3zwxz3hAsPOD4}N{PL%^?G28jdE)r+v3uvAc0|dPk$HxoNC@Ewt=NzfM5aOOnw%}` z+e-_{6l7RXBuWa&G^j9Nge@{8WL6>$w+Sz!z8`DolPGhx>Aw>`oxZ>&7Ruya>R{vh zN|^uI9YQDc%z%eIq}?%mSTU_Mb(DObj3WU+P$#>D1OITRuhCiK%pOHru6Uv)Tex@) zYALaRj?P!fugm z+nIod^{S~+oOIFb(=ML-{L70Uy5ZZTtu(YS@y*-o*8X8H{&Z`q4Z^~Kr;IxDh8g3h z_lw2!fyYny+hx1-9#)cQb#^pqJMIwS^H)~iaQ+ARc_l}jHe;8)#ys`tmrvaMb)sDX z*tP-p-v8ywB|BV*blr-!t!olmu?VsacLGzq^2gR4YmxxkR`Y^SSAFy58f`N(+cC5> z3fl$%rJ)s+!^+Xx(E!?a*h_!dQCVGj*x8dSYRVtK?Yr%3+hLpQRwu^K>3PY5RoyEtx_*yiPn-VbSAX1f)qgnpIUn5S#JxDoOJG- zBTk;((wchjg(a}D{MW6&{@OhMfQctvvg;pfTW`5~L2E-&*;w&&d$;bD$6Y$>*uU>K zW4{q$8G7}F@4xZtWi+}oJtqb)Av@Z%0 zjRrJ(OPisD4((3}3;`jKLzWrrAWdfIjI=v+2_Vb;HTxDXNgsQzt3HG8vfqq;+WB?< zM(9HL`q#TPbKORMLjWXjN8&@51Q&*2?fIYq3}PlSE!z4UzIuVbexA1eMy3gpAObX` z0ipS~1^D85TKydvM%s~$l?}&ctw4g;EK%>?#~(jV-@d}1J<0DrfbZW%TLXl|reEp1 zw`k!@;?rm8r%%wjgYpWnkwBC$yrCWI7L2!DLdA3lX&K8G|Q zB*hwd@#|=6AR&kZX`7dR>a1NwLSowr`u1)9_B||o0pGn&J2sM#WEiyiOMLPae*TaQ z!#nIx?-T8EK-~#(q`|#FOJ9^B8((>&4qf;NS7%h5CBUeIj+Tx{4wfYf+^5qyb-l7A zo%EmGU&r4&z!{lck$ZJUK}j=&ERe2)N`_9iRmbMu==!i_FgnT-hQv(TDGHgDrcq%U z%CX&OY!!=j7j)FHp5uGg-0{CR-deuSAR1IxRaR2?0(Me%Ri0_iOJ)3d4Jj=nDXnE2EJ)RRw!a8~xggZ++j;CP^>_DAY$r6(B6j z0ZC!Jyy%B}K3~${I0Fg`q7~)MNrGX#^z~2A{IIM|WB$NC71ia9F>NcZsVr9Ow|>5E zJA`Nkep>lQRY88#3V}4S+|(3L0d0=mtQ;Z4Bkz5E&eI<(+PHOSNoiSSsl#OZrn-+5 z<`70F6y6ozPSZnr={rT@0svgjuA*S;LQhM7%vBmYT(i@`W}f4YS!CX{<9-c1H0wj~ z4JeS+ggTkFKQ|Q9u0^3d7zPZ3gn+b=jFT4P%;Qm4P0~QTmEa!g0F4bS1i|4a@5cAv z^Qd8Lg|%ri5wBQ*mKH4g5gXS~e$;vAos``!4mmn5_kYrs$E|HO}`YCR(X(v44&nl&N z(z5e1dn05fz-~^p>}cAyzTt>Hk9_Re$M1XKwu7hd+nh=|4eGfkpJr1hx3sU@xZ&0d z|NZN_-!K2yC0{N6rmUjqtyf<^?4XnD^K0ANlkH2^{rjPtN)cJLc+HF%(`W5Ici|Ub z3?4fCq1zv+&aaBuiGM$F`@e6$cJa606cy*IRXdg}TXNupy-qve)Qc{@;M!ZRfBdQk zE5Wg@w!7UIefPFe(RMNMoyX9t+>3s zamSW5o7b&bt2JMA*adGq^V(InUwhw0w@aCCw?oW$;Ui8g3+cvLn{$s;sf4kB&3_pO6{K%C6iFC-t z9#mh_vZ_m+h6u<(cK-swg9aL3 zei?u0#U1~=wtRTl;Bnyd9lA&1t$nxLaLv{*RdlbBzpqT5b>5nXAMU-&SSu{_!f*8lU)jXY=B?9A)}*jzteI}pB=*nN1l6b)26kF=@at+Xv48v%{M+qMPYk$JLb=hbSoF0F!9df zDNRkmwGA2qSy2qk0QoM|zUx4cY=Z>yXZAf4AuIof7nDSSLO%hAkFN6vdDc{V6J=g$ zCxc*kaekQ|I(v^GL+EIU?PPytzR0aj;WZ)1jyX@<`gN$ly6w@udriv&Fk*b=l9j)b zKzUWPAZ!Aj_h4QqRA5D!5sH`-de>XYA{cFmZgl8|Z1Pv8D+V&T-L zO|L{ zu=3Tj5B@OwkRd}RRMZ#s`yHu=|MmT4_m)(4&#SH|YvXnafFb+>F>duW5?oVQR+yIu zAY$YX4-b0n(WU*zR8N>+XBtLnG#U<>fSWRf{i;M7kQ#PH$T;%!5mOH9(Y5Iu3oajxN;r)ZjS^b$^3ujlxbPpd4!)%4z9$WC zY-j@@4T-d~KpHdhsiY(3)d^|*MQ@-?A3KQ__;a-%N`|Xhra1#`tA#EhBJLv^NJhd??0j*zBgK3%7z8)B-U-GdHd#FdM}4d zSSgkQOzbE!Biz0*b=MV^St)OP7*q(Y5CPtQk)OPWuDA!|=HcU~`OOz_(;Fy=>IW`o zv(~uqdMJWayx=kZ{ySXtGEoRl3*LS}J^eU0u7YFgQM=J8=ZijLdBa+D-xd7z&&l#U zyG7^icUVe-rz zSn?Tnirr4dXZPcOw{q)hB*V1-DLC?G@*@c;;E9lSNJ_&2+{r1uPj5TjK9t^&J{6}e zCm$5d0p^ecKu{2x>f~8IJ-Wfs$UqyNM@4jooOJN|_OkkO#vkZUUNCskpDSqruR8c5 ztdl_yxizl6Gc9+Wv~Ei#TavbBPG}`agbY%SYHe&>w`rZhe9oRz4q5W+&5yl2{KDe~ zRh6E(`{e8X_v(>%JvF6ok3~zD{H)i5al<{$&CMFvcX+>7=T3R}<+rzNYv^BD z`pMFzzb#vJ(UAvEsILMLkHu1Xv6Q3E-euBDue^8Z9gjY6){(tRi?r6tJvJlHSg@HB zjoX!-GNpLewSI3nTZvwQ#|rpO4sg7BQADS#kD>$4Ei5 zh7Y{W4E_DS=YH5_{KidNKl|ag(+=1>KWxQqM<$(HUR$_u#l~bqv)vZE?zp{v+|>He z^Pl{(amT=#vd_Qzb=1hg-HQvD**#j!UM^ol@AzG(1e5(u4x8=dtUdRZ4nzg+gpj?f z0d$^ED_b>mTW5Ye9X3tczUOS#kv`k?$F!5aq2m=eTx^WXxsStSN!90wQU_9c#OK&;O|!efO6nCxaB%L|D0a)D{AWH zzy96!pPPiE#NSTC;9g?tY<~4wy!!$6+EcTV$s`y^*-#A9&I^<$PkQc6KI1fu8%e+Zibdb@$VrIiL2EcEkbn>%0ZGsjj^SP_ zopLhmf3PepK({I!cCdc_8F9mn91_qPwqju;FN7DK)tlGxnw31LCmnM#Op7-Dh+A*q zw#``fEB*6Eo<5!kSi78Wx?VRm;^`--XCGX00jeq}9wQP+CEZX~W=%r}%fFq;=bevZ zj>SRq`NQ}1bFb0~r(nu7+P0OQB*z_2In=8!9k{>x_!H6G?5(=vz%Zb-f4-psu$=^J zv?cwe4uK_o|2bcI4eYkm%4OofgX~Ct(Tl#B6fFX4i7?ljyOFeRF~EcF<6F0i6}nj%=0h0 z`l5HfdB46#ZT}HNSFT(0-)A2+<5HybvJEQ^+v~6&e*S*pFJIZMYUJn%#~yrC9;~w3 z>Y8pn7JT|X+F7hp1to>y?!^=m`%K%Xe?gy?wzjJL^1a9I`DX9eRC}uT;65Yzk7fwX z`k>hdetF=cb(g`k%%b`5HX9WRa#nJqa9HYF8t@o zSDgTKK#RY;?4)Pjdj8O9`wr+f_<@V=xxVVg&%gM3`SKqtODoPi@q&x?J6&sSka_-r z=Lpk!^7+S~`}ldXdG;>zFFNJY2$`*t`&IWZ$}7;sLwgQ8^}JJGdimWiSAI9RX5ffP zqncVHXnvI&vWaw<4YpUeYae zUNo6qGR^)j%l9I46Z4;^k@VBTYQLCuZqpe6!|(G?G(y0S!gK#*fHk?077-hu{3uaM zUUy3aq(VDRIib8yc_?D=f3B@L^Zbpco%=_$hTGRUV}=(@9$2{HhX$>iH#ggYA}1YI z_VjaGZn|~#6@RPw&!Zd0?ox5j<>l^kAMDw7(qZe~`%oS}y_?;bil>TAlMF+c7Nh_H zNhcZSxMC!=qm8EaxC5Y|$h!KRn%zEHQB)iPP|+=N=WRXCId9cP7p)TcAuU4r;rv4n zuI^TDDHoVia2%KbB#78DIP8S)y(tDHp`Be0sqR%_78cSKm(^YQkL_oiu@PnhDZSrG zRkKD%Qno(ph>~BHC7%E9*4IDUW`%TWr8DoqZuJ#LNdaAPUH!FJY&qn#4c)5j&1-aB zacFq2aBHi*HI-cRUhCK2HadP-5nbt1vV#U9^P&KoG6$Z zIMKL1e#YMuXiA_7FT7uSz%C(XFhThNNm+%j*dz1+JqY1P@c1Z~XF2(wvotP`qKG?< zB=zaj-z3_N>dXxZcdJPG*XG=uMY=&Qp7}PA(y`+<>U1m_IpS`e3>cTC%LaETb)}mk zC~24j_E!2piv$F;5OV9L_V2!0dB}k?dQA(rx22>>llSj68NHOFSvg8O-VvK1?I?Ck zK~PCnR+5v%DNZ&wMhk=#5EAk2>ho`ZpEr5hyWeg2_{|j~=ajNd!a}M&nY2^Q4arcM zA&KBIc#^&CY<-cuM|H##g29K?XT9#4{dEo(GX~gtY zCu2!yik5}|{Jv~MQl&z9W*bo)$@Z2MfGr!gDUKHvhF34!VK?ERe-19`E81F;kpgq~ zLxw!}_;;&+-;qbf8`d`JA*j!oiauj10H~C9pxFT&tXjP_VW%{+N^!fR zmag2fYRQg`>$XtVBt`b{dS zD$94vvwABS$YLL$2cPB$>8hVQqr4pANtZqjwvJ{}TITqq>VMwp`DA)GF#=mB>qEM$ zfG<#5bE7~PY4tK^_y}B(wdp$5STi?v?b{yQKE!Y{qj~pRVgC9VzWNyCRnfkuF*Kff zMBjK8-S8snMEnWVP0`0yQkz8X6= z06=3aHn#wZl1*~SSJ+H^$N|)S0=NwuHekhOz=kIM+P!q+C1T2f*zXu#@}2YaQ@W|a zy6r^>p^_=8=o>oa1bn_Q`TRYiM>q4Zf1te)W*BabGuNa6Ar`|Qt*n6f4*mKKSokAd zcqz85QopSg$sLF_t9#Ftk-l`)8T#iR)DNG@qt7Qv*b#>l%dB-<(rDbk&{)0*(ITWQV4mmAFNeHBqbR$1(4zI82TV5uJ4B;wVFoo<>QP#bz2t+f6^*`r;IZwRy z;YUBOJbLQLQ|3%aIL^}_e(~r>Yl;L8+HLl^2hOj~w>GyrHN{0W6-D3tvYgvmhg8=c zy4SqpCJ%9xCV?$Gn%di98jyh`k`C+crI7+lfauUEqgMR5Y;4aeMclixsCjFnVwB`r z)m23yAvAGiL4J?AN856W;#x%i5v{fFeWObl9FS^@1h8ec-5`h1La!>~qPk zQ{0p2@`zPnu#_~ktnlK~j=1fvhu-|*x09xiRhk_~Yu2vQk`zK}T~#0kmPeJckDE6m z))s$u;SY9e%j6l8&e(IJ)cWW>W^P@#>B$9Oh7$I!b7!8i`#33SM)!)dPCDfIw?4f0 z&5w$eI&jX6Q|3%GrHB|tkJ_@O>$a_EXfxXr_O@-u>^b$qgXSbt@t3|``sw$-kL%a- zhW%#sD9Y1HyZo2{O%U8k!l85vZlT-ajC;PJpI%EOWoO7`Nu^aV3V9v96;9vqErBh!g zsw#vV?RogI&OHxPoTTef+q*k$Yv${()rEy}&)w-jac#vHg85#-1%X#F?Sx< z)C;+U?z)q}8j`j(XqHa6L^ds_d+*hSg<}4EI_G>$nFz;*?LaGUjf7xBAQF|wo`86a zZ@Zg6ct=Nz#c?N!i!P#~LTAgyq%_FLvus-sXpg;}-QVTatF3$sj>D;x&>F0n-PEQm z0BxEolyBzc0U#z_n6C=TXxR$B>Yo~%G9%X18Ie6FszV_GgrI001gD-&qxA?!DH|OlI!0@so@!ekqxuztab7 zW_`%S11qkt$_q#O)%Cpb@*A3x@u-z&g{_D%`f8R2d2n{H6pMG;R6qR7dQK3-i_&tuUtL-(k zdtVR=@(Tcjvv02~t@`)L*OW$zH0zKwiJ+k+$vtPz@7sSs_sTk3+fznP{O_IjClZ>$ zTB*Jj10J~G{_hW4W@}wuQrbJeP6AqMhL$>X(LU$Ro3Pu4#s-^%ZtRp!mTK*FPjsx^(Fk0>?vfcvOL-soFWD+_%Z436t1a>p!Xn>jb z-6OBG-gy4?9oyD9gU1&gyH8%!(zb)Sv!ahZQTO7zP4R|gRc(0Aw9?+iLf3~bx~cp0 z5f%s|M;BdpUH5p*i6?R5QI&J&R%@kN+Y^y+X!-xi`}E5@>$={vCPbOpk~D2>(Y3eq9MCHaz>vJ>u7&cy{XYD7d(&n+ z6b+3SQ?UP>BGWDKEh*&X{q$JDVY@}dBVysgM6%r&*gtRoUGfVGNhv<(*y4%`X}2T|8(DD7{v{>(P>RnuAX-yh{n;liv8H7A zBO)V5MElemjm@c3|5n%*Go2P8WhgnNYU&Vk;z0TDyUSmGv$?%BIc8GzN&80)b}l)! zxU8?S=%XgpZjYbU?c~D?B=ITdl#IedsAWxRW~#|1k*I6L^}S20Ajah0-FdeU$^eDTfVj9sZT#$ zcG88r=M|X3pha)3*s!5_?)RjKnNw)EZrVa z(ejEstyu_y=8|rq(!zpm8`=T1$C4ALlnop=;hx*xp0RshsSIHPf*`3;-raT5b8vy-UCTV)?jAt1`i&5F9h=Iy$nC{_^7 zE2#==#lL^MW#NLQFuAU_+tj&zN{S0MZi_wr_~PQX@XX_13?J32_kij(zcwVo@i*T5 zb>s4lOMYK|(BWe*y>G95_aC`%;p%_g^yU{I{eIG!Q+GXhV4uO|N1rv~&Z|E;`=A$R z9nt@|Gsku7AJHzDt$iyT9sEhN0jJJMsRN!HbWf$Me|L6d5Pnpp_Ju`PW2KdG=AZhQniW)r}J z2ja{N@ZO7b;wb+5S-kcNjz61Ey$J}>^!-ph66L)?MBy;Afn*A-U=|p2jw3+-{vp5h zFc062_CM3pdqepc-W_LLMZ@Q?=W&tJKdliXM$*Cm0Hm?;JC4?biz+ex0RHSTEP4rZ z4vFl30@zVW+bfOgE5Ag9Sjwm|^`2|Mphp>t7zr&{QFrW}_{jGv96@_3#5O1XV z5^PhtSrlmwqLuj-Vs2XFzOSin3b%Wg)L? zpldJ1l(T79h)v4?6OlYBF*%gy_aRVR1_q#ENDLi>L$5`ea<;8QOA-go#-5j9PX{|T zL)n3d{vZqW|LNo?GPiYQ7v-pGol{j%h-KX9(uwZ?nJ^gdn;!HrbCikM$n_Q~BMA%M`%G<@w$jv72Gmvc3>yhsA3R~efL`aU+p^U%tO@;lmP@!HJJ-ygwD+jKTbr8- zBhk^_s|zG)=85&y*B!T4d(tTkhYe{MPHJRrMMXjAw&Ql+f6CC-gqk#d(I}g)d?LxYrW2CmAcEFu>+FZ%cRseT(+sKX1Ls{mB4}0Zd|onO2c^@2 zWuXHBTq9@#K?s6Z@&%@W6OJM_0dO>r{&Od)O2Dk8U|4+LeZ09rD2Gf**I!SuB&N%Q^lUqJO{iN<&u;FYj!r68qiTkXsu}K=2Nnvph8kYmFNu_+R3u_*rHTp)XN{N& zKxs9m`%w2;TI-(qH9ZSz0BEgk$F2=k)DHHZ?l_JRqGw4>&ypGdZgL1AjLCh+0@&2B z@$IkPYieyZLQ-kR5(aCX7cQDJVfM5^69FW2JU<%QWzaMRCsHXx%9Ncd$uBv2<{|B= zrUgH||IN~$U`mjdBu#0-LH{28cN;T%_aQR@ILa}k!K^g2AfC{F#H9XX;+#n6lz`ZE z*en1_J0MEgDTCzL+M({eD#x**Nf?5mwc{uZ?>1z(J7J2GcG3`17@=tc#seHvF$R@{ zi|3Es9Y9K@CUu_>oN(nh36qaNvDg_(4zwVP4_vU5=(_CZP@v2-0@z*f9YmKh$v3oe@No7! z0T9TDy3@uU&XT#$m2_lyS|w}N%+rTi(}#K6K`WiIK?K|8NrUqy4bDsVrWt+v6y9`p zq5Ee^f%yAr_3q~h!wLZ?WfvA0j&gc;H=ekn0@oz?_+VLlr|+CrHk@#5CHr0=2A7~iZ>Up4_GKW+a4LM&h_odHPgIa0=v$~T!=vkM+}A*lF1;I zR1hQ$VVV-)P?$(*?PxGVn4px>nwg1=L_)vxz|yZaFFSL;=|`PARuBs*UU}-P{>9yU z_A4AYxaN(QzHV!9@=HPhSZW0)P`Oq+x?Qn~7}7~8JMIu8l~g1_LMpB8m;-`MNr&3c zxnkSH1p-EWeqDgY#%(V`ovSGmy||Q?OXHntfk+yeenL$z5^;QyKY`tRfJQH zA(hq&1Xdb`kb+1m7Ah}d3d3|jB(Z*J!-uc`^xKM!x;^i~XOAq3<^k%J=YLtfZPT<- z-LJZQ&yt$(k}umyBzn~s4;ocf*i#N1S))@tcF(%UDvo^hmG2*V^3#jYeXcnF*s=T9 zAAZ)T-qj`dJ@m<)cfQlsw&SWh_dy7(G;2UWNa3c-Coi@wi>`uTb_c2p&IaiJVrFMG z&;9T(+#aC1PIpF@PiPuFgfBjk!z4OE7cz~RI=p%|CL4JDzxeLy!(Ea9pdCm9OFzJ- z4Y=@X^q9@ILt4}H(=h32`tc2@f8g^k(6^ZPKAt&*WD^SN#Bu*55H>Br*Y8uG(L8Vx zSU_oRZ9udD?ahEj^Hw-1j<-^NDVY|Ba~0ER)DE_2U1Dh-b|r9Ej;Mj(-sWLO--C?MTLo<7tk+X^YF3!^XH&u^e9Ec zc266zZGfR{c4AafjwN5|7alZ@xrCJ@0Y-v<`b0PhI_+dozHZuv!g6D;Bk|r7yxjqU5O^iwqMKzSMW8jnx}b=7$7ebhXT zp)*n19jQ2oK>|W%c@U@l3_7v&xzp?c9a<;U=yInFO=n3a_LyOZ2T~fF>%tjtCqrQm z@yqG;&jk^=TgJYLkJ;gL|xU0I^TfO z%1+rrN+}4y(CP}f^Gzh&?6J%h(Y$@e3;~ePPC?k5(yLoiI~rnAzaA23cao*~;X}p` zNkQ9=DldraGopWjwbm>k6k|wD1pvh?h-}BHiG&Uq+TVS+Qp(L<24MG5!vH9)8LU%k zx551rO1<^{&pVRJ3YnzYFi9t!JS#M^U(e$wjBJNiN;jrbRZ{lqQ%``cRZ1}#B4#_I zD~rcg76VXPr5s2>iXoIUp|%3G6#&4jlmbz0asGbA`8n(2C|wrL+i%1G_fOkVQo5y* z(&0K8H=Cf3b6_2FDWM}(xKr)^q;<~OXXmt)lgc9lh~+$*yj5q`op$A!{l5QmcFl4R zY{{Wakyagi%_$>f&oZ_X6@?zYMI6X`@;1i zv%5^7!G=8TObw_+fsOfyeD zg#l=Wlu%mCo)ZDItyw$5vNW^kH<0=dWI&XbVdN+P5}jsn23 zI7_M8+U3Yma?BX@^N+mjLm7!`()J-MYC z4jU_njrIPv6%4PWlR12pIee72D6Z6YSvh6yO_Re;T4qyZ8Qf{Aqrg=iC7l=X3eOhF zu8))^=8P!M(jhyJgwq~#xyZV&s|K=Yk>6nuBM1(^^A;3xj6eu$=A}Dn+2M+rv32GK zmL#;cTU62@(-1O|N=lNZG(bo=NzKZTrXi#hGUcR{Rsf`sQW^jprIc1u z2;oKtX|~xWA)4dui+)|QVcSMCBJEVnQFd#4TXk9e@Ik}sO1s7FSje;-IL&s8U}3@p z!64}<71!;KqgQNL@zz&wC!iBfLTDl)D7oLvz2}XY9ZSRvDNG~8teFG>TI*OUmeR^H zO-VwrYD_grP{fE3gkeanRnm=(Co-fvaw0%VL$FTTNp~Tn6sBRi>(Xks6JSb101i8e zc#~ z9aH{dBLIQ~bs26K(655y=(4+@*%I6xook$3b{Kf=9H|xjl!d%_|7368E;{BMhT-KW z^Le&LD#c2BVNg<%5H3d&wyo1bSV}S^X{}Q>OoOB(W;kxyHvz|C0EQIG5nxst@whD{ z5zx}6q!dEBfT$aS$;qT9f@zZ0+HoKal7d{Z?>Gc4P8MkYP~L=KsCX zxO#&rg{d_|5;=NUKR)^3Vh}s7pEHw`Bn<|bG`F-l+B^Ox!yqAq1`GoZ!;U-B4?8hT z;RaS15-FQ~D}hMBkOaR%pvxrPIwew4TbowQU?z}d3L!}=irHESk`fG<1`&`-v5;g) zZz0_BeMDqC+MPYkFbpyT5s*k~ts#6uHBFLfM`+(ufC4)rhYUK;U(n@F$tJA7;EU!x zA`Ka3U7HadeZgZ57xi9&YD3gJt$Cci3W`KiLg57gSka zP?#?leX(xlNxjWH>HfO;j~x{?MTQ}qRLBY$2muhvc1YMlP=e#52J|@p#>wZN-da~* z7A@3Tpk-a_SKt30iub?#`1d!iTfe?-$I?YxD|_`6k{Ftx(qmNYBob}5ZP(Qo+1$Qi zX*0=s5(tIOwcodFX>KSe2}6KLB@&6e{_1b1?0x@@izNz2jE{KlcakIB`>4o#pIP%#q7px;YBK^|~?_h-Bim#Xx>sDx;d(*Um6G}oMgNlinwb@=; zfU~Zh@zLksG;WC14=Q4CU2UNqa<*=27lMQZ60~D`>$de9YEKlAEWI+3dG7uC%1WGYIb<4&2h?^y%=8BtEF zuAf+X=EOPUCiOUK|A*duYw@`KyK@ASj_o;V@1ECO^3p5seRbpyQwB|`NW>fx!sUi( zdiB|0j+IXc7(*G=D#!c4&4<;IG&984Rij}3)Gn{f*i8ON|1am7xjp@9)0}o7?ZkxZ z6z#~~EpFgO+E&bsG4e0g>o!uf9d$#XH3We*R0zWc@ei+4Y&{xVQ9B5se1IV=q*91C zp|G5Pc$?3?L>zk{E*S&LW3AW>!LT4q0?3juEQBH;V$u{-c0z#su`ZlWoBa9*YT;2m&d+EVqAS1W*m&Y z55lm0sInIwejaYRT;Fhzn069o?m@jKv1!3X2Ad)#1E3^`$cSR)uefo4Ue|z8y>b2b zh(u|RV{q-YxcV5Hx-X8s6!qiW5_k;uwFnX(BGe_d?@TB8%L-eN8nZH8`x&b`+DSk< zV@ME;<8<^}&M-2WAUZTxK%^114p$IoLMl4oZrLL7F9O+J%}h2oN((uUb7fAV;MtbU zY->$$bt=FubM)?0CwIfa7+r($c!R z8p{+?kRgRd!qK`pkp#$)!jcjKl0?k5m1frlv4mhi5^EOmWXhdz!;pp$0F=^7Yl5Fl zm)S6+6v9zjv0{c4B!$cv@f{VC^h|Z#c0w(I*ww5n-Hcel0Dx?5Fmq2QTZaF1L|IL1 z51Gq6A@hD|ljyJX=jW2_^Xx~Q|JIrP7DO=!6X2&KbSSFa*PC*b1g8(7H zwhg7&keW2Nw?e_q#79C1LqcmNAenSylS%q&ClR!}-V%U&m=7>a)8&?4N;RcmNFu>Z z42iY`0FOYVV5PVz#mqzu31N}5_*?w^8^|E74Gkfft83+u(QG@A1R;q5L$YmaTd`r1 zlwi^VoN`DhSSGQC(iAd5VB3ZUh_uVCrNK(UQS2W?kYzy#P9<4s01$#q(|tkb>yPo& zb26`(L#7ato0>6jusHJ^$}eE8butB|n1~FoFe+=uNv0Se(*%P|soUFSC}jV##QE<- zVT3r}gdmYj>GE=M+=;SB9a`H6gplE`1+-?zAqHGM4a|lF5!<#;!2(hu?e(S{RvM=1 zLI9mCz57o_u_rG~Ctwu#QSC zRPM_ghLl3PeoYK!ZINlE{UMnF*2I>u0AkIq6)hp8l<XCn0P;e49C%}bkVKXYnbP%Z9*@@P)t8c_^fMc>=VN0C z(^Wow36sI#TvZ^QH}3O=Rli#xQAV#eQn0iAItjnfE1 zddE>3goZyW!OJN#rJav3{j1A-C|w)V+d%@RV4=KAgb(`wkS>`b{RAeWkd=8YDLroG ziYKLn_WEJd&_o&pA(*@#gzK?Gg3R>3CC?3+*^5<{5+I~Q6{R2$9OcSN5I~ZK4#+Fb z7d8t=sZfXjloV?XwtTK;3i1w#m<6$6=`@?ufYPK{Xg~@rrT4Nzr1?7mY#MGPi+@TB z01$5KKR1W8fV-q2kzO%k7SJRF8%COB2>@%ij=8s}9+?vXFeIc1ut8z~mKj*&fTv{^ zvktK5uDGaw_|jqHq=(Ys4o@EKRJUS}oBv5fLk^fgxduztaJ=DW3^2;MB1;wHG^^-x zoM|;N4asHAQl~SP{p4)X$js0R%uJf2<)N8-4SnX>#Z%|?9Xz#I5|)0m>E3(Zy5q@{ zYideXZQkt2aT?M>G2=NP3bXse7DxE@rUnuFWwRxI;yV6@S*{O%U*nT z@yM~=Moz6WLuhGgN~My~!szzaR&Ayx&#P@zy-z;l*&z@2xbUXwthqJmY~0*tx2mn1 zT1mn(?a+IotC&eZQ{?puhX>GNsSl(l1>g_bA15QC)a;(R zkZ`Lyd1D9pfv^e0S}|ZQl1s7T7y9NSUcV80?v9T?M?4MyNr&T#lmdiqizC!s?0<@Q z?m>S1daA2orND}eC?}F08)FS}UD%S)2G{`su_nCm0NO#Poxt-?;Y5PXkT>U?K}Mk5 zLkUSRc-nq+yX04%qnDq<&tK3TL%6gzW}nDarFiE}e&Sku^%~v&F#)hODaTz7Vvvfn zoB2xGR1`tYK=dv~&mJHNCQLpaH&@}ESMbIwh_AyXuOh!2!}X8W!~~I3hr0`=-dUp# z%FADEoK2rh*{K;braE=#n=|@sF1#L;pgDzRcOqH*d)>zpcW{7p6}Gh8Wpq}m=r6QR z#CpciWMuXvyB23UOy3kgp>T880TdXh*A;dX9G2?z#DlG2dwR2W2tZ*#euP09eO1qdN54~)ww zvVhmEs|QFaNKjQl!TI~`zBL|iP1*5;V;V5XD2|vF5z7)n61gy{A%w65xu^YJXC$RT z1~fe6nSIT{Fir9qy8DhokPt>@eE#f9gCv{jOM|oFzg?Cp^8eg&d@IvDI#+Q@GvMHt zol~Ma!GFz|3i!;W4FgZv%k8{Vr?$Xwb9ev;{!575C+FHP8|nfbF0|xY z{!DCyNc%PtK}&*Z`Yx}`ppt*ysv5TIWP(@`5g8#-R)%QA@6S`)NlFOmzXXB7Lb8wo zfRL^QMF31QXVO_3NN=&U{a~0R832S}BG+@?n6nS}98M{lbdt0{(nfVHs;U8y5Nt_k z4c0J0 zOrJ$$Xvnox4bM6a?kV!k17v-d{!iLv)wMU%C{3F3v#k#P3k6EkB;P?|xMouNOqa49 z0(_h~2gER3FA;E>?I36Sws!YM20ZjaXMOQrI=ZekW#pZE$rq=V$BRe6e1~wNg?42AMHt57H)N6<(*S_ z-n+tgLM)O6Wd)@ou-@bw`C4m7dtpQbAqBav@2uehh^$$$GEAY}0vph*7=R>$8D6qo z@<>aNU}nWy_?|idOOl%1{E#d_f(U}hg|n5z3`xR`_Vvpm6A13CN+H~R;b^UuVpk`S z?l4_2q{GU4^ppi32fgRIqQhVlq6;41$)mhfb^$3w-s|}-IK<4!Wk9(I2%e1YxU0!Rx%ZjEwx7|dRFLvJ64}lcZ+nK2fzD_cG7VPv-PKJQp=bT9h>{T zX4e~T=j7~5y1%q7Gxz+3s2^8P+i87e&r3S6Ou-M?+cvGI<}}LD(hx^p zF#g*gH~sC{4<=15Gm!e_+doQ%h)~3wFt1njebMtydTrp~(zUDB#}w^#{0L#l_SS}& zj>cP^`KJ!M?ctBEyZVDW`t0-QeIE|#*Xz!w_b8}00lav};tMZ)fm zY_!>SpPICtZSC8Wjx9@Z#-(#EJ@4s@PIz(B$jaTAg|j z6;zw2Uo)+x{gdC9uWfBkRB}FR=0E~kCbY$y5-JIxy`_o6Q6pkHjymM5@xT7|?k9_v zHZ+cA&8(H}xcZ6b4G>SXv~auaiah0Oq&n4_+O~GhmRWoE-~EUokKX-pzd_w5@6qeD z3ujz;)@v7?_WblYz1FSX^4(W|9CPlRp`+?Ug?#=$rd|2>H!e8m#Zkk1nZo(#!^PD- zst1qj{>m?(Zr!$R^`?fo^M}uUXxV-DeZ0qky^9N?J7Vqsd+_VVt&K~5UshZYKK{6Q zA1+w=;@dy2{J!y{g+DuaJa_(xwaXiCy5W=hnu^iGYd`$-tEuyQ3?5OfwU&nP&jhnq zHeld$h8bmuBZsImpZ#g{2_$FZ2CwR@d0J7|=!DCGGp1MWRk^xTM`qBO1=gXX0GG&M zAK7M9M&j-CNUNhJ=$bL^Ls)xqx2Bd`4BET`!*_$UU|Mim@Y52QC5V)vrV5{YL@kY| zAaWc;i^y(7Y{jDOAm98Samhe(1n0c1!B!?jZUgBQ(K3r@TNGfzklL;&cs2VcDh zcDbl}kk0a|xV(U@zexn^*NUjzmjFw8negydYD%aJmgs*jy! z_Hfqz_cc2&_`v;L03esxNo#0$uDrsnD5^CWe%TQsV#>JZ`7x~)iFg13002ouK~#;* zI$a*beY(d+$sMdD2rr2dF({pxHkjv`GRMYRdj%87RhisNwDyW~_^Km3>CVt#7t!xt zVD>7q$U{%OX>&AdcuAC8ILXyM-4|sq@WCyd;g(T_)^5$n%nXtbv3bw-#ur?OoX=@> zA%n=}T=xG1q3eoB5YSA5bQ++m4zi;|=bj|$QWSAEA$910y?ompyc#+_G0ia2o4eD? z-G}PjM|HtvGGZ*f_Q;s`Uf4@o-}V;LrEvCDY2SCq?@$Rr@Jv>uYqOBcro4UPKUI4Z zPLlnp81IYb_ulLNWw!%65b>tnB%7 z9LLO^Q87A28aZRBUT>VAb%pI97z-kdpWjj z+t$od_?srZ^@H|_k2Gh|!(VQ~!wCOGE@thz4y~hfNb6jl=E4EK;64{Xuw;1WJyT$N zXZRlZx@8)*@S;(D|DsN(AUHAPJ)P6(Q(Z3Ty=*Q%&hRIe2nd?4@b-wSKZOiR*{r}) z!o_nG0D>vO3`Y}basgpOfCRK=NBeq`3l3zC6a4=Ym|;jy-Bn66ND3Bi)(#+Lv+ZbQ zgWD{6EbK@!6T_AHo#VaGwI~i+NEiEIncS!bq8BH;uiu!Byf7g0* z2kAdEt*PZ;GR)j_aPdv|?0etMirzOngMj{kvC{!X;Dc?D}DNT zyEku-FZ*r%oLq6+Q-?fw&w@|CS`v*$F1hB=y^kIOi=7mY-nI6o{Qd5~>(ifq zS#Mc-_Ph}X95to7S6*pZc-)*i5>(PXbn$i5@3=Yk{o<9=#*N(nkfF<0Z~1ERnyrcL z{qw83buT#k+?j}(zpmd{Q(tk`*<%MzDr;#dyy?yZK7RlAKela~v+tO*&YNQuuyR-$ zLMvYf&mt<1BX-5-GppVix6E*3?*r1@HPB_J%28*}%Zv*C@v6tCgFv{)Jv#`#PSFw{ zj_GpOae6Ohw6*M^WPR(4kIt%F5VAIXhMR-Qtt+Y(hR&wa-gxqE44Fi=L(#B|KYkML zeuzU3Av20;v-#P_@aE%m>Hx|wLc>q|#A6sWnI_J_`sK(gM^QKO3^pc!MF=uP(mQD< zmzlC4$G3-KTS+T>(+UC`{ib8up}P7%Sii$xFbR@yZ})R#lFvkarmw*cLKQTynqRpO zjq7meefW5! zIIiD$SS{Zqj@t|Iqz)OV9V+IXr{8&&o_dM){5#ADkp{_(iRm*{B7!gxZ&B~wA|kce z>vRm;o#hi~+=Awf&ijuVlV+lB5^6`nia~)xg`B7H&4-wN906GL9ItHVBZfgSqzRi~ z=EH78s-3M8-mzJK{6Ay%UML=b!81AZBI3#=InN66Wl%b|PT;hoD-!#Qjne{M;JC(R7Z@xgWanNXTlr zgU`r(Z*O{fRTf@Op36@_4fHlG3zDu291|<8g&ol&N)5wOma8W%nPkEAczFBU(eA!5+oMFhu*Y{MQCO?fJ$41 zL|~Q#LrTMqiO{Ur>xD@e5=2m1Yt3Mmg3@NQW)00AZsTJx9uv))ch`RPmY*|M1((fJ zAN*r+&RLHCmlm)=(%U7td%CcUd}llVF9beNSGz2|OfD|zA9&_olTpaB{+~1MfO4Iw zGnN^iit$+I<*lcl9+ukdobk#u~(0 zq)P@e!}rt*jF}*XOP!G9p?K1SR<4Ty*gdQFM#aR?EI=frAZACyAP~b=>;`3MO&(h3 z+heYlL7u0K2Tlt?%-YMtuHB@T9{vV54YTherWu-D;FSE{d|SoqmbLaBGKiG}$9C(i z5fPXm$(2WB8juD#3R-JHuEP)kq|&R(AlEu2M=7+mx=!B&2-k~23NlR3l|*>{VIJAK znHkg8y$ko+?KvcR)aITaFtjFkIH@nV10u5n4R+pqST;=?0lx2(QD?WM^|kch zuF32kWn_#sSBP?2>CCo@d^$FerE3PC^B3Ir+`j(eI|on3e2GE9J=H}oIS#w-*jx`R zw<{tNL|dD;x20l+VVH(dUQlKtq@cF9HEwI)VLK@yNRlXu6qiMd-6u80+qSiDFUcz^ ziWDeEOKCKSmxsp{@4bH^<+$;4erLP!E65PTuHyUXIT*zV#Ei|w+w+v4u- z?gR;vkPw&2=#}oSI^RE9ZeN+e`}6zt^CZ)^ySnuFId!UOfDnSUmX?)e=am~3Z|ry ztf{J5*}l3*WnwYY&AG%##VYEn>XxrtzBbn#Gp(3uHdi$z5btq%3A8TLt(lUsnAYy1 zl}lP`TLp-qC5fMw{}zwM2GlfbR;DyT_-*ad)m^J=Dl11c41;Gv)$ECBL?RC+0WjwS zuKrJ#N07YK6oKcj4^#^yTsDO4k) zTrEPR$_!cv;T0AF{?Y3BGLZ^?6A>%K<0OdIbR%YQWrA#5 z17um0V=yCb!T_}P1TU5nL?jD5L_USGH6TfnXK_b5t3kv>TCqtir4TVP8MdQ6{v`}y zP@eNz765Vp)3-vf7u6Z@i!cBZUc67SM8W`TmIeV{5S;Ha4U)bU$pikx%aTL8H5d?H zT&*|CoUK@K5Qk16<)`iu$Wz^jW*dDJsEZ|r)NoAsKau>qK@USC6P0opA2=ym!yoVf zW>MnHVJ-;0j7)S`B4ojY5*SGwq(RT7b!=^mk3FSk9FaWs(l?sCt`l2L0k)V8e zk{rfMyN(()z51F5=luS2k7=Rbh!mie(gbX(xkdnAmpT!>lI+sxXD48vm{K6C_A&rRg84iJ}2-Qj&^>w|lP^kivm(wD;Zu!yp zINyh5gCd$|nQuAYeMDFcQSr>=hsFpLR$l-mPjLs>$x-z{eeChL@KjuOBsQ9bd9UMx zd6+hq<{kovF=<=cX;(b_ALP0)Y#Ls_LErx)-8u@tf5hjXOgkTq-A+JGAz&G-S*J77 zGs$^Psw~=bc>N)WEYga9d51RNE&I(o{OXgbBd&LU`GyuPGl{UZk2`UGot?;Zg9O^fhy%~& z?+@Z-y>QbsV3geZ@9LThIdLL3*b+a!sUE#u%-O}r(}?k#LjxoU+Dj>p;1HOo;vLwM%EFijNPWIrpN-5v)&S)B)$&qIVfj4I3OPf8 z)`JjPqKu<_mm-)#fndOeDCi-J&#pYzV`)`X7H#vd%boU6E*Pq~O!TKeoPzQwXt(6d z2=Y9TQPu#^%gkP&Tv3yyCf5rE^mw$hT2usmk!C%gxs zw3b3Z<`edZmnj7zGMl3{gW{%%;KZfyUCwpAehSaIa|W${9*UBsOI zf6m4ef<&QhuAu!W*c1R&A5jU+%!P;4=U*Yh$qM=!(RnD04a|pa29Q`-Ylu^QT>0*K z-}}L5#raSD!i6IVFrT#mgGsZ{S`dUVSSv7KSp=|`8=CscC_!;s7w(9=`^H7A`VZ}FeF$o zvj{@Kidre2DApiBT0?2lT1W$|$xB&n#fYG6$Nx?SHat9t2Gp}lu8H~5}pMz1;4TA@l8c@wMHEDJdk@zm*ZVE{mUWK&2r7(vbIOBk6qP)!pjaS`l*x-|(QcJk z>Wzq(#_vh6OT14WS<3SM0Lwz|5T2$~Hl#d6>O!6rbt3tX7=ed`0g_VMP***0?T6of zBw|L=vNoDN^U$pi7*aLxj_2=w{I#dn>2-i|*QuEs&N~0_vxhVcFs1eMM=$>8{{J4e z=OG7fxnD=NyT(es{@d5*-gr@adUaiMRkPJJY4n7>x80|$vF+MN|Glnf-PwnoF}!9_ zPG|0Y;qC|DefGFLj~d!IBx~n9OLEzT&3^KgKF4)75M0ihZ^@@X&4c`sbY&Hl`XbJml|^g$w=g z8xKGK)=RgXcSCDs3kk7g-Lii_ar5KvKHih*nmKCb>4*MplOY=|U9K46g(reJ}j%XTw z!RZ&=|Kfu$z5Pm6bH%!K?cAw17&GPi)Bkn#Q#U;S+AGw6+C=pZ)3)1li`@oP^~>1V z^X|PoW+g8=^sL|3EdJa1XC8CZal20aORt?ZWbDNMo?hG3c<*u7OA-z_55N2DjgQ^@ z6h7=8&&VRbE;pB)S6>4TDV-j^it=i-`Mrla+6Ifx7$4K+WNWooNwnj zU7dDgo!)%2s_ElRFo!I#C(W9`!6K5jZ=35`^m^j|tW@-fkg7EW_+-t9P|FS4oTP0_2 z*)(&KFp0xxbdXOECE@cQ_2=I>*`8c)){$@<+v59eS8bUj1ikfn@5;6Ij+@maEVznI zgI;{E=eJePp>wO3tx|7%+OzxCRkf*LAGpS|uXL|m7 z1d=!qnN*VG_#tO~Fi7%JnzgiKXQwSB8V6dexwp%ehL8pXQL0w>t4xqW zxQ=QZQ2F-r-~age5>r@GXeXx@{knYAjNv=)zhSb{P!2;dvkMnO2qKb($Yq?GmPBt? z?y*}xUb(0{UTJAYHfN`^y?Y8MGq2q{&t#AZx3^!HD!W6heij1y}n0mo4Qj0)k+ zh7jcKeKJgPG7bnWBPv-Tm$TuplrmQ3?M5KY+HqVXA!;j=S}_}%!eCbc?Gl420V_$a zVsan&A=!o@|5};5nkD`(-&4#)TmM1k4Sy~k3NkWKtR_#MDf)e-|i(P>@00_0^3=7 z>^6SvK5A%yFlqbUvB73+yTnNxem11kZ#+$}{Ew(rp0+!--a*fMSuIM-UhM@8Fi92= zfRb^i|4^&C!Gyp6LR$%L8AbDdqGgxy%8YJlpq)>z*l}|1)9*7EAK{vb_%26bn?3v_ z4Au3zp-F_PQvF%?&kFEDBQjv8uHL9@K>soBmbe`3zIrn|VuYw~B|uj<(C{%* z7?4smj!+br0KuXO+vq)y)t`JT3<)J$b9Iw8B z9>ptN9z9abIwW@X>H6`9@b!PGY7h=Op4!HFSsnsIM<^=+KNnKVRgDmih);BifLn)#RZu5XsE7ObRlMzu5! zYiSl*yGjcpDddO0E&q1m(j4ph>eR*~2M?@FI!g6A?hBuO-;uGa;%3~S$wLPYtFI0Z zsP%GLh5|}{k&|&hrcb)y4ucVYm!NeFk|AV zT+V&{+n-ERraL=E4(K;|*x;&|sWgAGaQRPbySvkAH{F|*qP4Mp>xsjDUA5-x-&bp` zq3om(1M2F>4Q;iA$bshnzUr41YZk9w+t5(I$3|mat)Kton?>ziQW}P7nkHqtdmCyS zwwf@cDrRzMMGQjULJhjaxEfiJFlkHSLYFRmSqSM19{LKd?8`?}9^DEQ>+IhKc>I?RUUsLgsm<+U-Ta*4%#0ipcTLH zC@)+}dmo6(8cHPb`M3PZ2Uzr*Hched=CtK3woE96(AEn;D+rl=;&HijnTRJ?X9Wqp z@fJQ%MjYc|d#Y-xxrR+udMrr+YCBzmLk)|yQr zJ2~^=*YCgo(L0kin7ksLe)*N>+B?@>ci83M&im@q*WQ`3`G%G8+R|@BssNm_0WpOaNVW*H2%6YZ_deN__p*=Px|;^t(TOe*Zc5CgbsIuDfZ( zpiyVA(Iw4h#_T{q)q z{`J`PSN!L)v7^Tf={NB0ci#H=^Y?GL_}1N~?zDLA;zwS2AVJ3T8M8n8;KP$YJJza@ zhfLcy<79;}G<*4bd?@L$d*A))os~cTw&A8zQ%-#OlGR;n+B?!6w>)&y;Of?W_u6wz zaztmQ^ZoDN{^t8HdvylD?;XFNbls^>zWT!M+wUrE{n86Be)Ge3pWpk5>)2m^|3wUO z01JNq?Te@1yLs5HTTR}|6lQn2>+Z+z-gdKHu@@~~y6nk29vrsCxS<0_tnFIvBJ}Dh`{or}P7ZL!&{lMPfY)Hi`t7;0kMsNCst4%%AmO$3`*yQGpu@Wr~zXh+?U- z550z>$B75*wFEQE=|vHHT=Z%2JmjfBncAZ6w1A{BeD4LAp`l|2wRiJbm#w(xnw3rc zl8-&q{q4$zyZ+hSo#F3(b!a{6zl{4(|PiM1mvPtWg8)3L|@ zzI<`IwwVRlo!RX48MO^LdB(|0I#$bMLoRJ+leLL|T{igO-KwP2O8b%W{!IJ2tRDj% zE|%xUj4a|Gq+p|bsb~;P)L84e`SXW~L}ebWQIIUNsOms+BaUqHjEYR`ZJP5l(}bDu z34!?|UsHjq6EX@fN$&ba2oM#poidofKDyy_Sj!3~SFf}K?) zASIC>c?xL=t+lH(5lK^cWAzUBqQFJ3TrDJN%|b*aU$DzsXdy^zR!U1Lyroi#U6+jj zXe^6drE}VqL^2_Tx7C24RFFl706<8gHPCBxx9up|n=6_Kr07Z6@qlO^86OJXbiR^zuJ2 zOMv0JnutUg5K$Bd<8PTNSluEO=nvzv{~v7)rS^rs3zoUfLtoi%C<6FiFa3@I0@0ls zMI{huj^%9(fq0tN`n;cIwao&xkjOjGM=&!nSTbd^H1~AgWKUkX7zvZ!xlcWFm#7J;*{I?*N?T+pa*qL;XBQ8CDR9n+2|G9s4cP7mY#}TzD zy>j)~iIb-fJFGq#&p9p!2027R<_gJvAvz!=tbdN^_o2L$t)UNhk=KXf1@A+U@qr@@ zzW&4BQI!3JTw(qBB_lV5W)D%)BP3MNfAY=mk=uGJekK^5m1KBFR7htd2NB z04`aAZKt9p`SMfFt@k*uyjS)1TQqw!e)>^ouS1OsE~3r0Qdi#OzVn9I{{S)_b=i$z z5`u$fBq9cEXM3@sHHz%e~V8%iRXUHPhoMG~joAKHc0$^cjZSxVw8CQ%^mtQ4bdzB4SyP6wX%zs@X_t~3c z78s-yD+MWG7_2pc^yAOqs3XzU&P2?tCe1Ley-Lp6)P3=d+=Um2{SGj0o``q_fAzIG z`yb+fgXPY1kFF2Pim{#J>RS5SNp$?lsH*bw z#`>FE{e*x8M9|+|?o&ZRROK#!BOe~U$Nx9W6_@8`p$=B6`UIs76yu>UPK7~p#mWhn zsftk4cscxGW`7qq@)}_uSJ?pXGWGd91r1@W7hW5c3mo#4AOW*leS19zO2Q*A~39*Kxbub;mvXPTgIyR7!hk?!(!P8?mZ}ilM_df9|Yj zDj>SyCSc6_ZC+J#!z#Dq+DC7?{=mz?iY=9BtV&wdwv)a3$*Z1x?U@VCy5`)SjstMt z#`oX*zyB@oT2p1k>l&M4u?hgP!jNO+r{8{l>#O&iy4_I>?%&c{Q&9~dl}s3|$+J&6 z_wcEE^`JY3xB;W8s-j_H>up!xxoN)*9cUBMb?wTe*>CgVum1P-Ro$!hJAeNdAANe^ zffo%)HT7$4OU6=QHce@ax4!=T^NSw)*H!ypsMu|8X_3jKgz@6M*UmiSl$n3o;kLj3 zYj9ovkAL{!&in3bscdErbdM-L^`R&C70Xb{-Z*&m$A_a*_yzlwMR1A1A_xGEv>qC= z`c~u$*is=v1)r{uyG2bYo?;u4jxg75(Kl3h&v|JQk>IA%*d~e~wr4ES!FeET%6Hyf zch8NhPCRSW5yw{C`|w)98360L__Q-tz5V>!YwjBNmpO@VzPJB*_JUVmTeZ{1!zhPs z_DEfSRs9?9cVB+V((}(>xZ7)EmCMqibe33qc`3(PuR6a2=WeMh(cD4h1RzC)z{V!Zq-bprJ5>CXw9#_ zmt8(T#vQfa{OC5MC9)*o-}RXq-g_-2I4C1x{5?3?v1^a zAO3+Y71h>pXKhtF16nhPf@}jU^7+e1duo=K$;2Cy_7ztlA|3|vpoqO`F@%h4KY%d9 z8VLl$h=%Hf=4KyCNl?W27J?T^?+E9-copFYJ>lepT2~Q!8Abx zQW}QrKPon2N^Hb5?c}uWimFx+D?39KHRkXs%&hDTH4H`5C}xMqGNx<|557E9t*EDp zdcS*Mb`;eNmo>uyu;Z||zdBJxV`hPwU7H!Ac36DQ2<};?-oIZs0;Yrnr88OxJ!q0S zWKv?6zp<0iN|7>X)Gin=*>Tv(v0*}iI3`AIe(>MnupdC2v*kE6arZuL83)GH1X12M0p?r${wj9 zkZ`;|T!cQ+-yT#(%qe+>$-#pt`jv1i&mZSgmSRh}r-xCXYhsJ`wv6#Ed|Nox zL8FBWQDiU*ll*#xtyp~g_%SE#vGu1v{B-w|Z(jMt8=IfHPtJC#A&%Q~=L&YNxc9L$ zZ+&!BzkaiaHh;Ka>5+$>V($(E_>s^nYb?cMc z{_A8-Ry>(JV$U50)>bWBwYt_ahS#P(vR%`R@43zFxzi`z`1C8c-tzFYk%JGMF*Yu! zLgJ*|x7uJ(Yfo=hXPpW|N+VHMReSUyJ5A`{;JB(^MXcJCFa5IQ^y}}QxWNYh*l&lb z`qbTzyl~B9ul)1Covu9L;HJ9jhd=+}uBYGJYrEN#1~m6i#j6vRQmSanN+>o*bqy+z zt4m-$cwN@|_Gbb}`zjv|7vLZRWE36>J}T%^zJ~JjJWx9V8G%a^mU{lII2A9WAe{n=OS`AH_q+t#kCaS-I>yT9~Dw@dd(idGt|GE^m zE&C0l)N+P~WyzW*Xq`O$%%rH$58cieoQt{vIPp*#Kf-Kiq77#md++YHcZ(s-w8>`4 zTkg+nGE4vCa{0t0zVa5Mw$(WNFb2t~GsH(9k)1_FBG%Z1bt`b≧*-R91-Llkn>b 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

ZGUiC+NR&edWJe80W;qH>c+u<$ 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�KN1Ye3MFditE^@=| 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

mGk>{Quq<7*DNQ6HF%oKm7bGx&C_x{Lrda?< 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

EN*9>j{=Y|I# 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�!D7(o;8CC6{)Lx+TQb)W8_VNQ}FvMa>Ew7#(sb>$WJ^!B#RThu#mdEcx> z-F>qQZ9Um+&UGAth^0~5wH<;JEjfp8@uX< z|L*@&$DD=J=P#Q+b5T#v?0m5^lg+!1D-n>HhWCZ#iQ3p;dFT4k?dyj&uiL+G-%}(&ms?Di&$(M=~zu&xpy5`l2Y%ZFw%s50I14IwT>&_NYfw5)2XxWF*}| z`bjKl^Ek(o`M3oET6iAfNXb_lSvdl!F`J3aQ>p)0|CAahS=I?44}Oz$Nto%{l7i zMJLSYnE?O~Z+Y_i+y8_mKaCr0 z0m2XgrA$^^Y7NB(y1>@cPMDyrCfLwl>Mvvzcywu*P~Lf)G;5TuuVuw(UE2?cICK(Z{^< z{PPU$3UnN&R4V`IM?e1E)xYcRomMQ$1q&A(d-TyWXU$SdZQr_W&6+g_Mn-SB_158$ zp>KZkvSP6q1fdYmq}Xz z;?*!Vb|n83wU4b7Nf-qw?#gVQcBLzIQ4#_I0tA6VfYAHbgp`3v)`Xa>r<|qGwfGVP zZ56g@fdg_p{QIz%E9086H`^%~pP@s6c6x{RpSdDcwTl!W1qO-eJ z%hI!*|{KlWT7O^q2p) zvu~Dg$4$J9Sm;+KPT{d~-|9AT_jUk{igYwWtZSwx&&)`yT$E!$<+;I)SgT;z$zh0$ zHG*d|v~pVZRUHL)a9jkOnKM6s{E1`b+K=xoZP=MB_UB5q00p9u#>in}2*UsvP!`;E z8|CM3E&b^oE`;rJ=Idzt<-*Ic(LMB9M4~fL<7*|jiW-QYR_066BfL5>bzCxJvr0tlEH1cAhGWbEj9D=xe6lP_C*LM5pFd;OE& zx##MKwyt&{hYA6KB`AU503o0WV(Jtv0yop!)}29zKnaxg%)L0Ao|;(wFRd;e+i6fL zfRL-qMFvHLh)!u@{O3RT(KDO&fBQ$@UA$$(60p*fl#gn;K-TtdTUfB6C#RAlO^X@hh`YD zhDb}P4-(jErYNMrU1~asS{S5808oG-kqVVk#-t@8rPO4(_U9Y_{J=x2zWhI5efwMA z(%#d4ARJLZjyaiCr&{O%#8Nwkx50KBlV$+`LOKH7^7!bqncZ^+iW8ILPd&P4)yl0X z!hGH-7QK8Sgb#^a~2^DkB$W#s7T?n>X=zv<4H_!Xo}FD0T7s2xI$OENzRg)tG@ce zrC)yLiKjpCk&m2u+G$?KtA!|Jh=$k1$Yo#9+A>OC39IVR)Wx&`QNJdLj1p^;;8)GW z(7313defK^`D@nrAhxKIq6!e{m9at^TQQhUGMmzVZv`1Mu+($b z#XhBBf&jXJOTw#>>=sh615Cy^8|Lr!L4GDPYanhu*jXi9;M>(+Roe@1Jx@ zfH2i+>t9;e*_3z9Z_&A4oNlTAI8Ob8Zo@ChD{8OLUerB_#OJ!VJFa*ZEKoROvpyppYo#-<*2X|uX4e}-V-Esp70OKVf3;;ke%e3vpiPMCW$lp|p zit*8YN$6FL$Q;vIl4&=!$LicYQ>KqinQdWDo{FMOCZ3t|RE@rJ&9{eZrMDe_@rwRM z=Pf(;yk+MC)HV-o-8i&k%h0afLwoj&>_1Q%_rq$)1Prcp3YkKGXWzW(a~AZ@oYy;J ze$VWJ*QsB%dvx!E&pz^vn||=j`p0@_&oB8k03c#>K0!*5H34WH9Jt{agt`=-`gEQ; zI85!Yv<-AF4=JS-g+V}?Cm`SbBB2kj+#Ns zM@QfPf%lD%O?sZo%u0ok&5DddN&qgEOMm{;^+z3jj7|lTj=(6{Dm}c&JABYIpGI>N z6SHpgX-4x+FK)eB&%l1*SF5!wSN$+>949Ap8(-LT<<-A=;K_&1IP>Hamz*M{D3t;! z$#oq}c!j1KYUK5-zjbIjfo&Y^8+C*PfYGrr6^5HOZ@T`^*SfB^XwkyOOP5rtRYZXx znD~x=|NFPUxq4v6%v!a2-g)P~|NZZuzhHjU;Vu8X@W~M;#->(1rP5-=g`B8_Rwd}Oxk2u`esB~TAWD>5bq8RLh&0k&V%W$6H1=_F}ivr{sD4^uRQ2uK+qCz8jQ>oniA#-jOK zodYf=4STm0(b>#3`xyX$6+obf6sa&&3`!}^WC9iZ`TA?`ec<7bT=I=EYRl)Aq2Qoe zb!@d)%W~q19L+LD6AJ-W*|Zj&8B(O`MQL?*p;`un?IeVN`__zKbN7KgB`Qx=w(gnS zxle$Tfsh&5m$f&aHX8*JvDQN(+|n2thrD&rjyMElpito}PnrIY`$xvA0XU>M6dC-= zHQR5ze>j8K-j=!KH8amWswf3024+)WL$oNAGKCCk<&~RCvd5p3@&y5-(v3jGM0{YP zcFW(d8$3`u^EGd!j(LTSS%{!0L?PL#yLJ^Jo#S24%u-IflmLy4QM8Yttrg2Uemqt! zZ5-aojI4+iK`3O%dnEm>o0l)_I%5Bjbh3pbk7lp%%=)n#pJb;aSM~`7NKnQa)W=T) z0YC_n05Rj;`AqeZUBM~+nXu~|wd=>MOP)o36Ej)_U<@Zf?EtX=K-m#T|27A^feAyB z|0P6j`btzYVY{px<&1EU&p57Bh#-*w;K0!SKmF;?W8>vhUUpIU>;=VQhB*YqC?uF_ zj?uEFx=l#;gJ~|Y_>7*`Ry83&Uq`p=cmXKkc!ptt4kREFph5&j0%ic$Wxv#3Y`gT_ z558>i8MR=P7%n*MtdVf^**!0meabpT3WAV{5D5T;3Gf3l3ZYaWGPxNYy?PLiK*cuy zm|45i-Crz#}K(7V2J!j2t-kFDJ0 zx)KFR2NV-AfxuioTPS9MG2Xku2!PB?pqPP~e5x_A&X)~CD3!`oP;YwY=`UKk^he+O zQ{aahq{)&at*|G#`Lu~kE-`(C6nQ|5aS5pez)@+uD94Q;<6>8LyR_z~m&pJ?TUY16 zz`&l}+duSyckkXgm=yzy7S3`q+E&$dV50$~rx6PwAgg@q;&g;?>MNJjMr-%p{(Q~H z_F}QKtsMpUD)9Zl_x+JlNECuTUdzj5z4q=InT+EKgfR5SCM%VodhF?Q4m)EflI`RwOj z`m(df$H%2~0D+hUo8ripy8$3Fu~O<47ad!zgn$3@BYrJxZ*S}F=#Ucq&<|8ltppR3 zRYhe4f#|r>$$G_U{n@PR3BhH*GCDa{@%{Y`)U=WVxr>Jy**zz07#v#T4*`^`SBm>)OUp%#aMn$^@! zUJVv?{l$s@>V8K6&SkVqf=k0(8qre&sHd2SOITaLZZ;!ieXa=rXwS#!UK|@k35+gh zb1@^Z_OAZS_1JunnI6>SheY>HzaGL9m@qMoWW!h)NIYitj7$|_PIm1yF~U<4E9w^j zz}9^>gRn?%U_7T^-M?z2)Ah4Cb{xlXg#e-JH|gNM^KaJ75;TgrPzJmI%b?lY#&o1mQ@KNW>H}F%k(z z&A#>8n~is&f`Igqbbx||3y#zh4iEt(fI9-W|S-i3uIhA)Gh!4002ouK~!b|07|ntW+l>(xjkF$2WR%+}aUJ8T=8>>YaJq)(E#2gehSn7Br>0ifL1>t*G}Rpd z0zgo!VNaeYyzCEG-1XEw?|Io{!Ih@0{{>NLFDhKA5{|CMv1qtOZr3_ zy-{g_6J10E48(*8LdbHdeD8htty=YHsWiTM%cgZ}o}bp!GkeyYe7-O~HZCN4US`jp z-Pc`vjm%_13SW2eMVDUs#UKbKCMEz-2+VkySDgQf=`*H(?!Q0Z-qvyJzy9^wi!WNf zbh%O_g#g6Gi8m8!MKt*+=S!S$8#?BcjoT#joxj zy!M)XSagK)JpoQW6LP4CIN(edt(cXQ$bKTk1^V!j2-it#3q}GlBQOLZ9l5Bp(3Tl1 zD*;N9j}BlJpIcoPPL?J{m(D7jzM{~cLlqjSEf7Fh_%=pJ4tBNj)-`$D;vt*4n9M8= zsv?`wnbA^u0N}Z@E1P|Cq!X& z79d@xGBR<>(Jwn})^b0r)D#nQNMU!bv%|}ePwuH?9DyjL-eV)!PM-xJg0K9ZeEZDy zKD{eUA|fMM_Z>%;U$diKnqC}P!qx}E$u(kC^8*42gds72s?|!42U5zNFFf@54_vhT z({Ub6JO6FkpRq0*VNX;iQjVVOk}6o+VulYxfTDvjQ6K2?|r9oKp0*-aN^j=bdZ zS6ub&hgRLcd3fI#3U(ZHJc$UzN-1InP>eRt8p$n-cNm1Ml&blPfCd&6U-Pz;-}uqv z?!A8V$Vep~TWo@~G}U8kC*cu6JK+R-s`ogiffI`-24J1AOUMkQs4XYP2Y3JF#)s$j zV7aOs*R7VTJ=3}#S@lS{RL*7Fr2}98`sV=J-~E>N9&_A+g-d4xvQm*CiKMw@>-MG5 ziU1hny;iHvS=M>hg)4d&=5D`vb?Lz5L^+TsCAyyDW*t`)gpfibCo?NzKd6RpCa(?OdD+YJUCu-ItREk$OpJ|X z97hV*bv-wi6;h%AKna8hNK7?9s8lLp7)VdHPtTlm!om-H_NCYT^nvXg_p+{VXGfe~ zUXF1NKrgCcsmQsU_t47w*Y0@0%_soyyi6{a5khqLPFwlF%E?NtqoaqF|MhQuWA)?D zyzSI^XPvyH6Qp7Wr8F|>vV0NBSsoZsSpuX@6{LtAq=s!!y>3ZNIXK<3PPpoy#kp=M zO~T|P?Au~GRLW}ioI<;(lo=xe3()(<5I`tq@G_DE-m?)V2_!(V3wmb)fX-{OzN{o% zlQT*V^dL51t1IG5k#2j?CjcUm(V}?1UX*%Ox>0v%IU3MgS(BsTG(Xk-CG+_cXT$*5 zj5eLK`nC(Zue)XNiKjO<8n2&3l*TKkk8x%~ zRzN@m2o3`4J$(W}3T9*}QA(1)0ED23ky$e9D5QIQS zfWs__g(HMOM<7aMCKkYYC%3V2wQU(&lM0XoAR-E>D>Z{aMgjUq>m3Dq;vNx!)&YT- z71jbSRn@{7?nS3}hKi*P6G!BZ0=Ljcsjhkt0!jnvz= zZ-4gLXS3PNiWP@__S2u4n4D0davVovSExc_deM)gyt(t&u3cLw6z;p{o<|;i_`vY+Ip@CoSHJkVUDdiwD+cRnY__J+q?%}Mbv`~O z0tra);A0Pt?HF}XFsr~1f}k4szL3)Myk}QE@v2w6^3$Kbv6D%f+Q0Kz7I@*t|HOyp(8*M zMMVoDJg`qQ00R^1YBC_0Sr^*s$jeOL0j>&CQYgs^T;UW@Vy(nsJ};sYfm#k>gs6Jx z&DLsa0Ue2_Mgd*VPb`cz7t#NUVDiC-?=Nq6bB;4UKH1jh+_Un&vVu&u;K=alJAZr0 zx`(!Z{KId1^TmCA(*dF)*;a!|fF?HF)7rCLfJU_ef&pBeNh5 z8A2S9a9b`sY)QvUdJ7#Ly^}SyeH>7F7K)6>wlaib9e~!Xihw2gQfway84yG}c(bs) z)-H&3TtvQhAptxvB>@kKh%DHXa|DQM5ZB#JwPGvO^t-~+fuH^OhDYWXy^Ji^YF!0q z)#Fe2LCy6FQjFhz%@x&s8$a~^H=X^Gv%9)Fi5P$c2r1*}W)q$TDT^*W=7idVRsuxT zTmS%ITCqLnX2$&zrZ!X}2y63@J+uq~q&uc+A+m>=3FQkR9CYRu`%a#BI7u;DtCWHY zga}eNj_WuMN{J|R0tpiI7P|V2T?i=6Mk9TqByeKGP;!!52WT2^fHZZO55|^aDFsrv z@}B#*tol&8CwvA4a|>=LM>$)qm{jT1DX z;zvRsZSf|A$Q6_H#@A_ToL1i~jsP$MF(PEM*)`7(u3t5>|#;PSBNC*c7m?O3#Gh36dPKx(Kg~-I1&B>1b-0`O`xcHsN&3jST_)ztaSFQ{> z>tx)zu|Hb@4e~y_O{GxKX%ed zFI#%wtmBaLjiLX9RsD_c-ZnOVz_0nWpv<5T`a)sq zHc9ldve=pFo7=neMKex($&y9K^z7a|`j;E;IsVueAz}hm;tvu3L%XPv!-E)tPjDEVJdS%7@_|+0A*_EKUc4W2(;)E8A;=6C0vx^0 zxF95;t!Pa`k^*oXF|q--J*_i{Vb)@peIzIXDO1eCfD)}0Y+@FT=4}%!YU-M_1B+o7 zw}+@I{*)JjJ#irkU8^OSg*9)EPQt7gQ<_;MtBRT5oYaW5a%?40+>c!@W&&&bp;hD9 zs9C&lu6yZ+W*u}w|Iwx2Pu2)Bqr$Yr`u|`5zq^7!8FIx0W?2{h6jvlIL_`-&?ZGC$ zB~-^2u@^}5raFpE>NHL1IT^)D^rERY@@@eDc;E%4a*z$6qa#1PPgZg7o*h?hTyvEK zC=_}-yL;NYx{Dp1`L_0KTh7gTLaI`eFf$;yuDfyV#;<<- z%QBZ!egKN>R%YS4PNh_q((|(U#~*#SvzaKe+$&Q%;XeYa(_tPItC5W|?5{ zUB6g|Ji{ZyR3%jJX+VHm96 zuzqA@Y~F(T7ro{}$8&07Et}0+u;{fT$IYDi;xqs7``_=~vvR-2Yw6QIX6n7WtF2*j=iQ@MCkfM$H z@tLpYuR$M6<^UiNB_aSwDWw!3rI5n*z{EsE3X~L%Kzwq~v-hvPr!-!E?eVW&K68m5 z`k_(`T=4QcNA~>w-Wv~;hR-_s%##-$+m&q#RH)x7g;Y!qfMO=4K!H*wszhcpq(zcu zP_2XTL1Qo}ZrQwvrZaNU^-JZSTz17zs#j3P%UPLPgnJabj%GColQPhP5C3 z>6JgP)oR)-M2@}K@yHu&wuGP2j3-93x^Z%fHAgN*j%~qM$Mk~R%CxC&GLlF{@6e?g9q?aR_Nj%Hw^C1;%od591x4m`wmT@q0& zdfH#Ou5C)0&=D*)TuD0?0bqQ5{9iZx`gX1efhr6rtc8jl$8}v0BI|jX`|iB?|6%RF z1Li1>{BihG-7_1Wee$D6IZFtMD00p@8f**(=bY2oIGk}#XY4yC?u>noXB*=PHaGw# z7%(|U0RknI)1xQu?o4<6{^;(Rp4r()^7nn`eB#*&9jdFVK2=>^{g1z2f5VM`JL}BT z%*wP`CGkhyaGj=u#Thv7BB4&@aS^B5%XBN7=vaCzo zA%n7zTh=#!@U^?&|Jf5}E$u$+71IuT#kAFrjsNr3=bwIJ^}3ZihliStv1S~bbyiKV zVcR4jr0nP_P3Yi1HeOq#+_ZrrJs?7i=ge)OaHvnuttZjQhJ z#lO7fn&1BBcY>heMx&|2pnClBQ%^hR6d6Lr?Dn4+3FDbae)Sq)n3-f==m;v$J+$%a zXScs67E4Z;aoLBDgTl(kwyb=1lSa5Xe$BtklZ2uFBx_&N&MP_B(WD zsjJ)=Yd-(*`afO$@ST5q;q9M0#qXY3Pf8Ge;*X=0dMyl3>Hm=sNL`Isvu^E#zh}I3OH)> zv%8*uYW=#Gw+-zaZ%jl{q!~m~R;yvT67~<)7A%~4(9!cn4a3_e9=&zVum9)%wa@K5 z;g~WT%BB8SBj_?6w-Yawt}ICI*fo6ND_`@Ur+lGvupH|MU=5C&4QBq@H~#BSfB2n{ z;m(oavZOb>?#*vKYX06w>}On*W+}pEs>*VX?WMy71y=3kc*tMjb$5~pYStLZL@KEm zy?g07i|Ofqib`2O^G|x=K|1hk)-h3FduFSQD$pO~bpQI8p|}lN}AShk*f;W+ahV+)4s7sG3kf&h}Uj1u^3kfyD|JLJaRv1vM(7+OQKIU$6Yp|w^jAs7iT zfrK!wP$nY`0umsbYR*bzv-#5m-2qJIbP0}GDX5rLticcxf?%^Y2@(=ABnTr!lBD!7 z>kg*jtdR!yxS_UThl0ok_%i_{yi^Oq$5|G_n{oD7GeeW)ZaO_}sH1hv5<_cUDhEBi zr8w4(;`SeQ5+dcStVxnE48bjnINmf&V{c_WW3CI_@~2;-Q=-Ttf@08L^nQz@gj~L} z1cnMBC4hbB&p-a4Bko)MXmfb9QmRIRg2B$t>D{cgYBY9^?%cM06PghkF%;XFL-Pj% zLVyS|C{?Rn1A_R-c&v5h=skUQ;iF$p`yg6U_*4O4upFc4^MqsUJd~E!>>wbU79k*9IYK=xSYL55y zO@GDt=bd)Osmv^d8*R$8$KUXnx*;t`fxU50HNEF+C@{3!s3fa1EmesKN-Hp89ryHf zpK;phXPkC=j%Z57W=E$1ovbxEhk<=ZGqV;_3L!M>a;dD92ACBqt=M-Rwi~SM&HMy# z0fM=O$DDi4`>H^YTiH!$HX7%jf9`oFo!e9G93L4KLN=St-~9U5k3RZvM{jSl*&J;& zXUv%Os#m`1po0(Anu!XVTHt<~Os{2HmGu=Hh2cX<0)T2qr4$An$FIKV)t6j)2}21B z0yqpqB5Fp>&6_teFgRs!`9TLoQ5494h%%!?&{|bW05CE-^4ZUR=8nJLHhb=DlKEZdEnUeQNXSmibWk|M)m9j@m8>NBEpLD4 z^sbqKf>v>FSMP?G*L~-|uWClkASgBJbyqbT8xuhS5<3Adr#*X&iOw=geRzR;8eH#|!tp??)ef`iXy{DW`p6;j&pvA{ECf zj#b=QsolQfp|4*5y|LlVSKai}PhIrEkDvE`(ui3JA;CJ zvjsYt`EG?%DoiGYqp23)#1)yX0t`aTy4G2J|KtA5lTeF zLNTBeGn)g^^h8rNBLxIT^gF>}$zhverHyd-RhSr-hT>+d0b&xYrGf@YumDR^+8v#c zuu|e>bO^NwMi;u|{6~eu=RGR?)RHUK;;rxhz!`^pxf-fnV-uZ0^vfUr;G5t3S*28p zqlsoiPM@{#($~Drh`@6H}x=0zbSg+vC#0$M`_1Stem zMD#?YZ|kcb(?f!|uaf}{DWSFVyW3nK!pvK8aS23HQ>_F^P(%SSNU#|`5XdHiVFI)S z36RPYnb`$;11(k%varIVdlqzM-gg6SSkokB1*S}$^3|*U?~KD23K5SCk4ED=zVhX- z{O#5|1(A*>8d~nXbos>>zvkeB57t^UvG6SXwD9~=UIE_p#X{cg>!c--gysc3Gy1DN zP^%3RGE>&3(lP0tB(bmtk?g35(b507{eMM>H!M8|M0dP+@4f4vJYd$oC(JzPU58!J zdE})-*!9f%)sJp?;n58*KEGwn=CMs9&5@>3+ehjpk{jcZ8=km(Zf(l>`<>+Gn=^Kj zU#T8Tt*>^c+QLYVM z_^Nk&@rsWwUNR?+Rcs-KwCt$9{=ts<%RA;TUk)r^x1#>iv)i|>-!(j3pBQVHGf-q8!cy4LS?cVp&Y0V~ zaOsq(3teI_jZLeE*FC%A4?lbKu?N@n)_Q}W?hGxqqRwlO6{n7(iC}cwcJhiNL8P9F zNsZ7H%_elSR;s}(Hdd_Oj0R`UKK0-!bEa1P!nbeV`q#hwdHdGwl~Tu<=bSdBviGGI zU2@8~2eVd*^(k!NPbzv{*pcyBIj!v)uA+EwplieWp>O{CU-mt0_MxXPTCm^X;M~r| z2Ofa-dE4t_&25`U*4(o4zQ3(}^xkz*Jy^JKMkqa2ux1@xM0P@ffe z5JHgFYS+;4+uruJPk!>_jYdNVVZCy$uq>o;7L7x#1TKfwwd;3%=d-sg+i%7J$In}I z!1RInwIj}3a$IGfc6}V)KC$}6&ClMm@rnD_KKjs$90yYerV1(D1WWqqw7tg->^-p^ z2jW;y9hkBA{`0$fDt_ldbnsyZ{rOMVjgE}YnKS2gmtFdm|M)7_->QcvpqV7>!PJya zD6dr4Z6^(KHf(B5Brc<@d67)b%pzg}N0Y&Mc?YdNaGA2@EMoYas(fV|e6m7_Xx&(K8GC9_8p|0aTKcHW@_MucX&45GxA; zCh^dvPYa+0GFFs-SzKWFQ?yiWrJHx3kh)s@)=p+P1UdPb0qEXcH>M8262NQ@AT!zA zgb?dr9KQFT8#_CLN-dNWkRTzz1^_r;f^kJ9i3=EHY*_|t=2#(aY86A7jKK=b&>(_H zI1U0Nq>!9WTbP`%nt-x^l!Ap9C9A<2nqmgPQYlsnnuRvHmW7I;wARGNucvK%o*;r| zf@b3r6Ce^=Fa$uxcW08gN@*5m7z}9BNn#-gLXZ#yL7D|?A+*^^MjUIfW?_Dq=I?LJ3@uhJRBxJXJR#42ctb@LffO7WI*HN4c2t{(X*$|tZJQLQ_C@Ky(7=_1=Gl} zu9FhklsrYRPx7S2(G0Xd>mZ8{@|*8c8wu7S1cJ4y2qv#-)U1Eu%^$n&?whXu(@)03 zk)W#*$HcKSoI5I|TFqcOVN%^Fn*sw`bFA$-(MmTP5jSHJAi+wgXxsKB3l5ld_~IvD zd}4fj%(jMEm^?kHh1QCBT1acPa)EEof5G-ONfST`{c?xHkhKIHa4|kcrQ?}%XP=E>^+QD{&kLLGZ#0&v$kAOq)8@$Ufr0*^quuh!md@I2 zrHC~+?OamG z@$s=G`|kh6&wu{aueuOGvl*32Wmv#Xa8R0yXzb0McHOeCWE{vXFIkNa8lR|l^>!b2 z_+d(^vGFk#D=B2PT9H8@rPNA~jgJcQ>(Oy&LM2!f-W?!;Uz|2IgH7nOnXAvd+q@*jE+ujT988Ca<-sb4% z5QgHoT&tXa!MUd%bW%b$BHFld$Ml%MMNSfX$c()2AJ5KED&oBBn_A8rlHaI z3Je5T*cTvdkdP#`@o^Gs1GmU7=Mo?U5or#I=Jk~%pmh_`Mv_5-$;_5lm)@6v0H`8y z#hF&SaRXq1YKvpb-D#(0t)Cz>Ok~k@a^`JU@3iBVPgycY0K^I;%S-pV_U7CEF)}h* zs`f27$;#i8n@Tbo+jsfyhYm&=$!JqR40!bkhtEr{FzG^RwM?pK8 znJOg5aDo76r9@9xeWd>R>%afkeeWkB?|b%9ELu2c{(e0R6l>#rv>7&&5%D^f z_e)M9>ud}I0f=Q->F%r|iW<#wAVg4^K7H=|xibKcxHNasvcpb!!)HGC!F^{SiWPuZ zX(P!pRTPo79po@=&D@{VRBpYD)fp>pHsk62{i|NwbmgaRShnx%BTrng?@@z2(@M3T z@|4--IZI~&vnDG@V`OJzbmzp#w&sclwmtBVl@HysDkzs{_RrWpG!myLCOD{&?Mzl> zdl^)U6n{a`fTyRD74ZDjuo}nZZzb7Ov}<%?=0KoX5e3a=vlNy_cI{|PjL)01_>zlX z`-QLk`$KoEUh~}M#;7iLN|^2KEd0XL`im}8bEM*Cv(Z(mO2~iS_T1gKtr(b6o3pro z=AtPx7WDQ{>FnvRmO26=#0@nu(%89qZ2N|>msjmv^W2s#>qbJZ_VrFd4~9m!$8qe@ zF{wPkdscGT2cBJ$_eC(nEC;&m&syu_jyv|Ov(9Wbn?Vp7PgoEH$=lvYkoSud>Z^#m zdiy4t%}4Ir@X)<$Yt>-J-0mrJx~DJf>7ClqKdr0QRS8S7IT4Kw)wix6-MD&q<%-Q) z*6-ZDWxO1gYMmYBj?%7?VXY)mZwvbh)9U~dzDXx9LufHE(U=%%lq*s*3nCCTn~iF< zvSZ7}FesgK&M6=L$VX2+=~$)I_{ufa-T?r6SV53TCwDZFlPd zKJpThm68XZ9WVQXe&ANo8|vGx<)uf^v2W&jY`rxWXOkOLXDE;+9YZsiNk{_o1J~;N zt`j{q9vZ;`hhotQ%wQqy0=;!<8Apw6k?XGGpMp+hdpN0uoMSm3X(SFzXY_j1CHHnF zlQN|gZlQ9@oJH1>o%Y@rHpiUTXv;?o%9Nf(f@D&{u^l$8I0)z$S3O9z?laGwSFQvM z$>xx4Fp(f3Bm`IpK}-@Pg%E6<;4 zvu3cCAR&a1WKq4=LppzLXu`3+Z9MKv0|;1K`cUA$g5d1K?6Dv z2*N;0DWniYQp!LE_LL>pCn%vcBBfNU6)TVc2c%dj-HcdkL0V}IWlm|8B+TK`0t`V~ zN|=hZAWb1zP)H20ide@n$C|bE00<$ZH1Vx0NSS3KLBv9n-6>&&y=IUU0lDmp414Gj z8|by|MrQ4wAMB=Mr!rt#Z=*yF}580 zQ)2qJ1AI>J6~GbZ0)JBau+3NSEF0G@q;4X|=}yQJ5NR!?eDsN@8*0&iUGkak+Q5(g z^y3X%H=!0#sU(FYfLSS4#6ZkiF*HblHA6FTk_Z`qAW52495oR)D{*Pw-2J}sfp4HH z-}3c$G~$M>lms&bCBh<+IPm6YevxEPa8Lph+?e?*ZTVu|qclK(0Z5vN8*4Yd+*$5y zHX4#3MF61Qm|$iI-v6NG|NDa265YfoU$k^EE^yxEp?%MUi4}7SzyXOa2|95X+KLFM&1f?rDsX1)^mVpeE ziWLJ6pfGE#-N89onVs`Xwt7qbPEpeRR@2?J+;d8&pbrKB**8p41VBnTG%~bt)29Af z??k;(E`^njN*qVbtXLg->`~wO&Q(VqbnwXNNU2l_0-5wPDZw>>6PS{*m$I|Bjq$KY z{u5?hZ$$NaJqUu%T4x-`%|_ErM-Wjt2m>jV(#>X52*GSqi+a<9jUTuf*C8OK48y>9 zfXvD6l}d-D51lEFgAdQ@LFW8r^Y_NkBj>We?V@1Kg% zjG8H+ahKNYPXDl{S88~TNkM+zWs|!mmwc0$wKi3siBNd75w&I~U|dzidYEo}e8;i-_kn)dR9d%h=zIU}G2_Pw1Yqvz#VnnpNTG!HADai$KH|}NgC#?TT z89tGvZKJv#YoX%tM$}cSG$wXw#=L!xSh~;A3l6*R@S_inqk27}z#Q1csYK1r@SHi2 z$&TgEbiY{zgX`{;!%}~>TN7AFmI4w&vt|-nfQ6`(*VMP)xMl4-=N`Otu9`M=VslKT zFhoowt^ZYn!9tj{AS{@OHTPHJ92+1F74UlVN7Tq8H&bm}5X~(-YH= zkllRei=CW9p=BuCHrrG#Q8JS0*vZn+&{#aRBD9`}Riz^s86TghH>b_p@1*nJdh}Tr z9k^`z_(Yv32m(RybZ<(?-K&t+xkF}~Ols4>%nPM;1z}&c2Ly^0YbWi5V6!vEq;Dq6 z3LH?Z;-IUn72o~jy?_q7JHt8CDB_{K3GG^?jxZ z#!SbK!iYLSkV0BlhK?r2$AWU#Yu@^y*If3lP2<&(U88zhhaghgxl(;O)=F8=#cUld z?4(gLRm|@Mdt`^JXpuNm0Rt3>sHw+BCb~)$6~rr^TKDLK&-e6pOrP7mc)zK077WZ= zGB_~3qt+7yCA;Sj#O6T1iJ^FSTXX%&UF%-j`QlUS*R9>LZOcTpvpThZiY7JQ7|}wL z+VkX!j$cxv*-eAA{mJ7(6DEI$TyPt_aRwk{xl%4m84w482q6bSP%2gTKj5${KK=Q# z&pc5pwRQ7QKpif##AI_JvGxQ(lXjp`11MEW2*l8?U4xyygWWwb^u%c6@%z?4aMwC! z9Y`vNfeeWRK|{qlZZL6BmZhGqj_Ey9HKVDUjnQVK(aZrREA}&eZ!6m;zoeA4S}lrV zDWz2?R>0ftWwb_GlP$j7QHmPz@Q$%^Egb0X1}KiB4XejrdVWXqmZs8isRR-NWc&{t zH8_-&KnAtW^7JWHO*+!iSbZ#3y4)ct$z|v!2$9z{JA|oKkw{c96P1HXDGWpBn1c|I zQr5~{Z+YWezW$B>kWx0AjW8@#I%_0FvgnqJyeeMPZ>JQ~@i6xQ4<08kruL(`V>n71 zlShych$qlJUz~9fueb*~5~Cyf58o5B_s0CA(VT!%WI~F}Ezk(I&vF@2dCtN^b7n&0kl$fk{I^o!)&CUbr10Hgi+B10^bL0p#nd0C?aur-T z5*SJ_wrNrKl(e@ z|K#Dv@87y@+j!VSAW4$hUM!eMOHv>W)=X^DGAS)sGqi3ZR>a&Vs&i*8J^z?<-+0Pv z7tNUa`QQBKwv8LQJG%kjLP*p>+T$X7&Bx7qaAi@1UuFurIsdwOV)mE`DLZPlTDejR z0zo8&tT*b7s4+No>YLv2riDxPI^xiS>h*f1T4k*!i9^b_%lVa(pIL?>O4HU9aDUtA zGCQ8eeb3e&1!=8ImC`SN^~*p1>BhId?Jf7+fA14dKCy7#!qL&u-oF0&#Kd*i|B-|U zOM%u5)^;(->_I0m5J-8#i6{2=^*5}?jJ49*xV#-X+jZ0bnc(mACQ=^;yh!Upt0*19 zMA2G@wYg#&^Bxl(SFVXW8OLqge_|Qjl5XFh|WA z4VKQbyyi)Wzb6+bYBYC0Axj*`5;U@N*Ijqr)z{w_MR9jecVBO>cJ7)|sWg4YbOLYN zw(Z&Ho}D#oW*kQ(q{+FKP?3nn#zxn!T_Z?zc6C)dYFeu#?rg`79XodHh*UhZbLgQ* z9wSPE-6W}T&Yy5)g^}> zc<2d7ee$Cpj-n`vq96za%#u*c!4uvJab}LR=Mqo+C3Y9Ps94upHx_AOHi1>Xe_)hk z5R^ha&P%2(=&ST-W)dW{kR$*WB}Tg(2I@@+?9X2K@ScNtmfcJs}UJ3h0l-H<$djpJ(0= zWKgblh;m7QDoRNyCv<7%f+K$Lf7dSAcmCfVczL1`cXgLz&2Wretn4SfC?Dkq2QZ2!akd&`F9_v;NfT zr=NQMk^hB6wR3j=w52oWEuJ!M>ENP^m!0v;SAFhXfBC}qZ~L)H(cpP}Y&%mAXCg4Y z4Qs7EO}b-Le!`ywA!LatgfOR(3nm(zz38nU_`=m!erU(g_^<953g%B0f|Q03FiAdq zihCAl+Q{8vFRSr5*&*-RnVrbYNeU|VIfR)T^=SHxS~RT2no%f4cW1Syr=uCwSG}<1 zxo0-U3e{?*)>ZBstaVn)q1iUYh?;SIqA{{-d}1`Jk3~T!%cW9BcX`&FY78|RjhLv@ zU8AZJ0BLyQZZ7gkQ6Ro3OQk*HR!T90Rgjc2}MFFJ!i?3<;O4h^QwnN$Hz%P20=Bf)~YpO@=>x8 za!e!z%%(R%fYwU08jZ%Gh&7EjCI%ODFFj};V1txJl78IsQEt811510NuUQ@lp{=G!oJE|@50A~^M6Gk1Qg#a@0~E*rzz5#{{=U9m zrBtL;5Ck9s$KYmGwNOI6J+-2U@-o+z$HfsW-luRFjRYhSSc@{pijI6eo_RoD_Y*Ot z15ZE5SARmh=NmNV5RNtC29aRFFvfzi3kV63gFF(S+`Z88OL0uhcY=kd-zdY=X zP?{+q6+;H>at8W@A|SR?Yi11r z0YEEgWz$>}5fg+UFh!arvjr~RZUd2}JZq+a0H~N%lZiMeNgX3@YHNJ}0BPbN6hXiM z1sW=5rCAVy5J4aSs2EzaNoJSGHs^@)DoZ+|AtbrwN7mXk5?}%a2ncbEIMyVD5YRD4 z4GnWF6GIRQNzkm7$?N1ifJ|C(9CHv56LVzK$(2e3ZF0vz2zzjz)@(#0!JKKE2tl}v zX(?N~__)M8O8>B2;c$za6&kS^9&c1DB~wX86`9kkY}A0GbatTOz1->+BWk_d@?8S> z$V{qhRus4E?QfN%Fe_q~67;QB{ym~+azPndVi2_HP>@%2yq>h3?^ z^Ync$uYYNHe0V}NnjANE0^r%E3Dis=!Lk~bYL(t8ebWwHe89PfoN@MHr}kEBV7#zn z{T=t+CdZ@BS`T1y5vF{e41|w0TcZqiOFGvqN^HB6p@69NCR#c5H#Fyi1Y~QkY*5arcfytbC<_bolg(j(ax1I8wBdxF@1*ckTg}4z-{Oo5xyZ(>YE2Wn0 zv+Q%9|6*@_tW_4ZCoOx*m}n~po?*ixy~jG|OY6NO@a(LJ9m%jYv2OqdU2;|u4Xcz=qsYbmag=A-9<~x!GO{TT9 zp@-M^R8$%tsStt%kpxNDWeOAc(ow6ujpA*S6P$-S%$>cp>1RJF;VH&E@ch_3=V{Z!05;r z04kC3CJ~Xar5N9@6aFs4m9trlR-ohv(QF5j(P)pOvIA7;63V$>i3C9zS0tR$6eO5= z%9LqWU;V@5jyzz?&WXAXAeQD?K?%DGGvuA^qwz)T4i(p0-8fRW3MNXF(c=7dvmtjZMB=i6O||E` zVUcP=0Y*)f4x6?&D5N+h_O@6Opg|<55jwsm|hzLR{0hVUIG4QI3-|(If%s+I$*$=)rG!livY+v=cDSPdq8@ClQ z+2swl7-4BZ05G*@Fpy!~h)76iCV;fof*@htM>emGaf@%v!Mqn6+X^wcio5F8$DPdml5XV=V+3S4<-Pa{VKZ zEwlGi*qqWl1-}I{AWKR2!-GVu!NfsTeE4hU{-}2IBX_;n7$ZgrF(e7IUj_s~n-xc; zXd{Q~B>MvTrBc)>|0dqLJZbDS(+;{TJkMqNih}j+d z*j?&tZxnC&5-mLmBq9}YP$pRsfg}R9ZyOCtvZt>KK*fj}3P8Ck0kGnU z30?+kh|MM%kTzc~%mkf0F9XRWN11~uM z;3qdd^Z1%4pI!IDs%`5x?by0&bakgm6}^$F zBSBJ9N*S%n0Kfgb+e$CCt)(tEMQx_I@SB^(JXHt>KiK5gAj!t+uuD z8QaD1ta(+blzaPor%j(eIx;eM&b)&UI>Z#xS*yMA^>5g*V~1vzk^&i$ASvvwb_fB@ zje33h^l3>8oDYRzPV)Mf_&d|#ESkd}l;kP>oD0V8VKDiL%qzk&#+zRIIsgwnci*nY zNU2%^3_cU>M3R_$`(`U?>GiP2ijwQ*RL%UQ{-FnNd%a;S5A>&9g z5d}gB5&#q#tSeyF={*!~7w|0FPy2}?JEv_RNnw8{gSLs0nS|z7VDxPRGz2C1IZJ@KNn1}-1 zP@``;ZBcJm7;A0PYXkx!>uujdew++I=ad~6lhTsKE6kZnLb|aeBBk`=z2~b~E6r4` z$#Om2$DNQC@Ur_9&++70q0mE1JW&pMX|MpzDo^RE^+k;_5tfzG#2SDGL4a9M7;cGo z{r9tfIeXC&3;R00eqQa}6FVMxk(!|lL?ES&X;VN$E72T1cK+};FPS}~1DZ8&|Em~T zBg$p4P5)w6#az&{0@bK1oO));8rpjE&*nUS_5n2H((FtdBGOICM|?LfJVSW|K!uWz?$ zm`r_4Y|iMimv-UgWSrRm6f31Q0);@Kgbt!$tfRU2-piKFTR5sGp5LohwrBWazS#4sx z-x{p6t~cro1!hf3Lkq|_)=I})8bfb+$4SQ?x&Nm=`lCiY1|Wn;*~=iP+_GVo2Atu? zcJv{qyWk`<5^A-dR-7z?k(DqEjW|}!I*@^81xOw1IEq{$oF<|2R7C3~OvIa+Rz%Hu z)HgGH>laTt_{4=b|K^dGp4mJ)Qg6gfXc5S=H1QowhOo@a8X5#5mgRV0R@ccF9(m^L z4ytrhV$uPgv??FaG3un@sXyfY?Qc5m&1ykquA9L!yXTM>&ENc}(NG4&^dhG5Z zxSc9wVwIrn;v>0%Htp0(%Jk4xGO&l4CQEg^$G*AZZ}aS7cB8>#WoJ*C0VHTmAZmJG7U8%h$}U* zrJe!KOztcQvj#z`&&^D=q{~{Yd%`10gP7Sw%uQ}r_$3Mf;d?N%S0IGJ?^d&sQH8hp55npdBY*kDim{!ekkKK>FF5g)i&w4~`px$rI``szjyQGh za}VwK_NQ(<=k?3adEEi^vB(6JYStkIfB5mU|M=6&?pkHX$k2svKj6YQENhI%fBwJc z{_v}Zh~taiaKxFfU0SXN|G4qR`~LEB9LZ9R&VS?H`yD=&?MaMQ3^5P{G%*tY=9|x4 z^Rv6APw%+wJ;$DM@uDXm+SL-}3m>^_)8Bsg;<*d9(JFk2BH{W}_yIhlH?&u6=@7=fjxW#|_ z_0tC(JMGj<=8X@T$%~K733lUYWpB8g)hq~7BmyU~=bRgt$UAC1&jTq_72;}B zTg#)|l68S|t!TZa_42%^>ABsWTPGa7c9_F!#j8G z7}|O1t6$UA+XH~L?(XjW;+MYI+LV0Dn4>6)l?uZ!5$t=eB3y7jCj_Ttj69v4=Wkz* zr~1~z=al|5?`by4^?h=2z0oL@N~KyAAtKdGzV`pf#DMJfDw>LvXVDY`!-gW-z42P< zefQb#s{i@k)6YCJGBW(+lTSSQ$fIGo`-SJ90}zIRkb%;A>eQ*PdCet{Jo0coZv5~E zKO7w%e)VfE>8N&;N+o9AH8S$hLl1rX+uz#0eTbP)JmI9}%a>1#*G(0&5C;-M1|tpik)N%8?1_n>QYE2?s9A3werWfp%lpa!jWtZPe2#?N(&x4_ zqFpzWkxg83g-EpM+Z0IHbI0u5p{N;0ifh%73B-!D0%SS^?OvSJ?4u$xEHk;hJAP|& zBG7c0jV;D3q@32(cl7LKH$8JlSARt{HGu)mWX{uMA|l9#*FXH8yMFlnW8c2-l=ob1Gm@kXQ-YSn-R zF|>`ZcO_W3=9TD=iS1S%jTECnk0*0|#mw%3E?M2Flwgo15J)8!HiPWBS1erjM4}cv zNJFsGff)i&00S|UibSO1dcB)Er&jwmZQF9lq9adObl3o@O2<;z)o$_|jTfttuu*a456hb8k#CVH%Gfk?L(GeAP{Gta(s z((C43@ts%x;;Mh%ch?Ie+Z$mJ1Ud`@VM4ly3CxPLW^Jr7Q?6jM%0SGTmDWu4hGH4_ zP7mJks?*>0u_JE1X3fMzDBKC``R26s7NsqNQ_gQpl6u$&uXy0By31necnBkxBD1XVkm@v>z28V6;x^g6}3# z9fglLZ@(HG)lxEf%E~=;4GR3$cxpBA)Y}5wYeFOwElrzhFF^!1wOaPbSitDTV&}{W z*5=>@hSHh@uDkZ3%`5atXYBJ|U;F#ZYsS9#!&Cos?Zbch#kwbC&MY zD?+;G`Zb?;-;dt(&eIp~b$X?jHm=(7`(NKNciOaapZdR_-gU)>S08`+{{Oi3;jL@7 zEnW8NYrc8g%TI5aJ9mIJYsJ!J*b|6j+t19;=y-4dFB6Jw&d{M`e;NZ)IkUlBC6~E z`RKjZUUUCDK6diR(5~-)>#sAHylQ-B{EzD%KjEB#1^agnZ5vzh=$Zxd_j>g1)z|#` zzBgWc;@x*WyME(_@BiV_u!_;m>No%Uz*X1$WzO_>9&r3XTpwBW(o4hJJ1VuteoLoK zS)?hRd*iR}4{HaW{OY+s|IfSs>uWc?=8Y%p8Xoz#cmMJ;8(#D34=-80V%xX=>yE<@ zS$M=NrmcBu>mRSV_w0+8VXvxIiYV|#%~^tG#HfYO9OpQVlVLa_2x4hYCw1@}Hjbaz zq|waqVrvBeAd(e={In|Y&zM5;o})=;ntx6DwBS+R1L(c#TpJvZH{y< zDgS26HMwqwHAg)_=ioWQdf^E-T%=5!YIqqqPC8&CB6*u1S=NDG2 z+_+)mjF~gySOtM(=95l5>2Fh7bH&fM-u=RG$Iw#*;|Vc3LkJ)x%O5$rAVgACCNgD6ODN|-bwen(X32rkEo0Vt{ z*0G*m={bAuVK+VgcZ#)$l4ij6mMM^-7QuB7-71>(|2X~~b33}echQXJPl~R8Wao-a z6T^y|L`(aESM1Yw%;GK>Zwq!cxBg7T&rum1$7a$n0onv(84FNS-!YIgSx?wp77)y` z#oR4s!j|sUsu>+8^ml65;CnawYp7;WFfL+FD3}EGk9E)!njhjfC@nYAT)w- zL=>k2tY8Y04OK|paGtQu$kM{e#wng+fGc5e-(AnX;+aF|FYo^NRi{1w@L@Oo?%78l zTDf`Ma5DlF0wGMQB_>GQIA(XGqtdLDQi!yOOC5S}cGuA-E;{{{`z<=Kt3DS0?YB>a zq7;TEcewA=-6OLirFg+TyFbLk>XdZ4oj1h(%~=g>c+Vg~ow9|G)kM+91Q*udULO$C4$yS6rlHjj*rG~%WPL|B&PT3G9;boEuj4jGmKaMXw= zCYmxm!Pn#4w7WT%T&8UWlQe;ssU9^8Pd*0nzfDQ%uPUZ12PTaWqgjthVy|Nd_d0eE z0N1f|OLN=W9b+R+9hsB>+}T_0oz^vFRy8OC0!nEWM~!jFPzXuZJ|%CYobsVGGOz_Y zn2)UCk=GTJj4>R_f@FeOnedD9L7gvv^XBTmlKg==yU>*wU7iZCxoe4-B>-It5KYj+ zbMgL}xb_O%cPGoHp4Oq70X_PZxbHy`0woXxLjn@zGCImsQW&qJ*2(9+m5#bt|KYp1 z`TwY|o0UQ+v2`f^@mIL3799F|W@6>eWFaJ}YLNxMtVoFs z&X^_}&q+z|bkaKqN2iqgPrmqo5B+$*{gT`w`tSe8 zZSOqkPtA$Z4}JZD{g0nDHqsQrCRt$3r5dIW^c{L=?IT}1ZpN|@0#DrW^0hy{`wj0t z^#fl!5x|eWcE``Yd+!++E}uVd;KalB|J2n-J@@2Z?>^&q_us!_$>B$8rG*fh!CHsq z;P&4?|Jxrt{+=(M@#ZV`2jj3m&u;3mTB(2f^j;YffFR)h!H#OBGCVZC|AIMJeDByl z{h{M4AG_ha$O-Z)`d6;Jj;b6UR>`)^jbgsC`RTmsEdzVnMD-mLyEg3D^xVeP&u>^YwqrY#D%EP8 zJzW^+R?Q~Ib&!_Q*s7lEBb5-GG&1Q?scLFCa+FJ==ai&5lNG`guC?y%?s@gAFESOy zam-q~4}_4g06Z1DY7*nwkwD~cdCBxN*OOM>&JC)+1j22;WtRXf z+jsL{#ac7_5#dQIw83kxi+;TsK>@%|p6&OjsDrK00h3*n47XCM*=#a%UtjOL-t~?L zAGmkp)(wBU;f8m-Td>#y(Z>fX3<({FzBYXz;MI4qS)VL1%K zBMv?M@{e6Ud(NyzqY;)uW|lJ8v}x@<_uNzKs-1G$=?fPv*s)`0sT2wlGLS&VI^F%1 z)#Bt(;iO-%i>WlrVg8V^hHi3{oQ#dc3(AR5f=_Jo%StUn#4IBvVsnpiTk4R5$pEVu zI`Kph7=kd`oVfRie~wLT56dN4l0B6U^Rf^b+zd$oL{O6DuvxE9MgL&Xq3nFIO*QAL zLxQ9|wOJ6k@Dby+)CA!GQXZJ)pm~0|(K8SHcP1GoHq)rB+=6C~nO)M^+@}SeP}@#l zKT@inlQ!jgRQQvUzU8a%U8+`EFvFZwKeM|cNkvL9z(T8uSoZfk^61DJpMLhDS4_B zft%gTK+LL!@R;fQ&zin)+qU&VsTMaQ2m!D?Jr~59C=lE=e(jULeRS&+UpVSbC(S%! zVPEZIr%m;1jKG`5M|Vz)%&&Ha@dJ&Qf7($Ytst9zyJMUprLg z_oL-bUPomJl7x*rkmzKJp@KOO%O`ren^ur_4nStW38~~PXkR;TQR};&#{>WbiJ0~L z&cWVl51#}t5-k2 zWoY}v#8|W0S)R_QLQgm4fGHRdv5$jVO!G@X5nQ6>%V?r|^r3k}h ze^g2je=)KJx0~1UOq;r#QpN;Yq>lGHkvnNoo^K_6*#a#IDTn|SDQyHofSy@F-<+wI z&8@#hE6uTLMiT%t5y?=9vI*k%!k^s!PCFNDebI(f&}3(4&EiYXdSBOJ)7O-iZLI-`|Uq>*2d?yzWB(<>)w6(^*8Wl+qKU(NSkC3PN%7wa+)BaiiE{9ZfXGnj#8HrD%emx?|*?o1cj*TPx)Nz{=-d zZiZu*z2)ei|MYM7{C(AlmoDT=RISPJh?UYr6iukO(I^L%O)u@BPMr6e1LIf`(McD~ z{l|?fo_Ksm7?k=uYvE|ue_#2~CFd@QVr5ywCc?|lO>Yf9Ga228SUv4D6;kenjpofj zIgh{6g42EBXWVL9>!{f@Wdu?RX(9-ih)7Bw zs+uavIbfKXv{szvV3#C}Z%zndqH1^RscCz)aS`Qs-l_pRJnYY6*L6FCG;8HjJ7Ym-SO2I*H))sg|_k1&id?~qIOJ#E>v#oeWz_J6^jvlN$>Xc8E$JNqu{{)= z0h6&uK$^X9f(B0&)kB~gX-89uo?*6(J2=Gx{vft=)UmYFBk<3ZOMEZvpIYl2@EXRk z#mT9Pc~xU4p*I3;BQs`vs$J|yeDhSe$;V-(*W(Q z_oOJ?MUk-wd(t8B37bi$kp&EXn>;f#dCQ;Ia3+;2nV40DYLEVN?dRTg)9XKQce%H(WA=jXsdGw6ty=NK zNMrqqu^)c@&inuIQYd?alHDAt6_cZWg*XP=ra|7d@i-b!RZUSq!1^vTG4`~ zh;uiXc-QQB+v$_;X=-z2K}yk^!h~R0M+$_Hf&m6=X2ngj)ja8@Ab^ZDBcwDY8Tbfgk= z!3=xqfJsV9WKV5KPNhmonmVep;;B8>vq~A6*IVCmqnrHgafy%Sy@{0bE@f)mqg`d0 z@4S+eHYE>;z|fkQK>@17w1nt~RjjRvmdY|iB|Ia|X)~uMgcr!_ zs`YfTDT|$M@ld8&H_TDBQtEx-p|OvD;#UVQp8Ki)J)_zckd9Zqu;Yf`soFwx4^#l$ z^6MvgSLd=bYcFk@ci(lZ&$?v)QV@(a6blLhAuAk&)QDrPd2mj!q;GKHvYxQUYMj#f zMi9gRDm@*~KfCTrpS*Dt+n1j>v!hhef)J89m9?W&q8yJk>gDR-u8qwrKXm8t(8Sqq zIPB!Zt5N$= zM!*nYLSy~V5lfHhKX~3VD;{r*jUlCtx7d`WNv028$J<@xqhUKCy+NQng$s&sGQjAv zR_7br3Gbj*LA&jHoHCEobY9)rc2Cl$%)6BPZ_BHKV3J=+6YiQ=?nFT#i2}EwG9h}t zDLxt^U(h4P3pSXJgh?-9wdS~C4Y`E0BD=xHi3y=kC>TNx-ecm zmGhv=Z<6msXonb*#%9Ee19>?=B$3@6-;Cp-;gNEwylKmpRWH3bZ{8fkd_ssgisM)x zbM#Ti9DUTL+)+*{7u=QO2MLp7^G8Nv%cf(c=@#=gk1S_^!fWIB16eG(L$=5vH|%;eur z0uU2Bp5P8RwA0+L&nwOTnfKMEf;x%B$v&E7%C{Ec-O2yd+GH04gEkCB7k~5V@p`3H zW^lwLm`zR!aMTnOlxji^#}D4K>%O~pnJ7)t5Q2hAIqWONT5~go4J-ga%p!_ZWy;j6 ze!YH5fBEurr*(u-Y}4P{c!KOKo}>$f?&Ivwd{NoY+Y!wm)B;9HHZQk1-X;SNGS*~! zTR7K8a>kf1jmhR8Gah~sYtX&+xlj>Gj<59?U{YC-bRjPc zomY+-hD3^$Kxv?-4}oA}AthK-KoDRnj3^Czad8KRc*$lWW_Pq%GVTIwoL_>XX0x-S zHnpqY^hH?l$I$jQQ*w@z9Ur)dg;XuN+&WU?oG7vjkzny+`oTlx>2hH94gaYv)HjB+ zucgh%PuL8y5(FVp5_+I>aKrOMUwZcq`yDp-lvgZUe*Cmrp9n%B12JV*Y09htV4zLo zp<*33bsVXQq4=dIhwr=Xg}?s(v58Td);Bmh5oxHD@tr56H3A^LTIUG0{E_WS)-%PN zRb(y7oX8&wW~cdDEFEh3x}dEkciRRoar!38cOWnuvl;1&t<{mpxY(gHK+ zyx@oy+tHMXT1>s1{BP+dwQ3VL8-3Z}sAvy^FA+eT4cbjd&E?6r14sFHJdm7}-tMwU z&$;nh+MiI1nXMO}0Vd}bZC(9f8YX8~T>!uuQJqOzKj;3Zt0ON_H~y4LWK+5}6qie) zF~&dr0wP7Hei$sEV-NwFNP+|l@1UlFZlz=0uGhtiAdAWhic9ev+h3_PhLstHbS)&M zRu*yN=H0Nbq>ednP_r$`cE(qq8QBStu&0zD3B7ScoUsqR>I{$iTc{G#W};p{@QA_V z2d6##$jigKMu6Hxy*_7f;L}&1)W1K)O%28~j|^>iapW5p-m#&ve(lDcFRvUahe13M zHYWha-8Zk;v3_Fde$$1Zu8wl8S`HwHNC>y-gdhkk2*7x~G54U(4}9{JIZHbS=ah!l zjcnPn>qN*ms|q+h5#Ou2BD!^49Iqj5+-SQ%m)+IECB{00V=a z%?K~8+;Q;9Jtc`}9^2G6qt@LWj*U)i-Z%ze+xp?5Eu#YiU7I(J&6(S?_tJrlBbyf- zFr`!$EAHF$z#VH|SUL9g2Y#_}=Lq+qu~UUrA&F$Ulng_pNNIFUtL@s{eEgy9%TF0# z#cQA3xN`l*1xuzpc++#bvg_nG&w1*ReSh-fhxXlP3Y5u;WwA+uC%_qToUlb!lloll z@fi`324eTbV_h2}iOJ5ANiNaif^!U>6Q{00#RAjP>Xy=}D z@3g#-3Z8Zlr$}xVxQdC~0$OSs6)-|JDmQgSwJNG)y#?kRE^`>PbrRcU7RNJ4Om2gy zvRyAgvOeT6Xi5mXUzVJv&-J;G{aP1%(l?6+qsU5k$JG%b(|88J8ZMB+3Wl^jN%sKc zQtf-4XJd)9ptHh>)@n1Sn>*6hrC*TUGtSH`tbdc3`JQ|3d-BPrrwm_oPm$IA@Fu;v<{cUVaza5rEF|E4?dcINEaeP|1}h`khlC` zC3fyNbP{_RZf{Fb+qv|bA*ac@y}Nz3@-n4vVvCGoLq*F67R9CnvwbDV`%N-#;K z$ZVR_TCs)}B&s45#iHm1Ye; z^O0)Qgk-xxkx4U{g&-|S6M=L{^WIM7y`dwJ^pPF=Tn~0E7hycJi`z8|T??U^)a2xKY+vqby=Bm;&y8G0j{xMK2`E zDrt>tL>qDzZ%;|xc?pwIwtLz7%p*fvflx=>Q>_t+=O5nm=)J3Zr_|=}-M{R>>2nwL z&sf;qJ5Z@~1wr7Blh#lQs;L@d@yO0-}w7FWzpZNI%|83S^GJW*54YEV) zy2|c2Ae*}n+P!B|O8TShRG7!SzAMvrj_k3HXq}>NlCk$BFE%Yb+?|{O+d_xT--SNA zTpuwBWo-jYOou(>n^+SuAz;lMH^2~5qINL9aOU-&L zZ~dk0F0*6;QxjYcQLpp=eVH|j)BX(rD+L0C1`*j*iit>Kk8u+|ZqxW8d#ccMO2|<} zS^JXrJROhBh8Ej8O7sE2A6pyTmUtM=abBtjtq0x&whYw1CK2cOn&cH|v(>f*!BnDhPrxLr1?wOagNU%m0z(+@uC z)OkO+`_}n~c764lQ@-=1TYq@f4SOAW$q}c_9NHeqzycbjvF|~1%QGMT=9RY%_MW-w z*_Ge_?k$&n{P_31_w>rtd;a@dw@&E}|MZjlO10pi!{_|+$G6YeSAXv3=X~H*-}}JZ z{_D55U-8HTD|T($a^*MQ(mzk%cl+9Fe|XOyetPevA3PSip<+vPt#os2Y}fF};w8)W z*=x=fANtLIeD~tD&#n627yokbF?%mKBDm$ZL%T+IvF6u&aNkF6Ubk*!V?_jZe6ngc zBg9*TL?K&dhF*}{`k5(~0h4k^CvQ)xDhi)ErO^KUOhF)i}oxj_(ZF{9$$&)4bBLP&cbaF5#M;aeg zrE1eJJ(YF^lASZdYW|;-{i@!=HYLNDgwiG@dQP;0wzaHdAlHe)^|llbA)a}Qh!|{7uV-e45P}E~KK$@EzW(*zzMkVxI{xy@FBitG zP12lXr?iIqAdX`jwg!;dwro7FWZpw}F zRNrQ+bAhpvRl5l%7fiKw)JUmfW{@@;iE?}o_zr{oE*bZZ<9m<71>?|uXj%_+Ve<0c z7=|#rN(Bi6LjyqoLMWm{u2D%;OQHmYYPq9Qs=#S^cBOz3P*|>35kf)+QkcYxhQ^6y zYmOw*2I82U)`hfmywav$IWo20X_>8sZ*tNP|I-vk2@;Y>PCmVnc*zT{)MVXVU&yUC zr3^p{=yYi|D?E1x`f~(HdzI_tWEcB?IRS25)119; zcdQuPoJ-~5{pmG0p-8qJeuE2^#EK-jF$L|mDnJoeAkJTW!at8%`SbgJQ|=q2W&}+j z*21K}Fely;34(xjr%%d|phMzDG%~)lf3J5eIIcPLH}Udgy1R_1PLhZU{Wm<&cGBc+2IU!*YGRu^S2uRlIZJW|BGIA>G zgJ^>sipRnqFYg6T`2(2SKeMOSH9Rp!QZO+GU;&m6aXIOf>8b-a8PA$K7lHs5P-bgB z$Fm1#ESNF_F25n!^@qe9YRl;@UXKE`ka-_4o{l7?EIYq&uK7esrZ7;3+?3$D3_TMh z>Dl&^h_Y4%*{0=2W2BEtWnuiKaTJpjJsn-WwXSBf`P}`RpZMoSrFFS1N)=hH1wkN# z5M)w+Msd`L8e?&@sT*Tj%AiyVs@3v9eVNQO6M3!3-bu}cyf>#f&q}WD zHurND88SMZGSp24@1$P2bO9(8G%Xjo*_H^Ngy+fiIO(Kqi+$=bd@&+xQ=!qN8EsHF z#9o`Tk(&w1@aF7fx~6cAe3B3ML_4SCu)kaq2nmwXZO2hI6R}}WGFvLkU;x_WM5G|l zaZ_|nFTeAusH2N+{GRLyA;B!PBC3={)Wk2o#8FJ=e4Nbcp_P%GZHm+DmaWq+w_m-> z{9XK}Rnll7ze6%sUbF~d%HE&^X*yHFe4Vz~D;WR~_`kg-!f%WJ%Q`0r+%n5Z0_KEG zvwzcpaa(;(1(35S?0H9Ne}u^~*WGA_W4gv~yX4qk{o?*@+eQ{Gn{w|RkA3IMw>-A$ zfh(_m^Trjcru6iE@+ZeFIe6%H`tf6HeGE|l z?9Ms+$grva1fh^b8jt}6fj#MCZ~)V$8qh_o!4>}OmoK@hS(N zKK#Oqjz^6@`^~dIbNTOI{pK&6a?rv5e&s96)6o>8k=UvOe$&TJ{m$h#{OX%`3~!k@ zs#>xI8733XoQLG>OD%Cz3L>vUAYBq%;HQ>l^s* zpa0M7Df2#Z?)%T!@3d16IPryzt8RJx&c8o#_meL?J~X;b)hDzd9S{hR1W6o&>I9;Y zNN7kQN~Ox+lxc^~Klr=@Pe1eElX@#P0Nd*0H{SlI?Hkr~b#=i_WJbrat5TAt&od zkXzKWD9vNz;%a>ZAVXCKvnHFPCU>gT|9fu=v9GU?*{$IgR|mlL+J4|lNM>cLH!Aaa z>&)M?HoFEEm(6ae(*9spN|_D?f!wlX%MZT)gVC|Ey%sGx?exon~|_Nn|y^161jLq3#?mqdF1>N z`34sVH+Qo&=8;^9N&Bs1PLd$D>ED2K`zgUXF_i)oHf(;<#DnX1P=U+iT`uc+`wf{`jez{yD6w zyw=HHa#~3yW_i;4^siPxyoc8wQYLx9y`NcDAme+lOPmYK|qjZIrq z#3%(4q!74G^#%_orc8QtooC-Dwt-thLkKX^GoJ-mFn}3dQ>WMZl~TT*fpdXbC{iTG zy_@9SPFS?4*BQ#>FKYR>fI7KP5|^CQA4x-U3X$`zOd8Q9IFHP#7^em;VXx)W`)8GQ zt=?7Z?365;h&5P9(bZAy5hnAqj-xo<#ZA@J%r;vfnbh-PS55YG5{Q(JHKK-6T0?1u zU=55+?7Z-t6Fa)9+N~#Kc*o&F93U`(xU@^1D6!r^mo)lcZ71P>h4;1E9Yq7=S z{_tP(#Xlz#EoplTsIsG%l||+Y%I`8y_xSGaA|yrt5xn!)6WQVAQcHzj+5-RGT$g;YS;aoZ_ctyE5LHNAXm!dlb4(* z^KGC>zQ~`-YH(r}&!m5v9Ubgz*Q5%-t{Nu{XLnB;0_H>odA!Z3E73^d006%9!%J#Y z0zq`)M-M;g_51epcD&+!ho1VnCqH z`yM;HZ&qj5fH_dl(y=^P{=zRWHE9He5D^q>jw5bP#6*xHeDxcT>78D&^F*+YxjIXH z;``^kf7=&A zX4c$0z4GN>zs@NAk9_CV+8xj{f7!He{_(Zu@7ae9eEXKyN1L?l5~5~Obp{u`>zMOn z23Rp4cIJWuPgo$!%nTVMM-4gJSU#gz`k_W$nhHEt`fm?;0B(nHY_tCP`5)Rk}NSr}YfX z?3p@u%Iqc67w>rphp%nnF!6K*L^X<2bU!F8+ zrGR~sb-+3SSuB^+uX2SXbg`vyTXMT(6mB}2d)^{~;jWfitUzG@yZ@J~kP{MLB?wxp zj5!NGw~dk4IpQ$1Uq) z)TciE)Z`RjZzV{&|A#?d$LE>Xbx*kTM@CNZtsx>3QPof}e42QZg|B=$3FQvVxO@O|%bN zh!3Fc!fllQLM_{=4-^^5%hWEESrNaJ14Esuf5I^J419wqwWyYA4M9)yC&dglq!? zcBex!;+TK=o+Ymwi~oG7J+w0>OOb-P&BW<*!6zOpp zMz-(yptLSurwVRQsL)!Gn}$BXF@GnAS0z)+hEc$uPZ>ow`SmXhA2}cl(ySRQh$0m) z>Ky#hSs!`hU%vkE=0~Wr2ioj*O}!r$ z;}y6hREYrrRzS~EvHzc$`oRJuQf9Zh*0-p0-tD$S;2B3PP$9pYB8{PRJ`Q#Uf*Tf# zB@J9HUdn2z>i_Xd1+^V+ljQ&argiq$%2ngsVH5Qx*m*NxTb*zcCB~+^l#%R!(2&Ad ztAHRu#2S$O9RppWs&y<$lG`(+!R8o=HtqF={J#K;oSWUpJ-HGIM8Y2}zxY;9C%5Lu zNSZv?69Lq+2nPBtSB- z&O8OptjtdCNHwXB=(vy_uJQy;I%};x()v+=Qs~;0w&UG zy#BYp*eh;NXMD=Kg_1jwHVLUIwXMcEzN`^nk;LA6@Jb-f)lR9 zoM|Da|DT!zX%BN|La_z38>L+Q)T0KwkTRq+^$92PtoAYHqHQ# z?OJAkE4AFePM4%rxp*j3PM$LX_?!ne%VjN~oK4V^|CJNw)l@4D#~+l9ziv!AM!PP$U%p zRZFIDHTz#E#8VV1Qo1aIQgH2!zrN}IJ1#!`m6sfK-m>Y7JHn0`y|ZRdnSYKwQw9Ju zv;r6ik+=9G6*uDMNMrOLD<1gSoxi)|!CRYL4|=OnU>w{qVJB#r!MUd8gjDgmy_v>| zLe4!cx+uFE-dZCjJ$kipkI-%_wN3RkqBl~R^{?zv1OChH%J&wQm^G_dX{DKsFWKZ_ zBokfLT5@tP{q1;?+3dd5fH0w6aTM!VIVX{&Vhd`WOh@|OrQ98$&BRLJa;By>CEFiH zT&CNQ$;HeSH*3!e{%G(0psZ~nZy@4n}rf8KlaQAb_ystcAZSu$tNT(^8pf@s(9t|y;(^6@7g|MLwu zJooGi^A^q@oH}^(-*4WyVg0`Q?|b_{?pV8ieJLn?_#>Y2=<^R8(`86&{*Xyrnukv_8^%+8&=N-1Dk8iHF5+|L_BI@4o2Bvj&3hSSeHReJdVbv1UcBR#`T6 z-!l(8y%vP^WPedg;Yv9IP4FP`)TAx z*1YnncDsTTGXUA%CQWL0C+8nY9!Gef_xxBM7vlNC-K$vw8LfbAI&Ry$5Tu5pgrtf}nsOe{lIe z^HwUz_nkST99SMsjE7`V#T(or;S|_3 z|9g*q9XB`X=dUVtu%?L2DFcuMCTNn(nlQMGmj0PB04+ET03)C^hxl%;$?dw7CRy9P zaFz(SjWc(j$oG%r&`tjRY`as5-H!2+_v{vrq;#_+!Wiu6>69UKgPdcO$OX;mEDM>1 z1ZMbI!BQ`TAl4AX#^Td&yD$CLCx5?s<%Z5ux0Izo z3MmCxgGob!h*{Vgh#4AC0Ejh{c7TWgjw2B_c)U5$)hj;q>2uC{(>_5URIIII(!`Rr zG~553Hk(@?I$7ak>`6clD5ulN`}beF^6tcpAIu}QX_u|j@lIy?n2%gK_M94Q!LKO~ zQ1OPQ9DGg#?OUSMywr&WR}1DUf|i_g%FTTv3|d7`I*1uGM*d1e`bVp@GfbaDFJ4{g zm6T^BGG)uiUF6wJ8BdoR6EZ?7Hx_;gZ9H+iz2mE=VogAqx4qj*_@q@PNgb{iUX|n) z3ke_y3bcw)>Xxtl4;2RDcURFsi37z7ag(XiA$G18f4`0ny^uu-ItEF$fe>u*REvi7 zswy^}+V#;1rR19&$^4s?yIuS%ebbR5&)`{Baq&*Mo@6a{?{gEh#jrb1tl8ogS#+~O zkVzG8NiSQuYo49CiF-Z2#nP0J{>yL)%bbfqGcgMdkXyMi^fy~>s3luDky+!%yrok= z{?%8>M8(P^ucmFV5JCtbV6CA|esl;BSd)obGe;~crOTb=i{EYtG#6z3P>k~5W~zPRoC_H zV?!@&S^L21C+=SH@WU@YvTef}0hYB+5mw?|L!!dQvuD;zOcMcjUXfFWg@VTF40v4S z`rodrmNIVslmC@hK2fT9Su-S@qpL+xIG87Fk|=7sLYBRq_9ctFeP>+p=;W@vXV=|! z|HN@Dh`?-|$jvA+^we4>X~_1Z8bdm*wN@%tnh0?m1Bjc=D2~Cbv|{V0&gkr%S8=xv z1++47j+yPD%Pm^R0vV+L@c>YQz}*WbpF^t{&7nw2x}U3Vl0~X)V}0P7Qow*WVGe5W zlu@})o6^C0va2ixbv<%{&CmsQw9dV{ME0X zaKZ_VX0sdw+qZA~=tnMp=;4P-VW^p>&zM%LR3@T{Sg9wTe&)%ipN@4LluGY-+q*Bl z^wn`3kyCa;*kdQ)Of5sU!b~oCDGj@AJns@Jaw|E6oSz^JW2_Mz0CBIoCQ&*JNLuNv zY~MUEh!roH1iwwWH(k1^X`Qn+--Fr72#RuoO6`?ICuLAnoE#9oX?)A*t^J zsqK*VuIOl>mJzi7CR+p&9>~_s+8HoyuT*hTGDbN8TksK)-``gAIJre`5+;UH!lFK> z66_HhzxdGdhT^W!?0F{unz=rqWDp!azgj7m8WRdc(nK)o_|RFEvcTwsVulcqk^%u{ zeDs3FNEn1{atn`$rUwcA|K+2BC%@VVnRayb%rFxco#c4((nfoBko9P`*c8PAc~4YQ zi?t83N1_r4%&b^3xE?o_)TZ5V))k+7=$Aiv$O`47DO7^#Mkf>~); zCt?axHJ}NkT@^Yl$I+9N7D|8sK^$lfr5dgGlslI6%`~qG5*nI7#$mB6u0GauK0h2(FQe!Cjuiusgd$i*4Y;`S=pg>{5ttjP-NIVYa+;}5ip|Ri5 zGp_v2oB!~Gdv3e#iLD!UmSj0Bhow?U2q_?7jtIBvLkmb-s}La8nw8ScST)9*9LIgr ztEZg2{59`6eCncV%p5C4L_$zviWc=N+Xqjo7IT+BFn+eLT#+r`Wl6M~i>-UYuyAf3 z6_%dokk%+RQz}umYwXWp`>6v&Ie3|SC9k$x-|_?_I~nW=UmvHi`+!^GO4+{Py_NJQ zIlCeqL`uI%88>Cms34#*B`ei% zzkR9FP4!U=J<|eh0}E;1>NzPiQi{Lw2C|Lan#8OnT+wD4P?lHOm7Z#HSbfIKguuPi z$_W{+WM(j#RpDf!C7RrPtf8NNXw$5DRY(SiOkxG|DZ3970pbXd^c!RY14xifIUzyP zz>1_V%xtpHKq>P-){2?InuS0R3KIibS}l{zIW20&$~CJ=)O+ypZe zYZbFw^(M{G%vvFiwbo29nG0=zvngCPb=+W9F3l@5k7!M-P2U4z5<;+)S_UvCE^7!P z84yX6#@F`UDd>?0UM>X*izIJ(d|$+;$r}b- z=pSgE$(ED5INuICVH^Ngk&x?np- zZn6-$-Dp{jlAVBUmHlpqCi67wK~AgkI<8r>W)kA$lTQA^7ryY>&wZXXtES#(*}fnA z&6S#_DQ01F=$5Dg$RM zIf<4ChBgbMCL|~w?Y+@A(?Fk0U&15jGRrBlbsoe>K?V|l!8_zLsB$|sR5CbN7?abN)?DHjYB~t z>rP5_cMwV;s3Zun0LKBxCBy=f2<0#of*d8?`hq#L#8BAcB68E@Auj8)tdRR8P9x1KP2 zzt8{khpUEOP}NFPR!s#Ib6~PBkW%${e%GS69sGJd@r+ve4PEO*9EoJpWh7Yz=w5(@ zpA!QYvu?7^VVB*4TV?JCj&TC-wkkcPK6 z*DPZYB(x+JOd1#+sZ_e&d)k{{z0dJb)?hP;&YO(wgf?@+t6rwjHr}yf(!d*OTcHEU z)B@rP0Q{s=I4L(-5V6H1{erJc3yO3r1@@^!h71ALx_?^7+dh5j*_R!1@84d0{Qk8s zJ-2mudlc835&|rRlu{5$s{@&#HG?%tEkg=RG%(n)XrEd8A2R#!(-uyhTLD;UEsVjK zZZJ%>acdVdu0|(7a?I%i@k!{Gu2@)4O?JdgT1kJhOa`XfOkN*LkWC&1Dpaga!?_`M z(=OE`@UnS0|E%LcTfS3pNq5Mxf>UN`+BX(AsI>@7jX7>mT2Z^4D1MO23j z>_jCO=22jF=3Blewtwz5SFUq==8`ZLW3YC zKx)$wLDKAlra*{*B#{7qK!Lvyfs`_oWDmDv#hMwUDb|SM$fiW#P%9b3q0T2mkgJany zzBjHp5Xf%RVXYaYi2#U5$DBwECO2%ykO zJ-Nu3 zc1EntW^X9K05}Gbq(F*ViMR^I6e~28U}gdZ#A6e)r!Jl~FdaxXd*mfuBEC5{w_BuA z+6nTGGw{7sL`X%F6{2X7Vp)^VZ%}5pwR>npVZkH&O$Eeo%&t@hlt&;;o;WGOrO(cM|*1(o6 zTd%wB`Y4XVa%stuCFOFd*^CNVH0g-%t;_YaO*bd|*&ZXXqfuftWw&{mke*e4QU-jLqplR38ux%RaUAu;q;#jFuPdoK9pZSbZT1uKVW5&0>`Jdmr`uo5A z?eESw{q#?M^5d-8B&^8E#c)Uq%~j{fe=)XS94 z5K65pSC1of0)|o;=e0NU-X6gVWA1~J!(Pb8?#8-d#foEqg^(nKM-Lro);cztM+hNE zc#X~ay9oqg7qoJ~v{j=Zne54wB`T8hIW5pSr;^%J+Q8FJNVQT*FNT33$=yWqws8@q zl(SzjCu6`y>bmXmX+v5YY5%s9&?kzO(yj^@ZlXgxq_f8u&ruG=Vs4b*zlKz|# zTiCqa7-N1_o~Ta?gz>XLni*kM(6naY!r4cj@~Q)W^xWTm_W0jcjjX8?Q5Xg~D8(dM z#Zg?*rE~T_Yk!E*?Y|0|jVP!{#3Zzc6%cT39?y84nE5UeU0`OEY;H8SO+WRec=lz| zv_$P^P{gEz=$^6%AJX3E-i4b-E#S{R_P*lWrzs|J8Y%sViU+m*Bcs5HOaLztK{FrT zxA0G||Hl73{+FLV^oI=_R^5 z=-Hn+{!PdBEsj+jL78`j&57|E>Y)N)BblZlpD(@Lb37gC+;qZ{_*eP0(*AtPHz z+`{VCNk~9)bY@=B`03LV0f}^befoZ8mZbx3rL{$=!g`iwF6zJNz5TCz_n|x1kFQ^~ zbM=ay>sD^xx_LZq>bR*)5*-o}f=cC5XLot(jIOzR_0L(*H)DQh*Fb29XH=L7jLDOj z;7DVQok^3x9;>7scFw{dOs+%Q%^K%wZT*k{x1DP;=|X^0kY2&o^#tT3wI!u<%{kA8 z?P6jUq@W-v*ahPIPA!Lsob$+EEQ3QmR=gR3kkT^UdqZGmXOyOZD9ugHUTJxPCwDxz za3X?ICtvFKPX#a1_n8yvk;>&fp<6bnrlql`3)@6bC(1U1gxg{SI}&jDMLGM39Y3a+ zC!J_{RP+DKRmivLkl1LCr1xpYPKO9GpOd%Cm9jiZtcalFI)W*<@JbSu;CELC5%}cu z#OuEXV=;>W1h=FFc$z6SQN6KlRa=wltODNPWIAMSQ}*Yimq|g~Rv%@74Kou0YI&SY zsVuZh8fn{O<(T*Vf_;15`}yOFYc?mWnRLz?CP*sTY$F6nq~~;-bG)@lr>sl{C@9TZ zGsn;xo+02e00xi&2?^(KA|et2M7m9Ncb7|$rA;WhcC9sZF?qgpqHUaSm|PW(as*hL zjtGE`!8(0L0whSd?LYRdWT8fb6%u>LwgGk?lQ1EKEzH1xGHr%+>oK#kf7mKG(duMU z(UBw}Aw)uafZzdxbkMD!GXK*6Lo38Ft4Nh=QkK2FD+#x-i)S_By+xXNOwQ~Nr+rAp zKN4BByXnww2DbB&`%euAu{V*@H~`~4CIS%1AXe(KV_$XseK+3u&|j%i34(x>Fj;<; zh%~VVBLGAIkjX+~y>g16z)Ew>h&AF^XeAg>#w94IBJ|ENgq1g4__pH~9#U^Mh)A2T z%`AM$uhg}Z@vWq2^G=Xe@mikxTG_qq zS8Pa;>rTEsMQup%VbX@QM%Q>lE;B2cnMj;_?ztzQd{SqvleJb#5mB?ztX4WsJmG{t zUH8XlS3Ey9Itm~N0?mlxn1RmD&I@08Aq?8lP$~|?@V)PT_bbjjf9mwXN~K~fEJ`tY zD>C!@-Ugy&-%nmki=+JPD6XuPAcd7s-n#PDw5!k`j-&@UlDBlHh(iL4a|N07ry5LF zQyKFVFo_?`nYhq^fIIz%H34QFPZOJ!FIzDSBE(9S1mZY0hp`Bom%{D?@aI?omAveT zt#oSV-^o+c&yr?okZLJdf#6A{^gU{&l^@IMzv^u7^fg~}dVS1H-OPX$Ollul+QK~U zOWv?(KJh#!Fb@PNNHhAog7Oq#B(BFY=8}X^VcgSQlEeaR+!4Y_iX7jy3jmlzxD~ob zlRK?9_uxwDWbs>8bmb8Saxb|-_u|t17Ve3l&ULM|3$2Bi(Xnx_48WcbqLk_qy6x+lV?&4{K(K%|^ib?F z&1o>(=sDy1DU~|A`sPoYf8653F5dsdL#HebnPVM;Al$yy+}dRk9$>grTzpt$I+)15 zqyWycx%-PLF?G^%Q+d&%ni8U9CPLCmBnE;Vwc3eQq7Fqvd;!AL%T>okOwQLuQ( zev5Kq8yUa|q-I5xDRjYC z_57nSIw}vp2%UYb6@+xNA@RVZPUTFuylFd$QQUTgiIeQoZA9Y#!!>CkIj3@vt`6i! z&I+>vf$7#<60wdJ=0H3)f&*G<9kW(8UzLz*F2kg&+cewts~mr{!bwUtcw~91R}WNGgk;9 zZ@umIMxznMk=AU8Oin&oy>8N-7!!_J+w3P=yAvZ4;E*&U2!dv_dFe&3{m94ut+T6B zv(6<=o4n<%U6_1)eKwffh39MZTu~kr%Y8vf?}|$-@_n?a+jlQpBww(%!eKswPb+4I zQc4hYcXex}nIWZ#`z0bOmn%JeeTvodD_{8KudXeZ$|EDY9(?HjYDXoCRe#?A9DNuZ zMG=6xb7zA{DJ9bIuFTMIYwulqedo^P!(@Ae#ExPAUb;mjHxII?ECKW_CcXDcmc9i< zwfZ{wlw1BtYt9WM6A?+Mn4|yz0YL$=CbyK97fEh@6RdS4kb2_)XD1Q^Bm_Z1F-P14 zn==rL?Gi^Q_rMQxE^-g;##78m-^oxW)oK8PIeC};Ix}3HZ=Tkkc@#B`QpRb#EKRKBHh~+-13=yc8qBfHq(R zgrWd~g3H&fh0;4WadKXXoXRd7%H-yxUbEb00wlyoZtQ;90x^VB)=0lFxUkoZU#I#vV zb4B-o)N?F_3(0~D1%_F#Hmk^qf5fFkF%zIbDfoV&v`6XO&a-OT{X`07#8Hu6U}6_e zlY3zP=Qk@O8Viii_PQC&FJtgRV&En%OUUaO2-X4uTzVXF} zH$1y)=gXT%cMMI8j5ix`9P8LbMnDKz3d8PN*WwxT51hW&-c#ny@0m6=?5v8AnOW%w zT98R!DunB2uJbvrD-tjsT?($^Dd7IlnHQX!o@|FRWqaU|Tc@5+b?-o;Oy(!+Cd`em zx8Vbc3{Hh*OBa$DFXMj|F!;-!*Cj}Jhl%>1Y6e(?ZTyGX5=0sIn`?iTQq=Mz^MdmM zcy1E^3reRHXXHSJhf~#)-Y)`Yt*SU}2PLr$oTprZnUYo(rcN$IeVlokjE_}AL|}WC zIw#A_t>rKvh@v>!wQHKl+LVvF)%zl+H5qZO`oE*7G609Xv5OYP6xJLAS3NT zgq^!acMa`YuwV|fJ(GpmA3e@B3CTcAb~cw!oZQol=tx=u%K&WtNSGRVzj>0CuK2Pj zM%eE;-}JQoe%qX8DNudh%W%zuuLJy^CN9)TWP5=UcQ51=yy?Hg2`zkW$H{3QlCF1P zD3m+J5to@k2E%#fY`KL4H_6Y!Aua$C=^s9}^gEQrf9>aG!PPp$v%eGK1!!Ar4&FLO zb`3HUgiQG8zQ1HjyJXueP%+0C6VDABBfc! znqw%<(9lXK1+7eJ5CQ@&z>AonwPppd(wemfpa~ExgjNbrLz4cr7mU^ipr3MseDHMupf#UA&g(45`UZl9YmqM{ZOWmlu_v$%k zH<{lb+3aTb?7ijv`Tq8K=)HF(nM@`#ubE5|#*iULog}ER6EX%wC>*tBOL1C~B-fR$ zARraaWJnxQ0w73|Qm9aYBq;<5A%&1cB!#!pJm<){T6Ut2B_dRNx~r9X7E>!SRURLr z%9}&~I6|+BiGV;7ksx*8qzV{TRn?M!;Rknb&@4exj}uQ=Nc9o(;)itzuj+N}%=yZT zd@UFEmB;)4;1783=ON>I-mEv45vCi61LoXZ@8(_Jzv9IQKY#w!neXo2ww@=MEJ*?9 zj3WqQl9&r12wX2w4qORBrOt7X07w#$7!XRC%gWj+X;H6z514w|&4>0p03;!@gr!;> zoUaii>;7jxM4E4^q&je&XMWA6=%bA|g_d7Vuof~lW*5w!{U5ISyQyBsOyBorDLn<( zu(Z+L_e?qb=U)~rT9U9W%d)&yBA_=g%%HOl!Fh>tz9J0Zm#TbM>Q-H{_taLh^%jPV`n>1-E z)zLgU+6U@fyf9#mBm)`0Mdg(YR_{%FL_v9|c(q8z2uzT#0i_0i5J*>;f>3F(L>PqE zNoK?~)&!_L3V+KPbX@^8@cfT2J4`mkV(B=*SWdc*6w;e*Kv4FMdE2sjDRq)iTMB>5 zQxZs5l90lc8MoHr_U~&J&fBm889LR%mFi?MJ)kCY= zK{C;oj$_84dxdJ4b`(q$Xh1EK00@hZ|5^~0(9Ry1gF=U{BQAy?Webs12Re@|N_rbKd+3f~uqw**c)ZT^oc6eK|AT^x#2_Mf_G*;tj+E*0y?=ukF)0B=l1Lnw z>Hh?+Bfra{_&%1T*l=Miy^)Ua{UwMt#0zzB#sNT*L;=9CsZ}_tS@)66_7UBQ0BmLf zK)S(b?7Kf;fw!tcr+EW{nxH1%oxw0E0oj2(#)5*VwJ-%%m6X@!|AJA}*b6y1q-ijA z+W0?SL8E-HKJ-`$R! z7&69DCj?0$35YRf>m%owf>?&+MTF42^tlhA*L+s(L6VNAY@)T1Q>#h!4C!iz)9cKQwsTH81dx5 z5Y`ikh`kvY=)g#YUm%Z^pqJ60HXn}F*|8XCEU9HcgHc_9*B^ceLkMYE{N-2P*tTuw z)mL4l%}!`aBmW9g#e-IO|N7f8>vm!26QzKpOe7M^mi>G4t#_S%+9~75jS;S6Sr!0D zBFnjz530lZ}iFQ5ySeLu2ZnnoiaH9;RO4rJuoUE3iXRW zQvF^q$lkm6szIO`K#tDg=7-?|dHTN?V*krf6*@oEuz3*3ct~L|@Ysu997w-W4-vjs zmG7IxdcOHr2t0*?8hIp|kAg0&d&t&NhF`5on^l*Wn-?P{k3TFhR?_gR5%A?lXCx>& za%>kX#iT%~=IUHEqX8s=B$DuK0xHywfEJ)ySfQ98QB44-L-7z9as)u(kZ`5K_`)UE zagii&BqYZbLI{yVlE`)DTEe!h1m_&NMZkcBARsHn8RvosQBUCtavWE>D%LAW0H`DY zM5&h2a9h|YrErCG99KFy=?E#2fFUDb#4JeIESX?vG0tpe*=TXbG@D%^gdmbkon6Zq z13*M>A>#-PBuF7Z5_w0dGKmO`nCnU*1>=xPam%uhDH&x9EzZ@dUt}PW0U{$r@(#oh z!u3wWkVHa~kgk*jM9d;!5>Z$-SP8~B=ay}8WZc6bp2%ng2;Px`Dx1s8=~A&jA*B#* zSy|!2xf?$HcYV(R4Mwa9txxlPM%0By!xNRZFQmcSZfp+ z4iTee#2871PA%k;Wb@*t_aAq|`3Il&@!an}{pZ`iSN~P9b0-SP8E~FpXd`fAd9Ugl z0#`uJ6^={7ktm3>f~GBoj~sEvh~q|f>0g#E1d<5I(O6)NfhF;8>cfVjFv8TZ@%)Lw z(BA!6O&|Q_+kPMMm}kYsSem`UM!)>MU`(ug7dDf^_?Qv;Kq#18QgW6|Bu9)GG3>wt zeK@5mVBQgI{%U4DR>+T9OOjrB+Rl3mp4E_7CrC)4lY~MT0m41%YeKUe zW2cN5ws_v2^7SAzIE-wAIDgrYG2=Ex-ZHC#{H{X)0DUG9DMd7_kUC02N-0H7O2KmuWvN^H z-o4AaIIhE)xfvSyyIBScN9wpjXw2kGw4vy8C=fpNNV`|wVHcqgJqBW$SFVCZ`PHFs zBV#U&&+=U~Rb8AH8|i5SR)!rv3m`` z{pSc*Oo1^M#`J@4wA68$VZI7%_Wv({M52hw>=3T zG^8w|EM6To&13u z3S-3#v?zUho6D?611VmH_SgtvSOD@j6D0sxzI?^ME7t>n5YiQrGlf>UUV%kINJK=2 zK!k`=N+ARo+ldI_?QEV(CAMtcv3}i#j-5L+C@m3!5J*Ug7))~tA=D>(c2(3=RU2*b zwt{ip-1Z&Yckb8?0KyeHa5zWCIAg53IDh>$)VpEFbT%M8DUGqzeEb zg&^*yJCl$S2pDHN3y)Oh3ggTpk5rr?$oP{UtQTr!jgZ8dhdxMweJS<1zaXR(t^feW zz0Giagc5j)k**>yj_->>oK=t9p|C(H!b7j-YuEfc`A&onh$8kY`dXao4*A9ZUH^oT zjUln>x5y0)a;-Ib3n7|F89{&;0m2*FVqP=%O0%z`;s;*HV&$X2IzElX%sNW-& z06+@K8SmVv?PViQzu=&g=51a$^WVP~Z(O-<`-WAU)@|OgHB(b9a#<1*r1TcFN&;Ys zlH&4a&6_l7+OcKF5j_qZ*|~ptaYLI~oHKQ*iCWqm*@`}BxM_>?d;>I7Lh>?`qw@(y z%Y(c6`#`Vd^MyQMpcV;u6y~!o-`CPrnW|>5*Iq+%s%Z2Jj9p-De4_qP>&?|@@nUZ3 zzElSq2GA;GRrH4a1pax=3MY72(Vw}AT|NN*oBH>9+WX&)9|pj(&R2X8p^vzT*^0CN z4)IcJ>M++U>3KZw>;`pe zp~`Xx00gN30co6}vU?=BLJ%Kw(s@%(xi-zXBVC4w(%bNhkm>WE|1%s^DuGOG5ce%X z3{KXXAP#2h7zF|gBq9Qb!+%r#Be}j7#j42w%ZBL={_+L~hV@LSDDuD1>d4|)2R-4T z8h)N1mCHA&u`^+@kMduu>uKE=hUf}_tY5B)PU3>0I@*j-r$){9YT`@L>NwD#D)Q{~|0ReMx=i^p!;6ZnP>U$?)Bhw8v`E>$vW*#i zK}DEXYVdu0_#-at8?7}|Q^*G7y^dUM5Nmz}Km?@DaFDuz9+>dA#0Xm9ZB`SQ&Y*dF zj{tk`8C#JXy--hF+oU&GU76QR^z^F13Jm`6afPlZ#%jmhs0+czQx_VIk(KgDT05I) z!b4h`g<9M_%N0ze25r<(zY_v5@q(T?VF>dT3UmL7A*um`)^^<*JooYFdIJ5+!)Twrv1N zr<1;^lag%C0MvRii2zcPWpT#2>$(6yBoV;2Ek!Ld0AjYK7|4|qV6o8pP~^xhE`<<6 z5|AWHBojm=T$ez4^C(L6NN*acEeCo3SFNWoFg8F}ObI$rYzvX3t$szydBso1OTqP5Yd~9$FOZ8 zwXjny647%}47|Xa3ZF5M5`;tom8y>%84&<6A_<^~Bx3p)MWIgUL6QERDh+$Qi286k_Z)Z9#9L+H92r5duSQApi(cyC@SW&jrw% z2?b^JyZ{GdM&A_qbMN|XW_Cqk4C5fSGg1rVT>Lg5f{6ggrH?X>br zh#|QySQcYk12)oWX@R`y)OrlH#)wvsO5bD1fs>W6!1&aA0TI=PHGaBB>$+C0RNF@px+4XgqkxRu~`-IP4jd)fl^(N z2Ws;6MrAA%A2y&TM&1v8fdJ+CjDoyU5d9aU;u;qMjs6+iz`8q^y!j7*DCP}1A9@G( zLVx^Ms}-b27$o_2B{sXtwZzsPCNU}r zF$>h=tEI4Dd85D)?g@RzwY#asFDvE<>7;-QkP;aO&X~#-R~s1sGH*{gg%?Qbla;{R zB^`*=b`WYK2ni$^WkEVZ^lsT@MAv~0Q$>z+5ExQ$E)gP`Yx?Vs&}jh+fF9^WkRbdG z8e_uS^nx@K^!`11m$$f@5Y)C9k-Gur4!hhw0t$^~HByYJ6o1}AmrJHgt}70#H+n9p zHvql&)lEOE+6S3|B%}UNk7+~KX|~0PeW1jB&S+Y^K^Nt3ok6R5M%ms!uj~E%3*$Dj z)E#Z=sNffc&Oi^JxM?Yh{1QVQm=iicpwCJ)GtV^23eoF-5r`6?uT;Ii$atvY4PGzm zb_KS^hjnUPU<^M(j3K4T!*3aZhCrwIz6%Cqh8t1eMNz5J-(fujs<*=fA~t|qS9mVM zZ6)n$HcgKOzfnFD!k;Vrg3{ZUQpXp41#6IRk`MKO*9nN?w$sV3a~d0B2sOzi2RT1 zCOBWilCW+Kj19%HvO#A!WnOppZu>Pk!DRAK@b60jIaE6y_K*VHEOVG)p{vu z!Td#?yLLQqzy3l9&iVQc+kX6MR+lbq8#ivm7;D$M<@!xq-+bqT@}^D4jXR_;mC8Bp zjGum+J7?aZhm7pft<%rH{IPP?x?g_%t*D@&S+gc<)@}IetMB^s>^^wN04W7$e9_{6 z=ggUtP8HN-9W}j2L{bvxTuAxb>^W;!t*+RyQ;-V)EB;;k;U}M#G$=jx=%dP;HT?ar zd282f{^5t2?OL_$(5cNg-_M%;_df&s_damgerkAdfgfBt>+F-L%u z$QbAN#n(SBShV=KiAT3>+1wS7 zLb!{UtpOqC&Y8FWfkT@&Z~X3ip9~+iU)wemX4V1R@0ag!T zk_g!FKl0uu^S#iq#rYNH@0g%T3%?(0s12)UAS3;Of#>o);vj>fp7LX^|A%Qm(mnZ~ z-o|iGBSgDX*>QsgD?ixjH8+C9bhr6u34-1|-M9TVas&iPQXNm?>u9A;F)RfEB0+;7 z1d^6*$t*M3y-IPi}pMIx{`Sl$-Bkjn|-0!d(&WReL1f+S;DvlFEdi8M>4xBwv~ z@&uEP6q1q!LCTog#El_CMAwxJWu^vpY<7yvSc8U^>l!B&Gmrv75+$UC+&du?p?bI2 zz0D~rw+o86R2y4LkCP~wr4nIn04)LB;{LQ7>EsKw>Rw$^5CW=6jATJVWfkNc*R3Hd ziOFKl2!TN^D{FTO;X*+v=a!YLgrXvF8M!%;F109&iDD2g<*Fr5p`EgvT1Xdylv0Rb z?QjThc+LSR<)Xxew147_Edl}tAPIq6+_r)N9gJNsbAr5`R=s|X>LFb*2J#kC7Ij{@ z_r&k|FiM@pf@ieN^cd3@%2%@t1B0k2B9Lk)5dg4&HA$B>EojiU9Q;-CK$6svBOc&J zN#3^Uu8?ZyLl2Rno+JeAE5_n>6PPO|=V8!ToEPKpgue`sO89fbsS7q|M|0vM477dH z&8-#G1HUVEon8YV?~02_MV=Z|0s7u_D99E-GSV0;ssl{HE!DJ+$WkEeSxSSIa;<1~qxg+1EV(;fk`je#q~`F(Y^cKtzHDx9iuxZ687} zr56!d{<&&(ToR;@ObPVS=c*#zi8f;#P`VO*IYnd!r~L6=H(wzP>HIc@)M5xOq0h&_ zR#9G$=J&A*@`fXsUGQmQ5rjg_MO+rEl3-wCxh`n#^zC{8gmmWMhODx$AK zVLGGw@R^aS>N*wIf4}yMn`5n8=mo#1n9?;8r6`em7iCRez0VOn^rJm2zxP8^l6l4Y zH004CL1PE~rj84c-yHBEw*R;Jx+)iqTi^{n^E5%Pdo?MZo+jO@K%|Y056A}vzM2lq zK@~?##hr)$KDGe9zbO1#F9(lU%kO(No0rx<=1Y%V`}%_z1FT>SFy7)T~Gu7Qp#k~ zuB_NIWy(X(zBsLO*UpQVE*m|3_||RP&pPkYMok)9Eb-1;Uw-h>D@&KJ+OcWF7hiwX zp>wB=TesYF^PSzg@AJa*FPuMl^3_+LpUGqqIk&i-Nc=JT&vP%jVfDJT4?p?L7oWVt zQQmp)jz0FJ2k*P@!2SAObK_mlKlkcBJ$v0f^~rC(c(+;8vXNtsb6kPa z?bW^K>(d_k{-@thIqAG!0|%^Jy}t0#SDQ3xuzL0Cd!{_}(Z{cK?bQDL_rJb<>ceFX z8{YTOGw)A-zDwt}5!6~qYxFP%^?k2MGeUpnH`HiM>=j9t z2tNa_t&!%&9w`@_;ZaYXM?67Z<8@#TV@-ug3P7*~#iv^Ls*ymgJV=#}V+{AW2^0U8 zcWkH^STjwIs@77cF(|*tU%l#m?Ozu?O)Ybw5YaoOaNua9hZ+te$+$yUo`nn@`VDSYCd zul{%Sx7mzbw|vhDhuwYBfzMul^k+wOzw75u|9$qxAOCmxm%De>CJU`EURiSV{`c?K z>FNu{zP9AI9k$KBcyHeM<6fULbFGzR%m3Lt^{Oxa_<1EyGT};Z=>SSQ$)COZhX=0z z!cOv6AN^(Wn0NnOPzeAtK3?#@%Rk?=suBQ%qmF7M;R5I#c?)T)`!{7P(-8HEOylPkO>f=7`(e#>AN4&ml_D;^xb)|NUz*G}N zeh;avKpmj-1wkPtWB|Z9N*@TCE`|o6zKFz*d~b-wYlS+En1`;+QRL+ZdzT@}F&{>& z@t_}iK~@SctwpcF{#&7+I$onVLPXvQV}^tvN$<-iBuPS&jEG5zk`RP<4w+CJ_yGXp zj9X0YABf&5?z)iy8_gSp9^5xuZBiRc^L32AH?c^<3BQrHwq6m zfx=gqHXpQk2eBLPksti`6pdrq5x zP#@*M(!xSQ8rR zx*-ISuJ^-M0kA;y&*oreAE*tX_3=Xb5%X1-CL;(119(f1z#CH$-Ql;wbVW^q70nUN z5N18cW~Zj~K0S z$sE%4Xm10chqajpcny7M=te!5%-}vm+UymH%0)39izv7x{~yqF`h`GT7sOnYcSTsC zksx?k1L0984+<#T%MyG_te;; zA;L3^aH)>6{RgpK5X-(wzy895 zhaWcLtM7hXyJg#x&%Zuo@WA(`KYRA16H6O5s>$SDe&wxfR($;C3%6f?Cyng>Zw+`&v>*yoL_Upg@+wZ(SbiaQ0KJ-{wS<_iFKEL>a$uCcP?cH}j z{Oqf5`wrN5`m|?mzxg_5*>28N6fy>%eLds3X|KQk_Vj5lKQ(0V;Og4iMh(jzy#LO} z9=&hEQHTFCcmC>?YmYko;MVQhKJviS(@q%MuW!%qzx(ii_uV#V(0=c}|B(;k0LYbY zt5z+iPkZE(x1UQ|i7EF#xqjoer=EEArdw{h=eBDG4cPC(ORibHcGFAGzxn3tFMs;} zi*HSTs#%kgN1u98y4Fu$z4`ga)8;Rn_tMKBqzekAZ9Vzu?caYfZTf0Y&yJ72(-~KS>$U{E;XxfA$N2x>~(`aKp zP$3VP$-G>vxM64L`1;|67nLK^LG{K<;Ncsk`QPQ~%BUhyiqO-F8V{%%!H$ z%&lp>eC6ObGiGO@a4r6)005v)@APgM?C^}bM3UYHY9>HdkA1+P?KKgpBLzs1bX`{p z!H{2j&Krw=-*x-FlMWky(7ks~-?n|%=B2yVF5d3sBmk^lw)4A>m&q)B|MimEU5Q(7 zx!{K%7QXr1Y!pyXY}IVSk3ak4r|*~7?s1DtQYW4`zLw;&72Ad!FtkVSwhI<*`Te`K z=~VKaC+1u``K@kkyG^B(Ip>9Ee|0NSI@#STcjqbu0I1_r zfg!UP0IXS2xn)BJ0II9_tKTmB?&FmNv}Z#8ichqqQH7_q&^vl+#?)>@0(?<2^+h*nB)yUwz7v?YfXZtHJU72vxpME$S z5T#I=jRr3BEshC~eBo4*>wCF?2#ho4?MoiTnF^zYe2_Rp4aWGaL-L|u#4Y+Tiq0Q$ zv44iNK;X%MC!v9QHDQ)tTb?VVxrYD@fFrY+m9T8vvMp{|+~SObI-`Rz$vky}$T)Hi z%mQXHt^x`w$I!E-<%6bP2|QaLapx5j zp!z5`>-s%Hb4Z^?O9^T*Y7Di|_}Bj?_{=jMO7K~frC^Gar_D8{_nvC^N_Udi=epmF z>O4`a(^-q-M(q9kUXEuuk^o&4`M-J148q%i0|NOzfcH^&Y(~lqfmPEn zBNI-TxYOsY4#hDqyBmYhs`@H)dWtUFr^W9{pgdO}4ZbOAOdrE+UT`y{IP%(KD!<4% zT}EN%jgUZxY;XW`!j#0g7WD{;(PVE#YsXTF2m`c`F|{Q!s;^Q&Xbe89zA?$}3ysv-6Dmj8WBAgiRMLm2%+P5wpoUe=GOEwn>h6Om`~wgW_1W00EY5w zh*69oq4N!zhL_+;6op9g8|?KmgvCQCiTF^FCN0z#b#_gi8V}7E!o_>c*U@dr7wlNG z=I70NBp|33L`E#BA*sh+VCsA%8H-ed*NpgkJqACYUIaj{TNl#=-|~i(pn;C-(L4~# z6R&+_J~vTooQ3l0tgFai$cA|nPFW6AnEK0ix+5i`)?WT+VamZI(qvkw6Cq^mgXZ`t zEQSyT(?fYRh8qwHxYc=~r~pW5e#Uw4fAV!Zu~7`AKEuB<^xtJW$k2SykGx$OO~{3(Q3>g`!^^p9y*|JVL@v7(p86#JG`u{w7hxKVEdr^&SX}qWy_|| zzVO&X4?cOw_)`}zTaU<;TO64nh&VX}{z1;(7>mPGKplra#I#kth2cK&-&SP_FMr2? zLg)z%n)&hSBhyY3xUNj46EnYAwdjvMcRf9B-$R=A9@V5%ztVdv0FoAK zT-=a3c6O&c?1bJ2O=|k(Pi_ACX3b&8c5m6frxX9Z$ZZ_pd+9 zZIEny(Ub$5v`u7cp{T4uGHZSC&L8^^>vqHahZU4t9s5i=>Cnf&`(|OEHeLFb_W16D z#Xlaus7-lOj$G{=$q*O^KtzrJkc5I{Ap?Mh$p(#~?3eFXpL9VlJ3%?&CKBod=y1>G zc*nM#j+oSG-I@kpPFpzR```Qa+oxT-)`y?iD_xp>_O_q?nf-6ewuN(kTt8*%q>&Sw z9B|}871(v7PhVZ;*Gy& z%$#>pzd@NQXTJlww;xn|V(Wbin!(SXEL**0^*-H>JMr+Yl~uJ)wcN5{_qv^12MuV} z?~8GjyED03iO7WjL{fX0<%vNsL!$)|%?0zshyil$`$cN7Vd#rMVsv;SPpHuQH$ZGY ziit%4XbdZJVCTPV_!2Q^Amn2i(+M&h2G5X2oQg;|3B64(;z5g#4m6MawrSXFYSkca zwpyv%rH4hhF$>cRIGJ@-2PRwiitW9S`uMA9@Izqt|=O7YSd`d{C_G2etM+1g1RzU-tlw8Ji}lYM7Ic(2ama2*G+_B+B}${S@6TQ2&X2`x%7;{m=-^-DCS?G)DW`4y%K z{7p52NTJUfLji~E?%pO}LrvC#s<(y?)Sy<;2ms+M4wE5<#USv{*~UPRYjH;a|M;YU z5@RI!_3PFJAq$_E=Flb8Lq>!#f0*ds0sVe5yVc~=-aI6Rz|5{Cnis{6*k}r$Wn}hX zzBSi(0_x1#>gzfP4^FyF52trGtU#kdki z9eO8M(<&LGJfw@lk`CdQ{m`UeFaUbTAkn-(AX!#Y zViOy7&;f71@$A}->q;7wy0!AH>F@tDe?9=@a?aXy8|G46SFsM-gxdsmmhrSxCigP@|L?E z`tA4MeO@v|lyd9#ZK`$Oe*eRu!GqhjYHl&QYs$5)n>S=O+g(|`Va=vhYgesUv$a#( zrr*z)*`a;=P8~XY`ppkhZl25;|LWWCk2-uj3d*_?0Gv$Lwpdj*E2XrPi5&6<4I6NV z6OKOYgyY7bMK#s6nM`)f;UkVda^$4*uAg-AP5=D#Zed}elp+cM;>J@1EbryY*TA~% z<~w_dm}B57aD()(HNE3xnTCHCXE`j=vWE>mW2ZjY|A;z2_ebVn9Suix)KUf zMGJmj_jkv}>y~cY?~tC&TNb0lAHP|A-qoZ2_-f@(pDx*VM0ul@1+K_4mP@4>Ab^Cj zh9%oJ<>YQQ@YpuREv?F3nbutky6n@&t+lsosv0u5ee*5s%lDRz9F{6;k|uOOo$-o{ zH~=F6NLZk@jLXWZp{-jwTQeWLydblkC@GoRMNX1bhs!YpfJ8E}YiI5B2N%!y>9<@W zx8JaSdv;Z1Dr!D`e(t($t63xWq*F%y@$0-+ZJLgl*v84aiKI2`;I7Ml+x7D|Yb(~m z$b&mI>z$nQ_0A;=HkG7Pt-Cc!CRt%pZd$yjYVOvG#MXhsdfJ>dY?FNT?QfPY`**?G zhiqF}-J|!F=U;f-g*Oj&T>#`j8^7UY zC@^3k<3!QxnGk5xfo}vIQ}Yg*^)*c}ki3`v3tT|-#X^Mu_V!(ULm(fbMF)fir`}J) z)7HNm?a0R&dISY0b^2|9{Lw=}P5N8Zr>2B8j1G)Mv9n%qMTYz9`OAdj_y#Kz#HCgkbarWFrLbZa#Y` z6mT&!WxU2{QxC@9{&+ISmS02+u`!oti2WIG(p80Qu#y8m~af3q_r?bHp9!; z2>NHZhs>#%pm@@vfiYbR{y{Bfe}Imo`J&+gGeoIJv(HDb5axA=Pfnmx{Sg{!Z4gO` z8;W%~S{PcL1a71gxWUZ4ZsKX|6k30cZ>o|H?xk zf!l<>)ieM9dH&94eqa*_WKvmVQOwO&XtzNZuRqs8W0f2E> zw`o(SPOT0b-T$5kAJ0~AoBiwWtJd#m+rGnykq4Z8(Jgo1|9Gal3OHVM`DL%X`sUm3 zf84A4K1~`m+P81t!ZdRQb?Y)@>bqV+%jEIMT5@bVTd5(V~+H{7vq&Dw0$ zo)k|vZ&5O6VBaGS9slqn4-FeO?Ctm7DM_=BKKP`ts4!qJqT}ZN{`I?a&%b8j!UYoK zwO34*LY#QYiDM@mJ7UoO3zjdv@#8DM2Vfs70 z_8SMaHKh%kTy()nUwu7e&z>Cs;7GY@^ZJbAN=cbqO=U(V6RF$oyy2Gn9$371$={3S z9XtM*bIuq)apDdSAH-B>jDpa3{12Cp4KaK(L_hgNnII?_qLf#H{x(oXx*pGZhSi;>B0>Oq zSj`K@Y0&2p;K)+sAT~c1(FhuBLFNQE?t+S?FcDQ5|Aq-xgf|* zCdhFeOp1%IIqc=vK7aMepBtB!*(nPE7-wo6spfEEQX&9U?5P|)qDhn1$&X%~S72GC zjmuo&0;p~CKrN^OfK)QEb64h@&z7|4-1L;ohjr=SBLtUbe zsPiuJp2W#peMQAgM&&<^^+rN3)bXc57MT7Dd3*8YYX|TloSB9}M&^Nj+mCsw-#sm+ zAs&LBV~j;y9yxi9QH?Y^Ccix~E+3dp*_+}CoSDE|2)QP{-yKlppUN63p5hwjy%swY z>udE`Cmi(?6D66?KsVg<@xj;q;Bz&?HkC*eOHts~oBtWS2^3&Rx`;yE>&5;sPhaPO zx40{|Pff?fXeslLE6p!3m>Q<2cm=6c<^#i*tjj0Fyr70(gZ|fGx$(FEm5~KPzGvvg zNfFU-V}g3omlcyEy4)Z-1E`rFrXyfZ#NUXp%K!wvg7E7O)Ml8OL`LIPF#)zC)eS~6 zW2grW;1!CShrE)g{F_=(OKZMj@mgvI#kFw={}y3TU<&l8Bq@#dMKX_dWdO!et0tl0 z&I`?O`oSiMzao*KdQ(p7yrhS#>aaSR8&U%=3M(?rgGhtD$_>8^B4SaWPx#-ikYAe5 zBm>Wef^^=;h964+bqrhMlNc(=kP3~2iTn^HYQ?zstt{gz{eR#OQA|}{Vu}h{V&sW` z7I0luv&AFwSwwD-lEghQcFcJVA(d3mO0AU3qbqy6N=G3l|nO_MxBo7$e%lG1chK4U?Bo zaD=J=BZcQI|36*m>l_U8NAo-;v!m|I4AJ^U`ZFKul2S@38Dq%&lw$8_PE{8oFhoCo zK@ucM0AP%Hrdev8uatgZ=mIn29l54T-6A^)w5)nA#aX>H*#%W!LvAV^a1IDmA z3E&W!^LC+Jz50}i$ywbp-ScsKP6Yu5f2v7OLP8Lf(fy2w%;ErW@kQqXV6$drw_JNc zn>H-~;OsMwpE%)g*AbUobY_c|&A**7YyT0$lYh?r`m-<2J@?di-)J=B=U}7N#D1Y|4A@f7Z4`i+hJ%*SlxeCQX|jf85bERnd+*#`HF!w>!w(x(kWK->!w=j#rnz zJ1eS&4D8puX+zs$-+Vmn>+gR~C6b39dQd?s*}s3EY0o_>rA#CeZ@&Ckub$nBXwn%c zy8;B!1?QdArF;9|ew};b@h2R0`0#>s`u@9b`+CN#;Uo5+aM&o@;^ez&;Z8Pp4+!;N z{iZLhl0)}3s_;~ohFlSG4Lg6RRZ!hEhG~oZvKK-Jm ztZ3eMD@l-L^Ep2+YEr?ye6#KK?J?pjrS+40k}BKz<9 z+D&V7eE?FaG*}5@1ORpc)Z}taI$&`#{{8#Qk3Vy0S&M>S-&_6n%w^+G?~$y*?Q3_n z>QQj!3Z0GC7-s*gW^;Jig^Ui;vm6OJB|usHa* zoOu~@*{s{4Yw7im4{y_}fCEPcoMAypV*i6XEnL3zryrM$Kc`FMR*4laZCpOv={z7+ zy9?fV{SJ&=ZS2gs&K8KvqUa@h>@0*q{-7@a9zPG3C$tO(zW7bx;W~ZAfIQhE%o7dGo z{?=zxt4A?Q5^--GyWiWP(HN&=f-3^KFe=@OV}XBJ=Y^q>YOdmn3<&_kG0QI}Vq#;a z6GM-|pJy;ih>{vbqUe8!=#h#B`dJ=qm&!eafHAVDt3ZjHbE5S$K!1yMOQmu0-; z@g&fU(TF;QZv z{#(*yu&Sz#7(sqzy1GEixW(n(*4F{1&aOwp)Dvyn)WPCU=ouc2ZLPH2-=zbhOo zICa})Fd7i4IV3S!Gla&e5f};=P$wQl-9SCY03gUDGD%Y92NqEqJu+#ohZPa~9x)C7 zEu5g6;s3;-b4}OR>q+ufSJ%nwNU_R9)$?*pit3faytuYey+%6#k(2!DEG{Hbk*$mByUc_^pL%23#-k+S&iFCO zU`QauH9u^7f>*tC=`eW7=Q){A!3QNi9VXckFIp?uy>lS0oAPsB!i5L6KR_A`NQNW` zh=}A~hf=-;43EL!Y0hzofO95<03j`lt50252q`#YQj(OCTbwhlN)STYmPJIlT#j?j z7$YeOk*Pg*)JsHCO3Si9t53&q6hd%a!6mnBTbYnt&QTrhg0O9iG2h_<$8pqFsi5|0 zFd#$hfDcc71uP20U86_z1W03-nee{SCsWb`9IghVi~ ze=h_QLLNMFs3dS5(WX^7=dE_`*tKxs(jf!;9)HZ(MN3!z{>MDDtb}ck*l)n#emxLT z1-x3fDnIL_V;t8_+Ln~W5&HJ&-o1NgDWnv%-@yL8_vwa=6&9qOoNF<5(6Awc2lllS z3C0*n;RwMwSIVSqs}^USGLeY%&h;>OK(F3CIwzA!Wazk#5TaAZc9&mrHXzuxecsup zAz(V4loBKeACI*tZ`z`~sgMLfoH2zVOG*mI9X>jf&83nF#iX**k`pJ6%QNiiL+?Z09Orp~y``);z@*D#sg--uK?1ug^f3 zcMSkRAvZIwT@>hkeY{!7TUD0duoEVN((nlYyp@OnCn7sspf;}huCdN8$~%8nF~|n@ z!KDW}P2L5Rgj-+lp!3XvrXXZVLIwJN21RKDVEh%uKbAS;p`S&*SCHRhjg;iM049lq z0KkycB7fh1K@2Q`IdKiz5oSn|Are?N%VouW2X`1axb^iHzCZl^b{p5PUAtjdmwsm- zJihO1PtCmc^tT!}P5=7M@*5vLzMutLvTWJVgIgbS#n5p>ZhP*2=hR8VfB9y?IkyZs z=%~(a2F^R>r8nRBdCUnNGw!xrjVk~FprU3ox#>#Rx#YTWmrZ*0xG|6S=-&MM&*t_Y z+I!6S9`8T*+pfwz+jmwC9ozAQSv{Wl-w#{1?jYGpxTFAy1j#ttkzKoaPYwXk%4}X= zm26_&_{5k!Rl8QNT9$E!0s%<^(u-vXD{J-?m5Uw+lmSvrg$n?{Fx@aQYVtn&EU~XV z>C?AHwLj*RpBwqx#GsbUO-yRG*?(_gpz7v6;LGMShpe~+0oBKT0li2JzW$t#G}wF z20W9-Oa^q1HdRv_(yMh~CqKb1+A7lxs88J(@0gYOr27ofiwy(2KzcgEEI*8cWApN( zmZ^S6%K+GsvO+<@dIX3l&m-~)2>VfaQPet0C4WzE0%H}DamaxGJQAkUh3~y*W3GI9 z>VfR$t6`tR*UNd55r9b0<}Hr9VU!-;K#xGn1p56$SjQ9}X&cTA5KKZy#*lMMxPkzP zX)WWGfPTCijcB!>trBr!wMrtrF_6mV@}wHgtAF{0+4?GAWXO zMFdPp2?U&TT~uCZIvA&3_xZLJbtig0ut9ko85p!RXpw2AJqJ@tseE-bJJU086zzb3 z50qD6=uw>2$X8bW*=5EnemI7O%ogT-9DAv7jRze3#m*t;#(dSJrM|K;d`g3+#k=L} zBlB56Qoel)it^N={yT(K>fn7)LtT?9-md^)7GgF$ylMbK->7aQFX6P#mwY<(Kne%j z$rw6%)TotA6cSFKS4zK!Ci#qUXAIKFh$nBWBtzbUnJ3gweP4^r`i#Ngb16FH!;SsF zUx9ul$gew?1qpLR4IgjQ^l(w(!YME0lpmc`cchf*R0;sLZQIqPNf`i0AsJ^<%49MD z0J|%yQ?^}Lm~xz)kb)rtqEsrmc*UBcbgFgBW<=6)gaBsiO{~ZhZ%n09Imc14Iw55` zodSTWs_LSmLI4m#FwTjnpdcO72qFSXCX?#TKwL4}96dX#Gp`LpNa}z{J(DCP0RiLO zZ+;zUA&U9y?P5~)F}8&0EnS@cAB2lXZNKkEDM07kO|u&f}G>3r5+NHc@~@i zku&s&^u&)CVk(&c4MSZi5r}cj=5h)yX0kctKtvhGLC%O|))gF)036{m0Ax%8AptT3 zl0r~PQ2_u+As7Q!IO%i>NQI8;(2z0xrzgb%AQ$aSqnCpa9ED!-9tHpg;&vAB-VR5B zW5G%Q;=Et#0U9P~3BC@9GQO|R zx5#h^LvafoYE@6vGC;-|3F2wI_Wn`tJ~MaO{PiuGm!Ea@m{x5X6_nU_JbB^=)8_2j zUVFp;PB`?$t{`C8=sqpmH%u1s8}2-L{lB|bZ`yw3StEuW-my{h6aZXy(_!0p)Z`p- z_=!WAok$lV033DFP()i0^%>sm;g?SO@}2qHx9qv(stKcx?Vc`6G;Z8*F^rJvwyCx&&qA=^O7KH}l&SwV7JNl4KF* zTutvF0CZ|s-ndaiKyb3cvKRog=-PDnalHx}(7q!&o_*a2i`j+EQnx=le#R#&H>}&) zrSq8m4(U2*M6=oox5tpC54<}5?PupKUB0gG{%t3mJFx4%O)9psu_qr;*1|4t-};8B zr)}P`%}!gVoIkqr@9Tx_mX&qr)~9o~q0OfJ@ARK$tlX!6vx86QR?^fOcgi4?MgRP< z@woH$Kk=NQjw3BgrJk6;KO|%r>MUQrR9wUNM-Zf^U;KzPfCsWj{}S|ejAVJy+epRw z^(a=XFH^vDD-E*uK7CO~F`9t-UIssXB>ZN4MS*{Aj3-s6QJWt#)Ok8lGW@88nPvq5 z=1QGV6fgW)^yA=@P|N@8B>^}DZK><3qvN9f^4|JLOBF9YRgiiiIX zn6gJEN&ijiLh~>|XeoaHkOADy-a$Yp;R52i7L7+rlvPFAikNSr zXRbZkwJ#Nl=W7U^*P%gKl-E53L<}+Kikj*Sax5w=kU}V>!YsaV%Z^;8wr$%swV6!X zwsnZa3$gl+D4CV&gxClJLB|?6=U@nrf4Q#YOd;%G6q>GzNx6#UB@zi$ESRq;Adx3R z5%KmHz!Ion6nV*JiqqaXmokLkBH;(3TrTIju1Zt0EX%gl77!$aaD@N>1mfJ{w#5O6 zz;RqD1ragMEX(4YJC0xsEXz_1QQnReF6Uf97S|OjD*+kfoZFU{eISHzT_H&_M9Z=* zi}@iEDZP!T!(&coCjbDF;|Ru(b1qx~oO5qZ6oI6a!Vj+L0i#$FtYbAsnKy&#x~`Bi zVJFPkkqT1^AsGY4xWci1W=z~1O`sR@5ubJh3@aJ#llq2b-3Ky&E-E6C^|--#a5q}G z#W?^-8Sp9+nbU(FayciFuyhnPD1>v)IrpO*ky`Qtqd`04s6zCjgmst;PXmS+V#MA4 zKVD>5p}^iEKxB(`)ZUJ{8I3`pPoEy&iaAk~9u6B(@WfEXzVeqOfq-!qeLtkbl?SU{ z2+ReA6)NhM`Y!_-d*aq{p^+~f?wTOxseR9o`8DH!o_DIb6B187Hvn2`lYUq~(()Om z10#_4I%&&JrU}p>6(b)JfuG2X`Qy>^or0l3x^}M&f11EAHKA`OY6VzXTDHT2X}gjuM&1waOSu^Te!tCU!2i9)J6Ah#lrbN^* zIhkx}qtcshxc0cC4+Q|u`IFDT@$?ffyH0lS;6aZ+epg{Ssih{_NsoPvl%Qh{d1kR&0p3(uR>p>wBSe*5S2bI(3$;<)0XLRYv_%9^ap5G`gg zopnS+$dn&L43Q)OA|fLKSE@6fya`1jk|Z?y)Kp-gMg7pWFX|##FaX3D5)esEzXU)u z&dv_>EP0nsiUdTEBuSD^5du`Fp$dNyLvTu%SEh$86x|TSV!e^ch)4pVo~2_5QV11W z^qC$}o^|x0r~UWtkH&a26l|OnSA3jyh|zN92hmV&wAlP=qDsjylreZJR&NJ$A{cVc zbjf*j#<_-m=Yj@ikQZY!17QTA#@6L*#xWu8EsR@Yo=>;;FKO$NS5>$!1hk?y#(OKC zU;?)*0n+`sq8vr57 zY&Ltu={*6!vcSzaefMk8rFWA|Hdk6&VA<&G7W*C1c__zJf#p<*Ms12tx@tcwf$Qh* zT(^8X+6gD;I3nArN2~ph=tzu&kbMtqEdhW_BG#@?lkzSNnFWx=>>ep4=CV2DRMa4K z*y&vfq!0o*A_w8hcHJ7ZXkTpEXjypbwSAYK^r+^jt4*be(2)h;I-AXZRlTNX^X zu=}W!IxveD6x+F++qgx^>DLU|y{o#gD3va>av8xbpZmcaBvCL*!_L2_07-gi4?*u0 z7BU06OVy$kH8EmN85&x{HzYA*SgCc>!2O4-E(C8%IEE*pF-9}`bk#M<8+jA-c5o&o z5GdUcKr@h*dx7}W@25N5b7l&_Ng zHq@c({8W;?+bHif)S=vHj3c~NoNv7R*5*&`k{@ISPwMnD@Xe$*kwYVjOd(YJS zMhzc5biYC5O-6&7VP}yZ3^Yb)n2?7_$-K~8mm2KXW0K&Nj{pFYD4kB5L}qHUj5F7D zQ^{o7clAMLG7jThNSRJ2LyZDRCRykPLBh7cwxlFSxa3L%EGa4W-*87_)8^n-c64p$K(RVri5uSUJ#x~|F;jx>n? zh{$n-WiiHhsNr4}UgsE<`eV*VB6VRe573yl!s~GY*LCfL%>rYGQVIZIjEB{^NemDL zW5#@9{DP#9O$fC!R9y5zFx6;1DA8!L|8}4l>bUgS58>5FH%DvHwo{j&Ew&PpSSck9 zkHdyMWTAEOzBtCUG`8^==8+~Vj(kbLkv!vq`py3Y$#hFVNGP{#ktW^*60vxAv}^ubeY?{@8J+4m|L{d+s}V_wLH)UVQDaBaZ$2(|4OS zDt`Xuw_bVawM#C!sBQc5_dfk>;o@cOTMYes&XTWxoOAQF7a~fKz&O12&S#&#_u+k0 zu0@8)RPvH5?|A9;cdong{Ei*l{W^Qj|tNe_~p(!A3X8I6T9ux{-tTJ ztzNsXN7qh3B&1}Fz4^vFB_)ma?bj2CB#{)t;+CE8){r@_kW#8Fc+MGPOiG!{2}H0g z&yF}k5D{mXNZRW+Z`-k}qJ66tg+&FqoFj$goLd&>ULIGdr{d9QU5xcQ1HxTT#v>%@ z?Hq)`%hBG^Pl$Wx{Ye1kZ==aACW#t1YIy2#M~xdZI+aRT3~Op?IJW?ZbIy=4rXWWk z%*s3U*CJBt#7?DIm{B1xznu^d}zFs9=DEBmoJSQkl$CM;OMvL0&^B zQ-K1lZm0?7ug6e&ok6e<_LOu;5Yb z*&v-}`${FKT*rUG$8S+39Bs~C z&cX1pgkN1`2x;H|A_6Fg=+r-ic%tiHbq#lg?tg~G8rKMULN|uSVPyL~{ zpO!j&;|n2zp8rm8Cnu!TLsE$fBQ&y~$*(yIcD(p`HtX6+)}(ncfz0G`gan8=$1Q1) zLIy%e=@J4Kme>S94hbexX$#0w%X5_dVit1bLJ&tJAe9-*0SQ40NdkrICK5cIEN~@d za{>`k1vX;yy zlpvy9)&W4yfdCvwqzkQrq7os9gp>q`%ub?^(shX;6r_``D|rHvX_llEA`p@g#2A$} zN&%1%f+0#FnZ+76D*__d70f~p-x*>gwVn@TSL-y?x0QY%0*M5YgzIqbNsH15K^ShY zc-of{bB5E$9`$@^6q~OIV^w4LmeJ@s2PuVL^pSWZ=;6a0ioCANHa4mXJ^?dq?qhx3 zc3Qn70jpP zQ64NbFs-2f0vZ3-*#z|uhWQs(=*Hx*lmd|{$YK(c?@;?;8sWN}a|oF_(=-N3IIv=- zh78TQ`gc9vL{c^MXf+IZoy`wmi%NVXy_CfZ6&e0WY$2#q>q6?CK$4nQWKt3$Fvdud zloA;OBFA+Jz~&ZXOcF^c9oJ1ISvKdaTD^HsMGXK5S3n}MWZ8=QAA7z>|AVf-{HzZ? z{o#+_<}=1fxMiSl z58V%3*A=b+WR}JAqrmyUYUv@Vb)gqKA+2lG=4D|)k)9R?i6Eu4E$gdqXZ`P?r`D`m zRo1BVnyarHKlZ?ECR0$5{^j?1Q}2It#qxj4n>M-bx~oTy7$Ag5CKJy+|L$`yylQcA z@x>P$HGXtDm3Zcbw;MNZJnpbziG=04!m_Nt=P&*4$6t; z`>v=UeaunETzKy31qC({ty#D6);k}Vw_x7kqefkH!P(8rn+PE|=Z=uq-Eimr`wf~f z{xIPRZ%P~x88Ad7FDN`~*6ilZ8WollKll6_2kt-kpkafvSvQ%qYje4~raaiRaidEv zoSeyKIOll)(i;Qnl9GsIB4K~^^$$yzF2CUXbA)hx+>x;D)oa(k`R*qJ`t=<>Vrb5F ztVl!y@`i3OK9EfHZC0#Roicne<3mjZ)gcMdsJEeEd{Cqu0TtTNW7@MG+B-1*ItG@b+W#YPmOKJegE_kD|qa&wgW7G6n02^eY}?Od@q4kIYRNNEgpI zOQn)R2$g@y83RO}|L7woqsh8#!&^o#78x~yb-@hZo*NnygI^8GL&ceu>g_IrOvBIz zp+ZO(uYDAw6aCO;fZPxwUF^d+Z)YQ8_Ri?|;B{R{-sViCDGYU#4<>!`LOj?T%2BoF z0g$lbipdVg(2aU81Rx=$1=d9h+ur~I002ouK~(CMYi_*b@vCmU@is0KxaH{W{C@y8tc*Wdp%Y|;MCTQ0H__MsyOH*MS)00nW_A8B>H0GQk zkR(VJq#ef*QgX&zS0s}*A``CQ76Ssub&05;APE53Y)&;Zl}<6l>gsC7toJ|u{MR{4 z?!D=XqM`yIN~Mxgx570>9SGiAr$QZFsP(EbrwajE3oM?_|MKEu z4N8hg3deC7Ln)+?l5uHyY53X>shAg$1dx(ALp4u|2>Q7nCeorzKp;49Uv(*@Y8!BiAYLr@nD@s*jMuGF_92b?cSKL1x=p>$W(Ed z_nyz0h$#*_$#sP*Tp-|bfKrk~^=MKUoT-Ox>8MiF%ZJFXLbS-!gba$9R z{(HtHr4&L~mKB?U0Y)qHIvBzC{tc$YU4%h$a!8?SlEUArxl+)m!f-3Kc`+L1SxD)* zYY_@nt2kr}OVgJ9pR)VvyHuzZSPB!7MsSO1AOHvec3_YZ&|(NyP`hPmL!{J_0AR?t z_bEsK1{~1b_BV8LPazw9+&%{!)j5^4ESm#@o#5O;0JN-_HkLLnIQXa@2aa(QNlPt_ zC@Dw+W6e)!Kf%@qTIS;A zOQ6fb`qvK)d0JiX;E5qE6CHX%I<#N8|B7ahujth8!S0p1{!l2&Y_Er+jnNt?$Dj@$ zbLTV75Bb!SNvv!j>iCe(zlgHUK#gIfj6TEbxk93n*Rw%KMC?FRtp&{X4ZEki1LzaD zRIxIE5n@zb8cayrP5^)qDp`O98eFeS^@E8zi~`AI(iI|?%}Jt!ZJS|4MVeB=+N}l9 zG7t^YX-Mw1fqdmmzW%0|SU~(0+V9*OQKq>J0A6H-nITLJ7A1LKFvgh{Od`q9J3xn9 z8~|Jw)b=ip;{pL=$Qjsn3IGz8U7Rjv$fcA;MTLm4bLY<5Ow}E?UD~l-tFqE`Nm&Co z=U5gnhUru)lg&DgYjI9Qf`JP6NI}TJvY78_k)(uegAGIyku6-X=(Z^j{rKg(j_U~F zZBLWU<&dFp-FxnNY}BY>y}Nf($9@SxDo()|bA_9*ZO{uv6_af{@y?sCHE-UWh-^Ed zf+Xsx_NHTc!;gOwkTmk_i1fC=`iIJ32+T17Na>P9Kp{jroqGP|_piM4n!bYukDGYR z;zi3QPMGl66OW#M?ujqH^3F9^-rl`;ul)`hHt(N>6OKCO@u#0S{p4}4z5VIUcicDb zh%s4_z46w&+qW+tGN|8&AAY!PM`i!MUE8*4k;&!?IeYKDkDq+@l>vRack0+?=eAv^ zoIYvkziW@2Futm`_Lf_3{{4@?AAjiX=FJ;je&vme7X3T+s3YF~=!3$d)b-b1&Y0Kv zfBikDRjXzIkacpX&thhrsdy>p3<0M;_{fk!{jR+Hl0Rq9ZQZi`pkafhltM~EwrJ_U z6&00;;5aT3=-dN6Xo*xFx;ns!2!s%biMjLUefaU`=bd+sD_r3SWB|Ytw!NpK>c^RX zrIW>@M-0tn9F|fh z2@4UjSr-5;i<6W>s%#OjUtCvYvpE3Z2+3r!raF_!2r0-FLb$?T*&1Q4r`_VwP)t;= z4vnYdQaUmhYwf|;n^NBinZn3VLgNij8olQfOPlwicLqSX3y2tpirtkDJp3dhyzBPs za!xLhu=i9{y)f;q;-r1vxo2i`Sp<}lkb%WHXI4dJ)xt$fd-mvFRG1P{23v>(4bpD0 zpF>fH=NM`x1z?28pG)(!*v?&hzW;8MFdV zjbiu{z0Uzr5a-nx0QGdQe&mT(gi&TK8nF4uHUJ?MnCEb)ShGm0sgP8Vu8}BqUo(%0 zy7__#44DMU0A1Jp?w8pa*Sh|S(-Rf|Kq_eu8PEp+7A;x%_h0jV`2NF24NDbh>Cvt8 zRaaef_Z<(xi+2wk)bIT_roZ;u`=_2Vp}44BF6Zp7tPwKXuzC5j&%ZYAkb}_T?|%06 z_H8?wwrH_q$1Xsa{?>a39<=}XLxur>6rv!Nyy2>go_yk!pMIZr&;dgpyzlAHzyEpS z*wJlUxAL3HfQX=X&mMa!s%kUY^&7XQ)9K%Tn>}zq|4toRIIc*gk}FnkUbkU=pPt>e zY}wJWWz(W`0+4_3>37A2g`-Cd5mF`@`{lQ}6}$Hg8L}_b*8VeR*_=5`m#kRVu66m& zUAxw-S=YH!$Ht9HBn3UAxoE5)RzFcMt zd{4m7z0hzxl<%b#zc-i+kIL5thE#!elPM*6!R1sXVlowU*SJ1dWbuy*x-`a{A~ z24rwkzhn9Hu4a*Bm`6>8Dowi@M(v1R1m3n`<~K`nwJp&mDbaJ^(VOfI?17egl1P$- zlq7+q6aoYhNgzTYND?vfmU{spazp_1;=Bkzk^xiEEC!O01nE`(B&C#0G6o1F1d@;- ziI9;1iIQ8yfEWTISKcgVj5C!l;@Ko*$Pm*hi`(20LJElt067ve&X|QrK;FL9Kma7j z0!$<=K&Yv#bp=@*cW%xI0Sr;PA4kbuM(F$9pHPv|04r6B?`Ktzc|E+G+E41gg@#)vZj0wIY2xCIsiL;$8bNe7nn zK=GB39;^V$F-6poHbewTa_K)itdwQGMSf(#7!-9{a{}^`pTh!eOi#wxE04Zl;?+#H z3TBCoo1xS*Ff^~i%XzvdHhgZ}G?A6ZJpCGI)|j8K!Mn+p0JB@ z$Ho&WA_~ab3T@_85HYrFY2zgD;O(!s$&8^?GwRNjzsYK$tpZ`eO{D8szr4%_w?yStL zUAs16v1B^U?UbG7jIqzZ{W+aXWNI_T$>M+JE@;=XNz=xSl9uI&TuE{1=50HE`Ss6% zeS4LbHK?qr;XGjjWOHt9F4w3*Q7-Fj+PS-=q@bjzmm)~c1Y}dAVvnF%rFWtIz%YH)!B@=Ab>UGPOuj$-*!^)NG8k9BIv|@F~j_o+- z6_wSl6ipkIE%|r#l7)-+8#J(K^Twc6VcYg?a=9ELu35kSn{Q?e9XO~*&(59{7%Irr zNWO6SY(#B^mGF2eIKYX54Sv0H7~_O0_ie@M^*7&e%cOHBU3uBrjT)6zSJys2uxFQU zotLdzf5Q!TpLN#B7hQB_VR2DSZOx50-gCn(_l_QYz?-kWJ96~!d!}4PQqEnlsBPQU z0MMYc!M9(1w`Tpuc5PcShK#Yfa~4)r>|u-m;l?}eUbka z>@SZPHDJ(y1uItHaQ&snj6dweiDMd;mVt&Fj8W3&(sgq=hol4q%i>Z>hQK%{DP31s z7Q5!ki<>uVwqw`MbUMYj1puxPmS72Fh3PcsmfEP!PFTVfl8`Y(B3B3kux-l~!f{=0 z*?<6?=Nvh4;)GEnhm%xsIhO+$u0sGePo$HDj&L2vkwiJiwK$6^N>m%qL?Z!uJ&XPw z!xQYFCM;!4&YT~84UHVXHzR;w`&kHyM1ly^h9H*3m32+>gc{DtWRZGPN@-dAv8P_X z;QX@&^PW;llGLEINb!vb5Lro4adAO1VOu%Jk)+ZhAXqbmhyaZnmVWrw^Ua$z0|49R z2w0RTsIASAB*yGyD&3%{Ael%=DKpue#kml!ZCmM-${)#c%Sxq^0OSe@3{r->rDkwS zONzjYHUj51v$$<@i*qTY5R!33lP6%JkAQhG(QU&k@<#`R^rttzbc8-yg5L)U!v5X3wr$_#RA&J|NSCqX+?2e_`Vy~90-v~5<0u;~*hiGep^*!CeUqlm6Bam*YulDTR9CIrR8UaRqg#8GSglaY;QqZ`aJTH(ecFjf{rcPQr(bZz zBTqhi-Bp(!JK-=PMOD?VBgY@{{`=GCFIcv3-|kO8^U~OHhp$<;Vb$6V1h8@A)_r;p zR3}6MGFOOX!fM~X-S2;eahLFjTkw6 z((cpe8J9| znu>}oqehIn)#Bf!)N2ZA7vmAUmQNriv4TblhG`}_D$X>YyP?1EO zu^)c<{i^Hl!d#A|Xwtml*^^E`<-}uh*{mR9423`d0Z6uG@2RMI^{w~Iii=M^;pjxL zd4*Kx?Gkz06(kag1&fwE{MeIcopIWJLk1$ko{Gw+o__@-TzAz)ImfXrOG(JK?K_@& z@r~Zy_c?0p=$s=hOC3<58|AmvmtbGAbtYeogJZp|t`XV>pu`fZ!uSe;Eo;G*ljWorpN+nQV6Fj@^wKHb|zDy2nF< zRT5d8S5{a5H1qd9J@;wVs$5dwJ_Jk*UwXl6)S)2bj!%-3M*@;Uq*JN&8@Imw?#DH? znIp%I>D|4P>k1EcggiHsv8LVe(Gw97V`y2{lBKKO{osQ>y?cxua|j~1uJDOL9cnf{ zH(TL>Y|;yC34k-UcHPEb|NQ&-31fvTkOg8D>ai%#y^>JxgB1QG6z<9^M*nWOx|p|o z5&VofKZnOxpb_;;-stuI?@Os#l)^X=(ZLgY&G~Wl@_Ablg%;zS0){K2$JE$DuMltb zfa0k-jgHhdj}oL%cmf$PU?dfGKtKkJBM>8y#E>%;7DNIdmq)EI>Y0=%Bq5WGkq0mU8LAn6&KUy^UeJSKfFj7-^oXgHeBgrmerPD6C+_~{Qxq{6ihZc{ymk@%h2#;UOfD&VVsg#E-<01XGsNQ& z9{0Wm?w3={QQNjMr8E^D z!ek;5tu9iEf*3@Iz$D|Ab<6GdzWCg0XP=pY5A5xiAfQg3yqmPl~K z?K^i}aM4vSzwr3H`3vVQSa{0u6Ph(`>^N>no9iEeJvZbwcrT#dQ^oqO&yFw(tN&ug z28ofHh=QP`85xRallQNX(&AP{b@iS1Ki;=j_e;(@?aJ$?prrpzz44hBr~moay!)r# za>GqGe)r?g4H}dT>ecg^=O6s=ldo>S<3XNG_U+sG!gD953hknXr5}Ix{cU$Xa_3#w zd_QC6{JH-;_;99E=T<2@A!M$&wDhZQXIyg4jRlEBfo%Wi1VyvY;KJpaZk&o^pVih!;wCZ2N6`I9FN?A`s`3$HCLDtY7W&)$CR z$;ORJ)d33t7`tj9h&X6`t-8YNVL}h$004w^2;+~uYv-;Hj z{dygI(0|DQYO>t2{|2}=d97-f}j?Yum5c!iR|rv5RG?N>7pDtzS%)zuh&HU>-l|12%f?J5M69u6;(xr1zhj1rw+le>_mC6^>hJvgqNuux8W%NXU>FhaX;7LFa>=rlWeppZH*Lrm?5?aWE=Y2Y z%T}&y)Tk_-NId((%N2X}j6LG8ef#e7$=5%uUcTw8&%P@uEEsjr;KIW6tUvzwd-m*u zM-K1Wt)tC&VNrukJ1T$t?#E*%9+|Qk35iB*P7%bA@7|qj*jVh?y1lY0OC(H)s zlSYM!MB>};XZ7#bqpYk{wLX!!mbt)mmYcdSdF`Ciw zybgpQC2o`V|B0Q94DDcXUE%q-HYYJNI?&PuSFhE7&apde(4NS2@4fRW#Vcp}PdHXG zvDaY!3&_lYK}9;dYdLbuF(^b@+`i9%8g)?eLnwx5d@W&MV6P`9E9k$x=~N!O7DObv zQ{+nP7pEwmf6fA(B(7;`@iX-b!!4(cWorHP;<96;DAK@)3u51n(9>^Zjj3%zTPNVd z(2|Xq9H}$ zIRsy8{U}p_rA8x`o*y^5%V+NKfqLZ9V_Le7Dyw?<<^FbOrpM#g6^iB~!Oq*3DLENs zndV4)0-g_?Yqe;xc>iT~1Y+F%<$0A%;_TkPeqhNaIRQJ7`%uj%C0VoqSr@_jmR7{< zc#vz4ix!J%e1pDQWQ1SE`)S_K`i1q2|NcWJ&l7#tGC(Ma8=9`v)KjkCR7ZEpX5n@5 z+Lj-^_{N$1;;W+Kf@S%6c)WO{pWgEBLgnAi=hK$Qp3tpKchmbt^9%!hqzhnDWP~4+ zi@5Y0i$HzOYARAb+qPOyP9PRz9La!4}pxL=H`@Nijz zNd(=tY}G$V;fk#15%vpnowQN4KNgkN?*Ed?G;Fg3LiOYomYhd0_o66;uVc_N1QBU* zr!7ZILM`yxpE|;}$ZRV7mhDzGXr|D^k&ct0#}C>0TNYWe|1haZuA1e+^LWg6%7w|mDITYZexT#F+WP-L=+3}|4+EWqZYpXp*<@`zo{Gb=0e z3y{`de!e=B)#-i=(QPvdbQI>{YGygvSQ?w~mszqr=C6S#)Rzf$Z)9^B5{Sq8z6SVQ zpd5S!=l>lR-h4JKgGEd_yhAQy;$XH&4hoDGeV=dg+6LTtDL5tC|3`wh!f8{0^|-aq zh1qf+-Q!_&{lvmq|KO_WnYnR)2u1}xzoquS$NT{K#u3v|Ln2MhGS*-VyIB9IWC-2) zQl^`LEtBSM+m6r21A&NkbfjaW>FUP%tR!}lW3zR*KmJymqJ2ZN*{vi9-O?a7 z^tj*`RmJ!z2XlYjQ#bX?Bqi(qVB$**=MPv#o3)jT ztKsz&`B{SUr2Qwr%F<{k%6s{7(Tq=pIG^56^oz??n6WkPWm~@*!TwGC@x=^7|2DYS z(B}1@&0@{$yd0M-!82beNlD)bYWAR2PZ|RP))@8CK2au*NlB1sAAZx47kX<}y7}m5 zvDKoVq9`#QIvj4`33fI{zkj0nM;~9ZV0&1gJ^xIh{Uv~{%%K31iRBE@uxfgtuD`W< zn>m01I{r_I=H?=B_Z`~r+QZLu1sqY>;p{?lTXnh?@&TE<`50)J3LB}2{FFf7+s=rv z>zI>`PQN8B>^}U!Wb(As(=RJXvG0-8T*3q?$&-%e?Wt?1T!9lv=0uiVLhrR_e8h~g zQo7Rs3RPls%SRxY-9OL)bjsi zV6RYlk2w37VXB=7AXl|OYX0;DR=1Jn&PpT!tNsT@!3u~DvCvtDplx~eRY2SChdi|m zoDL?p`t@D6%7i?usrV{I0A)mDdHDT^*#D~%XH7C>=jJpk^lM_Ao@TW~kU%PWKe>Cr zQ8Ra4UA-xFPA`AMANzbJ8sk6G3mBpqxoC;KO;s{7CY*!aOS*=}A0n#c-@M4$5awJc z6^V-Q6==q}mPZpCb4cN_wWcNDf+DsSa-%YChgyW1YxUbK$B&_jwP!OM!)!ix$hfmL z_pKt979J(<^QJw+d-m^5WOL=2w}){Q;95tD%D981RpiWKjro*iKY8t1yKTW?$tf3I zI^@u|U8o&t_Vv5WWYF)_)0BIQXUY|}w(Zs;xRBS?XakjJ7qGe^5ifCvDe^ev zoOwnXrlWzxtLL)~TsRa>&<7kFCBdittw<{H!3}R2Q`Q{dE_IL^NRx7+dUX{UO zpjp6V&1Yt2^m+=^g5KR1<_|x$-QF`r3Yi^KxC$@S$@OnVi5&Vzi5Rt8&$`DcK^>N^ zHCa-qgm>4iAvQJzK~7J|tBO_lx^bCqgKn+cA}w(S(2ZA|YUgR+=|}62e&#uSlT>S^ zG1l1Tb`S=rMXvj)pgc@=K2HeqOu>tRm0A8io$pf~H|a`yqp9GVNV3EVZKsppt}J>_ zXEOBUp3`;2G6Z#X+!adC*Xg_>BfFfqg3elS#htpvG%O8^@9?`5`cca#^cYJc4bT1f zYw>ru1#TJY8LvL~>qgLho~*>%1R%jRg9OjbCo%w^*}gwId)}@|;wgi<-R6}DBb=8? z?0oLJqdF2Bm^)4j7?cEgOb4fCVGXwFH&;{&Dcqz&UISMZ?N{giO0H+CH=*=~$o<^; zRBo%M#Uwi*-nqQvDdhpd+tG>~5h@DEcg__*KI{x-cW%WeAgg z*?uK&T=@AGAT%Ey_ZlkNJ%*a!=-mr?kh$Ub-wg7Kv?8ZGyCB3YkMN+9F$H3pjyvQq zT6hw(L96}02_Gf-wk8dC!UR?m3ktP_*)nJG*CTty2nCre?{(lmwXx9#`~q>J5VgM}W=tZqq^kSTZV4SYWPpYxTMP!W1Z3Vmkg?^yH_F z<*LLqp-#i#+kkKIav@-^(|zq28ICbP;1{s;K^8QSmMTr-C8%6g*qm3(zD^?kAqG!U zHKeQS1?can2{tx1su*WN>tVGMXuWrS)u8s@b4Xf7PX7VJWe(FBoW} z4m$bHMOQCBj~cg`yEhK2|5a#6m8 z%^fgr`NuKS0v;wBPW1!zbXY@aQF*cubTA~l&FZHWi`gQkXWw`Sw}tXltr+G@V0AF< zpJRcaz>Wf@$Gq2L=&2BE@$w1^HD>uzzp1Xq%#HHmOw*fPj#u-4tHmug8S~;p&Q>2+ z#(kt|2_v_pfoc1!xb)6-G0bqKMX!GLuh>Drg|X-DvN^J6n$mN(sgSBkBte!jsfs;8 zk(R~wdv2d;Kb5CjW`+S!a&(s@vd5;|+DgYXmg==BYyh@iZM`Y9Gm{mo@p<%|PE?2z zzSW=VLklN1by^$*PKm7*_#CUA$LwsE` z09ybQd8_&%<_9lv6)(66T0-~fUSJd`iN}Cv{`vZ6a8KoY`^4JuFyiysLk~Rt#K}*9 zO2nSyE#NHtP#XsnV~k%A_OCkZy@U%PuYo?;z6fDujBGjs$EGwqPJ?J$ea*fY>dpR4 z?-Mg8DRNGrftS|0rEy{SxV*gl6=cih{6zTvP6@7IKP8St9u$o_nVYW&2&{1FOMEk{|GR0UJ z!JI*Zu>GOC`Rx(xW85It1`#pw3*Y$a0y<-u=9Ho|12Y&6#5l{ucr7L`IAt?AFaJA$ z6xn zcgfL1@@kpGId=K@Z`!voKFHEo8%YpE zwhLgC{8yzi{Yrc!q@FuvQFcv78(n@mgXWq0&Em3{(s}i*l`N?C1_#YJAoekqG1?fQ zqVIiPyy|~M|5-0p@8r*~o=#Lvx49aCT~~ATdFb;+YXj{a%S}Sk^e|znk4%tmmf=`Q z@e`?!`AbC0gZ!xf_#37)O*L#3>OKN`15^I3(14RDS`l@bm`F^;lZm^~7ZK&zM$-Dq zUouH(Hn1Wp={tCNr&o=vAjtRmy0d>43{h5v;QOmcb zp9zr?u>K@1YZqk@i;6*1(>RKWnMXCOS%{j0`puU-Su%cV%|U{tn-)koP;D%aSH;4_ zh(MxM2PF3E;O4uz2fUxv#YmV5(p4+DDxB4%WacDO@-<|i)N{$^T`)Ox4cZTW_j3Lv za`n>NTJ2tRwmVwq=Pf?D*5^-5@}D=_1$PZ5^_wa`A?)Se{kK1W{d2yieLds(OB-Hg zIWLO5Goct035t;qCJ3~B#6EJ6Q@L_l0dXt#lteEqf4IL7lIwd$L5qBmI}YP5h9YQxu_XDg&XQ;FwZXUf}T(bTvp*sQKV>cB1Wq~NxXbU=hKF?K3NZ{c+y~|||*U~b_QZ0&$0^c_C zH)J}Dq0JlmsK_`tT32cXCVim!pFd=*A$S?j_x`#Ui`m$ZqDr0o71&6 ztCn!q*4qW+sFrW4{UEjeH}AOQR@BCP(;Sp|J>N}&F9}~h;`rPdNLQnP*pp><$pgPc zgML;oit9v=3M|(LsyFQtsVK@0+F;}9)miY^ED@ghoNsvJ3L{71T&teXb#rB~QlpNi zSnTl*&%+gLVpiMLJVbHbuoC~yJqsD{>0%R8f@~hPY8n>s^N!~i z`sBCb`EyL@Y$zhG>15ZcVEIbApkVWIm~FAyGB;h?&|?rW-g>^dlVtR~0cPVE3n-Zr z#W(M>#yk)Xi*vdB;QH&qpK@qIJ2-;ctnoP`C-N%hJxQ#I&fG8b*GW)92|aGh2|s)7ViMwHK5c@{Gn|GNKH@AjLSQVs zYfiKI#N_VVoj`I|o0w%)g4yh1%CwTueX*P(nd`{G)ov!gn<(xMEmpRwc{DZqtLJk4 zgwfsVA9%WPgl@waW++Ca!9zHf|E1T$C`od(DfUHGX(WoKxD!rdl$U*ekHcI5`=M~-WD1plf zrS>!qyH#Xve^l!IKZ!WHbcgA5SKYzuegCMot8zWE_|H#3C?_tz*Wyy0+*rr{rrbDq z@eF6f#yk#v5LqRLQj+lLRTa%=LgkkMiFWlbBL-m=)DX9jk*4Bhv7^5<4%VF*@o{S<#<2e zP;p9Y^K4n~MH(c`){UlcE7DreLky@vzqsUz$R$h5%G`I8iJKuua}7#o);z<1mL5V- ze$n8S`-dFjq1YwY{+Fhg=5&JAcf6Kk9^?gd1Y;4b^1SPdD13$HF-L7%>6Rg1`GMxu zyOJK!AAi0f*YPC)#rd!QFJReVHnpg=$Nf|xPnS%G%Yc|%DSfZiK#@nJLHFhh(4FO6 zChn^1^CPa%p-K9l5!7n0UWnJoQzZ%KB;~VZv(r_*K2MVT!s`RzZi(=o{GMNPdx#Am z19YZ8VjUQE2K%Yp*Ip_K-pw3oWk7-C2dA+-F1DWwc?aiWkE`C#-LbJ>gCm41<@zJv z$YHsj71J5*pwPrESMx`IVy?u-B2*m;`W=oPHl;wuJz!SMDek*O5`Lx5sG_DZS*R7Y zMHl&2(f01|%X|2d&-V9^^yEUjk)Bjw@5@=ER`^uL35?0ACgLjN!5MM6LJY{_D~2nY zciO>re8&^tr~crdt5FCZ^a;)n;#s}+yn}o&f9;&MkuIe~i4!dd+IN3{sU&ujiH8C* zj>tvbh>kBC8fN2rF0E)!MIe%lC>-|1z%Hjg8?*D$Ll?%lR`UgKq!JZr@V-3;y#Y8a zvFY7W;rr{W?*0gBhK{H2eZUGn)nU{TrzC(fBLfeRKf}b%a>?BSRYHaV`H!nsZy2QQJpPUYc9K$MHS(A(h^6Uu*QH=-Z3!%z7O`gl&gA*HUt9%{{ zZ1h}#uSnU@HCP}H3r62@TTa<`Zth^*O-CfZgrD$!Q(o&0fA)SH1p$C8nFld;-Cw#o^GCnXl0a~e&X$?2jPcG ze*gXsv{Y-mSSco9l8E;qUGZLWo18vf@uesrjz!}b#BRn1HFqhz1FJW7DbO(|%;%TO z(}jn`>cgsmEAZG=>x#o~a<|f8P~ft)W}eBa0d{GFUThfZsl3|e)h{SfRzS29qP$Fh3*9DSkee zCZ|l=yC0k_UG&LxV3g*g(U!%(BPo&As7Fct4-oPf64wXnmZ94fOCNrD)MH_wVgk*g z`m&1UsL_UhB14p4yqB`o!7wz;Sell>lb(O83KC#6@1p(iEx`AavNTON;Y%R0g@z>d zzb=i*&x5G4;y4zBezp8H1U!!7!+PaMy_S>V8Sj08iq_RvUgFXp)Ki;ci2o`RORz~6 za&h>B$a9FbU;3|PgwhwydwUXW5|iHTuf}7!>D|A;Q>BZ8)mbS-W$Xw&B>58`T}&yd zjN_c_Tz;=19mE7x;o$Tn5{_KXxLOK+5Bk@t9o6vjA8%j*yad(Aqs96FkGrVG8sj}5 zhSHbO0Cw2XIAsnF)UUh`H(CY+mH76!P!l5iFCX=Nwg(~pthH~{KN^{h;%N!>cWn3B z9vz%h@xH7ynZL4bq}k>09IY;YIB^JSGL8QOVUSdj`?y%QWjFa=vM2l0NLxvOKA=`k zqaDrJA$Egx&?(p(jUR|oc}^DEOLB}KG(&1_Pl);*^x}Eb8@wPo{(efrh#y^5TT`Jk zU_0nUUh8BJ<`&3ewKcGAb}kdjX1!cl3KLFuJuN~W?CHFGxV2oY=0~w!YfruEDK&zg zOf^aDMcR-WCodf%p+u((1{{ySqoT+~noUcHlJ&=8ehkkE4F)`RN06>GJ0C3OhR37! ztUaDzQGi_{$#@G|WsFgn)l$(8h({9d8d?-nd4>%2jKR>4qzfN7r;`Mik9~mzM?}IGcT7Q>Zzx23tTFO z%ic&iv{?d8?+g#{Gp#fa=>2eoFygpdkJq;GzS_#R13pGcp?9*_X0;c|0(zgn+yv3{ zqm3PrU0B8RPqw!4CwS;`QiL@*^%IV_x$U6EF)^ zMbs21yyNhV-R%1EY)caxxuveIL0mw{%{_JxAp@L><{TFD^*1|7`t0BS`F8h_BMy)3 z480Ng;QCXGwf0#tiQp$8&(*^OGTp=^TvEaHz&*poI`96c?%Qzt^Ltkh;JJH=OX9dZiN2V~WqKGVGIoDe8RHLl zqGJ|iJ?C71z73N4b^31Ni9P2c2zOMugiS~sSw%o1EXqwjgZlo1E)kW>zbsn=0r}LY zo1ET~uMt8Q*}<7?(o2O30?8c6r=zvir@LIDGT7OIT9xf%Jpg`lTdU6H$>iSJ=(Rs? z5GN!oUX6pf(-mC~7l?r74Y)I`@aT@C8sDIA3w?DA%sCT}e^EU3T>zr%VSN4$I{R zM*zd{;OC^+v|Akh^*7&LGnpOVepV-FU7(y`l8IIL`BW-H=wKw=wqqw{EKvi%Ya5g* zCcA@q?B@P{*U1IsIt&7NikP99c-Te-^rX9=EC>nb>>*3!YpgN2D9SBmvMQV_{zLcD zb_g6ikoj?$t1$F7-_^GHbg1r#_jEZ9*6h6p6pmXPt{&HuvDr;ECY$Ohi3ppXEU`2I z78zitP2jZ?v{~|m%QyK<`sI%c-yZi8%V#{mb9A_Tpx=gW*xG8rF_li`5BIQ4DxuSf zX+`p@e{p0@HV$KfM=mEzHygpHwo{cG>2Se|ePcFxVR)Whd$Nv3D$03*LBrYdBa+FE zg57PsDQ?XsNR<3p$L==+m2PXR?+^>tY zh}iTHNHsXCA<~ZSh>nmPBs~P(Wn;2BAI|!HLe;=?m z@&0?ycGZN#9S|rE`z$#f`eBXj;#3+iY=@e}(&Qii_e~swK%9nv$DBD8f*0f9>{vd^ z|Gv3AwUWhz@$ZIB&j85>PHM>ymM=x=QfsVjISLAUIQm&0GIAW=2xZd5DaFFOG)aC8#w!2#*=|wM~1FTyg3CkFbTIn{_}&z59Ab>R89++*_t6o7K{drCF=p=bG(o^wZrmrM9C(weePyg?$chkDI?sY8Nm& zCwh6oom#@EXjR>j_M205pT{jWg6r;ik@oYc>4ez?ZciTi6Uml27F_Zvcy3fjs{J;# zWUc9R5OYCZ9_53x=P^{RyxnFf$q2ewTe=a8xZ*jnFKk0fJE;6TX=Z^dw7INDi#4Sj zc9^l<9fvb`R1>0nyDE6oq>lrdD>Km0(dZ^|s;PsHWvo<|x^-mxj|uKwe#9ZYxk)mL z=eAXiR-|%X&!W%tfIQTHjN#{krp;!XmUx~ajK(wC9FukPQ1PuaSCN3!RPcKL%Alpz zsM^aN=5jJ$wo+M`Lm)o%iMdln1-FJwUDh(<1$JMA`Imt+!=7)HVCZsS8|@U1@~5-j zac_r!R3~!G=#tTRBH{*SJG#JydZ)b|t+hYWw5bgi9>Zm7tS#F)t8L9Y)ya}mKO!`= zju-px>Q7p1!o43>A__A-PJv>R2Vk>()~Q4Su!%Fp{2*rC@0Oee2XaYbP&?wbC78;y z*!Tg5mNwt}0X}ZV$v=e0M`fb_m;Ds+AU3fYsqTYuP)!*a}*K z?0qDa0?Y>+6Wus5ODsR|Z!J5=&sGIkJCgjyKBN8`p%OM5VUt80wKqEl*0NZ2@16i& zzfOjJDn%M1R^2AE?&iggXP;$Ey> zVLR2r`ZDvUOR3(B!<*E(rzhAkVN|Bu`Tlp+*rUdXszB_dRQEA#Z zV;s__hqWusr?TZ z8ZQX@qRL8(@Au;>Rz2a}E+@K~_ESBbj}JDB)i;@la7Gs`FL-wZQ$=&FsXKyuenq9u zYFSHL(xj(z{NPR&=Xz7M*Z{emjHAX!POUv$0uQSF>z^NELi+4Pn<8W z!I(bw5cJw9Wg?SGMZs+8->Xi7bNX-BJ;Z=9PO(b4<6RZ*3Hqx~10rAyeEjW0)0W-G zwn^*}QWg3Ry{#`x(M)l(?P&~DMYcA3*;U%iIcg`)V%a~vCuy}X`W;X}q`HYaJK~P4 zp#e-YiX7sy8(7!%Iu0n4KonjziLuD&JsJl3^-+>yVE|sT{M=h0N;qy1)lcB7vaC#+ zPGaxdPVv}}`mrzYZNOqQ`hcPh;~T6#o+dz|hX8YUQy*`q8ZdQ^xpRJZ8rx&lR#(vx za$avg#51Hn;)@*S)2&w^2(-_Sj^NN^3Anzlvv*{TS)%PU1AN&xK?Rl=ZsyAq-TF@I zu8;*s)D?L=c>bXx;Lw*RSK=h7)?$3H ziD{lDaPccRRf?>yG(AZF)r2ZtkxPGb{KFH+JsZ_yIjxmu0oc!nXH%?eKLgr zjKUDH)sTFoS@ue_ud<-t3^sS7rSByTxFq7nS}W&;g>-ps8f{?px?1mlj5*Ae8^Us> zk|e%T+28Z;r8|#s77C$ybjYEuQdI)J!=1Z{&D6mE+xBdOebAKGxTv&A=pK{0Bk0*+^yAV#&Iw5L- z(_&Na2j%+AWaH9w#zlo~IdkzCAR$xIm?S|QJ3&VP6!o~ZTSnObI?;AYYxNGGg?Wto zBS^t6%eySk^5kGnPH)VYSI>r8zL1==1P6p`TId-yvy53yo!DRYJ+DH^*^!RJiL8-?zpyE1nNS-{QXH zXn#iRx!B020AXu97VG^~-kKU3(*f0>`A<8(G`wI!(2rc>A2~vhI_}w7NR>lXSXZlU zlsKvHxA-P~R`G!O5oLw0s;DvbC918Es0G~bzkfTf|U zLOCX^%PEws`g%iJSugP)%Giuy?+6K_m}v_6;A~Q2q%XxW!WtXzvP9kogoK4fMupG5 zcse{3$ee!(q90Flc$jHzb(W}DtU0rnk)Z~q@w*G~Funq{-(98}w!L~nJcyXH>5oXu zsH=Zbc?%-p|EVk%PPb-vZ#6X2GVfI>z)#D6>t&NJG7xD0r8nh`uuK4GVPG;ki{C(2 zv5^OWJ$h)h@w8zhhnjd@294~WOh2Mv_+{mMx_Mex>Nxwv%t|g|W?`UQQdTbFvMH%) zc6&Do?6nKTpxa}i%jp7uRPn$PekWy24WG=f9NrgCyFvy&7yScBajdZV_^MfWbnv-QeF zPi{D=+KJA;Fp zO9&t2CpNm}fDRFhZeDqf2YIOx_`)~cu#9Xuzj&4#Sim8R$(AS*Y!$@{av>7bFM>{Q zJR;NiG|u3}4WHOiaZw}wej0C@n)+11#zXfGG&H7RyW(Nr-{A>vu+z|Wxme%G?H$D? zAlQO@8XFgumUN@$wG56#91fj* z3>BT@i3366sPD0|ddTgi*=pXhJOo!(TTi0aCHUcr=FM$pX)CI0PuQvlp@zp$`@R;U z6D^Q`w{z8O=;1wDKlO-MBpny5vgkSY5fAAyQ&{!hT67iBui43@z)~S%ZuIP0VA2S5 zeAypKUhv8J(X~TaIYYbd$H+iuzfwlC$KiEeJdN15+w_Ll`!Fy!Ee?vAe2eB^Tk(JF zcM+*{{XJhgYIaKq&Dop}X3Y;FTCP8h0z%^Gf760epBCOx5W)d!>Gl4KOr)Op!7a?} z`gp1H=w_s8uiR`j1tbcLt|f=gAbrFDQtwRvZkP&+?oY$bl3h^XvRlUc?!~IkRWcFA z_0cRhJsT4j7@o`4p%^0PbAN#z8@CyROToTXK*m^dl=9iC+WWcFuKjtZ6OfUSEz8wA z({CUms0W_xtcu@KN4-HrJ#y9rdTtR*1WeLBVQ8xR4t_=(IJWve=Z-r3MO+0#!X9+) zk@Mf|Bh2m@dA^d^JA689mr`TV=?^p`Us|yV_mW`0^0zE1@(+F!;V2bF3TY}o0<@cY zx9eTu33X>3Ew>LZMTYVB$@zWpw9nvj#8PcUAm7WOLu^yil1!b1=s&(`E&4NMjiC2T zTvwC9iHY&GuRud2`SR1h$2;yFhBKeN&gXv0E>^|S=i~^!<*t*8qL7eOm{-aaaJd~} zklje%cLZv>UbJH%h11AE-oaBB!eKxD!e~C?M48}il_Xw zXFKz2MlHMP1&GCAN}W3A#oSz}o1&}vbe1xY+r@lRQkQHc!mt93`{zzd;>Z~cnOuj# zrPz0&2Hzw3{%8+iya1&+HOL9M7aU)huaXF69d$ki?~XK8$cQ&I_3 z!bf1lHcvO>V%-nk&sV#T50NIOdC;qsD4^;Z`NyG~)v#2*ay_Oud=KzayNX!f8_!WR zuo~QJul@2iHqJ%eOEGg3JWLs%WAnB*tyo=grQ)+cfi$$j=Z1k;FOS`#1n(eyhmGSV zemJX_$LvRMPYB^BP*!c}Ytk!^wvYk!FH=7XJ_%Py?QI_2tg-4M&siGA`Mi(|c}Hfg zkB2pw7n81Io|Ss@kun#P;Wm}(YZRr5rmoL;si_eZ zF&7$VZrf_9xi@yA*T5|7dXMxU&Rl}tS#+!#Bne--X=>`q>JDufbg=5}@shD$}Bb{PH)`knmcsMJg|doMr# zjq+EHL3N8HZqS>?NG#KMf=CMt#gQB{ag|RfKS})94?=Uo#DC>fc3~u6uATP0+Ol?= zvV4c>0DC@~c|KAb`)`w-Lt`lh1!MAPAOp(g`;vIhS00ARG3g-lWQ>LmE;M#wtr1>0 zUwp==3%*5m`*n2%@C;eR57R%-Kvs5KP<%U^ia!>YG45AC zXuSenQhfgyG&);X2gKK)fV$b2DH~v0uWEk0P&@fRR}iC_C7M*cWE1;Yfza>eMD%YV z>z&2s0jT!3QoZ!cs=6h4Ip**9yt$85S1a*+Ve;Z`gtWnIo$@!>xG!rdB}}l&ipw*d zo<9nCI%f)>6jQX^_V-CLgf%mwOc5aZswrlkf#XQxdhjyjDuLb&SOevN_AY7o~<8)JWoBd*0N5)t|tnL z@);s$^*K4apdNNNdFPpbV&3p$FuV6*K)~JpqbJVXb-Bu)YRh3eF56^b2jswkntAyn zvIOXlQOpn=BRnZ;)P^F?OKvFzIo(7FHNMMdci|DUYN9^g)SUfENz353pBV6I^Zbuz zSnp|~_+>EDs+(1B=gWuP)hlH~!#?m?Y0HnUfqu;qEnkwL&cCz5FmYXJ;jfiqOL!Hx z={PCtG|6Tb?Kjh*J71aclMD$0IFi@V<2nC(Ma%xPCu`0I%bPO4@h@U1L9PYDu#pz^ zjw6Kg^42r6PZB|?(_X2Uv>8@i!>bRLX{QH+ADU$d9cxq_9bv-kcA5$b3TDAPYUQa5 zIhH&i=fjDo0!y`4;j@=lXOT)FYc+OjK$yZ=^Uba=(eX^xBNv$mP!+BBxJiPOc}yZt&7%Ao_QEZw>h;DT&*BEFzZ2 z=1*6m5Fh-)+>jsAe!b*Zpd?hYnLoc~rMJA9Eu~4+V3nSlT<|*l~ z+{vNgy}sH4u4TfxJ96Tzfm47l2K>W4ovm2#7)%QYyTv6Xka*&s29~hnV=Mo#pmOO3 zv%e^a`ma+p3L`(o?D}NI^zgcbF zW)zA1;r=Dc)<9jO=x?k2{RnAiFQJm4faA?iGd8E`4Fat0Vu44&=}Zd}Oh82aat@ z3`>k}y;)t72#&%fT}B5frh}pTBZGOh*VTZd&-NL-K5v~9@DC99-rt_Z#FO(vJ9CaI zQtvLA>;TNXdcFjSoGwt4Qc7#FKlN9dqoeJ)J((M$!uS+M5F7Dygz@%Q%YVOK+u{-xSzS}cc(^=e{ z>9gc^lV?Smt&@BJydB-|_y6GMzKS9h`FZ_EreW1+LK0_GV zT)>I}^26?IvL#VnQX%1f-L{Fe)FHa^GUflEEL*}@qL|S#Q6W|M5#4poqkl@1B^4MR zj^fHQ{=~#^UX`bwHbD_FTl7y)M-_er3cb3Z1ZjH)(2sFw#o3mqY}*u zpN)yhnvzT(x53zcr>jc>!p-5KLr_9WSha*y)GO}aD!MMGk`PmFZNK*p$UPBiidPV4 z^|JbPH%$DEDYkAoee3t^dc3(2HtL6;g=kqwK{?CifB&0btl3jlRn5)uP762kS*!mx zsAkaoUlh5(`5H7TvqRZXd&1;=;t7|{yYe|?_$(d#;LmN9!edkI^;9}^_^u$@H?yCX z4*qUtPydU~P5ph%jz-AHNu;pzbd&5{rkIl#X%jAebm0cFy*vom&{q7Ww{GJ^AUFGss+&6)=G9Q zuGbo-{ts}E%fTeAQV&GcTimBwM3Uz&>&a@BTuD~}%!NW;TK<*qeRInGC$;tLc#}O7 zEY{byG~&=}x{w#UDwvO;x;QXjvqc#9Bb&HH?#^p6pB6msuMx#VLnYv0hn^!_5LbmUsEKxR8+B zHQ;l-{bkAoeQ?s#bzItfFsJR2V$r<}___>sJwAlx0yGKR$Y2OB6DEOZRtWylntIbQ zw23r=0_zS#Oy|Q)EXRlaxZm}C$M~v0UjBI7ov=_Cpf6;meRi6DczCE5OGvn73=*9a zw^{w{y3tmnm?1FwA1(N!0>(#@&!G1_eY}v%J0Rl+l+92Sno?lCV*LGIp)g~qF;>I&;^N}wES*)P zyX&!#{RF$)aL%rZF#M!JkxckU^!y3K!1(U6v_d4*esHt`kCnaANv>V4thFfBW>pGfgY%$54FtwH9E`W&~Ne3le3RuEUuG)yo+!K1?{p&XF& zi6hMMZlcOR828P)<%arZT?|3D{rym5DNZL&-MXKc@5yi(BdP-OdX`6ydjj}Cf)4lF zhkHg!<0B@N8aHmJFVsH0xPK{-zwS_yQlPFrlb2Tj0yz}{F36kX#Wx_}(!QnGx^Ytn zNh`>-L;61ROKX@0Oe{73d-4wkJ0DN9S0&3yT4sfDV}deUoJ2^!IK8CDzLqtGFok%s5=klt{glZ*al zpZ~EB6H+$|u=-d2;lKdh!=~e`)IgbjW>k5%+64Em*(gy+h3a&i*7QcPDugKUdu@)i zqTxPO?Z6OM=9w+Z^-i#ikHL`{eBP{oEqyv%<|()YTrD1U?$3CCR63iyCGYK~USIwbzR*n%hhmFRx~${e2$Lqg<-7<^v+9R7z`Rm(tO@WH1C`|k^`vR(1pJ>dvt0=x3 zKvERMMStGGR?B}kQIUz+`>XNvVE(zQwrJS;5OabZ4SIvh|B?0RRe!_w&px@(mbn>g zB@5$V7DdT04C*}Isq~?Xzi4VgVB5K-r){;0JO5uW+jQ0FBs~?4hehHwyC=lna0Q6~ zfSEzzr;o^^-#dG(G=2SwLO1ES!Yhpq!;pEy*#<3F$>r9aii(b>Z1bq{?%-Q= z(eD^vGyvf4t`pr#DMQ$GaovZoKPsM`t$0{l+d)_ViZO$6soST!}56LdAR+CYYx1Q0+4XU%wcs@$(Xm@+QaiP$K z94~FOxvmO1+=@GTbp=%AHoG2ys!MXey9u5K@EJMBSL8uriYK=7+_3(Vesz>xn%$Ce zJ(+R&_pcp2D&t$R$L;YVB(p+EdQf%ce*k_#fxezVKm#gu4xW@46CdL!({QkP?+KbWg(a9;vx7>Q&Tkn7DulLWt`(~flt!cVUWo&eSG3 zfXH?3aj6r>4DZ>cJyn$Kj8t9M`}FJCr*BU=!tAWfX*XU&2~kyb?(AD@YipxpqNh!r zSTj+5ICT357E18P}3Dv zB}gb?{d;$B)v{0z>N#0y0O<32?z;8HQ>V`4Wu-L98rZ30o7lMMm?)o|VTZQG&px(T z({%!L?C4<~+P02~i%N`(59(T!$Fpk1;?fIc`MKFbXfkhKRnX1S3=#>zE<9Gl065~3^dmcZ1 z_R29Mn>1|#fOp<{+m$0n=j3Jqz>p!sva@o6y3w*l!TayNw(^-5Kl}Cvg^{~w&%W)Z zDQ>qrF+Sn0+i!hm&DxK?_-gdnvA5iMliTgCt@q1jDMN-2+x+X+cRyZp>csim@4BsZ zn`Sd^yJ_LlN1l1<)fTPW#Ka~TXmst;IVvg&fD9fmFf}o;Yqu`jcJBIW!;h_77EZo) z;^2Y3d>-Fx?>uMdV!^z-uDWuVVHkwa88=;L5VHEESJP7xZoOqna#8{pLZL(mVHo;_ z@`{wC_!SQ=So!SBkF0uW*odLG-*&^<(hGww>s?nHSifPTs=5}=pB)|LsjK&^3L_CL z=n^ZvA#TjZrUcABOK6HZR&242Y$V+RR z{hFDT)2da006ix+N0v>QG+|^xlPt803dye%AVA_`ym!vIBQ-gpP3yv2Zk!Mk?E`=r z)2>O+PA_TG?8zq{{AbspeFslWzUG=cZ@V5*%((elrYe8$*puI)#k9%e6BFahD(fG5 zaBi25EtWrY&*~T732It)R`&VQTEE{vaA4neKmA%W_zSC-6&B>QDQO*(l9dn_0{}Nn z8eh_?5W$8Uv5ahywz-H+W83f=6J4Fsk}WGc3>BA>g`K!>d<}$F3Zc~C+@-QMMR_m0 z{>g+;n`H9nKxS`e8)HH9Bx%%nlfLI^U9$EQ(X=&MI{kv`a>DLV# zHh;b0qn=%h-~8~i>gs9`yzIhR!y$F)x_0cu$(rgqLP%7UFDW_U!w=WAX_2>R>0@4x z2LP(8s>|y*rL;ciFDowtfKR{r&gb!7GjZ&YftMdXe7dM8mvgSFEIl>8s-lty`7Kk% zWu_;NAAR|wU;n}=1OxsH=g$E^d|dpIgNJ_H_XdPr`B}4Xn_t{Azg0=AXIH;DWMGfH{Ncw=l@Wm5yY_RW0C4=|sh>9edEec9 z+s=P~-uTCpk1hD&$6p_N>eV}EUROBny4T+Nq)+co<>i%Yzt}Wq){W6IzI*3CoR^pT z#~<4c96tK=swK-Gd;W=M-dNk`+2U3OJNFb{H|eUw`wzVF?wZ-RPVLsQRYH8Mj4LDr z>iqRTZ2mJjIqm1~H^2VcnipPqvO{rxAW;A0>ese!+xO7IIiIip;h`0)2lems%db1H z95Zaf;=7-E>XrB2U32d}({xR9sVY)CBgle|?Z$Dam4M*|R2(RX{1E}@|IiRaWX!Z# zNG!;7knD^Ud6!`r_TCN#gN)I4uq+$wB$rX*Fgx* zb+bhh0HKso*;$whfd&|9$%*nqx^BpF_=aInN>Y*%0Km|7pp;p?s1d;JQUOqKbh}(a zaLxs#=<|967Za|Te)p_f2M*}*{0lGXNZcMTBDxsuSkejr3~mGin#)Dowk!hRnjWBp z>V}pW7nK+nBZNqbi%E)$0YGV$umEc-+Qi-y)}LY2$+4;lI@O&^?S#foHx%R@XH4DG zyb~d8PZ9tC#)xJF&z>tgaq8TT9Xp?R@;OAje$tq~{`iYB(YAH*sNwyBMldZsUDGs< z+|UI8RFqcK*98IK+=X+q<}RV&TJiAWbLY;TIC4ZcASWj~Gc)<=C!e`|$UwKMzV_Oi zzi!&}-n;M0K?DLpVMg(RVTgbs0HDtA-@ku6JVy^7qKt7}{PoA~K?4VK!GoF}5L^i1ulK+9=7*dA*uLTGx3_NnckR0M z0w53wRF{`mR@VSPvnIJ`PaN5^_h@m;{Et5RBsnR`tt$T7y6omDhGyu(P!(pipfMp9 zqH5tra3`)WeKe*i{r3?T?Tr`;+5&T7ASw!riuMsgRD~6{Zr!T5Ff}v8?|$KMmi3{zEeg!}g$FzV|Io8^8Xc-wX*X(+)a2x}y!48iY5>e{lGC?m7XUba{(O2`V%wI@^`JJW ze_sIj_3yv3nzbC-uXAlpP0Qv5wE-i|LpOH7MoTNw5`giUi{5C|`gZaotAsz|dA zb=cy}?6!t+D;S~eIV77)QE0+Z7Ec8rj1k#Lzz)b@VEg>-2kgm&>*~^~AIj|wca(*6 z8-k7s7LIo`?*EozoDe_&1Q%#}mWb+N=a1Ka@Y?T351-1*%bt8o&p@#LtB?2exvW{s z4(aDk)UE$`XXm~-iP5oZ-`c+a&`FOHb?vRa+xAMTsR($Z)!jSKefQDMuD$cS3@-TS z#oxdGYJao57BMkw|DjzyFDvTWqvYc^{yKiJ{9<+0ppnHBCUjf#$*z6dDp0A5OZD7v zORt11g&U}-1O*C#fL8bGhJ?6*xuoImuu~Y`($YNVcq9~$Ml7}6G7W~HZ;^n|c!<>9m{g zIex0NRqJL;AAP!A`{EBi`YbjvwOgl>gNKhi{p?$vJG6cE)enCB`Io%BoXZCH+3?e^ zTYmeebGMG4eYG($C8b~gUI=jT(6K+a?!IcwsAUg7@ynJ!i;7#$xo^?J`E!O28}!_B zFPuG78kdmVuYX@kNx(3CKF`OWe);SR?-sVmfAifB^P1%Rvvc<&kF9Fnyv4wQy>}lx z^3L0z)CYs!DA&UeuU@=h_O9J~cK*A!ZO8Vnz4DVD{rjvMa3C`z>6=v7nc;jeaGG|o!h4*#{(gLP5bT7ZGoWCqOirwuYY79nLObN zf57ijT@JG)0)$c?B4Q1~2oMRw16poA`%PArdjil{%MW5BCGuM1Jj_OZ*g|j^odu|> zN)Z3}YkPjyKtkZenNoj1yKwHD6a>$embNHr3CMjOR##U~e6Dvs{B+gow?F;pIhV`z z-kYBw2O&gNd1ZW3JOGrRE)Ad#0D+onL(_dOx7*{2iHR~eH)Tyk00;yE97SzieQazD z5-_+S4Bf3z!_YYw2J+18jK8<-y7Tt??_YS=zyWWaZBNl|y+J|!F6g%BQ(%M@V=RaMHl&@^39 zXtVq#nl5VVHA+>33(5@wf&c;JloCWiDFp&3I6;!0oCpAdb6Jy;EQ8`o+?W*AYlYJ7fErxh4b$obLH@gips?JxRR1qAb234 zXQU-BS}ywq8R#jV*pPNSriI4G4oOqR- z^{ux|XN<+hMnAOVzJrI4CMPGx#>BW?s;a0DExNC!rmkb#60g@Sy$d;+Y4_Yd?a-kk znb{d}v9Sa|*9^iar8FfeS=YG`IIwSz+}x~VCr))}+d3g37AUNE=sw*rDlS%fz225B zng#+v87>D7QQHQ*ll!9mPdLVG91#Et=;$ii2oZEHgwQpMu@XWk1w=}$Mm?&k-hAzN z01!e9y=(vw5JD)ba{Z*yojbISj)_W6N|aSlyL4*%;xo&2LnwsgWTvfnXu;tl$Fj4t zVxqjMDG7`+LWvMK|L)t}9+!+3@%entvAMwY;KDg>x0;$1-@2%PG0Fu_n=;lg46o09 z=gjLblvmc*`?E7M6b3>Fx5{STJo)&^Gim8*9+e^D-M3FoNs1Gkw{BgyZ0VfnDDUJ+ z*4|wqF?{sgbcJoYsEU%4 zky_(*Qv%JKC0C>pAwUB-L$D)x)cjTFiJS*ZkKZVZ8!M5K9`FP>f3F`t#i9{Z36(QNpV9j8zK-~)ADw&mZ9RK-zEJi(0Z?6P>w-MDssMnn>?}5yvUUG3%veGJ1thZ4OSpDx z?hE4JMBz(-gfENGMFbSc7<>EOk4KCge&4;f$40r|dGFKM=-5v`{eHmU!MDx0AucZJ z-8ViwaOBkXe~+~9)Zvahr~ACFiA>-Ap=LiQa#bf&D#6BRRN^yR}Z>v!bHsSnm{ zsH>`L+q!7q;gcOoidq%qef`sx7v6X`A!hnjqlO3}gb_`MvBLK3JLip`rvNnb@H5*gbcN{qoln_KT3=V*VP^)qiA^>Ad z2=oU6h`=Zzj7gP(F@gev0RzoAEQXwG8dqe88bld~j?(5O2&2^8kN~=203xMk*?2^x zluF(W2$Zpq1DF5-;KHm3WN?F6Vz8kbl+o<`CUX`(9{s4Ntn}jICHJMJB?&GJ&V#y6 z2vSNF2FUdQ*8n8!83B-eBq?PE=YVp`jh8L8=#}I*lJk z%S59cePwCaAteyN{n2|Tj~~`` zZRF*{yLRnB0qcW001O*C`0n`+-7#y?^;53y(4qah&%b}|jSqhNZL5y7x;B`dm3ilF zGj6+cZrg5sRN!aNo|`^x%HV-Lg%HSjbw!1ph^++!{@PjqxOlN*-u$Ia^9o*i;W5Dt z#u%e)*kygc__}+~Ay?$4WvDLq^G`q7zHKXSOkBrqgIyl?nbYT@qLVr2^#NTIloCP} zmX)1Zr`3M+(Pu}G9Ob&ED5}Tf?$@u!)TuMCpETy)xihCsnK1T->1|px{pYV8kF9)! z5>i=FMub5X#<&ARCe#~IJTHZ|a8w`wh49L=4G&uzCJ<7cZ1b(Tv7H|z00e~K0Yeu+ z7)6e}-X9PGkr+TRzo6j2%9sA#d7w>ki(NZ+pFevcJv9Xh`h4Dd=iHi-mbhc*-ogEP zZTNm;MQv?|&I8u0S=+u%^X$xY&V^wZib9i<;=bGP!=wpg_UzgB*B^gP7=PvY(`Wr! z9U}Vu0Zk8>YljjcL{dWBjOo`eUA8hYE@sMBoIa!((xc=%vMne^^YIEzy83XO*?k(dGoao zC{s19KFI40Loh~iax)JeKK$FC|8(!tVZ(+W+-^@=YLe`5Qe9hDcJZPoCK>=BRe_~qR zKoaqYv00=k(p1;@(U{uvKaA0)>45+u2my*hP93OSKKt|9+F<`7t>1p*+W`6p^zZcf z2mi*UxLbBeFFWu5>f@dHE#mi{KK0tun{Jpf;M*U!Klb3at6m=y9mf=vojYBWmK zVE-N?T2$B6S6AVu>vm8Q?9nYFBR%<-?+?EF>fd9o?i`os_NfY0#P{DF{^PszBL)<# z{bBc>J>`!)IU+H~EsM)ofwGntK3v4KL1{<)MXVf$3}jg_(9r}AoPam~CiVsE9idB( z2hl2HU`tn4G_8>RN$q4`Yal4V4$^K!o{qqX!{TSYKg2*9P%wwZ7#(16ys+`F5JHHq zb5&8k`gYS#zi)r~@dpMD=(*v?jb68_ytE=JCYe!ESyfR}UF~wYPMkiSm6`eI@&!eO zP0PwF6sDx4rhM`FkL$nLcfU*?b91u}gois#R}bNjzLa&j`h+38_ufCNX_M?5uDLlQJ$cSu)6>#Z0vdn)`L{n^`{np?!`rthu4+;@ZOX*$ zJ9a+(>bqS!cOE)y$j2YAedgI0`}Xbk$DjY)w{Z5D5re!g)!-Zv6-ovT>eH-w^L_gc zpFC6g^QPafop^=SCm5`T7L7nIa{D-z;QxxN#YVQCNi)E)(!#fPLn2@=1E(k-Ca@zS z#>U3XnmP5hS@VA0IBfsHLu1E`8FhKTm?+@^xDrM)+p3*df#rRTE zlFI9=|Jk;?s-pVz@xxpIrL?eR%gGa`E|@=O`t<9k-hAgZ(<(;@Se^SAB?cEd4>J3z2{%g=CK#4<>;$Yi z%trT@KoCwoYP}5zfWnBTX_V6TZHnc2UDE`jso~}+gfvxN847# z)-aGVCb$S{dO}=mw=Nx!3!NK?zy&IbdglCvEx-TCfDuCK>grnL=d@^=Cj<{_dQ41I zLR>5WKu#6_Xu+Um3_{y8acTO7jfR<+C^7#dtVAv;M?2Xv%2v|0hz3sohZXikEFY#7 z6e)y2$$5or!VVx%Am^=$3P1?mFhEfRia;>fv`LP{W>C{yF12N00RW&tx61_x90j0= zi;Dq(kJqhR|K+ziIhkA+F^P$#XD{^Y*L%d!fiY2D!G&xpFZr+At+?F^=Ymj3O^S!4 zcmP1o38kEKLP%atru+(_Bqb?M&Vh50m=Gr+866eH4G|1#`MDVY5Y%-6#N%}lvyLq$ z#z)K2p~O)=Gu+A+7SG{;7&vb>e?#br2=rNesF6ZVA^w65PJ+YUV5vyb;0^$kFaXF% zO0`hY+mdv|#^KXA;Wu&Jjr+U0D&P72%{$r2a z=W)3-O~3x?tIWk29X(^}b=)vC-OzNy5CQTCfakwWqs0;W2>ubI<;?~o|dQuHQDn_Rg~Fx-Uxt(!DC~imOnH(nVJ-(0-h>h_*_1FVjw{7p(z9c@@S5#O4lp^3$E0<(uW(YHi)Q$^+h#p;ybRi_t zuz-{h5pG5zPJ4G_cy+$U5>$~`Cc&E8YEM+OY(D6X^29{Dy+G=Negg#n_c^P}c;ZY3WIvi`wd%-0XBAM7_U0AwJseahIPj z%}P)1)2D~mr(QO6K+`7qzyJDoOk51-T%j~RA*MbUtgo+)@+rE(v$8YZT>bF-Yt}#g z;@ef#H8);6R+c^C0=-^ubyZDKVZpB(KY4V;^AA7v%EWOa5)+evA^>qqcdb#`< zV~Ea;FLN%CAYp_`Nro{+7AYcx0wSgKkq77f`rFnE6%~a|3%Ye_LjetgGlfxF4?rrv+woW%G90EmwAWn`tFzfcM$6D5Yhvog}2S-JG>k3I?3_#Ns)`E`?~Id{#R(XL%vpU?Zm$_I;D7VEkJKqid6BFg7Jd*;HBVS`4D z92ytxb-7&kEtsA8?nhZ!nX2M?=)wCxSi7$5eEE&nT{C2GUoQB(`FAC!rU6*}RjhRd zVJeaxe+ka>XsPIptD;~kK?YpxxC z*?@jy#!g=K)Qc+~UdSZc7+WxJ&Z6ay3>U_gb-Cxi9jK^ z1q8x{7&m5kO?BNfFTU~Nx^G+x;T&(i>Bbq;Cn18{=lb)X?UQf3WAEPWJYXz&V17u6Vk%^n%;#s;~3wTCk?NN+3}P^zYmA zrWsSF&z#*fC;Q~-bFaSmbWQceKp-d!dPKQZyG^!ag(mbvz;^ryM_fp_1IxP9;6Ssg zz=28|yVl4vcH$;2&IEcxA&<^uXbnxXc-7l0w9{~oCdCO*WMkK=tiCm4a z3`uLu>*fwJxi>XOLmBz#)y)@6s~0{!rnp;bUMnw9K!n&RpG#&U3E?4%Pj#O=Ti&cF z{m#dGM6EO)zxUgJ|LWL(WQ#LLYXAQ6j8~01b2xbVK=oBOb{#sZ>-}>+V=iOKi&sU( zu!rv6(4kBI1JCu7W2!9=cogW?FXP@9`)=8s_0;@dzxZ(f4RcEjjZ?~yBVk~50&^I_ z?1PvxE816Wnr?Ad68aS~{Mr^QC&fSun9ewMbFVw%5bc$O&U^%mOA6gur|2{S5CkH^ z)&5KI58|{hSc)}J@8#s? z4;eDRqtdZgjd=H+PtTt{pO}(1cyRxs!lq!BlVitDoe~7E7%?z4CE>CG{Qy8!Xi2N$ zHZ5ED+^(aC4k0D~?%cC)_pVm$ib~oP?b>tj#aG|U&B>uYHz(ZS=!=dflzClj-@XIY z_4SE8%-%r+k7ZV*7oe&!n z9}fT^r9Al0ip+9hHKxN@m~ddkCIF$5!Vrcp`$NPsWH=aE$PRQ#e94Chg4wfA%IS#c zQrNw-Z%Igw-M#Zb%c2%Ny0%SCPI&o+$KHPbW0zN5{@C*Lw5<5}n0a$&c|58>9Ddn= z=T|M+v2{;=v)m`1TG1po0{|X*WWn;~Pu2zlOP1V|_-ssRS?SXUr6_wq4@7;NM*@$A?*fIMK9&JG7z ze6#)sx63tu(UPK~W&q;;`FE$KrnGI_<~pEEQ95<(+`L5*ak*+Vs0(P5C$N>0AVzb5CBjWYKv5a5ZP-1B{^WGks7TDGR90rolqsr z>5a^CyrUgjOhQ9eRmZ*7XzfkWsGMe_MOf7X8s1?)Mu8#-pn!tN0A(adDMf*PzaIby z5XP8{pJ0p#ftsetw@Nc808%7@peB$50%Hne)ZhYjWQ;OKBtqq~7eWA->JFvEFbvtJ znlh?TKp`j~5>oH4M}d?w#wY@!R1pbknxUZpAP7`p3ZoQJXqrXhP$P<82#5sZx+ze&2lqH9(B9{$Pf&f4*bD!h=mQreU z`;_fULuNRK)@W&z)>0=Dq~=Q)0W^fB*GbC<0;7~7gFr9{1QbP4RfQWuprC{>#)J?; zAf*I>XqwIx)~spMe*OCTd_G}dY1M;t2T(@f@>5 z{eMZc(t6s!HDM#l#O43}kOjHyM6-~+g9rrKx|4IBln^&+_z-!E5Kvs$3}h`W9W&BW z#*ZFuzt1qZ*X@e(c?1_+@F;1NF}SKI(v}(s20d;U0#E`u*%<)BFt}mp$%%1SjTkCl z!VSac@wP5*0SKm>4S_KwJw3&g=@2<$%c5p2p_%yz=NW0K0ALt~&*N^_rYNXsl#t8% z_W}S!5eR66QnWlRG0|RPmT4mi@lkTuC<@ETP8D1TfQ;0*5kvX{03sH)Xu`Pw0M>+7rXvhy~q z`>bP|lIb(9x$eeWmOZTIWo2&s@#pKWoiO6^fn&$t80R5vS`}>G{Kta(W@Tn%yz%au zC|~ru?|gdt!bOkAS6Ox8e5r>qT3=VU@8GejntFxNv!!LFWfen*5BO^H7DI?AU(D8R zyPD_b*4AD)bM_Qt?Bc}>M~)ry2ei1jxbJ@0(x$jo(oxM} zUwq@5@uQ1c76$x0J~4Ug-&;5TvNba!Y6IesQYZ~w?F*)=kjIuMY);5xikh5A`@Qh_QK(ywiPBC21DYwCE`@* zN<<|zYx#x51$)=ZS2zM-h1p`xd=MOaTe=<1993(>5|GLe0Tdv^?R5hH7^5=4fB=zo zWC;N00uYH}ap#CM8;fca004nPjzc=hh*U5+7l?)=yNPizR}AeZAJugot+I4>?kON` zLQ zvDRa@7>-u^4~rEO!w~t|*|*#<$@vU73?RfXjLfvO>DONyI?s7YNgD}3ug5cK!WH(V z+ooT~g^-gCYC*0WK%jSzuDyG7l{d(y$&`}976pYZ3S>CE+wJPmuB{1tO-qiC8*{}- z0APwKH5!J|Bs=qg*>}i4gF#JUZ0NwALkIS>ha`j;dHH1sLJR7YkhqxG$yblF2O|U* zLS$!WE|_;000<%CVxw=qezHANBxFGUo^n#scnT01(QAv^j)fM!_RO%DMnsFSa}mGI zcsgoV7h2Xd)x_W8F_hGoQt`$W=2QF#Cly%tbE|} zFE*SnJvXpVujr__g!s7j?TVj#^nr~(ZSlC2zP)pP zw(VN(+Pxc4v}n=1PmeB^*<5t()ZwZt2A}EJvRjuk)NOU@Ur<|ezT#f zvbJN#cJ100XJw?Wcx2wrU3xxB60jUs z)_K#Y5}`vy8s_j)E5?*;oGP_FM%ynSDN^G{SX>2|?Ycu(oD(5ndmC&5ZmFPQrlCgq zY=ujK-pKl{%wyM0N*7Z(kLeD&!+ySANJym-QwpZ)yl2b*tSc)3>zMtf*Xa(r|m z3)bl#pZnyoi%W0&Isg@eN4M_Tr`W3~NjYk4HXAy+#h+iC`0Mv0H$VxYL{e=K7L+Y^ zN1W5O<`b#oIYpg@7_f6eB2G(~ha_MCi&;f7HphFdFPYHfa?~;;J8WDbIhHhhOW5cl zR~m*+G`^gy31I^c6f#T@VtLoB3-&te-Mh!@Z?FC7=WQd0_u91ix9;6LQRGLColz9^ z(EelR&t0ShxS{(Ey{T3+cka-GH`OHd7tGQVI&)+)+_Upa**DXzQbG=?~wLe%@ zSD%at(J@|1#jwlzv@LF4R#}yimUi{{n^MzKW+)Tn{iO}nSs zY}{^wz|#F12d)j_u+t%ZF&yF{v#y1cM&trQoHZOH5NX}fP$GA{n^-wta&00CjEjl7 z@6KCF%gU3I5*Z=EK=6v;gSvO^sJfK6n3#HhKvk7__uL`9A6~a>>NVrahgBsd#@PdD zQ{3W}m!AXzQ6A5t`E$xIUQ9|fE0tV7X{`NiN@Q9FwrkU>LrH6cbAuZ*rrp4W0K^4z z?Z}f9LXTf0btdBF)=O>4P955 z(x6v)XuMJaH@lfMoG%bZL?LmI1#_jz=sYgCqN=@KM4Cav^nK^p!i9AV z4cJlkv$3E#AOcW8qj6anQkDP+C6>j=%7`FHnImf^#G*|LrW}M_B)yA@Eu$g;Qi~)g3X#S{VqT(@Dt1@{SSBlbUKS7) zO9Yq9+Af~WO?oZ}fWjCOW_kYwa`d>}BZm#Xe9*uF{dyXltEx-d6lIbZC4>-)*3eCT zNRC-5X;z?`soI$BhT3Dpg0j--@= zrt1dhl4dhX6@?*!rt6dtN-5_Y0U4tR5C{aotkHu62qI{jMu?fDsOg5_Cz2l98KYEH)eK|Cl&h<&D%X9v5s{4^J2ERLqi^5N4=ujui*JAYclUusi|!lP zuSZ;5?Ba!YZ}@)G=HLJ5+OdP%?YeEo4F~Rh@S}BKH!Uvgo0IGFxO#Nyl#-eX0I3$x?Uml29CKW+N!!o}+7%tS5( zBh=LU8j-;y$V|H582^$O3T4cNluD;`=9E6n4c#bqzzXlii2nm?>mjjXGfWRWG1s8A z5=^%(rHDwuY>%cJMnk`{sw(!NL*6jU*+49XL0AH+SwY)caMB(mUnNk;JnT(IOzv;`S*=|QU>5t6W(Vnv14Ut!5K4$)=m11f6f;?h5ShbE2r&!; z!K4O)3m`}-4FrQyOaKN#U~QeBF>2Ed#wa0RI7D2-FbELJD5W$iI(q!rF&)~s2LMJD zKp~ltrsTNqq$&ab?DFe3QhFg1nrWQ?Ivg2m}HEBriMbw&_#M z_n^>qeZep$lEtf<_?7_1GBi*%PI6Zhimcsj{2r3~bdQ9l6-I>!`x$#A}MS z{`~ju-%n}*qpm6#tmd%^3JPSD5yEvXNCQeBfJTtJRK-nE*Xp$(7l!b}Q*p>@TP@58 zZ~;ItA_mS0Ya7=ft(y+)+J8#kW(SWr)xyw!!cD^F8Dh&j2q0_65&O-NyaCNpvgqXF zU=k7nAx~*zNU(?5h}dr}n#dR1qc_n4Lu!%h%Qy!Ep!lWG^0l+Zy0eyRnyYh-h zo?QLL+i#Xv1U`7{$s4DPpE>Wr8*i=L@z3sh4P9;z*Ettbhakg74E}T1-uK@9WcQAL z6O%H7!QjX%hCi@u<<&RbzHIS*lgEvG{ORY`to``l-Xrtxo0FOpQ(sp@0I8HG2<6;J zjE}$R#v9gs@%8py|L)m$!Cp&iROis;Y6xz3MGk@X34?MW?=4sd6JayuRAAh=7ey*&veB8Jz%gf5% zdhg@9%G#DiP4k=Pa)WarGBeUz7B>C$_dn`utE$SYVq>Ch*pNuH+X%7C`JgQ(IKXKu zmEkI+e25ajP}3sEW&0N~5o#?4iS|aNI%{P%DrHz}i4ubwhGC>6CF;7NqacL%1A&D2 zI20n_52y-5%SA>A=(+&_Nr`c?7l+h!ISLuJAoBr}5)-*$aDj|bDJT$2nKZwRXmBn) z5T;~DfHH~*C=h^0`#hR%1OkC(&2qV67{Q=Rp@2vkL4m5GP)Y?Cu`yl%f&z&fWcd;z zjO>h50MvC|f-yHMO>hwiYQ(DCX@LdJlyutzB`jE9LPWmg5he$iu(zplBR5;HM>9)4 zbjtR(hTcakc_K72n;HOEK^17G`2nJkQxb@bQRa37gj=c_3lk@Hz+hO0fHb{@{$HM< z6bO;QW{3h6RZ&3EbzMel5X+e^EejZWp=3G)sMF%<=)~k)=GNE2OsFv-LmT78(c;gBBG}2vdW&q6ha8404NMY7=|H(Uzlku0j_f(Aa!hk z1Q9vs3X?%`5fK-r3@-$6s3mA+QAv|0Ay(S8$w~kK(2hy87X(;JfJF{W`=1^1V4~E@ z+CTvU1prV$LvY>TgsMmsDGnN($3{nu8h#l72+ld8qA2#-ux)KZpzKDfstSSdt06XF z!JC*enE)Ydj)VduLjCROG>&2k0}`t9VX2KEP0|1yg`w+=nNge;d$!hlNKQfo=?F3V zgivbPi7jYbW3tx|np=Pf8JVu>ItmUT!%(F91a6l!ViG$A8|@g3$jQj70JbqP3}2SA z7dZ@h+I(E9UWzkr7HsZp5K0uLSmv@YZqq1m?XNq}L>}gXbRf%~k3;uu>=3rB1!muA zd0LJa0e~rtF=iSUh*ct(5CX_3RTagQ)J;Xo1Tq3B*5FBKB1F5t_ z*yB=WOuf$KRuOSvzutX%cXz3(*X>&M==?M1N(-Ae>)5{4p(7_-6*bS!NJfsU9$yme z^Jto`5O(2wd2w;!^G`j51X>q1cPTW=ld^2loPT#8%*)G8ijS_Us=0U0)F_`v)A`k7 zMV17VuyC7_)}rmY_~k)n<6@Jk#v;;aRQHroE{5VGuR*lR4Z zK_~!`il8+@0#s5DL^I!=5L-$lfBd}@Iq%%5tuPx4n(`_k^yrCme{b71X2cNFHjU=~ z1VnCdrZ8cD*^=JSVo3spqOgDeJ@(@3Z*ie7zJFF~QUd4l6F{vnVK6tB4K|1FWpWNV z2^1jQZqL3$$2b1CsZXzNt%{oifWlZ+ZCxOsr6nhTwUTXKLrJ*YEU%(-!AF2Pr2GpI zP9dj3@OL==!rv!RDc?n@BoT7EO63Ou6lO_TQr2NWC6^3&P#8mNKxh&)LYXXPA{b)= z372Ig2{5KgBq$2l#UCi8jn)~6j*9ButqYifS%^U~Mum_skz^57LJ$REOxCNk^WzXf z2$YrUY zF0lzi>^E|kS)`OA$ozZLZzcrlhE6CIU>L#_K7*P@fG7&{2Lc2D2$j;BREzw6KV?k% z98GnVQc9_5vNY#M2mwk+Pzw?XP)ZqPy3P@$q9lc7pp41)NT$s>H@Ge>2{OxDI$SHO zD$C0%4XK3@D$^`%kztsMLS<-(t{Xyd0E!?K#()qZgrX>5+6U|&%2M=zMl~T5L&Qd(CEQx1 z3Z*m~GPMg70;HzXn2=~0)-6GSG%(EBqiJ+3B(&1PO#Ei{ESHiq061(i*kG}mL$N*9 zj(@`~i1t827ejmZ67m#@_^+IldBXN8NI~1+hBsD?PoPJ)momzj8$jo!$IF71K?;m2 zR8eWL&L61s$3#U}VP$S!Y@g9>zWQQke4IBrmX)2XIDN9}&&_A=y7l#6x9rGi*6hrw zKxUFVIw~eUI*L$28PRLBUVZcLe|4}NiBZR66c_b*U2b;qT+NQnXIpg30|2fI%9t&` zV56G02u&=^G7|pFN!}gc4u=vt;Tom{S`agBr8ekDIKf9Nh+XhY#Ce3ItH{$0PyXNK zgUE3x+sCIXA8vHN3vAUe_=w zG2yP6H>Rc~A3AiTP3u<0Et)Zvv}{pOQ(ZT6K%X96I|MYHbKWdJcj5fo*M9kZd{p$a zkI!$`tcl>lrK*HR+N!a!5Q9d11P_85Ew&5P19s)VW~Okx&}aGf)yb|dTGF_H!N=kE1Ze~4F)wC-oOR&V35+VlD+8Y zyCk&^GctuD=R$_zNESi}5g>Ffn8Jj>`g*@qn<*jy=!U^4Gi`7{jG$q4J3#qGM3f_8 zW+65VY8nM%HiUAF$EKYB+cydhs5N#F=`XcFA97_t#0s&zJq?iJ2ptO>O~~&ZcCvxV z)yfVK0;Q>o3uKHPJ8|OM?|&H7w_men`LZ4}m_v&cJFQ`dI77&^0T!#XOox*FS zZ~u{>e*X2^$>SJ9+lD5YdIMr==h0a&Cyw8dU;()F_A$4O&EpUekO6QRF^2%AZ^rp9 zAsjXirzgXlIt4&f+-A{hUDthXp>shg5hxg= z9@ULPaE?}-C^%*sN{^E3P!@W38vMbMWkS9Zw0H;tIM#s8UTkQajsc6cqir^jD-eMY z?Je2gP7qJLYQ1R zw79~=7a$D;xJEarX|yyQACh_^A=K;j0)VFJA#bY%E0erXXB7f7)Ya0$9TO2K(4jKf zhp<&90NKru0ubW!ctBd2LP)VVziCf&Owutmd;i)$h&dN)QzO{Hybf>y0JyA_Z?twM z$P6_rZpBIBY}v12sA)s1T6`a+TwA|b?*Sm>pMZ)3sgOgtnolQ5_dQvtVjB|#t{ zEB9@AIC7aIgp&q(sr`*G z2|rvSCX^t6%9w5#s>0g0F0$|BTyTT8Xx0R*RDD@9v9KV&upl1*IOm9>X_M@xO|m71 z4S|UXF^FIoJRvTY5iksafK76<5JA&*g+hn6<|l*@iHR`)AOL+{H-MW95!Cd&tc<*@ z48zb9^K)A^%@acS0~#Sv(yEXEe7x@4Bgf7U9*_tC?OPWD0HBb&QdO9Ixu$6`F;SFK z!{A)-xL99JU0r^DUdIk?qoX{5pcZE74rdTnbsQkXvW7%v<~4XS0@_Y7$UFn4aoX1U zOuf<+49qnlh(H0v+AnCWWCR2hD2M>Ci&X%kS)PK+ubBn{0s!#T>bFvple>0lFY{3l zfKdVfZnyjE?>Bw+<+r1T4PuOPE_B0?u5n6;%kAP^m?bX&g{+exzXb?LI5*sG_kyJ> z0GL5%zW3}u)TehxQ+*JKfD}L=M~k9bS`RVZ9pP$-B*unexIOOAzutJy+@KYA8bcOAE0)8F zGMiIJkVx}87`{k|g=TZ1P+~C~`!TtBNf<46VBT6D#7a;=na?1nD8EC105A&DSx5*9 zAp{qyOO2QvA{qu4oD=Emuv|u=$R4ZKXGkC;1Q94o$D!qQlSUKE!YhYh+Wo)AJ!+mphm z#p{Xb2(s$g&j(yqyzZk-x%nw$uj$2N1Mj}Q$>XN4Jo~BQQ;XYW?D^;K zxt6Oz?)Bf*`r^RUH|Mpvgh>ZiQQUth*p!tci$fP{=2`YP481)QSM0~0AK|5 z>bk&Rf1Um0)vdL4RYfJ)g}LcR&-zOb80%i%_QgkkoGRtBCbg1fze8KyRLd;tVOtYT z0m{@*Y;tO?7$;?x^ur3Ea|&yAr5p&Cx@{-8L!`5WPkSure7z8WCrqn*1oxPPC){rkw@ z?K`xUKRD;Qrgv!9rbD|nmKg{MA$Q(-gZ)m!Fp?7D@49Uom?T)a>G}!I!Oy;Jy8IE; z4MM3xX}zWwH_tDgH9hna&Y42NDW;hqH6;2Jm=Xvf=7UJg?%I-xGGr((Q%UZvl}U-oA>?Zrkzo`eYD)-O8GHl~nGza{2^SHX zw?!_juYugt>x5I6VkWDQspK3a3OfSx>5zoD0U3Bgao3JbbiGaZy@o zie_*|L2f0+RAL=Y#GoZ+X}a<6p8b@N_9expi`DT-2<>_)XUGUfAp}ReHHW$08ek&A zJ7rz7^FYHU2SBVR7^QV}^=m%=s$EIj;-Y4pb33Annq`X+fH@28ULy9=OghpvO>wCd z%sd`}cIybsDlOxi6vhbKd*JZNQ>Xj)?x84(9cE$y@PBP&VUYwo_yio=gi(57iP0C{C0Hh&txuhot?9n(vgBqEXIdB5oT6MGp5Q2gLMPeW~ zbVE^?W8KX*g@>?VXb!+M&;nOjC2TTZr*^9z?j6?1>CufTXVKOcN$l{Ek z5MpqyX}UD-5JDNH0zkIaW{goYYL{rbF1VnK$`;}NKtM>x8)KAGzoAn?7$LfDXhJB8 zLVyH=8l_ZK7#C;+H2|bcp@f)~6B*$`n0M*9}T2qfFB|C9HSPjvkL&GdQKp zTrw6E2np#z)WQNKX6Uwa6-p};lTwVC1k*@KGc;u{CnXb_rUQULp(={>gUWnoA%vo+ zhM@}~!*B>9$XIMH1Y?X+qG`IU6#xKCQDiw+UDr96t>cKQC;(Ill#P`tDyyPnlI8Z` zTnI!CpfalKdR0wDK$oTBxTa~k!8zwH)#dfNpL^xK{(XBEj0o{BiToFFp786~p_flxUicTmS`OViSZwrZ9yu&IOkOge{yR5=vD?m1Yh_WwrJG zhaP>Vc|pOH8^(Y4-47MjwLsv>)o)Ot4jnf5*=JwMPD{LUQ0wJ4$tQ$@l#A^0G&01;)TOM4A&iciov-A|L5sObnb)Ra zG91oq5duifgnN@iL1PDz6)hBIHbD}CT3vnZ8vwv8mw>jE0)!x?4vK3sBVt#KAOsOm zaE$1g>x|at+^nuEIX$uR9&FQd#84X(3FXoVpOy1ZTcB&e!6KPWxX@{biAFFI0u~Rp zOiq@CRC0WQlrmX5!%p|M3wM~xh2>~5-z|i&Z2eO1W@d>DiDZie6R@m==+IXPA(Svi z2%xY<+2Sx4J}NJc5E`i6jO zZ5Zd{4(e{w1@rz0P&-EK{3B$~voRQY&@^M2Qk?v+2;G1-^az^%JgP7h*!Rk!GZ$)p z`F_uu6Mvq$p!FS=pV2g7>dd~cJ@@l_FKtpW?uJ`>#3i{C;}bJ-QqR{^jJdwo{=dur z`Q^CkR>xh{W5)fXqSHaI6z;oT*D9+)rv(M^8BOB>fGVVUVd~!9mA`y>?8M2l#ssCL zb#BY{X}dq%|JHNceR0uq9`DkrccP)`lu6;yOy+VHYYPvLMe`N}YcV?D8>a1s?RX1T z)_=petK)wT%N&OK%~-V=EK3+#D095?5{K0v%eEFf?+!V}8)`LDIU$!?7ma=^e7X%D zCDsOz(XeRNDl>yuWff8(1OdVn$~l+hPf=)43nBm`RO14HFvbKIx}i}*6iPKs0{}*e zK#*m#Wj+oi)L~f$MC69q|53Js1dt_QC?Ql9O<;`bx*_BFfe=QB!MO|vlkx#21b}dX z98fV6kq7{ACP`xikQ)3339~{=VeV zC^D^WZCQT82HD_y2$pp$Y!s&D%SyO;$h^i>Mt}}(nzOlqH7sp-*F=a6A5sje3v~^0%g|hH1SO_VC z3W1^CglO+QX&1sU5)I}WMnoix-M{#uTW*>k3O`hRZ%{pbm_9kGP1K5-+PCms0vf|A3Ao=f@Mn<%+3bH2Q3&C3x$5fb z-}&$huh-qaq}VXH%hfNx8K#KxVf(BV8!!tAcPUO$L;qA2{APV5GXr-*bFty$4QCD>y<8Vfry-& z^wL715P*Olx4YKwkM=4bfBN+=fBeHk z=^F_xY_zmA075C%3|&#&_sn~sbEhs-t{qDNG)=eb1bIB3r=NdyVE_KMVGa=l3X^gF zA8A};NFY{jb>u7Ts29r^+Sm(2B2}0~=J7Fs4}AsT5tz-aDacMB$SpCONVbyCf9R5|HHt zhzTL2gaXijE;0S&x9S#z079ML9~fJ4c*!+t3tgqgHlRa6;vOPLzdijgRc zr6nibdegPtJ9jK9$T4(1%IC8xU=jeNl-Zs?yE-EvDgcVd1qcS3Ql$eLwtf{EU{1jD z6FWTZ_C3NB3G5XK_K$`dvP@>QE2$x%t{JinoIHX-T?PU-JOm2PMU>AM@j^s&KB8$l zp;V&J#aPQ`d9J7!08ms#rZ{*#W?{IZX3aKl-Ur5=9K0@hH3%}1jj{6;H5A-~2X&3{x|~DOG%YGBG)T_58s6Y3GFFjNtz~UeRXwBeVsouD_w41(^($^PDo`ihwreD5wJ`% zA;xPqBb3Er8MT-qA<`x6sB$YAA0^I$F%b5lOCB~=Z7izJgkqR_@E?cNC@9dzOPM)k z3PON$A=_jT3pGH9s;EMs!A;L13Z#rON@a^Jfr0>GDnkK=VSw2P&8#V-DvI5l)I^;< zB}>GW%a>Tuh$zrXUPctinCy^5Ej1q_#MjVr0symvpp>R;&KNQRBbd%B0#=zv3)Hrz zf>x@inGa7;=Ui~1x)ixCq~szTzKYOGoB|qz*U&())I1wGX6~7#tA&`$rEqDDvmsS( zh*(rYf`X-PHtK`4#Fs|jVjjX$=Hv^V7NwAb*^+<4go%h>A?d<-4nweW*dn0;@sjhm z^G@vRgqY|g6ev<4W;87I!Zmkx9yp@t#EH`E?6l10(TF&7Vuu#3GS8J)Hp$9L&5S_- zJ%@BGY+IC;?oCRKy7#H8s_Xpm@jmxx)e~m~>bNIbowazhp(9Y7Hm|?OrviZDQASNJeWAWnvAZ3M|Rr0h=Z*IPS> z*joq@01QnhRAL{kFnbU(dx!|>Ly>V_ioy`3Zu}q2AFQhqF2t1a!A4snMzM$k!+zU@ z+hHJY%vBW<=$zXsG}r%wuwlJRMj*)txZsMy6vfQ}TxKpCNlJ)MN=_hzFhx;a3JO$I zR$b#4$m3(9r5NXOnPRldWflaH<}-tHJ8)9=-z>jam6RAK1ZtY$^Ll~6`O=D<%*>38 zOv-=&Fogv)~%IccBg-ciV?9#DI=aTP!*x=Xvfbi?@ zf827{yslk3jUO|Dxm^z~d*Zg)54`ir6HRh6jvhI)?vu}k4(!vfPj^C~s;2ti9eZl3 zYe5Q96m-KN1Q}BZ5r)A5h~V7dhUMyX2mJLyR{S-%3_L+VMO9UW$x8Exvd|D=OfhT2 zBN$vaxIq9ERaF&*8%9v)07wa;ilQ)voa=@m6FC`UfP@PX2xzLRR#a4!o-bug1prDI zHN`Y3X`|`Gpp;ARi!_nw2Bp;CytcL`(pl(4K|{<~NU$>ji*HRFH!3qdMKcUyE+DWgob##0nU z03eq!GQbD{fY|8h=qN7$aKQtCpl;}@qR73h>%6YEUe^r(8PO0fIW~f$h6EeJFhL^! zibRm(O%Y#02o*uIzG-tKS+!4sR1iRq&$sEaNG;}c_LuVIumoU8;j$Iz^h%tpp21OlVoxV z4IJu_4Nw3#ICEw`TJ;Jy{l0zmv+oLIQPE_?6+=dk=&J>^Z#Mq+-aG3mt7~fOsuQBz zx8HfofIgi+So_U8Z+==+U*EM$$<5QQ&CX0hfkehWP%wQ;4tF@%LPmp);-ILZ1D*ed zBvI2!Kjz!=puy-mx)w#7vNpzAtSC;(+>Rx>1KWg*8*C9=#9As1){ z!J)$_E=BSN@riO2A?ewvHCU?=!yzArB}Dt3h$xdr*L?oD960>e2cJ+vMqWO=Q-{_7uzAbhAFcVkS=0P|M^1L^lnMX} zW3uziiBspEc=CmW#Mm?ED{E>rO6gZ$fB*H5n+YMkyLG*4%&=G9{ovxo+U3ihIdS6j z)a%AQ_0p@m_8m=3jG21Fq=Ke-LI4*;QQ4EvK3{jSV%FWu7S6w;ysX?86}RT&waHnj zcTAuB-A}*%@Y9yqD9_cC#^qlYfI@&Jzgw{) zkz4=L0u>=3Y&k-f#%<(@M*Yop8`j2N8+yGd<5EkeG>vVhKZ!_pCS|HZ{Q*s3)DlGr zAOW*YmMH_t=DE_7C+p$a>eWx1w|u(h(|&z=a?WK^Ip@Oda#dDUJ^a|Js*9B`Jpbg$ z(`P+yPfBuv5MT#pIlaXQ2xhvm70MqrD`ASpmQ@A`H3UV&aJduV(R4xL{X7#Udi_d=_(rnSd@?uWLv|SMZkTq%>zQ9=Ut_Nu#)q%~KLW-j~$S^&*apBW>e<)%OLmZ%yZ^auRIyx!(cMJX#t=OX|iKv5PpA~FFt zy;)3pvluX49|VbLT9V!r(gA>@5CT$j<5F|uP++iLPs@)=gBa8e0muzhDAjb4+9U}8 zgb1f^}9CKj&b z{+C?S0n~7-Y`7vF+8OrM5cH5*1jOR&4vJ%i_5jGND^y(!Y|`Pt3$<+h5r=cNnwo+o zuQ*Zdl#u_g>b^|~u`#}5W{I1FKnF!LuiNq$n9<7?gb2#eHbMjdLo1xcvWOuH8DW5C z7J#6{EWcsa3bYJe7Fi2Dju1kWBV!H#!^S2@BE!L?Jp--RTKW6-gw1)GW=V%&C#hh# zj&n)!V6(gb26^Zm)@&T29oSXNoYLO^2(g4liok{o_mOKV(q@FGyntuA-GF* z1%ld(uYdT}*FO{$HJdT*TCdkrSyTV^`yW5H;$&J{;-ZBMRF!@F<+mSxyf!H@d2qkp z6DN*7di2EiKW+|c!N0a`AKbUkq$r8@b5LN^jG$<<(b@JACxyb1%Gn z_UySft(xC<%Pn!S(Z^1ldU(ZC=gyTHh930S>zeLyt0=_3yLbNa>#vDPS+nLYy8phr zPMFk?mJh7<&e zSp_2!4+-%Jz9>&+P5rU```&!x=}xVhUw7SAT+=Bf4=j1OYv)eyzxlk%C;)V7ThgW1 zkS{m|l z*YN1W56X!u3R4uXJt-lOQeyVY0{{TS0NoIj5Wx+%+hvDW1a+MPiSl{vj~WJNl-l7K zX2%AXOP6BQb{jMTPoHopaM-+jwQkG`BS<|Z=B9soeoH3Sd>RaM!2 z;K&nCtRD95KuSq^N_<*sYGQmG0JvPL)QfDegGG+a+N`STas-U%hG7_7VbpEm(I4>3 zs4>4kAYY>C1|_Jv%}REv%LM?BE?;QBBtAaYeAXWT0GHy5jg7U}47X~-T$-L((R=@S zn1~gT%)t_%Wra0}y5YG@jzTkTA%K1fBWO_Yo^@s z#!HX+{q>)IzG3E!o1$Z*f+eTOFkhhQ4|!@`dxUp8biHjiysTfMu$fac5^l3{SlSeBCv072JvE`(w(Y%9n_ z2%r!Q2DspiQdL#Ww12`Zi7xE>j;IYY;NDJqH#GtP#PHgP5rd=T61jtpBZ8X~OSC7U zmM4-tZv6ST2Od~CZN{X!@|r+UKXUZ+jG6Z*CMBdM$9(w77oEDad;H1OC(c|L*t-h= zo;-DqF{QY$*{iRrF&A$2GMUPx4Ex&5?;9vgSzGchSk3W8+^!)jG_dV3UdxvOM zdF;s-mM^^z(YXE2`}_3jeD2)Y?K^kN2AzN$2)kHOHS^B<>*{JdcWV8|pMSf22>^KD z@bQGC`1t7Pg-f2u%g?Rz>#CQ=MEhJWcIJHP(W57NcI)ut&%fP$&(b$vTa}m)Zx|c^ zKnPb9Id%HHf%xWopZv4ykVoLvlSX~K?)w!_uI|yb?XF$>e%Z41gSVdj@~ac^jb&9Gu%Rs(Qp+g5<#|NX#RN#K|TCov~>;hybwbA zRAiGVL=?j8AEg_d0FkaN&N%`oloCn|!;r2L&UKI1vvb$3U$^{z)#%YF$%$My1PB7M zv;|RBg$rS7Lnwm-2!L5|fpactJEEwls*-~V`uzgYFu1I3d;09zBL|Nl;`(oYIDhWk zg1L8DX|u=_W*CMfZipy2R}^L#Tu~Gugr;eXDMZ?aWDO0$4a1;}3W08y>%_@ZE1!Gi z;U)7`m0CG3$e3an22&J3eDSsSn>A}XpidVijk#{}xbqh(HvaO* z=~Jh;5sZtDy=+jwwk0huT&!C6#W$x;o$A`9^MF3x_w7IU`4<~5mRIB#G>MIgJ$3B3 z%k3UDYFKV|rfwLFT6Kji#YGY}spU`svH&h2*nn8M9;5df57Q&veT%icj8(zZnl9V=a`{<4yqsRs&0 zp=ZvXK5^bLLH$)A+0rZLgqbKijP@-o7l#Qh!Rdx%L_?|1R5#>)EaJP;Jiv6WMa8%k7qOygvC-TA{~rGj??DW8w6U#S#11@& ze6OAV1|W+=g&&MiJ3N?B;`Uknv0MrRU}1uBDALMlWI+TFK$z*bv;{=-RhGE|Lq)ml zMR6l`QnR}57 z*ZzLw`n<$?b$X#qW@ZvkQ)Giiq<-mMjes;Utq_)#U7kY(v%WuuJ|{C!0Fk3~ErOXJ zVG;3=RW4#SPBM*Bxh0Nfd0>$Mu!w>s zj*_CL$4?zQa3muoHu{4P*0d}tzIO7s+WMN2BL<&5etz-7NBZ{fdHC>=n{K*&-hFd? z9(D1u$6A%NN{)}2dE4xw;({jmP2YI){SGB<$BrGnXwfpizkbZvQE$EZZf!-~+K6fF75ckQhgSC#R&8U#z_2?guK${GGeEf8_D!{C;EM zy*Fz?jmRKt)8b>ss76@%O{cB}Cr4&T;|B@dXS!u*NRdWcy|f`Hodswso`eX_0YKLR zHI+3fiE(}U^}2cb?TI*o<4f4bnycVRYrrspkWxTiwlPI@A>PNzh+Lm zrndUxkl{mi?fUor2UouP(i1L~X<9(iZNm^=pKH&7!vTMwd9x;NxBIt0|7qSdFFqmZ zy^lWMxpl{&LH!2}?zMOCf!MgX%*?dy+xF}~ba3CkJuM51M~@orQWXSP``Op!<>mR! zn!8=@f@V#UlH&aJT5OE_%(=4n-~Xttwr1q05v_^~^`PnvHug~WT z2DQ)EfBW~=ZNo0>->X*-MAS9@{)Zn0{I$nVo^z=lLagOZfLe4RsA=a)%cFhXq{R3G zhmLZ?Xj#rkzX8EeCs zh_swYtyYG1e)r?=KmD{hH$SJcrrzUmF+$IlSH1f7`xnY9hxYG#`LMp9uK$i2>WW96 zJvm|IgmJ@m9XRsd`)hRF7;KZ5A9yIc|Go!r zyK6>C>!KA;tiE`m?DAoQ2M_2a-9nYsbqkj+57cQdtbSwGtQiV*S6!@r>5UK1pFMTe zl~=YbY|0q>d+Wd7e7o7_Q>Wf|OaN(Fc#7 zdg|F%E351BaELoj+h!rBh}0A_M|K znMoH6207y{mb%TtbM)?J_vGxI7@D)C}jh;yXh70K=sV626ZbJxo^AxarG&uk|JihfYDI zq0mAI2t=l^eFu+fLA|hf6IE4(Y>kY-1xESY2vAqA$#5J>Lxq%_b%`7SbLPjbc%m@b z%$|fmlun3%76hc!O8v7sViCn`Rs%AZT-J^ujd&q#*%ZOd`~t9a1o<_yaFZ=QTMrQj zV$3s^ux-x4z7h^`DJN5coLf^fCr2x*s*W8ynU$3}=;|IRiLt9zzkTjp*@pG+A;G`5 zZVd(kLg#&Yc6s}iClJ9O3?{@!A3k`<<#uoR?KdPdjvPLA&A7449+nZ0Go`MRM~`gz{hw)5u3q)Ti+A5MedN%7we|JaUVC+Q zMR`VA+K2CcaUK zSFKod;?(()_C5dFu~!h9m6f_|;oa3W)%^yJm_2jau;D|xbnXAwpWC{1=|Iea`cPQV z=0D2)9cGt0A;M5cGL%=b6D6 z+q3Jyi!Z%BdEx|BRf2&)bWF58qCi0NctX0d+#s@ukU;cUzOfbs1u-#k06+;*t(R+> z?)JDlckHOu>V%Mk2ajC1SfMCNU0q#Nlo{sYRJ0{Cm2EmHqaLpZ01Si6NGqvB`5Y<9 zr_P*x^_4YGJhs$!<^fQ{5b`}7@tt=+A2V*`pnlynO?P`-D1>g9S}83@%hv`D^=*Pd@*qs=EIC>GIUHbgx&5kB^=_dHm~d zfAq+T7mC{yr>Dp6-2SgOCZ@Pm(ZYqxzT33b6XkpAnO8qs^MxZJ8sMHx~lkSY?$4wZyjx>zUx zoY?x7d>bGL6v7HuVT^sb{_Ce#t^WPbUl~IogzRP{F)p!Y32X!iFxD_O!iv$1#1m~4 zf7swhBS!<4=1|_vNk!I}vu?rAo6%8@!r}=eV*SV)jNsNSN08)D7ZJ7z(XtB2!*u3Y z^+y|8Y@8g;p;0?@Yhn)5QOm>>o)Bg02?P{o4+?3FAV^UVf*_X_qTpbn&s-idpw0}@ zG+8hT$(4mbp$p_F>wtPT#9=iPCZ>NyRw0l*=A5Kf26LIA8KKuW%;1(-X0Ah3RVg9D5m;qe)6jmY z)2WLn9oS|dxD5V40B)GhC3C!{2uG}U2;%s@qOgzzN$h(XI~o|a?6=@0q1oWpMt_Gs zU;)dnAK(nFY}DRItWZ}o9xxp>_5@ z%}tJPMi?#Z_CQFu;4Zi8-`%@kfBU16qc4Aa>Fg6{&inoT^Jh;dC&u18`}SU4I!?af zrf)WUd(*UQ`*rKS_rU&B$4>?PwTF+MqAsObv%Dn_%%PNwpEPCjFPjVVo0e6SzyHo= zLMb8~IefIDs_K(9Yj2!#ZB}Zk*W-Kc`R4~-HsHJOe){T*PkZ$2+`fJLi4(7vUC}60 zTeoV{w|^g%c^2F=^RutM+4S4CeSdArYm%0oo&L-VZ_JxDg@9};LFB)3U5HR!TgPIy zqj((1`412g0171BzzZ@hi~ym8SuwB(R;maBAVrXsrlie?02jjRajjUfWXZyZZ@g*d z%-e6Cd&kZD4xV7Hn5Y<^tg}W5GYsCbL;D{#|DhX(VHhPPMRR9O8!+_pZ+{qB+`6U5 zYqmi#I9C<+?)#rytgKyp-(3bb9$fy!9k)&2f8h9!o3?m>Y}>YH(4bzAJo?no;e!VC z?{mkj`u;Jm>8Yn)`Q+2}#U({Ayz*XhQu>M&_ot=CDJngC{`@n~ zy}JM4K`jvQMaQ)(Y4z&M?|u5!w|)C{UibOe7s@K9Pnq=6%Wwa*<&Uha)MuZ29f{JX zXP1SGAN=^^FGh?Q^!GnIxehM3+X+HMK`Gs{@8GJ{uZ_R*^2>(|_~7GpD8!vJr`V1uA4NWXD@E(n!#P*&`G5jXCqF+Ub0{kvgF%Xk@zyR9n8W$0)+q(CO>#0bZEV0+n$SMW$9_@Rn>KK?p_jP*d#ms@s%%SWTw^E`32}_PG6`C z1j;T{-nZb9qT+(oJ1klJ z^u<6RH#2GV^Ka*6Wxn|0``LNfZ@sqS^*26Tzy9m*zxi<2zN1e)_gYD-;*9k4U{Le= zJS(1fJ}Nrqg;mR*f8os!KK?AXN%m)-Z@BrU8?V3is;KDbPd-}Lqi5%>+qV9*>%j8G zb5fHN%rG63EfY#Znf?tqltWy#fNob_`tNA%khJ4G>EJy8fJkIRT>=ECAgCymQu^&T zKa^F}eX{1Q?BwX$n!4us+0U+ABoIDZ_mvUU_8&SLsIDj~Y@U&sT3u7akpu(5g9i@A zCnmHhF08Do{rQ(IEt)lLSyWJ4S4W9bezE%C!9$6O2}Q*%w*2;2O>OOEgZp!Cq$Veg z9ep_$qRy`cgTaLO7|umaZP4vj6h$eos?`JjGiT10v~8p5`u=}+=VWImB_|3YYy*!p z(A3w}Kl<29FRothQxpRX1fa4{2pX6_@n|sRom<#!6PmmouQTaqvqU)TIh)*-x6?XGqw||2~8;MI&Mb&jP@n zy@zMdTUP7WURnK6QS&C;;7Ewz+@-2-fA~peMrO}$U7vd9rS|RH4CvQW*K|Up8ioWM zzA95%4ljIV{x&5w`IoF)|J{#2)z=3u8#ItIV#z{4&5UL<8V-f2*MwNBuxigbr%P<> zOIV6^Xb=*njd@AYib60mbR*O*r`{KN5b2eqfMzTq;_zVuS3kGx`Db7I?9=u0X5D)H zSoik8~yzI2%;^v2s zpBBja_wJdN5}%adYh7H}tXUI}OUcR2({zJ#S&9UN;9Q{B?HWC7AY%_-clB+Xe%f-y z=;7nXjRb%{f8Y52r(gH&+dVPfCre9{29Yr#bcJKJ(L-hcUh1$MqqbURE=n1I^3}IL zZQZ(~YuC<$2KFesPrj;6UUDpK2*}SWZ;0l>%REr z>kS*Sv$C$4I3X(9^V#}u&z-uke8m%!uO8o~P0RHge*EmqZ&Q+!CXTG)O@MJ43eu@kSn{Z2w${HbGST`ms*5K2G&V*Soty9=8(9XDn) z0a8_2d$F>ny0-S0&A)O~-gxKZA%pv$JbmV)Pd+mYk)4?`e%#pjxR`)HxN7xF$B&=x z-Lvb}<42!5bM~#bKe%?{gzVgO!$1IFj1fxS`Ec!@e{Cyj(ft48?7ai5Cbq}%b7qp< zvb|H5UE0FZd+$v_0Ra^d3rewIK}AszQS5>!iiKit*cE(YK~b?Gq9RSDcb27Xy)BtJ zzdt6)&D~wz`+R@#J@($*WHOm^=JYb*l96k__%@*Vue*MBpB`PNO_{KD$G`7?xJJZe zySA;yj~})2^;HKC9slmTUl>^9E*^FK(7}fJ_3P*696f&G?;ZaR8PZQk@$##y4j(zu zt4H_qhxK*CCLCjv3$3~Z@c**M>Hwepw{|QgfFd9Oy2b%u$iTimyLa1vyTa$wikdaHEaCJ>Aw-Zu05VRfqAZnGqH8(;n5GGu22!RZ zrxIdOvu4qV2nPHrx`b)E8MPvjNP~Lym5LMy1}sa4!eO7`+x*)fYd&8$<;u(3v~FHi z9o01M_Zy}qqA^p~HAGOApGXoSaMjLON)>maJ^-k>Apjwe&!?NFB`hg~Y|)~{rI(J^ zG)+n&i5POmFlGu}L!~%#jhm*>G=B8>i8tO^bMy6A2mP87Htg}vp+DPE&#t~y+qB?? zKTB}4cufc%go$f*nhWc?aHSSvA8KNl4=pg z86snLPd5a|lP0N5{WeDgt*RZW(wH=Z(xGc|J(7HN`nj)WjB2|@soY9XhTXdyuo z2$I4v01|;TiA)B>RN-jObzlgLP-9F(4v1U=lR$(75*YzVWrdUE7P&!2QUZay5WpCL zQ?NO1ia|RG(?x*zIoFy*Xh&c;tFD5Bq|?zA!J##%j1!C@AuwbjQWdT&s~&V-bBMby z;ywcjC<(z^dEXH+>af3&Q?A9a0>ne~|9>3kVsnWj5&%d-6|{wMsa*x6xF*E}(-VtN zI&mkGW96~~Uxg)ggC9M9V#5y``}gf`S+wP^?Y(+*u9uhN^qeA9V>`iRW*g^h$Al$h zG#cZa8M-ExSe*}vUi5PhY8$RdNvCe?v(xR=DXD-6mL*6^;6NNWvNNYoum54= zn9;)-Alk`LASH3mROd3w5NGbnn>C&~-^t zSQZf>W1MpdAOJY9^74w^|L(RdO9&B*SqlAC8XXY`DS&`URP8>ZmEmy2M20E>7J(57 zOZ8YFNm7`mb^26EIBIITQCf0R2nzr#(~>}(kN|a!BchZ-2x%ML7;2m+ETJ7l<@~9= zya^k^Yc@jf4s|bMwsFrk0M@?SwKCU%B#D7T@g_WOGK?pL?)0hCRaK$3?b-rBqXu~h zaPZ)P!bXM78#f7ss`K-6j~*>Oe(c18hZZ$#RF89(m6uH*EDMTSw($9k{Ra*d7B-Nk zsHm*U$<0Q_Ov~!nuJx{6|3qUkDOpw2{Pz1F+qP?U{)oZhP$(-Sr&G610Fa!VZ0H8( z$hd}x(P$(Z4rMmX1AvOMs_cxk!p3<3Fk;w%C!TuNlBDyvIY2quP@a=(*Ln6FhfVX4 zIZN(@!7^}&gzG$vFP`EzWLl;m0<>bn(tU;`Xjk0y<&{rAx%An)X3c3<*d(_>esyJe zBoswJDWzpuhEF#%JsODsfnjK8%Fg!f-DT3n7d^M^rAsGFN=ZsGG{sgB0M4E~U0!V= z;}sQUhYlYLM`EwP_9kljr>oz{OiKZTLr0E;LZQP4kDNSp{I;1huD|xGt0v#{{f3P# zS~mS;%@>zkGWzl>FPU)Zl+!2ABn1M(5&^%yef#mZ-+TY!i$~vj(~Z$^+j6T&ieV+zutZ4{kPwLt!Y8Sk3PKd;f2pGfBNB-FTTBK@%@8(w|n8`RqMX`;i@Yq zW~T)neQep|PpzDA$>=Rxc5d4EAHTuZto=G*7&l*k&BBGxKfCdUze1U)VxLaeFu*{zHr%r z14r+^`^N0dtQ&8be(|{TdvtAQ3ZdzGbyZbza?+eTXY}aWuDD(A?K^f`7Cg7?wK@0B znsDg_-MgRPrd7+a6E1!J`4xM1ANl9segE#*T3Ky<@WJZ7y?YfFQti>mC6Bdb2&O1Fg7V-it>Dn%lA}*+C<3_p9JoRWS8h-k@S5BWfTUJ&vcu>ETOeYx4W zvv0qlQ@fT69$j+mcxma`GvVs0zWw@a{Pnj}rKOuTZ@qWU%>9Rsta$DHiI33P;T2M^2xqsMI-X2GcbyF2^7oJ8|^UC9i$@!RqpG<%0Wf6GCvE{qggUv+h|~ zRem-lE&cv`W{w{_{Fk3MPn|aFyY(BcntavJ{+*rBLVNL@sNpz+`M(|Ul~?kVDi`4q zRL*rMaC3=AcpIja<35Q-~Dwb#+} z9bDVYxfjwEW5HXb!(CCO`lz;@Xqncr<0TzCw|Tl_$BQq$YWXYg_vzK~`Da)ByJvPv z(6|2k?VUTdH=~iLw1}X*ykgd!3npHE@gocFzGTw%m6g?+rUBx*AAcTxe*Z07x9$FW zM^W=;6pg+9_B&(7UXYuSv1#)k-8!{<`@PSedtv3R*IyY6SO4(Mw_W=WwSfyz+_L#I z&%W`?Z`)clZM6Q&ACdIG|Jk=_(ZUbc{-;m(j<3J|UNjtIgrTbNUt4zd>elu76|b-T z`p4~Czx#f}hKe(%6c7~$kW!YMDlM<927vOivS>pq95H=9U%Pf~R=oOVx1Q}|vFNVd z`-&Pj+_7b6IA+F#Fr%TW>atKMEQzWr%cHRfIl9u(l4A=Wd#ZPz-a`ft+3@WTUAuP) zSu}Iz-2(>nYuB#LnUhsrdgf>hNs^O)Tw988HqJR!ARD6g#ptcG;uYfKY)Qq{I{re8 zM58NTeE0p2zGOjt=l&DzJGI}uY0KLmeYN22E=*Y1RKmDASoBikJEyoU>oPYoAmawX;%1cU4A>udR{B+;_i+c9yvS;_6#}_{P z$OE&VdV1yWzi+)@bpOqNY`b{OC|&2OWAC9uM{d3S?y5+vNt66_U;WU%M^^xNcKOTe z*MHZ&XVp))S>C+qG-`+Up-4JzBQl zz7(BhSd$MM#YeXYf2CVOq`ON&It1yG?(Q6jbV+xJbW3-L(lF`n7~MU#z0doNedM~f z=eh6uobx*?={*2Md&BPe3i(-FjxgC8G1S;iuAZu@+ zI$85LXcRc+B$I67Ai+SDjK2n6zR*2OEHs3xaM5x0GEK~!PGpgy46U$#q~<8- zL`8m5#MOj4fe8cO7;B~hsLhb_)j-vQ;* zgVHLCC)QycC!%~taPYIfPUIDH9}7{R(ul5?)vtsOsmE+ zxp%ZM>RY92^2>%HKaT9?;hF@6fig7t);A5tF|(4nLjikCp9ksO$3Ns3`>F5$_|Qje z!rt#G?``<F9Q9jIJa7SXYZ}|+LHx5vXdHfVe+WxgCTso1~uDnkZ=t{ zjjv684GOri-xwJft<_b(bB9|Qy!TtpGPa$3k>DvRrYz0CXqBch70~iKe)xMPuMh8+ zI38(rSDW9xN`F6yDbJIGjBsnK-A9>~YTZUKLa&I6QqapC!66~jaaloH&xl#y6xJ2b zBlfTxx=#eV4Cjg~uMQMmV3(`3dnMISj8W0f%y6u{#*EHA&tH^c5>sMD`DaJ?C*+ku zl9IYbt=~Wr&K!lPh{G9v>Q-!S6uF^={1?WO!FXyhWYEP{nTZKP_HblIxgeDM)jRAl3po##Cs^6XdSM_>QYI}q|V-ifKXsNKi z{PcGYtB;F4#bNo_rK^lQRHnOA8I>A`iup6OAdUzxHwWO~Ss^V5W|y(g-p|Xgj62h* z)B5q)p0$JsDG2#Y`Xc$8%5}weO~xA-i0+NV%)iS&mpg2_?4RzR(AGofK%hzeiTp2@ zf07@*{;84w!X{5l>@Uosbm1mi7woBWA{g!yDRKX?dO#3bl%!l>#Q<(ZNqiffE$E=B zw|Ft9yKykz@>rK6WCOLbDMeQYW&!GGt743zDO*i$J7nkwz;!W+ut1)yHo*5X*2`;a znPmW120g<7w_2WPT7I^O<#1sh@&w^M5P>P;M;rX$7KTXx6#DTs^11VRKqm@1t;TfF zM^#iSgbnYGD61j}PVTRi>mn+v_y?qA2le{SA*16@w+j=UcT|q^T@|mRIluYjJSp@_#7-+4aOZt{p)sEaOqtm)0+D4Oq2mNr1o;vzx|Lr zEACfQ+-F)LcH%rypPq-JsoYSyk+xFd@T*Q{b1qRGQk-Fs42X_5)eXB4HO&}%O<*xE zML)>~T1b8N0;Hj1;`aQoCE~Mz3$oxm0K0ViOXfLkJgR?GTb~5q0qI%@TI7xWYB9Y% zJCjI>of+Jg@#%h&TL1ADyz*>Q-eEuf_s!Go+10HOWsE`71tnF;M^o-sAho=je=m7w z@agxe*a`x-m-g;gdu;)oLf6ROO-HALn1|uV_p|Fg>tfpu%r7l2#vDcbve*0XZq>7-DvlPY@XhhR4zFN16{}UsGipqhRN%dZH#}F1MZMbJ zWr8Uqj@@zf%j^LWE%>JYXRN8}*zl>)LD3$N!iAc4rnBc4WG6E^76>wyF~8=o?%nD% zoo=8s@tk@T4ePYtc$zv&g5A*)6Mu{cdXfEtWA`8PRs@mI0trwb8K3IqhW__feXTCA zXOW(Ra#-}mr!+q7zT+|JdmXVQ4IHxFlJpj`SZvVO;>z;a@}n@GnT9rIjFBT(ugDgT z9DbMQhoX`(ogR^(QLFQ=)(-u~K_N(HdUkf#Zg>U|#u*y8-?-iDaDi^LUM$(rn!=YB zG@~A`T?|{UZvWyH1m8Ul-JgryEEd_YsAg*z>p$+V(3%JbULfEw;45{Tk~mRSUafaO zvGA88*7F1G0^UmF8>raG98UQE#^oH64AqW6;@$x7Vlq8O~%Vm|}=m}Y0b#B#*(@Z9w9~x+&e)>l9 zd~4}19lv5vD=6lH&PO*bywM8~k{%OZ9B#C>d5zI@ixN^VcB?~b7gk*Z;3w7ow@0@J z>-sz2^Ygz(^%wU=ZJ{9_eIOqarTo4i*Y_u~-}xEtnO(8w<4>Mjfk9c^C<-#9cQ|OUh}IzHh>o`+qz7R`WTAr^1W;< zDPakVAWZ5kos{mgT`Uac<+OoXT3IquV#oxa{D9X!q!K zeh4Agsw2xur-=Kj5-zADR?A^7(jSkTbc`O0m)BA81{F0F9VbCs?a@aBN(qMV`KG4lc9iPDxXgMozBWVnqnw*Yx!k%uBXDbCj`z~^s zvX+n;tK^kk1uGgB;qW7D6VNW@8MbKFI+!uEzD1GuY|2+j8M(d+4M3pm!Iz(~kN+j@*r?^5t^R-?5D^^j?WuIz{~oKW_J1rXo6!sc z{p;}>n<-OgsE=uAi0?&s!BkUp*}+u+BGqS2RDvq{bP3G(nTGiNXCO-XSsQJ$);K^F zGYsp-eySmSn)%4UC()08GQ#mqo*~AxGTB^;n@Dx0ZICJSyXC=C#f*(4@+#%-)S%U6#vXuip00qKtlSzm5YG-X zb%wmWnp{+p06Oc8xW0=wH#N7z8SW#7Tnd=E)e70AbOB#n+L-R`TAn=|*Tr(S?*i}4 zp#op$;{@>0+*qgQcsL+0tzKN$y|z&kf1LIBoeI#mf}EFPrI1hZpJu*}=$g!T29(*( zTITW(ww^EE4pz=>xwgr4pSW3YIj%Q-()PMpOGI9;q~~GQ@2gUp2ws}AQTTg58Z!U# z7ddo_HOv)ix=(jn5kmety;97m1&TV2VRyQbl|GIuerq?ZXiwf^o(~6x=RxiViz7gx z`2F$9ZJLl2Z}H{uPvx`D>@*NCG#V)b-2?XXT3O5C01(N(pgH&(7nP z{cZ-L6yp3H1yN@R9x0Eb!9*1MroO&Ti#`r|2$e9}%F=kBAWmU`;qR0a1r99aHazL^h+b)5m}1kontDjBY{t z!{+4sza@bXGap`3I+gDv3V0eI9I@XMYmW!tJyeYBSMH8O<^<2U>mFwW6We+1a_z*9 z&+T4g_t8habQMsjTPMbFCSS&Y|`tmg}zht6N5jQT!5>hk^ZcMCYowR{<5*LP9^Jw=i-ex6gC_Q`Fcc6g*IR;oI_EjE`JJT! z%2kBf!Fwe$eWQhF1%*A)@9(?{K#ZZa6{!F4L0@ISaDTrMMH$wTSDN9YDXGH_%}<{5 zqi(`OPAp#G(sRbv2~^X2=@ZpXp>&`jwVZ#G-TPZ5_;D2s_nI*^V&3^8T7DP*h{pK2 z+BTo#d*R;O!gsP^y27__}z2$T*WA7znTZb z<9(_s2f`m8KSU5HsH$yK^&>gV~&`^A1#LB#r-Xj zHps_!Y@O?HpaJ9Qh>d+L@O&V#+I2TMc1X}}ewKj_hhkvHMjhGd;ggu3_u^E77$;}N z=WManW#gMNm(zUHcb@7>{F47olMs$t(_R@(cVdS9 z-CZ5+j|NSS-dmY?(2e_-SvrmTs^l|hGC$qS=oy{}-mtK+P{ae3(iCFO>*-E0Lt{K>@Q_Mu`y)o;H&0}Q*aGw!@=IbTfjsEyGj zi{SCU@jDN`+WUZKs(16S3OnnzIJ~YC*`3j58Y zh{M8{s8`A9+KB#48u0GXnnjKFamc*2udxeU6WS2svNzGu@$1^P{26f@{OonTtlmq; zXKe|+a|-M!cJy(pJt7?(l1jcoRX0!m1;Q1nRhv<6U-`pj=6}F2&#a@hY0X>90^&0vx{Jz{N2>{5Peplnec$hs+SBK&1?0LMW^R$Ni z*N^x!F}%g2m9|!1nQkVZv`zG>otL_npr*m#&5NWW>v**SPA0ZWem(S8bVKnyuF@Ml zx+Z)U^Tvei{x|EE1zZvmx9fgBCrh1N0!(&8E#P(7K_lj^N2yAd?|O9TT8DS=R#ryO zgE?HP^S;@B>ZWy~SN=Es0Q7LHaNC4@#Kj*a6Nc8<`9RKULD{aM~}%e&Rib601z7V`K!QNQhTV;C-$*ZES( zb*xK}|Hxm`{e>|Rk0Z~YU!NkZtM%@V09Oa_fI0cE|Ga@m0` zKX@l^POCPPyWR)6x~j70r>v?dY2fa79tt#Wezn!UanycG()cW??|tXl=Q0a{#OhD6 z)%Ng<9EfSV7uDB?rcNh3$A45(%fk(S6J`79M8!`o(fKq(9PVDwvj(AEJ|C}WRA3OB zTWHlSi##)JbKGmBwl?x!zlaUEJ(+3I_K1{y3DTQpud6=;?=^PYA?L!3t}~zl+b0P<1wBO8gw@Y`N>5=UHP`t{CBx6 zzmebF$<4?PA+_k!((*Y10WH`rV$Q0tll-8psLDF*VyXX|JMLpVC3i&m<>0CRsu=9a zRrq<|kQUHo{(8-DPN+=y`EI2g-F}WVSGB+h_xsuuW2-+9At9i8)WN)CFF`ai7_MsK zYj5IizqwRWH_^5=ImQydg)V{h;$eHhhOM#^a9|YI^Vg#Et*+SMlZk)%{WnA6;SU~d z&og7?6QOJz(d-K|kJb-0z;!dziMJ-q)x0PfPXpTK7WT@&uIcqVZIm#DnFpT@_^aBu z;HME?(S~`B*x+ZknRJeoC&Gi77B6MgtW;uI)vc@>jAt9RcaVHZLoT5O+KW>$SAH=* z4pvqTa^6I05d$FjS*^cQJ$|zmaEH7ZJBP#W9St%QL$C;`V17IM+v##nD=nM&9Q2>h zzqL56;Ie*=F!4V+xu*=CsLEJt*IHrhRaaPUyKJo-Jwky8USND$JF4t+ zz6QS427E2lG_l!r-A~WcR&3*$UVn?Dg9q9!2OSJr?VR*=43tKJ4oj)Wo9m8JiKZ{k zbeoBT=KYK{>N}i|1nxs|G;VvZ{|lmW_h>9Ixq9GZGg~T64hfHXhO!wB^Tve@DxDS1!gv(IN*;Jk26orE=E_dzcPqvt~l2xyAVW&ezvU z%9JSiITste0)(yCMPQ|OHL)yl)T|>$uE-Q%uPE@J`_t59DG=Uhl_tj#t2zA@^zVmi zEE=Utut*R(4Eo-R3Q zdD*G?_@G1yVVAAnObcs)(7zV)lUDal^=^s?Sxd?S0P(#+78Klnp`wq zW;4vUXp#jDqj{1Z`&;tqI+1LE4w#&tWS6a@tqq8yUfcq53cv>?O?Pi+5~xwOwY5(6 zOY_?!U0VI7T|{L1-Qj}MK7m$BSa5w7$|8?Hbp8FMlQmi?XDpi^Shoiw3-krbg4Gs< zo$CrLd#^%QaciO8Nx%y`c0$Roav3U<$F3D^xC)}Iz}0EdX@B&N|dBc5Jh2V zAzG%lltl8MB>ay(AYNL)bc4C%CWP-PPyE?1L7DEq&;N4yPwyKTL-$^hzFBcDd*}Lg zfa-%Z&hT0S#^?nxR>9LkOGuIycp|~@ z#v6i`kV*XPLr?{(G|*C}+{sqxaBW~tZPms2#V zgMT@Fz$a2s?zx+nFQ`Uz_{FA264E@ouO(W|ZE3M6_rfm|eb$ZMsW@B~kwRq0v{0A- zi%sY9H=hKCqfbA99+#KVAH7f4?|0ODTO3xb_hQd!#NBV^bIQP%e;2OzIUJ{pF0Q$H z@xmukQ;Pv(>T1(tU2u0Nm+9U9$PDleZ{<-vmQ@^SaYCl1={m1m-nURAbqY9;@WfMy z1WZ;3|gHoSL%8d zaV@QEjC}^GM;459^z>X;#yc@)Ry-XMv&pZM6g-c#cM9}7uEGRNUkN%rKVL0S3b6ZH z?QJ*BTF$)6{o&NPg+r&+pjRZKGQXHM4j)R;jn8SE6Tu*)R9Y89ZX^n;y+xxFY3?ef z3hD=ZN8_}?PZh>F-eH(GxZ#!i8$kiy{=BI1lw!;jG1fL#oPnPG01RlR!UA@Z+jTSh zs&_-m<;;;mNlg*(rM#YURoQt?vx0~}AN*9bvor4S20x|=Sun5q&v+4B;mrqKJ8hV( zapmySByIR0a|NkaWG4=&g*II89NP=33eC;q2#!{E9+?R9BtK>6<@>{L*eG9<(1?8E zEqB=p@iy z=&FRRf)wbV2;l?4Kp7r=1U?P-eZCm2-}B*-h5*R5mT2m6Afo4X%7)Jdf=BUDaYT{L zS_1y8)FA8ZtP{I!o%@5IgTC({!C~F zm6$@nOa;|@0?n&P!qH&&xj~RO?)^?sLR#L3Fr;|zRa!a*2J8h*yXUH$#m55RI!U`G zeBAT(Ngqa-XE60c%fwqL(WJY!+iWt=#{>p=6krKGnMGIugp_mjGJ+sm{HXFatLv{3 z1UBnD$X`Qe(OC>k67e3Eadx6bgD#y`PahH`9!KOIs^0HST^$9S=cFY&228Ts*@^PT z(-(1l$<(|#UI^HYLaFP8BWi)igX`u&F^)yHAR8Hf;n0yc2kh2)qrkGVCzHq`p5|(rxmZR zi|0_KdUO2K%p)YnMhA?CM$l6&TkbA_`Kq4xD!JpEt6TW{Q3&I=n2Zd`f~hifNLpQu zpZ{SM(Ba6zB!?AJ*8>w^;}a1ONIUeGdy8*N{Bw4epD31sLig~_%4TdJ&D&H%b%6+vNMk`hAN~%7tCbP~zw}eUNC2-9ibhCkX54pQ(Lz zkbPZuW4%|{thM~O8da@wag8+}U)9MX0d(ITNDJZ#(?L*j&CH;5n2UP(i z|Lkau7?R_i{oQa-Bj5~ywePt+ciwL%_Bv0=o$h5mXn68x12sp(niOSM3XgKe0Z$*`6B<{W)WIg*!q^$Se3QdWY5A*(-_6u{sR@+MXTp@2Y&vNE5^$ULSLZvA$nwl2Ni zr)n}{#Ip@1dYm_~H`@JtQsrue=%xS7Rl_?XQP)U=UX(jDZ*JwIUdTExED~!TYC79F zp}OKSwKy3*j~W)#243dz{KPta2+*x_rf%e&@jjKhI8E%e!fNK~c|iQei~LbMdUZ72 zXeIlSZ(=Cl=n2{a1_MF5_It^P0ri{^vwyV0o|_jgy~w#*ZQy!7xB+jlx;Y>U3h=)L4KWbJ-ks@`Rz*4Qv|;1{47tyf<*Le7m_5s`7Ty9*n>Lf>=99-GcBi!`Z`3*0T&m~0VJ!w&=Xc&(?^)9 zkDRIuXij^MP(mCz1DT)542A>CS4kLI{3eD~+ zeI!MKN|Sk3n+{tYm`&%)Hy0erCNfkVA#BKC)`($F$l4^cY7#xOm8vy;O?$UL5 zCr>H``!jH@sg*3<9!b46*1%2|flWnE9B)}#7TgL+Ke?yE?f}Vm)Ay{5r?H{~%{MTt2e6v2r0!b&7GBR-A_T9m3 z=PNbwdf5EY4L%oh-K@77WLD3vzpV>W7e{DVtGUjfwA%%P&79Bj3(rprf}a6j?@CMi z62B_wWTPx+(vOiuO-WHS`1xU};Yy$&$ZujVW7X|ARjS3Y(|**6MUCowE$ASx)wnZY z!FiI7xHe9YH#0Rg`;{d~(zH-MgVSfC!*6zY>*tWsBP9Pr|88+i<xv$7$T=X@4;l0=uj>Dgt;-xzhXqUeO3*jhR2{Cf+% z_a?fpm{EWDBUWG7?*b);0HIG>jQs_QlW)?C!v8?7vV%^L=#_chkxbm;1A@<%>m}+S z*{>MmZ?K3KfngDvsRIVXm7xjQo0$j!K9J*txRT>;sWVA z>!lt@`-8wF097r&;^lAXb@y#Q__ub_0Mn3#_Kz_x+J!EC3(P0V^V+4h$Hbf6O@O)b zCQ8r+(dbfl#%c#lJc#vLud(s*n{)6}bGcm#aGWhkRg&{Xra=Dh)F_R=l24#mua|-M zwjjHo8tWLgF3PtC{BKWw3&&=azDlN7YGA~XeYS?*7l0e-53bcIq-xvR^baccTHKnM5ls=g$t;=aAldUN*Lgb3Dh5mS(5UdB8V?yt%GhKt6bw=uDOq4JZ&0uGBJT%pvwZL z;~Xg_ghrxB+~{QGT&(^RK}7|nu^WHj>}w99f7%d~XT`{tcyYivuJ<$S7cfPzrH}s4M}w zwp2S#t~Hu(T_j2&+7UUX&K+CX`aa^mk9!&8c^=oWg23R@8!;eguv|efP!&i~qlnW5 zpU3i96|C_|bRJm*{M0I-$(#Kv1Ge@~RPi!(`$Pm%P^^iKH6SJR!-5SvffcHJVpJZEYV&V+s+=Lt-Dime5;!`*$MwAK!;n{Jkxh@MX z3W~Tbj#J_i9Ky$Ulsa9&24Gs_vetm{ve|YiaHUR{y%mBPXl{Y1!fe--9k z)?lFq|KCDz(U0NNb9)wPWo2~@oe%{pfEBl&>@uKx#dxeKU;CAZjLIu(?2P2GMAu(& z*WLH0i&4RvNX-Q$Epm5xAZi}9>h(HpX>}alaw>BGY9g*l#qV~3AOt6w;AVJ9BB!63+(`8F{sdmEA^+v! zGFzQwqwUCb+Fn}gs&LJxFm~2m4`o`@hd0x zyAGx>Xalcs-T>hf4ZO@NmWkf`$%tEz9D%d9ayO058`|31xl)d{?wZM!<4oVExa&>b z+^TMFKC|x4rLYJ%&JO>3OlBhF0H03$#7b;(H2K#P#Pb2bUa!TxR;J{)wbeK84cH*xp*{iChSrao-KM%1R<3@zq4O@ z?hl6)KODw#^)#Dvo2}LdoCP&Chyre7ay(iwxAzMI45Gnzo^P2$Wwo`lAhhKf8E|Mq z9&HWcIYSlfyx#U2yZE(O&=Dg8T5{(LU@+fK{c)U@_L_-B3DlRI%=a;BE{O~!kAv-e z@z-fq<6JIItzE=mD2SZs$E*4CUPRN)U+t}!83<>RQv+O%N*|dd(}x=n3js5q$S}|iV-hvV{b{h)_v#Ho}6&i zTQ0o~ggZ<|gmPul9WV>~a=NRygLQYL>>ZbN&kn)>{kMq zAQ@f>iS{d%rTJ5_F}8OoUyjqIIz8=EQj;6}C$f9co=p8m%D*&#_o~w7T zm!UlI9-q%%PKwZFmcEYvnC6v#Oo0k`bf`qVfAiP43jb*zB(uRUn#yz_)AibWlT_PGET=cdk0u9kxMb*N$7=nomM#l3C&9yEcgT<>9O`gS?HSJ+ISASP?f3AD}o z*R(yz)5OA!jgGc9`NT=pE2%uO`+gL7M_DntN8>cX2QJ&xGGbD)hTxz8rCRXSQpTPQ z#M^FznS=+6;ArND#c}7pc$53y%!0Ac?UV)Z0vpy!(oisHIOtE`2t>}ToCp7_Rn4gY ze$w`zAsqLsb?U7=7M$7F|F*Y_2KUU4R%>cDXxnbnkJEb|j#gnb8?6DRWp_>yFAma@ z@|O!uBtT>$fd{(B!Tu*Bum59->$w{|TtTb{LxK{KFvwYiYBpUTaNXJX1wD6m5{n}f zTP{16Ps|u^drTOj^|$;JC8LRpJ}9sVY$nFnG^a~70d@InWh(8$5^n(Dmzl>ocsoW} zK9SsG{dGziXRyCrC0AxjPJUiqiQTf*e;=g~v$2q#i@~k{=WM^RSwBMd1i1kK3Foxl zM$Z5cx$C4jjZHo;K0oEujwz{Q*jN-+$t)pfV+dMWX)RXIoU-dxC9sKxFk=R$P;Nzh z=}S{%}Zt`5#x0?R5co-F4tp-%rG1DEEG0{#2bSNPofitx;Yw@jrq$ zn%aN)r3XP)+=^Uv)j(Lb*-?fbspghO5R<72Fu2#{${k8vG%Sla*L6oX803|z4YWqG}2clDD`T1 zhO5Okc!jTe$7*=w*P}zKxLFcdLM_Gj8KMskWr5j{nFzgS{zS`I)8&!tB})!$84hF~CM4 zQ^1UJ^APc8)_}U_9c$Zjz0U&*Pvd|W>G&D5|t==d!5V?nDKJOX@28yNI=n^008ww-f+M?1Sy zMj!=1(TzNA_k7kxz>imdU*61mp(i)*>>Afm(hLk+1)+a>hI?U`p~SjydK0c0ik$Txh~RV zrR6m6%Ry2Q=4a+L}AculffEa-CX>5F}XG|m?qVb8**8%u5N8-#qi_~pTKvIPrt zGN9NgG95_L!^gZf>in$^_a_XUJ3adUnFT2;CjxRnYb=c+ccDwG-uMkH$f5UnKkr@& zW@fxGSG6GdaFNWa#Zm`9iZvC4w;#=w9NMwI*DD|OBj#RFa~jyCYOfR^Z7Idxx?@DG zkNx}Sa=iJ!zcsHfQ+0jDm+{AczWXn!^uxV#UiPjH5NUIn`(+5BIsLumTGisDoInkC zIKKO0eRL#XnwFu9PcHedVE3NoQKYhT!S$l=*Xz128O?m*pd#ZH!MV8~149X>0r1x# z?m|-*Q(}Yk+xs&#buK?avJ1fR_w}&uoC9T9;WG(kb(YI#ED$7Idss36&v+ssbtu|3t9Rm9gjexrqfh=wF74CC9%T{h;}= zXiA#S^~rMy@RltlUyIXQt)OKhMiee^jQI^JiX<>o8bedQ$tt zJB{>&Dy{<8+r9s0wThi%f0Q4B;S z;rV$XUfTso(i5yB`%(%5ue|upc?XNFtV&D9^ZiawvKA^S*{Up1dcjY-(K9USpKVl> zcdcwT#9$=%KQu?ZYYfGkFJ$gj7>R);jc}|;ntM1&nYHpm(${ByK*c#-X{_qLl13Na ztHdFGOTvfNzli}Q0D)#+y`v_yx9ACI+m4!$wqGV86ILxE2ccSou)kniu-~a=v?y_#n-gTKPdVTWWeFdTS8XA@y;Paa8v?-(D5_@cjMWG{!HFib(!<(e7R2x!JR;qBL z;hR`r>qH5$(=W9$=C$Sr>7@^kD`a^b6RamqPxJZTjcd>yZV#=A=4< z{wH5Tw8hp0`~Uaobw21IR)MeC9wn_UF>S6-fQffK;292)!U1IqIY|0yn1U446wlVG z9N??tO|z+P79TBbO7<;V&ZX+_kIw^v5T=0DsFk9kqMx6BhOs{p!-1q}FQPj(heSb9 zm6BAg&GMC!CR`=-Wmba1BLRgtw~HG07mz~j?;7&T1-q3}+k-ym^WY{yl6RD%zMBJt zL$Yx{jf_ZVQjOfBscv(Z9rEV01p{kl;bpmebv#2w?~+JjU;P z5i~1|^)K&ZQ=#4Ra1vC&XyYq}CHy5=odjVZzFR0UAZL!;9V2_UixMy%7F)JFIz1R^{v3wssX&d}Fs< zol|EwQ~Gyb$|qN-4V**r2)cOqDkf=k?H8GF>e6%fjzLLTwf(lVN^@p9+LD{q7k)E> z5q|}YEWTqC3nV1`4eV9relu1OjwkaqAMMwB5}jT_J9E$tzjF)LLem0C3=9HJ8a|~Z zB2F3);4*B@Pdvl#teBOQe>WWF(|bKt*0;N=-^%t;-1;V}lq0+L@nkHCG}ose<3p6~ z^CBLEa#2^w58;QFAwdeTkxSQB_V^9IGAe^gjwmY=6B*G}Pk;-XR1gW#S(kx zXm*KJ*O=&H>0$F9SM&Jf3npFjrmdg$X^WwDQ33=NZYF5XqwW9EE3K=By6vF16=H!> zHK_3v$rE>l!kZ6Ufz#YH7weMG!RC*7Cj*z2r*mD?S}~W0&91K8y56T!3)r1s`;z^| z(NX2-6)s?i7?66t@EE|nU1_o72%pWOiI&Bq6gc@;I?-L%>$|c>cyqKKbkxkZP-}=> z8LUGtcI~au3VnQ&q{r_0q@u`A94!mnOcNKzCY)yL5l8Aerk-1y0BHd63>T^?gXld@ ziyikMwlqf40Y%Tme<@Bw+e^n_vo91b=8X_5SI+?CUWRl%#P8&vL&}6y;>@-!MG75M_^IYv z(11~AI(jFe$~WNDUCC2PE%a>&XRci*U(^f+NT`OOPexcixR&VdFi03xv`2U_wEZs zK?A=lzpzjaVftsY=%HoRsPbRm;j}zZS1cqQ%STKe%cK0&48#ker10%s4Xd`&5NgT;`iLAx>aqXY1}oC>&_3ulLya z(Y5NYic5(CvN+LGJdDxR1r)$rT{VhMV1+u~+m~p4W-2J{emc6!t&R&ui>UEGhbyKq zGh=wNhTGwUQHFkTeH_(QOG`Hqb$`(9p(T;Jehw%A8XL+~Q#h&lz=&$&fV*P~Lb(Cc z8kqOfTtxhb;8l(PV>p_8B0jCiAz+~yaarUR5x7mz7xK1W zIr<&T3-;Y@A=r%dz=pB!J6k0emNsh-lv{pbztx{mEl2pHa-R zh$numYw^aPOSyiIZuXWVc$!||^UBS>c$8yRa$GOxA1}8dGx45jOXXo=---OE(p259#T!0bz3DH@gRv@`| zO`fFS#cq9sKRTJ3FYJd)&c!8#HlC4^<8$>V$;r^??reUqKq5eEI;?_KF*<7*`|Qb2 z?^_08p~qEkc)6&x#Fg{@pA*gyQ9A7v-aT?iURg~u(c7@xnTv3=ort6GpUluZJl%=S zXz7LaQl7F*Mg`RPm4@chL)qC5ugjl_63^3Yb-LQx#y)GalrFgj)I8)unV9e1=DkEm zu^6{;75hYMd}ig~Ci%gK-(ACQ|Lh!BUV8vUXy1wI{X2F+17|^)zIs>b zT)vgWpFHCd00WFfqex&1iy_lF*EkDTRY@r%NkG&MA7==FBq>xKVUCB%(3ScDDvH5v zU?PN&mf)J^7H{W_o0g^Mrv%bC7pna^003y3W}24L?JdjVj03|+BB0*}78f+C(rL3q5Ge#VMX_}$ymXuNm^|G9E z#+YeZLP+Ix*ED{j^wjFL-|RhjJS8QSgGNAppE2R$5e*vThC(66H~?vyMu?VWX&P4r z0z=UlA{d-I%UK7o5+yNmG`Lzs&RbN$F?}5Del@TI|$aGx?V3nbmlv2|;5?E3opss5+ zCfk!l(-Kk$UDs5TWX?Gfm@$)UoNHPr5+MmHyjs^a)rFREtPY2WNY@QSj6@;|Z7kCi zwoL?;5lu)TETL%{B1R%nAVAI}5o0V83cdUJXTSfsW8BCQX(_>QC}LU`G6Vu$(-_05 z>S~t==$htO<-F)$b8k?c=bfKDLX0y1)VRQt8`!|3K}+On41M4d-mwjrE9li}NJOS-b!gT6 zgO?WX*nOaBVWWV-BhlE*8CN4iA{sh)V84ES0iduTf8hgjl9T-!=a1e$SG~boFD)rK zUfQ%UUjjsfB zF>sRG5D|tB?9;1PH_MD^$kWqO)LYNIiapXs+Q9aYW00H7coLB9zYe3g=#QnaW@Di`uLgfCUUXKGnWmTmhSy>$>g6Y#| zX-U4jXV3V3)hbHqN?iX(Idg2pD|WeR?Zko5Ac%ser45l(`Vgy%k=x_-dI^xZJL(f?=uWucDAfdo8s4A zc<6)GU(CLD(e1aKY@DC}Y2`0xD?^!S$rV-A!Q>=EV@b(Du5r_{BH>6dIkh@!R#lb< zgTa8|lSEEhqRX=W%kf`DXmUzSQynVWxrZW;XI4cLJN#I|gW{q%+G%_CA*5uC5!jIp zexEV-u3Nz_%f*PKli(NMWnSPVd{rO3(Mjlu(6pzhsy;o{LF++QV8 z%rsjRHEU7S3;;|smY16|^CsKbCM?mgLA_gUm<9ks$Z*8uj0*{jK`dr!46dFq#ye+A z$o9o8+ZVUAZx^Dts0jdAmL(+(8`N{ypq@fl1W9+!bY|GPxg|taTI$W$+8N50Wkn;= ziIg)Z`?tad7aqurUAQ&(_bH_gG=mhCh7!8Z+eyXdK<_3AfRw)Dy5pkJ645C|!IcI`Ce!twq3bdypJ8q{z1 zzP*n;`b2p}g~mBD-SFut$w`)JW@cn+ngJ+pnt9#rcg>%1`y7MoNhyJh?2O`;#ozt% z^8*h(9;vM2oP35++`2fwQN4NdA6>cZ$=S1KKKSsGF_&E{Vv+p%4O+Em;WLs@Vs3WM z_)A88w_(%$552H^->&-gbCOe1#*Z5@=f1~h-}msgKekqes&vjfb!gYPMgHu2AKS9| zkEYEU`h0=pU@$u?9RRX(vY2M5Wl2g&&CIR0>5spjUH(${&fPB@KfGnLhCv;A_Go|G ztot5&V9v-9{jHdV%xQ{U$Mz#{SmXan`SbFq1Z@lwbnW;sj^W8mZtGI7T{)HPW~T&T z=W8n28UUa=3d{h*pzHbn_Ca1-)9Y>d5zqCX4D4#B~HsGtL;=K(S}a|BBEVar~!>J%K^frafM zDGLA~Rss7qLun=GIwTv=s0F0w!SU@-at2}%Y~Bj8no}%7j7iYcLNEYk8*yD;gC3IL zDSTYRwCd1z8%3DSRczTajuR4?LP2Ji+`%{(a9MzDXLZoTL6UR9Rpq4H&2eo8nIKWs z(*J9W*OucUBoIY4ecHEa^66(^ z)z8lO;m1FVTDEA`q_AN@gPUgEch!}bv~Je|4gI}$KiRW;Z^H(Ke!qX_tuvlq_R87H zv)_FAJwpzh4;j|CA`<)H!%ueZ+)2cQ5PkdhTE6PTMNhrZpi#qCoqLy;Rjm8!JB^Xg zFw}-%jM;h!BImkkE4M5oJL}Zh^6?WcdF{vwLzd7!I2VFl0!d zC!brsYww|*J9ZB~zoH< zcI-Nk->80vmQ9~|cICbUN51{xmz!^#mXnh~Dr>_v#xbw;Ah8rp;=;OivIJXb4eNnx zO{E&!N&QnR$N3zJfGrYxY;)iU!cJO^5-Yr7ye;T^8rHThL+1fJjQAYka~* z!zWxc+!Um9tgMa#GnAXi8Jbk717yH$X&v0Z0Dy=bfLN`!^I(61`smbvPgEspFTwxP zq5j)JwO3Z@p9lyH3|*I!n69ZF-b@nLIT4qLb}J#ZK{@krMj!zhdQ=X>XE=nH0GP&+ zxZOR;RdqDZ2?&9yA2g2SkrugT$BJtz$%shPI3l*~*lzf!^FI7w&8A;BT{dz2%{NU? zP4z{>QO-Fb`52c(fGD{Jz!+n?#*hRer~n7fkTZ>3R~M0{am|)E0RS5|sDJg9mmNA* zV#Z=ZlCJ9+>8VW%8zN(d&+kH20vMX+g3VB~#rO&&fXIVxYUNzIR;R1TDc}kuy$UKg zyN|rIv$pA0B`SKOgSj0K3CQgiXABwBl<$pkW-ucjeGI@g#xz|$T@ny5-SCmETY{!a zbUA5Eu5PGlszfhxH_V@bZWsy+{Dxl{>_ACz0LTat4OQ5b01&xTlaD79UPS=XxQd#w zLt2z}DkNx{R#8>;pS53&8GYW!k%Ki2C2^){Bqd`ENdl2i*WA9)cH1IXNOaIK(Mv?0 zNB{pi;&8GD@#xqNmMhWRHP1Pv?v%)+pdo}5LT05V_3G3P0HVua4-ul#sLJy5tSP#rqxMk;lczdJoacI11C47b33i5fwT*Z{ zzjKnjDhL4RTnon{s-g1PiZgw>4wNxEwC_MhgGK;QSzcaM6$XH+>ZK`&NPj8Xy3L=*Y+`C1yYj3B_;K;vwr_$%TF8s?A5dP ze?I&EM9GO$r_U^XZe@oK9mZWW+%iRKTGFmPdw<#ZTmSBzzWsjlt^-G=j2~;g@Xq3A zUhLPs{l?#R+&Sw8ota0DpD+c}HLW^aSy5T}_18arxaNx~Qzi}U(LNN8=vv+V`k)Rb zQ>QqEb>C|PqVD)D8=C*aSss@lJqsQ$vY~Sg0Hm}FR}%q{&79raZ6fV#$+}S}0k=F< z&1K>Qc6t>7Q*w(!302vap&RvPnU*On#u!t5nF+~_Q({ga3`-bXO~9dzO2;MFItKtM znw_K@2Y|Mq>rf9x9? zf>exE1A>SdF-?mzj*M}}7-yC#REK4TAP7R?u#%=YXPh&JEE0`MAvIlNj7K6dOISdp zajxlFG#ZVW79t|kIM=1KW{jZ_A{?m(0M0nqxUO>q2#2FWSOj3`x~B11%#Y|ANuZfKEc%(6@%V4Q0j&&$glJg8sPjJZq|0EMJTG(td}GhNdqkuWXO zv^0%zu0^9UA%u#0(=?4U6jD}KS2M;mO-F?4PzVSZX9%cinh>UCS%6H}HCS{0JBd1uE+c^ZlY5kX%lYQTuTU#`13Qj4K>!)Ac zsY{pAQ>W51(p$G|*|uf#HZ7aH`|d06e)MVSiPCE(U(u|f9w~kUF#C>~Nl5`B3MM6I z=hOoAd2(r&5ywlHl^oE=fyE{q@()V=uaJ@}!9k8|EYj3+|hH zXZ_r)k)tl?-m7OQ5*>N|;N0B2PuG6lu3hW2q_mu@^v)gI=o6sa+ z1Tz3}8GYrZ5AJ8$rSMg@&tdt+64O8WRq#$;xuTBa!x)6-LC-*!WjMva7wJ@CN1 zw6v6HICjanF@`U=`pYj`v}k^|ykhsBy_3d|nRCa@TYlei^R3hK^6CczTKBG<=g+?j z0Is}zA_)lq&6+m3ch2n{+qaNr(*p+%msM2WKj+q_jdCqZzVyNqAFci(B_rAO*SmY& zB~o!%5fQqaOUa3@Sed9X0TGdkYyGb@G>$<|HV4$CJ?FX)YWT0>r~$4SCq8EUNlyNc zYZHnKR8IU3Iycqg9GLLOt<$Tzh+4oHAko)v(yAp;c^Ww4uq$Ew?GQ+T=t=nKY5MRb z@Wz7xczs@X{vQ{;OPevp)YFD#`)?EZIwsOr~RDXj25C z5}5V?H17fnCg9PtG8llYES&Nfbv+-#Va}BS4V(>(b`d9M(dsa_VBOykJ>Q%F59d31 z#&Nl~ASr5dPxSm3CrIZy$OB)ed2C!Xu6=pjf?UhtFFe&F>cJLdH2k3*RI2JPp-IZ>h*tb`?pn#W}LG~ z)HHP7zHO`O>hh2Nv$jFK$-i#iRM4ofb?Y`?e)Uz)ZXNUM*ZcmvAFrQ2EhQy*qO^oa zT9#E=Rh5>KmY$a0sBz)E`|l|`Q(jR~o|l!o^y!sft^aP+sPn%1`rEv`+WCmsOXiMN`4q zRN-j!ba^?Dv_$0OiBd!+q&Qts7PTy}vrAm?5fK6-SO2N8YX8k1R||*~mx1dz9I-y} zM^!Y%QMc-RoTh1`Mvbsc0)VDXn%;Z&ECBHP{j+bM(WIbWy_}ro%b!^M^s>LVZST~r zM_z6w5LUAcSr-f2@Wua}ka!TYOQwQBy@q9gA-pwd%Du-duI$(BaE28_zkPIDVWz z7?ebhKK9^K&#yRk^zc3R&F$Q&y`RZvpIh?Ob1SxQ-#O!kYx3(g)HQbPv@6@SZDm^W zt~+ORY~M;sdFA9w_w75Bl@@q>(WCPgJo?*TThmh0_v}4#y!2FqyetBdu*|5!20T)U zT6V0h(Ksx=HY~xmd3k@9HShoLV!Asa$9SpIPEbM7JK#%WX^uz%`jkzZ(#`Zkj3?N<8h`^`AZ8uDrF>SIX zM3UbCfM_(T>6#4uk>G6(Hkd+W6@>Mb#_2sW&cTa7~HsZ4M&Z*D|%FH7B2V29ep7zfk4T z=H=$T@zQgK&OlW_N2aVnKwuZKtvN&;2;da}65~hz3#)S0sfOLb8|dQs)s=J| zyDShlKR6>X&JfXz#e|dqz&K}!Qc6L@H4PDgRI4t#^t&>a8M-EXRx_5f$GE~ z1X%(=s<2sbvP8Xr;G834mXONIfT#rOcx%uaIPbA~*X4RA!n)&yZ3)kzQBX6F$1^^8 zsg?6En;;@0GS$-{DHt5wuTN%1IshzsV*Y~(<4$&zkYx2cI53eDt!*C$wqPN@wi6^9JPQW&wcDZ_K}Y=3`5i-~Z6lL7!gS zqNrYO?zZhaKm2%Y>vkPy&AR?X$?*?9`6@FrS4s*;!X~iY`;NT2>XReKPxtHF_wotj zn>49^*Bw(U;TPH1k|BJ+h#?@$BrER@{1pa4jBkN z+Dj>&L{>s%HFA5siNnfrQK$GEXNOehTGn~Qmo||o)g&@Dp=C8mx0H0E^i*m}N+94P zdsC4hKp@VzyFH~Fv#Q2)X^;Ilbe>8ou2yXjv%7{Q4i>v1CGqtj0x5xWloALeM@A4&%XP0)B5p-RwIyX* zN|MW`YCy^%zT}l$65!#zn4!~?&lcOfQK>fNB2Vg+bDnEFpc1oejs*tORb4+@UPoYt z4yaZeHHMt~lp>|xi!or_aA$8Anh{UJBZj)BX+$XP9yYHKF96}n(h|h0s_!9#x<^}D-q;3tY6TmK{yiS%r>^F*U^23-2|5a z05n~5Wjx)`bM@vs8C#Mb{IyfUOH5!YmN(WMkpx>9=z%M1m%oxPvs0+>;b-{V|w26e2`3>sF zVrFJ>%eD-o(O6Y=sC%c@-8;2$pB{-sMqV&<DabQ$F=|vGtE}bn?APS z9_J^)xJE!R%S=u2T|YfuP^Ii_*~ee3&(6(x<%K01H*Nm@`=5h>Bq7A5qc6DBDXv09 zIoVk`eS1lwwryLhGnp9~!v@(EmS^8)SK)}o1Y^{yxY<3$Hv&L3X2yM%b&KsT3|yXv zwmOA%87^vIMWXOf`_Q}(0k3T4iZ0;vdj&fuQ0+=b<8kyp8iqmE1kLxxgke12(0s3PNJ$g3`7y+Zkz^09~_%Y<^FnJcNeVyKV9eRv|UY+Rk zFX5lP&_B#n;;Ll=5ugs1>FYfKI-E~$zDU1)$1l1ZM_obd-lD&%@P=79Vx;_QA2e?l zU3?Gw>M!G|WmZWDO3rF5-n8r9T1Y`tEdX~zA3FHd)3MCx>uq}hvQ_-J=78~W zT>KzO(lIH!sOo5UDqO>BXsbz!Y|N-_9#H-xaD~+W!+|wKa}U-#^Rh`a1Avs|U{-bp z*O=dLq-Ulg!`ZWE&3pKf*>e|EmQ}TCS$xIBi|XZN_v_PdK>vQJsevwSTR|8y(^HlD z8?!`KR_1kAU%B%2w~rk;@yDNkT|51%%P*Von$dTuVB9YvzoS;9L zloZHFOSOcUeD#(0J@n{Zci$Th#dO{O=tKA3e#`ZbEqU(d+vn^*cznY6aXou(|TGb)9oPD>L2a z*WEV^27@UnDTpjRH6@r7R6#Mx!DRH5CULeW0mOSYC75LaYQp5)>t5ri?JbX|R@c7W zb!>S`GI>YUG~U0LT`?**H~Xr~E&>3<(8pgi8~~)GrUm)WEq+K{AcYV_1ABEI*lPs< zSf=&b3s1R2Swfhx*v;2Xch8un1>jq{_!0L^G!`SG2j<)k0I^tX^aVplJ1j&9Ap{v* zBchhgnzp?4MgZv5v%7om_=_%7FH+p3;Ng4ka?cMQXcu11&B}Pxb6yf>@wG>jKvQ<3#%M}jiJ)a z5FFHtTdiCk5SO`J{^Z370>_8w7IJ~waC7OUT6h-MGobe2rh=pQHaf@E@jZmz5y_4; zaZG?7)@E0cv!9_9W2c;_i*}yZj>}k{WKHi}R8*1lyrq|SxT}b$=Ht$g+-W=V8oG89 z)m$Vk70AOf0VMiNZox7Z6t)WkPoj0`^OsM)4- zB9$>=za-bVLJfw*-H;8N8hb!!m+^O(6BQ0Kr>LLJk%2ViY<2fXJJkR*hdHhH3<@o&HV;qvjrdvz%$BG;7QhDV`;q&4_KU0cK5 zSpR*`)cTd|Of9c*uC9&e(xSMa>0T8IRX@JynM*Dn)4OLEDTSIpcf4Fgpdxcgs^~KE znCER2QeK}L)?Q`HwjZt#5AA;t)kqE*MUWCW!-GdlS1y0^Y*lqARNbU;!=Zx*^y$$N z5s9Qt$lT{RWY*DX9TEpNzAGI?u}#%@?c|yA_dod0@bd?@XjUksw1~a+?k8=Fi@J1Z z4FFO~%d&hv-)rxDeDX}y&C@T-$x0JK+1zW(1?Z661f9AzsNxOYn+n8&e4c2vGo^1~Jh005Ao?b))gcD4q&(mPDPyK!oau}cuV{qOaL@=UE{j6 z`70B`3Wp+U9Sp;#8~Ua#f4u+EXSdvR{hCi!*UQZwGO)jCnrF)^kbrZhX`0XPCn+o; zbX|`LyR3(0S(asSu1P6P(*%Z`X{umOBob9+Pc+*U>);M~@Ye$sOmHhZ+7iW0_=%gK z2Bd2Y241U-Ct}Va05xuOqzW79$epTt4Pz=M86?zfD+h6xuEV(<3DFsX$h-IKG2NV| zT6(&N?<(3r0045?GuXce&R+q*q0=a`ByC)SW5$aw*RwH`*|Y}<0EbQkGmLtm`o}el zWT58-#5o8-!s00npneNk{|A}0U+Xav>o=4BEXc~hDiXh!%0RBxu%%@6C8g;nEMxq1 z@F!C!0ztq0?RPkNoDG~n8TBAkW$$D}^-eNLr;H2;W>Q5MzyOl)_rJu$?6TpsV;k++ z!J4-LKZi^okdCUCgvX#Bmn} zgT~6`&%FKN$EC+kTt96}VPS(aW#tb)IKNr5#+g}}xw-XpP3zOA*W!hbzxC!SOQ*{( zAMf)U6DN*I&CYo7J$6mtJ|+GYLpK0mK)>FFg$23}7Y;wKYnM($)TUL- zJ7-QWYTj5%$vOA17l(X+O%=SFcx{cyS!#5cSZ$ak9BzCfBBEWwwpP8EL?O>M`6mu# z2@42Sj(`xBrt3gt3Begh1T$t@!URMFrt2C4gd-7E-`#x)iEr94hC%i@eN#8}Lf zQV@a45fDNEB4=C(%d{*hB}3FSoon1QEyXo~fHAIVysEldRhz1=4slJ>I96AO7-N=Y z&X{>`LDS|F#t!{`%l6?z`W5Eamr`j&1cyq>G#kaw59_Li&3I-phwZd;mh zWii6q<2afFB3hPp@W}C!l9RD$Bq=$$RdI`?fI&oO&Q@;!cVBgNB}&OOUevs4VSYW! zlAN>CXDd#fKGU=?-x3lTGfivvz5}OEowlr);WJtn7iXlWl~+{kKX|mTQ9(vpl90qS zI#N=4;NX!ST{{V3*;p>^gq%Z1OLp(t7d69*VfE1or9)1kMi(|4z z1v-Z?5HxKGodGRKgGiIj+IfE!uv!nKVr58+u zg~vd4PPv%u*OYY%(`bkAxG$|(u=mXp#CQ8_oZgaW!Q2PB%ol7^t(RFlnh&~G3_=28 z40TTEh)iK2accz4kNX74d%=r<2r|w;MD{jV{W32&jm7( z!-KplY5%Tre8{_giHzPI#1%}uA^@EGz&byAPt=k#?PuAONLanP&F+pgYi}`SDQD`v zn61kb0ob9z3=#g@oa@+t&J(4IjdDm2*;7=z+2!l*@_GL66{|c}P&IpW#VR5Il0r($ z61E`6dEGIR30AN~G>FUm-s|glO#&pcCFdGJi#Acjx^J%Se{#*jo+qF^Pv`9zlCrs2 zmhkyFBF3UI#u?|_G6gbZj5+2KFk@ygDM&=oNL14`MB4-d0GzXMBnBi?lC(%9;;>z6 zkdrEesH&{a&CMECFFP8I9Xo#Fz`>Gs9aT6yodb|%Swg5_RmKpBKnOvSkRjJN0z)7~ zcKCSdV+$8{=+ZkYBl(wKep$NW%|{-*ciQEnIie+mDz&D(VVpB5$u$}>#?+h{A~GaN zDjt@EL_{em81x@4IW_NrCkvYtv~1oOh+>lFE?9KSwO4oT*d`i{T9&XZ;q&>{ef!g) zBWEU09G#PuCWPIzr1mbsy1<%nD3CD(j`5A}!qxl7JB-6b&cXD&H+yJCf{0OszjcuwZ9R%&*?@9bOZkAm>a)HM(c~ zKEv-bY{9}-7074!4Bc=nlkwY?A6f{Rmy?~BlWm!%s?ev@BOpM=bf)Hvh+r5Rcn%^k z7zYH#?RP@}pW*X4DG+L=n#Pr!Le7G7&F6ELN8=p)IuVd<8Ak#D$rzyD&4%7&r4c%Z&I zahhKAaNdO6MUP9(byPsD!3%96&BKJ_8?y$tbAHBnS61(%>?N*!C`_?;X@bvH-GW%7 zP@(g)cegrLk{Yx0JOsUa(=#I{>WiG$CnCEu&WTd!I|zwWbtME+Fh5B9tKjd?sqz>V zP6pFNVS(W%)B&LEo39O$f$ry_Zjg`wNLCDm1(g+0Q9%{uC?)zdsEojeFN?AjvEpvn zymj#IyG8ji>*kx-N2~CzN3dNN5Ft2u6e=p=>l#F_=M65aOFA_ zCYlk5oJBJRW;NCi($V7xK$7Bx;2e6SR^63{!7cFT!Gw6?fwNsb5OY)?r7ECT+wfwB zr~yE7#$y1C0mC@j)54v#zC1fW-e`?~Zb(q^73#?a|qa3EQL# z#2H#be7O3{Idc~@ZBkHGRcTq`>n}gb%FKA)fpn_EDFba6A+aA1hxEgtWAQuLXC9M_!NVQT+ zgn%m)#CNal=6CAPDSa0a&zvo1j0FRJWXyd8*%F=2Qf&cII#QlPw^c!)xZqg}FFZoD zLo~=9TQwzgWuO|Xgo$H0UIDdGVCOl3Yn9VZo;q7uQIVUMYxsOZ)laZFnk2HD;?)qg zRidO5u@q+qalYVApe_Z7YW=USgB%i9mzkvw(JL<8)$vSEP_qkhkBsO9a>RkAigaQ) z68mS@?l!HOD-BfLDr@d-0;gO+JbD2=;+Z#&%ku_al?7|9gR0sde-#g=dR`%Zy-N%| zkBDoPuCRgbig~avfppnR;gu5WpgoRca`+mB}i2^*%LaX>>%ok+EYT4sm2KRwZ%?jq zAth(_MoAE3_k!{_q{larFvAd;lQXP;pJq7>4!OvY3N31p0g!eK-V1pELXq_BikBA*h9 zEK4BbnKP9)-9G=l*Iz&cA%G#%d>Q~mqcH_XpJ4!iuq*W2a}WBB#;w}F|NhEm4Rg*^ zRNZy&!#B>D-KBl2&h3jdO_NeumP907*M*R}#)TA`=Cj|3p{^OGX$ea(hFoJHq^9{L z$#6I#rA$puX;8lrLtU*j=a`j|qZ>W|;0#gM4Zi^ZX{lLRS=?g>k8eYa>%Wd_RKpq& zM|4+W_oSe?j`IYlx>Vlwe7HiQyDz}rr!HQg=L+y5okO1q?1~7sz~Js}hiofZSdHl< zSrfVWIponC)y+z)cXmPC_-6c>@Q*IpB8sQPZ>|4N@D zS^)`D7BarcYmTeTEM7VQUZ4WhyutpI7(qiWRx53jND7OC0TN*MRzL~KDIm*W%^Ki- z$nOd#2@dQfT}NHfN(4y_?sxEfFBqmVNt+fV`pgRPcSmG zDUd9r#+H8squ-R*--UDTWUs!5g$+UDpbNlwG%o-FNIOr52slDWvL;=iOMi-1!}g7M ztV|v|0cS#Zyp#}uG_WL+Bq1mYXaqs!#+y-0@ngpkIQk06Y6!kGiiRL;5>G|lfRo2@ zUpWkFq&xyj_=DHt-Q>xeuQwM;XjbFOiWRfTn(`wb%;j#!q(IX85JYs|6)5oo%G z0H$doB6q6BD8Hf#)FL8X(=5}BnwF+HWyRwwlK7z(GdmZwJg8B(zET6*5Ik7vdAj3P zstaNi&v=htDe_4093FCSNWrZP7(1puUwx~7w(#U$>F zI(dCudvv&+hZe^(F+C(XjuD>exca91Ry9|{iJS3!SJzlV9y@xXQN#Lk=gr=@@u$~c zUzL%WKIiu7fBgAJR*L@Ug1ZEoRaI3zI<^y1`V4LF{=+MlFN=k$j+LCsNKGP1;b?gO zzI}}vHkdo-?mxEt{>sa*@7cBg^RLzn8QAmj2OqlllCgcdw_p3!*B`w1{*ZxX_Q(TOq4HQb(xh?W+I8!%x?=LQ>!wYdIC0m$eUCo)$n@)G zuKwV4(=?ACIo!Kz$7`><>cv-HzV7;)8#F8!IlQkWteR4i^O~+hHNL7f^_+yAg^4?f zl!xBYA?@O_MCT-&m{2^1Trr;jky*kr3}fl@D_a$}8Z~m5rUKb)aflqsj7k)CXtXo5 zL#}J}q#|&2W|k;kJ7E-n0KhcPDk`gvpEyx3HzzGMRsG5s+wkKrk%&2Da6j%;*l`Vy zoU4Rm_x(W#;rIJ?{=N5+h0h4fy!)AFYyz!R% zzWe%3RT#xqVBDFz?`F>{&ayo&3h%TNWNh0RgLX+p03Zp>35NHEzmYTHM5|)_qeDDg zT53zF=$S-()i7bvy*OAy^K@R>k$jQgyz*^WNSWB+&o(?GB=O^#JEY zJftg5)8g~;4xG4E>tM&KfF^+(W8yGwO|wh#aE_cC2^J^yECNl7Z*9(*yZMw_6yKDR z5IAF8l1d#R0MM8Qi~s~k$VgAqeR@t#)>W5J9MZ2V03-zhD&QK3kRbwcLlxE(k^m7k z?iwI8L?EWjTM34L53jGeIEf6!^OHk&TuIv_4%;_6C{h<0#5iG*AQ>`3+Ozk-+4AzH zjT>iWro~J%95Xp%yY}qMOi$0t%Tc^9W{Lv`4rrWPQks?t08$F&?eY11rKipwJ$kfB zBHf@T1hRzVf;pmQ?+mcg~TD2?!fZzYz z^3B?B_wC=?s6oTj)FjiCJ9q6)Nlq$k)F5V>hOX^Ba3oY+)uMSb!_ZutGzkzSW07hz zmY$g$So!p$8^8bM{g2jmXnRXVc|~e!lBRJYC@Zf{PV!e)hjiVy@8BU}TFr}^RENSx zjvj2%xRIf8)3jm{$q^5i9!gD3%gIV70^QINq!qK&l92^6W=c!R1X^WfWyy)t&6^bn zLD8rwZJOn7z&b#Q=-F0@G99_p4C9QbZn4k3-3BGNphPe9J*=t57EMqV9j*nCfRc{i zfxwYLq>w_|PE2JjQBeh|ivl1BDM^y55=cTd8)SsGOf@Xjp`cxxOs=_K37BOP_#nZ7d_t{QD6#OtHO zKoJsN(H_^efVdO%RQh!Yt7o)?B_hwg?nL7@2LJ@%ii4x7!lH4_G|g}%%o&$bAm@JF z@C=dwF-H%K{~JfwnumR(v&1#l(3K#RJi}_;S^FRt-gV0*iR?@59dC^}I{+fSZ);5( zYfaO=830Juj_QL1d`*<7JRWR!m^d?zKgtmUyrVemQG&3Dhz%J8A1;GWUcl~y>F1Z= z=glx>4&`@d9lOEWx1n1vYSS6M|B}kju=6Jp*HFkfs-x2wn@g_nN0LY)# z()yo~h?Xp6rC|(igNjq21)!pu%rHoVvI;2ONB$si4PsF`QI0*@K-M0oOF{ zFcQNs+~J8p5a@=X7^h}8!*YIeR>shE0^7w&M4X|<4TQLgVt0UIs3B8kN1spErL*sd z2+`*=)X)S-zM{IGjGIkQqdlnC73Prx|$b0?_8 zhK1L$ToW3#eQs)ek9#HIYH*oNt&uz*>ZV$CTez_1KeerI?$bQ8jYk9|GF?T8Wi8*b zhvv9?iSry!mpKA2txBZzYT?o5imoXd-QR00imR7W;z`e(!4;|F4oLt+7LG(Y$K1?h z%Q6ueXUy5H4zkDhLyfhpeULrA%aaMbZcp#D5?=s3(uh;n$n8J{67DXVZ+Cd8$N#A@C(mBZ`8Q)FTMEs{JU=Z>8H()J@VkHx8Hd3sijk< zP3hjfeKZ;~3|$q)2F93OXIggd(s}fV0qR+2&YZdXo_XUhzhdPJO8{WVfSw&XbQ;>f z_lK*$95;HX&!>$TF>KU`expY8>)2<+3opJpa(F*mr}9u0bQ%%5Zg6J_1K2wSV9;8AAa(mOU4=(jUFzg1d@PE3aO^5DufbK zeo<9t2PCM(SwV!zI1&nyU{{tQAiLTz5rF{CICAF9QYxzw5J+JW)BoD>_mZW{ZkTe_ z&>;ha5JE`9&|iOJRoU6jlM<|bG7;Zv zeoCMmiFyyjW1$j^S!yAXNT}Y!pwtqs)>rLUWa#dFDFpylSBJ{Wt2E9Mn5A^8f05nv zSPJ19jv41bs`{e6b-7cj++m{V*4QBcDTp%$kcg202ag<04hAzb(p9RXWm&fFgiHcS zAxR;RZ7x+rfWT4JnCcN+i_}nDaQ3cX9TG$hQ+Qmksr{`kDLm0`lW-e2`~#e(bv2$< zV-Db~4zmRUkg5x`A@85sm^|#&`I&fg$zP(hwq-6;ON|hBwj$$jNZJQ%Inwv#p zreSDh<&_UV`9gL^`hq#PM#7frS{P>+8DVO&< zAaF)?RL%d7vFi?$nt1**yGia|?+qTk_bNp?h={$R2r3;^P!ReN30ujdsZM}!m6V#*p}Tw(k6|GQxEasb|{b<3G|OyCTkc>4K_ zjLdI-_#rDL>50b{G-{ArQd+)h?Mr(P9B9&{VIUaf?#4GnRZ({DJG5-YbH|RK?ApHl zyty;>9XRsNJD&s%Ls8kv#}|M5!%rLE`>432Xy|~x_uYM)uIsB-zwrCkzXTX}-7$5< zMFU@c^Ue6=lzZ=gbmpDY242{6-3xF2`q$2s1nrhFqlWbFwf*m%&%OBG@e?Pmy6ocH zr;Kr`*@7gyTAiw?hM}XRK|_c9vuAH0Y%E^3YU-qM?OHcIaOBi$uYGd=eG}e(_sfE! z^1uGsRdlX!{P@w8fzW50zPM;;zZsKmHidZpg^l5`e)RMS6=B-MTYF#7SydEM8j=Lq z8}mu%;e>>^Gldl&fAq!f{fCbpIrHo@ix`5GraKtDwpSGAFye97>(F~H@B(-MP8x`q zq3ty*qnPi6)7c}$nK$kUuI7rKpN^yE>5U`4hzL06s%EF?HHFC;Ln}#{t^->2A1ud* zbltGS8-?TyIp;!122yh)b`66u?(^A9G!4@-R}{vot7~q*YtDObZt(edZ6NH^G%LbU z*L5lEUFTpgVWF#qEg=MseeFsxTa-p2j!;kBO2qE2>qmJ_fhe{`gq(A_m&nm9aXcnO zFLOPYI!iwhqzLNFZ1p0GmN% zzQLw80YRirQRI2hN;~Pfaijwl`&3QUK$Vh^sZQhuMo3r3U~ojH-M{+hl+$@{Poq2S zzEbRjIRAm}yz*+~$nf!CzyRRcgAiG?^57nkzmC|hPwzU!h*Djir;yG}wX77IHttG6 zRM%{(M&b6((6odUBjO|(2_(TKafM+hgp=>bcEe%m445?lo_`540DE^t0KD@~h)bde zr@*>-^vK=x-g;n0_4}^`Ha-W20RSWf2w_zNBCb$40KxzOmX^VU#81|V`QyU#C&9@B zaC*PFY?>I~TYmEyzx5X0z9RrYQVIwY!nFth$cQVzHDDSlJ^;XQ4J4(bkf4W=B>lTb zrYL;P8vfSTxM-0qJS4w+n^d2y34>7sDJfW63+o=Chepen9)V;P$Vcm*5O)kV7K}HK z@4=Kz3`uF(w7$itQRHQni`qnS-TsL@v&+*m zT1y;u6>Q7HkHI=T)4aan>neJ1201v4w#`ci^`Xe&z1kTU(UZ)3TCACeu36(=i_T#` zmUD0f2E+h35VK=U>}ISy!*Tq5cT$s@GgumVqSBSYNIZ5a8IB4zE#fjBH{8p+C4%#b)Ej>Nh3&y_ls z0F#jk5>0-q3(`tXFYP0Sjuhp4ICI0g&~lz-{Yt{_zhj4Ms)B&JZUQpKnMDwfPv|rs zk)r^fg5LGGrP1HU&T#M)HLG(?Oo!{SFQPBBtzlIK38zk<1%QM99^JijN2B~a0APT{ zMFoHF*!9)-KOQ)IL^n*IsuUNOe!lsuL4yX57(V3H*EWVix~ejgK!OZun5J1(U3)=~ zPGiR0{Mu`8NP>Cy-*x!N$w!}jMi1(6*}YxUp_g9u;_Gktd|FL)?Y}1uRo4Wz@7TozHf@~e z(%c=)b;WM|kfv9})TO?ojJ>X+HRy=ElPtDP??=X%sw%3gs;a6ecF1y4a%N&u3TNok zRL&Vmsi_KQ+!Um!KA+FWxgsP&8UTu~KkN(d=6O+9q<*wIs`9$ot2BM;1M)3T``nV6X1kBc(}F~;NK;(VIVT1#Tc zIpeD0^ZERUq;T%{`?$hQ5y3map8Q1Q&GBY`4_-^iGl^US^?X)Xy_gYL2AN~Pxi%v@ zK0>{Rlu}5cX{x4anx-<&1zA}s6^pEmj{L6&$N>*0g;hh^{V1hj3d1l=-7pLT0E&uBzW?#p@~RpD z5JKp>q3gP7=u!#*DM<)n2w@7L3o-=RMWKOk@BYIZUU|YAEhFc`6hUB%(b0wPy)yY7y4atta*u1RP4rqS*k)a#%{5!`cP9Y%PK z=IGfGv3ZDyAqpW%D=Ip4?s&`1H@)}4S1X@=Gpy@REm{8SZ(A?B_@ZNH&dz@D2}E4B zeC^vC-ySk#V0BHPqPWDT`T>A5uBmECS^4DK?mc_z^ypDn@7TFx$F74rckg-m`Q^y) zsw+n9-nr+t+wZ-gXQv4hZhUzD;n%&V>qb?n$a7${Fm zP0Gwpd+VK#A78%qx@$(HBqxj+J?-?_bN4^AC~O389(#RZ$vML?BTq^aokeR)xTPc| z>cMbzAoT7Bn~ohn0|38o{rm0rK9*8`_Sx43UcS(8kz5~Y}eE6|lJ9l^P z+#+66bv>*qc10J*R0Xesi5RwZQp!a5=Q?+>ET{U;0FHo&--W z**vDb*IkaHc!Y)Zt2S~;9U*w#R=h5dcUuBFe`4HWXF`+rpVx2pKraB12uHA&;i7~O z0FdMCcmSBld+@03D2Lba+wCIt5&znbV2tvf(26=?$T_oPO%Rbhs~wSRQ{bZjur_65UG=M*&4VC9gb;k*_vr;BZ-budMg*m=zd(UIZhJ zOeX*UP{`8(ilo&Ch#G?S2ZqGzd>J{U8Tn31D^&&{IMr>Whg=ky?dZm;BLJY2Vw&oR z1hS`=Gec|v!bq5sXW)u8@K#&+`wzUL7k%>yeZ2`g4#T|8u;x{GWex2+4%d&yAy-3u zCg=gsYrzbYssc#>va5WzZckOiDJ>HLpiNhpau=LB0w)Un{fDz|Ba(Uzr$!BpZ9CYF zz1XEUKx!tE2}4IxqlTEC4*;O~K$yTx1Ovzf!@xFeuw^S?8Zrbhv2|m1|03vf9S8ya zE{4goDLDrlHNvZJ0WA@mw}45vQduSHVaRC#84YmGLfG;H7M@lbSqWmZ))2 z8&?A%qEm3qu~}o42YPnoMTvfgfc5l%i0rWuZST3)I8Dc1U)PSbTvn`qlt!M2oReL9 zHpZv&TwwW)rVtp_hBHCj@`W)n9RL6sQzF+`cCa(TB6lEA6h#t{Fcd|VQM9+Ob7L;N z;h#>qJ@3X6cfdGrJ!@Q+_CjZn*iRq53gq}8_K%)Ljym*=N>p#tBYKI(JDclV?)22A zi3?sj=SRzW0zl3cpQ8M}<E_i6RVG2{~zy9*;eRG04_wE{V^XRot zECzss2M%o8y6x!|PjL<}YBh_~K)SA>GU{PsJSH0$mex?uuQEk?)C~2J z)04f(wXqmN)ItN;5oz{&=|mn`Z5yUpQxjBGrJ}q%B{elMAszsN)j=VINwT!C+#lzU z^ZUxms|X=IE$z&?g7VU`+}xbxzzPt}?=Z>kGXT~X=x`&G_4 z=cT3PadEz+r1%pjPlv;LvlfjR!(cFkjFl9Z2q79aY#^j8D=Rm2y>X)kGj5;gKKki1 zXMLI)s0m3zYt!Y~a|JauwauG1wNmp2L*e40;*5;+`1m;8Fsgb$)gGJNtqd0h7g7>Oa>*T6?!<_AiqIXRn4hWXPP!?l$w&H z>n3x=aztiC^r35m#j*q(KiaO|c7DJ2Kjboc{`cIDydUisB9amiPn#>FQk zrzRx$HBAkLLpyfuCuz29*&;b9p{%sLth`#1C@47BvU$tgyeuh&#+5^dk5yDuHfofg zo0DmpW?5O4DfF|a&$e#c#;0lf4;-wmscqh(Szd1TsWWGe96YrpWk>rq%{z8z%^2H% z;7Da$_d8E+ zD;is&L?8 zUHAF@Zrd01=<&@LANw>FoGhYNynHwu7E-FJf=Xl;i>~Vck})QTHhuNOt8agD=WSyd zLUu-aeqKYySW0rD5YjYFMD+PJw?n#VG6v{GC}>)ww6tlO2%!1>)<+9T^!t58nsu_3 zx{h`MaVP1B|op;V^)w*RyNPnwnH`G%*Tn0M&txnF+VGV`{Zdv)vZ#isAK|F!GJQJ1CX_JiUBEsuB{*c!gk3x`KE7-zqVtN+SiHN1^h(T+=Dl**s_4hArcqJ_} z8TlO*DOs=PNfv(yJa>9TO#5 zjFLqUci&XhwyQ|h47;;Zf+T4pb%^EVl@*nhxw+YKe!taWDXhd1%rHe!Nr_+6GBVQa z-4f1PiR%nGcL4x<1v}y#JHIN7s6EXKMZHh0d=`f)x{IZJBZ6Kc}JV3>WtT&j504Ap1We0^kgU4v+;?oyrA(S_ zH%pQjf<(|%Bmsl3;)AcU&cP;~V9HW(O2~ngtatQmZ8QJ?m?nh700h0R#@^Qe02noJ z{BJz|FQ@{{8VE9I-xEh(51@iDfdr7jFT5B?A-#rxVO%o1d9KZg)_o9w8YJPomm`1- z5M164FQ01D#teZOhFQ-7r~nKMLj(iBU0hY#V%DCbUiia)hb{u@u(l2-(filC^ojO} zu<$9%8e@PQ0D-#+Yp^~E;AQOpIJ_VdIz`uA1H~4b-a!;SDx$3DNSkgLla-zTtr|}N zD2aq=xP_k-t^k6xN=-Q>qOGM>K;d8`&BOtVMHADnz#Qc(0Mxe<4N-F~a0$SqI zsnH&N*k_-ISy<XlV-V`JK!EiOIdp}pCwUxrg%8wcaC%3X&3U^W7fFoh6+|Sc z4FrGx^RIq=dua*-sw?he?Rf9!W5-XbirTPYuGLFH($4q~wosLl7{~2@?@3KhYuYF; z7z#4RE#u7X7(*m$kDR-gnpS6WX?JuA6#FYVx_F zl7}9A;*Mz(F6`5J{Y&pQYmwiqQN#D&|7_c~Z5It2dfT*HGtyH-!7%4oU0MCy`j#n;j7}Qrjy}rDnblQ}O*IqU9`yYS( zW9!bndk(a1+v27%*Z=U-uiyXhOS2}8#*V%I?3sc_jqIu>H@!UV82A!jj@^ufB5BHCI$uSHJV#Cx2|+*7JgHV@HolNls*(2SeeXf8O%f zpF8t%n>B6P`1FZmfBf<1p(DpTwQslJ!FxBn^wzgO{FIlSd-WBUUo?Esci;W`_l_M! zC1od1p1JngE6$Y`z4Y=Mx88K!oLSR+n&w?l!KfMRj8cf6B$k|Zu(@c1ja)0${;rPM z6=mKyGp=PXV)!pye+01&IIYZok9{qOOk$?*w5IAP)~1A2E{`^@X# z{P1%iP}8S(pGO|J`eYANuMSq_=jSh5 zG}q9L`STV6qrbNAeBw8`L*>-z zbG5OxGJfRnv2TCa!Z7~pAGbEl zNk@Zu zv+SJgoa_t$IDF*9nRDkd($m|tZYhO0eBy*8Dyt}06yCN~YgH9n{@N*pZ~woC!oi?V zQ{&=%01yg=ckJG47$QF}*B9q+n44u0LP{CquAawDh!Ttr?;xVh>SLr^_~yT3@y>I^ z_M>j(OUws{#FDFNC>53cj z$Qu{Wh`a#+0%_S`QOQZI)jWF?dZm;1Cg*veXiA)igd_nNNUQ#LWSzk4by_!MfWVMd zSJynec-5af_YNLRQefCC(23HNk+Us-PeMNFflh zs;Vk6F_Cl74PE7|R+@S^oSvF!7^1eertnOm)a1c^`>M;!ufFNZn{K%7-FH8||G~vW z2KAMIsIZFisuQPARF#*Nl~rV>C7wEYE+IMe&KvJb(C>R-R>$^jdq3WN%`?v}S^Pw1 zc7t_mpU6y4v7Ur;MnLiL@rcN|w*TKlUw!$_^3_iz#%VQ`mBJPA0#Ej2WrC#M^g_JmQ(-$SCoR{s`B!x z_&5!L8Z~Ta8bUV=RZ$Y+eTHO;9ks_I>)#YRa6IhtX0wWBHd!gGW4Rq!SFLa6c!oor zIdb0l8+~s(s?_eP`-iM(1ESsgcK`DGk1JNJZrUvWsb!BpzGCHb&n%yH-@Gq3f77FT z*BN)-GxnC7F1vih-81KeLuP}B}x2{Lb6&{QT=zCr_M^rcM-Znr2FJ;*D2d@!nV+zj=DqqitHZkU|oIkV2X=F3x}A%-IJYS>E@8E;DCL4C!H2RU=Z7B3>#o z*CdO*qoac@rv*K09TB1H0p{#yvZsI~t||(mVVLg5XXkk#(hS(ZqH5444yW9%-5(XTYOIyw$si*m9-{GG>zy z0Tg>-lL$~sU`!eT*#9f;-vt>dVCbYLW7BSEa?nHIk0T;LA4&xXQFXGF2@@E%Z9_yr z4O~pa$=O801R;PVC>*qS2!(;dKtN1EEe;r36<{rWSugeK9`%Y`s&hh&j3lg)Byq(e;XTLb|)Pp4w+IOpLbRx|=o6vLt!<8}_+JRkMm$t`dR&Pmp)gjJ*2 z{$3IwZ~#SB+@48c8YZc#!Wc75Q%ZY3B_jC!ny`MhKSr7|OjAgS0E(4CGjeN(wl-`8 z(cG{cbE&G)aJl`Pg^3c7jR{yOmO!Ev>Fna8L;xg&w3p)bkPZwafL~Ps(KHMz?}Ln_ zS&SiWJ=5F^R8hoe2V_YHB#M%EZdmS-Zc*nDrd)| zAsjk(;%&9XD~pn5BN_Dwg|HXhHYpSZRz2eflr`~++n8{nWZtc^p9fA}lbnnsg(n|&cST&BR zxU6#9j-98E9v^+vOIlW$g4WQgaA ziaz_~)6qAL2?aw8X!fjoyL9h3;*zVr|KW$WQ^%qZBnj=>189o_0&hMJj68JgBzIU* z50Sh!n7fYR1&77xdFBWaB1(zxy!(Fp_MNW0=E`T+K7I1!*^k~?=T~`Lyzj)} zQ(u4k%lKPI0l<&nf3Nw5KePJzn zJrMlm*WX`U|Ji zR>$yi?n_bMTYMykht_*(>PDMZ&F0*H=kLGnnmpmI`{z$BDK2^IjhCKV_tKTuTru{> zTf24deC-uOZ@h8xj5{Xxy0FKC3m@Z=LS6)btJl8r?dzhM<1@3^g^#rQDfH~ zu4@TLbqtY&kecS(x_##hZ+yJ;;W=r^i7&qTUP*D~^y#eZ|ByYH+I)`m%? zW5ZxBbuG=HEAK{=6Cc|2_J^LrGjwR51N#r>=4Py2{>bXpFTMQMdkq`rmlaj? z=ySmfYaX&lVP$w{R$48uYOdpF)-U)ZfL->X4u_l_Sg{woX8C_autr&;jtK>pc|?u^ z#X5_5z>pCGl4KZ$=F?U@v%#;$t$yNR%P=c0t+;E}BQvIroi_O~5RqT&y}{%+;tOS-no|KyYJ%PXppsH(ausGF*yXqr+{QPChfqf`5K z4=sB9iA8gN{e9cXqeqD;03Zl7#`^WWU{Q6=`j_6muxID3J9g#eg?&X)TBSR{yk~pt(RXq^6IfuPMs>qOi!^qQIlj%P3YV2wlv5~KY8lx z6Hl$ZaL|xzt{R2_X=%yd|M*)@R?^p>e{Y~qQIzV+%F>EzWSHRhRaTUeG&NNfhF)1+ zi5!^}zir#m>w->See$q7oA&TZGd@OqQRd3m{ME7rWCDDj;;wBEh{->T|r zK+seb08B$S&4@-oj6_Yi0~RbxnxecnMzd0Lvh>m z0&(sK>%BFP(KHMMcKJ2eO}}mYmtTGJ(=WfzzWesV;=;iL`j(WG6c&~$Onvl`c>u6r z?!AvZ_T+}!)_t*Q)5do{IdI_cgA3*yId-I?^xW>f2M_K$kdWX%e*9>o{F|G%Z2JBO zAB??eRANG+5E4i-R2nsGkddBr>rI!PD=65s`RfG><_{jwvtOSs+y2=3?nj>v=-1sa zh3BEYp{CK4A@2v9AWj%vjApSmP+1kxEkl^VV;FeM?`T_rz=en+)9k#5(}dT`_dJP* z83aJm-en}o37xV1NhedASJt7sbHhr+M3w}z6dy(*T zt6hnV0kc9(tjfIPkezIQ(zc)oq_Y*5h@>E^n4TpTEf32@PLZ*)(u$(e(iTmdAWC;l z@cfD;TETgl5;6HH`fG|EY&K_Onu{DtP?7|( zVNecBy|4;7k*Vl8!|78!vxB^iMh2|MeRaSS%L!5xrLeI0+_^$inrUfi&6_oGLsn0n zK2uOwtf@+7MrOl?xz@L#u)g=-!zHDqjq>uEHpy4GQdm-6Syi2vlj-;QO=%4V+;i|q zYD!{OS{eWXQ;r-vdGy37WYDBx!)DDITZ1^P8;6b@4+Ls+GBfh>a=klB9RJXI@7B{H z#@M;Sl7ga=7ESY$lM>z2rSwn_A*|~{2+gP34kLMosx3*696v2g*{pE`AqC_7$nmqf zt~YL!ckFaQN@9FwMw*nwSY*pYG+$zg4(<|-SGagkAuGl)x&?H`Lp{h%eWAY*4#vEK zoyy#b942N}E_Nc(Y@pRn?uJ&$A!e5|v*auT^jS2FSecF&A?*N35|Lm@=`I;1C8r2y zbW68>q;(+y*;(R<1aQ??Sy}b|`=4BT`Q_jYR4D{g`JrQnU)s2F(BOVKx!Jm|BV(p% z`ux6+KK`s#tJcGZ4e)? z(vy>_Yid@mc($yxc-o|K!C)vD3Rl+zdv$Mr(a=G6-Z7(dmrmU~wBVds3*F$Zyg30A z=OJY@K1VSY8#!wQECLmKx#((6t0)4vV4bBI(V3l);MbDVvX?)#uzROg1260}VAxg1 z&zy}-YJHh-(TW3?0z#mtTGbGRKU*J~=rl5YiQuOG$5k@Zn=i7R;J; z2LOEc)%U;t`tz+5Cw#g2tL;1XY}xYH%vrZ@+45IqZFuO=KCRm{Tl@67U$^|)Ah+># z*IzU5zS~5m=XOAEnTwg!1U?2Kk?}Od-orje)s&%Uw@t7wCN?6k6QQiqW3@f z^7NT=^JmZK+^Kc(xuSn|?Qsd{N)<0Q2kr#%4q*q)MJpF&q)M92!a-}1B|3;65 z=%uQNZl;K|Ba(^930GV-^6PJY-Mi;#Mpjm+x*9mP?=s}JX`=yX#E6jx_83W00U#}X>C{PcJhKfpzWd=bYnOKH*s^2CmMfmRuu0?WFE;&<(=z|yzenRZYu>iS zu04DD_3PfL+rY77u1HHw?$fJppf>pZPrpi^WSaWzw?B34*y+n}z7Lt<+=i_dJp4d* zX1bKJXU}eLz4Ot#Zy zaL*?nefHvpR~}nDFRwwC6b5G?gx)YWqt}H!-+cG0QzuU+CB#c1YznvpB-h*qTXxma zD;~nz%(5q$7s!d8a#){-<8TWR>$5ig*AX*(!hvvEQMD;Rn0iH3O-Rz0Uwps!pM8h+ zeRuk7ah#tYIa+x1@acr4q$7t9RaR9let5yWP}LRJPT2U?$L(4+UH8%(yS9B>SyO%a zmE&rv!yG^e5<>Rub-{#jV|ML6`01xFmldAVNpIh#`KAwE+3@n~D_1-{d-m#ix9{MUc(7`GDgA%azQ#!7)?nnIF5j%WunVR}j$5pxsA`s4f=Sy}#gKLC&< zrg8;9H%uaw#1P0XH3O1>OaaVZAVkm3U%Nz)mB!H!rd53s02u?u6_O-`$r$Gf3X?1| zhN5HW>L*DwDe8n=L`dwC+f^eGH_M53h$5bKvLmM&eK8*oF zqlP(vDgdOVBxh%2Dx9xaxp2(*Y2&BQ4OCXPYu5rn0{|dqnzD8CCW{|^_>skr<)r6S z27()3UU%yBsfPIt5P>Votz&NZ`lmmJUOFZx!GHYR=`TP1@ZNjwn7v@x_-V5XPoL;^ zK_^YqS~SkTb@KT8W-lSdw|4D{apR_q8goaewz@i0`@@&-z4`Y0yZ0YXOh_0r`ucWl zn}H3a09TZp%=AT%uQNrE^xDBghAm(AP;$JV0Orr1{lLOyo4^05s-R%VC0BBW4f3g9LeeczNB zbASPo`P5?znl;JaxBp;XZkndqi}XoJ@t^>+>cTmufm?0UW(c`?upINv!w&LH03rmk zJp__Op0yv>MkJ3z`M(eEb_~bd@Ejf|z}+QdOWlaYZfCtT!lr4~1Oh&vNoe(lu_ixw^E(sjVwZ@+%!r9(nNL-Rpc50{k}?>lfbJ1ebKexpBkY@Z@Woj!ZE zth}gq?;Zell5PuwV2IvmZ1O05_aVs>3*vRtVo2nbSDtLO?sD zIJ4(1oN((6qp!cpGz`@f*8+}sfylNW1OQ>$nTXv(N?l4)6t1W$0yb{kBt0$NvZ3tY z10qe+5HUM5qe-KNmUqmM`F%bBkW%Qnfk=#@+W}M9u#FIwi^l+fq-4CF1vGLhXep{< zZGAKhgGl-`)#a#Znu?HTU`#=fTjlkbGS>fNqlUw zIlrGr*V(isB8=L~8mmMpdgNJuPrNIHEuT33t*WfQ{IY zw4>W>rL5QyZA<}FfGc2C(31j$05V7zUPKSM>L)1xoDpi)=6(PGE`S*%7zhnGf+BzrBqv1$=504!f0a+u zzW(~B`HP=8dGb_TQbJ~0=Hp8q7&frCBv`ff<<-x<2xuTvRy_IW=qoRN>-|sGZ+Pvs z4Xb{3}BjE~p$9XWgXRkzHaJ^l7cV@=ci?DOyDFIsx+#4&%ImYtsc=)(C|Up}03 zT(|z!XV<@4SyP#)sn0&Q^5S6wrIeP5W-90xY5s(&yJc{_NY6$4^hYZKA4>5N^FuLetd#ij4P^^6fP z{C?jv>t8=}=G!KZVyYrHbv;$@tCWNce45W{F02~}GNrZDG@Ot&RwDNG{Jln9Kg>$;G{Bgge_>#G5Go)jtdHYowEf?1Moo^NS^r_P(ZQ&prRz z>4Gyq|M;DX>a*)t_UPW$&~>J1LYR6mpmGit-pUveAOiq9&=(Q?KC9jU^ZPYK^!a_W z@0+ppukFJw9o3^-x8uhTojiPe?b_!WH_1GEt{4EzDk?NhTlUz3zjyv~^UYJf`})KD zyo^X7xc%f&&+eLIk>9;P)M0{sZWLYXA!fbwb-9E9VZ+o-QBhV70BOnbsfh_3P+?4E zXc&4`Wu^7V6*V=L6;+ELo%7;L4Ig`a`RWxfY}~k^W5+gu+FHXTpFf^y%pzc%FX7CY z!UyNw_vPj96D&^rI&2q`nS-HKuu6eDFh|N zC4_?^A*7-xajHrr7zf3tm{O>Wla=9Kipr|8?SKARQ*y3n&mNavcFBW;01GnO0DL~4l;ATA9U1yn z#W2i@@`}8y%(yszQAr6gNU}5NF|T3c;@w`Ty~7=A3QncobiK z7nAFO5da~V1QHOC*f-z&e)G6FmtQrkMYEQ`{X&q?h02*}3SAFNQ}?N=!nk1w!w{;< z5B+<{E`aVn9%7(2V146LAYRoN2w~`YZM81t?RQKVb?s$ee(|HKu$r3Ml;lLtKo~|G zQ^R3{bM$fEyHA&~w_X$HiwhgUvuDp{q@|QsRdwh%=$dOUz5Vt{AAa%$A`)R$ZBW<4 z0H831ndIki^60T^uDhaV&+c8?wph1*)v~24E*x;h3oou7d;MjBKy7Mr(u!wZethLC z({G#DtZhs9=~r~3iejMvCkDSRYa+%*tPkqZUG=!4^8GlS zPxF%#p_?3^aKnuwH@^4Dpy4;&Ib+hbS6&2gDl01;L|91Z*{gS(R{5t-pS^L^m3#Ia z&dCf9olwCh{FMWd%T{} z@LW;(!2?GyUc2+IM~aKjHE-8Eq*ns~V^~~V@%iR&?z->3Ufo&%K;N!ykDokKR9O7p zJ1^yBCe4{O`HhY5{(Iz1^X4r&v~S>nq- z!#ix;I1wNst|+y&!OF_2`1rWw^vlb8; zV^!6)fnYE#HN~f?;jpeKYFIY{wUvIqFDWT05D3+j)uyMVa78gq(@KOAJN6<3@lf7g zsf;@3zjU+XMS8FR4;P}ZWDJQYAwF*5eRmJ;J1{XN>4J_ekDWT3mX`k3YwPlI(*fYZ zUfth#dA$T^-?H)6pT7M1ho8H3>VTl6rzS`ug`>4^eZrV)`tDJ5f=l9K$zdoTU)%eK<8%AVc2HEx{Ivum3cEm|KraZq z9x=RKyXNhiH`==8+uyhSrH5p%-aYa%5?_3N?N3{`nTEV*U~k)QVh8}8TDN?D!!rqS zzPNZ_N@7w@dLl_FNT6g_T{gH=$M%J#MY%b7X{kvj!Bfj0<(z3M&(F{M@SRt3a?*%s z`I8G7pr&A$`4>JiThsX6cZ|DaXm18GY#1F{HT-JRTU-C$RZ&sdyJz=|)C3|L*spJw zP93u{(<~a^K6N4jrl%&lgA^Snnp~L6dL@L|I0T4HBAa1Ou(8Xs=(p%{`25CRUAgG) z`Si5qzyJ~3+@6OPqU({y2mpp*7*Z;V!hw+l#+g6Pmy(`VSzXhtd6U*{+svN7=!%gS zz4`7(S6wy|fG!(3;-wc}8!~XPl(KWjPW^@qs;sJP*KWk$|Lh3X7=Qk;{qJ4>jJ@H; zUw--X*ol*fXw})tNY7}J-*CaArFYyub@bR9=FEQJg*STa{`>FKr%vB;(+vQiDhd&S z^kO6t1HdJdtA5b)sLsN)EoxjUd)KGQL%ry=y8m)|{~s8s+pT&}jkvtF7Lt-HifM|y z2mh_Au4>k#ab|j|s;DPUojY^(TzYD1v!?lg?D&Z@{y2YHYI4{RMJ44)$w|T5Dk(*E zO-)5rW#jz(ob1d42M-q%RqWq?_~@~d&6_nYtEl|<@bQ$y#HLO1;XQZdA3JEFx*tR=4!GHAFS%DnwWZ#l;R8{rJ zu~VhxWzvM2nqWvb0U&G`hxY6jrrE4XQOT*Z=TZ_A@*CwN zP(e{?pf*@tQ*D}NtClU};^D;Ul9Iyk@7s2DXwy6?(UsD`n5V{hT?fiG?_#ksPo!To z!(+iZcWg!2NsbUuJQsS~s(<#99k)V}loFOX!#DsagCxNSy?I`skN^ZiqBKDWkOD|LFd>4%oCq=iL1-lav(X&{DM^}W zB>`gy3=kPI4yXVy;2aPD888(YkhKHKs=tc@tuKfZ5lDeR#5ryfg=!FQGN&#m;y{g{7pr2uKz zWD{1{pa4s_Ab=3SEagKMJRA|L(vir>02RA4==zn+%It!`++2p}jueXpQX&bE4!|b? zKtMPI8BL*KJ2Hh$dB;AJR_aHm5@x*v2_tWvab&$kM7LHEpuLV%w-M`Jb>khJpDhTi zth{pYup2sb?ezM_4UO^}yz=r(Yo2*w#E^l9jvl+|*2$M$b@j3*9!192ta*CW=t)0+ z{Xtw>+LKSLoH66JTgH#Q@1eOTjvfO5-7x>%x#RfBv%PwDVE`)UpMJji^ub-0SpWW~ ztrNzNyKunZS6*0?n3T9+(W3EFrhop?TiMwePpo))^tIPsb=~DlmpxusSOm5hwHLz} zGNv#oBnc-)1R($@$b7yyMbm6@01}aDm|RhSp|y^7?8LFdhmSGFr4&L4&J{o+Nfr_z z0XU)|WK~VjOJGRZs%Vx+A9zK5X$f>Nf@OVipRPZExuJ(ri2;rDB`wZVd-;$}@76%`dr zL3{T9+qZZ3ux@IqJtJ(a8vzle1fQlJK5_Po&EF5Wut!x@tv}u$3WbV_3RBY3YbvYq z8szvCwKfzwcH&G{MyeSOrKhKJg>V07S7~WQi>8g6HpxGC_FSCbpOclP>-zqGkDe3 z=I8lT|KWrC8sue7n=;8T%wRCYIZIASeE5Nx|Li)D5T`!)z&)?L`9ZLzX6m$Q;Ka+?wMdb?jL`?z!Bqk^7_SGDjF!c{U*_@Y~zIx5tCQTaU<>drI)nQZ5 z&C5Plcyi+!_UPQ{^Y`DFI&oanMvby_Qu15m&%Ec34sBZ;KXsyQ%U0We z+g57`QWVCRG-YvlMc6bsXPje2b$KwXw`tvS!^<1r`)E_=_HBRu?&oVpUE8{Kv-H%I zA%g}?9)IJxg0rb9sb|g>v}oDrwO7`SpLow#-~Kpg;00FtYtFez%#_F&BPpwEL#nDa zZ`L?FGimd;-;Eo0-8Y-RIezTqy|eDx`p4Fg9#mC@BUIE>Nq~g7IL;vy3WALwM6$8i zL6lBl$^Vc~%$a29sw!t{Ik`v3$Lw*5#FbZ7Dhd~ZhxBmJlzn@54b@b<_SVPUyS7=q`enE9pmm#G-MYW> z_WK<>wj?Re6%^$*YS6t~+pRke-g5H|X(>rxe)khsxyF5!fdE%HV@#Lf!iuUfy)Vy9 ziAzk5A30+1krOB4;t~>kzF;t@Y8vOfyrNRo@RE_ka&uCvE6a7=M1<_Dw4Z+aefaRc z0|s39(=UJb@7J?;_YU8D|7+7mdE5T_=lJP!E1p`sb=%*6Z`*nOH>%&YY~Q z0I)$%zRND^`OS}i7Mv|IOf%B+=;7_g3&Z)au_!yj`631#qR46Ib(ZP{kz%f?1K>Jc zitv{)RvoA+DJjF2dEtO@uCydQIr;Y=-+%RuPbW;7U0(6vMFV*iDy1Ze zvZAJpDRDkkIeqF35g4XXR8W|h-r6bX%rWi27+Ngxntj+hIxID9XT1Q zsZCEy35AT(s&XM^b!C+#Fv5CSX?b-hR8(A+lAI6-8xmM@a#CSoQFToqF(Iz9tfEKH z9xjjEbu1^?7d?8yJM7Pg4n;E&Et->+2uGfOW=5mkqN9XoQ# z@PYmNUGT=nkN(*9&xnf$UvuSfO=X5@I;El_5-Ua@*gi9OV1`&i<9Wuq6S;*BBIF?D zo*$wXEQJt5`gH>U(=?kkY5+h@^D`~xafIfLGXOvcsQ_JZ(Lit-Bqfncj9 zdF@&>(hV~lHX7t)T92hFObRkhF=W66)>8=~4JkXcZrrhL6T>uhLBO~q2pi`0R}CW} z!l7`Sre1c@AOH|n&KVR#`(9x6lNfU)iO;89*sYC2E@|inj_^6}{IUHBmygi~ygM6W)(&HYYD{#i z(~{>d5h)loa?r_{Y{h&K0pkb+4B5bb7k25?9srs(YjW*1R{=m`LeixpMl!(UBpa}TE4`m@MSBW&dbSo|DD$w zG|05fKhHFYg6G^JP97yep680Wh$0pLoQ;qkD#hUDb>mg-pFBB)BJo(~7mnx0=D_W* zv^{Nl`PGk}dFh?vqQXlq9}^~S)-=A_Z;rg zv!kx->t1^6nf0$Kz^=IT(g)_v$jeUIwE35nPrtNp->$aJTfO?)+FiT;+3@naAHTak z5DYASd~I@4{G@R=U3U4{q;|^YzbKoO1HishQL7yk*jLpMU#nK|$Hf8ILS|YQeApU3J|+ zJAYzCwK?VO97fd%ma`|GtpcsJDp#M`|J+zf2cz?F*mj_8!%(rlMvRSUiHxe)`3d%Z z8fS&mV{kI?H2|Lg&d`lV^SbC!bJ}?jr&Zgr$4DJs+xoR&K=&*X7FrbXb`Wi-h$Knr z6m})FAPRf$j}XSFCy9hBq5m& z>7*mn5r6|CFbj)h9!v}!WG%*)a`_-B5`SlHTSt_HTq7bY645cIz|sZM78Vh;a9-Jh zb;p?NiN+cc6mwy8n@)fg0FbVS6B84sOrM*coBz?qXH!!X&2V_xBl9PZ8<&@tGyKY% zZkae~)nju3fP^{hjSUy{9s2sapI&*@6>;&2y?b|Q*(mG7S2l!o69BlTaevAeUwt=h zXuq_iMBOm|+_Dt_5)zXLV9~NC+H~#p%8P5Wv(f^Azz46ra6!L|Kl|d_jvd-%WanOT z*+l~{>^bn$_YBk2bpshP#(>brH6dl7HkgiGc z*L6bz_~ZPBVa~qiE&vDwLrhWPe7;a9goK)=g>~H}Dd*fy8vq0VD(4DU7-I=Zaelu7 z06xD@wU=SBo`8k(9T?%XhxG1Lj^UV_O|yRXQ=P|Mc(p&F-w)oLix!GCW zd-Pbd^1&_J_TG8V!>QRx73T`3PM&z%(qXun`6WJPkjMpl#u z8ifV?zYemMhYK@A*hGwCPK;t1M7zp}p3~~TJ0eOU;^MT4<3<61ZWttJ*wFqL4I5~h zV)V6_kG}Tux>pGylM)jEK?)kwzwe;_eM4dW+RKJrciBbO35IEg!(q-905FAU)G+V< zd+!1O!!RnVDyyq%{PFR%wLwi&!{M;1s`>d1Zn)+$2|$t%kVqncFhxp&Z`s55S#6ra zsI3hsoN%wz>f5`=s2i_d_3VqEe)dIK zVbQ`z=4E80-aGrD(`U{O7%=FTG1n6j;~WT7Rn5&#Pf3mkfb{gVnt&+)6ouV;@164& zJ~8s@u`(DQH{s^N1A6`V{dY~9HUa?6r{?BnCd9>Y&KhK;$HymtgCJNaZDfvk=!otx zuAfI3`_9p;mQ75KmXC1R1}MDxuTCRqahCxhNF+(Bs!kYx;~zWrUUucAc5PY>8{SWt zdTMII1wA`ho$Sz|Rhw3ga&yv`JpSnN)z79RCNyi-BsD43+t(FOK6KTMDZ=2+eS?q0l=I&GiJ=V@3E!p zH>`i`^x3m_-S<#de0*7D*-NiHmy?_E;F3p|JhrrPlV(#U+>n?MS6vefg^iU@Etx!X z{^$ua`(M!g;z2!Ak`n=dF=j87M7xk)$MwJ9)B2?jMaP>EM)Z-xAB$blfe$e)JJxix zD;vqW?KVOU@^V6f(5f{rA3N0l-H*N+)W7eSU;p~!ufN}X(+$Ih4ydZFmQvK#)|gTX zQ|PA27;0RVhV;c@-wQh3H|NAluf1JeS@G58?`GUN1purNc)#D@szuXd&%E~fJ74td z*1`yhsz3-4{XVreSc9s6%&03LUcCJ5nZojtqRpGWnm%K4!`w_$%9NDk3FF3&zvYfK z&v!QU;LpEpU%%#w!2<`~bKgTnv+sQO?GIYEY~HqYqq54DM87z_jp3yXVnYo8piJ+x@mfB_ejl~?uZ-7%KbHbv{ICXf3MF#^z@8f0Y!igs9B zt>b--ZrbB9L&SV_4abPX0|1C5g`y}&j~?51+q4|nc4{Mq|!-+KFYK*={_~H&Z{PX;ThEu4my8)VDLW^xJka8wzjj>Ey(?o(N-2>ck(7qtr&QO}jG1tI zbtu%eQ~L>1?|EwJg3B)*HhKE}#l@u;T|Df|Prpph%tdDs|6Ey!kj&N9(Je&Ghgc4gTf5SGFwPCrWB`nFA*Hpk!z$b& zB?)P&3g?_jA$8qgjFBYfRI4Q*Wa!gW(-dLdR5({T7p4FpE0G^#NRo8j00Lx8Q5YgO zOd+K}LLfHQQezzIpf z7_%0K4IzO*;mm7FQ;gz4n-i|{44!46Xx0O{jw*SEyw@HFIG<3BZYq|`?p%!cagP1r z(PWYPAp!vhBF(2=bJeBRvv=#-xm(xHBq=T~Zsf&70YFM>+#u(*^>$T8!!Q+v=VWKy zGUgfp5<&_o+qG!)$2T8YCrByUv}*d#pFdk4L!ppWFpUUI)9l*0{gxlU0Dw>^eEl_- zU4PAG)@edY9!VJ%A%sgxPyVEOMz|*qE($~OVw&gkYaKwxOFR3Oh@v45hj!pv;1SZ2 z?fZMpZ*XWr4tx%#X~xI-zxrXz{D)UAdG!8EFCFsKQ%|2MD8FacJO=8I-*0;Ux>P*Pm9W5-Tugn}V`+n+x@zI@f3+4tNy=GON=`t+XZlRx|Pi{ZnD zFJF598y|l9{dYe<^UShtT{;?pAlNappzDEat{$;y@vL>vyz%18@83A;GLYu4zkL1j z>#r<$VD`16$9?ndcWv6VSg`o9duPqKb==sglkO}pDdUVwDOHtK)rJ=>U0G6G{L%Xx zxBR(v-y_R&GO~X9ed~&q&#hYiSgTgeZocJ?gm`8AxKX#=b>Fp@U$%Pn!Vf?Atg^a9 z4~Ng3JQX$skSwn#L7o;4hmIUR@W^8eh7Y^w(yOlX`_w;v`u4tg4?nZ!xofW&{@9ai zj~_X{>615J-tgxAvma>I;`QR<;?kls?|u00mtTLgV)fJGCfzuG%$3{!`0Lr{o@m>y zApj`~w{~b*aa|b0o5m^N{fdEV*6vzRD2}TH{2}C4JkSIX~#sE!308~NYL=uQubvHrb zfSUEuZVC}p1waJ=LPSm=B^d(9ATm)1yBw;;9pa#%6Sqh}UWSk;G>6p9# zb%mZiNbx+Q`+qDF)HfeosBF1(r+j2hIx z_m|)OeC}+aqNe)&zAD2!ee%rhw@t{(Os%d71VSNA(}oTk^!M(Aefst$U0=W9mBx+p zva_;O&Jj`5RFaZ&UR+YK`I{dO?AzC+Yv+rH4^B-^s;I1d@1xB=P1(Kg-{j=f#H6Hc zfA8A6?@(2BRZ4Qwkii3f-}+ZkQORW&4{p)C@ty;R1A$=2cC8K`I9gIsdGzRsit?%( zM_rzmn;r`3OtI><8$<>ISP`mH3IM@56H+Lu8V>6peD>u9-Mh4E-qb2nU{&y7&Z_r+ z(Vo1*!P3)_+*ckSG-3eM$A8-j_pZfxqGC;pTm10SX?IPWd+)tg1Z7c4MP^pko`XjgJ@(YnMGJ15cJtMvCoEdD z{E4R?3kNGNxp>5?<%I$o`0E7l-VUs`b@D@w|^&BqJc^RQxhp(>ok~kj%ScJI*f)4kzrln0SvN~dPI&u;rw<%HSyo!nwQGlX zAJ5Ot8!~K2VqzQsTr_O(paK1TaXunykl*md=bq8xe1PKh7oI!#@1eLve|l;L5*Vg@ z;J)djM_sdj|B)WuI_Bl10l)_zzJ1`|qaE6}Y>=HE42AuE)i8|Kty-;Gz9c@*FNtQ| zJwpmfk_5^2ZJU4c*1GL~@A1dScWm3-G>vJ~CaH=B09Rdp>F}XLGPBc=*n$V}92T%eA@Z#!x(BentGEx>sS$I~OMKupF!;K~@|+NFkf#=X~+O^QX@g zHEz;CVGs)GNV#vkvPMYBx$@-Wk66J8(MhZ||X@1G<0o+S;Qh3#)2tyS8gCiPF*sTr^~m!lka8%N~0efP^V-yk_K0*N!YG zsmRJmJMIr+BnHzg${Soe~WhV<{VZOeBONEpVv`)16zePVHG zMf1iDtP_6R{OO@1Cz>>A=u?znD6DF#6f!Zv|H!g-*F zI&e+wrhRgLj4oUqeX$1xivBs;t#i|a)#(f|MBOwxbZm3)y%QHb@!Y8m$A=8=HTuS@ zbF)+a+`8kN&EJo>nwq~bZNhQ*+UB! zEo|JNMe}A&&lMJf1N$P<$Pt78nRw*&jqjwSO&NLVklH{H05Y?)$BZ4NDs%FY~n%Z;ka6Ot3JzUmTHVTf$R@O}vi{`k1KH(q=0p1Je>{CiJz zRn^naZd~)kT!>g)Hf9hN7>cnRsXv4ys$@dMMfEtV|9#ZmqgVf6;fza37xd_|FfZ>+ zLDAM0&Hng%e_2IUN>b9OF}J+?=9=HO?7Vi&lyijzpKbc8YuB#Nu3Fl#LC#pgYJ)-3 zG<_OJARz=t)+oQhv+G_&#y7qDYJPs+UH8oS`um>_9xq5rN_l3*qOP6WEz8OL^s8Su z3dSkFN!G*n-=3VD1VD^4An<9*%<1FL7MJbWcl@hwem!;itR!lX+hFp9QR8mC`n5Md ze(S@{cTKZ*8RyIrw#ZOrii?mtuAV(4R8`R&(@|mE+c;y0O!1&U zpeT$8JpdFj1XbfUt2tUZ`v4ITn3b`$zF=F%xp&pqaaaHW6wXn#g98D8b8e+SKxC?w zr;I>R6~>r~V$OXtJ9p`za1NY1t=Uc%=TTLU)J6mV!!WEY zW2R|JDXl#XRt{yxm~e9cGsZMehGi?jjUj}>hP|POBxhWbVH$?zRj8V0s~>`47~yc3 zaYf-g7z{}%0DyBvRTU}ia2j`lL}F>|`t0?LkjR-agoeoakQ*NCIp4GEC~`aRDTsg+ zeN8>fLH3sx^Gyqzi}c8mv|w$XA_;&(N&xue)2}bP>auIE7@U)twDzfo{@Hi<%$bt) z&o1lKy5XY_&-wcEAO84ro6i@YnwA0picd*SPGXFwq{Lr4YQl9_jmXc>?bV}OK~YIY zN>Wxvc89i&g)sZ|?DlqU#sl*ned>t?{d)J1(yB`%Q<784%l6Kh^Z1d2hY3VUX}P9p zH;kTe*(F1hlM?#(=~Y@$^V2VX_3737?%O8C#VNyw5BlWeuZ3wy0Kd<-W7m$;g~byl z-`clF``parpMTm?Syi>`pF_QS_PY6o%K%`?#2bJ9Wy?pOq&CdSdvM-8*;z>)=S~NJ z9e?eOPfX;D>qN-W@AHLqy>pKqw@{3Z>vhYaky>5FepoH_UR&fN_f zHTvwcZ%Rr_;t~_~95~dbZ3i;d3;T2ohpRvM;H#SIn&g!D^sJ1Y-CGJFBq2itCLQ>r zj_DTT^hAVZ#O#j@3(usBSRzrElUqZ?I~0|e1xe4?@*w%>ZP^(iWXk{>YeQ~)yhgiv z5~Q^SNyv~;S`|gfDyHtrWV>;<4z8n-NszFTskz&x0YD;0AO?g040r@XM8-%;E7;54 z)hkRO0j3G2KyC|YGMsI&9Dpgn8E^$a0nR{Sc9Jy-KmyPTXOnge8X{;uP&EJ!0)a75 zIG6%N2uOe_K@y+@MF9pNB~Td2gs?%O0GK9_Kq&zgRD8%4Km^5-;0Tfktun6!60MLk zV2l(68M71ES=pQ{n%TuoI1qthB1m8iNRV!TkYH8lL~btvfkfmsxP|~|#c`;}5I`Yh zpfKPZnGdY>D+UhQN{(E&BiXGgpdQQ1!bJs`1{fyFFr3*&Ti?UMw}CJT5P-RSlTI5H zI~F6u)cW3254qm+yjPI>CI$s?{Ui4ThRif67&g<>QhYuifMm#mAp;mMI9&)_Q51!7 z4vYwxs;b%P=@sQ=q3V*AYgSF0HvO8>tH zL$_}E?e85sUwd&S01*j>8rr2ltlE^e^JgW;_WQMC$4@L=xP0balUp@!DnulMiG+GI zMf8ClRz!nAu8z0nV^ll!x>feft>5Reu0oJPBqk=TeB!~W)9=6X+NsM|KAaT_l@}FN zl$73d>vY{Pau-{j zh`m3@W6pbA6-af zHf!7gE1{RUaPIHnR(aLg-f3L@YAnUP3_U4-S*wPv$HcbADb|F%*!vmv3KX5 zJ7-SM%gI(WEj1aMAK(Cr+g1wH$WwP+^)EbnS7bpsc*I zDlIip0!T>=tO9s-DH&_zIem==1tLFN{?z~AH+fPsML7iLJ3pG82-fCyO9>!HP5>kj z5RfTWx=U10RaMVeay3TeP*ufh*^2kHhpV&q!+u3%Trnha&Ij}#NTimOm$hrxJ}osl zDKRN0CsR=rYY|miN&!$3N?-uURYd^;CotN2YMVN8+;g^Xqmvs*N2V48*=)(IdlJEc)xPs0?UkghOB0Fp@4RG&{JAj2?|6a9?Y z{(-KWl0?sL9f(K|g}I{SX22YyCS5af!YaU>Gf${d*{A#lWC zAP7ilNpX5Ogn*i=SR`f6Zm+mFpRVhcU}OwUA$^*H2t*JLhkdHrq+w1d6k^O$DAc-n zzG0Y#F0JIyoG~F~O(4h-jW7YCqHrSV-KAYG$`A>Ash89)Rb9tF>R0QOsFSQ#Bdz@x z1J8R{503V>4Kg8o!*#=MzHX%Ts}Lqb_Q%g3Ss#tC-nw$;Je?0ahA{m#cQAiHP!cp%bEvw4$->z-O@ zN=i>pdHJ~~Ow%NS`|g?o0M*siO&ewW{o7^$c;xZ*AAk9yMK!0KF1Zy7W617xRIvW- zU4-_oA$M`Z0lvY*7cbsW?-4m65{l${(TFIe;GBQ|-LLn~f4oVH#w5|75QmI$8fu^a5nx|O;hzyoG z^p7=+-SvT}a~*ib@l`NpIz%2kx}BKAii<*T0qQyf#zuFDKuX{MB+*XCA34a5&v%dk z=P?o!6V4PB)YgVEi=8bjF%7{~?OZ`25u84Df)nKBWCm-3RW&sLP*PZ2QC13w;b2fV z0%6mTQie?v2x^07RZRs+;9SYi%l+uRS6+JcjnSiTyMNx@_ue^C59^vwTfOSFRnNS- z^vU@b^y{fp7X`^BoY;srJ=B{X==gQ0##*sIawsc$up<2v)UIGl_n)8m_h`?Ap%)e zT7LS}xh9Po3DeX~J*evnLMR*x1VThqSy{!H;^T}lmKY!J^YQ#fjaEMWSlc!&pLqN^ zP`Q+{th|D81Su;kYjj;V1u?spBG|ZxHL|@xo8w@i4fUdJ{n@T0xZ5MV?6+(?SM0

N~tTHzEb3 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

ouRj~qQ&tY|9$DTIZ4s>JfFhZ)Jq$xG%$D_XR0 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

    WhD=qUW-lGlf#-y#gopp_kkATtVG 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 literal 0 HcmV?d00001 diff --git a/rewiring_decisions.md b/rewiring_decisions.md new file mode 100644 index 00000000..01db369b --- /dev/null +++ b/rewiring_decisions.md @@ -0,0 +1,25 @@ +1. Disable the inference pipeline \- path of least resistance \- we don’t want to delete functionality +2. Look at api indexing pipeline for context on how to start indexing and/ use same resources to start indexing web content +3. Dhanurs Django/COSMOS cheat commands + 1. **Run:** + 2. docker-compose \-f local.yml build + 3. docker-compose \-f local.yml up + + 5. **Docker shell:** + 6. docker-compose \-f local.yml run \--rm django python manage.py shell\_plus + + + + 7. **Migrations:** + 8. docker-compose \-f local.yml run \--rm django python manage.py makemigrations + 9. docker-compose \-f local.yml run \--rm django python manage.py makemigrations \--merge + 10. docker-compose \-f local.yml run \--rm django python manage.py migrate + 12. docker-compose \-f local.yml logs \-f celeryworker + 13. docker-compose \-f local.yml logs \-f celerybeat + + + +Use scraper repo also as context \- ssm the .json file + +4. Remove references to XML config generation for sinequa +5. Provide context of how sinequa is replaced with this new backend, purpose of this integration included \ No newline at end of file diff --git a/sde_collections/DEPLOYMENT.md b/sde_collections/DEPLOYMENT.md new file mode 100644 index 00000000..0f824acc --- /dev/null +++ b/sde_collections/DEPLOYMENT.md @@ -0,0 +1,187 @@ +# COSMOS CI/CD — Design + +> Companion to [WORKFLOW.md](../WORKFLOW.md) (the curation pipeline) and +> [IMPLEMENTATION_PLAN.md](../IMPLEMENTATION_PLAN.md) (phased delivery, where this is Phase 9). +> Database backup and restore are covered in [SQLDumpRestoration.md](../SQLDumpRestoration.md). + +**This document is a design, not a runbook.** Nothing described under "Proposed pipeline" exists +in the repo. Deploys today are manual. Current state is recorded below and was verified against the +tree on 2026-08-11 — keep the two sections distinct as the design lands. + +--- + +## Current state + +| Area | What exists today | +|---|---| +| Deploy mechanism | Manual: `ssh` to the host, then rebuild in place. No deploy script, no image registry, no automation in the repo. | +| Branches | `dev`, `staging`, `production` all exist on `origin`. | +| CI | One workflow, `.github/workflows/run_full_test_suite.yml`, triggered **only** on PRs into `dev` (`paths-ignore: '**/*.md'`). | +| CI test runner | `init.sh` — finds every `test_*.py` and runs each in its **own** `coverage run --append -m pytest` process, counting failures. Excludes `document_classifier` and `functional_tests`. | +| Other workflows | `.github/workflows/issue-formatter.yml` (issue body templating). Nothing else. | +| Pre-commit | `.pre-commit-config.yaml` with black, isort, flake8, pyupgrade, bandit, mypy (excluded), and gitleaks. `pre-commit.ci` is enabled with weekly autoupdate. | +| Compose stacks | `local.yml` and `production.yml`. Four services share the Django image: `django`, `celeryworker`, `celerybeat`, `flower`. `production.yml` adds `traefik`, `postgres`, `awscli`. | +| Backup tooling | `manage.py database_backup` and `manage.py database_restore` exist in `sde_collections/management/commands/`. | +| Beat schedules | No `CELERY_BEAT_SCHEDULE` setting anywhere. All schedules are `django_celery_beat` **database rows**, written by a `post_migrate` receiver — today only `inference/signals.py`. | +| Credentials in code | AWS access is via static keys (`DJANGO_AWS_ACCESS_KEY_ID` / `DJANGO_AWS_SECRET_ACCESS_KEY`), not instance roles. Env files (`.envs/.production/.django`) are maintained by hand on each host. | +| Health endpoint | **None.** There is no `/healthz` or equivalent. | + +### Two defects worth fixing regardless of CI/CD + +1. **The gitleaks hook cannot run.** `.pre-commit-config.yaml` passes + `--config=gitleaks-config.toml`, but that file does not exist and is not tracked. The hook + fails rather than scanning. Either add the config or drop the argument to use gitleaks' defaults. +2. **A live production credential is committed.** `SQLDumpRestoration.md` contains the production + Postgres password and the RDS endpoint hostname in the current `HEAD` (lines 101 and 117) — not + only in history. **Rotate the credential, then scrub the file.** Rotation is the part that + matters; history rewriting is optional once the secret is dead. + +--- + +## Why automate this + +Three reasons, in order of weight: + +1. **The release path is untested.** CI runs only on PRs into `dev`. Merges into `staging` and + `production` are exercised by nothing, so the branches that actually ship are the least verified. +2. **Manual deploys are not reversible.** `ssh` + rebuild-on-host leaves no artifact to roll back + to and no record of what is running. Recovery means rebuilding from a guess about the last-good + commit. +3. **The rewiring adds automated side effects.** Once [WORKFLOW.md](../WORKFLOW.md) lands, a + workflow-status change dispatches an SSM command to a live EC2 crawler and triggers a Celery + task that deletes and rebuilds a collection's `DumpUrl` rows. A bad deploy stops being a broken + UI and becomes unwanted writes to shared infrastructure. + +> The indexing pipeline (writes to the `sde-web` OpenSearch index) is **deferred** and likely lands +> in a separate repo. When it arrives, add its endpoints to `validate_deploy_env` and its +> reachability to `preflight_aws` — the hooks below are shaped to accept it, but do not write +> checks for machinery that is not here. + +--- + +## Proposed pipeline + +### Branch and environment model + +``` +feature branch ──PR──► dev ──PR──► staging ──PR──► production + │ │ │ + │ │ └─► prod host (manual approval) + │ └───────────────────► staging host (automatic) + └─ CI only +``` + +CI should run on pull requests into **all three** branches, closing the gap in point 1 above. + +### Workflows + +| Workflow | Trigger | Jobs | +|---|---|---| +| `ci.yml` | PR into `dev`, `staging`, `production` | `run-tests`, `django-checks` (`check --deploy`, `makemigrations --check --dry-run`) | +| `deploy-staging.yml` | push to `staging` | build → ECR → SSM → `scripts/deploy.sh --environment staging` | +| `deploy-production.yml` | push to `production` | staging-digest check → SSM → `scripts/deploy.sh --environment production` | +| `rollback.yml` | manual dispatch | redeploy a named image tag to either environment | +| `secret-scan-history.yml` | weekly + manual | full-history gitleaks, report-only | + +`ci.yml` replaces `run_full_test_suite.yml`. Take the opportunity to drop the per-file loop in +`init.sh` and run `pytest` once — the loop spawns a process per test file and re-pays Django setup +each time, for no isolation benefit that `--reuse-db` does not already provide. + +All `deploy-*` and `rollback` workflows gate on repository variable **`CD_ENABLED`**. Until it is +`true`, they skip. This lets the workflows merge and be reviewed before they can touch a host. + +### What a deploy does + +`scripts/deploy.sh` runs on the host and is the single definition of a deploy — GitHub Actions only +decides *when* to call it and *with which tag*. Order matters: + +1. **Fetch the artifact** — pull the image from ECR (`--image-tag`), or check out and rebuild on the + host (`--git-ref`, the fallback mode that needs no registry). +2. **Validate the environment** (`manage.py validate_deploy_env`) — *before* anything mutates. + A host missing required settings must fail here, not inside a Celery task that has already + half-completed its work. +3. **Back up** — `manage.py database_backup` plus an RDS snapshot. Production only. +4. **Migrate** — `manage.py migrate --noinput`. +5. **Swap containers** — `docker compose up -d`, recreating all four services that share the Django + image. **`celerybeat` especially:** beat schedules are database rows written by `post_migrate`, + and a beat process left running on the old schedule silently ignores them. +6. **Smoke checks** — `check --deploy`, `celery inspect ping`, an assertion that the expected + `PeriodicTask` rows exist with the expected `enabled` state, and `manage.py preflight_aws`. +7. **On failure** — redeploy the previously recorded tag and post to Slack. + +### Two new management commands + +Both belong in `sde_collections/management/commands/`, alongside the existing backup commands. + +- **`validate_deploy_env`** — fails fast when required settings are missing or contradictory. + Once test and prod search endpoints exist, it must refuse a host where the two are identical; + that misconfiguration would make the QC gate decorative while appearing to pass. +- **`preflight_aws`** — checks AWS reachability from the deployed host's own credentials + (SSM to the crawler instance, S3 read on the crawler bucket, and later the search and embedding + endpoints). Running it on every deploy stops it being a step someone remembers to do. It should + report every check independently rather than aborting on the first failure. + +### Prerequisite: a health endpoint + +Smoke checks need one and the repo has none. Add a minimal `/healthz` view returning 200 plus a +database connectivity check. Keep it unauthenticated and cheap enough for a load balancer. + +--- + +## Rollback + +```bash +gh workflow run rollback.yml \ + -f environment=production \ + -f image_tag=sha- \ + -f git_sha= +``` + +Migrations are **not** reversed. That is safe only while every migration is additive and +backward-compatible — old code ignoring new columns and new tables. The rewiring's migrations are +designed to hold that property, so rolling the image back is a complete rollback. + +If a future migration breaks it (drops a column, renumbers an enum, backfills destructively), the PR +introducing it must say so, and rollback for that release becomes restore-from-backup instead. + +--- + +## Prerequisites before enabling CD + +| Item | Where | +|---|---| +| ECR repository | SMCE account, `us-east-1` | +| GitHub OIDC → IAM deploy role | secret `AWS_DEPLOY_ROLE_ARN` | +| SSM agent + instance role on both COSMOS hosts | verify with `aws ssm describe-instance-information` | +| Repo variables | `CD_ENABLED`, `AWS_REGION`, `ECR_REPOSITORY`, `STAGING_INSTANCE_ID`, `PRODUCTION_INSTANCE_ID`, `PRODUCTION_RDS_INSTANCE_ID` | +| GitHub Environment `production` | required reviewers configured | +| Branch protection | required checks on `dev`, `staging`, `production` (needs a repo admin) | + +The **deploy role** needs `ecr:*` on the repository plus `ssm:SendCommand` and +`ssm:GetCommandInvocation` scoped to the two instances. The **hosts' own roles** need whatever the +curation pipeline uses — initially SSM to the crawler instance and S3 read on the crawler bucket. + +Verify before flipping `CD_ENABLED`: + +```bash +aws ssm describe-instance-information \ + --filters "Key=InstanceIds,Values=" \ + --query 'InstanceInformationList[0].PingStatus' --output text # expect: Online +aws ecr describe-repositories --repository-names cosmos # expect: no error +``` + +Then rehearse a rollback **on staging** before trusting it on production. + +--- + +## Open questions + +- **Credential model.** The codebase passes static AWS keys; this design assumes host instance + roles. Pick one. Instance roles are the better target, but the migration has to be deliberate + rather than a side effect of a deploy change. +- **Env-file source of truth.** `.envs/.production/.django` is hand-maintained per host, so + `validate_deploy_env` can only check whatever that host happens to hold. Moving it to SSM + Parameter Store or Secrets Manager and rendering it at deploy time would make the check meaningful. +- **Build-on-host vs registry.** The fallback `--git-ref` mode avoids standing up ECR entirely. + If ECR is slow to obtain, shipping the fallback first is a viable staged path — it still gives a + scripted, validated, reversible deploy. From 913539b8745f13153acb01e20ebc3db9c3168cad Mon Sep 17 00:00:00 2001 From: Bernard Benson Date: Thu, 13 Aug 2026 14:19:04 -0500 Subject: [PATCH 02/20] Phase 0 - settings and validation done --- .env_sample | 11 ++ .envs/.local/.django | 14 ++ IMPLEMENTATION_PLAN.md | 238 ++++++++++++++++-------- config/settings/base.py | 16 ++ sde_collections/tests/test_aws_utils.py | 46 +++++ sde_collections/utils/aws.py | 17 ++ 6 files changed, 269 insertions(+), 73 deletions(-) create mode 100644 sde_collections/tests/test_aws_utils.py create mode 100644 sde_collections/utils/aws.py diff --git a/.env_sample b/.env_sample index e370568f..309f04bb 100644 --- a/.env_sample +++ b/.env_sample @@ -16,3 +16,14 @@ SINEQUA_CONFIGS_REPO_MASTER_BRANCH="" SINEQUA_CONFIGS_REPO_WEBAPP_PR_BRANCH="" SLACK_WEBHOOK_URL="" USE_DOCKER=no + +# SDE curation pipeline (all optional — defaults hold when unset) +AWS_REGION="us-east-1" +SDE_S3_BUCKET="" +CRAWLER_INSTANCE_ID="" +CRAWLER_INBOX_PATH="/opt/sde-crawler/jobs/incoming" +SCRAPE_POLL_ENABLED=False +INFERENCE_ENABLED=False +# pipeline-scoped credentials for local dev ONLY; leave blank in AWS (instance role takes over) +SDE_AWS_ACCESS_KEY_ID="" +SDE_AWS_SECRET_ACCESS_KEY="" diff --git a/.envs/.local/.django b/.envs/.local/.django index 0978166d..2e624326 100644 --- a/.envs/.local/.django +++ b/.envs/.local/.django @@ -47,3 +47,17 @@ LRM_QA_PASSWORD='' #-------------------------------------------------------------------------------- LRM_DEV_TOKEN='' XLI_TOKEN='' + +# SDE curation pipeline +# All optional — defaults hold when unset. SDE_AWS_* are pipeline-scoped credentials +# for local dev ONLY (distinct from DJANGO_AWS_* static-assets credentials above); +# leave blank in AWS, where the instance role takes over. +# ------------------------------------------------------------------------------ +AWS_REGION='us-east-1' +SDE_S3_BUCKET='' +CRAWLER_INSTANCE_ID='' +CRAWLER_INBOX_PATH='/opt/sde-crawler/jobs/incoming' +SCRAPE_POLL_ENABLED=False +INFERENCE_ENABLED=False +SDE_AWS_ACCESS_KEY_ID='' +SDE_AWS_SECRET_ACCESS_KEY='' diff --git a/IMPLEMENTATION_PLAN.md b/IMPLEMENTATION_PLAN.md index b5d7ac76..ba018884 100644 --- a/IMPLEMENTATION_PLAN.md +++ b/IMPLEMENTATION_PLAN.md @@ -37,7 +37,7 @@ inference pipeline dormant, and a repeatable deploy path. |---|---| | Scope | Pipeline rewiring **+** the CI/CD machinery from `DEPLOYMENT.md` | | Sinequa | **Delete outright** (unwire first, then remove the files) | -| Indexing pipeline (chunk → SageMaker → AOSS) | **Deferred** — likely a different repo; this plan defines the contract only | +| Indexing pipeline (chunk → SageMaker → AOSS) | **Built as a `WEB_COSMOS` source inside `sde-api-scrapers`** (branch `web-indexing`) — supersedes the earlier "separate repo" call: the quantization math must stay byte-identical to what built the live index, so `uploader/` is reused, not forked. Event-triggered from COSMOS via cross-account `ecs:RunTask`. Its phases W0–W3 + W5 are **code-complete** (209 offline tests, `cdk synth` clean); this plan owns only the COSMOS side — its Phase 7 = that repo's **W4** | | Validation per phase | pytest with mocked AWS; manual smoke tests against the real `sde-dev` account | ### Decisions added after plan review (2026-08-11) — confirm with team @@ -46,6 +46,7 @@ inference pipeline dormant, and a repeatable deploy path. |---|---| | **Reindexing (re-scrape) flow** | `create_configs_on_status_change` has a second, `reindexing_status`-keyed block (`REINDEXING_FINISHED_ON_DEV → fetch_full_text`, `REINDEXING_CURATED → promote_to_curated`) that the original plan didn't account for — P6 deletes `fetch_full_text`, which would sever re-scrapes. **Rewire it onto the same dispatch/poll path**: dispatch on `REINDEXING_NEEDED_ON_DEV` (P3), poll it (P4), ingest flips to `REINDEXING_FINISHED_ON_DEV`, and the migrate task's existing `→ REINDEXING_READY_FOR_CURATION` transition takes over. Keep `REINDEXING_CURATED → promote_to_curated`. | | **Dispatch record & result freshness** | S3 objects persist between runs, so on any re-dispatch the poller would instantly "complete" against the **previous run's** output, and the stall timeout has nothing to measure from. Add a small **`ScrapeDispatch`** model (P3): `collection` FK, `dispatched_at`, `ssm_command_id`. `results_ready()` requires the S3 summary's `LastModified > dispatched_at`; the stall timeout is measured from `dispatched_at`. | +| **Web indexing pipeline: `WEB_COSMOS` in `sde-api-scrapers`, event-triggered** *(updated 2026-08-13 from the built `web-indexing` branch — supersedes the earlier separate-repo / container-env / `describe_tasks` sketch)* | The pipeline is a **`WEB_COSMOS` source inside `sde-api-scrapers`** (ECS Fargate: chunk → SageMaker vectorize → AOSS bulk upsert, `uploader/` reused with parameterized `chunk_field`/filtered scans; `schedule=None` in every env — fired only by COSMOS, per collection, the moment curation completes via the P5 triggers: `CURATED` → test, `QC_PERFECT`/`QC_MINOR` → prod). The hand-off is **S3 both ways** through a dedicated bucket `sde-cosmos-indexing-{env}`: COSMOS exports `CuratedUrl`s as `documents.jsonl` + `manifest.json` (manifest written **last** = export complete) under `curated_collections/{config_folder}/{run_id}/`, then assumes `CosmosIndexingDispatchRole-{env}` and calls `ecs:RunTask` with a **command override** (`--source WEB_COSMOS --collection --target test\|prod --run-id `). Completion is observed by **polling S3 `index_runs/{config_folder}/{run_id}/status.json`** (written by the indexer last and unconditionally, incl. on failure) — **not** `ecs.describe_tasks`; an **`IndexDispatch`** record (`collection`, `run_id`, `target`, `task_arn`, `dispatched_at`) provides the stall timeout, and the COSMOS-minted `run_id` namespaces every artifact, so no `LastModified` freshness rule is needed. No callback endpoint into COSMOS. | ### Hard constraints @@ -97,11 +98,15 @@ COSMOS/ │ │ ├── collection.py ✎ triggers rewired, Sinequa methods removed │ │ ├── collection_choice_fields.py ✎ statuses 21–26 │ │ ├── scraper_config.py ★ P3 ScraperConfigOverride + ScrapeDispatch +│ │ ├── indexing.py ★ P7 IndexDispatch │ │ └── delta_url.py ✔ UNCHANGED (hard constraint) │ ├── scraping/ ★ P3/P4 new subpackage │ │ ├── job_builder.py ★ build_job_json(collection) -> dict │ │ ├── ssm_dispatch.py ★ send_job_to_crawler(collection) │ │ └── s3_results.py ★ fetch summary + documents from S3 +│ ├── indexing/ ★ P7 new subpackage (mirrors sde-api-scrapers W4) +│ │ ├── export.py ★ export_curated_to_s3(collection, target, run_id) +│ │ └── dispatch.py ★ run_index_task(collection, target, run_id) │ ├── utils/ │ │ ├── aws.py ★ P0 get_boto3_session() — shared credential chain │ │ ├── slack_utils.py ✎ new transitions @@ -155,10 +160,11 @@ INFERENCE_ENABLED = env.bool("INFERENCE_ENABLED", default=False) # pipeline-scoped credentials for local dev ONLY; blank in AWS (instance role takes over) SDE_AWS_ACCESS_KEY_ID = env("SDE_AWS_ACCESS_KEY_ID", default="") SDE_AWS_SECRET_ACCESS_KEY = env("SDE_AWS_SECRET_ACCESS_KEY", default="") -# declared now, consumed by the deferred indexing phase + validate_deploy_env -OPENSEARCH_ENDPOINT_TEST = env("OPENSEARCH_ENDPOINT_TEST", default="") -OPENSEARCH_ENDPOINT_PROD = env("OPENSEARCH_ENDPOINT_PROD", default="") -SAGEMAKER_ENDPOINT_NAME = env("SAGEMAKER_ENDPOINT_NAME", default="") +# COSMOS never talks to OpenSearch or SageMaker: chunk/vectorize/index AND the QC validation +# report are produced by the WEB_COSMOS task in sde-api-scrapers (branch web-indexing), which +# holds the AOSS credentials. The P7 dispatch/poll settings — SDE_INDEX_BUCKET (distinct from +# SDE_S3_BUCKET), INDEXING_ECS_CLUSTER, INDEXING_TASK_FAMILY, INDEXING_DISPATCH_ROLE_ARN, +# INDEX_POLL_ENABLED — land with P7, all with defaults so config.settings.test keeps booting. ``` > **Naming note:** existing settings use the `DJANGO_AWS_*` prefix for the *static assets* @@ -201,10 +207,10 @@ chain when the `SDE_AWS_*` keys are blank (their `base.py` default, so no `overr gymnastics needed), and uses explicit keys when set (mock `boto3.Session`). ### Done when -- [ ] Settings added; `manage.py check` clean with all new vars unset (defaults hold) -- [ ] `get_boto3_session()` exists with tests -- [ ] Four rewiring docs committed -- [ ] Full existing test suite green +- [x] Settings added; `manage.py check` clean with all new vars unset (defaults hold) +- [x] `get_boto3_session()` exists with tests +- [x] Four rewiring docs committed +- [x] Full existing test suite green --- @@ -583,8 +589,16 @@ reindexing_status: > `old_workflow_status`) removes the extra query and the false-positive notification. In this phase `index_collection_to_test` / `index_collection_to_prod` are **stubs**: they set -`TEST_INDEXING` / `PRODUCTION_INDEXING`, log, and return. Phase 7 fills them in. Statuses 22/24/25/26 -are therefore defined and wired but not yet driven to completion. +`TEST_INDEXING` / `PRODUCTION_INDEXING`, log, and return. Statuses 22/24/25/26 are therefore +defined and wired but not yet driven to completion. + +These stubs are the **event-trigger seam for the `WEB_COSMOS` pipeline** (built in +`sde-api-scrapers`, branch `web-indexing` — see the decisions table). Phase 7 turns them into +export-then-dispatch tasks: mint a `run_id`, export the curated set to S3 +(`documents.jsonl` + `manifest.json`, manifest last), assume the dispatch role, and `ecs:RunTask` +with a command override (`--source WEB_COSMOS --collection --target test|prod +--run-id `) — they never index in-process. This is what replaces the api pipeline's +EventBridge schedule: indexing runs as soon as a collection is curated, not on a timer. ### Validation @@ -673,68 +687,141 @@ inherits `base.py`, so a lingering required var would mask a missed reference. --- -## Phase 7 — `[D]` DEFERRED: indexing pipeline (test + prod) - -**Deferred by decision** — this will likely live in a different repo. Do not implement now. -This section records the contract so the seam stays honest. - -### What is already decided -- Trigger points exist as stubs from Phase 5 (`index_collection_to_test`, `index_collection_to_prod`). -- Statuses 22/24/25/26 exist from Phase 1. -- Source of truth is `CuratedUrl` for the collection, with `public_visibility = true`. - -### What must be resolved before implementing - -1. **Where it runs.** Either (a) Celery tasks inside COSMOS, or (b) an external service that calls - back into COSMOS to set status. `IndexingInstructionsView` (deleted in P6) was Sinequa's - version of (b) and is the precedent for re-adding a narrow status-callback endpoint. -2. **Two things exist in neither sibling repo and must be authored:** - - the **AOSS web-document index mapping**, including `public_visibility`. - `sde-api-scrapers` has *no* mapping definition and *no* occurrence of `public_visibility` - anywhere in its history; indices are auto-created on first bulk write. The live dev `sde-web` - index already has a mapping (`public_visibility`, `vectorized_title` knn_vector, nested - `vectorized_full_text`, `collection_key`, `division`, `document_type`) — treat that as the - reference and pin it explicitly rather than relying on auto-creation. - - the **validation script** (Phase 8 below). -3. **Field-shape mismatches to bridge:** - - crawl4ai documents carry `full_text`; the `sde-api-scrapers` vectorizer is hardwired to - `data_product_desc` (`api_processor.py:87`, `sagemaker_vectorizer.py:135`). Either rename on - ingest or parameterise the vectorizer. - - crawl4ai documents have **no `id` and no `version`**, both required by the AOSS upsert/diff - logic. COSMOS must mint them — `id = f"/SDE/{config_folder}/|{url}"` (matching the existing - dev index convention) and a content hash for `version`. -4. **Reusable components** if porting: `uploader/text_chunker.py` (`nasa-impact/nasa-smd-ibm-st-v2`, - 250 tokens / 25 overlap), `uploader/sagemaker_vectorizer.py` (768-dim mean-pooled, then binary - quantisation with a seeded rotation matrix — *do not alter the quantisation*), - `uploader/opensearch_client.py` (`AWS4Auth`, service `"aoss"`, **not** `AWSV4SignerAuth`), - `uploader/api_opensearch_upload.py` (AOSS ignores custom `_id`, so upsert requires a lookup first). -5. **Dependencies this adds:** `opensearch-py`, `requests-aws4auth`, `numpy`, `transformers`/`tokenizers`. - Per `DEPLOYMENT.md`, the tokenizer must be **baked into the image** (`HF_HOME` + download step + - `HF_HUB_OFFLINE=1`), or the first indexing task on a fresh container fetches from HuggingFace on - the critical path of a Celery task. -6. **Deletion safety.** `sde-api-scrapers` aborts a run when deletions exceed 2% of the index - (`DELETION_ABORT_THRESHOLD`, added after a 2026-05-22 incident that wrongly deleted 1,359 - records). Any COSMOS indexing path that deletes must carry the same guard. +## Phase 7 — Indexing hand-off: export, dispatch, poll (= `sde-api-scrapers` Phase W4) + +**No longer "deferred until the pipeline exists" — the pipeline exists.** It landed as a +`WEB_COSMOS` source on the **`web-indexing` branch of `sde-api-scrapers`** (its phases W0 +foundations, W1 shared-component parameterization, W2 web pipeline, W3 infrastructure, and W5 tests +are code-complete: 209 offline tests green, `cdk synth` clean for dev/test/prod — but **nothing has +run against real AWS yet**, and all runtime defaults there target the disposable **`sde-web-copy`** +index until an explicit cutover). What remains here is exactly that repo's **Phase W4 — the +COSMOS side**: export, dispatch, poll, Slack. Authoritative docs on that branch: `DESIGN.md`, +`Web Indexing - Task Plan & Tracking.md`, `Update.md`, `open_questions.md` (decision record). + +**Still blocked on Phase 5** (the stubs this phase fills in). Everything indexer-side is +independent of COSMOS and is exercised from its own CLI against hand-written exports. + +### The contract (fixed by the built indexer — do not re-negotiate silently) + +1. **Export (COSMOS → S3).** Write to the dedicated bucket **`sde-cosmos-indexing-{env}`** + (cross-account; **not** the crawler's `SDE_S3_BUCKET`): + + ``` + curated_collections/{config_folder}/{run_id}/documents.jsonl + curated_collections/{config_folder}/{run_id}/manifest.json ← written LAST = "export complete" + ``` + + `run_id` is minted by COSMOS and threaded through every artifact. Each JSONL line: + `{url, title, full_text, document_type, division, tdamm_tag, is_metadata_viewer}` — per-URL + `division`/`document_type` only when they differ from the collection default. The manifest: + `{schema_version, run_id, collection_key (= config_folder), collection_name, division, target, + document_count, exported_at, cosmos_workflow_status}`. The indexer verifies line count against + `document_count` and skips deletions on mismatch, so the count must be exact. + +2. **Dispatch.** Assume **`CosmosIndexingDispatchRole-{env}`** (cross-account), then `ecs:RunTask` + with a **command override**: `--source WEB_COSMOS --collection {config_folder} + --target test|prod --run-id {run_id}`. (Not container-env overrides — the earlier + `COLLECTION_ID`/`TARGET` sketch is superseded. Target→endpoint resolution is tier-capped on the + indexer side, so a dev dispatch can never reach prod AOSS.) + +3. **Completion (S3 poll — not `ecs.describe_tasks`).** The indexer writes + `index_runs/{config_folder}/{run_id}/status.json` **last and unconditionally, including on + failure**; on `test` runs it also writes `validation.json` (count + title diff vs the manifest — + the WORKFLOW.md steps 22–25 QC report, produced indexer-side because only it holds AOSS + credentials). `status.json` carries `state ∈ succeeded|failed`, counts, `deletion_ratio`, + `deletion_mode` (deletes are **tombstones** — `public_visibility: false`, reversible), and a + machine-readable `error`: `export_not_found | export_incomplete | foreign_documents_in_scan | + scope_filter_ineffective | deletion_threshold_exceeded | deletion_budget_exceeded | + opensearch_error`. **Treat unknown `state` values as failure** — `needs_confirmation` is + reserved for future two-phase deletion. + +### What COSMOS must NOT do + +- **No `id`/`version` minting** — the indexer mints `id = /SDE/{config_folder}/|{url}` and a + content-hash `version` itself (`web/web_processor.py` is the sole owner of identity). COSMOS + exports raw curated fields only. +- **No AOSS, SageMaker, mapping, or deletion-guard concerns** — all live indexer-side. COSMOS gains + no ML or OpenSearch dependencies; only S3 writes, one `sts:AssumeRole`, and one `ecs:RunTask`. + +### Export traps (verified against the COSMOS models by the indexer team) + +- **`excluded` is a queryset annotation, not a field** — export with + `CuratedUrl.objects.filter(collection=c).exclude(excluded=True).iterator()`, or curator + exclusions get published. +- **`tdamm_tag` is a `PairedFieldDescriptor`** (manual over ML), not a column — `.values()` / + `.only()` on it fail; iterate instances. It is **exported but not indexed** (dropped by the + indexer's allow-list, excluded from its version hash, so a tag-only edit never re-vectorizes). +- `title = generated_title or scraped_title`, resolved at export time. +- `document_type` / `division` are **nullable ints** — resolve `DocumentTypes(v).label` / + `Divisions(v).label`, falling back to the collection's value. + +### Files (mirrors `sde-api-scrapers` W4.1–W4.7) + +| File | Change | +|---|---| +| `sde_collections/indexing/export.py` | **New.** `export_curated_to_s3(collection, target, run_id)` — stream `CuratedUrl`s per the traps above; write `documents.jsonl`, then `manifest.json` **last** | +| `sde_collections/indexing/dispatch.py` | **New.** `run_index_task(collection, target, run_id)` — assume the dispatch role, `ecs:RunTask` with the command override, return `taskArn` | +| `sde_collections/models/indexing.py` | **New** `IndexDispatch` (`collection` FK, `run_id`, `target`, `task_arn`, `dispatched_at`) — stall-timeout reference mirroring `ScrapeDispatch` (P3). Required because `CELERY_RESULT_BACKEND = None` means Celery task state cannot be polled | +| `sde_collections/tasks.py` | Fill the P5 stubs: `index_collection_to_test/prod` = mint `run_id` → export → dispatch → record `IndexDispatch` → set `TEST_INDEXING`/`PRODUCTION_INDEXING`. **New** `poll_index_runs()` | +| `sde_collections/signals.py` | `poll_index_runs` `PeriodicTask` every 2 min, gated on `INDEX_POLL_ENABLED` (same `post_migrate` pattern as P4's poller) | +| `sde_collections/utils/slack_utils.py` | Post `validation.json` to `sde-data-curation` (WORKFLOW.md step 24) | +| `config/settings/base.py` | `SDE_INDEX_BUCKET`, `INDEXING_ECS_CLUSTER`, `INDEXING_TASK_FAMILY`, `INDEXING_DISPATCH_ROLE_ARN`, `INDEX_POLL_ENABLED` — all **with defaults** so `config.settings.test` keeps booting | +| new migration | Creates `IndexDispatch` (additive) | + +`poll_index_runs` status mapping: `succeeded` + `test` → stay at `TEST_INDEXING`, post the +validation report to Slack, curator sets QC; `succeeded` + `prod` → `PROD_PERFECT` / `PROD_MINOR` +mirroring the QC status it entered with (WORKFLOW.md step 30); `failed`, unknown state, or stall +timeout (measured from `dispatched_at`) → `INDEXING_FAILED_ON_TEST` / `INDEXING_FAILED_ON_PROD`. +The `run_id` namespacing means an old run's `status.json` can never satisfy a newer dispatch — no +`LastModified` freshness rule needed (unlike the P4 crawler contract). + +### Cross-repo blockers (hand these over early — they gate the closed loop, not the coding) + +- [ ] **Give the `sde-api-scrapers` team the COSMOS AWS account id** (per environment). + `settings.COSMOS_AWS_ACCOUNT_ID` is empty there, and until it is filled the cross-account + bucket policy and `CosmosIndexingDispatchRole` are deliberately **not synthesized** — + dispatch cannot work. One dict entry + redeploy on their side; nothing else changes. +- [ ] Indexer stacks deployed to dev and the AOSS data-access policy granted (their OOB.2), plus + `version` added as `keyword` to live `sde-web` before cutover (their OOB.1). +- [ ] **Cutover awareness:** flipping the indexer's `WEB_INDEX_NAME` from `sde-web-copy` to + `sde-web` *is* the production cutover; COSMOS needs no change for it. Their open + id-scheme-collision finding (12 collections, incl. 100% of `gcn_circulars`) is an + indexer-side guard/repair — COSMOS is unaffected but should not onboard those collections + until it lands. + +### Validation + +New `sde_collections/tests/test_indexing_dispatch.py` (AWS mocked): export writes the manifest +last; excluded URLs absent from the JSONL; tdamm/label resolution correct; `document_count` exact; +dispatch records an `IndexDispatch` row; the poller maps every `status.json` state (including +unknown-state-as-failure) and enforces the stall timeout; a stale run's `status.json` never +completes a newer dispatch. ### Done when -- [D] Deferred — revisit once the target repo is chosen +- [ ] Export/dispatch/poll implemented per the contract; `IndexDispatch` migration applied +- [ ] P5 stubs replaced: a `CURATED` collection reaches `TEST_INDEXING`, and on `succeeded` the + validation report posts to Slack +- [ ] `QC_PERFECT`/`QC_MINOR` dispatches a prod run and lands on `PROD_PERFECT`/`PROD_MINOR` +- [ ] Failure/stall paths land on `INDEXING_FAILED_ON_TEST`/`INDEXING_FAILED_ON_PROD` +- [ ] Closed loop verified against dev (their E2E.10): Curated → export → `RunTask` → poller → Slack --- -## Phase 8 — `[D]` DEFERRED: validation script and QC reporting - -**Deferred with Phase 7** (it validates the index that Phase 7 writes). +## Phase 8 — QC reporting: resolved, folded into Phase 7 -Per WORKFLOW.md steps 22–25: compare **total document count** and **document titles** between the -test OpenSearch index and the collection's `CuratedUrl`s; post the result to the `sde-data-curation` -Slack channel; the curator then sets `QC: Perfect` / `QC: Minor Issues` / `QC: Failed`. +**The validation script no longer needs to be authored — the indexer produces it.** On every +`--target test` run, the `WEB_COSMOS` task writes `validation.json` +(`expected_count`, `indexed_count`, `count_matches`, `titles_missing_in_index`, +`titles_only_in_index`, `title_match_rate` — exactly the WORKFLOW.md steps 22–25 count/title +comparison) next to `status.json`. It lives indexer-side by design: the indexer already holds AOSS +credentials and COSMOS has none. Its counts exclude tombstoned documents. -Note the QC statuses are **curator-set from the report**, so COSMOS already has everything it needs -on the status side after Phase 1 — only the report itself is missing. Neither sibling repo contains -any count/title comparison tooling or Slack integration. +COSMOS's entire share of this phase is inside P7: `poll_index_runs` reads `validation.json` and +posts it to `sde-data-curation`. The QC statuses stay **curator-set from the report**, so nothing +else is needed on the status side after Phase 1. ### Done when -- [D] Deferred — follows Phase 7 +- [ ] Covered by P7's done-when (validation report posted to Slack on test runs) — no separate work --- @@ -755,8 +842,8 @@ clean host needs dummy Sinequa secrets to boot. | File | Content | |---|---| -| `sde_collections/management/commands/validate_deploy_env.py` | **New.** Fails if required settings are missing. Once the deferred search endpoints exist, it must also **refuse a host where `OPENSEARCH_ENDPOINT_TEST == OPENSEARCH_ENDPOINT_PROD`** (that would make the QC gate decorative) | -| `sde_collections/management/commands/preflight_aws.py` | **New.** SSM reachability to the crawler instance and S3 read on `SDE_S3_BUCKET`, using `get_boto3_session()` from P0. Reports each check independently rather than aborting on the first failure. AOSS/SageMaker checks are added with Phase 7, not now | +| `sde_collections/management/commands/validate_deploy_env.py` | **New.** Fails if required settings are missing. Once P7 lands, it must also require the indexing settings (`SDE_INDEX_BUCKET`, `INDEXING_ECS_CLUSTER`, `INDEXING_TASK_FAMILY`, `INDEXING_DISPATCH_ROLE_ARN`) non-empty on deployed hosts. (Test/prod endpoint separation is enforced **indexer-side** — its target→endpoint resolution is tier-capped — so COSMOS has no endpoint-equality check to make) | +| `sde_collections/management/commands/preflight_aws.py` | **New.** SSM reachability to the crawler instance and S3 read on `SDE_S3_BUCKET`, using `get_boto3_session()` from P0. Reports each check independently rather than aborting on the first failure. P7 adds checks on `SDE_INDEX_BUCKET` (write `curated_collections/*`, read `index_runs/*`) and an `sts:AssumeRole` on the dispatch role; COSMOS never gets AOSS/SageMaker access, so no such checks exist here | | `config/urls.py` + a `healthz` view | **New.** There is **no health endpoint in the repo today**; the deploy smoke checks need one. Minimal 200 + DB connectivity, unauthenticated | | `.pre-commit-config.yaml` | **Fix:** the gitleaks hook passes `--config=gitleaks-config.toml`, but that file does not exist and is not tracked — the hook fails instead of scanning. Add the config or drop the arg | | `scripts/deploy.sh` | **New.** The single definition of a deploy, in `DEPLOYMENT.md`'s order: fetch artifact → `validate_deploy_env` → backup (prod only) → `migrate` → `docker compose up -d` → smoke checks → rollback on failure | @@ -772,8 +859,8 @@ All `deploy-*` and `rollback` workflows gate on repo variable **`CD_ENABLED`**; they skip. > **Ordering matters:** `validate_deploy_env` runs *before* anything mutates. A host missing -> `OPENSEARCH_ENDPOINT_PROD` must fail there, not inside a Celery task that has already half-written -> an index. +> `INDEXING_DISPATCH_ROLE_ARN` must fail there, not inside a Celery task that has already exported +> a collection it can never dispatch. > **`celerybeat` must be recreated on every deploy.** The inference `PeriodicTask` rows (P2) and the > `poll_scrape_jobs` schedule (P4) are written by `post_migrate`; a beat process left running on the @@ -788,9 +875,8 @@ docker-compose -f local.yml run --rm django pytest sde_collections/tests/test_de bash -n scripts/deploy.sh && shellcheck scripts/deploy.sh ``` -Tests (AWS mocked): `validate_deploy_env` exits non-zero on a missing endpoint and on identical -test/prod endpoints; `preflight_aws` reports each check independently and does not abort on the -first failure. +Tests (AWS mocked): `validate_deploy_env` exits non-zero on any missing required setting; +`preflight_aws` reports each check independently and does not abort on the first failure. ### Manual verification 1. `aws ssm describe-instance-information --filters "Key=InstanceIds,Values=" --query 'InstanceInformationList[0].PingStatus'` → `Online` @@ -834,8 +920,10 @@ Then, against the dev AWS account: confirm a *new* `ScrapeDispatch` row, that the poller ignores the old S3 output until fresh results land, and that the collection reaches **Ready for Re-Curation**. -Steps beyond 8 (test indexing, validation, prod indexing) are **deferred** — status will stop at -`Test Indexing` until Phase 7 lands. +Steps beyond 8 (test indexing, validation, prod indexing) need **Phase 7**. The indexer side is +code-complete on `sde-api-scrapers`' `web-indexing` branch, but the closed loop additionally needs +the COSMOS AWS account id recorded there, its stacks deployed, and the AOSS data-access policy +granted. Until then status stops at `Test Indexing`. --- @@ -852,5 +940,9 @@ Steps beyond 8 (test indexing, validation, prod indexing) are **deferred** — s | Duplicate ingest from the 5-minute poller | Ingest claims via an atomic status CAS **before** writing (ingest can outrun the poll interval, and `BaseUrl.url` is globally unique — concurrent writes would `IntegrityError`); manual re-ingest stays idempotent by deleting `DumpUrl`s first | | Deleting Sinequa breaks unrelated GitHub metadata sync | P6 keeps `sync_with_production_webapp` (COSMOS prod webapp) and removes only the Sinequa-configs-repo paths | | `config/settings/test.py` inherits `base.py`, so stale env vars mask missed references | P6 validation runs with the deleted vars unset | +| **Cross-account dispatch silently unbuildable** — `sde-api-scrapers` has no COSMOS account id, so its bucket policy and `CosmosIndexingDispatchRole` are (deliberately) not synthesized | Hand the account id over as a P7 precondition — one dict entry (`settings.COSMOS_AWS_ACCOUNT_ID`) + redeploy on their side | +| Curator-excluded URLs published to search | P7 export uses `.exclude(excluded=True)` — `excluded` is a queryset annotation, not a field; test asserts exclusions never reach the JSONL | +| Truncated export read as a mass deletion | Indexer-side guard: line count vs `manifest.document_count` → `export_incomplete`, deletions skipped. COSMOS's job is writing the manifest **last** with an exact count | +| Stale `status.json` completes a newer index dispatch | Every artifact is namespaced by the COSMOS-minted `run_id` (`index_runs/{cf}/{run_id}/`), so cross-run staleness is structurally impossible — unlike the P4 crawler contract, which needs the `LastModified` freshness rule | | `factories.py:49` has a suspect `tracker = factory.Maybe("workflow_status")` | Watch during P1/P5 test rewrites; fix if it interferes with `FieldTracker` | | Migration rollback safety | All migrations here are additive (new model, choices-only `AlterField`); `DEPLOYMENT.md`'s "image rollback is a complete rollback" property holds | diff --git a/config/settings/base.py b/config/settings/base.py index 14e0ad28..1338596c 100644 --- a/config/settings/base.py +++ b/config/settings/base.py @@ -354,3 +354,19 @@ XLI_TOKEN = env("XLI_TOKEN") INFERENCE_API_URL = env("INFERENCE_API_URL", default="http://host.docker.internal:8000") TDAMM_CLASSIFICATION_THRESHOLD = env("TDAMM_CLASSIFICATION_THRESHOLD", default="0.5") + +# --- SDE curation pipeline --- +AWS_REGION = env("AWS_REGION", default="us-east-1") +SDE_S3_BUCKET = env("SDE_S3_BUCKET", default="") # crawler output bucket +CRAWLER_INSTANCE_ID = env("CRAWLER_INSTANCE_ID", default="") # i-0b6a61d95888886f4 on dev +CRAWLER_INBOX_PATH = env("CRAWLER_INBOX_PATH", default="/opt/sde-crawler/jobs/incoming") +SCRAPE_POLL_ENABLED = env.bool("SCRAPE_POLL_ENABLED", default=False) +INFERENCE_ENABLED = env.bool("INFERENCE_ENABLED", default=False) +# pipeline-scoped credentials for local dev ONLY; blank in AWS (instance role takes over) +SDE_AWS_ACCESS_KEY_ID = env("SDE_AWS_ACCESS_KEY_ID", default="") +SDE_AWS_SECRET_ACCESS_KEY = env("SDE_AWS_SECRET_ACCESS_KEY", default="") +# COSMOS never talks to OpenSearch or SageMaker: chunk/vectorize/index AND the QC validation +# report are produced by the WEB_COSMOS task in sde-api-scrapers (branch web-indexing), which +# holds the AOSS credentials. The P7 dispatch/poll settings — SDE_INDEX_BUCKET (distinct from +# SDE_S3_BUCKET), INDEXING_ECS_CLUSTER, INDEXING_TASK_FAMILY, INDEXING_DISPATCH_ROLE_ARN, +# INDEX_POLL_ENABLED — land with P7, all with defaults so config.settings.test keeps booting. diff --git a/sde_collections/tests/test_aws_utils.py b/sde_collections/tests/test_aws_utils.py new file mode 100644 index 00000000..201b8499 --- /dev/null +++ b/sde_collections/tests/test_aws_utils.py @@ -0,0 +1,46 @@ +# docker-compose -f local.yml run --rm django pytest sde_collections/tests/test_aws_utils.py + +from unittest.mock import patch + +from django.test import override_settings + +from ..utils.aws import get_boto3_session + + +class TestGetBoto3Session: + def test_default_chain_when_sde_keys_blank(self): + """With the SDE_AWS_* keys at their blank base.py defaults, the session must use the + default credential chain (instance role in AWS) — no explicit keys passed.""" + with patch("sde_collections.utils.aws.boto3.Session") as mock_session: + session = get_boto3_session() + + mock_session.assert_called_once_with(region_name="us-east-1") + assert session is mock_session.return_value + + @override_settings(SDE_AWS_ACCESS_KEY_ID="AKIATEST", SDE_AWS_SECRET_ACCESS_KEY="secret") + def test_explicit_keys_when_set(self): + with patch("sde_collections.utils.aws.boto3.Session") as mock_session: + session = get_boto3_session() + + mock_session.assert_called_once_with( + aws_access_key_id="AKIATEST", + aws_secret_access_key="secret", + region_name="us-east-1", + ) + assert session is mock_session.return_value + + @override_settings(SDE_AWS_ACCESS_KEY_ID="AKIATEST", SDE_AWS_SECRET_ACCESS_KEY="") + def test_partial_keys_fall_back_to_default_chain(self): + """One key without the other is a misconfiguration — fall back to the default chain + rather than passing an incomplete credential pair to boto3.""" + with patch("sde_collections.utils.aws.boto3.Session") as mock_session: + get_boto3_session() + + mock_session.assert_called_once_with(region_name="us-east-1") + + @override_settings(AWS_REGION="us-west-2") + def test_region_comes_from_settings(self): + with patch("sde_collections.utils.aws.boto3.Session") as mock_session: + get_boto3_session() + + mock_session.assert_called_once_with(region_name="us-west-2") diff --git a/sde_collections/utils/aws.py b/sde_collections/utils/aws.py new file mode 100644 index 00000000..161e7c29 --- /dev/null +++ b/sde_collections/utils/aws.py @@ -0,0 +1,17 @@ +import boto3 +from django.conf import settings + + +def get_boto3_session(): + """Default credential chain (instance role in AWS); explicit SDE keys only if set (local dev). + + Deliberately does NOT read the DJANGO_AWS_* / AWS_ACCESS_KEY_ID settings — those are the + django-storages static-assets credentials, a different scope (and absent under test settings). + """ + if settings.SDE_AWS_ACCESS_KEY_ID and settings.SDE_AWS_SECRET_ACCESS_KEY: + return boto3.Session( + aws_access_key_id=settings.SDE_AWS_ACCESS_KEY_ID, + aws_secret_access_key=settings.SDE_AWS_SECRET_ACCESS_KEY, + region_name=settings.AWS_REGION, + ) + return boto3.Session(region_name=settings.AWS_REGION) From 57674de18ca840e875dea6f9b1ea69a858c0929f Mon Sep 17 00:00:00 2001 From: Bernard Benson Date: Thu, 13 Aug 2026 14:49:24 -0500 Subject: [PATCH 03/20] =?UTF-8?q?Phase=201=20=E2=80=94=20Workflow=20status?= =?UTF-8?q?es=20and=20Slack=20transitions=20updates?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- IMPLEMENTATION_PLAN.md | 10 +- ...ter_collection_workflow_status_and_more.py | 143 ++++++++++++++++++ .../models/README_STATUS_TRIGGERS.md | 18 +++ sde_collections/models/collection.py | 14 +- .../models/collection_choice_fields.py | 6 + .../tests/test_workflow_status_triggers.py | 62 ++++++++ sde_collections/utils/slack_utils.py | 36 +++++ .../static/js/collection_list.js | 10 ++ 8 files changed, 290 insertions(+), 9 deletions(-) create mode 100644 sde_collections/migrations/0078_alter_collection_workflow_status_and_more.py diff --git a/IMPLEMENTATION_PLAN.md b/IMPLEMENTATION_PLAN.md index ba018884..04e555da 100644 --- a/IMPLEMENTATION_PLAN.md +++ b/IMPLEMENTATION_PLAN.md @@ -278,11 +278,11 @@ New tests in `sde_collections/tests/test_workflow_status_triggers.py`: and the detail page **Workflow History** tab shows the transition. ### Done when -- [ ] Six statuses added, migration applied -- [ ] Both Python colour maps use `.get(...)` with a default; JS map covers 1–26 -- [ ] Slack map has the four new transitions -- [ ] Parametrised colour test passes for every enum member -- [ ] Dropdowns/filters render all statuses with no JS console errors +- [x] Six statuses added, migration applied +- [x] Both Python colour maps use `.get(...)` with a default; JS map covers 1–26 +- [x] Slack map has the four new transitions +- [x] Parametrised colour test passes for every enum member +- [x] Dropdowns/filters render all statuses with no JS console errors --- diff --git a/sde_collections/migrations/0078_alter_collection_workflow_status_and_more.py b/sde_collections/migrations/0078_alter_collection_workflow_status_and_more.py new file mode 100644 index 00000000..feb86005 --- /dev/null +++ b/sde_collections/migrations/0078_alter_collection_workflow_status_and_more.py @@ -0,0 +1,143 @@ +# Generated by Django 4.2.9 on 2026-08-13 19:22 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("sde_collections", "0077_alter_candidateurl_tdamm_tag_manual_and_more"), + ] + + operations = [ + migrations.AlterField( + model_name="collection", + name="workflow_status", + field=models.IntegerField( + choices=[ + (1, "Research in Progress"), + (2, "Ready for Engineering"), + (3, "Engineering in Progress"), + (4, "Ready for Curation"), + (5, "Curation in Progress"), + (6, "Curated"), + (7, "Quality Fixed"), + (8, "Secret Deployment Started"), + (9, "Secret Deployment Failed"), + (10, "Ready for LRM Quality Check"), + (11, "Ready for Quality Check"), + (12, "QC: Failed"), + (18, "QC: Minor Issues"), + (13, "QC: Perfect"), + (14, "Prod: Perfect"), + (15, "Prod: Minor Issues"), + (16, "Prod: Major Issues"), + (17, "Code Merge Pending"), + (19, "Delete from Prod"), + (20, "Indexing Finished on LRM Dev"), + (21, "Scraping Successful"), + (22, "Test Indexing"), + (23, "Scraping Failed"), + (24, "Indexing Failed on Test"), + (25, "Indexing Failed on Prod"), + (26, "Production Indexing"), + ], + default=1, + ), + ), + migrations.AlterField( + model_name="deltadivisionpattern", + name="match_pattern_type", + field=models.IntegerField(choices=[(1, "Individual URL Pattern"), (2, "Multi-URL Pattern")], default=2), + ), + migrations.AlterField( + model_name="deltadocumenttypepattern", + name="match_pattern_type", + field=models.IntegerField(choices=[(1, "Individual URL Pattern"), (2, "Multi-URL Pattern")], default=2), + ), + migrations.AlterField( + model_name="deltaexcludepattern", + name="match_pattern_type", + field=models.IntegerField(choices=[(1, "Individual URL Pattern"), (2, "Multi-URL Pattern")], default=2), + ), + migrations.AlterField( + model_name="deltaincludepattern", + name="match_pattern_type", + field=models.IntegerField(choices=[(1, "Individual URL Pattern"), (2, "Multi-URL Pattern")], default=2), + ), + migrations.AlterField( + model_name="deltatitlepattern", + name="match_pattern_type", + field=models.IntegerField(choices=[(1, "Individual URL Pattern"), (2, "Multi-URL Pattern")], default=2), + ), + migrations.AlterField( + model_name="workflowhistory", + name="old_status", + field=models.IntegerField( + choices=[ + (1, "Research in Progress"), + (2, "Ready for Engineering"), + (3, "Engineering in Progress"), + (4, "Ready for Curation"), + (5, "Curation in Progress"), + (6, "Curated"), + (7, "Quality Fixed"), + (8, "Secret Deployment Started"), + (9, "Secret Deployment Failed"), + (10, "Ready for LRM Quality Check"), + (11, "Ready for Quality Check"), + (12, "QC: Failed"), + (18, "QC: Minor Issues"), + (13, "QC: Perfect"), + (14, "Prod: Perfect"), + (15, "Prod: Minor Issues"), + (16, "Prod: Major Issues"), + (17, "Code Merge Pending"), + (19, "Delete from Prod"), + (20, "Indexing Finished on LRM Dev"), + (21, "Scraping Successful"), + (22, "Test Indexing"), + (23, "Scraping Failed"), + (24, "Indexing Failed on Test"), + (25, "Indexing Failed on Prod"), + (26, "Production Indexing"), + ], + null=True, + ), + ), + migrations.AlterField( + model_name="workflowhistory", + name="workflow_status", + field=models.IntegerField( + choices=[ + (1, "Research in Progress"), + (2, "Ready for Engineering"), + (3, "Engineering in Progress"), + (4, "Ready for Curation"), + (5, "Curation in Progress"), + (6, "Curated"), + (7, "Quality Fixed"), + (8, "Secret Deployment Started"), + (9, "Secret Deployment Failed"), + (10, "Ready for LRM Quality Check"), + (11, "Ready for Quality Check"), + (12, "QC: Failed"), + (18, "QC: Minor Issues"), + (13, "QC: Perfect"), + (14, "Prod: Perfect"), + (15, "Prod: Minor Issues"), + (16, "Prod: Major Issues"), + (17, "Code Merge Pending"), + (19, "Delete from Prod"), + (20, "Indexing Finished on LRM Dev"), + (21, "Scraping Successful"), + (22, "Test Indexing"), + (23, "Scraping Failed"), + (24, "Indexing Failed on Test"), + (25, "Indexing Failed on Prod"), + (26, "Production Indexing"), + ], + default=1, + ), + ), + ] diff --git a/sde_collections/models/README_STATUS_TRIGGERS.md b/sde_collections/models/README_STATUS_TRIGGERS.md index 8f8b8397..ed96bc73 100644 --- a/sde_collections/models/README_STATUS_TRIGGERS.md +++ b/sde_collections/models/README_STATUS_TRIGGERS.md @@ -59,6 +59,24 @@ The full text import process integrates with both workflows: - In main workflow: Updates to `READY_FOR_CURATION` - In reindexing: Updates to `REINDEXING_READY_FOR_CURATION` +## New Pipeline Statuses (crawl4ai scraper + web indexing) + +Statuses 21–26 support the Sinequa-replacement pipeline (see `WORKFLOW.md`). As of Phase 1 +they are selectable and rendered everywhere; their triggers land in later phases (P3–P7): + +- `SCRAPING_SUCCESSFUL` (21) — set by the ingest task when fresh scrape results with + `documents_scraped > 0` are ingested from S3. +- `TEST_INDEXING` (22) — in-flight: curated content is being indexed to OpenSearch test. +- `SCRAPING_FAILED` (23) — scrape produced zero documents, the SSM dispatch failed, or the + job stalled past the timeout. +- `INDEXING_FAILED_ON_TEST` (24) — the test-indexing run reported failure. +- `INDEXING_FAILED_ON_PROD` (25) — the prod-indexing run reported failure. +- `PRODUCTION_INDEXING` (26) — in-flight: curated content is being indexed to OpenSearch prod. + +Failure statuses (23–25) render `btn-danger`; in-flight statuses (22, 26) render `btn-light`. +Both Python colour maps fall back to `btn-light` for unmapped values instead of raising +`KeyError`. + ## Key Models and Files - `Collection`: Main model handling status transitions diff --git a/sde_collections/models/collection.py b/sde_collections/models/collection.py index 097c5ce7..63b4145c 100644 --- a/sde_collections/models/collection.py +++ b/sde_collections/models/collection.py @@ -354,9 +354,12 @@ def workflow_status_button_color(self) -> str: 20: "btn-info", 21: "btn-success", 22: "btn-light", - 23: "btn-light", + 23: "btn-danger", + 24: "btn-danger", + 25: "btn-danger", + 26: "btn-light", } - return color_choices[self.workflow_status] + return color_choices.get(self.workflow_status, "btn-light") @property def reindexing_status_button_color(self) -> str: @@ -818,9 +821,12 @@ def workflow_status_button_color(self) -> str: 20: "btn-info", 21: "btn-success", 22: "btn-light", - 23: "btn-light", + 23: "btn-danger", + 24: "btn-danger", + 25: "btn-danger", + 26: "btn-light", } - return color_choices[self.workflow_status] + return color_choices.get(self.workflow_status, "btn-light") @receiver(post_save, sender=Collection) diff --git a/sde_collections/models/collection_choice_fields.py b/sde_collections/models/collection_choice_fields.py index a433317a..7f0ab8dd 100644 --- a/sde_collections/models/collection_choice_fields.py +++ b/sde_collections/models/collection_choice_fields.py @@ -98,6 +98,12 @@ class WorkflowStatusChoices(models.IntegerChoices): MERGE_PENDING = 17, "Code Merge Pending" NEEDS_DELETE = 19, "Delete from Prod" INDEXING_FINISHED_ON_DEV = 20, "Indexing Finished on LRM Dev" + SCRAPING_SUCCESSFUL = 21, "Scraping Successful" + TEST_INDEXING = 22, "Test Indexing" + SCRAPING_FAILED = 23, "Scraping Failed" + INDEXING_FAILED_ON_TEST = 24, "Indexing Failed on Test" + INDEXING_FAILED_ON_PROD = 25, "Indexing Failed on Prod" + PRODUCTION_INDEXING = 26, "Production Indexing" class ReindexingStatusChoices(models.IntegerChoices): diff --git a/sde_collections/tests/test_workflow_status_triggers.py b/sde_collections/tests/test_workflow_status_triggers.py index b66ff0f6..29dd6c8c 100644 --- a/sde_collections/tests/test_workflow_status_triggers.py +++ b/sde_collections/tests/test_workflow_status_triggers.py @@ -6,6 +6,7 @@ from django.db import transaction from django.test import TestCase, TransactionTestCase +from sde_collections.models.collection import Collection, WorkflowHistory from sde_collections.models.collection_choice_fields import ( ReindexingStatusChoices, WorkflowStatusChoices, @@ -481,3 +482,64 @@ def test_full_text_fetch_failure_handling(self, MockApi): # Verify status wasn't changed on error self.collection.refresh_from_db() assert self.collection.workflow_status == initial_status + + +NEW_PIPELINE_STATUSES = [ + WorkflowStatusChoices.SCRAPING_SUCCESSFUL, + WorkflowStatusChoices.TEST_INDEXING, + WorkflowStatusChoices.SCRAPING_FAILED, + WorkflowStatusChoices.INDEXING_FAILED_ON_TEST, + WorkflowStatusChoices.INDEXING_FAILED_ON_PROD, + WorkflowStatusChoices.PRODUCTION_INDEXING, +] + +VALID_BUTTON_COLORS = { + "btn-light", + "btn-danger", + "btn-warning", + "btn-info", + "btn-success", + "btn-primary", + "btn-secondary", +} + + +@pytest.mark.parametrize("status", list(WorkflowStatusChoices)) +def test_collection_button_color_resolves_for_every_status(status): + """Regression guard: an unmapped status used to raise KeyError and break the + collection list and detail pages. Every enum member must resolve a colour.""" + collection = Collection(workflow_status=status) + assert collection.workflow_status_button_color in VALID_BUTTON_COLORS + + +@pytest.mark.parametrize("status", list(WorkflowStatusChoices)) +def test_workflow_history_button_color_resolves_for_every_status(status): + history = WorkflowHistory(workflow_status=status) + assert history.workflow_status_button_color in VALID_BUTTON_COLORS + + +def test_unmapped_status_falls_back_to_default_color(): + assert Collection(workflow_status=999).workflow_status_button_color == "btn-light" + assert WorkflowHistory(workflow_status=999).workflow_status_button_color == "btn-light" + + +@pytest.mark.parametrize( + "status", + [ + WorkflowStatusChoices.SCRAPING_FAILED, + WorkflowStatusChoices.INDEXING_FAILED_ON_TEST, + WorkflowStatusChoices.INDEXING_FAILED_ON_PROD, + ], +) +def test_failure_statuses_do_not_render_neutral(status): + assert Collection(workflow_status=status).workflow_status_button_color == "btn-danger" + assert WorkflowHistory(workflow_status=status).workflow_status_button_color == "btn-danger" + + +@pytest.mark.django_db +@pytest.mark.parametrize("status", NEW_PIPELINE_STATUSES) +def test_setting_new_status_writes_workflow_history(status): + collection = CollectionFactory() + collection.workflow_status = status + collection.save() + assert WorkflowHistory.objects.filter(collection=collection, workflow_status=status).exists() diff --git a/sde_collections/utils/slack_utils.py b/sde_collections/utils/slack_utils.py index 292ef897..f1f84026 100644 --- a/sde_collections/utils/slack_utils.py +++ b/sde_collections/utils/slack_utils.py @@ -46,6 +46,42 @@ "message": "{name} is now live on Public Prod! Congrats team! :sparkles:", "mention_users": ["channel"], }, + # --- SDE curation pipeline (crawl4ai scraper + web indexing) --- + # Detailed scrape counts are posted separately via send_detailed_import_notification on ingest. + (WorkflowStatusChoices.READY_FOR_ENGINEERING, WorkflowStatusChoices.SCRAPING_SUCCESSFUL): { + "message": "Scraping of {name} finished successfully. Ingest and delta migration underway! :white_check_mark:", + }, + (WorkflowStatusChoices.ENGINEERING_IN_PROGRESS, WorkflowStatusChoices.SCRAPING_SUCCESSFUL): { + "message": "Scraping of {name} finished successfully. Ingest and delta migration underway! :white_check_mark:", + }, + (WorkflowStatusChoices.READY_FOR_ENGINEERING, WorkflowStatusChoices.SCRAPING_FAILED): { + "message": "Alert: Scraping of {name} has failed! :warning:", + "mention_users": ["Shravan Vishwanathan", "Advait Yogaonkar"], + }, + (WorkflowStatusChoices.ENGINEERING_IN_PROGRESS, WorkflowStatusChoices.SCRAPING_FAILED): { + "message": "Alert: Scraping of {name} has failed! :warning:", + "mention_users": ["Shravan Vishwanathan", "Advait Yogaonkar"], + }, + (WorkflowStatusChoices.CURATED, WorkflowStatusChoices.INDEXING_FAILED_ON_TEST): { + "message": "Alert: Indexing of {name} on Test has failed! :warning:", + }, + (WorkflowStatusChoices.TEST_INDEXING, WorkflowStatusChoices.INDEXING_FAILED_ON_TEST): { + "message": "Alert: Indexing of {name} on Test has failed! :warning:", + }, + # INDEXING_FAILED_ON_PROD can be reached from any of the prod hand-off statuses; + # the lookup is exact (old, new) pairs, so each realistic predecessor is listed. + (WorkflowStatusChoices.PRODUCTION_INDEXING, WorkflowStatusChoices.INDEXING_FAILED_ON_PROD): { + "message": "Alert: Indexing of {name} on Prod has failed! :warning:", + "mention_users": ["Shravan Vishwanathan", "Advait Yogaonkar"], + }, + (WorkflowStatusChoices.QUALITY_CHECK_PERFECT, WorkflowStatusChoices.INDEXING_FAILED_ON_PROD): { + "message": "Alert: Indexing of {name} on Prod has failed! :warning:", + "mention_users": ["Shravan Vishwanathan", "Advait Yogaonkar"], + }, + (WorkflowStatusChoices.QUALITY_CHECK_MINOR, WorkflowStatusChoices.INDEXING_FAILED_ON_PROD): { + "message": "Alert: Indexing of {name} on Prod has failed! :warning:", + "mention_users": ["Shravan Vishwanathan", "Advait Yogaonkar"], + }, } diff --git a/sde_indexing_helper/static/js/collection_list.js b/sde_indexing_helper/static/js/collection_list.js index 7eb5c7bf..a29536b8 100644 --- a/sde_indexing_helper/static/js/collection_list.js +++ b/sde_indexing_helper/static/js/collection_list.js @@ -331,6 +331,16 @@ function handleWorkflowStatusSelect() { 14: "btn-primary", 15: "btn-info", 16: "btn-secondary", + 17: "btn-light", + 18: "btn-success", + 19: "btn-warning", + 20: "btn-info", + 21: "btn-success", + 22: "btn-light", + 23: "btn-danger", + 24: "btn-danger", + 25: "btn-danger", + 26: "btn-light", }; $possible_buttons = $("body").find( From 93fbeb1b9a80d1149363155c6e643be996466573 Mon Sep 17 00:00:00 2001 From: Bernard Benson Date: Thu, 13 Aug 2026 14:55:25 -0500 Subject: [PATCH 04/20] =?UTF-8?q?Phase=202=20=E2=80=94=20Disable=20the=20i?= =?UTF-8?q?nference=20pipeline=20(do=20not=20delete)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- IMPLEMENTATION_PLAN.md | 6 +- inference/signals.py | 7 ++ inference/tasks.py | 6 ++ sde_collections/models/collection.py | 8 ++ sde_collections/tests/test_inference_flag.py | 105 +++++++++++++++++++ 5 files changed, 129 insertions(+), 3 deletions(-) create mode 100644 sde_collections/tests/test_inference_flag.py diff --git a/IMPLEMENTATION_PLAN.md b/IMPLEMENTATION_PLAN.md index 04e555da..831eccae 100644 --- a/IMPLEMENTATION_PLAN.md +++ b/IMPLEMENTATION_PLAN.md @@ -338,9 +338,9 @@ New tests: → both `False`. Confirm `celerybeat` logs show no inference ticks over ~10 min. ### Done when -- [ ] Flag added and honoured at all three sites -- [ ] TDAMM collections still migrate to `Ready for Curation` with inference off -- [ ] `PeriodicTask.enabled` survives a re-run of `migrate` +- [x] Flag added and honoured at all three sites +- [x] TDAMM collections still migrate to `Ready for Curation` with inference off +- [x] `PeriodicTask.enabled` survives a re-run of `migrate` --- diff --git a/inference/signals.py b/inference/signals.py index 89e83f70..337f8491 100644 --- a/inference/signals.py +++ b/inference/signals.py @@ -1,3 +1,4 @@ +from django.conf import settings from django.db.models.signals import post_migrate from django.dispatch import receiver @@ -34,11 +35,15 @@ def create_periodic_tasks(sender, **kwargs): crontab=weekday_crontab, name=weekday_task_name, task="inference.tasks.process_inference_job_queue", + enabled=settings.INFERENCE_ENABLED, ) else: weekday_task = PeriodicTask.objects.get(name=weekday_task_name) weekday_task.crontab = weekday_crontab weekday_task.task = "inference.tasks.process_inference_job_queue" + # Re-asserted on every migrate so the flag, not a hand-edit in the admin, + # is the source of truth — a manual disable would not survive a deploy. + weekday_task.enabled = settings.INFERENCE_ENABLED weekday_task.save() # Check if weekend task exists @@ -50,9 +55,11 @@ def create_periodic_tasks(sender, **kwargs): crontab=weekend_crontab, name=weekend_task_name, task="inference.tasks.process_inference_job_queue", + enabled=settings.INFERENCE_ENABLED, ) else: weekend_task = PeriodicTask.objects.get(name=weekend_task_name) weekend_task.crontab = weekend_crontab weekend_task.task = "inference.tasks.process_inference_job_queue" + weekend_task.enabled = settings.INFERENCE_ENABLED weekend_task.save() diff --git a/inference/tasks.py b/inference/tasks.py index cba5b43f..92334dff 100644 --- a/inference/tasks.py +++ b/inference/tasks.py @@ -1,5 +1,6 @@ # inference/tasks.py from celery import shared_task +from django.conf import settings from inference.models import InferenceJob, InferenceJobStatus from inference.utils.advisory_lock import AdvisoryLock @@ -11,6 +12,11 @@ def process_inference_job_queue(): Main job queue processor that runs every 5 minutes between 6pm-7am. Uses Postgres advisory locking to ensure only one instance runs at a time. """ + # Belt and braces: the beat rows are disabled when the flag is off, but a manually + # enabled row or ad-hoc invocation must not process the queue either. + if not settings.INFERENCE_ENABLED: + return "Inference pipeline disabled (INFERENCE_ENABLED=False)" + lock = AdvisoryLock("inference_queue_lock") with lock.hold() as acquired: diff --git a/sde_collections/models/collection.py b/sde_collections/models/collection.py index 63b4145c..ed13deca 100644 --- a/sde_collections/models/collection.py +++ b/sde_collections/models/collection.py @@ -4,6 +4,7 @@ import requests from django.apps import apps +from django.conf import settings from django.contrib.auth import get_user_model from django.contrib.contenttypes.models import ContentType from django.db import models @@ -694,6 +695,13 @@ def generate_inference_job(self, classification_type): def queue_necessary_classifications(self): """Check if collection needs classification and queue jobs if needed""" + if not settings.INFERENCE_ENABLED: + # Inference pipeline is dormant: never create an InferenceJob (it would queue + # forever and strand the collection before Ready for Curation) — go straight + # to migration for every collection, including the TDAMM-listed ones. + migrate_dump_to_delta_and_handle_status_transistions.delay(self.id) + return + tdamm_collections = [ "imagine_the_universe", "physics_of_the_cosmos", diff --git a/sde_collections/tests/test_inference_flag.py b/sde_collections/tests/test_inference_flag.py new file mode 100644 index 00000000..0c0c4ed1 --- /dev/null +++ b/sde_collections/tests/test_inference_flag.py @@ -0,0 +1,105 @@ +# docker-compose -f local.yml run --rm django pytest sde_collections/tests/test_inference_flag.py + +from types import SimpleNamespace +from unittest.mock import patch + +import pytest +from django.test import override_settings + +from inference.models import InferenceJob +from inference.signals import create_periodic_tasks +from inference.tasks import process_inference_job_queue +from sde_collections.models.collection import Collection +from sde_collections.tests.factories import CollectionFactory + +TDAMM_FOLDER = "imagine_the_universe" + +# These tests call the REAL queue_necessary_classifications (patching only the migration +# task's delay) — patching the whole method, as the older trigger tests do, would guard +# nothing about the flag behaviour. + + +def _collection_with_folder(config_folder): + collection = CollectionFactory() + Collection.objects.filter(id=collection.id).update(config_folder=config_folder) + collection.refresh_from_db() + return collection + + +@pytest.mark.django_db +@override_settings(INFERENCE_ENABLED=False) +@patch("sde_collections.models.collection.migrate_dump_to_delta_and_handle_status_transistions.delay") +def test_tdamm_collection_migrates_directly_when_inference_disabled(mock_migrate): + """Regression guard: with the flag off, a TDAMM-listed collection must NOT get an + InferenceJob (it would queue forever and never reach Ready for Curation).""" + collection = _collection_with_folder(TDAMM_FOLDER) + + collection.queue_necessary_classifications() + + mock_migrate.assert_called_once_with(collection.id) + assert not InferenceJob.objects.filter(collection=collection).exists() + + +@pytest.mark.django_db +@override_settings(INFERENCE_ENABLED=False) +@patch("sde_collections.models.collection.migrate_dump_to_delta_and_handle_status_transistions.delay") +def test_regular_collection_migrates_directly_when_inference_disabled(mock_migrate): + collection = _collection_with_folder("some_regular_collection") + + collection.queue_necessary_classifications() + + mock_migrate.assert_called_once_with(collection.id) + assert not InferenceJob.objects.filter(collection=collection).exists() + + +@pytest.mark.django_db +@override_settings(INFERENCE_ENABLED=True) +@patch("sde_collections.models.collection.migrate_dump_to_delta_and_handle_status_transistions.delay") +def test_tdamm_collection_creates_inference_job_when_enabled(mock_migrate): + collection = _collection_with_folder(TDAMM_FOLDER) + + collection.queue_necessary_classifications() + + assert InferenceJob.objects.filter(collection=collection).exists() + mock_migrate.assert_not_called() + + +def _run_post_migrate_handler(): + create_periodic_tasks(sender=SimpleNamespace(name="inference")) + + +@pytest.mark.django_db +@pytest.mark.parametrize("flag", [False, True]) +def test_periodic_task_rows_follow_the_flag(flag): + from django_celery_beat.models import PeriodicTask + + with override_settings(INFERENCE_ENABLED=flag): + _run_post_migrate_handler() + + rows = PeriodicTask.objects.filter(task="inference.tasks.process_inference_job_queue") + assert rows.count() == 2 + assert all(row.enabled is flag for row in rows) + + +@pytest.mark.django_db +@override_settings(INFERENCE_ENABLED=False) +def test_periodic_task_disable_survives_re_migrate(): + """A hand-enable in the admin must not survive a deploy's migrate step: the signal + re-asserts enabled from the flag on every post_migrate.""" + from django_celery_beat.models import PeriodicTask + + _run_post_migrate_handler() + PeriodicTask.objects.filter(task="inference.tasks.process_inference_job_queue").update(enabled=True) + + _run_post_migrate_handler() + + rows = PeriodicTask.objects.filter(task="inference.tasks.process_inference_job_queue") + assert rows.count() == 2 + assert all(row.enabled is False for row in rows) + + +@override_settings(INFERENCE_ENABLED=False) +def test_process_inference_job_queue_short_circuits_when_disabled(): + """Belt and braces: even a manually-triggered run must refuse to process the queue. + (No django_db marker: the early return must not touch the database at all.)""" + assert process_inference_job_queue() == "Inference pipeline disabled (INFERENCE_ENABLED=False)" From aef832af1b94bc54a39fe2bd7004750a4b474653 Mon Sep 17 00:00:00 2001 From: Bernard Benson Date: Thu, 13 Aug 2026 15:17:36 -0500 Subject: [PATCH 05/20] =?UTF-8?q?Phase=203=20=E2=80=94=20Scrape=20dispatch?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- IMPLEMENTATION_PLAN.md | 10 +- sde_collections/admin.py | 36 ++++++ .../management/commands/dispatch_scrape.py | 27 ++++ ...79_scraperconfigoverride_scrapedispatch.py | 62 +++++++++ sde_collections/models/__init__.py | 3 + sde_collections/models/collection.py | 9 +- sde_collections/models/scraper_config.py | 50 ++++++++ sde_collections/scraping/__init__.py | 0 sde_collections/scraping/job_builder.py | 38 ++++++ sde_collections/scraping/ssm_dispatch.py | 35 +++++ sde_collections/tasks.py | 26 ++++ sde_collections/tests/test_scrape_dispatch.py | 120 ++++++++++++++++++ .../tests/test_workflow_status_triggers.py | 30 ++--- 13 files changed, 417 insertions(+), 29 deletions(-) create mode 100644 sde_collections/management/commands/dispatch_scrape.py create mode 100644 sde_collections/migrations/0079_scraperconfigoverride_scrapedispatch.py create mode 100644 sde_collections/models/scraper_config.py create mode 100644 sde_collections/scraping/__init__.py create mode 100644 sde_collections/scraping/job_builder.py create mode 100644 sde_collections/scraping/ssm_dispatch.py create mode 100644 sde_collections/tests/test_scrape_dispatch.py diff --git a/IMPLEMENTATION_PLAN.md b/IMPLEMENTATION_PLAN.md index 831eccae..dabeeef9 100644 --- a/IMPLEMENTATION_PLAN.md +++ b/IMPLEMENTATION_PLAN.md @@ -434,11 +434,11 @@ aws ssm send-command --instance-ids i-0b6a61d95888886f4 \ ``` ### Done when -- [ ] `ScraperConfigOverride` + `ScrapeDispatch` created, admin-visible, migration applied -- [ ] Job JSON omits null overrides and rejects `max_pages > 100_000` -- [ ] `READY_FOR_ENGINEERING` **and** `REINDEXING_NEEDED_ON_DEV` dispatch via SSM; Sinequa scraper-config calls gone from those branches -- [ ] Every dispatch records `dispatched_at` + `ssm_command_id` -- [ ] A real job JSON lands in the dev crawler inbox and moves to `jobs/done/` +- [x] `ScraperConfigOverride` + `ScrapeDispatch` created, admin-visible, migration applied +- [x] Job JSON omits null overrides and rejects `max_pages > 100_000` +- [x] `READY_FOR_ENGINEERING` **and** `REINDEXING_NEEDED_ON_DEV` dispatch via SSM; Sinequa scraper-config calls gone from those branches +- [x] Every dispatch records `dispatched_at` + `ssm_command_id` +- [x] A real job JSON lands in the dev crawler inbox and moves to `jobs/done/` --- diff --git a/sde_collections/admin.py b/sde_collections/admin.py index 766d8f3f..56b97792 100644 --- a/sde_collections/admin.py +++ b/sde_collections/admin.py @@ -15,6 +15,7 @@ from .models.collection_choice_fields import TDAMMTags from .models.delta_url import CuratedUrl, DeltaUrl, DumpUrl from .models.pattern import DivisionPattern, IncludePattern, TitlePattern +from .models.scraper_config import ScrapeDispatch, ScraperConfigOverride from .tasks import fetch_full_text, import_candidate_urls_from_api @@ -501,3 +502,38 @@ class CuratedUrlAdmin(TDAMMAdminMixin, admin.ModelAdmin): admin.site.register(DumpUrl, DumpUrlAdmin) admin.site.register(DeltaUrl, DeltaUrlAdmin) admin.site.register(CuratedUrl, CuratedUrlAdmin) + + +@admin.register(ScraperConfigOverride) +class ScraperConfigOverrideAdmin(admin.ModelAdmin): + """Curator-editable crawl overrides (WORKFLOW.md step 6).""" + + list_display = ( + "collection", + "max_pages", + "depth_limit", + "delay", + "concurrent_requests", + "obey_robots", + "include_subdomains", + ) + search_fields = ("collection__name", "collection__config_folder") + raw_id_fields = ("collection",) + + +@admin.register(ScrapeDispatch) +class ScrapeDispatchAdmin(admin.ModelAdmin): + """Read-only dispatch log for debugging scrape runs.""" + + list_display = ("collection", "dispatched_at", "ssm_command_id") + search_fields = ("collection__name", "collection__config_folder", "ssm_command_id") + list_filter = ("dispatched_at",) + + def has_add_permission(self, request): + return False + + def has_change_permission(self, request, obj=None): + return False + + def has_delete_permission(self, request, obj=None): + return False diff --git a/sde_collections/management/commands/dispatch_scrape.py b/sde_collections/management/commands/dispatch_scrape.py new file mode 100644 index 00000000..b7fc4527 --- /dev/null +++ b/sde_collections/management/commands/dispatch_scrape.py @@ -0,0 +1,27 @@ +from django.core.management.base import BaseCommand, CommandError + +from sde_collections.models.collection import Collection +from sde_collections.tasks import dispatch_scrape_job + + +class Command(BaseCommand): + help = "Manually (re-)dispatch a scrape job for a collection to the crawl4ai crawler via SSM." + + def add_arguments(self, parser): + parser.add_argument("--collection", required=True, help="config_folder of the collection") + + def handle(self, *args, **options): + config_folder = options["collection"] + try: + collection = Collection.objects.get(config_folder=config_folder) + except Collection.DoesNotExist: + raise CommandError(f"No collection with config_folder={config_folder!r}") + + # Run synchronously so the operator sees the outcome immediately. + command_id = dispatch_scrape_job(collection.id) + if command_id is None: + raise CommandError( + f"Dispatch failed for {config_folder} — see task output above; " + f"collection is now marked Scraping Failed" + ) + self.stdout.write(self.style.SUCCESS(f"Dispatched {config_folder}: SSM command {command_id}")) diff --git a/sde_collections/migrations/0079_scraperconfigoverride_scrapedispatch.py b/sde_collections/migrations/0079_scraperconfigoverride_scrapedispatch.py new file mode 100644 index 00000000..29e42df9 --- /dev/null +++ b/sde_collections/migrations/0079_scraperconfigoverride_scrapedispatch.py @@ -0,0 +1,62 @@ +# Generated by Django 4.2.9 on 2026-08-13 20:03 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ("sde_collections", "0078_alter_collection_workflow_status_and_more"), + ] + + operations = [ + migrations.CreateModel( + name="ScraperConfigOverride", + fields=[ + ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("max_pages", models.PositiveIntegerField(blank=True, help_text="Crawler cap: 100,000", null=True)), + ("depth_limit", models.PositiveIntegerField(blank=True, null=True)), + ( + "delay", + models.FloatField( + blank=True, help_text="Seconds between requests (crawler default 0.25)", null=True + ), + ), + ("concurrent_requests", models.PositiveSmallIntegerField(blank=True, null=True)), + ("obey_robots", models.BooleanField(blank=True, null=True)), + ("include_subdomains", models.BooleanField(blank=True, null=True)), + ( + "collection", + models.OneToOneField( + on_delete=django.db.models.deletion.CASCADE, + related_name="scraper_config", + to="sde_collections.collection", + ), + ), + ], + options={ + "verbose_name": "Scraper Config Override", + }, + ), + migrations.CreateModel( + name="ScrapeDispatch", + fields=[ + ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("dispatched_at", models.DateTimeField(auto_now_add=True)), + ("ssm_command_id", models.CharField(max_length=64)), + ( + "collection", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="scrape_dispatches", + to="sde_collections.collection", + ), + ), + ], + options={ + "verbose_name_plural": "Scrape Dispatches", + "ordering": ["-dispatched_at"], + }, + ), + ] diff --git a/sde_collections/models/__init__.py b/sde_collections/models/__init__.py index e69de29b..57436009 100644 --- a/sde_collections/models/__init__.py +++ b/sde_collections/models/__init__.py @@ -0,0 +1,3 @@ +from .scraper_config import ScrapeDispatch, ScraperConfigOverride + +__all__ = ["ScrapeDispatch", "ScraperConfigOverride"] diff --git a/sde_collections/models/collection.py b/sde_collections/models/collection.py index ed13deca..53e55dd1 100644 --- a/sde_collections/models/collection.py +++ b/sde_collections/models/collection.py @@ -19,6 +19,7 @@ InferenceJobStatus, ) from sde_collections.tasks import ( + dispatch_scrape_job, fetch_full_text, migrate_dump_to_delta_and_handle_status_transistions, ) @@ -899,8 +900,7 @@ def create_configs_on_status_change(sender, instance, created, **kwargs): elif instance.workflow_status == WorkflowStatusChoices.CURATED: instance.promote_to_curated() elif instance.workflow_status == WorkflowStatusChoices.READY_FOR_ENGINEERING: - instance.create_scraper_config(overwrite=False) - instance.create_scraper_job(overwrite=False) + dispatch_scrape_job.delay(instance.id) elif instance.workflow_status == WorkflowStatusChoices.INDEXING_FINISHED_ON_DEV: fetch_full_text.delay(instance.id, "lrm_dev") elif instance.workflow_status in [ @@ -910,7 +910,10 @@ def create_configs_on_status_change(sender, instance, created, **kwargs): instance.add_to_public_query() if "reindexing_status" in instance.tracker.changed(): - if instance.reindexing_status == ReindexingStatusChoices.REINDEXING_FINISHED_ON_DEV: + if instance.reindexing_status == ReindexingStatusChoices.REINDEXING_NEEDED_ON_DEV: + # Re-scrape path: replaces the engineer manually re-running a Sinequa job. + dispatch_scrape_job.delay(instance.id) + elif instance.reindexing_status == ReindexingStatusChoices.REINDEXING_FINISHED_ON_DEV: fetch_full_text.delay(instance.id, "lrm_dev") elif instance.reindexing_status == ReindexingStatusChoices.REINDEXING_CURATED: instance.promote_to_curated() diff --git a/sde_collections/models/scraper_config.py b/sde_collections/models/scraper_config.py new file mode 100644 index 00000000..aaf34e6e --- /dev/null +++ b/sde_collections/models/scraper_config.py @@ -0,0 +1,50 @@ +from django.db import models + + +class ScraperConfigOverride(models.Model): + """Per-collection overrides merged onto the crawler's own defaults. + + All fields nullable: only non-null values are emitted into the job JSON, + because crawl4ai's merge_job() skips None. Curators edit these in the admin + console (WORKFLOW.md step 6). + """ + + collection = models.OneToOneField( + "sde_collections.Collection", + on_delete=models.CASCADE, + related_name="scraper_config", + ) + max_pages = models.PositiveIntegerField(null=True, blank=True, help_text="Crawler cap: 100,000") + depth_limit = models.PositiveIntegerField(null=True, blank=True) + delay = models.FloatField(null=True, blank=True, help_text="Seconds between requests (crawler default 0.25)") + concurrent_requests = models.PositiveSmallIntegerField(null=True, blank=True) + obey_robots = models.BooleanField(null=True, blank=True) + include_subdomains = models.BooleanField(null=True, blank=True) + + class Meta: + verbose_name = "Scraper Config Override" + + def __str__(self): + return f"Scraper overrides for {self.collection.config_folder}" + + +class ScrapeDispatch(models.Model): + """One row per SSM dispatch. Two jobs: (1) give the poller a freshness reference — + S3 results older than dispatched_at belong to a previous run and must be ignored; + (2) give the stall timeout a start time. Never deleted; latest row per collection wins. + """ + + collection = models.ForeignKey( + "sde_collections.Collection", + on_delete=models.CASCADE, + related_name="scrape_dispatches", + ) + dispatched_at = models.DateTimeField(auto_now_add=True) + ssm_command_id = models.CharField(max_length=64) + + class Meta: + ordering = ["-dispatched_at"] + verbose_name_plural = "Scrape Dispatches" + + def __str__(self): + return f"{self.collection.config_folder} @ {self.dispatched_at:%Y-%m-%d %H:%M:%S} ({self.ssm_command_id})" diff --git a/sde_collections/scraping/__init__.py b/sde_collections/scraping/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/sde_collections/scraping/job_builder.py b/sde_collections/scraping/job_builder.py new file mode 100644 index 00000000..861627d3 --- /dev/null +++ b/sde_collections/scraping/job_builder.py @@ -0,0 +1,38 @@ +"""Build the job JSON the crawl4ai crawler consumes. + +Contract (sde-crawl4ai-scraper-v1/sde_crawler/job.py): merge_job() skips None values, +so only non-null overrides are emitted; `collection_id` names both the output file and +the S3 keys. COSMOS always sends config_folder — unique, editable=False, stable across +renames. Never the numeric PK. +""" + +# Mirrors sde_crawler.crawler.MAX_PAGES_CAP — jobs above this land in jobs/failed/. +MAX_PAGES_CAP = 100_000 + +OVERRIDE_FIELDS = ( + "max_pages", + "depth_limit", + "delay", + "concurrent_requests", + "obey_robots", + "include_subdomains", +) + + +def build_job_json(collection) -> dict: + job = {"seed": collection.url, "collection_id": collection.config_folder} + + override = collection.scraper_config if hasattr(collection, "scraper_config") else None + if override is not None: + for field in OVERRIDE_FIELDS: + value = getattr(override, field) + if value is not None: + job[field] = value + + if "max_pages" in job and job["max_pages"] > MAX_PAGES_CAP: + raise ValueError( + f"max_pages={job['max_pages']} exceeds the crawler cap of {MAX_PAGES_CAP}; " + f"the job would be rejected into jobs/failed/" + ) + + return job diff --git a/sde_collections/scraping/ssm_dispatch.py b/sde_collections/scraping/ssm_dispatch.py new file mode 100644 index 00000000..db22ed30 --- /dev/null +++ b/sde_collections/scraping/ssm_dispatch.py @@ -0,0 +1,35 @@ +"""Deliver a job JSON into the crawler's inbox on EC2 via SSM. + +Mirrors sde-crawl4ai-scraper-v1/scripts/drop_job.sh: AWS-RunShellScript writing to +{CRAWLER_INBOX_PATH}/{config_folder}.json, chowned to ec2-user. The JSON is passed +through shlex.quote — seed URLs contain characters that would break a heredoc — and +written to a .tmp path first so the inbox watcher can never read a partial file. +""" + +import json +import shlex + +from django.conf import settings + +from ..utils.aws import get_boto3_session +from .job_builder import build_job_json + + +def send_job_to_crawler(collection) -> str: + """Build and drop the job JSON for `collection`; returns the SSM command id.""" + job_json = json.dumps(build_job_json(collection)) + dest = f"{settings.CRAWLER_INBOX_PATH}/{collection.config_folder}.json" + script = ( + f"printf '%s' {shlex.quote(job_json)} > {shlex.quote(dest + '.tmp')}\n" + f"chown ec2-user:ec2-user {shlex.quote(dest + '.tmp')}\n" + f"mv -f {shlex.quote(dest + '.tmp')} {shlex.quote(dest)}\n" + ) + + ssm = get_boto3_session().client("ssm") + response = ssm.send_command( + InstanceIds=[settings.CRAWLER_INSTANCE_ID], + DocumentName="AWS-RunShellScript", + Comment=f"COSMOS scrape dispatch: {collection.config_folder}"[:100], + Parameters={"commands": [script]}, + ) + return response["Command"]["CommandId"] diff --git a/sde_collections/tasks.py b/sde_collections/tasks.py index 98f26a34..c188a74e 100644 --- a/sde_collections/tasks.py +++ b/sde_collections/tasks.py @@ -17,6 +17,7 @@ ) from .models.delta_url import DumpUrl +from .scraping.ssm_dispatch import send_job_to_crawler from .sinequa_api import Api from .utils.github_helper import GitHubHandler @@ -229,3 +230,28 @@ def migrate_dump_to_delta_and_handle_status_transistions(collection_id): collection.save() return f"Successfully migrated DumpUrls to DeltaUrls for collection {collection.name}." + + +@celery_app.task() +def dispatch_scrape_job(collection_id): + """Send a scrape job for the collection to the crawl4ai crawler via SSM. + + Triggered by READY_FOR_ENGINEERING and REINDEXING_NEEDED_ON_DEV (and manually via + the dispatch_scrape management command). On success records a ScrapeDispatch row — + the poller's freshness reference and the stall timeout's start time. On failure + sets SCRAPING_FAILED and records nothing; the error never raises out of the task. + """ + Collection = apps.get_model("sde_collections", "Collection") + ScrapeDispatch = apps.get_model("sde_collections", "ScrapeDispatch") + collection = Collection.objects.get(id=collection_id) + + try: + command_id = send_job_to_crawler(collection) + except Exception as e: + print(f"Scrape dispatch failed for {collection.config_folder}: {e}") + collection.workflow_status = WorkflowStatusChoices.SCRAPING_FAILED + collection.save() + return None + + ScrapeDispatch.objects.create(collection=collection, ssm_command_id=command_id) + return command_id diff --git a/sde_collections/tests/test_scrape_dispatch.py b/sde_collections/tests/test_scrape_dispatch.py new file mode 100644 index 00000000..603849a7 --- /dev/null +++ b/sde_collections/tests/test_scrape_dispatch.py @@ -0,0 +1,120 @@ +# docker-compose -f local.yml run --rm django pytest sde_collections/tests/test_scrape_dispatch.py + +from unittest.mock import patch + +import pytest + +from sde_collections.models.collection_choice_fields import ( + ReindexingStatusChoices, + WorkflowStatusChoices, +) +from sde_collections.models.scraper_config import ScrapeDispatch, ScraperConfigOverride +from sde_collections.scraping.job_builder import build_job_json +from sde_collections.tasks import dispatch_scrape_job +from sde_collections.tests.factories import CollectionFactory + + +@pytest.mark.django_db +class TestBuildJobJson: + def test_no_overrides_emits_exactly_seed_and_collection_id(self): + collection = CollectionFactory() + + job = build_job_json(collection) + + assert job == {"seed": collection.url, "collection_id": collection.config_folder} + + def test_null_override_fields_are_omitted(self): + """crawl4ai's merge_job() skips None — COSMOS must emit only non-null overrides.""" + collection = CollectionFactory() + ScraperConfigOverride.objects.create(collection=collection, max_pages=5000, delay=None) + + job = build_job_json(collection) + + assert job["max_pages"] == 5000 + assert "delay" not in job + assert "depth_limit" not in job + assert "obey_robots" not in job + + def test_false_boolean_override_is_emitted(self): + """False is a real override (e.g. include_subdomains=False), only None is skipped.""" + collection = CollectionFactory() + ScraperConfigOverride.objects.create(collection=collection, include_subdomains=False) + + job = build_job_json(collection) + + assert job["include_subdomains"] is False + + def test_max_pages_above_crawler_cap_raises(self): + collection = CollectionFactory() + ScraperConfigOverride.objects.create(collection=collection, max_pages=200_000) + + with pytest.raises(ValueError, match="100000"): + build_job_json(collection) + + +@pytest.mark.django_db +class TestStatusTriggersDispatch: + @patch("sde_collections.tasks.dispatch_scrape_job.delay") + def test_ready_for_engineering_dispatches_scrape_job(self, mock_delay): + collection = CollectionFactory() + collection.workflow_status = WorkflowStatusChoices.READY_FOR_ENGINEERING + collection.save() + + mock_delay.assert_called_once_with(collection.id) + + @patch("sde_collections.tasks.dispatch_scrape_job.delay") + def test_reindexing_needed_dispatches_scrape_job(self, mock_delay): + collection = CollectionFactory() + collection.reindexing_status = ReindexingStatusChoices.REINDEXING_NEEDED_ON_DEV + collection.save() + + mock_delay.assert_called_once_with(collection.id) + + @patch("sde_collections.models.collection.Collection.create_scraper_config") + @patch("sde_collections.tasks.dispatch_scrape_job.delay") + def test_ready_for_engineering_no_longer_touches_sinequa_configs(self, mock_delay, mock_scraper_config): + collection = CollectionFactory() + collection.workflow_status = WorkflowStatusChoices.READY_FOR_ENGINEERING + collection.save() + + mock_scraper_config.assert_not_called() + + +@pytest.mark.django_db +class TestDispatchScrapeJobTask: + @patch("sde_collections.tasks.send_job_to_crawler", return_value="cmd-abc123") + def test_successful_dispatch_records_scrape_dispatch(self, mock_send): + collection = CollectionFactory() + + result = dispatch_scrape_job(collection.id) + + assert result == "cmd-abc123" + dispatch = ScrapeDispatch.objects.get(collection=collection) + assert dispatch.ssm_command_id == "cmd-abc123" + assert dispatch.dispatched_at is not None + + @patch("sde_collections.tasks.send_job_to_crawler", side_effect=Exception("SSM unreachable")) + def test_ssm_failure_sets_scraping_failed_and_does_not_raise(self, mock_send): + collection = CollectionFactory(workflow_status=WorkflowStatusChoices.READY_FOR_ENGINEERING) + + result = dispatch_scrape_job(collection.id) # must not raise + + assert result is None + collection.refresh_from_db() + assert collection.workflow_status == WorkflowStatusChoices.SCRAPING_FAILED + assert not ScrapeDispatch.objects.filter(collection=collection).exists() + + @patch("sde_collections.tasks.send_job_to_crawler", return_value="cmd-2") + def test_redispatch_keeps_prior_dispatch_rows(self, mock_send): + """Rows are never deleted — the poller takes the latest per collection.""" + collection = CollectionFactory() + ScrapeDispatch.objects.create(collection=collection, ssm_command_id="cmd-1") + + dispatch_scrape_job(collection.id) + + ids = list( + ScrapeDispatch.objects.filter(collection=collection).values_list("ssm_command_id", flat=True) + ) + assert set(ids) == {"cmd-1", "cmd-2"} + # Meta.ordering is -dispatched_at: first row is the latest dispatch + assert ScrapeDispatch.objects.filter(collection=collection).first().ssm_command_id == "cmd-2" diff --git a/sde_collections/tests/test_workflow_status_triggers.py b/sde_collections/tests/test_workflow_status_triggers.py index 29dd6c8c..4d2b9801 100644 --- a/sde_collections/tests/test_workflow_status_triggers.py +++ b/sde_collections/tests/test_workflow_status_triggers.py @@ -23,14 +23,14 @@ class TestWorkflowStatusTransitions(TestCase): def setUp(self): self.collection = CollectionFactory() - @patch("sde_collections.models.collection.GitHubHandler") - @patch("sde_collections.models.collection.Collection.create_scraper_config") - def test_ready_for_engineering_triggers_config_creation(self, mock_scraper, mock_github_handler): - """When status changes to READY_FOR_ENGINEERING, it should create configs""" + @patch("sde_collections.tasks.dispatch_scrape_job.delay") + def test_ready_for_engineering_triggers_scrape_dispatch(self, mock_dispatch): + """When status changes to READY_FOR_ENGINEERING, it should dispatch a scrape job (P3: + replaces the Sinequa create_scraper_config/create_scraper_job trigger).""" self.collection.workflow_status = WorkflowStatusChoices.READY_FOR_ENGINEERING self.collection.save() - mock_scraper.assert_called_once_with(overwrite=False) + mock_dispatch.assert_called_once_with(self.collection.id) @patch("sde_collections.tasks.fetch_full_text.delay") def test_indexing_finished_triggers_full_text_fetch(self, mock_fetch): @@ -450,22 +450,10 @@ class TestErrorHandling(TransactionTestCase): def setUp(self): self.collection = CollectionFactory(workflow_status=WorkflowStatusChoices.RESEARCH_IN_PROGRESS) - @patch("sde_collections.models.collection.Collection.create_scraper_config") - @patch("sde_collections.models.collection.Collection.create_indexer_config") - def test_config_creation_failure_handling(self, mock_indexer, mock_scraper): - """Test handling of config creation failures""" - mock_scraper.side_effect = Exception("Config creation failed") - - initial_status = self.collection.workflow_status - - with pytest.raises(Exception): - with transaction.atomic(): - self.collection.workflow_status = WorkflowStatusChoices.READY_FOR_ENGINEERING - self.collection.save() - - # Verify status wasn't changed on error - self.collection.refresh_from_db() - assert self.collection.workflow_status == initial_status + # The old test_config_creation_failure_handling is gone with the Sinequa trigger it + # exercised: scrape dispatch is now async (dispatch_scrape_job.delay), so a dispatch + # failure can no longer abort the status save. Failure handling for the new path + # (SSM error -> SCRAPING_FAILED, no ScrapeDispatch row) lives in test_scrape_dispatch.py. @patch("sde_collections.tasks.Api") def test_full_text_fetch_failure_handling(self, MockApi): From 623f13267736ca7658b55980707ad46ecf72a639 Mon Sep 17 00:00:00 2001 From: Bernard Benson Date: Thu, 13 Aug 2026 15:38:43 -0500 Subject: [PATCH 06/20] =?UTF-8?q?Phase=204=20=E2=80=94=20Poll=20for=20resu?= =?UTF-8?q?lts=20and=20ingest=20S3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env_sample | 1 + .envs/.local/.django | 1 + IMPLEMENTATION_PLAN.md | 14 +- config/settings/base.py | 2 + sde_collections/apps.py | 3 + .../commands/ingest_scrape_results.py | 28 ++ sde_collections/scraping/s3_results.py | 65 ++++ sde_collections/signals.py | 43 +++ sde_collections/tasks.py | 155 ++++++++++ sde_collections/tests/test_scrape_ingest.py | 279 ++++++++++++++++++ 10 files changed, 585 insertions(+), 6 deletions(-) create mode 100644 sde_collections/management/commands/ingest_scrape_results.py create mode 100644 sde_collections/scraping/s3_results.py create mode 100644 sde_collections/signals.py create mode 100644 sde_collections/tests/test_scrape_ingest.py diff --git a/.env_sample b/.env_sample index 309f04bb..7c0ba386 100644 --- a/.env_sample +++ b/.env_sample @@ -23,6 +23,7 @@ SDE_S3_BUCKET="" CRAWLER_INSTANCE_ID="" CRAWLER_INBOX_PATH="/opt/sde-crawler/jobs/incoming" SCRAPE_POLL_ENABLED=False +SCRAPE_STALL_TIMEOUT_HOURS=24 INFERENCE_ENABLED=False # pipeline-scoped credentials for local dev ONLY; leave blank in AWS (instance role takes over) SDE_AWS_ACCESS_KEY_ID="" diff --git a/.envs/.local/.django b/.envs/.local/.django index 2e624326..4916f89b 100644 --- a/.envs/.local/.django +++ b/.envs/.local/.django @@ -58,6 +58,7 @@ SDE_S3_BUCKET='' CRAWLER_INSTANCE_ID='' CRAWLER_INBOX_PATH='/opt/sde-crawler/jobs/incoming' SCRAPE_POLL_ENABLED=False +SCRAPE_STALL_TIMEOUT_HOURS=24 INFERENCE_ENABLED=False SDE_AWS_ACCESS_KEY_ID='' SDE_AWS_SECRET_ACCESS_KEY='' diff --git a/IMPLEMENTATION_PLAN.md b/IMPLEMENTATION_PLAN.md index dabeeef9..a7779fa2 100644 --- a/IMPLEMENTATION_PLAN.md +++ b/IMPLEMENTATION_PLAN.md @@ -544,13 +544,15 @@ Expect dump count to match `documents_scraped` in the summary, deltas created, s `Ready for Curation`. ### Done when -- [ ] S3 completion contract implemented, including the zero-document failure case **and the +- [x] S3 completion contract implemented, including the zero-document failure case **and the `dispatched_at` freshness rule** -- [ ] `poll_scrape_jobs` beat row created via `post_migrate`, gated on `SCRAPE_POLL_ENABLED` -- [ ] Ingest claims via CAS before writing, is idempotent, and populates `DumpUrl` without touching the model -- [ ] Re-scrape path (`REINDEXING_NEEDED_ON_DEV`) polls and ingests end to end -- [ ] A real dev collection goes seed URL → `Ready for Curation` end to end -- [ ] Slack posts an ingest summary +- [x] `poll_scrape_jobs` beat row created via `post_migrate`, gated on `SCRAPE_POLL_ENABLED` +- [x] Ingest claims via CAS before writing, is idempotent, and populates `DumpUrl` without touching the model +- [x] Re-scrape path (`REINDEXING_NEEDED_ON_DEV`) polls and ingests end to end +- [x] A real dev collection goes seed URL → `Ready for Curation` end to end +- [ ] Slack posts an ingest summary *(wired in the migrate task + unit-asserted with counts; a real + post is blocked until P5 removes the Sinequa `READY_FOR_CURATION → create_indexer_config` + branch, which currently raises after the status save and cuts the task short — re-verify in P5)* --- diff --git a/config/settings/base.py b/config/settings/base.py index 1338596c..3934c975 100644 --- a/config/settings/base.py +++ b/config/settings/base.py @@ -361,6 +361,8 @@ CRAWLER_INSTANCE_ID = env("CRAWLER_INSTANCE_ID", default="") # i-0b6a61d95888886f4 on dev CRAWLER_INBOX_PATH = env("CRAWLER_INBOX_PATH", default="/opt/sde-crawler/jobs/incoming") SCRAPE_POLL_ENABLED = env.bool("SCRAPE_POLL_ENABLED", default=False) +# A dispatched crawl with no fresh S3 summary after this long is declared dead (P4). +SCRAPE_STALL_TIMEOUT_HOURS = env.int("SCRAPE_STALL_TIMEOUT_HOURS", default=24) INFERENCE_ENABLED = env.bool("INFERENCE_ENABLED", default=False) # pipeline-scoped credentials for local dev ONLY; blank in AWS (instance role takes over) SDE_AWS_ACCESS_KEY_ID = env("SDE_AWS_ACCESS_KEY_ID", default="") diff --git a/sde_collections/apps.py b/sde_collections/apps.py index f711fe47..8b2fad4b 100644 --- a/sde_collections/apps.py +++ b/sde_collections/apps.py @@ -4,3 +4,6 @@ class SdeCollectionsConfig(AppConfig): default_auto_field = "django.db.models.BigAutoField" name = "sde_collections" + + def ready(self): + from . import signals # noqa: F401 diff --git a/sde_collections/management/commands/ingest_scrape_results.py b/sde_collections/management/commands/ingest_scrape_results.py new file mode 100644 index 00000000..c7fa9e8c --- /dev/null +++ b/sde_collections/management/commands/ingest_scrape_results.py @@ -0,0 +1,28 @@ +from django.core.management.base import BaseCommand, CommandError + +from sde_collections.models.collection import Collection +from sde_collections.tasks import ingest_scraped_collection + + +class Command(BaseCommand): + help = ( + "Manually ingest completed crawl results from S3 for a collection. Skips the " + "status compare-and-swap (explicit operator intent) and ignores result freshness, " + "but still deletes existing DumpUrls first, so re-runs are idempotent." + ) + + def add_arguments(self, parser): + parser.add_argument("--collection", required=True, help="config_folder of the collection") + + def handle(self, *args, **options): + config_folder = options["collection"] + try: + collection = Collection.objects.get(config_folder=config_folder) + except Collection.DoesNotExist: + raise CommandError(f"No collection with config_folder={config_folder!r}") + + # Run synchronously so the operator sees the outcome immediately. + result = ingest_scraped_collection(collection.id, claim=False) + if result is None: + raise CommandError(f"Ingest failed for {config_folder} — see task output above") + self.stdout.write(self.style.SUCCESS(str(result))) diff --git a/sde_collections/scraping/s3_results.py b/sde_collections/scraping/s3_results.py new file mode 100644 index 00000000..d7b0d027 --- /dev/null +++ b/sde_collections/scraping/s3_results.py @@ -0,0 +1,65 @@ +"""Read crawl results from the crawler's S3 bucket. + +Key layout mirrors sde-crawl4ai-scraper-v1/sde_crawler/job.py::s3_keys_for_collection — +do not reinvent it. The crawler writes no status file: the failures summary is written +only at the end of a completed run, so a *fresh* summary is the completion marker. +S3 objects persist between runs, which is why every check must be filtered against the +latest ScrapeDispatch.dispatched_at — without it, any re-dispatch would instantly +"complete" against the previous run's output. +""" + +import json + +from botocore.exceptions import ClientError +from django.conf import settings + +from ..utils.aws import get_boto3_session + +_MISSING_KEY_CODES = {"NoSuchKey", "404"} + + +def s3_keys_for_collection(collection_id: str) -> dict[str, str]: + return { + "documents": f"scraped_collections/{collection_id}.json", + "failures": f"failure_logs/{collection_id}_failures.jsonl", + "summary": f"failure_logs/{collection_id}_failures_summary.json", + } + + +def _get_object(key: str): + s3 = get_boto3_session().client("s3") + return s3.get_object(Bucket=settings.SDE_S3_BUCKET, Key=key) + + +def fetch_summary(collection_id: str): + """Return (summary_dict, last_modified) or None if no summary object exists.""" + try: + obj = _get_object(s3_keys_for_collection(collection_id)["summary"]) + except ClientError as e: + if e.response.get("Error", {}).get("Code") in _MISSING_KEY_CODES: + return None + raise + return json.loads(obj["Body"].read()), obj["LastModified"] + + +def fetch_documents(collection_id: str) -> list[dict]: + """The scraped documents array; each item has exactly seven fields: + {url, title, full_text, content_type, seed, host, depth}.""" + obj = _get_object(s3_keys_for_collection(collection_id)["documents"]) + return json.loads(obj["Body"].read()) + + +def results_ready(collection_id: str, dispatched_at): + """Return the summary dict if a run completed *after* dispatched_at, else None. + + A summary whose LastModified predates the dispatch belongs to a previous run and is + treated as absent. dispatched_at=None (no dispatch recorded) accepts any summary — + that path is reserved for explicit manual ingest. + """ + found = fetch_summary(collection_id) + if found is None: + return None + summary, last_modified = found + if dispatched_at is not None and last_modified <= dispatched_at: + return None + return summary diff --git a/sde_collections/signals.py b/sde_collections/signals.py new file mode 100644 index 00000000..b6a163e5 --- /dev/null +++ b/sde_collections/signals.py @@ -0,0 +1,43 @@ +from django.conf import settings +from django.db.models.signals import post_migrate +from django.dispatch import receiver + +POLL_SCRAPE_TASK = "sde_collections.tasks.poll_scrape_jobs" +POLL_SCRAPE_TASK_NAME = "Poll crawler S3 results (every 5 min)" + + +@receiver(post_migrate) +def create_periodic_tasks(sender, **kwargs): + """DB-row beat schedule for the scrape-results poller (there is no + CELERY_BEAT_SCHEDULE in this repo — all schedules are django-celery-beat rows). + + `enabled` is re-asserted from SCRAPE_POLL_ENABLED on every migrate, same pattern as + inference/signals.py: the flag, not a hand-edit in the admin, is the source of truth. + """ + if sender.name != "sde_collections": + return + + from django_celery_beat.models import CrontabSchedule, PeriodicTask + + crontab, _ = CrontabSchedule.objects.get_or_create( + minute="*/5", + hour="*", + day_of_week="*", + day_of_month="*", + month_of_year="*", + ) + + try: + task = PeriodicTask.objects.get(name=POLL_SCRAPE_TASK_NAME) + except PeriodicTask.DoesNotExist: + PeriodicTask.objects.create( + crontab=crontab, + name=POLL_SCRAPE_TASK_NAME, + task=POLL_SCRAPE_TASK, + enabled=settings.SCRAPE_POLL_ENABLED, + ) + else: + task.crontab = crontab + task.task = POLL_SCRAPE_TASK + task.enabled = settings.SCRAPE_POLL_ENABLED + task.save() diff --git a/sde_collections/tasks.py b/sde_collections/tasks.py index c188a74e..6ac56607 100644 --- a/sde_collections/tasks.py +++ b/sde_collections/tasks.py @@ -17,9 +17,11 @@ ) from .models.delta_url import DumpUrl +from .scraping.s3_results import fetch_documents, fetch_summary, results_ready from .scraping.ssm_dispatch import send_job_to_crawler from .sinequa_api import Api from .utils.github_helper import GitHubHandler +from .utils.slack_utils import send_detailed_import_notification def _get_data_to_import(collection, server_name): @@ -206,6 +208,8 @@ def migrate_dump_to_delta_and_handle_status_transistions(collection_id): initial_workflow_status = collection.workflow_status initial_reindexing_status = collection.reindexing_status + dump_count = collection.dump_urls.count() + curated_count = collection.curated_urls.count() # Migrate dump URLs to delta URLs collection.migrate_dump_to_delta() @@ -219,6 +223,7 @@ def migrate_dump_to_delta_and_handle_status_transistions(collection_id): WorkflowStatusChoices.READY_FOR_ENGINEERING, WorkflowStatusChoices.ENGINEERING_IN_PROGRESS, WorkflowStatusChoices.INDEXING_FINISHED_ON_DEV, + WorkflowStatusChoices.SCRAPING_SUCCESSFUL, ] if initial_workflow_status in pre_workflow_statuses: collection.workflow_status = WorkflowStatusChoices.READY_FOR_CURATION @@ -229,6 +234,24 @@ def migrate_dump_to_delta_and_handle_status_transistions(collection_id): collection.reindexing_status = ReindexingStatusChoices.REINDEXING_READY_FOR_CURATION collection.save() + # Post the ingest summary for the scrape-ingest paths (WORKFLOW.md step 11). + # Sent from here, not the ingest task, because the delta counts only exist + # after migration. + if initial_workflow_status == WorkflowStatusChoices.SCRAPING_SUCCESSFUL or ( + initial_reindexing_status == ReindexingStatusChoices.REINDEXING_FINISHED_ON_DEV + ): + try: + send_detailed_import_notification( + collection_name=collection.name, + total_server_count=dump_count, + curated_count=curated_count, + dump_count=dump_count, + delta_count=collection.delta_urls.count(), + marked_for_deletion_count=collection.delta_urls.filter(to_delete=True).count(), + ) + except Exception as e: + print(f"Error sending ingest summary to Slack: {e}") + return f"Successfully migrated DumpUrls to DeltaUrls for collection {collection.name}." @@ -255,3 +278,135 @@ def dispatch_scrape_job(collection_id): ScrapeDispatch.objects.create(collection=collection, ssm_command_id=command_id) return command_id + + +@celery_app.task() +def poll_scrape_jobs(): + """Beat task (every 5 min, gated on SCRAPE_POLL_ENABLED): find collections awaiting + crawl results and enqueue ingest for those whose run has completed. + + Scans READY_FOR_ENGINEERING and ENGINEERING_IN_PROGRESS (engineers flip to the latter + while a crawl runs — a collection must not strand there), plus the re-scrape path + (reindexing_status == REINDEXING_NEEDED_ON_DEV). Completion means a summary object + fresher than the latest ScrapeDispatch; with no fresh summary past the stall timeout + the run is declared dead. + """ + from datetime import timedelta + + from django.utils import timezone + + Collection = apps.get_model("sde_collections", "Collection") + + waiting = Collection.objects.filter( + workflow_status__in=[ + WorkflowStatusChoices.READY_FOR_ENGINEERING, + WorkflowStatusChoices.ENGINEERING_IN_PROGRESS, + ] + ) | Collection.objects.filter(reindexing_status=ReindexingStatusChoices.REINDEXING_NEEDED_ON_DEV) + + stall_timeout = timedelta(hours=settings.SCRAPE_STALL_TIMEOUT_HOURS) + now = timezone.now() + enqueued = 0 + + for collection in waiting.distinct(): + dispatch = collection.scrape_dispatches.first() # Meta.ordering: latest first + if dispatch is None: + continue # never dispatched — nothing to poll against + + try: + summary = results_ready(collection.config_folder, dispatch.dispatched_at) + except Exception as e: + print(f"Error checking S3 results for {collection.config_folder}: {e}") + continue + + if summary is not None: + ingest_scraped_collection.delay(collection.id) + enqueued += 1 + elif now - dispatch.dispatched_at > stall_timeout: + print( + f"Scrape stalled for {collection.config_folder}: no fresh results " + f"{settings.SCRAPE_STALL_TIMEOUT_HOURS}h after dispatch" + ) + collection.workflow_status = WorkflowStatusChoices.SCRAPING_FAILED + collection.save() + + return f"Enqueued ingest for {enqueued} collection(s)." + + +@celery_app.task(soft_time_limit=600) +def ingest_scraped_collection(collection_id, claim=True): + """Ingest completed crawl results from S3 into DumpUrls (replaces fetch_full_text). + + The status transition IS the claim, executed as a compare-and-swap before any write: + ingest can outrun the 5-minute poll, and BaseUrl.url is globally unique, so two + concurrent ingests would die on IntegrityError mid-write. claim=False (manual + ingest_scrape_results command) skips the CAS — explicit operator intent — but the + delete-then-write body keeps the replay idempotent. + """ + Collection = apps.get_model("sde_collections", "Collection") + collection = Collection.objects.get(id=collection_id) + cid = collection.config_folder + + if claim: + dispatch = collection.scrape_dispatches.first() + summary = results_ready(cid, dispatch.dispatched_at if dispatch else None) + else: + found = fetch_summary(cid) + summary = found[0] if found else None + if summary is None: + return f"No (fresh) results for {cid}; nothing ingested." + + # Zero-document completion is a failure: without this, an empty crawl would + # "succeed" and silently publish an empty collection. + if summary.get("documents_scraped", 0) == 0: + Collection.objects.filter(id=collection_id).update( + workflow_status=WorkflowStatusChoices.SCRAPING_FAILED + ) + return f"Scrape of {cid} completed with 0 documents; marked Scraping Failed." + + if claim: + claimed = Collection.objects.filter( + id=collection_id, + workflow_status__in=[ + WorkflowStatusChoices.READY_FOR_ENGINEERING, + WorkflowStatusChoices.ENGINEERING_IN_PROGRESS, + ], + ).update(workflow_status=WorkflowStatusChoices.SCRAPING_SUCCESSFUL) + if claimed == 0: + # Workflow path not claimable — try the re-scrape path. + claimed = Collection.objects.filter( + id=collection_id, + reindexing_status=ReindexingStatusChoices.REINDEXING_NEEDED_ON_DEV, + ).update(reindexing_status=ReindexingStatusChoices.REINDEXING_FINISHED_ON_DEV) + if claimed == 0: + return f"{cid} already claimed by another ingest; exiting." + + try: + documents = fetch_documents(cid) + with transaction.atomic(): + deleted_count, _ = DumpUrl.objects.filter(collection=collection).delete() + batch_size = 500 + for start in range(0, len(documents), batch_size): + DumpUrl.objects.bulk_create( + [ + DumpUrl( + url=document["url"], + collection=collection, + scraped_title=document.get("title") or "", + scraped_text=document.get("full_text") or "", + ) + for document in documents[start : start + batch_size] # noqa: E203 + ] + ) + print(f"Ingested {len(documents)} documents for {cid} (replaced {deleted_count}).") + + collection.refresh_from_db() + collection.queue_necessary_classifications() + return f"Ingested {len(documents)} documents for {cid}." + except Exception as e: + # Never leave a claimed collection stuck in SCRAPING_SUCCESSFUL with no DumpUrls. + print(f"Ingest failed for {cid}: {e}") + Collection.objects.filter(id=collection_id).update( + workflow_status=WorkflowStatusChoices.SCRAPING_FAILED + ) + return None diff --git a/sde_collections/tests/test_scrape_ingest.py b/sde_collections/tests/test_scrape_ingest.py new file mode 100644 index 00000000..33f52f33 --- /dev/null +++ b/sde_collections/tests/test_scrape_ingest.py @@ -0,0 +1,279 @@ +# docker-compose -f local.yml run --rm django pytest sde_collections/tests/test_scrape_ingest.py + +from datetime import datetime, timedelta, timezone as dt_timezone +from unittest.mock import patch + +import pytest +from django.utils import timezone + +from sde_collections.models.collection import Collection +from sde_collections.models.collection_choice_fields import ( + ReindexingStatusChoices, + WorkflowStatusChoices, +) +from sde_collections.models.delta_url import DumpUrl +from sde_collections.models.scraper_config import ScrapeDispatch +from sde_collections.scraping.s3_results import results_ready +from sde_collections.tasks import ( + ingest_scraped_collection, + migrate_dump_to_delta_and_handle_status_transistions, + poll_scrape_jobs, +) +from sde_collections.tests.factories import CollectionFactory + + +def make_documents(count, seed="https://example.nasa.gov/"): + """Fixture matching the crawler's exact 7-field document shape.""" + return [ + { + "url": f"{seed}page-{i}", + "title": f"Page {i}", + "full_text": f"Full text of page {i}", + "content_type": "text/html", + "seed": seed, + "host": "example.nasa.gov", + "depth": 1, + } + for i in range(count) + ] + + +def make_summary(documents_scraped): + return {"documents_scraped": documents_scraped, "failures_logged": 0, "seed": "https://example.nasa.gov/"} + + +def backdate_dispatch(dispatch, hours): + ScrapeDispatch.objects.filter(id=dispatch.id).update( + dispatched_at=timezone.now() - timedelta(hours=hours) + ) + + +@pytest.mark.django_db +class TestIngestScrapedCollection: + @patch("sde_collections.tasks.migrate_dump_to_delta_and_handle_status_transistions.delay") + @patch("sde_collections.tasks.fetch_documents") + @patch("sde_collections.tasks.results_ready") + def test_happy_path_creates_dump_urls_and_claims_status(self, mock_ready, mock_docs, mock_migrate): + collection = CollectionFactory(workflow_status=WorkflowStatusChoices.READY_FOR_ENGINEERING) + ScrapeDispatch.objects.create(collection=collection, ssm_command_id="cmd-1") + mock_ready.return_value = make_summary(3) + mock_docs.return_value = make_documents(3) + + ingest_scraped_collection(collection.id) + + dumps = DumpUrl.objects.filter(collection=collection).order_by("url") + assert dumps.count() == 3 + assert dumps[0].scraped_title == "Page 0" + assert dumps[0].scraped_text == "Full text of page 0" + collection.refresh_from_db() + assert collection.workflow_status == WorkflowStatusChoices.SCRAPING_SUCCESSFUL + mock_migrate.assert_called_once_with(collection.id) + + @patch("sde_collections.tasks.fetch_documents") + @patch("sde_collections.tasks.results_ready") + def test_zero_documents_marks_scraping_failed(self, mock_ready, mock_docs): + """A zero-page crawl otherwise 'succeeds' and silently publishes an empty collection.""" + collection = CollectionFactory(workflow_status=WorkflowStatusChoices.READY_FOR_ENGINEERING) + ScrapeDispatch.objects.create(collection=collection, ssm_command_id="cmd-1") + mock_ready.return_value = make_summary(0) + + ingest_scraped_collection(collection.id) + + collection.refresh_from_db() + assert collection.workflow_status == WorkflowStatusChoices.SCRAPING_FAILED + assert not DumpUrl.objects.filter(collection=collection).exists() + mock_docs.assert_not_called() + + @patch("sde_collections.tasks.fetch_documents") + @patch("sde_collections.tasks.results_ready") + def test_concurrent_claim_exits_without_touching_dump_urls(self, mock_ready, mock_docs): + """CAS returns 0 for an already-claimed collection — second ingest must exit.""" + collection = CollectionFactory(workflow_status=WorkflowStatusChoices.SCRAPING_SUCCESSFUL) + ScrapeDispatch.objects.create(collection=collection, ssm_command_id="cmd-1") + DumpUrl.objects.create(collection=collection, url="https://example.nasa.gov/existing") + mock_ready.return_value = make_summary(3) + + result = ingest_scraped_collection(collection.id) + + assert "already claimed" in result + assert DumpUrl.objects.filter(collection=collection).count() == 1 + mock_docs.assert_not_called() + + @patch("sde_collections.tasks.migrate_dump_to_delta_and_handle_status_transistions.delay") + @patch("sde_collections.tasks.fetch_documents") + @patch("sde_collections.tasks.fetch_summary") + def test_manual_ingest_is_idempotent(self, mock_summary, mock_docs, mock_migrate): + """Re-running manual ingest yields N (not 2N) DumpUrls — delete-then-write.""" + collection = CollectionFactory(workflow_status=WorkflowStatusChoices.SCRAPING_SUCCESSFUL) + mock_summary.return_value = (make_summary(4), datetime.now(dt_timezone.utc)) + mock_docs.return_value = make_documents(4) + + ingest_scraped_collection(collection.id, claim=False) + ingest_scraped_collection(collection.id, claim=False) + + assert DumpUrl.objects.filter(collection=collection).count() == 4 + + @patch("sde_collections.tasks.fetch_documents", side_effect=Exception("S3 read died")) + @patch("sde_collections.tasks.results_ready") + def test_ingest_failure_after_claim_sets_scraping_failed(self, mock_ready, mock_docs): + """Never leave a claimed collection stuck in SCRAPING_SUCCESSFUL with no DumpUrls.""" + collection = CollectionFactory(workflow_status=WorkflowStatusChoices.READY_FOR_ENGINEERING) + ScrapeDispatch.objects.create(collection=collection, ssm_command_id="cmd-1") + mock_ready.return_value = make_summary(3) + + result = ingest_scraped_collection(collection.id) # must not raise + + assert result is None + collection.refresh_from_db() + assert collection.workflow_status == WorkflowStatusChoices.SCRAPING_FAILED + + @patch("sde_collections.tasks.send_detailed_import_notification") + @patch("sde_collections.tasks.fetch_documents") + @patch("sde_collections.tasks.results_ready") + def test_rescrape_path_ends_ready_for_recuration(self, mock_ready, mock_docs, mock_slack): + """reindexing NEEDED -> ingest claims to FINISHED -> migrate task promotes to + REINDEXING_READY_FOR_CURATION (the migrate task's existing transition).""" + collection = CollectionFactory( + workflow_status=WorkflowStatusChoices.PROD_PERFECT, + reindexing_status=ReindexingStatusChoices.REINDEXING_NEEDED_ON_DEV, + ) + ScrapeDispatch.objects.create(collection=collection, ssm_command_id="cmd-1") + mock_ready.return_value = make_summary(2) + mock_docs.return_value = make_documents(2) + + with patch( + "sde_collections.models.collection.migrate_dump_to_delta_and_handle_status_transistions.delay" + ) as mock_delay: + ingest_scraped_collection(collection.id) + + collection.refresh_from_db() + assert collection.reindexing_status == ReindexingStatusChoices.REINDEXING_FINISHED_ON_DEV + assert collection.workflow_status == WorkflowStatusChoices.PROD_PERFECT # untouched + mock_delay.assert_called_once_with(collection.id) + + # Now run the migration task for real (the .delay was mocked above). + migrate_dump_to_delta_and_handle_status_transistions(collection.id) + + collection.refresh_from_db() + assert collection.reindexing_status == ReindexingStatusChoices.REINDEXING_READY_FOR_CURATION + mock_slack.assert_called_once() + + @patch("sde_collections.tasks.send_detailed_import_notification") + @patch("sde_collections.tasks.fetch_documents") + @patch("sde_collections.tasks.results_ready") + def test_end_to_end_reaches_ready_for_curation_with_inference_off( + self, mock_ready, mock_docs, mock_slack + ): + """P2+P4 integration: ingest -> SCRAPING_SUCCESSFUL -> migrate -> READY_FOR_CURATION, + with the ingest summary posted to Slack.""" + collection = CollectionFactory(workflow_status=WorkflowStatusChoices.READY_FOR_ENGINEERING) + ScrapeDispatch.objects.create(collection=collection, ssm_command_id="cmd-1") + mock_ready.return_value = make_summary(3) + mock_docs.return_value = make_documents(3) + + with patch( + "sde_collections.models.collection.migrate_dump_to_delta_and_handle_status_transistions.delay" + ) as mock_delay: + ingest_scraped_collection(collection.id) + mock_delay.assert_called_once_with(collection.id) + + # READY_FOR_CURATION still fires the Sinequa indexer-config branch until P5 + # removes it — patch it out here as the pre-existing trigger tests do. + with ( + patch("sde_collections.models.collection.Collection.create_indexer_config"), + patch("sde_collections.models.collection.Collection.create_indexer_job"), + ): + migrate_dump_to_delta_and_handle_status_transistions(collection.id) + + collection.refresh_from_db() + assert collection.workflow_status == WorkflowStatusChoices.READY_FOR_CURATION + assert collection.delta_urls.count() == 3 + mock_slack.assert_called_once() + assert mock_slack.call_args.kwargs["dump_count"] == 3 + assert mock_slack.call_args.kwargs["delta_count"] == 3 + + +@pytest.mark.django_db +class TestPollScrapeJobs: + @patch("sde_collections.tasks.ingest_scraped_collection.delay") + @patch("sde_collections.tasks.results_ready") + def test_fresh_results_enqueue_ingest(self, mock_ready, mock_ingest): + collection = CollectionFactory(workflow_status=WorkflowStatusChoices.READY_FOR_ENGINEERING) + ScrapeDispatch.objects.create(collection=collection, ssm_command_id="cmd-1") + mock_ready.return_value = make_summary(3) + + poll_scrape_jobs() + + mock_ingest.assert_called_once_with(collection.id) + + @patch("sde_collections.tasks.ingest_scraped_collection.delay") + @patch("sde_collections.tasks.results_ready", return_value=None) + def test_missing_summary_leaves_collection_waiting(self, mock_ready, mock_ingest): + collection = CollectionFactory(workflow_status=WorkflowStatusChoices.READY_FOR_ENGINEERING) + ScrapeDispatch.objects.create(collection=collection, ssm_command_id="cmd-1") + + poll_scrape_jobs() + + mock_ingest.assert_not_called() + collection.refresh_from_db() + assert collection.workflow_status == WorkflowStatusChoices.READY_FOR_ENGINEERING + + @patch("sde_collections.tasks.ingest_scraped_collection.delay") + @patch("sde_collections.tasks.results_ready", return_value=None) + def test_stall_timeout_marks_scraping_failed(self, mock_ready, mock_ingest): + collection = CollectionFactory(workflow_status=WorkflowStatusChoices.READY_FOR_ENGINEERING) + dispatch = ScrapeDispatch.objects.create(collection=collection, ssm_command_id="cmd-1") + backdate_dispatch(dispatch, hours=25) # default timeout is 24h + + poll_scrape_jobs() + + mock_ingest.assert_not_called() + collection.refresh_from_db() + assert collection.workflow_status == WorkflowStatusChoices.SCRAPING_FAILED + + @patch("sde_collections.tasks.ingest_scraped_collection.delay") + @patch("sde_collections.tasks.results_ready") + def test_undispatched_collection_is_skipped(self, mock_ready, mock_ingest): + CollectionFactory(workflow_status=WorkflowStatusChoices.READY_FOR_ENGINEERING) + + poll_scrape_jobs() + + mock_ready.assert_not_called() + mock_ingest.assert_not_called() + + @patch("sde_collections.tasks.ingest_scraped_collection.delay") + @patch("sde_collections.tasks.results_ready") + def test_rescrape_collections_are_polled(self, mock_ready, mock_ingest): + collection = CollectionFactory( + workflow_status=WorkflowStatusChoices.PROD_PERFECT, + reindexing_status=ReindexingStatusChoices.REINDEXING_NEEDED_ON_DEV, + ) + ScrapeDispatch.objects.create(collection=collection, ssm_command_id="cmd-1") + mock_ready.return_value = make_summary(2) + + poll_scrape_jobs() + + mock_ingest.assert_called_once_with(collection.id) + + +class TestResultsFreshness: + """Stale-results regression guard: a summary older than the dispatch is treated as absent.""" + + @patch("sde_collections.scraping.s3_results.fetch_summary") + def test_stale_summary_is_treated_as_absent(self, mock_fetch): + dispatched_at = datetime(2026, 8, 13, 12, 0, 0, tzinfo=dt_timezone.utc) + mock_fetch.return_value = (make_summary(5), dispatched_at - timedelta(hours=2)) + + assert results_ready("some_collection", dispatched_at) is None + + @patch("sde_collections.scraping.s3_results.fetch_summary") + def test_fresh_summary_is_returned(self, mock_fetch): + dispatched_at = datetime(2026, 8, 13, 12, 0, 0, tzinfo=dt_timezone.utc) + summary = make_summary(5) + mock_fetch.return_value = (summary, dispatched_at + timedelta(minutes=10)) + + assert results_ready("some_collection", dispatched_at) == summary + + @patch("sde_collections.scraping.s3_results.fetch_summary", return_value=None) + def test_missing_summary_returns_none(self, mock_fetch): + assert results_ready("some_collection", timezone.now()) is None From 9b3df5190260f09d753192f001768f75d7639f03 Mon Sep 17 00:00:00 2001 From: Bernard Benson Date: Thu, 13 Aug 2026 15:50:01 -0500 Subject: [PATCH 07/20] =?UTF-8?q?Phase=205=20=E2=80=94=20Curation=20trigge?= =?UTF-8?q?rs=20and=20the=20indexing=20hand-off?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- IMPLEMENTATION_PLAN.md | 14 +-- .../testing_strategy.md | 2 +- .../models/README_STATUS_TRIGGERS.md | 73 +++++++----- sde_collections/models/collection.py | 72 +++++++----- sde_collections/tasks.py | 26 ++++ .../tests/test_import_fulltexts.py | 6 +- sde_collections/tests/test_scrape_ingest.py | 8 +- .../tests/test_workflow_status_triggers.py | 111 +++++++++++++----- 8 files changed, 206 insertions(+), 106 deletions(-) diff --git a/IMPLEMENTATION_PLAN.md b/IMPLEMENTATION_PLAN.md index a7779fa2..184c41c3 100644 --- a/IMPLEMENTATION_PLAN.md +++ b/IMPLEMENTATION_PLAN.md @@ -550,9 +550,9 @@ Expect dump count to match `documents_scraped` in the summary, deltas created, s - [x] Ingest claims via CAS before writing, is idempotent, and populates `DumpUrl` without touching the model - [x] Re-scrape path (`REINDEXING_NEEDED_ON_DEV`) polls and ingests end to end - [x] A real dev collection goes seed URL → `Ready for Curation` end to end -- [ ] Slack posts an ingest summary *(wired in the migrate task + unit-asserted with counts; a real - post is blocked until P5 removes the Sinequa `READY_FOR_CURATION → create_indexer_config` - branch, which currently raises after the status save and cuts the task short — re-verify in P5)* +- [x] Slack posts an ingest summary *(wired in the migrate task; was blocked by the Sinequa + `READY_FOR_CURATION → create_indexer_config` branch raising mid-task — P5 removed that + branch, and the P4 end-to-end test now runs unpatched, asserting the notification + counts)* --- @@ -620,10 +620,10 @@ Confirm `CuratedUrl`s appear, `DeltaUrl`s are cleared, status lands on `Test Ind and Slack posts the curation message. ### Done when -- [ ] Dispatcher renamed and rewired; no Sinequa calls remain in the trigger path -- [ ] Slack moved into `post_save` -- [ ] Indexing stubs enqueue and set the in-flight statuses -- [ ] `test_workflow_status_triggers.py` rewritten and green +- [x] Dispatcher renamed and rewired; no Sinequa calls remain in the trigger path +- [x] Slack moved into `post_save` +- [x] Indexing stubs enqueue and set the in-flight statuses +- [x] `test_workflow_status_triggers.py` rewritten and green --- diff --git a/docs/architecture-decisions/testing_strategy.md b/docs/architecture-decisions/testing_strategy.md index a8754750..3d6c0298 100644 --- a/docs/architecture-decisions/testing_strategy.md +++ b/docs/architecture-decisions/testing_strategy.md @@ -134,7 +134,7 @@ tests/test_merge_production_dotenvs_in_dotenv.py | - _write_to_github() - update_config_xml() - apply_all_patterns() - - create_configs_on_status_change() + - handle_workflow_status_change() - sde_collections/models/collection_choice_fields.py - sde_collections/models/delta_patterns.py - sde_collections/models/delta_url.py diff --git a/sde_collections/models/README_STATUS_TRIGGERS.md b/sde_collections/models/README_STATUS_TRIGGERS.md index ed96bc73..a5a21487 100644 --- a/sde_collections/models/README_STATUS_TRIGGERS.md +++ b/sde_collections/models/README_STATUS_TRIGGERS.md @@ -1,6 +1,9 @@ # Collection Status Workflows This document outlines the automated workflows triggered by status changes in Collections. +The single dispatcher is the `handle_workflow_status_change` post_save receiver in +`collection.py` (formerly `create_configs_on_status_change` — renamed in the Sinequa +retirement: it no longer creates configs). ## Workflow Status Transitions @@ -8,37 +11,46 @@ Collections progress through workflow statuses that trigger specific automated a ### Initial Flow 1. `RESEARCH_IN_PROGRESS` → `READY_FOR_ENGINEERING` - - Triggers: Creation of initial scraper and indexer configs - -2. `READY_FOR_ENGINEERING` → `ENGINEERING_IN_PROGRESS` → `INDEXING_FINISHED_ON_DEV` - - When indexing finishes, a developer changes the status to `INDEXING_FINISHED_ON_DEV` - - This will trigger a full text fetch from LRM dev - - If the fetch completes successfully, it updates the status to `READY_FOR_CURATION` - -3. `READY_FOR_CURATION` - - Triggers creation/update of plugin config - -4. `READY_FOR_CURATION` → `CURATION_IN_PROGRESS` → `CURATED` + - Triggers `dispatch_scrape_job`: a job JSON (seed + any `ScraperConfigOverride` + values) is written to the crawl4ai crawler's inbox on EC2 via SSM, and a + `ScrapeDispatch` row records the dispatch time + +2. Scrape completion (automated — no manual status change) + - The `poll_scrape_jobs` beat task (every 5 min, gated on `SCRAPE_POLL_ENABLED`) + watches S3 for a results summary fresher than the dispatch + - On completion, `ingest_scraped_collection` claims the collection + (→ `SCRAPING_SUCCESSFUL`), replaces its DumpUrls from S3, migrates to DeltaUrls, + and lands on `READY_FOR_CURATION` + - A zero-document crawl, a dispatch/ingest failure, or a stall past + `SCRAPE_STALL_TIMEOUT_HOURS` lands on `SCRAPING_FAILED` + +3. `READY_FOR_CURATION` → `CURATION_IN_PROGRESS` → `CURATED` - When curation finishes, the curator marks the collection as `CURATED` - - This triggers the promotion of DeltaUrls to CuratedUrls + - This promotes DeltaUrls to CuratedUrls **and** enqueues `index_collection_to_test` + (→ `TEST_INDEXING`) — the hand-off to the WEB_COSMOS indexing pipeline -5. Quality Check Flow: +4. Quality Check Flow: - During quality checks the curator can put the status as `QUALITY_CHECK_PERFECT/MINOR` - - These passing quality statuses will trigger the addition of the collection to the public query - - After the PR is merged and SDE Prod server is updated with the latest code, this collection will become visible + - These passing quality statuses enqueue `index_collection_to_prod` + (→ `PRODUCTION_INDEXING`) + - Indexing failures surface as `INDEXING_FAILED_ON_TEST` / `INDEXING_FAILED_ON_PROD` + +`INDEXING_FINISHED_ON_DEV` is a Sinequa-era status and no longer triggers anything. ### Reindexing Flow -After the main workflow, collections can enter a reindexing cycle: +After the main workflow, collections can enter a re-scrape cycle: 1. `REINDEXING_NOT_NEEDED` → `REINDEXING_NEEDED_ON_DEV` - - By default collections do not need reindexing - - They can be manually marked as reindexing needed on dev + - Manually marked; triggers `dispatch_scrape_job` (same dispatch/poll path as the + initial flow — this replaces the engineer manually re-running a Sinequa job) -2. `REINDEXING_NEEDED_ON_DEV` → `REINDEXING_FINISHED_ON_DEV` - - When re-indexing finishes, a developer changes the status to `REINDEXING_FINISHED_ON_DEV` - - This will trigger a full text fetch from LRM dev - - If the fetch completes successfully, it updates the status to `REINDEXING_READY_FOR_CURATION` +2. Scrape completion (automated) + - The poller watches the same S3 contract; ingest claims via + `REINDEXING_NEEDED_ON_DEV → REINDEXING_FINISHED_ON_DEV` and the migrate task + promotes to `REINDEXING_READY_FOR_CURATION` + - `REINDEXING_FINISHED_ON_DEV` itself deliberately triggers **nothing**: the ingest + sets it, so a trigger here would double-fire 3. `REINDEXING_READY_FOR_CURATION` → `REINDEXING_CURATED` - When re-curation finishes, the curator marks the collection as `REINDEXING_CURATED` @@ -47,13 +59,20 @@ After the main workflow, collections can enter a reindexing cycle: 4. `REINDEXING_CURATED` → `REINDEXING_INDEXED_ON_PROD` - After the collection has been indexed on Prod, a dev marks it as `REINDEXING_INDEXED_ON_PROD` -## Full Text Import Process +## Slack notifications + +Status-transition messages (`STATUS_CHANGE_NOTIFICATIONS`) are sent from the post_save +receiver — never from `Collection.save()` — so a message cannot be sent for a save that +then fails. The detailed ingest summary is posted by the migrate task after delta counts +exist. + +## Scrape Ingest Process -The full text import process integrates with both workflows: +The S3 ingest (replacing the old Sinequa full-text import) integrates with both workflows: -1. Clears existing DumpUrls for the collection -2. Fetches and processes new full text data in batches -3. Creates new DumpUrls +1. Claims the collection via an atomic status compare-and-swap (the transition is the lock) +2. Clears existing DumpUrls for the collection +3. Creates new DumpUrls from the scraped documents in S3 4. Migrates DumpUrls to DeltaUrls 5. Updates collection status based on context: - In main workflow: Updates to `READY_FOR_CURATION` diff --git a/sde_collections/models/collection.py b/sde_collections/models/collection.py index 53e55dd1..1acda959 100644 --- a/sde_collections/models/collection.py +++ b/sde_collections/models/collection.py @@ -20,7 +20,8 @@ ) from sde_collections.tasks import ( dispatch_scrape_job, - fetch_full_text, + index_collection_to_prod, + index_collection_to_test, migrate_dump_to_delta_and_handle_status_transistions, ) @@ -742,22 +743,9 @@ def save(self, *args, **kwargs): if not self.config_folder: self.config_folder = self._compute_config_folder_name() - if not self._state.adding: - old_status = Collection.objects.get(id=self.id).workflow_status - new_status = self.workflow_status - if old_status != new_status: - transition = (old_status, new_status) - if transition in STATUS_CHANGE_NOTIFICATIONS: - details = STATUS_CHANGE_NOTIFICATIONS[transition] - message = format_slack_message(self.name, details, self.id) - try: - # TODO: find a better way to allow this to work on dev environments with - # no slack integration - send_slack_message(message) - except Exception as e: - print(f"Error sending Slack message: {e}") - - # Call the parent class's save method + # Status-change Slack notifications live in the post_save receiver + # (handle_workflow_status_change), so a message can never be sent for a save + # that then fails. super().save(*args, **kwargs) def __init__(self, *args, **kwargs): @@ -883,10 +871,37 @@ def reindexing_status_button_color(self) -> str: return color_choices[self.reindexing_status] -@receiver(post_save, sender=Collection) -def create_configs_on_status_change(sender, instance, created, **kwargs): - """Creates various config files on certain workflow status changes""" +def _send_status_change_notification(instance, old_status, new_status): + """Slack notification for a committed status transition. Lives in post_save (not + Collection.save) so a message can never be sent for a save that then fails, and so + it reuses the tracker's old value instead of an extra Collection.objects.get().""" + details = STATUS_CHANGE_NOTIFICATIONS.get((old_status, new_status)) + if details is None: + return + message = format_slack_message(instance.name, details, instance.id) + try: + # TODO: find a better way to allow this to work on dev environments with + # no slack integration + send_slack_message(message) + except Exception as e: + print(f"Error sending Slack message: {e}") + +@receiver(post_save, sender=Collection) +def handle_workflow_status_change(sender, instance, created, **kwargs): + """Single dispatcher for status-triggered side effects (WORKFLOW.md steps 12–18). + + workflow_status: + READY_FOR_ENGINEERING -> dispatch_scrape_job (P3) + CURATED -> promote_to_curated + test-indexing hand-off + QC_PERFECT / QC_MINOR -> prod-indexing hand-off + reindexing_status: + REINDEXING_NEEDED_ON_DEV -> dispatch_scrape_job (P3, re-scrape) + REINDEXING_CURATED -> promote_to_curated + + REINDEXING_FINISHED_ON_DEV deliberately triggers nothing: the P4 ingest sets that + status itself, so a trigger here would double-fire. + """ if getattr(instance, "_handling_status_change", False): return @@ -894,27 +909,24 @@ def create_configs_on_status_change(sender, instance, created, **kwargs): instance._handling_status_change = True if "workflow_status" in instance.tracker.changed(): - if instance.workflow_status == WorkflowStatusChoices.READY_FOR_CURATION: - instance.create_indexer_config(overwrite=True) - instance.create_indexer_job(overwrite=False) + old_status = instance.tracker.changed()["workflow_status"] + _send_status_change_notification(instance, old_status, instance.workflow_status) + + if instance.workflow_status == WorkflowStatusChoices.READY_FOR_ENGINEERING: + dispatch_scrape_job.delay(instance.id) elif instance.workflow_status == WorkflowStatusChoices.CURATED: instance.promote_to_curated() - elif instance.workflow_status == WorkflowStatusChoices.READY_FOR_ENGINEERING: - dispatch_scrape_job.delay(instance.id) - elif instance.workflow_status == WorkflowStatusChoices.INDEXING_FINISHED_ON_DEV: - fetch_full_text.delay(instance.id, "lrm_dev") + index_collection_to_test.delay(instance.id) elif instance.workflow_status in [ WorkflowStatusChoices.QUALITY_CHECK_PERFECT, WorkflowStatusChoices.QUALITY_CHECK_MINOR, ]: - instance.add_to_public_query() + index_collection_to_prod.delay(instance.id) if "reindexing_status" in instance.tracker.changed(): if instance.reindexing_status == ReindexingStatusChoices.REINDEXING_NEEDED_ON_DEV: # Re-scrape path: replaces the engineer manually re-running a Sinequa job. dispatch_scrape_job.delay(instance.id) - elif instance.reindexing_status == ReindexingStatusChoices.REINDEXING_FINISHED_ON_DEV: - fetch_full_text.delay(instance.id, "lrm_dev") elif instance.reindexing_status == ReindexingStatusChoices.REINDEXING_CURATED: instance.promote_to_curated() diff --git a/sde_collections/tasks.py b/sde_collections/tasks.py index 6ac56607..cf5556c3 100644 --- a/sde_collections/tasks.py +++ b/sde_collections/tasks.py @@ -333,6 +333,32 @@ def poll_scrape_jobs(): return f"Enqueued ingest for {enqueued} collection(s)." +@celery_app.task() +def index_collection_to_test(collection_id): + """P5 stub — the event-trigger seam for the WEB_COSMOS indexing pipeline + (sde-api-scrapers, branch web-indexing). P7 fills this in: mint a run_id, export the + curated set to S3 (documents.jsonl + manifest.json, manifest written last), assume + the dispatch role, and ecs:RunTask with a command override. Never indexes in-process. + """ + Collection = apps.get_model("sde_collections", "Collection") + collection = Collection.objects.get(id=collection_id) + collection.workflow_status = WorkflowStatusChoices.TEST_INDEXING + collection.save() + print(f"[P5 stub] Test indexing recorded for {collection.config_folder}; dispatch lands in P7.") + return f"Test indexing started for {collection.config_folder}" + + +@celery_app.task() +def index_collection_to_prod(collection_id): + """P5 stub — prod counterpart of index_collection_to_test; see its docstring.""" + Collection = apps.get_model("sde_collections", "Collection") + collection = Collection.objects.get(id=collection_id) + collection.workflow_status = WorkflowStatusChoices.PRODUCTION_INDEXING + collection.save() + print(f"[P5 stub] Production indexing recorded for {collection.config_folder}; dispatch lands in P7.") + return f"Production indexing started for {collection.config_folder}" + + @celery_app.task(soft_time_limit=600) def ingest_scraped_collection(collection_id, claim=True): """Ingest completed crawl results from S3 into DumpUrls (replaces fetch_full_text). diff --git a/sde_collections/tests/test_import_fulltexts.py b/sde_collections/tests/test_import_fulltexts.py index 392c2ed4..16c0a27d 100644 --- a/sde_collections/tests/test_import_fulltexts.py +++ b/sde_collections/tests/test_import_fulltexts.py @@ -7,7 +7,7 @@ from inference.models.inference import ModelVersion from inference.models.inference_choice_fields import ClassificationType -from sde_collections.models.collection import create_configs_on_status_change +from sde_collections.models.collection import handle_workflow_status_change from sde_collections.models.delta_url import DeltaUrl, DumpUrl from sde_collections.tasks import ( fetch_full_text, @@ -19,10 +19,10 @@ @pytest.fixture def disconnect_signals(): # Disconnect the signal before each test - post_save.disconnect(create_configs_on_status_change, sender="sde_collections.Collection") + post_save.disconnect(handle_workflow_status_change, sender="sde_collections.Collection") yield # Reconnect the signal after each test - post_save.connect(create_configs_on_status_change, sender="sde_collections.Collection") + post_save.connect(handle_workflow_status_change, sender="sde_collections.Collection") @pytest.fixture diff --git a/sde_collections/tests/test_scrape_ingest.py b/sde_collections/tests/test_scrape_ingest.py index 33f52f33..2b9968bf 100644 --- a/sde_collections/tests/test_scrape_ingest.py +++ b/sde_collections/tests/test_scrape_ingest.py @@ -177,13 +177,7 @@ def test_end_to_end_reaches_ready_for_curation_with_inference_off( ingest_scraped_collection(collection.id) mock_delay.assert_called_once_with(collection.id) - # READY_FOR_CURATION still fires the Sinequa indexer-config branch until P5 - # removes it — patch it out here as the pre-existing trigger tests do. - with ( - patch("sde_collections.models.collection.Collection.create_indexer_config"), - patch("sde_collections.models.collection.Collection.create_indexer_job"), - ): - migrate_dump_to_delta_and_handle_status_transistions(collection.id) + migrate_dump_to_delta_and_handle_status_transistions(collection.id) collection.refresh_from_db() assert collection.workflow_status == WorkflowStatusChoices.READY_FOR_CURATION diff --git a/sde_collections/tests/test_workflow_status_triggers.py b/sde_collections/tests/test_workflow_status_triggers.py index 4d2b9801..1ee83ebb 100644 --- a/sde_collections/tests/test_workflow_status_triggers.py +++ b/sde_collections/tests/test_workflow_status_triggers.py @@ -20,6 +20,9 @@ class TestWorkflowStatusTransitions(TestCase): + """P5 trigger table: the dispatcher (handle_workflow_status_change) drives only the + crawl4ai/indexing pipeline — every Sinequa branch is gone.""" + def setUp(self): self.collection = CollectionFactory() @@ -33,67 +36,113 @@ def test_ready_for_engineering_triggers_scrape_dispatch(self, mock_dispatch): mock_dispatch.assert_called_once_with(self.collection.id) @patch("sde_collections.tasks.fetch_full_text.delay") - def test_indexing_finished_triggers_full_text_fetch(self, mock_fetch): - """When status changes to INDEXING_FINISHED_ON_DEV, it should trigger full text fetch""" + def test_indexing_finished_triggers_nothing(self, mock_fetch): + """INDEXING_FINISHED_ON_DEV is a Sinequa-era status: its full-text-fetch trigger is + gone (the P4 ingest replaces the fetch entirely).""" self.collection.workflow_status = WorkflowStatusChoices.INDEXING_FINISHED_ON_DEV self.collection.save() - mock_fetch.assert_called_once_with(self.collection.id, "lrm_dev") + mock_fetch.assert_not_called() @patch("sde_collections.models.collection.Collection.create_indexer_config") - @patch("sde_collections.models.collection.GitHubHandler") - def test_ready_for_curation_triggers_indexer_config(self, mock_github_handler, mock_indexer): - """When status changes to READY_FOR_CURATION, it should create indexer config""" + @patch("sde_collections.models.collection.Collection.create_indexer_job") + def test_ready_for_curation_triggers_nothing(self, mock_indexer_job, mock_indexer_config): + """The Sinequa indexer-config branch on READY_FOR_CURATION is gone.""" self.collection.workflow_status = WorkflowStatusChoices.READY_FOR_CURATION self.collection.save() - mock_indexer.assert_called_once_with(overwrite=True) + mock_indexer_config.assert_not_called() + mock_indexer_job.assert_not_called() + @patch("sde_collections.tasks.index_collection_to_test.delay") @patch("sde_collections.models.collection.Collection.promote_to_curated") - def test_curated_triggers_promotion(self, mock_promote): - """When status changes to CURATED, it should promote DeltaUrls to CuratedUrls""" + def test_curated_promotes_and_enqueues_test_indexing(self, mock_promote, mock_index_test): + """CURATED promotes DeltaUrls to CuratedUrls AND hands off to test indexing.""" self.collection.workflow_status = WorkflowStatusChoices.CURATED self.collection.save() mock_promote.assert_called_once() + mock_index_test.assert_called_once_with(self.collection.id) @patch("sde_collections.models.collection.Collection.add_to_public_query") - def test_quality_check_perfect_triggers_public_query(self, mock_add): - """When status changes to QUALITY_CHECK_PERFECT, it should add to public query""" - self.collection.workflow_status = WorkflowStatusChoices.QUALITY_CHECK_PERFECT - self.collection.save() + @patch("sde_collections.tasks.index_collection_to_prod.delay") + def test_quality_check_statuses_enqueue_prod_indexing(self, mock_index_prod, mock_add): + """QC_PERFECT / QC_MINOR hand off to prod indexing; add_to_public_query is gone.""" + for status in [WorkflowStatusChoices.QUALITY_CHECK_PERFECT, WorkflowStatusChoices.QUALITY_CHECK_MINOR]: + collection = CollectionFactory() + collection.workflow_status = status + collection.save() + + mock_index_prod.assert_called_with(collection.id) + assert mock_index_prod.call_count == 2 + mock_add.assert_not_called() + + @patch("sde_collections.tasks.index_collection_to_test.delay") + def test_reentrancy_guard_prevents_recursion(self, mock_index_test): + """A save() performed inside a trigger must not re-fire the dispatcher.""" + + def promote_and_save_again(): + # Simulates a trigger mutating and saving the same instance. + self.collection.save() + + with patch( + "sde_collections.models.collection.Collection.promote_to_curated", + side_effect=promote_and_save_again, + ) as mock_promote: + self.collection.workflow_status = WorkflowStatusChoices.CURATED + self.collection.save() - mock_add.assert_called_once() + mock_promote.assert_called_once() + mock_index_test.assert_called_once() -class TestReindexingStatusTransitions(TestCase): +class TestSlackNotificationOnTransition(TestCase): + """P5: the Slack send moved out of Collection.save() into the post_save receiver.""" + def setUp(self): - # Mock the GitHubHandler to return valid XML content - self.mock_github_handler = patch("sde_collections.models.collection.GitHubHandler").start() - - self.mock_github_handler.return_value._get_file_contents.return_value.decoded_content = ( - b'\n' - b"\n" - b" false\n" - b" Sample Collection\n" - b"" - ) + self.collection = CollectionFactory(workflow_status=WorkflowStatusChoices.RESEARCH_IN_PROGRESS) + + @patch("sde_collections.tasks.dispatch_scrape_job.delay") + @patch("sde_collections.models.collection.send_slack_message") + def test_mapped_transition_sends_message_once(self, mock_send, mock_dispatch): + self.collection.workflow_status = WorkflowStatusChoices.READY_FOR_ENGINEERING + self.collection.save() - self.addCleanup(patch.stopall) + mock_send.assert_called_once() + assert self.collection.name in mock_send.call_args.args[0] or "<" in mock_send.call_args.args[0] - # Create the collection with the mock applied + @patch("sde_collections.models.collection.send_slack_message") + def test_unmapped_transition_sends_nothing(self, mock_send): + self.collection.workflow_status = WorkflowStatusChoices.MERGE_PENDING + self.collection.save() + + mock_send.assert_not_called() + + @patch("sde_collections.models.collection.send_slack_message", side_effect=Exception("slack down")) + @patch("sde_collections.tasks.dispatch_scrape_job.delay") + def test_slack_failure_does_not_break_the_save(self, mock_dispatch, mock_send): + self.collection.workflow_status = WorkflowStatusChoices.READY_FOR_ENGINEERING + self.collection.save() # must not raise + + self.collection.refresh_from_db() + assert self.collection.workflow_status == WorkflowStatusChoices.READY_FOR_ENGINEERING + + +class TestReindexingStatusTransitions(TestCase): + def setUp(self): self.collection = CollectionFactory( - workflow_status=WorkflowStatusChoices.QUALITY_CHECK_PERFECT, + workflow_status=WorkflowStatusChoices.PROD_PERFECT, reindexing_status=ReindexingStatusChoices.REINDEXING_NOT_NEEDED, ) @patch("sde_collections.tasks.fetch_full_text.delay") - def test_reindexing_finished_triggers_full_text_fetch(self, mock_fetch): - """When reindexing status changes to FINISHED, it should trigger full text fetch""" + def test_reindexing_finished_triggers_nothing(self, mock_fetch): + """REINDEXING_FINISHED_ON_DEV must trigger nothing: the P4 ingest sets this status + itself — a fetch trigger here would double-fire.""" self.collection.reindexing_status = ReindexingStatusChoices.REINDEXING_FINISHED_ON_DEV self.collection.save() - mock_fetch.assert_called_once_with(self.collection.id, "lrm_dev") + mock_fetch.assert_not_called() @patch("sde_collections.models.collection.Collection.promote_to_curated") def test_reindexing_curated_triggers_promotion(self, mock_promote): From 42a38b3728f6b8ab326410707b5d5985637595fb Mon Sep 17 00:00:00 2001 From: Bernard Benson Date: Thu, 13 Aug 2026 16:14:12 -0500 Subject: [PATCH 08/20] =?UTF-8?q?Phase=206=20=E2=80=94=20Delete=20Sinequa?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .coveragerc | 6 + .env_sample | 6 - .envs/.local/.django | 22 - IMPLEMENTATION_PLAN.md | 9 +- config/settings/base.py | 13 - config_generation/README.md | 18 - config_generation/__init__.py | 0 config_generation/api.py | 88 - config_generation/config_example.py | 69 - config_generation/db_to_xml.py | 442 ----- config_generation/db_to_xml_file_based.py | 119 -- config_generation/delete_config_folders.py | 52 - config_generation/delete_server_content.py | 25 - .../delete_webapp_collections.py | 16 - config_generation/export_collections.py | 73 - config_generation/export_whole_index.py | 58 - config_generation/generate_collection_list.py | 71 - config_generation/generate_commands.py | 87 - config_generation/generate_emac_indexer.py | 81 - config_generation/generate_jobs.py | 100 - config_generation/generate_scrapers.py | 66 - .../default.xml | 364 ---- config_generation/minimum_api.py | 81 - .../plugins/ListCandidateUrls.cs | 77 - config_generation/preprocess_sources.py | 50 - config_generation/sources_to_scrape.py | 1631 ----------------- config_generation/tests/__init__.py | 0 .../tests/test_config_generation_pipeline.py | 90 - config_generation/tests/test_db_to_xml.py | 142 -- config_generation/xmls/command_template.xml | 29 - config_generation/xmls/delete_template.xml | 22 - .../example_exclude_and_title_patterns.xml | 40 - config_generation/xmls/indexer_template.xml | 289 --- config_generation/xmls/indexing_template.xml | 285 --- .../xmls/job_command_template.xml | 35 - config_generation/xmls/job_template.xml | 35 - config_generation/xmls/joblist_template.xml | 40 - .../xmls/json_url_indexing_template.xml | 373 ---- config_generation/xmls/scraper_template.xml | 295 --- default_scraper.xml | 287 --- docs/documentation/sinequa_api.rst | 12 - docs/index.rst | 2 - requirements/base.txt | 2 - requirements/local.txt | 1 - scripts/health_checks_on_urls_titles.py | 58 - scripts/push_curated_collections_to_github.py | 17 - .../find_missing_folders.py | 60 - scripts/update_has_sinequa_config.py | 7 - sde_collections/admin.py | 138 +- .../management/commands/generate_configs.py | 29 - .../commands/import_from_sinequa.py | 19 - .../management/commands/load_urls_from_api.py | 12 - .../management/commands/push_to_github.py | 34 - .../commands/sync_all_with_github.py | 41 - sde_collections/models/collection.py | 240 --- sde_collections/sinequa_api.py | 324 ---- sde_collections/tasks.py | 169 -- sde_collections/tests.py | 36 - .../tests/test_import_fulltexts.py | 114 -- sde_collections/tests/test_scrape_dispatch.py | 10 +- sde_collections/tests/test_sinequa_api.py | 364 ---- .../tests/test_workflow_status_triggers.py | 460 +---- sde_collections/urls.py | 15 - sde_collections/utils/bulk_github_push.py | 22 - sde_collections/utils/github_helper.py | 227 --- sde_collections/utils/health_check.py | 273 --- sde_collections/views.py | 116 -- .../xml_templates/new_collection_template.xml | 292 --- .../js/consolidate_db_and_github_configs.js | 9 - sde_indexing_helper/static/js/project.js | 2 +- .../sde_collections/collection_detail.html | 6 - .../consolidate_db_and_github_configs.html | 58 - 72 files changed, 79 insertions(+), 8676 deletions(-) create mode 100644 .coveragerc delete mode 100644 config_generation/README.md delete mode 100644 config_generation/__init__.py delete mode 100644 config_generation/api.py delete mode 100644 config_generation/config_example.py delete mode 100644 config_generation/db_to_xml.py delete mode 100644 config_generation/db_to_xml_file_based.py delete mode 100644 config_generation/delete_config_folders.py delete mode 100644 config_generation/delete_server_content.py delete mode 100644 config_generation/delete_webapp_collections.py delete mode 100644 config_generation/export_collections.py delete mode 100644 config_generation/export_whole_index.py delete mode 100644 config_generation/generate_collection_list.py delete mode 100644 config_generation/generate_commands.py delete mode 100644 config_generation/generate_emac_indexer.py delete mode 100644 config_generation/generate_jobs.py delete mode 100644 config_generation/generate_scrapers.py delete mode 100644 config_generation/indexing_configs/emac_exoplanet_modeling_and_analysis_center/default.xml delete mode 100644 config_generation/minimum_api.py delete mode 100644 config_generation/plugins/ListCandidateUrls.cs delete mode 100644 config_generation/preprocess_sources.py delete mode 100644 config_generation/sources_to_scrape.py delete mode 100644 config_generation/tests/__init__.py delete mode 100644 config_generation/tests/test_config_generation_pipeline.py delete mode 100644 config_generation/tests/test_db_to_xml.py delete mode 100644 config_generation/xmls/command_template.xml delete mode 100644 config_generation/xmls/delete_template.xml delete mode 100644 config_generation/xmls/example_exclude_and_title_patterns.xml delete mode 100644 config_generation/xmls/indexer_template.xml delete mode 100644 config_generation/xmls/indexing_template.xml delete mode 100644 config_generation/xmls/job_command_template.xml delete mode 100644 config_generation/xmls/job_template.xml delete mode 100644 config_generation/xmls/joblist_template.xml delete mode 100644 config_generation/xmls/json_url_indexing_template.xml delete mode 100644 config_generation/xmls/scraper_template.xml delete mode 100644 default_scraper.xml delete mode 100644 docs/documentation/sinequa_api.rst delete mode 100644 scripts/health_checks_on_urls_titles.py delete mode 100644 scripts/push_curated_collections_to_github.py delete mode 100644 scripts/quality_and_indexing/find_missing_folders.py delete mode 100644 scripts/update_has_sinequa_config.py delete mode 100644 sde_collections/management/commands/generate_configs.py delete mode 100644 sde_collections/management/commands/import_from_sinequa.py delete mode 100644 sde_collections/management/commands/load_urls_from_api.py delete mode 100644 sde_collections/management/commands/push_to_github.py delete mode 100644 sde_collections/management/commands/sync_all_with_github.py delete mode 100644 sde_collections/sinequa_api.py delete mode 100644 sde_collections/tests.py delete mode 100644 sde_collections/tests/test_import_fulltexts.py delete mode 100644 sde_collections/tests/test_sinequa_api.py delete mode 100644 sde_collections/utils/bulk_github_push.py delete mode 100644 sde_collections/utils/github_helper.py delete mode 100644 sde_collections/utils/health_check.py delete mode 100644 sde_collections/xml_templates/new_collection_template.xml delete mode 100644 sde_indexing_helper/static/js/consolidate_db_and_github_configs.js delete mode 100644 sde_indexing_helper/templates/sde_collections/consolidate_db_and_github_configs.html diff --git a/.coveragerc b/.coveragerc new file mode 100644 index 00000000..300e53ba --- /dev/null +++ b/.coveragerc @@ -0,0 +1,6 @@ +[run] +source = . +include = */*.py + +[report] +show_missing = True diff --git a/.env_sample b/.env_sample index 7c0ba386..d29b61c7 100644 --- a/.env_sample +++ b/.env_sample @@ -6,14 +6,8 @@ DJANGO_ACCOUNT_ALLOW_REGISTRATION=False DJANGO_AWS_ACCESS_KEY_ID="" DJANGO_AWS_SECRET_ACCESS_KEY="" DJANGO_AWS_STORAGE_BUCKET_NAME="" -GITHUB_ACCESS_TOKEN="" -GITHUB_BRANCH_FOR_WEBAPP="" IPYTHONDIR="" REDIS_URL="" -SINEQUA_CONFIGS_GITHUB_REPO="" -SINEQUA_CONFIGS_REPO_DEV_BRANCH="" -SINEQUA_CONFIGS_REPO_MASTER_BRANCH="" -SINEQUA_CONFIGS_REPO_WEBAPP_PR_BRANCH="" SLACK_WEBHOOK_URL="" USE_DOCKER=no diff --git a/.envs/.local/.django b/.envs/.local/.django index 4916f89b..608c9500 100644 --- a/.envs/.local/.django +++ b/.envs/.local/.django @@ -22,32 +22,10 @@ DJANGO_AWS_ACCESS_KEY_ID='' DJANGO_AWS_SECRET_ACCESS_KEY='' DJANGO_AWS_STORAGE_BUCKET_NAME='' -# GitHub (please create a new file called .env and put these in there) -# ------------------------------------------------------------------------------ -GITHUB_ACCESS_TOKEN= -SINEQUA_CONFIGS_GITHUB_REPO='NASA-IMPACT/sde-backend' -SINEQUA_CONFIGS_REPO_MASTER_BRANCH='master' -SINEQUA_CONFIGS_REPO_DEV_BRANCH='dev' -SINEQUA_CONFIGS_REPO_WEBAPP_PR_BRANCH='dummy_branch' - # Slack Webhook # ------------------------------------------------------------------------------ SLACK_WEBHOOK_URL='' -#Server Credentials -#-------------------------------------------------------------------------------- -LRM_DEV_USER='' -LRM_DEV_PASSWORD='' -XLI_USER='' -XLI_PASSWORD='' -LRM_QA_USER='' -LRM_QA_PASSWORD='' - -#Server Tokens -#-------------------------------------------------------------------------------- -LRM_DEV_TOKEN='' -XLI_TOKEN='' - # SDE curation pipeline # All optional — defaults hold when unset. SDE_AWS_* are pipeline-scoped credentials # for local dev ONLY (distinct from DJANGO_AWS_* static-assets credentials above); diff --git a/IMPLEMENTATION_PLAN.md b/IMPLEMENTATION_PLAN.md index 184c41c3..2252333c 100644 --- a/IMPLEMENTATION_PLAN.md +++ b/IMPLEMENTATION_PLAN.md @@ -682,10 +682,11 @@ Unset every deleted env var in `.envs/.local/.django` **before** running — `co inherits `base.py`, so a lingering required var would mask a missed reference. ### Done when -- [ ] All listed files deleted; `manage.py check` clean -- [ ] Full test suite green with the Sinequa env vars **unset** -- [ ] Grep is clean apart from the retained enum member -- [ ] `requirements/base.txt` pruned; image rebuilds +- [x] All listed files deleted; `manage.py check` clean +- [x] Full test suite green with the Sinequa env vars **unset** +- [x] Grep is clean apart from the retained enum member (plus historical migration text and + comments, per the "changelog/history" allowance) +- [x] `requirements/base.txt` pruned; image rebuilds --- diff --git a/config/settings/base.py b/config/settings/base.py index 3934c975..dec10422 100644 --- a/config/settings/base.py +++ b/config/settings/base.py @@ -338,20 +338,7 @@ "EXCEPTION_HANDLER": "sde_indexing_helper.utils.exceptions.custom_exception_handler", } -GITHUB_ACCESS_TOKEN = env("GITHUB_ACCESS_TOKEN") -SINEQUA_CONFIGS_GITHUB_REPO = env("SINEQUA_CONFIGS_GITHUB_REPO") -SINEQUA_CONFIGS_REPO_MASTER_BRANCH = env("SINEQUA_CONFIGS_REPO_MASTER_BRANCH") -SINEQUA_CONFIGS_REPO_DEV_BRANCH = env("SINEQUA_CONFIGS_REPO_DEV_BRANCH") -SINEQUA_CONFIGS_REPO_WEBAPP_PR_BRANCH = env("SINEQUA_CONFIGS_REPO_WEBAPP_PR_BRANCH") SLACK_WEBHOOK_URL = env("SLACK_WEBHOOK_URL") -XLI_USER = env("XLI_USER") -XLI_PASSWORD = env("XLI_PASSWORD") -LRM_DEV_USER = env("LRM_DEV_USER") -LRM_DEV_PASSWORD = env("LRM_DEV_PASSWORD") -LRM_QA_USER = env("LRM_QA_USER") -LRM_QA_PASSWORD = env("LRM_QA_PASSWORD") -LRM_DEV_TOKEN = env("LRM_DEV_TOKEN") -XLI_TOKEN = env("XLI_TOKEN") INFERENCE_API_URL = env("INFERENCE_API_URL", default="http://host.docker.internal:8000") TDAMM_CLASSIFICATION_THRESHOLD = env("TDAMM_CLASSIFICATION_THRESHOLD", default="0.5") diff --git a/config_generation/README.md b/config_generation/README.md deleted file mode 100644 index 10edb8ff..00000000 --- a/config_generation/README.md +++ /dev/null @@ -1,18 +0,0 @@ -## Access Tokens -Generate your access token using https://doc.sinequa.com/en.sinequa-es.v11/Content/en.sinequa-es.how-to.access-tokens.html, then add it to a config.py as `token = ` - -## General API Stuff -https://doc.sinequa.com/en.sinequa-es.v11/Content/en.sinequa-es.devDoc.webservice.rest.html - -## Query API -For extra details on how to use the query api, you can see - -## Indexing API -Don't be fooled by the page on indexing.... -https://doc.sinequa.com/en.sinequa-es.v11/Content/en.sinequa-es.devDoc.webservice.rest-indexing.html#indexing-collection - -You want the page on jobs https://doc.sinequa.com/en.sinequa-es.v11/Content/en.sinequa-es.devDoc.webservice.rest-operation.html#operationcollectionStart. - -## Creating Job Lists -Update config.py to contain the latest collections you want to index. Then run generate_jobs.py and it will create the parallel batches. -If you want it to run on multiple nodes, you will need to add that in two places in the file, and then you won't be able to run the lists from the masterlist, because of a sinequa bug. diff --git a/config_generation/__init__.py b/config_generation/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/config_generation/api.py b/config_generation/api.py deleted file mode 100644 index 7ae4d99b..00000000 --- a/config_generation/api.py +++ /dev/null @@ -1,88 +0,0 @@ -from typing import Any - -import requests - -from config import tokens - -server_configs: dict[str, dict[str, str]] = { - "ren_server": { - "app_name": "nasa-sba-smd", - "query_name": "query-smd-primary", - "base_url": "http://sde-renaissance.nasa-impact.net", - }, - "test_server": { - "app_name": "nasa-sba-smd", - "query_name": "query-smd-primary", - "base_url": "http://10.51.14.135", - }, -} - - -class Api: - def __init__(self, server_name: str) -> None: - self.headers: dict[str, str] = {"Authorization": f"Bearer {tokens[server_name]}"} - self.app_name: str = server_configs[server_name]["app_name"] - self.query_name: str = server_configs[server_name]["query_name"] - self.base_url: str = server_configs[server_name]["base_url"] - - def process_response(self, url: str, payload: dict[str, Any]) -> dict[str, Any]: - response = requests.post(url, headers=self.headers, json=payload, verify=False) - - if response.status_code == 200: - meaningful_response = response.json() - else: - meaningful_response = {"response_text": response.text} - - return meaningful_response - - def query(self, term: str): - url = f"{self.base_url}/api/v1/search.query" - payload = { - "app": self.app_name, - "query": { - "name": self.query_name, - "action": "search", - "text": term, - "pageSize": 1000, - "tab": "all", - }, - "pretty": "true", - } - - return self.process_response(url, payload) - - def sql(self, source: str, collection: str = "", fetch_all: bool = False) -> dict[str, Any]: - url = f"{self.base_url}/api/v1/engine.sql" - - collection_name = f"/{source}/{collection}/" - sql_command_all = "select url1,title,collection from @@ScienceMissionDirectorate" - if fetch_all: - sql_command = sql_command_all - else: - sql_command = f"{sql_command_all} where collection='{collection_name}'" - - payload = { - "sql": sql_command, - "maxRows": 10000000, # ten million - "pretty": "true", - } - response = self.process_response(url, payload) - - return response - - def run_indexer(self, source_name: str, collection_name: str) -> dict[str, Any]: - """Starts indexing on the given collection. Equivalent to pressing the play button in the - interface. This function will return the response from the sinequa server and then the - server will run the collection on it's own without restraining the python execution. - - Args: - source_name (str): this is the name of the source in sinequa, for example, Scraping or SMD - collection_name (str): for example astro_home_page - """ - url = f"{self.base_url}/api/v1/operation.collectionStart" - - payload = { - "collection": f"/{source_name}/{collection_name}/", - } - - return self.process_response(url, payload) diff --git a/config_generation/config_example.py b/config_generation/config_example.py deleted file mode 100644 index c1d9310b..00000000 --- a/config_generation/config_example.py +++ /dev/null @@ -1,69 +0,0 @@ -from sources_to_scrape import sources_to_index_test_grid_20240809 - -tokens: dict[str, str] = { - "test_server": "token here", - "ren_server": "token here", -} - -AVAILABLE_INDEXERS_TEST = [ - "IndexerServerA/identity0", - "IndexerServerB/identity0", -] - -AVAILABLE_INDEXERS_PROD = ["NodeINDEX1/identity0", "NodeINDEX2/identity0"] - -TEST_SERVER_INDEXES = [ # this is the test server list - # "sde_neural_test_index", - "sde_index" -] - -PROD_SERVER_INDEXES = [ - # "EDP_Audit_1", - # "SMD_LSDA_Repository_1", - # # "EDP_UserMetadata_1", - # "SMD_NTRS_Repository_1", - # "GCMD_Repository_1", - # "SMD_PLANETARY_Repository_1", - # # "GCMD_Repository_1_Metadata", - # "SMD_PLANETARY_Repository_2", - # "GCMD_Repository_2", - # "STI_Repository_1", - # # "GCMD_Repository_3_Metadata", - # # "STI_Repository_1_Metadata", - # "HELIO_Repository_1", - # "STI_Repository_2", - "SDE_Index", - # "STI_Repository_2_Metadata", - # "SMD_ASTRO_Repository_1", - # "STI_Repository_3", - # "SMD_ASTRO_Repository_2", - # "STI_Repository_4", - # "SMD_EARTHSCIENCE_Repository_1", - # # "SinequaDoc", - # "SMD_GENELAB_Repository_1", - # "Test", -] - - -SERVER_INFO = { - "test": { - "indexes": TEST_SERVER_INDEXES, - "indexers": AVAILABLE_INDEXERS_TEST, - }, - "prod": { - "indexes": PROD_SERVER_INDEXES, - "indexers": AVAILABLE_INDEXERS_PROD, - }, -} - -# Job Creation Config -collection_list: list[str] = sources_to_index_test_grid_20240809 # python list -date = "20240809" -source = "SDE" -server = "test" - -# auto assigned -batch_delete_name: str = f"sources_to_delete_on_{server}_{date}" -batch_index_name: str = f"sources_to_index_on_{server}_{date}" -available_indexers = SERVER_INFO[server]["indexers"] -indexes_to_delete_from = SERVER_INFO[server]["indexes"] diff --git a/config_generation/db_to_xml.py b/config_generation/db_to_xml.py deleted file mode 100644 index 89de197f..00000000 --- a/config_generation/db_to_xml.py +++ /dev/null @@ -1,442 +0,0 @@ -import json -import xml.etree.ElementTree as ET - -import xmltodict - -from sde_collections.models.collection_choice_fields import ( - ConnectorChoices, - DocumentTypes, -) - - -class XmlEditor: - """ - Class is instantiated with a path to an xml. - An internal etree is generated, and changes are made in place. - An ouput path is given and the etree is saved to it. - """ - - def __init__(self, xml_string: str): - self.xml_tree = self._get_tree(xml_string) - - def _get_tree(self, xml_string) -> ET.ElementTree: - """takes the path of an xml file and opens it as an ElementTree object""" - return ET.ElementTree(ET.fromstring(xml_string)) - - def get_tag_value(self, tag_name: str, strict: bool = False) -> str | list[str]: - """ - Retrieves the value of the specified XML tag. If 'strict' is True, the function will - raise an error if more than one value is found, and it will return the single value. - - Parameters: - - tag_name (str): Can be either the top level tag or a path specifying a child tag, e.g., 'parent/child'. - - strict (bool): If True, raises an error when more than one value is found, or if no values are found. - - Returns: - - str: The text of the single XML element matching the tag_name if strict is True and exactly one match exists. - - Raises: - - ValueError: If 'strict' is True and either no values or more than one value is found. - """ - - elements = self.xml_tree.findall(tag_name) - if strict: - if len(elements) == 0: - raise ValueError(f"No elements found for the tag '{tag_name}'") - elif len(elements) > 1: - raise ValueError(f"Multiple elements found for the tag '{tag_name}': expected exactly one.") - return elements[0].text - else: - return [element.text for element in elements] - - def _add_declaration(self, xml_string: str): - """adds xml declaration to xml string""" - declaration = """\n""" - - return declaration + xml_string - - def update_config_xml(self): - xml_string = ET.tostring( - self.xml_tree.getroot(), - encoding="utf8", - method="html", - xml_declaration=True, - ) - xml_string = xml_string.decode("utf-8") - - xml_string = self._add_declaration(xml_string) - xml_string = self._resave_pretty(xml_string) - - return xml_string - - def _resave_pretty(self, xml_string): - """opens and resaves a file to reformat it""" - - xml = xmltodict.parse(xml_string) - return xmltodict.unparse(xml, pretty=True) - - def update_or_add_element_value(self, path, new_value, parent_element_name=None): - """ - Update or create a value in the XML. - - Parameters: - - xml_string (str): The original XML string. - - path (str): The path to the element. Elements are separated by '/'. Example: 'root/child/grandchild' - - new_value (str): The new value to set. - - Returns: - - str: The updated XML string. - """ - - # Parse the XML string into an ElementTree - root = self.xml_tree.getroot() - - # Split the path into its components - if parent_element_name is not None: - path = f"{parent_element_name}/{path}" - elements = path.split("/") - - # Traverse and/or create the path - current_element = root - for element in elements: # Skip the root element - # If the child exists, move to it; otherwise, create it - next_element = current_element.find(element) - if next_element is None: - next_element = ET.SubElement(current_element, element) - current_element = next_element - - # Set the value - current_element.text = new_value - - # Return the updated XML as a string - return ET.tostring(root, encoding="utf-8").decode("utf-8") - - def convert_indexer_to_scraper(self) -> None: - """ - assuming this class has been instantiated with a previously constructed indexer config - some values must now be modified so it will be an effective scraper - """ - self.update_or_add_element_value("Indexers", "") - self.update_or_add_element_value("Plugin", "SMD_Plugins/Sinequa.Plugin.ListCandidateUrls") - self.update_or_add_element_value("ShardIndexes", "") - self.update_or_add_element_value("ShardingStrategy", "") - self.update_or_add_element_value("WorkerCount", "8") - self.update_or_add_element_value("LogLevel", "0", parent_element_name="System") - self.update_or_add_element_value("Simulate", "true", parent_element_name="IndexerClient") - - def convert_scraper_to_indexer(self) -> None: - # this is specialized for the production instance right now - self.update_or_add_element_value("Indexers", "") - self.update_or_add_element_value("Plugin", "") - self.update_or_add_element_value("Identity", "NodeIndexer1/identity0") # maybe make this blank? - self.update_or_add_element_value("ShardIndexes", "") - self.update_or_add_element_value("ShardingStrategy", "") - self.update_or_add_element_value("WorkerCount", "8") - self.update_or_add_element_value("LogLevel", "20", parent_element_name="System") - self.update_or_add_element_value("Simulate", "false", parent_element_name="IndexerClient") - - def convert_template_to_scraper(self, collection) -> None: - """ - assuming this class has been instantiated with the scraper_template.xml - """ - self.update_or_add_element_value("Url", collection.url) - - self.update_or_add_element_value("TreeRoot", collection.tree_root) - if collection.document_type: - self.add_document_type_mapping(document_type=collection.get_document_type_display(), criteria=None) - - scraper_config = self.update_config_xml() - return scraper_config - - def convert_template_to_job(self, collection, job_source) -> None: - """ - assuming this class has been instantiated with the job_template.xml - """ - self.update_or_add_element_value("Collection", f"/{job_source}/{collection.config_folder}/") - job_config = self.update_config_xml() - return job_config - - def convert_template_to_indexer(self, scraper_editor) -> None: - """ - assuming this class has been instantiated with the final_config_template.xml - """ - - transfer_fields = [ - "Throttle", - ] - - double_transfer_fields = [ - ("UrlAccess", "UseBrowserForWebRequests"), - ("UrlAccess", "BrowserForWebRequestsReadinessThreshold"), - ("UrlAccess", "BrowserForWebRequestsInitialDelay"), - ("UrlAccess", "BrowserForWebRequestsMaxTotalDelay"), - ("UrlAccess", "BrowserForWebRequestsMaxResourcesDelay"), - ("UrlAccess", "BrowserForWebRequestsLogLevel"), - ("UrlAccess", "BrowserForWebRequestsViewportWidth"), - ("UrlAccess", "BrowserForWebRequestsViewportHeight"), - ("UrlAccess", "BrowserForWebRequestsAdditionalJavascript"), - ("UrlAccess", "PostLoginUrl"), - ("UrlAccess", "PostLoginData"), - ("UrlAccess", "GetBeforePostLogin"), - ("UrlAccess", "PostLoginAutoRedirect"), - ("UrlAccess", "ReLoginCount"), - ("UrlAccess", "ReLoginDelay"), - ("UrlAccess", "DetectHtmlLoginPattern"), - ("IndexerClient", "RetryTimeout"), - ("IndexerClient", "RetrySleep"), - ] - - triple_transfer_fields = [ - ("UrlAccess", "BrowserLogin", "Activate"), - ("UrlAccess", "BrowserLogin", "RemoteDebuggingPort"), - ("UrlAccess", "BrowserLogin", "BrowserLogLevel"), - ("UrlAccess", "BrowserLogin", "ShowDevTools"), - ("UrlAccess", "BrowserLogin", "SuccessCondition"), - ("UrlAccess", "BrowserLogin", "CookieFilter"), - ] - - for field in transfer_fields: - self.update_or_add_element_value(field, scraper_editor.get_tag_value(field, strict=True)) - - for parent, child in double_transfer_fields: - self.update_or_add_element_value( - f"{parent}/{child}", scraper_editor.get_tag_value(f"{parent}/{child}", strict=True) - ) - - for grandparent, parent, child in triple_transfer_fields: - self.update_or_add_element_value( - f"{grandparent}/{parent}/{child}", - scraper_editor.get_tag_value(f"{grandparent}/{parent}/{child}", strict=True), - ) - - scraper_config = self.update_config_xml() - return scraper_config - - def _mapping_exists(self, new_mapping: ET.Element): - """ - Check if the mapping with given parameters already exists in the XML tree - """ - xml_root = self.xml_tree.getroot() - - for mapping in xml_root.findall("Mapping"): - existing_mapping = {child.tag: (child.text if child.text is not None else "") for child in mapping} - new_mapping_dict = {child.tag: (child.text if child.text is not None else "") for child in new_mapping} - if existing_mapping == new_mapping_dict: - return True - - return False - - @staticmethod - def _standardize_selection(selection): - """ - some existing selections may use double quotes while new ones need to use single quotes - # prior rule generations were not as selective, so some old selections used a trailing * - # while the new selection will not - this function creates two selections that will match against the old format and allow it to - be replaced by the _generic_mapping function - """ - standardized_quotes = selection.replace('"', "'") - # standardized_quotes_less_selective = standardized_quotes.replace( - # "*'", "'" - # ) - - return list(set(selection, standardized_quotes)) # , standardized_quotes_less_selective) - - def _generic_mapping( - self, - name: str = "", - description: str = "", - value: str = "", - selection: str = "", - ): - """ - most mappings take the same fields, so this gives a generic way to make a mapping - """ - xml_root = self.xml_tree.getroot() - - existing_mapping = None - for mapping in xml_root.findall("Mapping"): - mapping_name = mapping.find("Name") - mapping_selection = mapping.find("Selection") - - if ( - mapping_name - and mapping_name.text == name - and mapping_selection - and mapping_selection.text in self._standardize_selection(selection) - ): - existing_mapping = mapping - break - - if existing_mapping: - # If an existing mapping is found, overwrite its values - existing_mapping_value = existing_mapping.find("Value") - if existing_mapping_value: - existing_mapping_value.text = value - else: - # If no existing mapping is found, create a new one - mapping = ET.Element("Mapping") - ET.SubElement(mapping, "Name").text = name - ET.SubElement(mapping, "Description").text = description - ET.SubElement(mapping, "Value").text = value - ET.SubElement(mapping, "Selection").text = selection - ET.SubElement(mapping, "DefaultValue").text = "" - xml_root.append(mapping) - - def add_document_type_mapping(self, document_type: str, criteria: str) -> None: - if criteria: - selection = f"doc.url1 match '{criteria}'" - else: - selection = "" - self._generic_mapping( - name="sourcestr56", - value=f'"{document_type}"', - selection=selection, - ) - - def add_title_mapping(self, title_value: str, title_criteria: str) -> None: - title_criteria = title_criteria.rstrip("/") - sinequa_code_markers = ["xpath", "Concat", "IfEmpty", "doc.title", "doc.url1"] - if not any(marker in title_value for marker in sinequa_code_markers): - # exact title replacements need quotes - # sinequa code needs to NOT have quotes - title_value = f'"{title_value}"' - - self._generic_mapping( - name="title", - value=title_value, - selection=f"doc.url1 match '{title_criteria}'", - ) - - def add_job_list_item(self, job_name): - """ - this is specifically for editing joblist templates by adding a new collection to a joblist - config_generation/xmls/joblist_template.xml - """ - xml_root = self.xml_tree.getroot() - - mapping = ET.Element("JobListItem") - ET.SubElement(mapping, "Name").text = job_name - ET.SubElement(mapping, "StopOnError").text = "false" - xml_root.append(mapping) - - def add_id(self) -> None: - self._generic_mapping( - name="id", - value="doc.url1", - ) - - def add_document_type(self, document_type: str) -> None: - self._generic_mapping( - name="sourcestr56", - value=f'"{document_type}"', - ) - - def add_xpath_indexing_filter(self, xpath: str, selection: str = "") -> None: - # TODO: take in selection as an arg - """filters out the content of an xpath from being indexed along with the document""" - - xml_root = self.xml_tree.getroot() - - mapping = ET.Element("IndexingFilter") - ET.SubElement(mapping, "XPath").text = xpath - ET.SubElement(mapping, "IncludeMode").text = "false" - ET.SubElement(mapping, "Selection").text = selection - xml_root.append(mapping) - - def add_url_exclude(self, url_pattern: str) -> None: - """ - excludes a url or url pattern, such as - - https://webb.nasa.gov/content/forEducators/realworld* - - https://webb.nasa.gov/content/features/index.html - - *.rtf - """ - - xml_root = self.xml_tree.getroot() - - for url_index_excluded in xml_root.findall("UrlIndexExcluded"): - if url_index_excluded.text == url_pattern: - return # stop the function if the url pattern already exists - - # add the url pattern if it doesn't already exist - ET.SubElement(xml_root, "UrlIndexExcluded").text = url_pattern - - def add_url_include(self, url_pattern: str) -> None: - """ - includes a url or url pattern, such as - - https://webb.nasa.gov/content/forEducators/realworld* - - https://webb.nasa.gov/content/features/index.html - - *.rtf - I'm not sure if exclusion rules override includes or if includes override - exclusion rules. - """ - - xml_root = self.xml_tree.getroot() - - for url_index_included in xml_root.findall("UrlIndexIncluded"): - if url_index_included.text == url_pattern: - return # stop the function if the url pattern already exists - - # add the url pattern if it doesn't already exist - ET.SubElement(xml_root, "UrlIndexIncluded").text = url_pattern - - def _find_treeroot_field(self): - treeroot = self.xml_tree.find("TreeRoot") - if treeroot is None: - treeroot = self.xml_tree.find("treeRoot") - return treeroot - - def fetch_treeroot(self): - treeroot = self._find_treeroot_field() - return treeroot.text - - def fetch_division_name(self): - # this is pretty brittle and can break easily if the treeRoot field is changed - treeroot = self.fetch_treeroot() - splits = [split for split in treeroot.split("/") if split] - try: - division, name = splits - except ValueError: - print(f"Could not find division and name in {treeroot}") - division = "" - name = "" - return division, name - - def fetch_url(self): - url = self.xml_tree.find("Url") - if url is None: - url = self.xml_tree.find("url") - try: - return url.text - except AttributeError: - return "" - - def fetch_document_type(self): - DOCUMENT_TYPE_COLUMN = "sourcestr56" - try: - document_type_text = self.xml_tree.find(f"Mapping[Name='{DOCUMENT_TYPE_COLUMN}']/Value").text - except AttributeError: - return None - - try: - document_type = DocumentTypes.lookup_by_text(json.loads(document_type_text)) - except json.decoder.JSONDecodeError: - document_type = None - return document_type - - def fetch_connector(self): - connector = self.xml_tree.find("Connector") - if connector is None: - connector = self.xml_tree.find("connector") - - if connector is None: - connector = ConnectorChoices.NO_CONNECTOR - elif connector.text.strip() == "crawler2": - connector = ConnectorChoices.CRAWLER2 - elif connector.text.strip() == "json": - connector = ConnectorChoices.JSON - elif connector.text.strip() == "hyperindex": - connector = ConnectorChoices.HYPERINDEX - else: # as a catch all - connector = ConnectorChoices.NO_CONNECTOR - return connector diff --git a/config_generation/db_to_xml_file_based.py b/config_generation/db_to_xml_file_based.py deleted file mode 100644 index 14b077b7..00000000 --- a/config_generation/db_to_xml_file_based.py +++ /dev/null @@ -1,119 +0,0 @@ -# This file uses the previously written file-based xml handling code to supplement -# the new github-based xml code so that the job-creation pipeline will still work -# we can remove it once we incorporate job creation into the github pipeline -import os -import xml.etree.ElementTree as ET - - -class XmlEditor: - """ - Class is instantiated with a path to an xml. - An internal etree is generated, and changes are made in place. - An ouput path is given and the etree is saved to it. - """ - - def __init__(self, xml_path: str): - self.input_path = xml_path - self.xml_tree = self._get_tree(self.input_path) - - def _get_tree(self, xml_path) -> ET.ElementTree: - """takes the path of an xml file and opens it as an ElementTree object""" - return ET.parse(xml_path) - - def _add_declaration(self, output_path: str): - """opens an existing file and adds a declaration""" - declaration = """""" - with open(output_path, "r+") as f: - content = f.read() - f.seek(0, 0) - f.write(declaration.rstrip("\r\n") + "\n" + content) - - def _update_config_xml(self, output_path: str): - self.xml_tree.write( - output_path, - method="html", - encoding="utf-8", - xml_declaration=True, - ) - - self._add_declaration(output_path) - self._resave_pretty(output_path) - - def _resave_pretty(self, output_path): - """opens and resaves a file to reformat it""" - import xmltodict - - with open(output_path) as f: - xml_data = f.read() - xml = xmltodict.parse(xml_data) - with open(output_path, "w") as f: - f.write(xmltodict.unparse(xml, pretty=True)) - - def create_folder_if_needed(self, folder_path: str): - """ - sinequa configs are source_name/collection_name/default.xml - this function helps make the collection_name folder - folder path is a full exact path ending in a potential collection_name folder - """ - - try: - os.makedirs(folder_path) - except FileExistsError: - pass - except OSError as error: - print(f"Error creating folder '{folder_path}': {error}") - - def create_config_folder_and_default(self, source_name, collection_name): - """ - sinequa configs are source_name/collection_name/default.xml - makes a folder named after the collection with a default.xml inside of it - does this inside of the the specified source folder - """ - - # Create a folder named after source inside the desired directory - config_folder_path = os.path.join(source_name, collection_name) - self.create_folder_if_needed(config_folder_path) - xml_path = os.path.join(config_folder_path, "default.xml") - - # self._write_xml(xml_path) - self._update_config_xml(xml_path) - - def update_or_add_element_value( - self, - element_name: str, - element_value: str, - parent_element_name: str = "", - add_duplicate: bool = False, - ) -> None: - """can update the value of either a top level or secondary level value in the sinequa config - - Args: - element_name (str): name of the sinequa element, such as "Simulate" - element_value (str): value to be stored to element, such as "false" - parent_element_name (str, optional): parent of the element, such as "IndexerClient" - Defaults to None. - """ - - xml_root = self.xml_tree.getroot() - parent_element = xml_root if not parent_element_name else xml_root.find(parent_element_name) - - if parent_element is None: - raise ValueError(f"Parent element '{parent_element_name}' not found in XML.") # noqa: E713 - - existing_element = parent_element.find(element_name) - if not add_duplicate and existing_element: - existing_element.text = element_value - else: - ET.SubElement(parent_element, element_name).text = element_value - - def add_job_list_item(self, job_name): - """ - this is specifically for editing joblist templates by adding a new collection to a joblist - config_generation/xmls/joblist_template.xml - """ - xml_root = self.xml_tree.getroot() - - mapping = ET.Element("JobListItem") - ET.SubElement(mapping, "Name").text = job_name - ET.SubElement(mapping, "StopOnError").text = "false" - xml_root.append(mapping) diff --git a/config_generation/delete_config_folders.py b/config_generation/delete_config_folders.py deleted file mode 100644 index 119d48fc..00000000 --- a/config_generation/delete_config_folders.py +++ /dev/null @@ -1,52 +0,0 @@ -""" -this file deletes the files associated with a folder name as defined in config.py -it will delete - - config folders - - commands - - jobs -""" - -import glob -import os -import shutil - -from config import collection_list as collection_names -from config import source - - -def delete_folders_by_name(collection_names, directory): - for root, dirs, files in os.walk(directory, topdown=False): - for name in dirs: - if name in collection_names: - folder_path = os.path.join(root, name) - shutil.rmtree(folder_path) - print(f"Deleted folder: {folder_path}") - - -def delete_xml_files_by_name(collection_names, directory): - """ - this deletes files that match the sinequa pattern of - command.collectioncache.SMD.PDS_Users_Guides_Website.xml - where the name is surrounded by periods. this will prevent accidental matches to - similar names, but may leave a few stray undeleted files - """ - # Define the pattern to match the files - for collection_name in collection_names: - pattern = f"*.{collection_name}.xml" - - # Use glob to find all files in the directory that match the pattern - for file_path in glob.glob(os.path.join(directory, pattern)): - try: - os.remove(file_path) - print(f"Deleted file: {file_path}") - except OSError as e: - print(f"Error deleting file {file_path}: {e.strerror}") - - -delete_folders_by_name(collection_names, f"../sinequa_configs/sources/{source}/") -delete_xml_files_by_name( - collection_names, "../sinequa_configs/commands/" -) # this might delete jobs from any source, however not a huge issue right now -delete_xml_files_by_name( - collection_names, "../sinequa_configs/jobs/" -) # this might delete jobs from any source, however not a huge issue right now diff --git a/config_generation/delete_server_content.py b/config_generation/delete_server_content.py deleted file mode 100644 index a9cf6bcf..00000000 --- a/config_generation/delete_server_content.py +++ /dev/null @@ -1,25 +0,0 @@ -"""this file uses data from config.py to generate a command that will delete collection content from multiple indexes""" - -from db_to_xml_file_based import XmlEditor - -from config import ( - batch_delete_name, - collection_list, - engines, - indexes_to_delete_from, - source, -) - -COMMAND_FILES_PATH = "../sinequa_configs/commands/" -DELETE_COMMAND_TEMPLATE_PATH = "xmls/delete_template.xml" - -command_file = XmlEditor(DELETE_COMMAND_TEMPLATE_PATH) - -command_file.update_or_add_element_value(element_name="Engines", element_value=",".join([engine for engine in engines])) -for collection in collection_list: - for index in indexes_to_delete_from: - sql = f"delete from {index} where collection='/{source}/{collection}/'" - command_file.update_or_add_element_value(element_name="SQL", element_value=sql, add_duplicate=True) - -file_name = f"{COMMAND_FILES_PATH}{batch_delete_name}.xml" -command_file._update_config_xml(file_name) diff --git a/config_generation/delete_webapp_collections.py b/config_generation/delete_webapp_collections.py deleted file mode 100644 index d50815fb..00000000 --- a/config_generation/delete_webapp_collections.py +++ /dev/null @@ -1,16 +0,0 @@ -""" -this script is used in conjunction with deletes_config_folders.py and delete_content.py to purge a collection -in this case, from the webapp -""" - -from sde_collections.models.collection import Collection - - -def delete_collections_by_config_folder(names_to_delete): - for name in names_to_delete: - Collection.objects.filter(config_folder__exact=name).delete() - print(f"Deleted collections with config folder: {name}") - - -# run this in the shell on your list of collection names -# dmshell is the alias diff --git a/config_generation/export_collections.py b/config_generation/export_collections.py deleted file mode 100644 index d697eb9e..00000000 --- a/config_generation/export_collections.py +++ /dev/null @@ -1,73 +0,0 @@ -import json -import os -import zipfile - -import boto3 -import environ -from api import Api - -# Set the project base directory -BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) -COLLECTIONS_TO_UPLOAD = [ - # list of collections to upload, eg: "DataPathFinder" -] - -env = environ.Env( - # set casting, default value - DEBUG=(bool, False) -) - -# Take environment variables from .env file -environ.Env.read_env(os.path.join(BASE_DIR, ".env")) - -api = Api("test_server") - -for collection in COLLECTIONS_TO_UPLOAD: - print(f"Running SQL query for collection {collection}...") - response = api.sql("SMD", collection) - - # TODO: save response to a csv with f'{collection}.xml' as the name - candidate_urls = response["Rows"] - bulk_data = [ - { - "url": candidate_url[0], - "scraped_title": candidate_url[1], - } - for candidate_url in candidate_urls - ] - - TEMP_FOLDER_NAME = "temp" - - # Folder to create temporary files - os.makedirs(f"{TEMP_FOLDER_NAME}/{collection}", exist_ok=True) - - # Create JSON file - print("Creating JSON dump...") - json_data = json.dumps(bulk_data) - file_path = f"{TEMP_FOLDER_NAME}/{collection}/urls.json" # Provide the desired file path - with open(file_path, "w") as file: - file.write(json_data) - - # Zip the JSON file - print("Creating zip file...") - zip_file_path = f"{TEMP_FOLDER_NAME}/{collection}.zip" # Provide the desired zip file path - with zipfile.ZipFile(zip_file_path, "w") as zip_file: - zip_file.write(file_path, os.path.basename(file_path)) - - # Upload the zip file to S3 - s3_bucket_name = env("DJANGO_AWS_STORAGE_BUCKET_NAME") - s3_key = f"scraped_urls/{collection}.zip" # Provide the desired S3 key for the uploaded file - s3_client = boto3.client( - "s3", - region_name="us-east-1", - aws_access_key_id=env("DJANGO_AWS_ACCESS_KEY_ID"), - aws_secret_access_key=env("DJANGO_AWS_SECRET_ACCESS_KEY"), - ) - print(f"Uploading to S3 bucket at {s3_key}...") - s3_client.upload_file(zip_file_path, s3_bucket_name, s3_key) - - # Delete the original JSON and zip file - print("Deleting json file and zip file...") - os.remove(file_path) - os.remove(zip_file_path) - print("Success!\n") diff --git a/config_generation/export_whole_index.py b/config_generation/export_whole_index.py deleted file mode 100644 index 3297f679..00000000 --- a/config_generation/export_whole_index.py +++ /dev/null @@ -1,58 +0,0 @@ -import json -import os -import zipfile - -import boto3 -import environ -from api import Api - -BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) - -env = environ.Env(DEBUG=(bool, False)) - -environ.Env.read_env(os.path.join(BASE_DIR, ".env")) - -api = Api("test_server") - -response = api.sql("SMD", fetch_all=True) - -candidate_urls = response["Rows"] -bulk_data = [ - { - "url": candidate_url[0], - "scraped_title": candidate_url[1], - "collection": candidate_url[2], - } - for candidate_url in candidate_urls -] - -TEMP_FOLDER_NAME = "temp" - -# Folder to create temporary files -os.makedirs(f"{TEMP_FOLDER_NAME}/all_data", exist_ok=True) - -# Create JSON file -json_data = json.dumps(bulk_data) -file_path = f"{TEMP_FOLDER_NAME}/all_data/urls.json" # Provide the desired file path -with open(file_path, "w") as file: - file.write(json_data) - -# Zip the JSON file -zip_file_path = f"{TEMP_FOLDER_NAME}/all_data.zip" # Provide the desired zip file path -with zipfile.ZipFile(zip_file_path, "w") as zip_file: - zip_file.write(file_path, os.path.basename(file_path)) - -# Upload the zip file to S3 -s3_bucket_name = env("DJANGO_AWS_STORAGE_BUCKET_NAME") -s3_key = "scraped_urls_all/all_data.zip" # Provide the desired S3 key for the uploaded file -s3_client = boto3.client( - "s3", - region_name="us-east-1", - aws_access_key_id=env("DJANGO_AWS_ACCESS_KEY_ID"), - aws_secret_access_key=env("DJANGO_AWS_SECRET_ACCESS_KEY"), -) -s3_client.upload_file(zip_file_path, s3_bucket_name, s3_key) - -# Delete the original JSON and zip file -os.remove(file_path) -os.remove(zip_file_path) diff --git a/config_generation/generate_collection_list.py b/config_generation/generate_collection_list.py deleted file mode 100644 index ee0e9b47..00000000 --- a/config_generation/generate_collection_list.py +++ /dev/null @@ -1,71 +0,0 @@ -"""this document compares creates a list of sources to scrape -- start with turned on sources -- remove already scraped sources -- filter anything that isn't a webcrawler -- provide a variable, turned_on_remaining_webcrawlers for import by other files -""" - -import os - -from db_to_xml import XmlEditor -from sources_to_scrape import ( - already_scraped_sources, - sources_with_documents_20230605, - turned_on_sources, -) - -ROOT_PATH = "../sinequa_configs/sources/SDE/" - - -def create_xml_path(collection_name): - return f"{ROOT_PATH}{collection_name}/default.xml" - - -def get_turned_on_sources(): - # remove sources that were just scraped - turned_on_remaining_sources = [source for source in turned_on_sources if source not in already_scraped_sources] - - # filter all sources to only webcrawler sources - turned_on_remaining_webcrawlers = [] - for collection_name in turned_on_remaining_sources: - path = create_xml_path(collection_name) - indexer = XmlEditor(path) - if "crawler2" in indexer.get_tag_value("Connector"): - turned_on_remaining_webcrawlers.append(collection_name) - - -def is_collection_crawler(collection_name): - config = XmlEditor(create_xml_path(collection_name)) - return "crawler2" in config.get_tag_value("Connector") - - -def get_all_config_folder_names(folder_path=ROOT_PATH): - """ - this returns a list of all the config folder names, not the path of the folder - """ - # Look at each directory directly in the given folder - folders = [] - for dir in os.listdir(folder_path): - dir_path = os.path.join(folder_path, dir) - if os.path.isdir(dir_path) and "default.xml" in os.listdir(dir_path): - # Print the name of the directory - folders.append(dir) - return folders - - -def get_sources_20230605(): - """ - - empty webcrawlers - - 5 sources that were interupted - """ - interrupted_sources = [ - "PDS_Mission_Data_Archive_Website", - "goddard_institute_for_space_studies", - "ASTRO_Image_Cutouts_Website", - "PDS_Mars_Exploration_Program_Website", - ] - folders = get_all_config_folder_names() - folders = folders + interrupted_sources - return [ - folder for folder in folders if folder not in sources_with_documents_20230605 and is_collection_crawler(folder) - ] diff --git a/config_generation/generate_commands.py b/config_generation/generate_commands.py deleted file mode 100644 index 1b41858c..00000000 --- a/config_generation/generate_commands.py +++ /dev/null @@ -1,87 +0,0 @@ -""" -sometimes spot fixes need to be run on a list of collections -this file provides a quick framework to generate a batch of commands based on an input json -""" - -from db_to_xml_file_based import XmlEditor -from generate_jobs import ParallelJobCreator - -from config import source - - -# note that there is an xml folder that contains templates -class CommandGenerator: - def __init__( - self, - command_batch_name, - template_root_path="xmls/", - command_root_path="../sinequa_configs/commands/", - source=source, - ): - self.command_batch_name = command_batch_name # this is used to name the commands - self.template_root_path = template_root_path - self.command_template_path = f"{template_root_path}command_template.xml" - self.job_command_template_path = f"{template_root_path}job_command_template.xml" - self.command_root_path = command_root_path - self.source = source - - def _generate_job_command_name(self, collection_name): - # TODO - # return f"job.{}" - pass - - def _generate_job_command_file_path(self, collection_name): - return f"{self.command_root_path}/{self._generate_command_name(collection_name)}.xml" - - def _generate_command_name(self, collection_name): - """command names are used in the xml file name and are referenced by jobs (without the folder or .xml)""" - return f"{self.command_batch_name}.{collection_name}" - - def _generate_command_file_path(self, collection_name): - return f"{self.command_root_path}/{self._generate_command_name(collection_name)}.xml" - - def generate_command_file(self, collection_name, commands): - command_file = XmlEditor(self.command_template_path) - command_file.update_or_add_element_value( - element_name="WhereClause", - element_value=f"collection='/{self.source}/{collection_name}'", - ) - for command in commands: - command_file.add_column_update( - column=command["Column"], - value=command["Value"], - selection=command.get("Selection", None), - ) - command_file._update_config_xml(self._generate_command_file_path(collection_name)) - - def generate_job_file(self, collection_name): - # each command needs an job file to reference it - job_file = XmlEditor(self.job_command_template_path) - job_file.update_or_add_element_value(element_name="Command", element_value=command_name) - job_file._update_config_xml() - - -# here's how you would list the commands to generate -commands_to_generate = { - "collection_name": [ - { - "Column": "treepath", - "Value": "/Earth Science/Documents/Publications/NTRS Publication Database/", - # 'Selection': 'selection_here' - }, - ], -} - -job_command_names = [] -for collection_name, commands in commands_to_generate.items(): - generator = CommandGenerator(command_batch_name="fix_treeroots") - generator.generate_command_file(collection_name=collection_name, commands=commands) - command_name = generator._generate_command_name(collection_name) - JOB_COMMAND_TEMPLATE_PATH = "config_generation/xmls/job_command_template.xml" - job_file = XmlEditor(JOB_COMMAND_TEMPLATE_PATH) - job_file.update_or_add_element_value(element_name="Command", element_value=command_name) - job_file._update_config_xml() - job_creator = ParallelJobCreator( - [collection_name] - ) # this class is a bit misconfigured for this task, but it works... - job_creator() diff --git a/config_generation/generate_emac_indexer.py b/config_generation/generate_emac_indexer.py deleted file mode 100644 index 4f21c071..00000000 --- a/config_generation/generate_emac_indexer.py +++ /dev/null @@ -1,81 +0,0 @@ -from db_to_xml import XmlEditor - -# collection_metadata -name = "EMAC: Exoplanet Modeling and Analysis Center" -machine_name = "emac_exoplanet_modeling_and_analysis_center" -config_folder = None -url = "https://emac.gsfc.nasa.gov/" -division = "Astrophysics" -update_frequency = "Monthly" -document_type = "Software and Tools" -tree_root = "Astrophysics/Models/EMAC: Exoplanet Modeling and Analysis Center/" - -# rule_metadata -URL_EXCLUDES = [ - "https://emac.gsfc.nasa.gov/?related_resource=*", - "https://emac.gsfc.nasa.gov/news/rss/", -] - -TITLE_RULES = [ - { - "title_criteria": "https://emac.gsfc.nasa.gov/subscriptions/", - "title_value": "EMAC - Tool Category Subscription", - }, - { - "title_criteria": "https://emac.gsfc.nasa.gov/submissions/", - "title_value": "EMAC - Resource Submission", - }, - { - "title_criteria": "https://emac.gsfc.nasa.gov/FAQ/", - "title_value": "EMAC - Frequently Asked Questions", - }, - { - "title_criteria": "https://emac.gsfc.nasa.gov/team/", - "title_value": "EMAC - Team", - }, - { - "title_criteria": "https://emac.gsfc.nasa.gov/developers/", - "title_value": "EMAC - Software Best Practices and Challenges", - }, - { - "title_criteria": "https://emac.gsfc.nasa.gov/workshop/", - "title_value": "EMAC - Workshop", - }, - { - "title_criteria": "https://emac.gsfc.nasa.gov/lightkurve/", - "title_value": "EMAC - WebApp", - }, - { - "title_criteria": "https://emac.gsfc.nasa.gov/?sort=date", - "title_value": "EMAC - Published Resource List", - }, - { - "title_criteria": "https://emac.gsfc.nasa.gov/?cid=*", - "title_value": """xpath://*[@id="resource_content"]/div[1]/div[1]/div[2]/div""", - }, - # { - # "title_criteria": "https://emac.gsfc.nasa.gov/news/*", - # "title_value": """xpath:/html/body/div[6]/div/div[2]/div/div/h1""", - # }, -] - -# file saving information -ORIGINAL_CONFIG_PATH = "xmls/scraper_template.xml" - -# collection metadata adding -editor = XmlEditor(ORIGINAL_CONFIG_PATH) -editor.convert_scraper_to_indexer() -# editor.add_id() -editor.add_document_type(document_type) -editor.update_or_add_element_value("visibility", "publicCollection") -editor.update_or_add_element_value("Description", f"Webcrawler for the {name}") -editor.update_or_add_element_value("Url", url) -editor.update_or_add_element_value("TreeRoot", tree_root) -editor.update_or_add_element_value("ShardIndexes", "@SMD_ASTRO_Repository_1,@SMD_ASTRO_Repository_2") -editor.update_or_add_element_value("ShardingStrategy", "Balanced") - -# rule adding -[editor.add_url_exclude(url) for url in URL_EXCLUDES] -[editor.add_title_mapping(**title_rule) for title_rule in TITLE_RULES] - -editor.create_config_folder_and_default("indexing_configs", machine_name) diff --git a/config_generation/generate_jobs.py b/config_generation/generate_jobs.py deleted file mode 100644 index f1e8fded..00000000 --- a/config_generation/generate_jobs.py +++ /dev/null @@ -1,100 +0,0 @@ -""" -indexes lots of stuff at once -splits a big list of collections into n subgroups. each collection has a job created. -each indexing job is added to one of the n subgroups. a master runner is made that executes the n -subgroups in parallel -""" - -from db_to_xml_file_based import XmlEditor - -from config import available_indexers, batch_index_name, collection_list, source - - -class ParallelJobCreator: - def __init__( - self, - collection_list, - template_root_path="xmls/", - job_path_root="../sinequa_configs/jobs/", - source=source, - ): - """ - these default values rely on the old file structure, where the sinequa_configs were a - sub-repo of sde-indexing-helper. so when running this, you will need the sde-backend - code to be inside a folder called sinequa_configs - """ - - self.collection_list = collection_list - self.template_root_path = template_root_path - self.joblist_template_path = f"{template_root_path}joblist_template.xml" - self.job_path_root = job_path_root - self.source = source - - def _create_job_name(self, collection_name): - """ - each job that runs an individual collection needs a name based on the collection name - this code generates that file name as a string, and it will be passed to the function that - creates the actual job file - """ - if source == "SDE": - return f"collection.indexer.{collection_name}.xml" - else: - return f"collection.indexer.{source}.{collection_name}.xml" - - def _create_joblist_name(self, index): - """ - each job that runs an list of collections a name based on: - - the date the batch was created - - the index out of n total batches - this code generates that file name as a string, and it will be passed to the function that - creates the actual job file - """ - return f"parallel_indexing_list-{batch_index_name}-{index}.xml" - - def _create_collection_jobs(self): - """ - in order to run a collection, a job must exist that runs it - this code: - - creates a job based on the job template - - adds the exact collection name - - saves it with a name that will reference the collection name - """ - # create single jobs to run each collection - for collection in self.collection_list: - job = XmlEditor(f"{self.template_root_path}job_template.xml") - job.update_or_add_element_value("Collection", f"/{self.source}/{collection}/") - job._update_config_xml(f"{self.job_path_root}{self._create_job_name(collection)}") - - def make_all_parallel_jobs(self): - # create initial single jobs that will be referenced by the parallel job lists - self._create_collection_jobs() - n = len(available_indexers) - # Create an empty list of lists - sublists = [[] for _ in range(n)] - - # Distribute elements of the big list into sublists - for i in range(len(self.collection_list)): - # Use modulus to decide which sublist to put the item in - sublist_index = i % n - sublists[sublist_index].append(self.collection_list[i]) - - # create the n joblists (which will execute their contents serially in parallel - job_names = [] - for index, sublist in enumerate(sublists): - joblist = XmlEditor(self.joblist_template_path) - joblist.update_or_add_element_value("StartIdentity", available_indexers[index]) - for collection in sublist: - joblist.add_job_list_item(self._create_job_name(collection).replace(".xml", "")) - - joblist._update_config_xml(f"{self.job_path_root}{self._create_joblist_name(index)}") - job_names.append(self._create_joblist_name(index).replace(".xml", "")) - - master = XmlEditor(self.joblist_template_path) - master.update_or_add_element_value("RunJobsInParallel", "true") - [master.add_job_list_item(job_name) for job_name in job_names] - master._update_config_xml(f"{self.job_path_root}parallel_indexing_list-{batch_index_name}-master.xml") - - -if __name__ == "__main__": - job_creator = ParallelJobCreator(collection_list=collection_list) - job_creator.make_all_parallel_jobs() diff --git a/config_generation/generate_scrapers.py b/config_generation/generate_scrapers.py deleted file mode 100644 index 8e1b2c7d..00000000 --- a/config_generation/generate_scrapers.py +++ /dev/null @@ -1,66 +0,0 @@ -# this file creates new Candidate URL scraper configs -import os - -from config_utilities import ( - create_config_folder_and_default, - create_folder, - open_xml_as_dict, -) - -# from db_to_xml import convert_indexer_to_scraper - - -def get_or_create_folder(scraper_folder_name="scraping_configs"): - # TODO: probably don't need this function - """ - scraper configs are placed in their own folder above this directory - this gets that folder path - """ - - scraper_folder_path = os.path.join(os.path.dirname(os.getcwd()), scraper_folder_name) - # creates the folder if it doesn't already exist - create_folder(scraper_folder_path) - - return scraper_folder_path - - -def get_scraper_folder(scraper_folder_name="scraping_configs"): - """ - scraper configs are placed in their own folder above this directory - this gets that folder path - """ - - scraper_folder_path = os.path.join(os.path.dirname(os.getcwd()), scraper_folder_name) - # creates the folder if it doesn't already exist - create_folder(scraper_folder_path) - - return scraper_folder_path - - -def generate_brand_new_scraper(source_name, url, scraper_template_path="xmls/scraper_template.xml"): - """ - - Args: - source_name (str): Collection.machine_name - url (str): Collection.url - scraper_template_path (str, optional): path to the template from which to generate the scraper. - Defaults to "xmls/scraper_template.xml". - """ - - scraper = open_xml_as_dict(scraper_template_path) - scraper["Sinequa"]["Url"] = url - - scraper_folder_path = get_scraper_folder() - create_config_folder_and_default(scraper_folder_path, source_name, scraper) - - -# def generate_scraper_based_on_existing(source_name, existing_config_path): -# existing_config_xml = get_tree(existing_config_path) -# scraper_xml = convert_indexer_to_scraper(existing_config_xml) - - -# if __name__ == "__main__": -# from sources_to_scrape import kaylins_new_sources - -# for source in kaylins_new_sources: -# generate_scraper(source["source_name"], source["url"]) diff --git a/config_generation/indexing_configs/emac_exoplanet_modeling_and_analysis_center/default.xml b/config_generation/indexing_configs/emac_exoplanet_modeling_and_analysis_center/default.xml deleted file mode 100644 index 66744d0b..00000000 --- a/config_generation/indexing_configs/emac_exoplanet_modeling_and_analysis_center/default.xml +++ /dev/null @@ -1,364 +0,0 @@ - - - Webcrawler for the EMAC: Exoplanet Modeling and Analysis Center - publicCollection - crawler2 - NodeIndexer1/identity0 - - - - Astrophysics/Models/EMAC: Exoplanet Modeling and Analysis Center/ - false - - - - - - - - - - false - false - false - - - true - - - - - - false - false - false - 0 - - - 20 - - false - - true - false - - - false - false - false - false - true - false - - - - false - false - - false - false - false - - - - - - - - - - - - - - - - false - true - true - false - false - false - - - - false - false - true - false - - _Advanced - true - false - - - - true - - - - - - - false - false - false - false - false - false - false - false - false - false - false - true - true - false - false - false - false - true - false - - false - false - false - - - - - - - - - false - - - - - - false - @SMD_ASTRO_Repository_1,@SMD_ASTRO_Repository_2 - Balanced - - - - false - - 8 - - - - true - true - true - 100 - 100000 - 100000 - 10 - -1 - -1 - true - false - false - false - false - false - true - true - false - true - true - true - true - false - 1 - 0 ms - true - no - false - - false - false - True - false - false - - - false - true - true - true - false - true - true - false - false - false - false - false - false - false - - - - true - true - - true - false - - - - false - - false - true - false - - true - - - - - - false - false - true - - - - - - - - - - - false - true - - - - - false - - - - - - - - - true - true - - - false - - - - - - - - eu-west-1 - - true - - true - - 80 - true - false - - - - - false - false - - 1 - - https://emac.gsfc.nasa.gov/ - *.rtf;*.jy;*.xml;*.ico;*.gz;*.act - - id - doc.url1 - - - - - - sourcestr56 - - "Software and Tools" - - - - https://emac.gsfc.nasa.gov/?related_resource=* - https://emac.gsfc.nasa.gov/news/rss/ - - title - - "EMAC - Tool Category Subscription" - doc.url1 match "https://emac.gsfc.nasa.gov/subscriptions" - - - - title - - "EMAC - Resource Submission" - doc.url1 match "https://emac.gsfc.nasa.gov/submissions" - - - - title - - "EMAC - Frequently Asked Questions" - doc.url1 match "https://emac.gsfc.nasa.gov/FAQ" - - - - title - - "EMAC - Team" - doc.url1 match "https://emac.gsfc.nasa.gov/team" - - - - title - - "EMAC - Software Best Practices and Challenges" - doc.url1 match "https://emac.gsfc.nasa.gov/developers" - - - - title - - "EMAC - Workshop" - doc.url1 match "https://emac.gsfc.nasa.gov/workshop" - - - - title - - "EMAC - WebApp" - doc.url1 match "https://emac.gsfc.nasa.gov/lightkurve" - - - - title - - "EMAC - Published Resource List" - doc.url1 match "https://emac.gsfc.nasa.gov/?sort=date" - - - - title - - xpath://*[@id="resource_content"]/div[1]/div[1]/div[2]/div - doc.url1 match "https://emac.gsfc.nasa.gov/?cid=*" - - - diff --git a/config_generation/minimum_api.py b/config_generation/minimum_api.py deleted file mode 100644 index ec3cff1e..00000000 --- a/config_generation/minimum_api.py +++ /dev/null @@ -1,81 +0,0 @@ -from typing import Any - -import requests - -server_configs: dict[str, dict[str, str]] = { - "test_server": { - "app_name": "nasa-sba-smd", - "query_name": "query-smd-primary", - "base_url": "https://sciencediscoveryengine.test.nasa.gov", - }, - "production_server": { - "app_name": "nasa-sba-smd", - "query_name": "query-smd-primary", - "base_url": "https://sciencediscoveryengine.nasa.gov", - }, -} - - -class Api: - def __init__(self, server_name: str = "test", token: str = None) -> None: - self.app_name: str = server_configs[server_name]["app_name"] - self.query_name: str = server_configs[server_name]["query_name"] - self.base_url: str = server_configs[server_name]["base_url"] - self.token: str = token # you don't need a token for the query endpoint - - def _process_response(self, response) -> dict[str, Any]: - if response.status_code == 200: - meaningful_response = response.json() - else: - meaningful_response = {"response_text": response.text} - - return meaningful_response - - def query(self, term: str, page: int, collection_config_folder=None): - url = f"{self.base_url}/api/v1/search.query" - payload = { - "app": self.app_name, - "query": { - "name": self.query_name, - "action": "search", - "text": term, - "page": page, - "pageSize": 1000, - "tab": "all", - }, - "pretty": "true", - } - - if collection_config_folder: - payload["query"]["collection"] = f"/SMD/{collection_config_folder}/" - - response = requests.post(url, json=payload, verify=False) - - return self._process_response(response) - - def sql(self, source: str = "SMD", collection: str = "", fetch_all: bool = False) -> dict[str, Any]: - if not self.token: - raise ValueError("you must have a token to use the SQL endpoint") - - url = f"{self.base_url}/api/v1/engine.sql" - - collection_name = f"/{source}/{collection}/" - sql_command_all = "select url1,title,collection from @@ScienceMissionDirectorate" - if fetch_all: - sql_command = sql_command_all - else: - sql_command = f"{sql_command_all} where collection='{collection_name}'" - - payload = { - "sql": sql_command, - "maxRows": 10000000, # ten million - "pretty": "true", - } - response = requests.post( - url, - headers={"Authorization": f"Bearer {self.token}"}, - json=payload, - verify=False, - ) - - return self._process_response(response) diff --git a/config_generation/plugins/ListCandidateUrls.cs b/config_generation/plugins/ListCandidateUrls.cs deleted file mode 100644 index c8d2d8f2..00000000 --- a/config_generation/plugins/ListCandidateUrls.cs +++ /dev/null @@ -1,77 +0,0 @@ -/////////////////////////////////////////////////////////// -// Plugin SMD_Plugins : file ListCandidateUrls.cs -// - -using System; -using System.Collections.Generic; -using System.Text; -using System.IO; -using Sinequa.Common; -using Sinequa.Configuration; -using Sinequa.Plugins; -using Sinequa.Connectors; -using Sinequa.Indexer; -using Sinequa.Search; -using System.Text.RegularExpressions; - -namespace Sinequa.Plugin -{ - public class ListCandidateUrls : ConnectorPlugin - { - - List urlObjList = new List(); - string urihost = "" ; - string collection_name; - string seperator = "~?~"; - - - public override Return ApplyMappings(SinequaDoc sdoc, ConnectorDoc doc) - { - Sys.Log("inside ApplyMappings"); - UrlMetadata urlObj = new UrlMetadata(); - urlObj.title = Regex.Replace(doc.GetValue("linktitle"), @"\s+", " ").Trim(); - urlObj.url = doc.GetValue("urioriginalstring").Trim(); - urlObj.treepath = doc.GetValue("urirelpath").Trim(); - urlObjList.Add(urlObj); - urihost = doc.GetValue("uriauthority").Trim(); - - return base.ApplyMappings(sdoc, doc); - } - - public override void OnConnectorEnd() - { - - string root_path = @"C:\sinequa\data\configuration\files\customfile\candidate_urls"; - string collection_name = Connector.CollectionName; - string path = Path.Combine(root_path, collection_name)+".txt"; - - Sys.Log("root_path: ", root_path); - Sys.Log("collection_name: ", collection_name); - Sys.Log("file path: ", path); - // Open a StreamWriter object to write to a text file - using (StreamWriter writer = new StreamWriter(path)) - { - - writer.WriteLine("Website URL~?~Rel folder~?~Title"); - // Iterate through each key-value pair in the dictionary - foreach (var obj in urlObjList) - { - // Write the key and value to the file, separated by a tab character - writer.WriteLine(obj.url + seperator + obj.treepath + seperator + obj.title.Replace(System.Environment.NewLine, "")); - } - writer.Flush(); - writer.Dispose(); - } - } - - - } - - public class UrlMetadata - { - public string title {get;set;} - public string treepath {get;set;} - public string url {get;set;} - } - -} diff --git a/config_generation/preprocess_sources.py b/config_generation/preprocess_sources.py deleted file mode 100644 index 889b94b8..00000000 --- a/config_generation/preprocess_sources.py +++ /dev/null @@ -1,50 +0,0 @@ -from db_to_xml import XmlEditor -from generate_collection_list import create_xml_path, turned_on_remaining_webcrawlers -from sources_to_scrape import remove_top_limitation_sources, turned_on_sources - -ROOT_PATH = "../sinequa_configs/sources/SDE/" - - -def remove_top_only_limitation(path): - # this is only run on the exact sources we want disabled, so checking - # for and retaining previous values is not required - indexer = XmlEditor(path) - indexer.update_or_add_element_value("MaxToIndex", "") - indexer.update_or_add_element_value("MaxLevel", "") - indexer.update_or_add_element_value("MaxToCrawl", "") - indexer._update_config_xml(path) - - -def ensure_index_of_root(path): - # some indexers aren't getting the actual root url given in Url - # this should directly ensure it is scraped - indexer = XmlEditor(path) - urls = indexer.get_tag_value("Url") - for url in urls: - # ensure we don't double add these - if url not in indexer.get_tag_value("UrlIndexIncluded"): - indexer.add_url_include(url) - indexer._update_config_xml(path) - - -# # undo top limitation -# for collection_name in remove_top_limitation_sources: -# path = create_xml_path(collection_name) -# remove_top_only_limitation(path) - -# # ensure root -# for collection_name in turned_on_remaining_webcrawlers: -# path = create_xml_path(collection_name) -# ensure_index_of_root(path) - -# format files... -for collection_name in turned_on_remaining_webcrawlers: - path = create_xml_path(collection_name) - indexer = XmlEditor(path) - indexer._resave_pretty(path) - - -print(len(turned_on_sources)) # 139 -print(len(turned_on_remaining_webcrawlers)) # 114 -print(len(remove_top_limitation_sources)) # 5 -print(len([s for s in remove_top_limitation_sources if s in turned_on_remaining_webcrawlers])) # 5 diff --git a/config_generation/sources_to_scrape.py b/config_generation/sources_to_scrape.py deleted file mode 100644 index 0e0523dc..00000000 --- a/config_generation/sources_to_scrape.py +++ /dev/null @@ -1,1631 +0,0 @@ -# this list is read by generate_scrapers when making a list of sources to scrape -test_sources = [ - {"source_name": "quotes", "url": "https://quotes.toscrape.com"}, -] - -turned_on_sources = [ - "algorithm_theoretical_basis_documents", - "eos_mission_page", - "gcn_circulars", - "gcn_missions_instruments_and_facilities", - "general_coordinates_network_gcn", - "giss_software_tools", - "our_changing_planet_the_view_from_space_images", - "GENELAB_METADATA_Website", - "PDS_EPIC_Model_Website", - "NasaEarthObservationWebsite", - "PDS_PDS4_Training_Documents_Website", - "GENELAB_Github_DataProcessing", - "PDS_Notebook_Website", - "PDS_Metadata_Injector_for_PDS_Labels_Website", - "PDS_Photojournal_Website", - "PDS_ODE_REST_Service_Website", - "PDS_Lunar_Orbiter_Data_Explorer_Website", - "PDS_NASA_Science_Solar_System_Exploration_Website", - "PDS_Messenger_MASCS_UVVS_Archive_Page_Website", - "PDS_Image_Atlas_Website", - "PDS_NASAs_Eyes_Website", - "ASTRO_James_Webb_Space_Telescope_Website", - "SPEDAS_Website", - "CCMC_Website", - "ASTRO_Data_Hosted_on_LAMBDA_Website", - "PDS_Toolkits_Website", - "ASTRO_Hubble_Source_Catalog_Search_API_Website", - "PyHC_Website", - "PDS_Java_Mission-planning_and_Analysis_for_Remote_Sensing_(JMARS)_Website", - "ASTRO_HEASARC_Software_Website", - "PDS_NASA_Science_Earths_Moon_Website", - "Helio_Events_Knowledgebase_Website", - "DataPathFinder", - "NTRS", - "PDS_Juno_Archive_Page_Website", - "PDS_Astropedia_Lunar_and_Planetary_Cartographic_Catalog_Website", - "PDS_Odyssey_GRS_Data_Node_Website", - "SPASE_Website", - "PDS_Astromat_Astromaterials_Data_System_Website", - "PDS_Small_Bodies_Image_Browser_Website", - "PDS_Virtual_Astronaut_Website", - "PDS_Pluto_and_Arrokoth_Data_Archive_Website", - "PDS_Users_Guides_Website", - "PDS_Mars_Orbiter_Data_Website", - "PDS_Mars_Exploration_Program_Website", - "PDS_Mercury_Data_Archive_Website", - "PDS_TES_Data_Node_Website", - "PDS_Jupiter_Data_Archive_Website", - "GENELAB_Github_SampleProcessing", - "PDS_PDS_Annex_Products_Website", - "PDS_PDS_Tool_Registry_Website", - "PDS_SBN_Tools_Utilities_and_Interfaces_Website", - "PDS_ISIS_Astro_Website", - "PDS_Missions_Website", - "GENELAB_Publications_Website", - "PDS_DIVINER_RDR_Query_Website", - "ASTRO_NASA_Exoplanet_Archive_Documents_Website", - "ASTRO_API_Search_Website", - "PDS_High-Resolution_Transmission_Molecular_Absorption_Database_(HITRAN)_Website", - "PDS_Analyst_Notebook_Website", - "ASTRO_ZMAST_API_Website", - "ASTRO_MAST_Documentation_Website", - "PDS_Data_Pilot_Website", - "PDS_PDS_Software_Tools_Tutorial_and_Viewers_Website", - "PDS_Gravity_Models_Website", - "PDS_Venus_Archive_Page_Website", - "Autoplot_Website", - "PDS_Rings_Website", - "PDS_Mission_Data_Archive_Website", - "PDS_LOLA_RDR_Query_Website", - "PDS_PPI_Software_Website", - "PDS_ISIS_Website", - "PDS_USGS_Pilot_Website", - "PDS_Imaging_Software_Website", - "PDS_Missions_Archive_Page_Website", - "PDS_SPICE_Archives_Website", - "PDS_LOLA_RDR_Query_V20_Website", - "PDS_Subscription_Service_Website", - "ASTRO_Calibration_Documentation_Website", - "PDS_Venus_Orbital_Data_Explorer_Website", - "PDS_SPICE_Programming_Lessons_Website", - "PDS_API_Legacy_All", - "ASTRO_Data_Reduction_Tools_Website", - "Helioviewer_Website", - "ASTRO_HIRES_PRV_Website", - "PDS_PDS4_Documents_Website", - "ASTRO_Image_Cutouts_Website", - "PDS_Ring-Moon_Systems_Node_On-line_Tools_Website", - "PDS_Neptune_Archive_Page_Website", - "PDS_Uranus_Data_Archive_Website", - "PDS_Mars_Lander_Data_Website", - "PDS_Lunar_Atmospheres_Data_Archive_Website", - "GENELAB_Github_Training", - "ASTRO_TAP_Search_Website", - "PDS_Mercury_Orbital_Data_Explorer_Website", - "CMR_API", - "PDS_Outer_Planets_Icy_Satellites_Archive_Page_Website", - "ARSETAppliedSciences", - "PDS_Planetary_Science_Tools_Website", - "PDS_SPICE_Utility_and_Application_Programs_Website", - "PDS_Geosciences_Node_Spectral_Library_Website", - "PDS_SPICE_Toolkit_Website", - "PDS_NASA_Solar_System_Treks_Website", - "PDS_PDS_Documentation_Website", - "PDS_Geosciences_Data_Holdings_Website", - "PDS_SPICE-enhanced_Cosmographia_Website", - "ASTRO_Contributed_Datasets_Website", - "PDS_PDS3_Standards_Reference_Website", - "PDS_PDS4_Local_Data_Dictionary_Tool_Website", - "PDS_Saturn_Data_Archive_Website", - "PDS_DIVINER_RDR_Query_V20_Website", - "ASTRO_exoMAST_API_Website", - "ASTRO_Spitzer_Tools_Website", - "PDS_Data_Volumes_Index_Website", - "HAPI_Website", - "PDS_PDS4_JParser_Website", - "PDS_Solar_System_Exploration_Research_Virtual_Institute_(SSERVI)_Website", - "PDS_MRO_Coordinated_Observation_Website", - "PDS_Mars_Orbital_Data_Explorer_Website", - "PDS_Titan_Data_Archive_Website", - "PDS_Atmospheric_Escape_Chemistry_Page_Website", - "PDS_Collision_Induced_Absorption_Model_Website", - "ASTRO_NAVO_HEASARC", - "CASEI_Campaign", - "CASEI_Deployment", - "CASEI_Instrument", - "CASEI_Platform", - "giss_datasets_and_derived_materials", - "giss_publication_list", - "nasa_global_climate_change", - "goddard_institute_for_space_studies", - "earth_observer_publications", - "our_changing_planet_the_view_from_space_images", - "nasa_sea_level_change", - "nasa_carbon_monitoring_system", - "emac_exoplanet_modeling_and_analysis_center", - "algorithm_theoretical_basis_documents", - "emac_exoplanet_modeling_and_analysis_center", - "PDS_SPICE_Tutorials_Website", -] - -kaylins_new_sources = [ - {"source_name": "nasa_power", "url": "https://power.larc.nasa.gov/"}, - { - "source_name": "emac_exoplanet_modeling_and_analysis_center", - "url": "https://emac.gsfc.nasa.gov/", - }, - { - "source_name": "goddard_institute_for_space_studies", - "url": "https://www.giss.nasa.gov/", - }, - { - "source_name": "earth_science_decadal_surveys", - "url": "https://science.nasa.gov/earth-science/decadal-surveys/", - }, - { - "source_name": "exoplanet_opacities_database", - "url": "https://science.data.nasa.gov/opacities/", - }, - { - "source_name": "interactive_multiinstrument_database_of_solar_flares", - "url": "https://data.nas.nasa.gov/helio/portals/solarflares/", - }, - {"source_name": "general_coordinates_network_gcn", "url": "https://gcn.nasa.gov/"}, - { - "source_name": "gcn_missions_instruments_and_facilities", - "url": "https://gcn.nasa.gov/missions", - }, - {"source_name": "gcn_circulars", "url": "https://gcn.nasa.gov/circulars"}, - { - "source_name": "igwn_public_alerts_user_guide", - "url": "https://emfollow.docs.ligo.org/userguide/", - }, - { - "source_name": "algorithm_theoretical_basis_documents", - "url": "https://eospso.nasa.gov/content/algorithm-theoretical-basis-documents", - }, - { - "source_name": "eos_mission_page", - "url": "https://eospso.nasa.gov/content/all-missions", - }, - { - "source_name": "earth_observer_publications", - "url": "https://eospso.nasa.gov/earth-observer-archive/", - }, - { - "source_name": "our_changing_planet_the_view_from_space_images", - "url": "https://eospso.nasa.gov/content/our-changing-planet-view-space", - }, - {"source_name": "nasa_global_climate_change", "url": "https://climate.nasa.gov/"}, - {"source_name": "giss_publication_list", "url": "https://pubs.giss.nasa.gov/"}, - {"source_name": "giss_software_tools", "url": "https://www.giss.nasa.gov/tools/"}, - { - "source_name": "giss_datasets_and_derived_materials", - "url": "https://data.giss.nasa.gov/", - }, - { - "source_name": "nasa_wavelength", - "url": "https://science.nasa.gov/learners/wavelength", - }, - {"source_name": "my_nasa_data", "url": "https://mynasadata.larc.nasa.gov/"}, - { - "source_name": "mars_target_encyclopeida_mte", - "url": "https://github.com/wkiri/MTE", - }, - { - "source_name": "astrogeology_analysis_ready_data", - "url": "https://stac.astrogeology.usgs.gov/docs/", - }, - { - "source_name": "nasa_science_missions_earth", - "url": "https://science.nasa.gov/missions-page?field_division_tid=103&field_phase_tid=All", - }, - {"source_name": "f_prime", "url": "https://github.com/nasa/fprime"}, - {"source_name": "nasa_sea_level_change", "url": "https://sealevel.nasa.gov/"}, - {"source_name": "earth_observing_dashboard", "url": "https://eodashboard.org/"}, - { - "source_name": "fire_information_for_resource_management_system_firms", - "url": "https://firms.modaps.eosdis.nasa.gov/", - }, - {"source_name": "nasa_carbon_monitoring_system", "url": "https://carbon.nasa.gov/"}, - { - "source_name": "nasa_2023_climate_strategy", - "url": "https://www.nasa.gov/sites/default/files/atoms/files/advancing_nasas_climate_strategy_2023.pdf", - }, -] -# i've started running up through igwn -sprint_2_sources = [ - { - "source_name": "nasa_science_solar_system_exploration", - "url": "https://solarsystem.nasa.gov/", - }, - { - "source_name": "emac_exoplanet_modeling_and_analysis_center", - "url": "https://emac.gsfc.nasa.gov/", - }, - {"source_name": "mars_exploration_program", "url": "https://mars.nasa.gov/"}, - { - "source_name": "astropedia_lunar_and_planetary_cartographic_catalog", - "url": "https://astrogeology.usgs.gov/search?pmi-target=mercury", - }, - { - "source_name": "pds_cassini_resource_page_website", - "url": "https://pds-atmospheres.nmsu.edu/data_and_services/atmospheres_data/Cassini/Cassini.html", - }, - { - "source_name": "goddard_institute_for_space_studies", - "url": "https://www.giss.nasa.gov/", - }, - { - "source_name": "missions_archive_page", - "url": "https://pds-ppi.igpp.ucla.edu/mission", - }, - { - "source_name": "pds_pds_small_bodies_node_asteroid_dust_subnode_website", - "url": "https://sbn.psi.edu/pds/", - }, - { - "source_name": "earth_science_decadal_surveys", - "url": "https://science.nasa.gov/earth-science/decadal-surveys/", - }, - { - "source_name": "exoplanet_opacities_database", - "url": "https://science.data.nasa.gov/opacities/", - }, - {"source_name": "nasa_power", "url": "https://power.larc.nasa.gov/"}, - { - "source_name": "our_changing_planet_the_view_from_space_images", - "url": "https://eospso.nasa.gov/content/our-changing-planet-view-space", - }, - { - "source_name": "igwn_public_alerts_user_guide", - "url": "https://emfollow.docs.ligo.org/userguide/", - }, - {"source_name": "nasa_global_climate_change", "url": "https://climate.nasa.gov/"}, - { - "source_name": "recently_archived_volumes", - "url": "https://pds-atmospheres.nmsu.edu/data_and_services/atmospheres_data/recent.htm", - }, - {"source_name": "lsda_website", "url": "https://nlsp.nasa.gov/explore/lsdahome"}, - { - "source_name": "small_bodies_data_ferret", - "url": "https://sbnapps.psi.edu/ferret/listDatasets.action", - }, - { - "source_name": "pds_data_archive_website", - "url": "https://pds-imaging.jpl.nasa.gov/data/", - }, - { - "source_name": "interactive_multiinstrument_database_of_solar_flares", - "url": "https://data.nas.nasa.gov/helio/portals/solarflares/", - }, - {"source_name": "general_coordinates_network_gcn", "url": "https://gcn.nasa.gov/"}, - { - "source_name": "gcn_missions_instruments_and_facilities", - "url": "https://gcn.nasa.gov/missions", - }, - { - "source_name": "heliophysics_events_knowledgebase", - "url": "https://www.lmsal.com/hek/", - }, - { - "source_name": "planetary_plasma_interactions_data_volumes", - "url": "https://pds-ppi.igpp.ucla.edu/search/?s=*", - }, - { - "source_name": "astromaterials_acquisition_and_curation_office", - "url": "https://curator.jsc.nasa.gov/", - }, - { - "source_name": "nasa_wavelength", - "url": "https://science.nasa.gov/learners/wavelength", - }, - {"source_name": "nasa_sea_level_change", "url": "https://sealevel.nasa.gov/"}, -] - -finished_sources = [ - "algorithm_theoretical_basis_documents", - "astrogeology_analysis_ready_data", - "astromaterials_acquisition_and_curation_office", - "astropedia_lunar_and_planetary_cartographic_catalog", - "earth_observing_dashboard", - "earth_science_decadal_surveys", - "emac_exoplanet_modeling_and_analysis_center", - "eos_mission_page", - "exoplanet_opacities_database", - "fire_information_for_resource_management_system_firms", - "f_prime", - "gcn_circulars", - "gcn_missions_instruments_and_facilities", - "general_coordinates_network_gcn", - "giss_datasets_and_derived_materials", - "giss_publication_list", - "giss_software_tools", - "goddard_institute_for_space_studies", - "heliophysics_events_knowledgebase", - "igwn_public_alerts_user_guide", - "nasa_science_earths_moon", - "pds4_documents", - "pds_near_earth_asteroid_rendezvous_near_data_archive_website", - "solar_system_exploration_research_virtual_institute_sservi", - "SPASE_JSON_List", -] - -sprint_3_sources = [ - { - "source_name": "solar_system_exploration_research_virtual_institute_sservi", - "url": "https://sservi.nasa.gov/", - }, - { - "source_name": "mars_gcm", - "url": "https://pds-atmospheres.nmsu.edu/PDS/data/mogc_0001", - }, - {"source_name": "pds_archive_navigator_website", "url": "https://arcnav.psi.edu/"}, - { - "source_name": "pds_near_earth_asteroid_rendezvous_near_data_archive_website", - "url": "https://arcnav.psi.edu/urn:nasa:pds:context:investigation:mission.near_earth_asteroid_rendezvous", - }, - {"source_name": "my_nasa_data", "url": "https://mynasadata.larc.nasa.gov/"}, - {"source_name": "mars_target_encyclopedia", "url": "https://github.com/wkiri/MTE"}, - { - "source_name": "astrogeology_analysis_ready_data", - "url": "https://stac.astrogeology.usgs.gov/docs/", - }, - {"source_name": "heasarc", "url": "https://heasarc.gsfc.nasa.gov/"}, - {"source_name": "nasa_science_earths_moon", "url": "https://moon.nasa.gov/"}, - { - "source_name": "pds4_documents", - "url": "https://pds.nasa.gov/datastandards/documents/", - }, - {"source_name": "code_nasa_api", "url": "https://impact.earthdata.nasa.gov/casei/"}, - {"source_name": "nasa_earth_observations", "url": "https://neo.gsfc.nasa.gov/"}, - { - "source_name": "nasa_science_missions_earth", - "url": "https://science.nasa.gov/missions-page?field_division_tid=103&field_phase_tid=All", - }, - {"source_name": "f_prime", "url": "https://github.com/nasa/fprime"}, - {"source_name": "ceos_missions", "url": "https://mims.nasa-impact.net/docs"}, - { - "source_name": "caldb_documentation", - "url": "https://heasarc.gsfc.nasa.gov/docs/heasarc/caldb/caldb_doc.html", - }, - { - "source_name": "genelab_metadata_api", - "url": "https://genelab.nasa.gov/genelabAPIs#metadata", - }, - { - "source_name": "generic_kernels", - "url": "https://naif.jpl.nasa.gov/pub/naif/generic_kernels/", - }, - {"source_name": "casei", "url": "https://impact.earthdata.nasa.gov/casei/"}, - {"source_name": "errata", "url": "https://pds-ppi.igpp.ucla.edu/search/?e="}, - {"source_name": "ceos_instruments", "url": "https://mims.nasa-impact.net/docs"}, - {"source_name": "james_webb_space_telescope", "url": "https://webb.nasa.gov/"}, - { - "source_name": "casei_instruments", - "url": "https://admg.nasa-impact.net/api/docs/", - }, - { - "source_name": "highenergy_missions", - "url": "https://heasarc.gsfc.nasa.gov/docs/heasarc/missions/alphabet.html", - }, - { - "source_name": "arset_applied_sciences", - "url": "https://appliedsciences.nasa.gov/join-mission/training", - }, - { - "source_name": "casei_deployments", - "url": "https://admg.nasa-impact.net/api/docs/", - }, - { - "source_name": "operational_flightother_project_kernels", - "url": "https://naif.jpl.nasa.gov/naif/data_operational.html", - }, - { - "source_name": "spice_programming_lessons", - "url": "https://naif.jpl.nasa.gov/naif/lessons.html", - }, - { - "source_name": "spice_selftraining", - "url": "https://naif.jpl.nasa.gov/naif/self_training.html", - }, - { - "source_name": "spice_toolkit_documentation", - "url": "https://naif.jpl.nasa.gov/naif/documentation.html", - }, - { - "source_name": "spice_tutorials", - "url": "https://naif.jpl.nasa.gov/naif/tutorials.html", - }, - { - "source_name": "mast_documentation", - "url": "https://outerspace.stsci.edu/display/MASTDOCS/Portal+Guidel", - }, - {"source_name": "ccmc", "url": "https://ccmc.gsfc.nasa.gov/"}, - {"source_name": "nasa_carbon_monitoring_system", "url": "https://carbon.nasa.gov/"}, - { - "source_name": "nasa_2023_climate_strategy", - "url": "https://www.nasa.gov/sites/default/files/atoms/files/advancing_nasas_climate_strategy_2023.pdf", - }, - {"source_name": "nasa_sea_level_change", "url": "https://sealevel.nasa.gov/"}, - {"source_name": "earth_observing_dashboard", "url": "https://eodashboard.org/"}, - {"source_name": "earth_observing_dashboard", "url": "https://eodashboard.org/"}, - { - "source_name": "fire_information_for_resource_management_system_firms", - "url": "https://firms.modaps.eosdis.nasa.gov/", - }, -] - -# scraped on test server with the new title code -# TODO: are all of these actually showing? -already_scraped_sources = [ - "ASTRO_Missions_and_Data_Website", - "CODE_NASA_API", - "NasaEarthObservationWebsite", - "DataPathFinder", - "ASTRO_James_Webb_Space_Telescope_Website", - "ASTRO_High-Energy_Missions_Website", - "ARSETAppliedSciences", - "GENELAB_Publications_Website", -] - -# emily put together a list of sources which were previously limited but we now -# want more than the top page: -# https://docs.google.com/spreadsheets/d/1U95xEseibgoHmTSyT6akPxuMVRIUeEu2vOyu9i8teb4/edit#gid=0 -# however, many of these need special attention, so this list in this variable isn't complete -remove_top_limitation_sources = [ - "Autoplot_Website", - "PyHC_Website", - "SPEDAS_Website", - "ASTRO_Hubble_Source_Catalog_Search_API_Website", - "PDS_PDS_Tool_Registry_Website", -] - -lis_new_sources = [ - "algorithm_theoretical_basis_documents", - "eos_mission_page", - "gcn_circulars", - "gcn_missions_instruments_and_facilities", - "general_coordinates_network_gcn", - "giss_software_tools", - "our_changing_planet_the_view_from_space_images", -] - -all_sources = kaylins_new_sources + sprint_2_sources + sprint_3_sources -remaining_sources = [s for s in all_sources if s["source_name"] not in finished_sources] - - -sources_with_documents_20230605 = [ - "algorithm_theoretical_basis_documents", - "ARSETAppliedSciences", - "ASTRO_API_Search_Website", - "ASTRO_Calibration_Documentation_Website", - "ASTRO_Contributed_Datasets_Website", - "ASTRO_Data_Reduction_Tools_Website", - "ASTRO_exoMAST_API_Website", - "ASTRO_HEASARC_Software_Website", - "ASTRO_HIRES_PRV_Website", - "ASTRO_Hubble_Source_Catalog_Search_API_Website", - "ASTRO_Image_Cutouts_Website", - "ASTRO_James_Webb_Space_Telescope_Website", - "ASTRO_MAST_Documentation_Website", - "ASTRO_NASA_Exoplanet_Archive_Documents_Website", - "ASTRO_NAVO_HEASARC", - "ASTRO_Spitzer_Tools_Website", - "ASTRO_TAP_Search_Website", - "ASTRO_ZMAST_API_Website", - "astrogeology_analysis_ready_data", - "CASEI_Campaign", - "CASEI_Deployment", - "CASEI_Instrument", - "CASEI_Platform", - "CMR_API", - "DataPathFinder", - "earth_observer_publications", - "earth_observing_dashboard", - "earth_science_decadal_surveys", - "eos_mission_page", - "f_prime", - "fire_information_for_resource_management_system_firms", - "gcn_circulars", - "gcn_missions_instruments_and_facilities", - "GENELAB_Github_DataProcessing", - "GENELAB_Github_SampleProcessing", - "GENELAB_Github_Training", - "GENELAB_METADATA_Website", - "GENELAB_Publications_Website", - "general_coordinates_network_gcn", - "giss_datasets_and_derived_materials", - "giss_publication_list", - "giss_software_tools", - "goddard_institute_for_space_studies", - "interactive_multiinstrument_database_of_solar_flares", - "mars_target_encyclopedia_mte", - "my_nasa_data", - "nasa_2023_climate_strategy", - "nasa_carbon_monitoring_system", - "nasa_global_climate_change", - "nasa_sea_level_change", - "NasaEarthObservationWebsite", - "our_changing_planet_the_view_from_space_images", - "PDS_Analyst_Notebook_Website", - "PDS_API_Legacy_All", - "PDS_Astromat_Astromaterials_Data_System_Website", - "PDS_Astropedia_Lunar_and_Planetary_Cartographic_Catalog_Website", - "PDS_Atmospheric_Escape_Chemistry_Page_Website", - "PDS_Collision_Induced_Absorption_Model_Website", - "PDS_Data_Pilot_Website", - "PDS_Data_Volumes_Index_Website", - "PDS_DIVINER_RDR_Query_V20_Website", - "PDS_DIVINER_RDR_Query_Website", - "PDS_EPIC_Model_Website", - "PDS_Geosciences_Data_Holdings_Website", - "PDS_Geosciences_Node_Spectral_Library_Website", - "PDS_Gravity_Models_Website", - "PDS_High-Resolution_Transmission_Molecular_Absorption_Database_(HITRAN)_Website", - "PDS_Image_Atlas_Website", - "PDS_Imaging_Software_Website", - "PDS_ISIS_Astro_Website", - "PDS_ISIS_Website", - "PDS_Java_Mission-planning_and_Analysis_for_Remote_Sensing_(JMARS)_Website", - "PDS_Juno_Archive_Page_Website", - "PDS_Jupiter_Data_Archive_Website", - "PDS_LOLA_RDR_Query_V20_Website", - "PDS_LOLA_RDR_Query_Website", - "PDS_Lunar_Atmospheres_Data_Archive_Website", - "PDS_Lunar_Orbiter_Data_Explorer_Website", - "PDS_Mars_Exploration_Program_Website", - "PDS_Mars_Lander_Data_Website", - "PDS_Mars_Orbital_Data_Explorer_Website", - "PDS_Mars_Orbiter_Data_Website", - "PDS_Mercury_Data_Archive_Website", - "PDS_Mercury_Orbital_Data_Explorer_Website", - "PDS_Messenger_MASCS_UVVS_Archive_Page_Website", - "PDS_Metadata_Injector_for_PDS_Labels_Website", - "PDS_Missions_Archive_Page_Website", - "PDS_MRO_Coordinated_Observation_Website", - "PDS_NASA_Science_Earths_Moon_Website", - "PDS_NASA_Science_Solar_System_Exploration_Website", - "PDS_NASAs_Eyes_Website", - "PDS_Neptune_Archive_Page_Website", - "PDS_Notebook_Website", - "PDS_Operational_Flight_Other_Project_Kernels_Website", - "PDS_Outer_Planets_Icy_Satellites_Archive_Page_Website", - "PDS_PDS3_Standards_Reference_Website", - "PDS_PDS4_Documents_Website", - "PDS_PDS4_JParser_Website", - "PDS_PDS4_Local_Data_Dictionary_Tool_Website", - "PDS_PDS4_Training_Documents_Website", - "PDS_PDS_Annex_Products_Website", - "PDS_PDS_Documentation_Website", - "PDS_PDS_Software_Tools_Tutorial_and_Viewers_Website", - "PDS_PDS_Tool_Registry_Website", - "PDS_Photojournal_Website", - "PDS_Planetary_Science_Tools_Website", - "PDS_Pluto_and_Arrokoth_Data_Archive_Website", - "PDS_PPI_Software_Website", - "PDS_Ring-Moon_Systems_Node_On-line_Tools_Website", - "PDS_Rings_Website", - "PDS_Saturn_Data_Archive_Website", - "PDS_SBN_Tools_Utilities_and_Interfaces_Website", - "PDS_Small_Bodies_Image_Browser_Website", - "PDS_Solar_System_Exploration_Research_Virtual_Institute_(SSERVI)_Website", - "PDS_SPICE-enhanced_Cosmographia_Website", - "PDS_SPICE_Archives_Website", - "PDS_SPICE_Programming_Lessons_Website", - "PDS_SPICE_Toolkit_Website", - "PDS_SPICE_Tutorials_Website", - "PDS_SPICE_Utility_and_Application_Programs_Website", - "PDS_Subscription_Service_Website", - "PDS_TES_Data_Node_Website", - "PDS_Titan_Data_Archive_Website", - "PDS_Toolkits_Website", - "PDS_Uranus_Data_Archive_Website", - "PDS_Users_Guides_Website", - "PDS_USGS_Pilot_Website", - "PDS_Venus_Archive_Page_Website", - "PDS_Venus_Orbital_Data_Explorer_Website", - "PDS_Virtual_Astronaut_Website", -] - - -created_from_scratch = [ - "archived_synthetic_data", - "astroquery_api_search_mast_queries", - "co_plotter", - "contributed_datasets_in_the_exoplanet_archive", - "coordinate_calculator", - "corot_exoplanet_archive_etss_data_sets", - "exo_mast", - "exoplanet_atmosphere_observability_table", - "extinction_calculator", - "heasarc_browse_batch_interface", - "heasarc_download_scripts", - "high_level_science_products", - "hubble_source_catalog_search", - "ipac_table_validator", - "koa_program_friendly_image_access_service", - "lbti_archive", - "mast", - "mast_api_search", - "mast_hubble_search", - "mast_portal", - "mast_query_casjobs", - "mast_web_services", - "montage_mosaic_engine", - "neid_archive", - "neid_solar_radial_velocity_archive", - "nexsci", - "pan_starrs_catalog", - "pan_starrs_catalog_api", - "planetary_image_galleries", - "pykoa", - "skiff_spectral_catalog_search", - "space_telescope_bibliographic_search", - "spectral_classes_of_like_stars", - "vao_datascope", - "velocity_calculator", - "venus_data_archive", - "virtual_observatory_information", - "z_mast_search", - "ASTRO_HEASARC_Tools_Website", - "ASTRO_HIRES_PRV_Website", - "ASTRO_Image_Cutouts_Website", - "ASTRO_Spitzer_Tools_Website", - "CMR_API", - "PDS_Annex_Data_Holdings_Website", - "PDS_CRISM_Analysis_Toolkit_(CAT)_Website", - "PDS_Cassini_Mission_Rhea_(Saturn_V)_Website", - "PDS_Cassini_Mission_Saturn_Small_Satellites_Website", - "PDS_Data_Dictionary_Search", - "PDS_MRO_Coordinated_Observation_Website", - "PDS_Mars_Exploration_Program_Website", - "PDS_Mars_Orbital_Data_Explorer_Website", - "PDS_Mission_Data_Archive_Website", - "PDS_Missions_Archive_Page_Website", - "PDS_NASA_Space_Science_Data_Coordinated_Archive_(NSSDCA)_Website", - "PDS_SPICE_Self-Training_Website", - "archived_synthetic_data", - "astroquery_api_search_mast_queries", - "co_plotter", - "contributed_datasets_in_the_exoplanet_archive", - "coordinate_calculator", - "corot_exoplanet_archive_etss_data_sets", - "earth_observer_publications", - "earth_observing_dashboard", - "exo_mast", - "exoplanet_atmosphere_observability_table", - "extinction_calculator", - "f_prime", - "goddard_institute_for_space_studies", - "heasarc_browse_batch_interface", - "heasarc_download_scripts", - "high_level_science_products", - "hubble_source_catalog_search", - "ipac_table_validator", - "koa_program_friendly_image_access_service", - "lbti_archive", - "mast", - "mast_api_search", - "mast_hubble_search", - "mast_portal", - "mast_query_casjobs", - "mast_web_services", - "montage_mosaic_engine", - "neid_archive", - "neid_solar_radial_velocity_archive", - "nexsci", - "pan_starrs_catalog", - "pan_starrs_catalog_api", - "planetary_image_galleries", - "pykoa", - "skiff_spectral_catalog_search", - "space_telescope_bibliographic_search", - "spectral_classes_of_like_stars", - "vao_datascope", - "velocity_calculator", - "venus_data_archive", - "virtual_observatory_information", - "z_mast_search", -] - - -# these are all the ones changed on 2023.08.17 -# update this note after running them -sources_with_new_source56_mappings = [ - "CASEI_Deployment", - "CASEI_Instrument", - "CASEI_Platform", - "CEOS_API_I", - "earth_observing_dashboard", - "f_prime", - "nasa_carbon_monitoring_system", - "nasa_global_climate_change", - "nasa_power", - "nasa_science_missions_earth", - "nasa_sea_level_change", - "nasa_wavelength", -] - -# these are all the ones changed on 2023.08.17 -# update this note after running them -sources_with_new_selection_rule = [ - "PDS_Mars_Exploration_Program_Website", - "goddard_institute_for_space_studies", - "my_nasa_data", -] - -# these are all the ones changed on 2023.08.17 -# update this note after running them -sources_with_new_title_rule = [ - "ASTRO_Calibration_Documentation_Website", - "ASTRO_Missions_and_Data_Website", - "PDS_Astromaterials_Acquisition_and_Curation_Office_Website", - "PDS_Cassini_Mission_Saturn_Small_Satellites_Website", - "gcn_missions_instruments_and_facilities", - "general_coordinates_network_gcn", - "nasa_power", -] - -# this is every single source on the dev branch -# we are burning the test server and rescraping all of these... -sources_to_scrape_20230929 = [ - "ARSETAppliedSciences", - "ASTRO_API_Search_Website", - "ASTRO_Astrophysics_Documents_Website", - "ASTRO_Calibration_Documentation_Website", - "ASTRO_Contributed_Datasets_Website", - "ASTRO_Data_Hosted_on_LAMBDA_Website", - "ASTRO_Data_Reduction_Tools_Website", - "ASTRO_Exoplanet_Program_Documents_Website", - "ASTRO_Finder_Chart_Website", - "ASTRO_HEASARC_Software_Website", - "ASTRO_HEASARC_Tools_Website", - "ASTRO_HIRES_PRV_Website", - "ASTRO_High-Energy_Missions_Website", - "ASTRO_Hubble_Source_Catalog_Search_API_Website", - "ASTRO_Image_Cutouts_Website", - "ASTRO_James_Webb_Space_Telescope_Website", - "ASTRO_MAST_Documentation_Website", - "ASTRO_Missions_and_Data_Website", - "ASTRO_Multi_Website", - "ASTRO_NASA_Exoplanet_Archive_Documents_Website", - "ASTRO_NAVO_HEASARC", - "ASTRO_NED_User_Guides_Website", - "ASTRO_Planck_Cutout_Visualization_Website", - "ASTRO_Spitzer_Tools_Website", - "ASTRO_TAP_Search_Website", - "ASTRO_WISE_Image_Service_Website", - "ASTRO_ZMAST_API_Website", - "ASTRO_exoMAST_API_Website", - "Algorithm_Publication_Tool", - "Autoplot_Website", - "CASEI", - "CASEI_Campaign", - "CASEI_Deployment", - "CASEI_Instrument", - "CASEI_Platform", - "CCMC_Website", - "CEOS_API_I", - "CEOS_API_M", - "CMR_API", - "CODE_NASA_API", - "Commercial_Smallsat_Data_Acquisition_CSDA_Program", - "DataPathFinder", - "ESSCOR_API", - "GCIS_ARTICLE_API", - "GCIS_BOOKS_API", - "GCIS_JOURNAL_API", - "GCIS_REPORTS_API", - "GENELAB_Github_DataProcessing", - "GENELAB_Github_SampleProcessing", - "GENELAB_Github_Training", - "GENELAB_METADATA_Website", - "GENELAB_Publications_Website", - "HAPI_API", - "HAPI_Website", - "Helio_Events_Knowledgebase_Website", - "Heliophysics_Project_Data_Management_Plans", - "Helioviewer_Documentation_Website", - "Helioviewer_Website", - "LSDA_Website", - "LSDA_Website_Trial", - "LSDA_Website_Trial2", - "NASA_Black_Marble", - "NASA_Climate_Change", - "NASA_Earth_Observations", - "NASA_Earth_Observatory", - "NASA_Earthdata", - "NASA_Heliophysics_Digital_Resource_Library_HDRL", - "NASA_SPoRT", - "NASA_Techport", - "NASA_Worldview", - "NAVO_HEASARC", - "NTRS", - "NasaEarthObservationWebsite", - "Optical_Constants_Database", - "PDS_API_Legacy_All", - "PDS_All_Data_Holdings_Website", - "PDS_Analyst_Notebook_Website", - "PDS_Annex_Data_Holdings_Website", - "PDS_Archive_Navigator_Website", - "PDS_Astrogeology_Website", - "PDS_Astromat_Astromaterials_Data_System_Website", - "PDS_Astromaterials_Acquisition_and_Curation_Office_Website", - "PDS_Astropedia_Lunar_and_Planetary_Cartographic_Catalog_Website", - "PDS_Atmospheric_Escape_Chemistry_Page_Website", - "PDS_CRISM_Analysis_Toolkit_(CAT)_Website", - "PDS_CRISM_Spectral_Library_Website", - "PDS_Cassini_Mission_Dione_(Saturn_IV)_Website", - "PDS_Cassini_Mission_Enceladus_(Saturn_II)_Website", - "PDS_Cassini_Mission_Iapetus_(Saturn_VIII)_Website", - "PDS_Cassini_Mission_Mimas_(Saturn_I)_Website", - "PDS_Cassini_Mission_Rhea_(Saturn_V)_Website", - "PDS_Cassini_Mission_Saturn_Small_Satellites_Website", - "PDS_Cassini_Mission_Tethys_(Saturn_III)_Website", - "PDS_Cassini_Resource_Page_Website", - "PDS_Collision_Induced_Absorption_Model_Website", - "PDS_Current_Missions_Website", - "PDS_DIVINER_RDR_Query_V20_Website", - "PDS_DIVINER_RDR_Query_Website", - "PDS_Data_Archive_Website", - "PDS_Data_Dictionary_Search", - "PDS_Data_Pilot_Website", - "PDS_Data_Portal_Website", - "PDS_Data_Volumes_Index_Website", - "PDS_Data_Volumes_Website", - "PDS_Dawn_Mission_to_Ceres_Website", - "PDS_Dawn_Mission_to_Vesta_Website", - "PDS_EPIC_Model_Website", - "PDS_Errata_Website", - "PDS_Generic_Kernels_Website", - "PDS_Geosciences_Data_Holdings_Website", - "PDS_Geosciences_Node_Spectral_Library_Website", - "PDS_Gravity_Models_Website", - "PDS_High-Resolution_Transmission_Molecular_Absorption_Database_(HITRAN)_Website", - "PDS_ISIS_Astro_Website", - "PDS_ISIS_Website", - "PDS_Image_Atlas_Website", - "PDS_Imaging_Software_Website", - "PDS_Java_Mission-planning_and_Analysis_for_Remote_Sensing_(JMARS)_Website", - "PDS_Juno_Archive_Page_Website", - "PDS_Jupiter_Data_Archive_Website", - "PDS_LADEE_NMS_Calibrated_Data_Search", - "PDS_LADEE_NMS_Derived_Data_Search", - "PDS_LADEE_UVS_Calibrated_Data_Search", - "PDS_LOLA_RDR_Query_V20_Website", - "PDS_LOLA_RDR_Query_Website", - "PDS_Lunar_Atmospheres_Data_Archive_Website", - "PDS_Lunar_Orbiter_Data_Explorer_Website", - "PDS_MAVEN_ACC_Data_Search", - "PDS_MAVEN_NGIMS_Data_Search", - "PDS_MRO_Coordinated_Observation_Website", - "PDS_Map-a-Planet_(MAP)_Website", - "PDS_Mars_Exploration_Program_Website", - "PDS_Mars_GCM_Website", - "PDS_Mars_Lander_Data_Website", - "PDS_Mars_Orbital_Data_Explorer_Website", - "PDS_Mars_Orbiter_Data_Website", - "PDS_Mercury_Data_Archive_Website", - "PDS_Mercury_Orbital_Data_Explorer_Website", - "PDS_Messenger_MASCS_UVVS_Archive_Page_Website", - "PDS_Metadata_Injector_for_PDS_Labels_Website", - "PDS_Mission_Data_Archive_Website", - "PDS_Missions_Archive_Page_Website", - "PDS_Missions_Website", - "PDS_Models_and_Simulations_Website", - "PDS_NASA_Science_Earths_Moon_Website", - "PDS_NASA_Science_Solar_System_Exploration_Website", - "PDS_NASA_Solar_System_Treks_Website", - "PDS_NASA_Space_Science_Data_Coordinated_Archive_(NSSDCA)_Website", - "PDS_NASAs_Eyes_Website", - "PDS_NEAR_Shoemaker_Mission_to_433_Eros_Website", - "PDS_Near_Earth_Asteroid_Rendezvous_(NEAR)_Data_Archive_Website", - "PDS_Neptune_Archive_Page_Website", - "PDS_New_Horizons_Encounter_with_Pluto_Website", - "PDS_Niels_Bohr_Institute_Website", - "PDS_Notebook_Website", - "PDS_ODE_REST_Service_Website", - "PDS_OMEGA_Analysis_Toolkit_(OAT)_Website", - "PDS_OPUS_Website", - "PDS_OSIRIS-REx_Mission_to_Bennu_Website", - "PDS_Object_Access_Library_Website", - "PDS_Odyssey_GRS_Data_Node_Website", - "PDS_Operational_Flight_Other_Project_Kernels_Website", - "PDS_Outer_Planets_Icy_Satellites_Archive_Page_Website", - "PDS_PDS3_Standards_Reference_Website", - "PDS_PDS4_Documents_Website", - "PDS_PDS4_JParser_Website", - "PDS_PDS4_Local_Data_Dictionary_Tool_Website", - "PDS_PDS4_Training_Documents_Website", - "PDS_PDS_Annex_Products_Website", - "PDS_PDS_Atmospheres_Data_Set_Catalog_Website", - "PDS_PDS_Documentation_Website", - "PDS_PDS_Small_Bodies_Node_Asteroid_Dust_Subnode_Website", - "PDS_PDS_Software_Tools_Tutorial_and_Viewers_Website", - "PDS_PDS_Tool_Registry_Website", - "PDS_PPI_Documents_Website", - "PDS_PPI_Software_Website", - "PDS_Phoebe_Saturn_IX_Website", - "PDS_Photojournal_Website", - "PDS_Planetary_Data_System_(PDS)_Website", - "PDS_Planetary_Science_Tools_Website", - "PDS_Pluto_and_Arrokoth_Data_Archive_Website", - "PDS_Projection_on_the_Web_(POW)_Service_Website", - "PDS_Recently_Archived_Volumes_Website", - "PDS_Ring-Moon_Systems_Node_On-line_Tools_Website", - "PDS_Rings_Website", - "PDS_SBIB_3D_Website", - "PDS_SBN_Tools_Utilities_and_Interfaces_Website", - "PDS_SPICE-enhanced_Cosmographia_Website", - "PDS_SPICE_Archives_Website", - "PDS_SPICE_Programming_Lessons_Website", - "PDS_SPICE_Self-Training_Website", - "PDS_SPICE_Toolkit_Documentation_Website", - "PDS_SPICE_Toolkit_Website", - "PDS_SPICE_Tutorials_Website", - "PDS_SPICE_Utility_and_Application_Programs_Website", - "PDS_Saturn_Data_Archive_Website", - "PDS_Small_Bodies_Data_Ferret_Website", - "PDS_Small_Bodies_Image_Browser_Website", - "PDS_Solar_System_Exploration_Research_Virtual_Institute_(SSERVI)_Website", - "PDS_Subscription_Service_Website", - "PDS_Subset_Tool_Website", - "PDS_TES_Data_Node_Website", - "PDS_Titan_Data_Archive_Website", - "PDS_Toolkits_Website", - "PDS_USGS_Pilot_Website", - "PDS_Uranus_Data_Archive_Website", - "PDS_Users_Guides_Website", - "PDS_Venus_Archive_Page_Website", - "PDS_Venus_Orbital_Data_Explorer_Website", - "PDS_Virtual_Astronaut_Website", - "PDS_Web_Chronos_Website", - "PDS_Wind_Tunnel_Particle_Threshold_Speed_Data_Website", - "PyHC_Website", - "SERVIR_Global", - "SPASE_JSON", - "SPASE_Website", - "SPEDAS_Website", - "Sea_Level_Change", - "Small_Bodies_Node", - "Socioeconomic_Data_and_Applications_Center_SEDAC", - "Solar_Data_Analysis_Center_SDAC", - "Solar_Physics_Group", - "Space_Biology_Science_Digest", - "Space_Physics_Data_Facility", - "Space_Place", - "TASKBOOK_Website", - "VEDA_Dashboard", - "VEDA_STAC_Catalog", - "algorithm_theoretical_basis_documents", - "archived_synthetic_data", - "astrogeology_analysis_ready_data", - "astroquery_api_search_mast_queries", - "co_plotter", - "contributed_datasets_in_the_exoplanet_archive", - "coordinate_calculator", - "corot_exoplanet_archive_etss_data_sets", - "earth_observer_publications", - "earth_observing_dashboard", - "earth_science_decadal_surveys", - "emac_exoplanet_modeling_and_analysis_center", - "eos_mission_page", - "exo_mast", - "exoplanet_atmosphere_observability_table", - "exoplanet_opacities_database", - "extinction_calculator", - "f_prime", - "fire_information_for_resource_management_system_firms", - "gcn_circulars", - "gcn_missions_instruments_and_facilities", - "general_coordinates_network_gcn", - "giss_datasets_and_derived_materials", - "giss_publication_list", - "giss_software_tools", - "goddard_institute_for_space_studies", - "heasarc_browse_batch_interface", - "heasarc_download_scripts", - "high_level_science_products", - "hubble_source_catalog_search", - "igwn_public_alerts_user_guide", - "interactive_multiinstrument_database_of_solar_flares", - "ipac_table_validator", - "koa_program_friendly_image_access_service", - "lbti_archive", - "mars_target_encyclopedia_mte", - "mast", - "mast_api_search", - "mast_hubble_search", - "mast_portal", - "mast_query_casjobs", - "mast_web_services", - "montage_mosaic_engine", - "my_nasa_data", - "naif", - "nasa_2023_climate_strategy", - "nasa_carbon_monitoring_system", - "nasa_global_climate_change", - "nasa_power", - "nasa_science_missions_earth", - "nasa_wavelength", - "neid_archive", - "neid_solar_radial_velocity_archive", - "nexsci", - "ntrs_api", - "our_changing_planet_the_view_from_space_images", - "pan_starrs_catalog", - "pan_starrs_catalog_api", - "pds_rings", - "planetary_image_galleries", - "pykoa", - "skiff_spectral_catalog_search", - "space_telescope_bibliographic_search", - "spectral_classes_of_like_stars", - "vao_datascope", - "velocity_calculator", - "venus_data_archive", - "virtual_observatory_information", - "z_mast_search", -] - -# after indexing for a few days, we discovered some possible optimizations and needed -# to restart the jobs -updated_list_20231003 = [ - "heasarc_download_scripts", - "ipac_table_validator", - "mast_api_search", - "montage_mosaic_engine", - "nasa_global_climate_change", - "neid_solar_radial_velocity_archive", - "pan_starrs_catalog_api", - "space_telescope_bibliographic_search", - "virtual_observatory_information", - "high_level_science_products", - "koa_program_friendly_image_access_service", - "mast_hubble_search", - "my_nasa_data", - "nasa_power", - "nexsci", - "pds_rings", - "spectral_classes_of_like_stars", - "z_mast_search", - "ASTRO_Planck_Cutout_Visualization_Website", - "ASTRO_exoMAST_API_Website", - "CASEI_Deployment", - "CEOS_API_M", - "ESSCOR_API", - "GENELAB_Github_DataProcessing", - "HAPI_API", - "Helioviewer_Website", - "NASA_Climate_Change", - "NASA_SPoRT", - "NasaEarthObservationWebsite", - "PDS_Annex_Data_Holdings_Website", - "PDS_Astropedia_Lunar_and_Planetary_Cartographic_Catalog_Website", - "PDS_Cassini_Mission_Enceladus_(Saturn_II)_Website", - "PDS_Cassini_Mission_Tethys_(Saturn_III)_Website", - "PDS_DIVINER_RDR_Query_Website", - "PDS_Data_Volumes_Index_Website", - "PDS_Errata_Website", - "PDS_High-Resolution_Transmission_Molecular_Absorption_Database_(HITRAN)_Website", - "PDS_Java_Mission-planning_and_Analysis_for_Remote_Sensing_(JMARS)_Website", - "PDS_LADEE_UVS_Calibrated_Data_Search", - "PDS_MAVEN_ACC_Data_Search", - "PDS_Mars_GCM_Website", - "PDS_Mercury_Orbital_Data_Explorer_Website", - "PDS_Missions_Website", - "PDS_NASA_Space_Science_Data_Coordinated_Archive_(NSSDCA)_Website", - "PDS_New_Horizons_Encounter_with_Pluto_Website", - "PDS_OPUS_Website", - "PDS_Outer_Planets_Icy_Satellites_Archive_Page_Website", - "PDS_PDS4_Training_Documents_Website", - "PDS_PDS_Software_Tools_Tutorial_and_Viewers_Website", - "PDS_Photojournal_Website", - "PDS_Recently_Archived_Volumes_Website", - "PDS_SPICE-enhanced_Cosmographia_Website", - "PDS_SPICE_Toolkit_Website", - "PDS_Small_Bodies_Image_Browser_Website", - "PDS_Titan_Data_Archive_Website", - "PDS_Venus_Archive_Page_Website", - "PyHC_Website", - "Sea_Level_Change", - "Space_Biology_Science_Digest", - "VEDA_STAC_Catalog", - "co_plotter", - "earth_observing_dashboard", - "exoplanet_atmosphere_observability_table", - "gcn_circulars", - "giss_software_tools", - "hubble_source_catalog_search", - "lbti_archive", - "mast_portal", - "naif", - "nasa_science_missions_earth", - "ntrs_api", - "planetary_image_galleries", - "vao_datascope", - "Space_Physics_Data_Facility", - "algorithm_theoretical_basis_documents", - "contributed_datasets_in_the_exoplanet_archive", - "earth_science_decadal_surveys", - "exoplanet_opacities_database", - "gcn_missions_instruments_and_facilities", - "goddard_institute_for_space_studies", - "igwn_public_alerts_user_guide", - "mars_target_encyclopedia_mte", - "mast_query_casjobs", - "nasa_2023_climate_strategy", - "nasa_wavelength", - "our_changing_planet_the_view_from_space_images", - "pykoa", - "velocity_calculator", - "ASTRO_NASA_Exoplanet_Archive_Documents_Website", - "ASTRO_TAP_Search_Website", - "Autoplot_Website", - "CASEI_Platform", - "CODE_NASA_API", - "GCIS_BOOKS_API", - "GENELAB_Github_Training", - "Helio_Events_Knowledgebase_Website", - "LSDA_Website_Trial", - "NASA_Earth_Observatory", - "NASA_Worldview", - "PDS_API_Legacy_All", - "PDS_Astrogeology_Website", - "PDS_CRISM_Analysis_Toolkit_(CAT)_Website", - "PDS_Cassini_Mission_Mimas_(Saturn_I)_Website", - "PDS_Collision_Induced_Absorption_Model_Website", - "PDS_Data_Dictionary_Search", - "PDS_Dawn_Mission_to_Ceres_Website", - "PDS_Geosciences_Data_Holdings_Website", - "PDS_ISIS_Website", - "PDS_Jupiter_Data_Archive_Website", - "PDS_LOLA_RDR_Query_Website", - "PDS_MRO_Coordinated_Observation_Website", - "PDS_Mars_Orbital_Data_Explorer_Website", - "PDS_Metadata_Injector_for_PDS_Labels_Website", - "PDS_NASA_Science_Earths_Moon_Website", - "PDS_NEAR_Shoemaker_Mission_to_433_Eros_Website", - "PDS_Notebook_Website", - "PDS_Object_Access_Library_Website", - "PDS_PDS4_Documents_Website", - "PDS_PDS_Atmospheres_Data_Set_Catalog_Website", - "PDS_PPI_Documents_Website", - "PDS_Planetary_Science_Tools_Website", - "PDS_Rings_Website", - "PDS_SPICE_Programming_Lessons_Website", - "PDS_SPICE_Utility_and_Application_Programs_Website", - "PDS_Subscription_Service_Website", - "PDS_USGS_Pilot_Website", - "PDS_Virtual_Astronaut_Website", - "SPASE_JSON", - "Socioeconomic_Data_and_Applications_Center_SEDAC", - "Space_Place", - "archived_synthetic_data", - "coordinate_calculator", - "emac_exoplanet_modeling_and_analysis_center", - "extinction_calculator", - "general_coordinates_network_gcn", - "heasarc_browse_batch_interface", - "interactive_multiinstrument_database_of_solar_flares", - "mast", - "mast_web_services", - "nasa_carbon_monitoring_system", - "neid_archive", - "pan_starrs_catalog", - "skiff_spectral_catalog_search", - "venus_data_archive", - # long jobs... - "giss_datasets_and_derived_materials", - "ASTRO_Missions_and_Data_Website", - "Small_Bodies_Node", - "ASTRO_Image_Cutouts_Website", -] - -update_base_href = [ - "SERVIR_Global", - "Sea_Level_Change", - "Solar_Physics_Group", - "Space_Physics_Data_Facility", - "astroquery_api_search_mast_queries", - "contributed_datasets_in_the_exoplanet_archive", - "corot_exoplanet_archive_etss_data_sets", - "exo_mast", - "exoplanet_atmosphere_observability_table", - "extinction_calculator", - "gcn_circulars", - "interactive_multiinstrument_database_of_solar_flares", - "mast", - "mast_api_search", - "mast_portal", - "neid_archive", - "our_changing_planet_the_view_from_space_images", - "pan_starrs_catalog", - "pan_starrs_catalog_api", - "space_telescope_bibliographic_search", - "spectral_classes_of_like_stars", - "vao_datascope", - "velocity_calculator", - "z_mast_search", -] - -deploy_to_prod_20231027 = [ - "interactive_multiinstrument_database_of_solar_flares", - "SPEDAS_Website", - "Helioviewer_Documentation_Website", - "GENELAB_Publications_Website", - "contributed_datasets_in_the_exoplanet_archive", - "corot_exoplanet_archive_etss_data_sets", - "exo_mast", - "exoplanet_atmosphere_observability_table", - "exoplanet_opacities_database", - "mast", -] - -sources_to_delete_20231031 = [ - "PDS_Odyssey_GRS_Data_Node_Website", - "PDS_Map-a-Planet_(MAP)_Website", - "PDS_Projection_on_the_Web_(POW)_Service_Website", - "PDS_LADEE_NMS_Derived_Data_Search", - "PDS_LADEE_NMS_Calibrated_Data_Search", - "PDS_Wind_Tunnel_Particle_Threshold_Speed_Data_Website", - "exofop_k2_campaign_9", - "GENELAB_METADATA_Website", - "pds_geosciences_node_community", - "2mass_batch_image_service", - "2mass_api_search", - "2mass_interactive_image_service", - "2mass_image_inventory_search", - "image_and_spectrum_server_atlas", - "atlas_api_search", - "background_model", - "galactic_dust_reddening_and_extinction", - "ASTRO_Finder_Chart_Website", - "irsa_api", - "herschel_data_search", - "hires", - "wise_neowise_coadder", - "image_validation", - "object_coordinate_lookup", - "most", - "scanpi", - "swas_spectrum_server", - "swas_api_search", - "planck_data_tools", - "irsa_votable_access_protocol", - "vo_simple_cone_search", - "ssa_queries", - "irsa_idl_tools", - "PDS_Web_Chronos_Website", - "PDS_Subset_Tool_Website", - "PDS_SPICE-enhanced_Cosmographia_Website", - "PDS_SPICE_Archives_Website", - "PDS_Operational_Flight_Other_Project_Kernels_Website", - "PDS_SPICE_Toolkit_Documentation_Website", - "PDS_SPICE_Programming_Lessons_Website", - "PDS_SPICE_Toolkit_Website", - "PDS_SPICE_Tutorials_Website", - "PDS_SPICE_Utility_and_Application_Programs_Website", - "PDS_Generic_Kernels_Website", - "PDS_Niels_Bohr_Institute_Website", - "PDS_PDS_Atmospheres_Data_Set_Catalog_Website", - "PDS_LADEE_UVS_Calibrated_Data_Search", - "PDS_Recently_Archived_Volumes_Website", - "PDS_Object_Access_Library_Website", - "ftp_access", - "index", - "PDS_Data_Archive_Website", - "PDS_All_Data_Holdings_Website", - "PDS_PDS_Software_Tools_Tutorial_and_Viewers_Website", - "PDS_Data_Volumes_Index_Website", - "PDS_PPI_Documents_Website", - "PDS_Missions_Website", - "PDS_Errata_Website", - "PDS_Data_Volumes_Website", - "PDS_Models_and_Simulations_Website", - "PDS_Rings_Website", - "viewmaster_data_archives_calibrated", - "viewmaster_data_archives_diagrams", - "viewmaster_data_archives_previews", - "viewmaster_data_archives_volumes", - "viewmaster_data_calibrated", - "viewmaster_data_diagrams", - "viewmaster_documents", - "viewmaster_data_previews", - "viewmaster_data_volumes", - "small_bodies_node_data_by_type_of_observation", - "PDS_Mission_Data_Archive_Website", - "small_bodies_node_data_by_target_type", - "data_set_status", - "PDS_Subscription_Service_Website", - "PDS_USGS_Pilot_Website", - "PDS_OSIRIS-REx_Mission_to_Bennu_Website", - "PDS_Dawn_Mission_to_Ceres_Website", - "PDS_Cassini_Mission_Dione_(Saturn_IV)_Website", - "PDS_Cassini_Mission_Enceladus_(Saturn_II)_Website", - "PDS_NEAR_Shoemaker_Mission_to_433_Eros_Website", - "PDS_Cassini_Mission_Iapetus_(Saturn_VIII)_Website", - "PDS_Cassini_Mission_Mimas_(Saturn_I)_Website", - "PDS_Phoebe_Saturn_IX_Website", - "PDS_New_Horizons_Encounter_with_Pluto_Website", - "PDS_Cassini_Mission_Rhea_(Saturn_V)_Website", - "PDS_Cassini_Mission_Tethys_(Saturn_III)_Website", - "PDS_Dawn_Mission_to_Vesta_Website", - "PDS_SBIB_3D_Website", - "PDS_Cassini_Mission_Saturn_Small_Satellites_Website", - "PDS_Small_Bodies_Data_Ferret_Website", - "PDS_Astromat_Astromaterials_Data_System_Website", - "PDS_ISIS_Website", - "navo_registry", - "PDS_Planetary_Data_System_(PDS)_Website", - "ASTRO_Multi_Website", - "LSDA_Website_Trial", - "LSDA_Website_Trial2", - "PDS_PDS_Documentation_Website", - "PDS_Data_Portal_Website", - "PDS_Image_Atlas_Website", - "PDS_Imaging_Software_Website", - "PDS_Users_Guides_Website", - "GENELAB_Publications_Website", -] - - -sources_to_index_20240618 = [ - "Mission_Independent_Data_Layer", - "koa_keck_observatory_archive", - "interstellar_mapping_and_acceleration_probe", - "explorers_and_heliophysics_projects_division", - "interstellar_boundary_explorer_ibex", - "polarimeter_to_unify_the_corona_and_heliosphere", - "helioswarm", - "voyager", - "earth_science_office_at_msfc", - "earth_system_science_pathfinder", - "cloudsat", - "carve_carbon_in_arctic_reservoirs_vulnerability_experiment", - "a_train_the_afternoon_constellation", - "cygnss_cyclone_global_navigation_satellite_system", - "dcotss_dynamics_and_chemistry_of_the_summer_stratosphere", - "delta_x", - "center_for_climate_sciences", -] - -sources_to_index_20240717 = [ - "nasa_ames_intelligent_systems_division_data", - "chandra_x_ray_observatory", - "hi_c_at_msfc", - "tandem_reconnection_and_cusp_electrodynamics_reconnaissance_satellites", - "sungrazer_project", - "solar_system_dynamics", - "lowell_minor_planet_services", - "explorer_1", - "earth_sciences_at_gsfc", - "earth_science_at_jpl", - "ecostress", - "seabass", - "ecostress_spectral_library", - "unite_unistellar_network_investigating_tess_exoplanets", - "satellite_situation_center_sscweb_system_and_services", - "the_astrophysics_astrochemistry_lab", - "hubble_space_telescope", - "galprop", - "chandra_x_ray_center_cxc", -] - -sources_to_index_20240730 = [ - "gcn_circulars", - "gamma_ray_astrophysics_at_the_nsstc", - "asteroid_lightcurve_photometry_database", - "orbital_data_explorer", - "asdc_misr", - "archived_gcn", - "ghrc_global_hydrometeorology_resource_center", - "NASA_Earth_Observatory", - "aurorasaurus_reporting_auroras_from_the_ground_up", - "hinode_at_msfc", - "osiris_rex_asteroid_sample_return_mission", - "grace_and_grace_fo_groundwater_and_soil_moisture_conditions", - "sun_climate_powered_by_solar_irradiance", - "icesat_2_ice_cloud_and_land_elevation_satellite_2", - "spruce_spruce_and_peatland_responses_under_changing_environments", - "tess_transitioning_exoplanet_survey_satellite", - "iasc_international_astronomical_search_collaboration", - "debit_dynamic_eclipse_broadcast_initiative", - "astropix", - "Space_Physics_Data_Facility", - "PDS_Photojournal_Website", -] - -sources_with_neural_and_plugin = [ - "Geosciences_Node", - "Helioviewer_Documentation_Website", - "International_Heliophysics_Data_Environment_Alliance_Overview_IHDEA", - "act_america_atmospheric_carbon_and_transport_america", - "activate_aerosol_cloud_meteorology_interactions_over_the_western_atlantic_experiment", - "advanced_composition_explorer", - "airmoss_airborne_microwave_observatory_of_subcanopy_and_subsurface_at_jpl", - "aria_advanced_rapid_imaging_and_analysis", - "atmospheric_imaging_assembly", - "explorer_program_acquisition", - "fast_plasma_investigation", - "fermi_at_gsfc", - "hawc_observatory", - "hinode_solar_b", - "incus_investigation_of_convective_updrafts", - "interactive_nasa_space_physics_ionosphere_radio_experiments_inspire", - "iris_interface_region_imaging_spectrograph", - "jwst_user_documentation", - "ldas_land_data_assimilatin_system", - "lisa_consortium", - "mdscc_deep_space_network", - "microobservatory_robotic_telescope_network", - "naif", - "nasa_applied_sciences", - "nasa_arcgis_online", - "nasa_infrared_telescope_facility_irtf", - "nasa_sounding_rocket_program", - "parker_solar_probe", - "pds_cartography_and_imaging_sciences_node", - "pds_website", - "physics_of_the_cosmos", - "ppi_node", - "pps_precipitation_processing_system", - "radio_jove", - "rhessi_homepage", - "sampex_data_center", - "sdo_solar_dynamics_observatory", - "solar_terrestrial_probes_program", - "starchild_a_learning_center_for_young_astronomers", - "stereo_at_gsfc", - "stereo_cor1", - "the_new_great_observatories", - "treasure_map", - "vector_electric_field_instrument", - "virbo", - "virtual_wave_observatory", -] - -sources_to_index_test_grid = [ - "a_train_the_afternoon_constellation", - "act_america_atmospheric_carbon_and_transport_america", - "activate_aerosol_cloud_meteorology_interactions_over_the_western_atlantic_experiment", - "advanced_composition_explorer", - "Advancing_the_science_of_heliophysics", - "airmoss_airborne_microwave_observatory_of_subcanopy_and_subsurface_at_jpl", - "archived_gcn", - "aria_advanced_rapid_imaging_and_analysis", - "asdc_misr", - "asteroid_lightcurve_photometry_database", - "astronomy_picture_of_the_day", - "astrophysics_source_code_library", - "astropix", - "astropy", - "atmospheric_imaging_assembly", - "aurorasaurus_reporting_auroras_from_the_ground_up", - "carve_carbon_in_arctic_reservoirs_vulnerability_experiment", - "cdaw_data_center", - "center_for_climate_sciences", - "chandra_x_ray_center_cxc", - "chandra_x_ray_observatory", - "cii_hosted_payload_opportunity_online_database", - "cloudsat", - "cosmic_data_stories", - "cygnss_cyclone_global_navigation_satellite_system", - "dcotss_dynamics_and_chemistry_of_the_summer_stratosphere", - "debit_dynamic_eclipse_broadcast_initiative", - "delta_x", - "dscovr_epic_earth_polychromatic_imaging_camera", - "earth_science_at_jpl", - "earth_science_office_at_msfc", - "earth_system_science_pathfinder", - "ecostress", - "ecostress_spectral_library", - "explorer_1", - "explorer_program_acquisition", - "explorers_and_heliophysics_projects_division", - "fast_plasma_investigation", - "fermi_at_gsfc", - "galprop", - "gamma_ray_astrophysics_at_the_nsstc", - "gamma_ray_data_tools_core_package", - "gamma_ray_data_tools_github", - "Geosciences_Node", - "ghrc_global_hydrometeorology_resource_center", - "global_sulfur_dioxide_monitoring", - "gmao_fluid", - "grace_and_grace_fo_groundwater_and_soil_moisture_conditions", - "hawc_observatory", - "HelioAnalytics", - "helionauts", - "heliophysics_digital_observatory", - "heliophysics_system_observatory_connect", - "helioswarm", - "Helioviewer_Documentation_Website", - "hi_c_at_msfc", - "hinode_at_msfc", - "hinode_solar_b", - "hpde_github", - "hubble_space_telescope", - "icesat_2_ice_cloud_and_land_elevation_satellite_2", - "incus_investigation_of_convective_updrafts", - "interactive_nasa_space_physics_ionosphere_radio_experiments_inspire", - "International_Heliophysics_Data_Environment_Alliance_Overview_IHDEA", - "interstellar_boundary_explorer_ibex", - "interstellar_mapping_and_acceleration_probe", - "iris_interface_region_imaging_spectrograph", - "JWST_User_Documentation", - "koa_keck_observatory_archive", - "land_processes_distributed_active_archive_center", - "ldas_land_data_assimilatin_system", - "lisa_consortium", - "Living_with_a_Star", - "lowell_minor_planet_services", - "magnetospheric_multiscale_satellites", - "mdscc_deep_space_network", - "microobservatory_robotic_telescope_network", - "Mission_Independent_Data_Layer", - "naif", - "nasa_ames_intelligent_systems_division_data", - "nasa_applied_sciences", - "nasa_arcgis_online", - "NASA_Earth_Observatory", - "nasa_infrared_telescope_facility_irtf", - "nasa_sounding_rocket_program", - "nasa_visible_earth", - "national_space_weather_program", - "neil_gehrel_s_swift_observatory", - "orbital_data_explorer", - "osiris_rex_asteroid_sample_return_mission", - "parker_solar_probe", - "pds_atmospheres", - "pds_cartography_and_imaging_sciences_node", - "pds_nasa_solar_system_treks_website", - "PDS_Photojournal_Website", - "pds_rings", - "pds_website", - "physics_of_the_cosmos", - "polarimeter_to_unify_the_corona_and_heliosphere", - "ppi_node", - "pps_precipitation_processing_system", - "radio_jove", - "rhessi_homepage", - "sampex_data_center", - "satellite_situation_center_sscweb_system_and_services", - "sdo_solar_dynamics_observatory", - "seabass", - "sep_instrument_suite", - "Small_Bodies_Node", - "solar_and_heliospheric_observatory_soho", - "Solar_Physics_Group", - "solar_system_dynamics", - "solar_terrestrial_probes_program", - "spruce_spruce_and_peatland_responses_under_changing_environments", - "starchild_a_learning_center_for_young_astronomers", - "stereo_at_gsfc", - "stereo_cor1", - "sun_climate_powered_by_solar_irradiance", - "sungrazer_project", - "tandem_reconnection_and_cusp_electrodynamics_reconnaissance_satellites", - "TASKBOOK_Website", - "tess_transitioning_exoplanet_survey_satellite", - "the_astrophysics_astrochemistry_lab", - "the_new_great_observatories", - "treasure_map", - "unite_unistellar_network_investigating_tess_exoplanets", - "Van_Allen_Probes", - "vector_electric_field_instrument", - "virtual_solar_observatory", - "virtual_wave_observatory", - "voyager", - "Voyager_Cosmic_Ray_Subsystem", - "WIND_Spacecraft", -] - -missing_indexers = [ - "Advancing_the_science_of_heliophysics", - "HelioAnalytics", - "JWST_User_Documentation", - "Living_with_a_Star", - "pds_nasa_solar_system_treks_website", - "solar_and_heliospheric_observatory_soho", -] - -sources_to_index_test_grid_20240809 = [s for s in sources_to_index_test_grid if s not in missing_indexers] diff --git a/config_generation/tests/__init__.py b/config_generation/tests/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/config_generation/tests/test_config_generation_pipeline.py b/config_generation/tests/test_config_generation_pipeline.py deleted file mode 100644 index ebde072f..00000000 --- a/config_generation/tests/test_config_generation_pipeline.py +++ /dev/null @@ -1,90 +0,0 @@ -from unittest.mock import MagicMock, call, patch - -from django.test import TestCase - -from sde_collections.models.collection import Collection -from sde_collections.models.collection_choice_fields import WorkflowStatusChoices - -""" -Workflow status change → Opens template → Applies XML transformation → Writes to GitHub. - -- When the `workflow_status` changes, it triggers the relevant config creation method. -- The method reads an template and processes it using `XmlEditor`. -- `XmlEditor` modifies the template by injecting collection-specific values and transformations. -- The generated XML is passed to `_write_to_github()`, which commits it directly to GitHub. - -Note: This test verifies that the correct methods are triggered and XML content is passed to GitHub. -The actual XML structure and correctness are tested separately in `test_db_xml.py`. -""" - - -class TestConfigCreation(TestCase): - def setUp(self): - self.collection = Collection.objects.create( - name="Test Collection", division="1", workflow_status=WorkflowStatusChoices.RESEARCH_IN_PROGRESS - ) - - @patch("sde_collections.utils.github_helper.GitHubHandler") # Mock GitHubHandler - @patch("sde_collections.models.collection.Collection._write_to_github") - @patch("sde_collections.models.collection.XmlEditor") - def test_ready_for_engineering_triggers_config_and_job_creation( - self, MockXmlEditor, mock_write_to_github, MockGitHubHandler - ): - """ - When the collection's workflow status is updated to READY_FOR_ENGINEERING, - it should trigger the creation of scraper configuration and job files. - """ - # Mock GitHubHandler to avoid actual API calls - mock_github_instance = MockGitHubHandler.return_value - mock_github_instance.create_file.return_value = None - mock_github_instance.create_or_update_file.return_value = None - - # Set up the XmlEditor mock for both config and job - mock_editor_instance = MockXmlEditor.return_value - mock_editor_instance.convert_template_to_scraper.return_value = "config_data" - mock_editor_instance.convert_template_to_job.return_value = "job_data" - - # Simulate the status change to READY_FOR_ENGINEERING - self.collection.workflow_status = WorkflowStatusChoices.READY_FOR_ENGINEERING - self.collection.save() - - # Verify that the XML for both config and job are generated and written to GitHub - expected_calls = [ - call(self.collection._scraper_config_path, "config_data", False), - call(self.collection._scraper_job_path, "job_data", False), - ] - mock_write_to_github.assert_has_calls(expected_calls, any_order=True) - - @patch("sde_collections.models.collection.GitHubHandler") # Mock GitHubHandler in the correct module path - @patch("sde_collections.models.collection.Collection._write_to_github") - @patch("sde_collections.models.collection.XmlEditor") - def test_ready_for_curation_triggers_indexer_config_and_job_creation( - self, MockXmlEditor, mock_write_to_github, MockGitHubHandler - ): - """ - When the collection's workflow status is updated to READY_FOR_CURATION, - it should trigger indexer config and job creation methods. - """ - # Mock GitHubHandler to avoid actual API calls - mock_github_instance = MockGitHubHandler.return_value - mock_github_instance.check_file_exists.return_value = True # Assume scraper exists - mock_github_instance._get_file_contents.return_value = MagicMock() - mock_github_instance._get_file_contents.return_value.decoded_content = ( - b"Mock Data" - ) - - # Set up the XmlEditor mock for both config and job - mock_editor_instance = MockXmlEditor.return_value - mock_editor_instance.convert_template_to_indexer.return_value = "config_data" - mock_editor_instance.convert_template_to_job.return_value = "job_data" - - # Simulate the status change to READY_FOR_CURATION - self.collection.workflow_status = WorkflowStatusChoices.READY_FOR_CURATION - self.collection.save() - - # Verify that the XML for both indexer config and job are generated and written to GitHub - expected_calls = [ - call(self.collection._indexer_config_path, "config_data", True), - call(self.collection._indexer_job_path, "job_data", False), - ] - mock_write_to_github.assert_has_calls(expected_calls, any_order=True) diff --git a/config_generation/tests/test_db_to_xml.py b/config_generation/tests/test_db_to_xml.py deleted file mode 100644 index 197c6044..00000000 --- a/config_generation/tests/test_db_to_xml.py +++ /dev/null @@ -1,142 +0,0 @@ -# docker-compose -f local.yml run --rm django pytest config_generation/tests/test_db_to_xml.py -from xml.etree.ElementTree import ElementTree, ParseError, fromstring - -import pytest - -from ..db_to_xml import XmlEditor - - -def xmls_equal(xml1, xml2): - """ - Check the structural and textual equality of two XML strings. - - Parameters: - - xml1, xml2 (str): The XML strings to compare. - - Returns: - - bool: True if XMLs are structurally and textually equal, False otherwise. - """ - - def elements_equal(e1, e2): - # Check tag and text - if e1.tag != e2.tag or (e1.text or "").strip() != (e2.text or "").strip(): - return False - - # Check attributes (ignoring order) - if sorted(e1.attrib.items()) != sorted(e2.attrib.items()): - return False - - # Check children - if len(e1) != len(e2): - return False - return all(elements_equal(c1, c2) for c1, c2 in zip(e1, e2)) - - tree1 = ElementTree(fromstring(xml1)) - tree2 = ElementTree(fromstring(xml2)) - - return elements_equal(tree1.getroot(), tree2.getroot()) - - -# Tests for valid and invalid XML initializations -def test_valid_xml_initialization(): - xml_string = "Test" - editor = XmlEditor(xml_string) - assert editor.get_tag_value("child") == ["Test"] - - -def test_invalid_xml_initialization(): - with pytest.raises(ParseError): - XmlEditor("") - - -# Test retrieval of single and multiple tag values -def test_get_single_tag_value(): - xml_string = "Test" - editor = XmlEditor(xml_string) - assert editor.get_tag_value("child", strict=True) == "Test" - - -def test_get_nonexistent_tag_value(): - xml_string = "Test" - editor = XmlEditor(xml_string) - assert editor.get_tag_value("nonexistent", strict=False) == [] - - -def test_get_tag_value_strict_multiple_elements(): - xml_string = "OneTwo" - editor = XmlEditor(xml_string) - with pytest.raises(ValueError): - editor.get_tag_value("child", strict=True) - - -# Test updating and adding XML elements -def test_update_existing_element(): - xml_string = "Old" - editor = XmlEditor(xml_string) - editor.update_or_add_element_value("child", "New") - updated_xml = editor.update_config_xml() - assert "New" in updated_xml and "Old" not in updated_xml - - -def test_add_new_element(): - xml_string = "" - editor = XmlEditor(xml_string) - editor.update_or_add_element_value("newchild", "Value") - updated_xml = editor.update_config_xml() - assert "Value" in updated_xml and "Value" in updated_xml - - -def test_add_third_level_hierarchy(): - xml_string = "" - editor = XmlEditor(xml_string) - editor.update_or_add_element_value("parent/child/grandchild", "DeeplyNested") - updated_xml = editor.update_config_xml() - root = fromstring(updated_xml) - grandchild = root.find(".//grandchild") - assert grandchild is not None, "Grandchild element not found" - assert grandchild.text == "DeeplyNested", "Grandchild does not contain the correct text" - - # Check complete path - parent = root.find(".//parent/child/grandchild") - assert parent is not None, "Complete path to grandchild not found" - assert parent.text == "DeeplyNested", "Complete path to grandchild does not contain correct text" - - -# Test transformations and generic mapping -def test_convert_indexer_to_scraper_transformation(): - xml_string = """Indexer""" - editor = XmlEditor(xml_string) - editor.convert_indexer_to_scraper() - updated_xml = editor.update_config_xml() - assert "SMD_Plugins/Sinequa.Plugin.ListCandidateUrls" in updated_xml - assert "Indexer" not in updated_xml - - -def test_generic_mapping_addition(): - xml_string = "" - editor = XmlEditor(xml_string) - editor._generic_mapping(name="id", value="doc.url1", selection="url1") - updated_xml = editor.update_config_xml() - assert "" in updated_xml - assert "id" in updated_xml - assert "doc.url1" in updated_xml - - -# Test XML serialization with headers -def test_xml_serialization_with_header(): - xml_string = "Value" - editor = XmlEditor(xml_string) - xml_output = editor.update_config_xml() - assert '' in xml_output - assert "" in xml_output and "Value" in xml_output - - -# Test handling multiple changes accumulation -def test_multiple_changes_accumulation(): - xml_string = "Initial" - editor = XmlEditor(xml_string) - editor.update_or_add_element_value("child", "Modified") - editor.update_or_add_element_value("newchild", "Added") - updated_xml = editor.update_config_xml() - assert "Modified" in updated_xml and "Added" in updated_xml - assert "Initial" not in updated_xml diff --git a/config_generation/xmls/command_template.xml b/config_generation/xmls/command_template.xml deleted file mode 100644 index 17a63413..00000000 --- a/config_generation/xmls/command_template.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - 2 - - updatecolumns - - - Auto - - - true - - false - - - true - - - true - git - - false - - @@ScienceMissionDirectorate - - false - - - diff --git a/config_generation/xmls/delete_template.xml b/config_generation/xmls/delete_template.xml deleted file mode 100644 index bbbde682..00000000 --- a/config_generation/xmls/delete_template.xml +++ /dev/null @@ -1,22 +0,0 @@ - - 2 - - sql - - - - - true - - false - - - - true - - - true - - - false - diff --git a/config_generation/xmls/example_exclude_and_title_patterns.xml b/config_generation/xmls/example_exclude_and_title_patterns.xml deleted file mode 100644 index de795376..00000000 --- a/config_generation/xmls/example_exclude_and_title_patterns.xml +++ /dev/null @@ -1,40 +0,0 @@ - - - //*[@id="ssdBgWrapper"]/header - false - - - - - //*[@id="jwstFooter"] - false - - - - - - - title - "Images of James Web for Press" - - url1 = 'https://webb.nasa.gov/content/forPress/index.html' - - - - - - title - IfEmpty(Concat(xpath:/html/body/div/div/div/p[1]/font, ' ', - xpath:/html/body/div/div/div/p[1]/font[2]),xpath:/html/head/title) - Helio Events Title - - - - - -https://webb.nasa.gov/content/news/webbBuildStatusArchive.html - - - -https://webb.nasa.gov/content/forEducators/realworld* -*.rtf diff --git a/config_generation/xmls/indexer_template.xml b/config_generation/xmls/indexer_template.xml deleted file mode 100644 index 3559cdcc..00000000 --- a/config_generation/xmls/indexer_template.xml +++ /dev/null @@ -1,289 +0,0 @@ - - - crawler2 - - - - - - - 1 - - false - - SMD_Plugins/Sinequa.Plugin.WebCrawler_Index_URLList - 3 - - - - - - - - - - true - - true - - - - - - - true - false - false - true - true - false - true - true - false - true - true - true - true - false - - - - true - no - false - - false - false - false - false - false - - - false - true - true - true - false - false - true - false - false - false - false - false - false - false - - - - true - true - - true - false - - - - false - - false - true - false - - true - - - - - - false - false - expBackoff+headers - false - - - - - - - - - - - - false - true - - - - - false - - - false - - - - - - - true - true - - - false - - - - - - - - eu-west-1 - - - true - - true - - - true - false - - - - - - INFO - - false - - true - false - - - - false - false - false - false - true - false - - - - false - false - - - false - false - false - - - - - - - - - false - false - false - - - - true - - - - - - false - false - false - - true - - false - true - true - false - false - false - false - - - - false - false - true - false - - - true - false - - - - true - - - - - - - false - false - false - false - false - false - false - false - false - false - false - true - true - false - false - false - false - true - false - - false - false - false - false - - - - - - - - - - false - - - - - - false - - - - - - false - - - id - doc.url1 - - false - false - diff --git a/config_generation/xmls/indexing_template.xml b/config_generation/xmls/indexing_template.xml deleted file mode 100644 index 5faa8506..00000000 --- a/config_generation/xmls/indexing_template.xml +++ /dev/null @@ -1,285 +0,0 @@ - - - crawler2 - - - - - /your/treeroot/here/ - false - - - rtf;xml;jy;ico;gz;act;xsd - - - - - - - false - false - false - - - true - - - - - - false - false - false - - - - 20 - - false - - true - false - - - false - false - false - false - false - false - - - - false - false - - false - false - false - - - - - - - - - - - - - - - - false - true - true - false - false - false - false - - - - false - false - true - false - - - false - false - - - - true - - - - - - - false - false - false - false - false - false - false - false - false - false - false - true - true - false - false - false - false - true - false - - false - false - false - - - - - - - - - false - - - - - - false - - - - - - false - - 3 - - your_url_here - - - true - true - true - 100 - 100000 - 100000 - 10 - -1 - -1 - true - false - false - false - false - false - true - true - false - true - true - true - true - false - - - true - no - false - - false - false - True - false - false - - - false - true - true - true - false - true - true - false - false - false - false - false - false - false - - - - true - true - - true - false - - - - false - - false - true - false - - true - - - - - - false - false - false - - - - - - - - - - - false - true - - - - - false - - - - - - - - - true - true - - - false - - - - - - - - eu-west-1 - - true - - true - - - true - false - - - - - - id - doc.url1 - - - - - diff --git a/config_generation/xmls/job_command_template.xml b/config_generation/xmls/job_command_template.xml deleted file mode 100644 index d8203e0e..00000000 --- a/config_generation/xmls/job_command_template.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - - command - - - false - - - - - - - - - - - - - false - - - - - - - false - - true - false - - - - collectioncache.GCMD.CASEI_Campaign - diff --git a/config_generation/xmls/job_template.xml b/config_generation/xmls/job_template.xml deleted file mode 100644 index 7763ecf1..00000000 --- a/config_generation/xmls/job_template.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - collection - - - - - false - - - - - - - - - - - - - false - - - - - - - false - - false - false - - - - diff --git a/config_generation/xmls/joblist_template.xml b/config_generation/xmls/joblist_template.xml deleted file mode 100644 index 72d79c13..00000000 --- a/config_generation/xmls/joblist_template.xml +++ /dev/null @@ -1,40 +0,0 @@ - - - - joblist - - - false - - - - - - - - - - - - - false - - - - - 20 - - false - - false - false - - - - true - false - - diff --git a/config_generation/xmls/json_url_indexing_template.xml b/config_generation/xmls/json_url_indexing_template.xml deleted file mode 100644 index db1b9579..00000000 --- a/config_generation/xmls/json_url_indexing_template.xml +++ /dev/null @@ -1,373 +0,0 @@ - - - - json.v2 - - - - - /Testing/Solar System Exploration/ - false - - htm;html - - - *index.html;*.xml - - - - - false - false - false - - - true - - - - - - false - false - false - 0 - - - 20 - - false - - false - false - - - false - false - false - false - true - false - - - - false - false - true - - - false - false - false - - - - - - - - - - - - - - - - false - true - true - false - false - false - - - - false - false - true - false - - - true - false - - - - true - false - false - false - false - false - false - false - false - false - false - false - true - true - false - false - false - false - true - false - - false - false - false - - - - - - - - - false - - - - - - false - - Balanced - - - - false - - - - $.url_list.url - - false - - false - - solar - $.data - $.solar - - - - - - true - url_list - GET - https://sde-indexing-helper.nasa-impact.net/candidate-urls-api/CONFIG_FOLDER_HERE/ - $.results - - - https://sde-indexing-helper.nasa-impact.net/candidate-urls-api/CONFIG_FOLDER_HERE/?format=json&page={Add(datasource.url_list.pagenumber,1)} - datasource.url_list.pagenumber=132 - - - true - BothModes - - - - - - - false - - AddOrUpdate - - - - - - - - - - - true - false - - - - false - - false - true - false - - true - - - - - - false - false - false - - - - - - - - - false - true - - - - - false - - - - - - - - - true - true - - - false - - - - - - - - eu-west-1 - - - true - - true - - 80 - true - false - - - - - - - 6 - - - - true - true - true - 100 - 100000 - 100000 - 10 - -1 - -1 - true - false - false - false - false - false - true - true - false - true - true - true - true - false - 1 - 0 ms - true - no - false - - false - false - false - false - false - - - false - true - true - true - false - false - true - false - false - false - false - false - false - false - - - - true - true - 1 - - false - - - false - - - - - - - {"class":"go.GraphLinksModel","nodeKeyProperty":":id","nodeCategoryProperty":":type","linkCategoryProperty":":type","linkFromPortIdProperty":":fromPort","linkToPortIdProperty":":toPort","linkFromKeyProperty":":from","linkToKeyProperty":":to","nodeDataArray":[{":id":"start",":type":"Start","Name":"Start"},{":id":"1url_list_sendrequest",":type":"DataSourceSendRequest","Name":"'url_list'\nSend request 'GET'\nhttps:\/\n\/sde-indexing-help\ner.nasa-impact.net\n\/candidate-urls-ap\ni\/nasa_power\/"},{":id":"1url_list_foreach",":type":"DataSourceForEach","Name":"For each item\n$.results\nAdd (or update)"},{":id":"to_indexer_1url_list_foreach",":type":"End","Name":"To indexer"}],"linkDataArray":[{":from":"start",":to":"1url_list_sendrequest",":fromPort":"out",":toPort":"in",":type":"ds_to_ds_link"},{":from":"1url_list_sendrequest",":to":"1url_list_foreach",":fromPort":"out",":toPort":"in",":type":"ds_to_ds_link"},{":from":"1url_list_foreach",":to":"to_indexer_1url_list_foreach",":fromPort":"out",":toPort":"in",":type":"ds_to_ds_link","Name":"To indexer"}]} - false - - - - - id - $.url_list.url - id - - - - - version - $.url_list.hash - version - - - - - title - $.url_list.title - Data item title - - - - - sourcestr56 - $.url_list.document_type - Data item document type - - - - - fileext - $.url_list.file_extension - Data item file extension - - - - diff --git a/config_generation/xmls/scraper_template.xml b/config_generation/xmls/scraper_template.xml deleted file mode 100644 index baf596ea..00000000 --- a/config_generation/xmls/scraper_template.xml +++ /dev/null @@ -1,295 +0,0 @@ - - - crawler2 - - - - - - - 1 - - false - - 3 - - - - - html;htm;xlsx;xls;xlsm;doc;docx;ppt;pdf - - - - - - true - - true - true - true - - - - - - - true - false - false - true - true - false - true - true - false - true - true - true - true - false - - 0 ms - - true - no - false - - false - false - false - false - false - - - false - true - true - true - false - false - true - false - false - false - false - false - false - false - - - - true - true - - id - doc.url1 - - - title - doc.filename - - doc.fileext = "pdf" - - - true - false - - - - false - - false - true - false - - true - - - - - - false - false - expBackoff+headers - false - - - - - - - - - - - - false - true - - - - - false - - - false - - - - - - - true - true - - - false - - - - - - - - eu-west-1 - - - true - - true - - - true - false - - - - - - INFO - - false - - true - false - - - - false - false - false - false - true - false - - - - false - false - - - false - false - false - - - - - - - - - false - false - false - - - - true - - - - - - false - false - false - - true - - false - true - true - false - false - false - false - - - - false - false - true - false - - - true - false - - - - true - - - - - - - false - false - false - false - false - false - false - false - false - false - false - true - true - false - false - false - false - true - false - - false - false - false - false - - - - - - - - - - false - - - - - - false - - - - - - false - - diff --git a/default_scraper.xml b/default_scraper.xml deleted file mode 100644 index ef583b3b..00000000 --- a/default_scraper.xml +++ /dev/null @@ -1,287 +0,0 @@ - - - Default crawler to create a URL candidate list - - crawler2 - - - - - fake treeroot - false - SMD_Plugins/Sinequa.Plugin.ListCandidateUrls - - - - - - - - - false - false - false - - - true - - - - - - false - false - false - - - false - - true - false - - - false - false - false - false - true - false - - - - false - false - - false - false - false - - - - - - - - - - - - - - - - false - true - true - false - false - false - - - - false - false - true - false - - _Advanced - true - false - - - - true - - - - - - - false - false - false - false - false - false - false - false - false - false - false - true - true - false - false - false - false - true - false - - false - false - false - - - - - - - - - false - - - - - - false - - - - - - false - - 3 - - enter your url here - - - true - true - true - 100 - 100000 - 100000 - 10 - -1 - -1 - true - false - false - false - false - false - true - true - false - true - true - true - true - false - 1 - 0 ms - true - no - false - - false - false - false - false - false - - - false - true - true - true - false - true - true - false - false - false - false - false - false - false - *.rtf,*.jy,*.xml,*.ico,*.gz,*.act - - - - true - true - - true - false - - - - false - - false - true - false - - true - - - - - - false - false - true - - - - - - - - - - - false - true - - - - - false - - - - - - - - - true - true - - - false - - - - - - - - eu-west-1 - - true - - true - - 80 - true - false - - - - - false - false - - - id - doc.url1 - - - - - diff --git a/docs/documentation/sinequa_api.rst b/docs/documentation/sinequa_api.rst deleted file mode 100644 index 3f1569b2..00000000 --- a/docs/documentation/sinequa_api.rst +++ /dev/null @@ -1,12 +0,0 @@ - .. _sinequa_api: - -Using the Sinequa API -===================== -Overview ---------------------- -The Indexing Helper currently uses the API to start indexing arbitrary collections, and it is capable of executing queries as well. -The api class can be found in config_generation/api.py and by default is linked to the the ren server. - -The Sinequa documentation has several useful links. -`Generating an Access Token `_ - diff --git a/docs/index.rst b/docs/index.rst index 8faba818..0e94e197 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -10,7 +10,6 @@ Welcome to SDE Indexing Helper's documentation! :maxdepth: 2 :caption: Working with Sinequa: - documentation/sinequa_api howto .. toctree:: @@ -24,5 +23,4 @@ Welcome to SDE Indexing Helper's documentation! Quick Links ================== -* :ref:`sinequa_api` * :ref:`indexing_guidelines` diff --git a/requirements/base.txt b/requirements/base.txt index a4ca9cf8..04112c90 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -27,10 +27,8 @@ djangorestframework-datatables==0.7.2 djangorestframework==3.15.2 factory-boy==3.3.0 lxml==4.9.2 -PyGithub==2.2.0 pytest-django==4.8.0 pytest==8.0.0 tenacity==8.2.2 tqdm==4.66.3 unidecode==1.3.8 -xmltodict==0.13.0 diff --git a/requirements/local.txt b/requirements/local.txt index 6db73be1..895ab7dd 100644 --- a/requirements/local.txt +++ b/requirements/local.txt @@ -12,7 +12,6 @@ django-stubs==4.2.7 # https://github.com/typeddjango/django-stubs pytest==8.0.0 # https://github.com/pytest-dev/pytest pytest-sugar==1.0.0 # https://github.com/Frozenball/pytest-sugar types-requests # maybe instead, we should add `mypy --install-types` to the dockerfile? -types-xmltodict pytest-xdist>=3.3.1 pytest-cov>=4.1.0 selenium>=4.15.2 # Selenium (Frontend Testing) diff --git a/scripts/health_checks_on_urls_titles.py b/scripts/health_checks_on_urls_titles.py deleted file mode 100644 index 60387c3c..00000000 --- a/scripts/health_checks_on_urls_titles.py +++ /dev/null @@ -1,58 +0,0 @@ -from sde_collections.models.candidate_url import CandidateURL -from sde_collections.models.collection import Collection -from sde_collections.sinequa_api import Api - - -def _health_check_on_urls_titles(server_name: str): - if server_name == "test": - url_field = "download_url" - status_field = "present_on_test" - title_field = "test_title" - elif server_name == "production": - url_field = "url1" - status_field = "present_on_prod" - title_field = "production_title" - else: - # Handle invalid server name - raise ValueError(f"Invalid server name: {server_name}") - - api = Api(server_name=server_name) - - collection_config_folders = [collection.config_folder for collection in Collection.objects.all()] - - for collection_config_folder in collection_config_folders: - page = 1 - urls_server_info_dict = {} - while True: - response = api.query(page=page, collection_config_folder=collection_config_folder) - if response.get("cursorRowCount", 0) == 0: # Safeguard against missing 'cursorRowCount' - break - for record in response.get("records", []): # Safeguard against missing 'records' - url = record.get(url_field) - title = record.get("title") - if url and title: # Ensure both url and title are present - urls_server_info_dict[url] = {"title": title} - page += 1 - print(f"Finished collecting URLs from {server_name} server for config folder {collection_config_folder}") - - collection_object = Collection.objects.filter(config_folder=collection_config_folder) - candidate_urls_objects = CandidateURL.objects.filter(collection=collection_object[0]) - for candidate_urls_object in candidate_urls_objects: - is_present_on_server = candidate_urls_object.url in urls_server_info_dict.keys() - if getattr(candidate_urls_object, status_field) != is_present_on_server: - setattr(candidate_urls_object, status_field, is_present_on_server) - try: - setattr( - candidate_urls_object, - title_field, - urls_server_info_dict.get(candidate_urls_object.url)["title"], - ) - except TypeError: - setattr(candidate_urls_object, title_field, "Unavailable") - candidate_urls_object.save() - print(f"Finished updating urls within collection config folder {collection_config_folder}") - - -if __name__ == "__main__": - _health_check_on_urls_titles(server_name="test") - _health_check_on_urls_titles(server_name="production") diff --git a/scripts/push_curated_collections_to_github.py b/scripts/push_curated_collections_to_github.py deleted file mode 100644 index f646c4c1..00000000 --- a/scripts/push_curated_collections_to_github.py +++ /dev/null @@ -1,17 +0,0 @@ -from sde_collections.models.collection import Collection -from sde_collections.models.collection_choice_fields import WorkflowStatusChoices -from sde_collections.utils.github_helper import GitHubHandler - - -def push_curated_collections_to_github(): - # Filter collections with a specific workflow status (CURATED) - collections = Collection.objects.filter(workflow_status=WorkflowStatusChoices.CURATED) - - # Initialize the GitHub handler and push collections - github_handler = GitHubHandler(collections) - github_handler.push_to_github() - print("Curated collections with a workflow status of CURATED have been pushed to GitHub.") - - -if __name__ == "__main__": - push_curated_collections_to_github() diff --git a/scripts/quality_and_indexing/find_missing_folders.py b/scripts/quality_and_indexing/find_missing_folders.py deleted file mode 100644 index 8ebd900b..00000000 --- a/scripts/quality_and_indexing/find_missing_folders.py +++ /dev/null @@ -1,60 +0,0 @@ -import os - -from sde_collections.models.collection import Collection -from sde_collections.models.collection_choice_fields import WorkflowStatusChoices -from sde_collections.utils.github_helper import GitHubHandler - - -def get_sources_by_status(statuses): - """Fetch sources by workflow status.""" - return Collection.objects.filter(workflow_status__in=statuses) - - -def get_missing_folders(collections, base_directory, github_handler): - """Find collections missing specific folders in the base directory.""" - missing = [] - for source in collections: - folder_path = os.path.join(base_directory, source.config_folder, "default.xml") - if not github_handler.check_file_exists(folder_path): - missing.append(source) - return missing - - -def get_difference(queryset, *exclude_lists): - """Return queryset minus elements in exclude_lists based on config_folder.""" - exclude_folders = {item.config_folder for sublist in exclude_lists for item in sublist} - return [item for item in queryset if item.config_folder not in exclude_folders] - - -def print_configs(queryset): - """Print the config folder paths of the collections in the queryset.""" - for source in queryset: - print(source.config_folder) - print("---" * 20) - print() - - -# initial sources list -print("sources_to_fix") -print_configs(get_sources_by_status([WorkflowStatusChoices.QUALITY_FIXED])) - -print("sources_to_curated") -print_configs(get_sources_by_status([WorkflowStatusChoices.CURATED])) - -all_relevant_sources = get_sources_by_status([WorkflowStatusChoices.QUALITY_FIXED, WorkflowStatusChoices.CURATED]) - -# broken sources list -github_handler = GitHubHandler() -print("missing_scraper_folders") -missing_scraper_folders = get_missing_folders(all_relevant_sources, "sources/scrapers/", github_handler) -print_configs(missing_scraper_folders) - -print("missing_plugin_folders") -missing_plugin_folders = get_missing_folders(all_relevant_sources, "sources/SDE/", github_handler) -print_configs(missing_plugin_folders) - - -# final sources list -final_sources = get_difference(all_relevant_sources, missing_scraper_folders, missing_plugin_folders) -print("final_sources") -print_configs(final_sources) diff --git a/scripts/update_has_sinequa_config.py b/scripts/update_has_sinequa_config.py deleted file mode 100644 index b40cc93c..00000000 --- a/scripts/update_has_sinequa_config.py +++ /dev/null @@ -1,7 +0,0 @@ -from sde_collections.models.collection import Collection - -with open("no_folders.txt") as no_folders_list: - no_folders = no_folders_list.readlines() - -for no_folder in no_folders: - Collection.objects.filter(name=no_folder.strip()).update(has_sinequa_config=False) diff --git a/sde_collections/admin.py b/sde_collections/admin.py index 56b97792..83ef9c37 100644 --- a/sde_collections/admin.py +++ b/sde_collections/admin.py @@ -16,49 +16,6 @@ from .models.delta_url import CuratedUrl, DeltaUrl, DumpUrl from .models.pattern import DivisionPattern, IncludePattern, TitlePattern from .models.scraper_config import ScrapeDispatch, ScraperConfigOverride -from .tasks import fetch_full_text, import_candidate_urls_from_api - - -def fetch_and_replace_text_for_server(modeladmin, request, queryset, server_name): - for collection in queryset: - fetch_full_text.delay(collection.id, server_name) - modeladmin.message_user(request, f"Started importing URLs from {server_name.upper()} Server") - - -@admin.action(description="Import candidate URLs from LRM Dev Server with Full Text") -def fetch_full_text_lrm_dev_action(modeladmin, request, queryset): - fetch_and_replace_text_for_server(modeladmin, request, queryset, "lrm_dev") - - -@admin.action(description="Import candidate URLs from XLI Server with Full Text") -def fetch_full_text_xli_action(modeladmin, request, queryset): - fetch_and_replace_text_for_server(modeladmin, request, queryset, "xli") - - -@admin.action(description="Generate deployment message") -def generate_deployment_message(modeladmin, request, queryset): - # generate deployment message - response = HttpResponse(content_type="text/txt") - - message_start = """:rocket: Production Deployment Update :rocket: -Hello Team, - -I'm pleased to announce that we have successfully moved several key collections -to our production environment as part of our latest deployment! :tada:\n -Collections Now Live in Prod:\n""" - - message_middle = "\n\n".join( - [f"- {collection.name} | {collection.server_url_prod}" for collection in queryset.all()] - ) - - message_end = """ -If you find something needs changing, please let us know. - -Dev Team""" - - response.content = f"{message_start}\n{message_middle}\n{message_end}" - - return response @admin.action(description="Download candidate URLs as csv") @@ -82,30 +39,6 @@ def download_candidate_urls_as_csv(modeladmin, request, queryset): return response -@admin.action(description="Import metadata from Sinequa configs") -def import_sinequa_metadata(modeladmin, request, queryset): - for collection in queryset.all(): - # eventually this needs to be done in celery - collection.import_metadata_from_sinequa_config() - messages.add_message( - request, - messages.INFO, - f"Imported metadata for collection: {collection.name}", - ) - - -@admin.action(description="Export metadata to Sinequa config") -def export_sinequa_metadata(modeladmin, request, queryset): - for collection in queryset.all(): - # eventually this needs to be done in celery - collection.export_metadata_to_sinequa_config() - messages.add_message( - request, - messages.INFO, - f"Exported sinequa config for collection: {collection.name}", - ) - - @admin.action(description="Generate candidate URLs") def generate_candidate_urls(modeladmin, request, queryset): collection = queryset.first() @@ -117,63 +50,6 @@ def generate_candidate_urls(modeladmin, request, queryset): ) -def import_candidate_urls_from_api_caller(modeladmin, request, queryset, server_name): - id_list = queryset.values_list("id", flat=True) - if len(id_list) > 1: - messages.add_message( - request, - messages.ERROR, - "We can only import one collection at a time using the admin action." - " Consider using the django shell for bulk imports.", - ) - return - import_candidate_urls_from_api.delay( - collection_ids=list(queryset.values_list("id", flat=True)), - server_name=server_name, - ) - collection_names = ", ".join(queryset.values_list("name", flat=True)) - messages.add_message( - request, - messages.INFO, - f"Started importing URLs from the API for: {collection_names} from {server_name.upper()} Server", - ) - - -@admin.action(description="Import candidate URLs from Test") -def import_candidate_urls_test(modeladmin, request, queryset): - import_candidate_urls_from_api_caller(modeladmin, request, queryset, "test") - - -@admin.action(description="Import candidate URLs from Production") -def import_candidate_urls_production(modeladmin, request, queryset): - import_candidate_urls_from_api_caller(modeladmin, request, queryset, "production") - - -@admin.action(description="Import candidate URLs from Secret Test") -def import_candidate_urls_secret_test(modeladmin, request, queryset): - import_candidate_urls_from_api_caller(modeladmin, request, queryset, "secret_test") - - -@admin.action(description="Import candidate URLs from Secret Production") -def import_candidate_urls_secret_production(modeladmin, request, queryset): - import_candidate_urls_from_api_caller(modeladmin, request, queryset, "secret_production") - - -@admin.action(description="Import candidate URLs from XLI Server") -def import_candidate_urls_xli_server(modeladmin, request, queryset): - import_candidate_urls_from_api_caller(modeladmin, request, queryset, "xli") - - -@admin.action(description="Import candidate URLs from LRM Dev Server") -def import_candidate_urls_lrm_dev_server(modeladmin, request, queryset): - import_candidate_urls_from_api_caller(modeladmin, request, queryset, "lrm_dev") - - -@admin.action(description="Import candidate URLs from LRM QA Server") -def import_candidate_urls_lrm_qa_server(modeladmin, request, queryset): - import_candidate_urls_from_api_caller(modeladmin, request, queryset, "lrm_qa") - - class ExportCsvMixin: def export_as_csv(self, request, queryset): meta = self.model._meta @@ -192,16 +68,8 @@ def export_as_csv(self, request, queryset): export_as_csv.short_description = "Export selected as csv" -class UpdateConfigMixin: - def update_config(self, request, queryset): - for collection in queryset: - collection.update_existing_config() - - update_config.short_description = "Update configs of selected" - - @admin.register(Collection) -class CollectionAdmin(admin.ModelAdmin, ExportCsvMixin, UpdateConfigMixin): +class CollectionAdmin(admin.ModelAdmin, ExportCsvMixin): """Admin View for Collection""" fieldsets = ( @@ -288,12 +156,8 @@ def included_curated_urls_count(self, obj) -> int: ) search_fields = ("name", "url", "config_folder") actions = [ - generate_deployment_message, "export_as_csv", - "update_config", download_candidate_urls_as_csv, - fetch_full_text_lrm_dev_action, - fetch_full_text_xli_action, ] ordering = ("cleaning_order",) diff --git a/sde_collections/management/commands/generate_configs.py b/sde_collections/management/commands/generate_configs.py deleted file mode 100644 index e77e4374..00000000 --- a/sde_collections/management/commands/generate_configs.py +++ /dev/null @@ -1,29 +0,0 @@ -from django.core.management.base import BaseCommand - -from sde_collections.models.collection import Collection - - -class Command(BaseCommand): - help = "Export config for collections" - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - - def handle(self, *args, **options) -> None: - collections = [ - "GISS Datasets and Derived Materials", - "GISS Publication List", - "NASA Global Climate Change", - "Goddard Institute for Space Studies", - "Earth Observer Publications", - "Our Changing Planet: The View from Space Images", - "NASA Sea Level Change", - "NASA Carbon Monitoring System", - "Algorithm Theoretical Basis Documents", - ] - - for collection_name in collections: - collection = Collection.objects.get(name=collection_name) - collection.export_config() - message = f"Successfully exported config for {collection.config_folder}" - self.stdout.write(self.style.SUCCESS(message)) diff --git a/sde_collections/management/commands/import_from_sinequa.py b/sde_collections/management/commands/import_from_sinequa.py deleted file mode 100644 index fa42066a..00000000 --- a/sde_collections/management/commands/import_from_sinequa.py +++ /dev/null @@ -1,19 +0,0 @@ -from django.core.management.base import BaseCommand - -from sde_collections.models.collection import Collection - - -class Command(BaseCommand): - help = "Load scraped URLs into the database" - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - - def handle(self, *args, **options) -> None: - for collection in Collection.objects.all(): - if collection.import_metadata_from_sinequa_config(): - message = f"Successfully imported metadata from {collection.config_folder}" - self.stdout.write(self.style.SUCCESS(message)) - else: - message = f"Failed to import metadata from {collection.name}" - self.stdout.write(self.style.ERROR(message)) diff --git a/sde_collections/management/commands/load_urls_from_api.py b/sde_collections/management/commands/load_urls_from_api.py deleted file mode 100644 index fb45b0f7..00000000 --- a/sde_collections/management/commands/load_urls_from_api.py +++ /dev/null @@ -1,12 +0,0 @@ -from django.core.management.base import BaseCommand - -from sde_collections.tasks import import_candidate_urls_from_api - - -class Command(BaseCommand): - help = "Load scraped URLs into the database" - - def handle(self, *args, **options): - import_candidate_urls_from_api() - - self.stdout.write(self.style.SUCCESS("Successfully loaded urls from the test server")) diff --git a/sde_collections/management/commands/push_to_github.py b/sde_collections/management/commands/push_to_github.py deleted file mode 100644 index 2b47df6e..00000000 --- a/sde_collections/management/commands/push_to_github.py +++ /dev/null @@ -1,34 +0,0 @@ -from django.core.management.base import BaseCommand - -from sde_collections.models.collection import Collection -from sde_collections.models.collection_choice_fields import WorkflowStatusChoices -from sde_collections.utils.github_helper import GitHubHandler - - -class Command(BaseCommand): - help = "Push config to github. Takes comma-separated config_folder list as argument." - - def add_arguments(self, parser): - parser.add_argument("config_folders", nargs="*", type=str, default=[]) - - @staticmethod - def _get_names(collections): - return list(collections.values_list("name", flat=True)) - - def handle(self, *args, **options): - selected_collections = Collection.objects.filter(config_folders=options["config_folders"]) - curated_collections = selected_collections.filter(workflow_status=WorkflowStatusChoices.CURATED) - uncurated_collections = selected_collections.exclude(workflow_status=WorkflowStatusChoices.CURATED) - - gh = GitHubHandler(curated_collections) - gh.push_to_github() - - self.stdout.write(self.style.SUCCESS("Successfully pushed: %s" % self._get_names(curated_collections))) - - if uncurated_collections: - self.stdout.write( - self.style.ERROR( - "The following collections could not be pushed because the workflow status was not Curated %s" - % self._get_names(uncurated_collections) - ) - ) diff --git a/sde_collections/management/commands/sync_all_with_github.py b/sde_collections/management/commands/sync_all_with_github.py deleted file mode 100644 index aed91e6d..00000000 --- a/sde_collections/management/commands/sync_all_with_github.py +++ /dev/null @@ -1,41 +0,0 @@ -import json - -from django.core.management.base import BaseCommand - -from sde_collections.models.collection import Collection -from sde_collections.models.collection_choice_fields import Divisions, SourceChoices -from sde_collections.utils.github_helper import GitHubHandler - - -class Command(BaseCommand): - help = ( - "Sync all collections with GitHub. Takes comma-separated config_folder list as argument." - "If no argument is provided, all collections will be synced" - ) - - def add_arguments(self, parser): - parser.add_argument("config_folders", nargs="*", type=str, default=[]) - - # @staticmethod - # def _get_names(collections): - # return list(collections.values_list("name", flat=True)) - - def handle(self, *args, **options): - gh = GitHubHandler(collections=Collection.objects.none()) - collections = gh.get_collections_from_github() - - with open("github_collections.json", "w") as f: - json.dump(collections, f) - - for collection in collections: - Collection.objects.create( - config_folder=collection["config_folder"], - name=collection["name"], - url=collection["url"], - division=Divisions.lookup_by_text(collection["division"]), - document_type=collection["document_type"], - source=SourceChoices.BOTH, - connector=collection["connector"], - ) - - self.stdout.write(self.style.SUCCESS("Successfully synced")) diff --git a/sde_collections/models/collection.py b/sde_collections/models/collection.py index 1acda959..bbf210d2 100644 --- a/sde_collections/models/collection.py +++ b/sde_collections/models/collection.py @@ -1,7 +1,4 @@ # sde_collections/models/collection.py -import json -import urllib.parse - import requests from django.apps import apps from django.conf import settings @@ -13,7 +10,6 @@ from model_utils import FieldTracker from slugify import slugify -from config_generation.db_to_xml import XmlEditor from inference.models.inference_choice_fields import ( ClassificationType, InferenceJobStatus, @@ -25,7 +21,6 @@ migrate_dump_to_delta_and_handle_status_transistions, ) -from ..utils.github_helper import GitHubHandler from ..utils.slack_utils import ( STATUS_CHANGE_NOTIFICATIONS, format_slack_message, @@ -246,78 +241,10 @@ def promote_to_curated(self): # Step 4: Reapply patterns to DeltaUrls self.refresh_url_lists_for_all_patterns() - def add_to_public_query(self): - """Add the collection to the public query.""" - if self.workflow_status not in [ - WorkflowStatusChoices.QUALITY_CHECK_PERFECT, - WorkflowStatusChoices.QUALITY_CHECK_MINOR, - ]: - raise ValueError(f"{self.config_folder} is not ready for public prod, you can't add it to the public query") - - gh = GitHubHandler() - query_path = "webservices/query-smd-primary.xml" - scraper_content = gh._get_file_contents(query_path) - scraper_editor = XmlEditor(scraper_content.decoded_content.decode("utf-8")) - - collections = scraper_editor.get_tag_value("CollectionSelection", strict=True) - collections = collections.split(";") - collections.append(f"/SDE/{self.config_folder}/") - collections = list(set(collections)) - collections.sort() - collections = ";".join(collections) - - scraper_editor.update_or_add_element_value("CollectionSelection", collections) - scraper_content = scraper_editor.update_config_xml() - gh.create_or_update_file(query_path, scraper_content) - - @property - def _scraper_config_path(self) -> str: - return f"sources/scrapers/{self.config_folder}/default.xml" - - @property - def _indexer_config_path(self) -> str: - return f"sources/SDE/{self.config_folder}/default.xml" - - @property - def _indexer_job_path(self) -> str: - return f"jobs/collection.indexer.{self.config_folder}.xml" - - @property - def _scraper_job_path(self) -> str: - return f"jobs/collection.indexer.scrapers.{self.config_folder}.xml" - @property def tree_root(self) -> str: return f"/{self.get_division_display()}/{self.name}/" - @property - def server_url_secret_prod(self) -> str: - base_url = "https://sciencediscoveryengine.nasa.gov" # noqa: E231 - payload = { - "name": "secret-prod", - "scope": "All", - "text": "", - "advanced": { - "collection": f"/SDE/{self.config_folder}/", - }, - } - encoded_payload = urllib.parse.quote(json.dumps(payload)) - return f"{base_url}/app/secret-prod/#/search?query={encoded_payload}" - - @property - def server_url_prod(self) -> str: - base_url = "https://sciencediscoveryengine.nasa.gov" # noqa: E231 - payload = { - "name": "query-smd-primary", - "scope": "All", - "text": "", - "advanced": { - "collection": f"/SDE/{self.config_folder}/", - }, - } - encoded_payload = urllib.parse.quote(json.dumps(payload)) - return f"{base_url}/app/nasa-sba-smd/#/search?query={encoded_payload}" - @property def curation_status_button_color(self) -> str: color_choices = { @@ -377,131 +304,6 @@ def reindexing_status_button_color(self) -> str: } return color_choices[self.reindexing_status] - def _process_exclude_list(self): - """Process the exclude list.""" - return [pattern._process_match_pattern() for pattern in self.excludepattern.all()] - - def _process_include_list(self): - """Process the include list.""" - return [pattern._process_match_pattern() for pattern in self.includepattern.all()] - - def _process_title_list(self): - """Process the title list""" - title_rules = [] - for title_pattern in self.titlepattern.all(): - processed_pattern = { - "title_criteria": title_pattern._process_match_pattern(), - "title_value": title_pattern.title_pattern, - } - title_rules.append(processed_pattern) - return title_rules - - def _process_document_type_list(self): - """Process the document type list""" - document_type_rules = [] - for document_type_pattern in self.documenttypepattern.all(): - processed_pattern = { - "criteria": document_type_pattern._process_match_pattern(), - "document_type": document_type_pattern.get_document_type_display(), - } - document_type_rules.append(processed_pattern) - return document_type_rules - - def _write_to_github(self, path, content, overwrite): - gh = GitHubHandler() - if overwrite: - gh.create_or_update_file(path, content) - else: - gh.create_file(path, content) - - def create_scraper_config(self, overwrite: bool = False): - """ - Reads from the model data and creates the initial scraper config xml file - - if overwrite is True, it will overwrite the existing file - """ - - scraper_template = open("config_generation/xmls/scraper_template.xml").read() - editor = XmlEditor(scraper_template) - scraper_config = editor.convert_template_to_scraper(self) - self._write_to_github(self._scraper_config_path, scraper_config, overwrite) - - def create_indexer_config(self, overwrite: bool = False): - """ - Reads from the model data and creates the plugin config xml file that calls the api - - if overwrite is True, it will overwrite the existing file - """ - - # there needs to be a scraper config file before creating the plugin config - gh = GitHubHandler() - scraper_exists = gh.check_file_exists(self._scraper_config_path) - if not scraper_exists: - raise ValueError(f"Scraper does not exist for the collection {self.config_folder}") - else: - scraper_content = gh._get_file_contents(self._scraper_config_path) - scraper_content = scraper_content.decoded_content.decode("utf-8") - scraper_editor = XmlEditor(scraper_content) - - indexer_template = open("config_generation/xmls/indexer_template.xml").read() - indexer_editor = XmlEditor(indexer_template) - indexer_config = indexer_editor.convert_template_to_indexer(scraper_editor) - self._write_to_github(self._indexer_config_path, indexer_config, overwrite) - - def create_scraper_job(self, overwrite: bool = False): - """ - Reads from the model data and creates the initial scraper job xml file - - if overwrite is True, it will overwrite the existing file - """ - - scraper_job_template = open("config_generation/xmls/job_template.xml").read() - editor = XmlEditor(scraper_job_template) - scraper_job = editor.convert_template_to_job(self, "scrapers") - self._write_to_github(self._scraper_job_path, scraper_job, overwrite) - - def create_indexer_job(self, overwrite: bool = False): - """ - Reads from the model data and creates indexer job that calls the plugin config - - if overwrite is True, it will overwrite the existing file - """ - indexer_template = open("config_generation/xmls/job_template.xml").read() - editor = XmlEditor(indexer_template) - indexer_job = editor.convert_template_to_job(self, "SDE") - self._write_to_github(self._indexer_job_path, indexer_job, overwrite) - - def update_config_xml(self, original_config_string): - """ - reads from the model data and creates a config that mirrors the - - excludes - - title rules - - doc types - - tree root - """ - editor = XmlEditor(original_config_string) - - URL_EXCLUDES = self._process_exclude_list() - URL_INCLUDES = self._process_include_list() - TITLE_RULES = self._process_title_list() - DOCUMENT_TYPE_RULES = self._process_document_type_list() - - # TODO: this was creating duplicates so it was temporarily disabled - # if self.tree_root: - # editor.update_or_add_element_value("TreeRoot", self.tree_root) - - for url in URL_EXCLUDES: - editor.add_url_exclude(url) - for url in URL_INCLUDES: - editor.add_url_include(url) - for title_rule in TITLE_RULES: - editor.add_title_mapping(**title_rule) - for rule in DOCUMENT_TYPE_RULES: - editor.add_document_type_mapping(**rule) - - updated_config_xml_string = editor.update_config_xml() - return updated_config_xml_string - def _compute_config_folder_name(self) -> str: """ Take the human readable `self.name` and create a standardized machine format @@ -510,43 +312,6 @@ def _compute_config_folder_name(self) -> str: return slugify(self.name, separator="_") - def import_metadata_from_sinequa_config(self) -> bool: - """Import metadata from Sinequa.""" - if not self.config_folder: - return False - - gh = GitHubHandler(collections=[self]) - metadata = gh.fetch_metadata() - - try: - metadata[self.config_folder] - except KeyError: - return False - - print(f"Updating metadata for {self.name}") - # tree root - tree_root = metadata[self.config_folder]["tree_root"] - if tree_root != self.tree_root: - print(f"Updating tree root for {self.name} to {tree_root}") - self.tree_root = tree_root - - # document type - document_type = metadata[self.config_folder]["document_type"] - if document_type != self.document_type: - print(f"Updating document type for {self.name} to {document_type}") - self.document_type = document_type - - # connector - # connector = metadata[self.config_folder]["connector"] - # if connector != self.connector: - # print(f"Updating connector for {self.name} to {connector}") - # self.connector = connector - - self.save() - print("\n\n") - - return True - def __str__(self) -> str: """Unicode representation of Collection.""" return self.name @@ -559,11 +324,6 @@ def has_folder(self) -> bool: def candidate_urls_count(self) -> int: return self.candidate_urls.count() - @property - def sinequa_configuration(self) -> str: - URL = f"https://github.com/NASA-IMPACT/sde-backend/blob/production/sources/SDE/{self.config_folder}/default.xml" # noqa: E231, E501 - return URL - @property def github_issue_link(self) -> str: return f"https://github.com/NASA-IMPACT/sde-project/issues/{self.github_issue_number}" # noqa: E231 diff --git a/sde_collections/sinequa_api.py b/sde_collections/sinequa_api.py deleted file mode 100644 index e1782ce8..00000000 --- a/sde_collections/sinequa_api.py +++ /dev/null @@ -1,324 +0,0 @@ -import json -from collections.abc import Iterator -from typing import Any - -import requests -import urllib3 -from django.conf import settings - -urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) - -server_configs = { - "dev": { - "app_name": "nasa-sba-smd", - "query_name": "query-smd-primary", - "base_url": "http://sde-renaissance.nasa-impact.net", - }, - "test": { - "app_name": "nasa-sba-smd", - "query_name": "query-smd-primary", - "base_url": "https://sciencediscoveryengine.test.nasa.gov", - "index": "sde_index", - }, - "production": { - "app_name": "nasa-sba-smd", - "query_name": "query-smd-primary", - "base_url": "https://sciencediscoveryengine.nasa.gov", - "index": "sde_index", - }, - "secret_test": { - "app_name": "nasa-sba-sde", - "query_name": "query-sde-primary", - "base_url": "https://sciencediscoveryengine.test.nasa.gov", - "index": "sde_index", - }, - "secret_production": { - "app_name": "nasa-sba-sde", - "query_name": "query-sde-primary", - "base_url": "https://sciencediscoveryengine.nasa.gov", - "index": "sde_index", - }, - "xli": { - "app_name": "nasa-sba-smd", - "query_name": "query-smd-primary", - "base_url": "http://sde-xli.nasa-impact.net", - "index": "sde_index", - }, - "lrm_dev": { - "app_name": "sde-init-check", - "query_name": "query-init-check", - "base_url": "https://sde-lrm.nasa-impact.net", - "index": "sde_init_check", - }, - "lrm_qa": { - "app_name": "sde-init-check", - "query_name": "query-init-check", - "base_url": "https://sde-qa.nasa-impact.net", - }, -} - - -class Api: - def __init__(self, server_name: str = None, user: str = None, password: str = None, token: str = None) -> None: - self.server_name = server_name - if server_name not in server_configs: - raise ValueError(f"Invalid server configuration: '{server_name}' is not a recognized server name") - - self.config = server_configs[server_name] - self.app_name: str = self.config["app_name"] - self.query_name: str = self.config["query_name"] - self.base_url: str = self.config["base_url"] - self.dev_servers = ["xli", "lrm_dev", "lrm_qa"] - - self._provided_user = user - self._provided_password = password - self._provided_token = token - - def _get_user(self) -> str | None: - """Retrieve the user, using the provided value or defaulting to Django settings.""" - return self._provided_user or getattr(settings, f"{self.server_name}_USER".upper(), None) - - def _get_password(self) -> str | None: - """Retrieve the password, using the provided value or defaulting to Django settings.""" - return self._provided_password or getattr(settings, f"{self.server_name}_PASSWORD".upper(), None) - - def _get_token(self) -> str | None: - """Retrieve the token, using the provided value or defaulting to Django settings.""" - return self._provided_token or getattr(settings, f"{self.server_name}_TOKEN".upper(), None) - - def _get_source_name(self) -> str: - """by default, the source is /SDE/. However for the various dev servers, the source is tends to be /scrapers/""" - return "scrapers" if self.server_name in self.dev_servers else "SDE" - - def process_response( - self, - url: str, - payload: dict[str, Any] | None = None, - headers: dict[str, str] | None = None, - raw_data: str | None = None, - ) -> Any: - """Sends a POST request and processes the response.""" - response = requests.post( - url, headers=headers, json=payload if raw_data is None else None, data=raw_data, verify=False - ) - if response.status_code == requests.codes.ok: - return response.json() - else: - response.raise_for_status() - - def query(self, page: int, collection_config_folder: str | None = None, source: str | None = None) -> Any: - url = f"{self.base_url}/api/v1/search.query" - if self.server_name in self.dev_servers: - user = self._get_user() - password = self._get_password() - if not user or not password: - raise ValueError( - f"Authentication error: Missing credentials for dev server '{self.server_name}'. " - f"Both username and password are required for servers: {', '.join(self.dev_servers)}" - ) - authentication = f"?Password={password}&User={user}" - url = f"{url}{authentication}" - - payload = { - "app": self.app_name, - "query": { - "name": self.query_name, - "text": "", - "page": page, - "pageSize": 1000, - "advanced": {}, - }, - } - - if collection_config_folder: - source = source if source else self._get_source_name() - payload["query"]["advanced"]["collection"] = f"/{source}/{collection_config_folder}/" - - return self.process_response(url, payload) - - def _execute_sql_query(self, sql: str) -> dict: - """ - Executes a SQL query against the Sinequa API. - - Args: - sql (str): The SQL query to execute - - Returns: - dict: The JSON response from the API containing 'Rows' and 'TotalRowCount' - - Raises: - ValueError: If no token is available for authentication - """ - token = self._get_token() - if not token: - raise ValueError("Authentication error: Token is required for SQL endpoint access") - - url = f"{self.base_url}/api/v1/engine.sql" - headers = {"Content-Type": "application/json", "Authorization": f"Bearer {token}"} - raw_payload = json.dumps( - { - "method": "engine.sql", - "sql": sql, - "pretty": True, - } - ) - - return self.process_response(url, headers=headers, raw_data=raw_payload) - - def _process_rows_to_records(self, rows: list) -> list[dict]: - """ - Converts raw SQL row data into structured record dictionaries. - - Args: - rows (list): List of rows, where each row is [url, full_text, title] - - Returns: - list[dict]: List of processed records with url, full_text, and title keys - - Raises: - ValueError: If any row doesn't contain exactly 3 elements - """ - processed_records = [] - for idx, row in enumerate(rows): - if len(row) != 3: - raise ValueError( - f"Invalid row format at index {idx}: Expected exactly three elements (url, full_text, title). " - f"Received {len(row)} elements." - ) - processed_records.append({"url": row[0], "full_text": row[1], "title": row[2]}) - return processed_records - - def get_full_texts( - self, - collection_config_folder: str, - source: str = None, - start_at: int = 0, - batch_size: int = 500, - min_batch_size: int = 1, - ) -> Iterator[dict]: - """ - Retrieves and yields batches of text records from the SQL database for a given collection. - Uses pagination to handle large datasets efficiently. If a query fails, it automatically - reduces the batch size and retries, with the ability to recover batch size after successful queries. - - Args: - collection_config_folder (str): The collection folder to query (e.g., "EARTHDATA", "CASEI") - source (str, optional): The source to query. If None, defaults to "scrapers" for dev servers - or "SDE" for other servers. - start_at (int, optional): Starting offset for records. Defaults to 0. - page_size (int, optional): Initial number of records per batch. Defaults to 500. - min_batch_size (int, optional): Minimum batch size before giving up. Defaults to 1. - - Yields: - list[dict]: Batches of records, where each record is a dictionary containing: - { - "url": str, # The URL of the document - "full_text": str, # The full text content of the document - "title": str # The title of the document - } - - Raises: - ValueError: If the server's index is not defined in its configuration - ValueError: If batch size reaches minimum without success - - Note: - - Results are paginated with adaptive batch sizing - - Each batch is processed into clean dictionaries before being yielded - - The iterator will stop when either: - 1. No more rows are returned from the query - 2. The total count of records has been reached - - Batch size will decrease on failure and can recover after successful queries - """ - if not source: - source = self._get_source_name() - - if (index := self.config.get("index")) is None: - raise ValueError( - f"Configuration error: Index not defined for server '{self.server_name}'. " - "Please update server configuration with the required index." - ) - - base_sql = f"SELECT url1, text, title FROM {index} WHERE collection = '/{source}/{collection_config_folder}/'" - - current_offset = start_at - current_batch_size = batch_size - total_count = None - - while True: - sql = f"{base_sql} SKIP {current_offset} COUNT {current_batch_size}" - - try: - response = self._execute_sql_query(sql) - rows = response.get("Rows", []) - - if not rows: # Stop if we get an empty batch - break - - if total_count is None: - total_count = response.get("TotalRowCount", 0) - - yield (self._process_rows_to_records(rows)) - - current_offset += len(rows) - - if total_count and current_offset >= total_count: # Stop if we've processed all records - break - - except (requests.RequestException, ValueError) as e: - if current_batch_size <= min_batch_size: - raise ValueError( - f"Failed to process batch even at minimum size {min_batch_size}. " f"Last error: {str(e)}" - ) - - # Halve the batch size and retry - current_batch_size = max(current_batch_size // 2, min_batch_size) - print(f"Reducing batch size to {current_batch_size} and retrying...") - continue - - def get_total_count(self, collection_config_folder: str, source: str = None) -> int: - """ - Retrieves the total count of records for a given collection using Sinequa's TotalRowCount metadata. - - Args: - collection_config_folder (str): The collection folder to query (e.g., "EARTHDATA", "CASEI"). - source (str, optional): The source to query. If None, defaults to "scrapers" for dev servers - or "SDE" for other servers. - - Returns: - int: The total number of records in the collection. - """ - if not source: - source = self._get_source_name() - - if (index := self.config.get("index")) is None: - raise ValueError( - f"Configuration error: Index not defined for server '{self.server_name}'. " - "Please update server configuration with the required index." - ) - - # Minimal query to get only metadata, no data retrieval - sql = f"SELECT * FROM {index} WHERE collection = '/{source}/{collection_config_folder}/' SKIP 0 COUNT 0" - - response = self._execute_sql_query(sql) - - # Extract TotalRowCount from metadata - return response.get("TotalRowCount", 0) - - @staticmethod - def _process_full_text_response(batch_data: dict): - if "Rows" not in batch_data or not isinstance(batch_data["Rows"], list): - raise ValueError( - "Invalid response format: Expected 'Rows' key with list data in Sinequa server response. " - f"Received: {type(batch_data.get('Rows', None))}" - ) - - processed_data = [] - for idx, row in enumerate(batch_data["Rows"]): - if len(row) != 3: - raise ValueError( - f"Invalid row format at index {idx}: Expected exactly three elements (url, full_text, title). " - f"Received {len(row)} elements." - ) - url, full_text, title = row - processed_data.append({"url": url, "full_text": full_text, "title": title}) - return processed_data diff --git a/sde_collections/tasks.py b/sde_collections/tasks.py index cf5556c3..a4942ddb 100644 --- a/sde_collections/tasks.py +++ b/sde_collections/tasks.py @@ -1,13 +1,7 @@ # /sde_collections/tasks.py -import json -import os -import shutil -import boto3 from django.apps import apps from django.conf import settings -from django.core import management -from django.core.management.commands import loaddata from django.db import transaction from config import celery_app @@ -19,108 +13,9 @@ from .models.delta_url import DumpUrl from .scraping.s3_results import fetch_documents, fetch_summary, results_ready from .scraping.ssm_dispatch import send_job_to_crawler -from .sinequa_api import Api -from .utils.github_helper import GitHubHandler from .utils.slack_utils import send_detailed_import_notification -def _get_data_to_import(collection, server_name): - # ignore these because they are API collections and don't have URLs - ignore_collections = [ - "/SMD/ASTRO_NAVO_HEASARC/", - "/SMD/CASEI_Campaign/", - "/SMD/CASEI_Deployment/", - "/SMD/CASEI_Instrument/", - "/SMD/CASEI_Platform/", - "/SMD/CMR_API/", - "/SMD/PDS_API_Legacy_All/", - ] - - data_to_import = [] - api = Api(server_name=server_name) - page = 1 - while True: - print(f"Getting page: {page}") - response = api.query(page=page, collection_config_folder=collection.config_folder) - if response["cursorRowCount"] == 0: - break - - for record in response.get("records", []): - full_collection_name = record.get("collection")[0] - if full_collection_name in ignore_collections: - continue - - url = record.get("download_url") - title = record.get("title", "") - collection_pk = collection.pk - - if not url: - continue - - augmented_data = { - "model": "sde_collections.url", - "fields": { - "collection": collection_pk, - "url": url, - "scraped_title": title, - }, - } - - data_to_import.append(augmented_data) - page += 1 - return data_to_import - - -@celery_app.task(soft_time_limit=10000) -def import_candidate_urls_from_api(server_name="test", collection_ids=[]): - TEMP_FOLDER_NAME = "temp" - os.makedirs(TEMP_FOLDER_NAME, exist_ok=True) - Collection = apps.get_model("sde_collections", "Collection") - - collections = Collection.objects.filter(id__in=collection_ids) - - for collection in collections: - urls_file = f"{TEMP_FOLDER_NAME}/{collection.config_folder}.json" - - print("Getting responses from API") - data_to_import = _get_data_to_import(server_name=server_name, collection=collection) - print(f"Got {len(data_to_import)} records for {collection.config_folder}") - - print("Dumping django fixture to file") - json.dump(data_to_import, open(urls_file, "w")) - - print("Deleting existing candidate URLs") - # this sometimes takes a while - collection.candidate_urls.all().delete() - - print("Loading fixture; this may take a while") - # subprocess.call(f'python manage.py loaddata "{urls_file}"', shell=True) - management.call_command(loaddata.Command(), urls_file) - - print("Applying existing patterns; this may take a while") - collection.apply_all_patterns() - - if collection.workflow_status == WorkflowStatusChoices.READY_FOR_ENGINEERING: - collection.workflow_status = WorkflowStatusChoices.ENGINEERING_IN_PROGRESS - collection.save() - - # Finally set the status to READY_FOR_CURATION - collection.workflow_status = WorkflowStatusChoices.READY_FOR_CURATION - collection.save() - - print("Deleting temp files") - shutil.rmtree(TEMP_FOLDER_NAME) - - -@celery_app.task() -def push_to_github_task(collection_ids): - Collection = apps.get_model("sde_collections", "Collection") - - collections = Collection.objects.filter(id__in=collection_ids) - github_handler = GitHubHandler(collections) - github_handler.push_to_github() - - @celery_app.task() def sync_with_production_webapp(): Collection = apps.get_model("sde_collections", "Collection") @@ -129,29 +24,6 @@ def sync_with_production_webapp(): collection.sync_with_production_webapp() -@celery_app.task() -def pull_latest_collection_metadata_from_github(): - Collection = apps.get_model("sde_collections", "Collection") - - FILENAME = "github_collections.json" - - gh = GitHubHandler(collections=Collection.objects.none()) - collections = gh.get_collections_from_github() - - json.dump(collections, open(FILENAME, "w"), indent=4) - - # Upload the file to S3 - s3_bucket_name = settings.AWS_STORAGE_BUCKET_NAME - s3_key = FILENAME - s3_client = boto3.client( - "s3", - region_name="us-east-1", - aws_access_key_id=settings.AWS_ACCESS_KEY_ID, - aws_secret_access_key=settings.AWS_SECRET_ACCESS_KEY, - ) - s3_client.upload_file(FILENAME, s3_bucket_name, s3_key) - - @celery_app.task() def resolve_title_pattern(title_pattern_id): TitlePattern = apps.get_model("sde_collections", "TitlePattern") @@ -159,47 +31,6 @@ def resolve_title_pattern(title_pattern_id): title_pattern.apply() -@celery_app.task(soft_time_limit=600) -def fetch_full_text(collection_id, server_name): - """Task to fetch full text and create DumpUrls only (no migration)""" - Collection = apps.get_model("sde_collections", "Collection") - collection = Collection.objects.get(id=collection_id) - api = Api(server_name) - - # Step 1: Delete existing DumpUrl entries - deleted_count, _ = DumpUrl.objects.filter(collection=collection).delete() - print(f"Deleted {deleted_count} old records.") - try: - total_server_count = api.get_total_count(collection.config_folder) - print(f"Total records on the server: {total_server_count}") - - # Step 2: Process data in batches - total_processed = 0 - for batch in api.get_full_texts(collection.config_folder): - with transaction.atomic(): - DumpUrl.objects.bulk_create( - [ - DumpUrl( - url=record["url"], - collection=collection, - scraped_text=record["full_text"], - scraped_title=record["title"], - ) - for record in batch - ] - ) - total_processed += len(batch) - print(f"Processed batch of {len(batch)} records. Total: {total_processed}") - - # Step 3: Check if classification is needed and queue if necessary - collection.queue_necessary_classifications() - - return f"Successfully processed {total_processed} records." - except Exception as e: - print(f"Error processing records: {str(e)}") - raise - - @celery_app.task() def migrate_dump_to_delta_and_handle_status_transistions(collection_id): """Task to migrate DumpUrls to DeltaUrls after classification is complete""" diff --git a/sde_collections/tests.py b/sde_collections/tests.py deleted file mode 100644 index daa70714..00000000 --- a/sde_collections/tests.py +++ /dev/null @@ -1,36 +0,0 @@ -from django.test import TestCase -from rest_framework.test import APIRequestFactory - -from .models.collection import Collection -from .tasks import import_candidate_urls_from_api, push_to_github_task - - -class CreateExcludePatternTestCase(TestCase): - def test_create_exclude_pattern(self): - factory = APIRequestFactory() - response = factory.post("/api/create-exclude-pattern", {"title": "new idea"}, format="json") - self.assertCountEqual(response, "hey") - - -class CreateIncludePatternTestCase(TestCase): - def test_create_include_pattern(self): - factory = APIRequestFactory() - response = factory.post("/api/create-include-pattern", {"title": "new idea"}, format="json") - self.assertCountEqual(response, "hey") - - -class ImportCandidateURLsTestCase(TestCase): - def test_import_all_candidate_urls_from_api(self): - import_candidate_urls_from_api() - self.assertEqual(1, 1) - - -class GitHubTestCase(TestCase): - fixtures = [ - "sde_collections/fixtures/collections.json", - ] - - def test_push_config_to_github(self): - collection = Collection.objects.first() - push_to_github_task([collection.id]) - self.assertEqual(collection.name, "NASA POWER") diff --git a/sde_collections/tests/test_import_fulltexts.py b/sde_collections/tests/test_import_fulltexts.py deleted file mode 100644 index 16c0a27d..00000000 --- a/sde_collections/tests/test_import_fulltexts.py +++ /dev/null @@ -1,114 +0,0 @@ -# docker-compose -f local.yml run --rm django pytest sde_collections/tests/test_import_fulltexts.py - -from unittest.mock import patch - -import pytest -from django.db.models.signals import post_save - -from inference.models.inference import ModelVersion -from inference.models.inference_choice_fields import ClassificationType -from sde_collections.models.collection import handle_workflow_status_change -from sde_collections.models.delta_url import DeltaUrl, DumpUrl -from sde_collections.tasks import ( - fetch_full_text, - migrate_dump_to_delta_and_handle_status_transistions, -) -from sde_collections.tests.factories import CollectionFactory - - -@pytest.fixture -def disconnect_signals(): - # Disconnect the signal before each test - post_save.disconnect(handle_workflow_status_change, sender="sde_collections.Collection") - yield - # Reconnect the signal after each test - post_save.connect(handle_workflow_status_change, sender="sde_collections.Collection") - - -@pytest.fixture -def model_version(): - """Create a model version for testing""" - return ModelVersion.objects.create( - api_identifier="test_model", - description="Test model version", - classification_type=ClassificationType.TDAMM, - is_active=True, - ) - - -@pytest.mark.django_db -def test_fetch_and_replace_full_text(disconnect_signals, model_version): - collection = CollectionFactory(config_folder="test_folder") - - mock_batch = [ - {"url": "http://example.com/1", "full_text": "Test Text 1", "title": "Test Title 1"}, - {"url": "http://example.com/2", "full_text": "Test Text 2", "title": "Test Title 2"}, - ] - - def mock_generator(): - yield (mock_batch) - - with patch("sde_collections.sinequa_api.Api.get_full_texts") as mock_get_full_texts, patch( - "sde_collections.sinequa_api.Api.get_total_count", return_value=2 - ), patch("sde_collections.utils.slack_utils.send_detailed_import_notification"): - mock_get_full_texts.return_value = mock_generator() - - # First fetch the full text - fetch_full_text(collection.id, "lrm_dev") - - # Verify DumpUrls were created - assert DumpUrl.objects.filter(collection=collection).count() == 2 - - # Then migrate the data - migrate_dump_to_delta_and_handle_status_transistions(collection.id) - - # Verify DeltaUrls were created - assert DeltaUrl.objects.filter(collection=collection).count() == 2 - - -@pytest.mark.django_db -def test_fetch_and_replace_full_text_large_dataset(disconnect_signals, model_version): - """Test processing a large number of records with proper pagination and batching.""" - collection = CollectionFactory(config_folder="test_folder") - - # Create sample data - 20,000 records in total - def create_batch(start_idx, size): - return [ - {"url": f"http://example.com/{i}", "full_text": f"Test Text {i}", "title": f"Test Title {i}"} - for i in range(start_idx, start_idx + size) - ] - - # Mock the API to return data in batches of 5000 (matching actual API pagination) - def mock_batch_generator(): - batch_size = 5000 - total_records = 20000 - - for start in range(0, total_records, batch_size): - yield (create_batch(start, min(batch_size, total_records - start))) - - with patch("sde_collections.sinequa_api.Api.get_full_texts") as mock_get_full_texts, patch( - "sde_collections.sinequa_api.Api.get_total_count", return_value=20000 - ), patch("sde_collections.utils.slack_utils.send_detailed_import_notification"): - mock_get_full_texts.return_value = mock_batch_generator() - - # Execute the fetch task - result = fetch_full_text(collection.id, "lrm_dev") - - # Verify DumpUrls were created - assert DumpUrl.objects.filter(collection=collection).count() == 20000 - - # Execute the migration task - migrate_result = migrate_dump_to_delta_and_handle_status_transistions(collection.id) - - # Verify total number of records - assert DeltaUrl.objects.filter(collection=collection).count() == 20000 - - # Verify some random records exist and have correct data - for i in [0, 4999, 5000, 19999]: # Check boundaries and middle - url = DeltaUrl.objects.get(url=f"http://example.com/{i}") - assert url.scraped_text == f"Test Text {i}" - assert url.scraped_title == f"Test Title {i}" - - # Verify batch processing worked by checking the success message - assert "Successfully processed 20000 records" in result - assert "Successfully migrated DumpUrls to DeltaUrls" in migrate_result diff --git a/sde_collections/tests/test_scrape_dispatch.py b/sde_collections/tests/test_scrape_dispatch.py index 603849a7..47f5590d 100644 --- a/sde_collections/tests/test_scrape_dispatch.py +++ b/sde_collections/tests/test_scrape_dispatch.py @@ -70,14 +70,18 @@ def test_reindexing_needed_dispatches_scrape_job(self, mock_delay): mock_delay.assert_called_once_with(collection.id) - @patch("sde_collections.models.collection.Collection.create_scraper_config") @patch("sde_collections.tasks.dispatch_scrape_job.delay") - def test_ready_for_engineering_no_longer_touches_sinequa_configs(self, mock_delay, mock_scraper_config): + def test_ready_for_engineering_no_longer_touches_sinequa_configs(self, mock_delay): + """P6 deleted the Sinequa config methods outright — the trigger can only dispatch.""" + from sde_collections.models.collection import Collection + collection = CollectionFactory() collection.workflow_status = WorkflowStatusChoices.READY_FOR_ENGINEERING collection.save() - mock_scraper_config.assert_not_called() + mock_delay.assert_called_once_with(collection.id) + assert not hasattr(Collection, "create_scraper_config") + assert not hasattr(Collection, "create_scraper_job") @pytest.mark.django_db diff --git a/sde_collections/tests/test_sinequa_api.py b/sde_collections/tests/test_sinequa_api.py deleted file mode 100644 index 51c75f36..00000000 --- a/sde_collections/tests/test_sinequa_api.py +++ /dev/null @@ -1,364 +0,0 @@ -# docker-compose -f local.yml run --rm django pytest sde_collections/tests/test_sinequa_api.py -import json -from unittest.mock import MagicMock, patch - -import pytest -import requests -from django.utils import timezone - -from sde_collections.models.collection import WorkflowStatusChoices -from sde_collections.sinequa_api import Api -from sde_collections.tests.factories import CollectionFactory, UserFactory - - -@pytest.mark.django_db -class TestApiClass: - """ - Test suite for the Sinequa API integration. - Tests cover authentication, query construction, response processing, - and error handling across different server configurations. - """ - - @pytest.fixture - def collection(self): - """Fixture to create a collection object for testing.""" - user = UserFactory() - return CollectionFactory( - curated_by=user, - curation_started=timezone.now(), - config_folder="example_config", - workflow_status=WorkflowStatusChoices.RESEARCH_IN_PROGRESS, - ) - - @pytest.fixture - def api_instance(self): - """ - Fixture to create an Api instance with mocked server configs. - Provides a consistent test environment with predefined credentials. - """ - with patch( - "sde_collections.sinequa_api.server_configs", - { - "test_server": { - "app_name": "test_app", - "query_name": "test_query", - "base_url": "http://testserver.com/api", - "index": "test_index", - } - }, - ): - return Api(server_name="test_server", user="test_user", password="test_pass", token="test_token") - - @patch("requests.post") - def test_process_response_success(self, mock_post, api_instance): - """ - Test that process_response successfully handles and parses API responses. - Verifies: - 1. Correct HTTP request processing - 2. JSON response parsing - 3. Return value structure - """ - mock_response = MagicMock() - mock_response.status_code = 200 - mock_response.json.return_value = {"key": "value"} - mock_post.return_value = mock_response - - response = api_instance.process_response("http://example.com", payload={"test": "data"}) - assert response == {"key": "value"} - mock_post.assert_called_once() - - @patch("requests.post") - def test_process_response_failure(self, mock_post, api_instance): - """ - Test that process_response properly handles failed API requests. - Verifies appropriate exception raising and error messaging. - """ - mock_response = MagicMock() - mock_response.status_code = 500 - mock_post.return_value = mock_response - mock_response.raise_for_status.side_effect = requests.RequestException("Internal Server Error") - - with pytest.raises(requests.RequestException, match="Internal Server Error"): - api_instance.process_response("http://example.com", payload={"test": "data"}) - - def test_missing_token_for_sql_query(self, api_instance): - """ - Test that attempting SQL queries without a token raises an appropriate error. - Verifies token validation before query execution. - """ - api_instance._provided_token = None - with pytest.raises(ValueError, match="Token is required"): - api_instance._execute_sql_query("SELECT * FROM test") - - @patch("sde_collections.sinequa_api.Api.process_response") - def test_query(self, mock_process_response, api_instance): - """ - Test that query method: - 1. Constructs the correct URL and payload based on input parameters - 2. Processes API response correctly - 3. Returns expected data structure - """ - mock_process_response.return_value = {"result": "success"} - response = api_instance.query(page=1, collection_config_folder="folder") - assert response == {"result": "success"} - - # Verify payload construction - mock_process_response.assert_called_once() - call_args = mock_process_response.call_args - assert "folder" in str(call_args) # Verify collection folder is included - assert "page" in str(call_args) # Verify pagination parameters - - def test_process_rows_to_records(self, api_instance): - """ - Test processing of raw SQL row data into structured record dictionaries. - Verifies: - 1. Correct parsing of valid input data - 2. Error handling for malformed rows - 3. Output format consistency - """ - # Test valid input - valid_rows = [["http://example.com/1", "Text 1", "Title 1"], ["http://example.com/2", "Text 2", "Title 2"]] - expected_output = [ - {"url": "http://example.com/1", "full_text": "Text 1", "title": "Title 1"}, - {"url": "http://example.com/2", "full_text": "Text 2", "title": "Title 2"}, - ] - assert api_instance._process_rows_to_records(valid_rows) == expected_output - - # Test invalid row length - invalid_rows = [["http://example.com", "Text"]] # Missing title - with pytest.raises(ValueError, match="Invalid row format at index 0"): - api_instance._process_rows_to_records(invalid_rows) - - @patch("sde_collections.sinequa_api.Api.process_response") - def test_execute_sql_query(self, mock_process_response, api_instance): - """ - Test SQL query execution with token-based authentication. - Verifies: - 1. Query construction - 2. Token validation - 3. Response processing - """ - mock_process_response.return_value = {"Rows": [], "TotalRowCount": 0} - - # Test successful query - result = api_instance._execute_sql_query("SELECT * FROM test") - assert result == {"Rows": [], "TotalRowCount": 0} - - # Test query with missing token - api_instance._provided_token = None - with pytest.raises(ValueError, match="Token is required"): - api_instance._execute_sql_query("SELECT * FROM test") - - @patch("sde_collections.sinequa_api.Api._execute_sql_query") - def test_get_full_texts_pagination(self, mock_execute_sql, api_instance): - """ - Test pagination handling in get_full_texts method. - Verifies: - 1. Correct batch processing - 2. Accurate record counting - 3. Proper iteration termination - """ - # Mock responses for two pages of results - mock_execute_sql.side_effect = [ - { - "Rows": [["http://example.com/1", "Text 1", "Title 1"], ["http://example.com/2", "Text 2", "Title 2"]], - "TotalRowCount": 3, - }, - {"Rows": [["http://example.com/3", "Text 3", "Title 3"]], "TotalRowCount": 3}, - {"Rows": [], "TotalRowCount": 3}, - ] - - # Collect all batches from the iterator - batches = list(api_instance.get_full_texts("test_folder")) - assert len(batches) == 2 # Should have two batches - assert len(batches[0]) == 2 # First batch has 2 records - assert len(batches[1]) == 1 # Second batch has 1 record - - # Verify content of batches - assert batches[0] == [ - {"url": "http://example.com/1", "full_text": "Text 1", "title": "Title 1"}, - {"url": "http://example.com/2", "full_text": "Text 2", "title": "Title 2"}, - ] - assert batches[1] == [{"url": "http://example.com/3", "full_text": "Text 3", "title": "Title 3"}] - - def test_get_full_texts_missing_index(self, api_instance): - """ - Test error handling when index configuration is missing. - Verifies appropriate error message and exception type. - """ - api_instance.config.pop("index", None) - with pytest.raises(ValueError, match="Index not defined for server"): - next(api_instance.get_full_texts("test_folder")) - - @pytest.mark.parametrize( - "server_name,expect_auth", - [ - ("xli", True), # dev server should have auth - ("production", False), # prod server should not have auth - ], - ) - @patch("requests.post") - def test_query_authentication(self, mock_post, server_name, expect_auth, api_instance): - """ - Test authentication handling for different server types. - Verifies: - 1. Dev servers require authentication - 2. Production servers skip authentication - 3. Correct credential handling - """ - api_instance.server_name = server_name - mock_post.return_value = MagicMock(status_code=200, json=lambda: {"result": "success"}) - - response = api_instance.query(page=1, collection_config_folder="folder") - assert response == {"result": "success"} - - called_url = mock_post.call_args[0][0] - auth_present = "?Password=test_pass&User=test_user" in called_url - assert auth_present == expect_auth - - @patch("requests.post") - def test_query_dev_server_missing_credentials(self, mock_post, api_instance): - """ - Test error handling for dev servers with missing credentials. - Verifies appropriate error messages and authentication requirements. - """ - api_instance.server_name = "xli" - api_instance._provided_user = None - api_instance._provided_password = None - - with pytest.raises(ValueError, match="Authentication error: Missing credentials for dev server"): - api_instance.query(page=1) - - @patch("sde_collections.sinequa_api.Api._execute_sql_query") - def test_get_full_texts_batch_size_reduction(self, mock_execute_sql, api_instance): - """ - Test batch size reduction logic when queries fail. - Verifies: - 1. Progressive batch size reduction - 2. Retry mechanism - 3. Successful recovery - """ - # Mock first query to fail, then succeed with smaller batch - mock_execute_sql.side_effect = [ - requests.RequestException("Query too large"), # First attempt fails - { - "Rows": [["http://example.com/1", "Text 1", "Title 1"]], - "TotalRowCount": 1, - }, # Succeeds with smaller batch - ] - - batches = list(api_instance.get_full_texts("test_folder", batch_size=100, min_batch_size=1)) - - # Verify the batches were processed correctly after size reduction - assert len(batches) == 1 - assert len(batches[0]) == 1 - assert batches[0][0]["url"] == "http://example.com/1" - - # Verify batch size reduction logic - assert mock_execute_sql.call_count == 2 - first_call = mock_execute_sql.call_args_list[0][0][0] - second_call = mock_execute_sql.call_args_list[1][0][0] - assert "COUNT 100" in first_call - assert "COUNT 50" in second_call # Should be halved from 100 - - @patch("sde_collections.sinequa_api.Api._execute_sql_query") - def test_get_full_texts_minimum_batch_size(self, mock_execute_sql, api_instance): - """ - Test behavior when reaching minimum batch size. - Verifies error handling at minimum batch size threshold. - """ - mock_execute_sql.side_effect = requests.RequestException("Query failed") - - # Start with batch_size=4, min_batch_size=1 - with pytest.raises(ValueError, match="Failed to process batch even at minimum size 1"): - list(api_instance.get_full_texts("test_folder", batch_size=4, min_batch_size=1)) - - # Verify retry attempts - assert mock_execute_sql.call_count == 3 - calls = mock_execute_sql.call_args_list - assert "COUNT 4" in calls[0][0][0] # First try with 4 - assert "COUNT 2" in calls[1][0][0] # Second try with 2 - assert "COUNT 1" in calls[2][0][0] # Final try with 1 - - @patch("requests.post") - def test_sql_query_construction(self, mock_post, api_instance): - """ - Test direct SQL query execution with specific URL and payload validation. - Verifies: - 1. Correct URL construction - 2. Proper payload formatting - 3. Token-based authentication - """ - mock_response = MagicMock() - mock_response.status_code = 200 - mock_response.json.return_value = {"Rows": [["http://example.com", "sample text", "sample title"]]} - mock_post.return_value = mock_response - - sql = "SELECT url1, text, title FROM test_index WHERE collection = '/SDE/sample_folder/'" - api_instance._execute_sql_query(sql) - - # Verify URL and payload construction - mock_post.assert_called_once() - call_args = mock_post.call_args - - # Get the actual payload from the call arguments - _, kwargs = call_args - payload = json.loads(kwargs.get("data", "{}")) - - # Verify each component separately - assert "engine.sql" in call_args[0][0] # Verify endpoint - assert kwargs["headers"]["Authorization"] == "Bearer test_token" # Verify token usage - assert payload["sql"] == sql # Verify SQL query inclusion - - def test_process_full_text_response(self, api_instance): - """ - Test static method for processing full text response data. - Verifies: - 1. Correct parsing of raw response data - 2. Proper dictionary structure creation - 3. Error handling for invalid response format - """ - # Test valid response processing - raw_response = { - "Rows": [ - ["http://example.com/article1", "Full text 1", "Title 1"], - ["http://example.com/article2", "Full text 2", "Title 2"], - ] - } - expected = [ - {"url": "http://example.com/article1", "full_text": "Full text 1", "title": "Title 1"}, - {"url": "http://example.com/article2", "full_text": "Full text 2", "title": "Title 2"}, - ] - processed = Api._process_full_text_response(raw_response) - assert processed == expected - - # Test invalid response format - with pytest.raises(ValueError, match="Invalid response format"): - Api._process_full_text_response({"wrong_key": []}) - - @patch("sde_collections.sinequa_api.Api._execute_sql_query") - def test_get_full_texts_batch_size_progression(self, mock_execute_sql, api_instance): - """ - Test multiple batch size reductions followed by successful query. - Verifies: - 1. Progressive batch size reduction steps - 2. Recovery after multiple failures - 3. Final successful query execution - """ - mock_execute_sql.side_effect = [ - requests.RequestException("First failure"), - requests.RequestException("Second failure"), - {"Rows": [["http://example.com/1", "Text 1", "Title 1"]], "TotalRowCount": 1}, - ] - - # Start with batch_size=100, should reduce to 25 before succeeding - batches = list(api_instance.get_full_texts("test_folder", batch_size=100, min_batch_size=1)) - - assert len(batches) == 1 # Should get one successful batch - assert mock_execute_sql.call_count == 3 - - calls = mock_execute_sql.call_args_list - # Verify the progression of batch sizes - assert "COUNT 100" in calls[0][0][0] # First attempt - assert "COUNT 50" in calls[1][0][0] # After first failure - assert "COUNT 25" in calls[2][0][0] # After second failure diff --git a/sde_collections/tests/test_workflow_status_triggers.py b/sde_collections/tests/test_workflow_status_triggers.py index 1ee83ebb..217e074d 100644 --- a/sde_collections/tests/test_workflow_status_triggers.py +++ b/sde_collections/tests/test_workflow_status_triggers.py @@ -1,22 +1,16 @@ # docker-compose -f local.yml run --rm django pytest sde_collections/tests/test_workflow_status_triggers.py -from unittest.mock import Mock, patch +from unittest.mock import patch import pytest -from django.db import transaction -from django.test import TestCase, TransactionTestCase +from django.test import TestCase from sde_collections.models.collection import Collection, WorkflowHistory from sde_collections.models.collection_choice_fields import ( ReindexingStatusChoices, WorkflowStatusChoices, ) -from sde_collections.models.delta_url import DumpUrl -from sde_collections.tasks import ( - fetch_full_text, - migrate_dump_to_delta_and_handle_status_transistions, -) -from sde_collections.tests.factories import CollectionFactory, DumpUrlFactory +from sde_collections.tests.factories import CollectionFactory class TestWorkflowStatusTransitions(TestCase): @@ -35,24 +29,54 @@ def test_ready_for_engineering_triggers_scrape_dispatch(self, mock_dispatch): mock_dispatch.assert_called_once_with(self.collection.id) - @patch("sde_collections.tasks.fetch_full_text.delay") - def test_indexing_finished_triggers_nothing(self, mock_fetch): + def _save_and_assert_no_triggers(self, **status_updates): + """Set the given status field(s), save, and assert none of the surviving + pipeline triggers fire. (The Sinequa methods can't be patched — they no + longer exist; test_no_sinequa_methods_remain proves that directly.)""" + with ( + patch("sde_collections.tasks.dispatch_scrape_job.delay") as mock_dispatch, + patch("sde_collections.tasks.index_collection_to_test.delay") as mock_test, + patch("sde_collections.tasks.index_collection_to_prod.delay") as mock_prod, + patch("sde_collections.models.collection.Collection.promote_to_curated") as mock_promote, + ): + for field, value in status_updates.items(): + setattr(self.collection, field, value) + self.collection.save() + + mock_dispatch.assert_not_called() + mock_test.assert_not_called() + mock_prod.assert_not_called() + mock_promote.assert_not_called() + + def test_indexing_finished_triggers_nothing(self): """INDEXING_FINISHED_ON_DEV is a Sinequa-era status: its full-text-fetch trigger is gone (the P4 ingest replaces the fetch entirely).""" - self.collection.workflow_status = WorkflowStatusChoices.INDEXING_FINISHED_ON_DEV - self.collection.save() - - mock_fetch.assert_not_called() + self._save_and_assert_no_triggers(workflow_status=WorkflowStatusChoices.INDEXING_FINISHED_ON_DEV) - @patch("sde_collections.models.collection.Collection.create_indexer_config") - @patch("sde_collections.models.collection.Collection.create_indexer_job") - def test_ready_for_curation_triggers_nothing(self, mock_indexer_job, mock_indexer_config): + def test_ready_for_curation_triggers_nothing(self): """The Sinequa indexer-config branch on READY_FOR_CURATION is gone.""" - self.collection.workflow_status = WorkflowStatusChoices.READY_FOR_CURATION - self.collection.save() - - mock_indexer_config.assert_not_called() - mock_indexer_job.assert_not_called() + self._save_and_assert_no_triggers(workflow_status=WorkflowStatusChoices.READY_FOR_CURATION) + + def test_no_sinequa_methods_remain(self): + """P6: every Sinequa method is gone from Collection, and fetch_full_text from tasks.""" + from sde_collections import tasks + + for method in [ + "add_to_public_query", + "create_scraper_config", + "create_indexer_config", + "create_scraper_job", + "create_indexer_job", + "update_config_xml", + "import_metadata_from_sinequa_config", + "sinequa_configuration", + "server_url_prod", + "server_url_secret_prod", + "_write_to_github", + ]: + assert not hasattr(Collection, method), f"Collection.{method} should be deleted" + for task in ["fetch_full_text", "import_candidate_urls_from_api", "push_to_github_task"]: + assert not hasattr(tasks, task), f"tasks.{task} should be deleted" @patch("sde_collections.tasks.index_collection_to_test.delay") @patch("sde_collections.models.collection.Collection.promote_to_curated") @@ -64,10 +88,9 @@ def test_curated_promotes_and_enqueues_test_indexing(self, mock_promote, mock_in mock_promote.assert_called_once() mock_index_test.assert_called_once_with(self.collection.id) - @patch("sde_collections.models.collection.Collection.add_to_public_query") @patch("sde_collections.tasks.index_collection_to_prod.delay") - def test_quality_check_statuses_enqueue_prod_indexing(self, mock_index_prod, mock_add): - """QC_PERFECT / QC_MINOR hand off to prod indexing; add_to_public_query is gone.""" + def test_quality_check_statuses_enqueue_prod_indexing(self, mock_index_prod): + """QC_PERFECT / QC_MINOR hand off to prod indexing (add_to_public_query is deleted).""" for status in [WorkflowStatusChoices.QUALITY_CHECK_PERFECT, WorkflowStatusChoices.QUALITY_CHECK_MINOR]: collection = CollectionFactory() collection.workflow_status = status @@ -75,7 +98,6 @@ def test_quality_check_statuses_enqueue_prod_indexing(self, mock_index_prod, moc mock_index_prod.assert_called_with(collection.id) assert mock_index_prod.call_count == 2 - mock_add.assert_not_called() @patch("sde_collections.tasks.index_collection_to_test.delay") def test_reentrancy_guard_prevents_recursion(self, mock_index_test): @@ -135,14 +157,18 @@ def setUp(self): reindexing_status=ReindexingStatusChoices.REINDEXING_NOT_NEEDED, ) - @patch("sde_collections.tasks.fetch_full_text.delay") - def test_reindexing_finished_triggers_nothing(self, mock_fetch): + def test_reindexing_finished_triggers_nothing(self): """REINDEXING_FINISHED_ON_DEV must trigger nothing: the P4 ingest sets this status - itself — a fetch trigger here would double-fire.""" - self.collection.reindexing_status = ReindexingStatusChoices.REINDEXING_FINISHED_ON_DEV - self.collection.save() + itself — a trigger here would double-fire.""" + with ( + patch("sde_collections.tasks.dispatch_scrape_job.delay") as mock_dispatch, + patch("sde_collections.models.collection.Collection.promote_to_curated") as mock_promote, + ): + self.collection.reindexing_status = ReindexingStatusChoices.REINDEXING_FINISHED_ON_DEV + self.collection.save() - mock_fetch.assert_not_called() + mock_dispatch.assert_not_called() + mock_promote.assert_not_called() @patch("sde_collections.models.collection.Collection.promote_to_curated") def test_reindexing_curated_triggers_promotion(self, mock_promote): @@ -153,374 +179,6 @@ def test_reindexing_curated_triggers_promotion(self, mock_promote): mock_promote.assert_called_once() -class TestFullTextImport(TestCase): - def setUp(self): - self.collection = CollectionFactory() - self.existing_dump = DumpUrlFactory(collection=self.collection) - self.api_response = [ - {"url": "http://example.com/1", "title": "Title 1", "full_text": "Content 1"}, - {"url": "http://example.com/2", "title": "Title 2", "full_text": "Content 2"}, - ] - - @patch("sde_collections.utils.slack_utils.send_detailed_import_notification") - @patch("sde_collections.tasks.Api") - @patch("sde_collections.models.collection.GitHubHandler") - def test_full_text_import_workflow(self, MockGitHub, MockApi, MockSlackNotification): - """Test the full process of importing full text data""" - # Setup mock GitHub handler with proper XML content - mock_github = Mock() - mock_github.check_file_exists.return_value = True - mock_file_contents = Mock() - # Include all the fields that convert_template_to_plugin_indexer checks for - mock_xml = """ - - crawler2 - - - - - - - 1 - - false - - SMD_Plugins/Sinequa.Plugin.WebCrawler_Index_URLList - 3 - - - - - - - - - - true - - true - - - - - - - true - false - false - true - true - false - true - true - false - true - true - true - true - false - - - - true - no - false - - false - false - false - false - false - - - false - true - true - true - false - false - true - false - false - false - false - false - false - false - - - - true - true - - true - false - - - - false - - false - true - false - - true - - - - - - false - false - expBackoff+headers - false - - - - - - - - - - - - false - true - - - - - false - - - false - - - - - - - true - true - - - false - - - - - - - - eu-west-1 - - - true - - true - - - true - false - - - - - - INFO - - false - - true - false - - - - false - false - false - false - true - false - - - - false - false - - - false - false - false - - - - - - - - - false - false - false - - - - true - - - - - - false - false - false - - true - - false - true - true - false - false - false - false - - - - false - false - true - false - - - true - false - - - - true - - - - - - - false - false - false - false - false - false - false - false - false - false - false - true - true - false - false - false - false - true - false - - false - false - false - false - - - - - - - - - - false - - - - - - false - - - - - - false - - - id - doc.url1 - - false - false - """ - mock_file_contents.decoded_content = mock_xml.encode("utf-8") - mock_github._get_file_contents.return_value = mock_file_contents - MockGitHub.return_value = mock_github - - # Setup mock API - mock_api = Mock() - mock_api.get_full_texts.return_value = iter([self.api_response]) - MockApi.return_value = mock_api - - # Setup initial workflow state - self.collection.workflow_status = WorkflowStatusChoices.INDEXING_FINISHED_ON_DEV - self.collection.save() - - # Step 1: Run fetch_full_text - with patch("sde_collections.models.collection.Collection.queue_necessary_classifications") as mock_queue: - fetch_full_text(self.collection.id, "lrm_dev") - mock_queue.assert_called_once() - - # Verify old DumpUrls were cleared and new ones were also created - assert not DumpUrl.objects.filter(id=self.existing_dump.id).exists() - new_dumps = DumpUrl.objects.filter(collection=self.collection) - assert new_dumps.count() == 2 - assert {dump.url for dump in new_dumps} == {"http://example.com/1", "http://example.com/2"} - - # Step 2: Run migrate_dump_to_delta - with patch("sde_collections.models.collection.Collection.migrate_dump_to_delta") as mock_migrate: - migrate_dump_to_delta_and_handle_status_transistions(self.collection.id) - mock_migrate.assert_called_once() - - # Verify status updates - self.collection.refresh_from_db() - assert self.collection.workflow_status == WorkflowStatusChoices.READY_FOR_CURATION - - -class TestErrorHandling(TransactionTestCase): - def setUp(self): - self.collection = CollectionFactory(workflow_status=WorkflowStatusChoices.RESEARCH_IN_PROGRESS) - - # The old test_config_creation_failure_handling is gone with the Sinequa trigger it - # exercised: scrape dispatch is now async (dispatch_scrape_job.delay), so a dispatch - # failure can no longer abort the status save. Failure handling for the new path - # (SSM error -> SCRAPING_FAILED, no ScrapeDispatch row) lives in test_scrape_dispatch.py. - - @patch("sde_collections.tasks.Api") - def test_full_text_fetch_failure_handling(self, MockApi): - """Test handling of full text fetch failures""" - mock_api = Mock() - mock_api.get_full_texts.side_effect = Exception("API error") - MockApi.return_value = mock_api - - initial_status = self.collection.workflow_status - - with pytest.raises(Exception): - fetch_full_text(self.collection.id, "lrm_dev") - - # Verify status wasn't changed on error - self.collection.refresh_from_db() - assert self.collection.workflow_status == initial_status - - NEW_PIPELINE_STATUSES = [ WorkflowStatusChoices.SCRAPING_SUCCESSFUL, WorkflowStatusChoices.TEST_INDEXING, diff --git a/sde_collections/urls.py b/sde_collections/urls.py index 9ee77759..ffdc1b39 100644 --- a/sde_collections/urls.py +++ b/sde_collections/urls.py @@ -23,16 +23,6 @@ path("", view=views.CollectionListView.as_view(), name="list"), path("sde-dashboard/", view=views.SdeDashboardView.as_view(), name="dashboard"), path("/", view=views.CollectionDetailView.as_view(), name="detail"), - path( - "api/collections/push_to_github/", - views.PushToGithubView.as_view(), - name="push-to-github", - ), - path( - "api/indexing_instructions/", - views.IndexingInstructionsView.as_view(), - name="indexing_instructions", - ), path("api/assign-division//", views.DeltaURLViewSet.as_view({"post": "update_division"})), path( "delete-required-url/", @@ -44,11 +34,6 @@ view=views.DeltaURLsListView.as_view(), name="delta_urls", ), - path( - "consolidate/", - view=views.WebappGitHubConsolidationView.as_view(), - name="consolidate_db_and_github_configs", - ), # List all DeltaURL instances: /delta-urls/ # Retrieve a specific DeltaURL instance: /delta-urls/{id}/ # Create a new DeltaURL instance: /delta-urls/ diff --git a/sde_collections/utils/bulk_github_push.py b/sde_collections/utils/bulk_github_push.py deleted file mode 100644 index 420992a4..00000000 --- a/sde_collections/utils/bulk_github_push.py +++ /dev/null @@ -1,22 +0,0 @@ -""" -Sometimes it is necessary to programatically push many collections at once to github. -This code will search for collections matching a certain criteria (curated, pr created), -and push their changes to Github -""" - -from sde_collections.models.collection import Collection -from sde_collections.models.collection_choice_fields import CurationStatusChoices -from sde_collections.utils.github_helper import GitHubHandler - -FINISHED_STATUSES = [ - CurationStatusChoices.CURATED, - CurationStatusChoices.GITHUB_PR_CREATED, -] - - -# currently, the existing automated github branch needs to be deleted -def bulk_push(statuses_to_push=FINISHED_STATUSES): - collections = Collection.objects.filter(curation_status__in=statuses_to_push).exclude(name__icontains="fake") - - gh = GitHubHandler(collections) - gh.push_to_github() diff --git a/sde_collections/utils/github_helper.py b/sde_collections/utils/github_helper.py deleted file mode 100644 index 62be7088..00000000 --- a/sde_collections/utils/github_helper.py +++ /dev/null @@ -1,227 +0,0 @@ -from django.conf import settings -from github import Github -from github.GithubException import GithubException, UnknownObjectException - -from config_generation.db_to_xml import XmlEditor - -from ..models.collection_choice_fields import CurationStatusChoices - - -class GitHubHandler: - def __init__(self, collections=None, *args, **kwargs): - self.github_token = settings.GITHUB_ACCESS_TOKEN - self.g = Github(self.github_token) - self.repo = self.g.get_repo(f"{settings.SINEQUA_CONFIGS_GITHUB_REPO}") - self.master_branch = settings.SINEQUA_CONFIGS_REPO_MASTER_BRANCH - self.dev_branch = settings.SINEQUA_CONFIGS_REPO_DEV_BRANCH - self.webapp_pr_branch = settings.SINEQUA_CONFIGS_REPO_WEBAPP_PR_BRANCH - self.collections = collections - # if we still need operations performed on a collection list - # we should refactor, as this functionality should not be a - # part of the base GithubHandler class. - # maybe it should just be passed to an individual method - - def _get_file_contents(self, file_path, strict=True): - """ - try to get file contents, first from the pr branch and then from the dev branch - if strict is True, raise an exception if the file is not found - """ - - try: - contents = self.repo.get_contents(file_path, ref=self.webapp_pr_branch) - except UnknownObjectException: - try: - contents = self.repo.get_contents(file_path, ref=self.dev_branch) - except UnknownObjectException: - if strict: - raise Exception( - f"File {file_path} not found on {self.dev_branch} or {self.webapp_pr_branch} branches" - ) - return None - - return contents - - def check_file_exists(self, file_path): - """ - Check if file exists on GitHub - """ - - if self._get_file_contents(file_path, strict=False) is None: - return False - else: - return True - - def create_file(self, file_path, file_string, branch=None): - """ - Create file contents on GitHub - if no branch is provided, it will default to the webapp_pr_branch - """ - - if not branch: - branch = self.webapp_pr_branch - - if self.check_file_exists(file_path): - raise Exception(f"File {file_path} already exists on GitHub") - - COMMIT_MESSAGE = f"Webapp: Create {file_path}" - - self.repo.create_file( - file_path, - COMMIT_MESSAGE, - file_string, - branch=branch, - ) - - def create_or_update_file(self, file_path, file_string, branch=None): - """ - Update file contents on GitHub - if no branch is provided, it will default to the webapp_pr_branch - """ - - if not branch: - branch = self.webapp_pr_branch - - if self.check_file_exists(file_path): - contents = self._get_file_contents(file_path) - COMMIT_MESSAGE = f"Webapp: Update {file_path}" - - self.repo.update_file( - contents.path, - COMMIT_MESSAGE, - file_string, - contents.sha, - branch=branch, - ) - else: - self.create_file(file_path, file_string, branch) - - def update_config_with_current_rules(self, collection): - """ - DEPRECATED? - this runs the update_config_xml method from the collection model - which adds the latest rules to the xml file - """ - contents = self._get_file_contents(collection) - FILE_CONTENTS = contents.decoded_content.decode("utf-8") - updated_xml = collection.update_config_xml(FILE_CONTENTS) - - COMMIT_MESSAGE = f"Webapp: Update {collection.name}" - - self.repo.update_file( - contents.path, - COMMIT_MESSAGE, - updated_xml, - contents.sha, - branch=self.github_branch, - ) - - def branch_exists(self, branch_name: str) -> bool: - try: - self.repo.get_branch(branch=branch_name) - return True - except GithubException: - return False - - def create_branch(self, branch_name: str): - # Get the SHA of the commit you want to branch from (basically the Dev branch) - base_sha = self.repo.get_branch(self.dev_branch).commit.sha - # Create the new branch - self.repo.create_git_ref(ref=f"refs/heads/{branch_name}", sha=base_sha) - - def create_pull_request(self) -> None: - title = "Webapp: Update config files" - body = "\n".join(self.collections.values_list("name", flat=True)) - try: - self.repo.create_pull( - title=title, - body=body, - base=self.dev_branch, - head=self.github_branch, - ) - except GithubException: # PR exists - print("PR exists") - - def push_to_github(self) -> None: - if not self.branch_exists(self.github_branch): - self.create_branch(self.github_branch) - for collection in self.collections: - print(f"Pushing {collection.name} to GitHub.") - self.update_config_with_current_rules(collection) - collection.curation_status = CurationStatusChoices.GITHUB_PR_CREATED - collection.save() - self.create_pull_request() - - def fetch_metadata(self): - metadata = {} - for collection in self.collections: - contents = self._get_file_contents(collection) - - if not contents: - continue - - FILE_CONTENTS = contents.decoded_content.decode("utf-8") - collection_xml = XmlEditor(FILE_CONTENTS) - - tree_root = collection_xml.fetch_treeroot() - document_type = collection_xml.fetch_document_type() - - metadata[collection.config_folder] = { - "tree_root": tree_root, - "document_type": document_type, - } - return metadata - - def _get_config_folder(self, collection_folder): - return collection_folder.removeprefix("sources/SDE/") - - def _get_list_of_collections(self): - BASE_PATH = "sources/SDE" - collections = self.repo.get_contents(BASE_PATH, ref=self.dev_branch) - collection_folders = [ - collection.path - for collection in collections - if ".xml" not in collection.path # to prevent source.xml from being included - ] - return collection_folders - - def _get_contents_from_path(self, path): - # we don't need to check if the file exists because we already did that in _get_list_of_collections - contents = self.repo.get_contents(path, ref=self.dev_branch) - FILE_CONTENTS = contents.decoded_content.decode("utf-8") - collection_xml = XmlEditor(FILE_CONTENTS) - return collection_xml - - def get_collections_from_github(self, config_folders=[]): - # get a list of folders in sources/SDE/ from the dev branch on github - collection_folders = self._get_list_of_collections() - - # create a dict of all collections and their metadata - collection_list = [] - - # for each folder in the list, get the metadata: config_folder, name, url, division, tree_root, document_type - for collection_folder in collection_folders: - config_folder = self._get_config_folder(collection_folder) - collection_xml_file_path = self._get_config_file_path(config_folder) - collection_xml = self._get_contents_from_path(collection_xml_file_path) - - division, name = collection_xml.fetch_division_name() - - if not division or not name: - print(f"Skipping {config_folder} because it has no division or name") - continue - - collection_dict = { - "config_folder": config_folder, - "name": name, - "url": collection_xml.fetch_url(), - "division": division, - "document_type": collection_xml.fetch_document_type(), - "connector": collection_xml.fetch_connector(), - } - collection_list.append(collection_dict) - - # return the list of collections and their metadata - return collection_list - - def sync_rules_with_github(self, config_folders=[]): - pass diff --git a/sde_collections/utils/health_check.py b/sde_collections/utils/health_check.py deleted file mode 100644 index 0e09bd87..00000000 --- a/sde_collections/utils/health_check.py +++ /dev/null @@ -1,273 +0,0 @@ -import json -import re - -import boto3 -import botocore -from django.conf import settings - -from sde_collections.models.candidate_url import CandidateURL -from sde_collections.models.collection import ( - Collection, - CurationStatusChoices, - WorkflowStatusChoices, -) -from sde_collections.models.collection_choice_fields import ( - ConnectorChoices, - Divisions, - DocumentTypes, -) -from sde_collections.models.pattern import ExcludePattern, TitlePattern -from sde_collections.tasks import ( - _get_data_to_import, - pull_latest_collection_metadata_from_github, -) - - -def health_check(collection, server_name: str = "production") -> dict: - """ - This method checks whether the rules defined in webapp are properly - synced with Sinequa or not. - - Checks for Title Patterns, Exclude Patterns and Document Type Patterns. - """ - health_check_report = [] - - # get candidate URLs from sinequa - candidate_urls_sinequa = _fetch_candidate_urls(collection, server_name) - - # check for title patterns - title_pattern_report = _health_check_title_pattern(collection, candidate_urls_sinequa) - health_check_report.extend(title_pattern_report) - - # check for exclude patterns - exclude_pattern_report = _health_check_exclude_pattern(collection, candidate_urls_sinequa) - health_check_report.extend(exclude_pattern_report) - - return health_check_report - - -def _fetch_candidate_urls(collection, server_name): - # TODO: should we make it available throughout the project?? - candidate_urls_remote = _get_data_to_import(collection, server_name) - - candidate_urls_sinequa = {} - for candidate_url in candidate_urls_remote: - url = candidate_url["fields"]["url"] - candidate_urls_sinequa[url] = CandidateURL(url=url, scraped_title=candidate_url["fields"]["scraped_title"]) - return candidate_urls_sinequa - - -def _health_check_title_pattern(collection, candidate_urls_sinequa): - collection_id = collection.pk - collection_name = collection.name - collection_config_folder = collection.config_folder - curation_status = collection.curation_status - workflow_status = collection.workflow_status - - title_pattern_report = [] - - # now get Title Patterns in indexer db - title_patterns_local = TitlePattern.objects.all().filter(collection_id=collection_id) - - # check if title patterns are porperly reflected in sinequa's response - for title_pattern in title_patterns_local: - pattern = title_pattern.title_pattern - matched_urls = title_pattern.matched_urls() - - # now check to see if the matched_urls and candidate_urls_sinequa are similar or not - for matched_url in matched_urls: - url = matched_url.url - if url in candidate_urls_sinequa: - matched_title = matched_url.scraped_title - sinequa_title = candidate_urls_sinequa[url].scraped_title - - if _resolve_title_pattern(pattern, sinequa_title) is None: - report = { - "id": collection_id, - "collection_name": collection_name, - "config_folder": collection_config_folder, - "curation_status": CurationStatusChoices.get_status_string(curation_status), - "workflow_status": WorkflowStatusChoices.get_status_string(workflow_status), - "pattern_name": "Title Pattern", - "pattern": pattern, - "scraped_title": matched_title, - "non_compliant_url": matched_url, - } - title_pattern_report.append(report) - - return title_pattern_report - - -def _health_check_exclude_pattern(collection, candidate_urls_sinequa): - collection_id = collection.pk - collection_name = collection.name - collection_config_folder = collection.config_folder - curation_status = collection.curation_status - workflow_status = collection.workflow_status - - exclude_pattern_report = [] - - # Perform exclude pattern check here - exclude_patterns_local = ExcludePattern.objects.all().filter(collection_id=collection_id) - - def create_exclude_pattern_report(match_pattern, url): - return { - "id": collection_id, - "collection_name": collection_name, - "config_folder": collection_config_folder, - "curation_status": CurationStatusChoices.get_status_string(curation_status), - "workflow_status": WorkflowStatusChoices.get_status_string(workflow_status), - "pattern_name": "Exclude Pattern", - "pattern": match_pattern, - "non_compliant_url": url, - } - - for exclude_pattern in exclude_patterns_local: - match_pattern = exclude_pattern.match_pattern - - # check with http:// - if match_pattern.find("http://") == -1: - url = f"http://{match_pattern}" # noqa: E231 - if url in candidate_urls_sinequa: - exclude_pattern_report.append(create_exclude_pattern_report(match_pattern, url)) - - if match_pattern.find("https://") == -1: - url = f"https://{match_pattern}" # noqa: E231 - if url in candidate_urls_sinequa: - exclude_pattern_report.append(create_exclude_pattern_report(match_pattern, url)) - else: - url = match_pattern # assuming it has either https or http - if url in candidate_urls_sinequa: - exclude_pattern_report.append(create_exclude_pattern_report(match_pattern, url)) - - return exclude_pattern_report - - -def _resolve_title_pattern(pattern, title): - """ - Given a pattern check whether it is able to capture the title or not. - - E.g.: GCN {title} - should capture : - -> GCN - Notices - -> GCN - News - """ - pattern_with_whitespace = pattern.replace(" ", r"\s*-?\s*") - - parentheis_pattern = r"\{[^\}]+\}" - multi_pattern = r"\/\/\*([^\/]*)\/a" - - def replace_parentheis_with_anything(match): - return r"\S+" - - regex_pattern_parenthesis = re.sub(parentheis_pattern, replace_parentheis_with_anything, pattern_with_whitespace) - regex_pattern = re.sub(multi_pattern, replace_parentheis_with_anything, regex_pattern_parenthesis) - return re.match(regex_pattern, title) - - -def parse_int_values(github_value, db_value, field): - """ - This method parses the integer values to their corresponding labels. - """ - field_dict = { - "division": Divisions, - "document_type": DocumentTypes, - "connector": ConnectorChoices, - } - try: - github_value = field_dict[field](github_value).label - except ValueError: - github_value = None - - try: - db_value = field_dict[field](db_value).label - except ValueError: - db_value = None - - return github_value, db_value - - -def generate_db_github_metadata_differences(reindex_configs_from_github=False): - report = [] - if reindex_configs_from_github: - pull_latest_collection_metadata_from_github.delay() - return report - - # for each folder in github get the metadata from the default.xml file - FILENAME = "github_collections.json" - - s3 = boto3.resource( - "s3", - region_name="us-east-1", - aws_access_key_id=settings.AWS_ACCESS_KEY_ID, - aws_secret_access_key=settings.AWS_SECRET_ACCESS_KEY, - ) - - try: - s3.Object(settings.AWS_STORAGE_BUCKET_NAME, FILENAME).load() - except botocore.exceptions.ClientError as e: - if e.response["Error"]["Code"] == "404": - pull_latest_collection_metadata_from_github.delay() - return report - else: - raise - else: - collections = json.load(s3.Object(settings.AWS_STORAGE_BUCKET_NAME, FILENAME).get()["Body"]) - - fields = { - "config_folder", - "name", - "url", - "division", - "document_type", - "connector", - } - - # also fetch same metadata from the database - for collection in collections: - # fix division to be the same as in the database - collection["division"] = Divisions.lookup_by_text(collection["division"]) - config_folder = collection["config_folder"] - try: - db_collection = Collection.objects.get(config_folder=config_folder) - except Collection.DoesNotExist: - report.append( - { - "config_folder": config_folder, - "field": "config_folder", - "github_value": config_folder, - "db_value": "DoesNotExist", - } - ) - continue - - # check if there is any difference in the metadata - # if there is a difference then add it to the report - int_fields = {"division", "document_type", "connector"} - for field in fields: - if collection[field] != getattr(db_collection, field): - db_value = getattr(db_collection, field) - if field in int_fields: - collection[field], db_value = parse_int_values(collection[field], db_value, field) - - report.append( - { - "config_folder": config_folder, - "field": field, - "github_value": collection[field], - "db_value": db_value, - } - ) - - # check if there are any collections in the database that are not in github - for db_collection in Collection.objects.exclude(config_folder__in=[c["config_folder"] for c in collections]): - report.append( - { - "config_folder": db_collection.config_folder, - "field": "config_folder", - "github_value": "DoesNotExist", - "db_value": db_collection.config_folder, - } - ) - - return report diff --git a/sde_collections/views.py b/sde_collections/views.py index eba0b5e9..c2e02b5d 100644 --- a/sde_collections/views.py +++ b/sde_collections/views.py @@ -51,9 +51,6 @@ IncludePatternSerializer, TitlePatternSerializer, ) -from .tasks import push_to_github_task -from .utils.health_check import generate_db_github_metadata_differences - User = get_user_model() @@ -500,119 +497,6 @@ class CollectionReadViewSet(viewsets.ReadOnlyModelViewSet): serializer_class = CollectionReadSerializer -class PushToGithubView(APIView): - def post(self, request): - collection_ids = request.POST.getlist("collection_ids[]", []) - if len(collection_ids) == 0: - return Response("collection_ids can't be empty.", status=status.HTTP_400_BAD_REQUEST) - - push_to_github_task.delay(collection_ids) - - return Response( - {"Success": "Started pushing collections to github"}, - status=status.HTTP_200_OK, - ) - - -class IndexingInstructionsView(APIView): - """ - Serves the name of the first curated collection to be indexed and updates collection workflow status - """ - - def get(self, request): - curated_collections = Collection.objects.filter(workflow_status=WorkflowStatusChoices.CURATED) - - job_name = "" - if curated_collections.exists(): - collection = curated_collections.first() - job_name = f"collection.indexer.{collection.config_folder}.xml" - - return Response( - { - "job_name": job_name, - }, - status=status.HTTP_200_OK, - ) - - def post(self, request): - config_folder = request.data.get("collection") - indexing_status = request.data.get("status") - - if not config_folder or not indexing_status: - raise ValidationError({"error": "Config folder name and indexing status are required."}) - - collection = get_object_or_404(Collection, config_folder=config_folder) - - if indexing_status == "STARTED_INDEXING" and collection.workflow_status == WorkflowStatusChoices.CURATED: - collection.workflow_status = WorkflowStatusChoices.SECRET_DEPLOYMENT_STARTED - collection.save() - - return Response( - {"message": f"Status for collection '{collection.name}' updated to Secret Deployment Started."}, - status=status.HTTP_200_OK, - ) - elif ( - indexing_status == "FINISHED_INDEXING" - and collection.workflow_status == WorkflowStatusChoices.SECRET_DEPLOYMENT_STARTED - ): - collection.workflow_status = WorkflowStatusChoices.READY_FOR_LRM_QUALITY_CHECK - collection.save() - - return Response( - {"message": f"Status for collection '{collection.name}' updated to Ready For LRM Quality Check."}, - status=status.HTTP_200_OK, - ) - else: - return Response({"error": "Invalid indexing or workflow status."}, status=status.HTTP_400_BAD_REQUEST) - - -class WebappGitHubConsolidationView(LoginRequiredMixin, TemplateView): - """ - Display a list of collections in the system - """ - - template_name = "sde_collections/consolidate_db_and_github_configs.html" - - def get(self, request, *args, **kwargs): - if not request.GET.get("reindex") == "true": - self.data = generate_db_github_metadata_differences() - else: - # this needs to be a celery task eventually - self.data = generate_db_github_metadata_differences(reindex_configs_from_github=True) - - return super().get(request, *args, **kwargs) - - def post(self, request, *args, **kwargs): - config_folder = self.request.POST.get("config_folder") - field = self.request.POST.get("field") - new_value = self.request.POST.get("github_value") - - if new_value and new_value != "None": - new_value = new_value.strip() - if field == "division": - new_value = Divisions.lookup_by_text(new_value) - elif field == "document_type": - new_value = DocumentTypes.lookup_by_text(new_value) - elif field == "connector": - new_value = ConnectorChoices.lookup_by_text(new_value) - - Collection.objects.filter(config_folder=config_folder).update(**{field: new_value}) - messages.success(request, f"Successfully updated {field} of {config_folder}.") - else: - messages.error( - request, - f"Can't update empty value from GitHub: {field} of {config_folder}.", - ) - - return redirect("sde_collections:consolidate_db_and_github_configs") - - def get_context_data(self, **kwargs): - context = super().get_context_data(**kwargs) - context["differences"] = self.data - - return context - - class ResolvedTitleListView(ListView): model = DeltaResolvedTitle context_object_name = "resolved_titles" diff --git a/sde_collections/xml_templates/new_collection_template.xml b/sde_collections/xml_templates/new_collection_template.xml deleted file mode 100644 index 0ee71927..00000000 --- a/sde_collections/xml_templates/new_collection_template.xml +++ /dev/null @@ -1,292 +0,0 @@ - - - A new collection template - - crawler2 - - - - - - false - - - - - - - - - - false - false - false - - - true - - - - - - false - false - false - 0 - - - - - false - - true - false - - - false - false - false - false - true - false - - - - true - false - - false - false - false - - - - - - - - - - - - - - - - false - true - true - false - false - false - - - - false - false - true - false - - _Advanced - true - false - - - - true - - - - - - - false - false - false - false - false - false - false - false - false - false - false - true - true - false - false - false - false - true - false - - false - false - false - - - - - - - - - false - - - - - - false - - - - - - false - - 3 - - - - true - true - true - 100 - 100000 - 100000 - 10 - -1 - -1 - true - false - false - false - false - false - true - true - false - true - true - true - true - false - 1 - 0 ms - true - no - false - - false - false - true - false - false - - - false - true - true - true - false - true - true - false - false - false - false - false - false - false - - - - true - true - - true - false - - - - false - - false - true - false - - true - - - - - - false - false - true - - - - - - - - - - - false - true - - - - - false - - - - - - - - - true - true - - - false - - - - - - - - eu-west-1 - - true - - true - - 80 - true - false - - - - - false - false - - 1 - - url_to_scrape - *.rtf;*.jy;*.xml;*.ico;*.gz;*.act - - id - doc.url1 - - - - - diff --git a/sde_indexing_helper/static/js/consolidate_db_and_github_configs.js b/sde_indexing_helper/static/js/consolidate_db_and_github_configs.js deleted file mode 100644 index ca9c3771..00000000 --- a/sde_indexing_helper/static/js/consolidate_db_and_github_configs.js +++ /dev/null @@ -1,9 +0,0 @@ -let table = $('#consolidation_table').DataTable({ - "paging": false, - "stateSave": true, - "dom": 'Pfritip', - searchPanes: { - viewTotal: true, - columns: [1] - } -}); diff --git a/sde_indexing_helper/static/js/project.js b/sde_indexing_helper/static/js/project.js index 620e301a..6934961c 100644 --- a/sde_indexing_helper/static/js/project.js +++ b/sde_indexing_helper/static/js/project.js @@ -5,7 +5,7 @@ "Name": "The designated name of the collection.", "URL": "The primary URL of the collection from which the scraping process begins.", "Division": "The specific division to which the collection belongs. It can be one of: Astrophysics, Heliophysics, Biological and Physical Sciences, Earth Science, or Planetary Science.", - "Candidate URLs" : "The URLs crawled from the base URL by Sinequa. These are curated and sent for indexing.", + "Candidate URLs" : "The URLs crawled from the base URL by the scraper. These are curated and sent for indexing.", "Workflow Status": "The current stage of the collection within the workflow.", "Curator": "The individual responsible for curating this collection.", "Connector Type": "Indicates whether the connector is a web crawler or API-based." diff --git a/sde_indexing_helper/templates/sde_collections/collection_detail.html b/sde_indexing_helper/templates/sde_collections/collection_detail.html index 24be2ba0..9867dc86 100644 --- a/sde_indexing_helper/templates/sde_collections/collection_detail.html +++ b/sde_indexing_helper/templates/sde_collections/collection_detail.html @@ -183,12 +183,6 @@

    {{ colle Notes {{ collection.notes }} - - Sinequa Configuration - - {{collection.sinequa_configuration }} - - GitHub Issue Link diff --git a/sde_indexing_helper/templates/sde_collections/consolidate_db_and_github_configs.html b/sde_indexing_helper/templates/sde_collections/consolidate_db_and_github_configs.html deleted file mode 100644 index b3d2f8ba..00000000 --- a/sde_indexing_helper/templates/sde_collections/consolidate_db_and_github_configs.html +++ /dev/null @@ -1,58 +0,0 @@ -{% extends "layouts/base.html" %} -{% load static %} -{% load i18n %} -{% block title %}Consolidation between webapp and GitHub{% endblock %} -{% block stylesheets %} - {{ block.super }} - -{% endblock stylesheets %} -{% block content %} - {% csrf_token %} -
    -

    Collection metadata differences between Webapp and GitHub

    - - - - - - - - - - - - - {% for difference in differences %} - - - - - - - - {% endfor %} - -
    CollectionFieldWebapp ValueGitHub ValueActions
    {{ difference.config_folder }}{{ difference.field }}{{ difference.db_value }}{{ difference.github_value }} -
    - {% csrf_token %} - - - - - -
    -
    -{% endblock content %} -{% block javascripts %} - - - - - -{% endblock javascripts %} From 6fa19843301dc73aa5abc8635d7159d055ebf0ed Mon Sep 17 00:00:00 2001 From: Bernard Benson Date: Thu, 13 Aug 2026 16:45:33 -0500 Subject: [PATCH 09/20] =?UTF-8?q?Phase=207=20=E2=80=94=20Indexing=20hand-o?= =?UTF-8?q?ff?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env_sample | 11 + .envs/.local/.django | 11 + IMPLEMENTATION_PLAN.md | 19 +- config/settings/base.py | 27 +- sde_collections/admin.py | 19 + sde_collections/indexing/__init__.py | 0 sde_collections/indexing/dispatch.py | 66 ++++ sde_collections/indexing/export.py | 106 ++++++ sde_collections/indexing/run_status.py | 41 +++ .../migrations/0080_indexdispatch.py | 38 ++ sde_collections/models/__init__.py | 3 +- sde_collections/models/indexing.py | 36 ++ sde_collections/signals.py | 60 ++-- sde_collections/tasks.py | 165 ++++++++- .../tests/test_indexing_dispatch.py | 332 ++++++++++++++++++ sde_collections/utils/slack_utils.py | 24 ++ 16 files changed, 906 insertions(+), 52 deletions(-) create mode 100644 sde_collections/indexing/__init__.py create mode 100644 sde_collections/indexing/dispatch.py create mode 100644 sde_collections/indexing/export.py create mode 100644 sde_collections/indexing/run_status.py create mode 100644 sde_collections/migrations/0080_indexdispatch.py create mode 100644 sde_collections/models/indexing.py create mode 100644 sde_collections/tests/test_indexing_dispatch.py diff --git a/.env_sample b/.env_sample index d29b61c7..24540a26 100644 --- a/.env_sample +++ b/.env_sample @@ -22,3 +22,14 @@ INFERENCE_ENABLED=False # pipeline-scoped credentials for local dev ONLY; leave blank in AWS (instance role takes over) SDE_AWS_ACCESS_KEY_ID="" SDE_AWS_SECRET_ACCESS_KEY="" + +# P7 indexing hand-off — dev-only for now (sde-web-copy); blank = dispatch disabled +SDE_INDEX_BUCKET="" +INDEXING_ECS_CLUSTER="" +INDEXING_TASK_FAMILY="" +INDEXING_CONTAINER_NAME="WEB_COSMOSContainer" +INDEXING_DISPATCH_ROLE_ARN="" +INDEXING_SUBNETS="" +INDEXING_SECURITY_GROUPS="" +INDEX_POLL_ENABLED=False +INDEX_STALL_TIMEOUT_HOURS=6 diff --git a/.envs/.local/.django b/.envs/.local/.django index 608c9500..094147fb 100644 --- a/.envs/.local/.django +++ b/.envs/.local/.django @@ -40,3 +40,14 @@ SCRAPE_STALL_TIMEOUT_HOURS=24 INFERENCE_ENABLED=False SDE_AWS_ACCESS_KEY_ID='' SDE_AWS_SECRET_ACCESS_KEY='' + +# P7 indexing hand-off — dev-only for now (sde-web-copy); blank = dispatch disabled +SDE_INDEX_BUCKET='' +INDEXING_ECS_CLUSTER='' +INDEXING_TASK_FAMILY='' +INDEXING_CONTAINER_NAME='WEB_COSMOSContainer' +INDEXING_DISPATCH_ROLE_ARN='' +INDEXING_SUBNETS='' +INDEXING_SECURITY_GROUPS='' +INDEX_POLL_ENABLED=False +INDEX_STALL_TIMEOUT_HOURS=6 diff --git a/IMPLEMENTATION_PLAN.md b/IMPLEMENTATION_PLAN.md index 2252333c..3a58ebfa 100644 --- a/IMPLEMENTATION_PLAN.md +++ b/IMPLEMENTATION_PLAN.md @@ -801,12 +801,19 @@ unknown-state-as-failure) and enforces the stall timeout; a stale run's `status. completes a newer dispatch. ### Done when -- [ ] Export/dispatch/poll implemented per the contract; `IndexDispatch` migration applied -- [ ] P5 stubs replaced: a `CURATED` collection reaches `TEST_INDEXING`, and on `succeeded` the - validation report posts to Slack -- [ ] `QC_PERFECT`/`QC_MINOR` dispatches a prod run and lands on `PROD_PERFECT`/`PROD_MINOR` -- [ ] Failure/stall paths land on `INDEXING_FAILED_ON_TEST`/`INDEXING_FAILED_ON_PROD` +- [x] Export/dispatch/poll implemented per the contract; `IndexDispatch` migration applied +- [x] P5 stubs replaced: a `CURATED` collection reaches `TEST_INDEXING`, and on `succeeded` the + validation report posts to Slack *(verified with mocked AWS; all settings default blank/off + so nothing can dispatch until the dev values are configured — dev is the only wired env)* +- [x] `QC_PERFECT`/`QC_MINOR` dispatches a prod run and lands on `PROD_PERFECT`/`PROD_MINOR` +- [x] Failure/stall paths land on `INDEXING_FAILED_ON_TEST`/`INDEXING_FAILED_ON_PROD` - [ ] Closed loop verified against dev (their E2E.10): Curated → export → `RunTask` → poller → Slack + *(blocked cross-repo, checked 2026-08-13: `api-scrapers-cluster-dev` is ACTIVE, but + `sde-cosmos-indexing-dev`, `CosmosIndexingDispatchRole-dev`, and the `web_cosmos-scraper-dev` + task family do not exist — the web-indexing branch is undeployed and `COSMOS_AWS_ACCOUNT_ID` + is unfilled on their side. Also hand them our subnet/SG needs: Fargate `RunTask` requires + `networkConfiguration`, so COSMOS needs `INDEXING_SUBNETS`/`INDEXING_SECURITY_GROUPS` values + from their VPC stack)* --- @@ -824,7 +831,7 @@ posts it to `sde-data-curation`. The QC statuses stay **curator-set from the rep else is needed on the status side after Phase 1. ### Done when -- [ ] Covered by P7's done-when (validation report posted to Slack on test runs) — no separate work +- [x] Covered by P7's done-when (validation report posted to Slack on test runs) — no separate work --- diff --git a/config/settings/base.py b/config/settings/base.py index dec10422..76a83f9d 100644 --- a/config/settings/base.py +++ b/config/settings/base.py @@ -356,6 +356,27 @@ SDE_AWS_SECRET_ACCESS_KEY = env("SDE_AWS_SECRET_ACCESS_KEY", default="") # COSMOS never talks to OpenSearch or SageMaker: chunk/vectorize/index AND the QC validation # report are produced by the WEB_COSMOS task in sde-api-scrapers (branch web-indexing), which -# holds the AOSS credentials. The P7 dispatch/poll settings — SDE_INDEX_BUCKET (distinct from -# SDE_S3_BUCKET), INDEXING_ECS_CLUSTER, INDEXING_TASK_FAMILY, INDEXING_DISPATCH_ROLE_ARN, -# INDEX_POLL_ENABLED — land with P7, all with defaults so config.settings.test keeps booting. +# holds the AOSS credentials. COSMOS only writes exports to S3, assumes one role, and calls +# ecs:RunTask. +# +# --- P7 indexing hand-off --- +# ONLY the sde-dev environment is wired today: the indexer's dev deployment targets the +# disposable sde-web-copy index, and its target->endpoint resolution is tier-capped, so a +# dev dispatch can never reach prod AOSS. All defaults are blank/off — with any of the +# required values unset, dispatch fails fast and the poller never runs. Dev values: +# SDE_INDEX_BUCKET sde-cosmos-indexing-dev +# INDEXING_ECS_CLUSTER api-scrapers-cluster-dev +# INDEXING_TASK_FAMILY web_cosmos-scraper-dev +# INDEXING_CONTAINER_NAME WEB_COSMOSContainer +# INDEXING_DISPATCH_ROLE_ARN arn:aws:iam:::role/CosmosIndexingDispatchRole-dev +SDE_INDEX_BUCKET = env("SDE_INDEX_BUCKET", default="") # distinct from SDE_S3_BUCKET (crawler) +INDEXING_ECS_CLUSTER = env("INDEXING_ECS_CLUSTER", default="") +INDEXING_TASK_FAMILY = env("INDEXING_TASK_FAMILY", default="") +INDEXING_CONTAINER_NAME = env("INDEXING_CONTAINER_NAME", default="WEB_COSMOSContainer") +INDEXING_DISPATCH_ROLE_ARN = env("INDEXING_DISPATCH_ROLE_ARN", default="") +# Fargate RunTask needs awsvpc network config; comma-separated ids, from the indexer's VPC. +INDEXING_SUBNETS = env("INDEXING_SUBNETS", default="") +INDEXING_SECURITY_GROUPS = env("INDEXING_SECURITY_GROUPS", default="") +INDEX_POLL_ENABLED = env.bool("INDEX_POLL_ENABLED", default=False) +# An index run with no status.json after this long is declared dead (indexing is minutes, not hours). +INDEX_STALL_TIMEOUT_HOURS = env.int("INDEX_STALL_TIMEOUT_HOURS", default=6) diff --git a/sde_collections/admin.py b/sde_collections/admin.py index 83ef9c37..a81a85ba 100644 --- a/sde_collections/admin.py +++ b/sde_collections/admin.py @@ -15,6 +15,7 @@ from .models.collection_choice_fields import TDAMMTags from .models.delta_url import CuratedUrl, DeltaUrl, DumpUrl from .models.pattern import DivisionPattern, IncludePattern, TitlePattern +from .models.indexing import IndexDispatch from .models.scraper_config import ScrapeDispatch, ScraperConfigOverride @@ -401,3 +402,21 @@ def has_change_permission(self, request, obj=None): def has_delete_permission(self, request, obj=None): return False + + +@admin.register(IndexDispatch) +class IndexDispatchAdmin(admin.ModelAdmin): + """Read-only dispatch log for debugging WEB_COSMOS index runs.""" + + list_display = ("collection", "target", "run_id", "dispatched_at", "completed_at") + search_fields = ("collection__name", "collection__config_folder", "run_id", "task_arn") + list_filter = ("target", "dispatched_at") + + def has_add_permission(self, request): + return False + + def has_change_permission(self, request, obj=None): + return False + + def has_delete_permission(self, request, obj=None): + return False diff --git a/sde_collections/indexing/__init__.py b/sde_collections/indexing/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/sde_collections/indexing/dispatch.py b/sde_collections/indexing/dispatch.py new file mode 100644 index 00000000..b1774bc7 --- /dev/null +++ b/sde_collections/indexing/dispatch.py @@ -0,0 +1,66 @@ +"""Dispatch a WEB_COSMOS indexing run via cross-account ecs:RunTask. + +COSMOS assumes CosmosIndexingDispatchRole-{env} and starts one Fargate task with a +command override (not container-env overrides). Target->endpoint resolution is +tier-capped on the indexer side, so a dev dispatch can never reach prod AOSS. +""" + +import boto3 +from django.conf import settings + +from ..utils.aws import get_boto3_session + + +def run_index_task(collection, target: str, run_id: str) -> str: + """Assume the dispatch role and RunTask; returns the task ARN.""" + for name in ("INDEXING_DISPATCH_ROLE_ARN", "INDEXING_ECS_CLUSTER", "INDEXING_TASK_FAMILY"): + if not getattr(settings, name): + raise ValueError(f"{name} is not configured — cannot dispatch an index run") + + sts = get_boto3_session().client("sts") + session_name = f"cosmos-index-{target}-{collection.config_folder}"[:64] + credentials = sts.assume_role( + RoleArn=settings.INDEXING_DISPATCH_ROLE_ARN, + RoleSessionName=session_name, + )["Credentials"] + + ecs = boto3.client( + "ecs", + region_name=settings.AWS_REGION, + aws_access_key_id=credentials["AccessKeyId"], + aws_secret_access_key=credentials["SecretAccessKey"], + aws_session_token=credentials["SessionToken"], + ) + + kwargs = { + "cluster": settings.INDEXING_ECS_CLUSTER, + "taskDefinition": settings.INDEXING_TASK_FAMILY, + "launchType": "FARGATE", + "count": 1, + "overrides": { + "containerOverrides": [ + { + "name": settings.INDEXING_CONTAINER_NAME, + "command": [ + "--source", "WEB_COSMOS", + "--collection", collection.config_folder, + "--target", target, + "--run-id", run_id, + ], + } + ] + }, + } + if settings.INDEXING_SUBNETS: + kwargs["networkConfiguration"] = { + "awsvpcConfiguration": { + "subnets": [s for s in settings.INDEXING_SUBNETS.split(",") if s], + "securityGroups": [s for s in settings.INDEXING_SECURITY_GROUPS.split(",") if s], + "assignPublicIp": "ENABLED", + } + } + + response = ecs.run_task(**kwargs) + if response.get("failures"): + raise RuntimeError(f"ecs:RunTask reported failures: {response['failures']}") + return response["tasks"][0]["taskArn"] diff --git a/sde_collections/indexing/export.py b/sde_collections/indexing/export.py new file mode 100644 index 00000000..8a0de69e --- /dev/null +++ b/sde_collections/indexing/export.py @@ -0,0 +1,106 @@ +"""Export a collection's curated set to the indexing hand-off bucket. + +Layout (fixed by the built WEB_COSMOS indexer — do not re-negotiate silently): + + s3://{SDE_INDEX_BUCKET}/curated_collections/{config_folder}/{run_id}/ + documents.jsonl + manifest.json <- written LAST = "export complete" + +COSMOS exports raw curated fields only. The indexer mints id/version itself +(web/web_processor.py is the sole owner of identity), verifies the JSONL line count +against manifest.document_count (skipping deletions on mismatch), and drops fields not +in its allow-list (tdamm_tag is exported but not indexed). +""" + +import json +import tempfile + +from django.conf import settings +from django.utils import timezone + +from ..models.collection_choice_fields import Divisions, DocumentTypes +from ..utils.aws import get_boto3_session + +SCHEMA_VERSION = 1 + + +def export_prefix(config_folder: str, run_id: str) -> str: + return f"curated_collections/{config_folder}/{run_id}" + + +def _label(choices_cls, value): + """Resolve a nullable choices int to its label; None stays None.""" + if value is None: + return None + return choices_cls(value).label + + +def _document_line(curated_url, collection_division, collection_document_type) -> dict: + """One JSONL line. Per-URL division/document_type only when they differ from the + collection default (the indexer broadcasts manifest values for missing fields).""" + line = { + "url": curated_url.url, + # Resolved at export time: manual/generated title wins over the scraped one. + "title": curated_url.generated_title or curated_url.scraped_title, + "full_text": curated_url.scraped_text, + "is_metadata_viewer": False, + } + + if curated_url.document_type is not None and curated_url.document_type != collection_document_type: + line["document_type"] = _label(DocumentTypes, curated_url.document_type) + if curated_url.division is not None and curated_url.division != collection_division: + line["division"] = _label(Divisions, curated_url.division) + + # tdamm_tag is a PairedFieldDescriptor (manual over ML), not a column — instance + # access only. Exported but not indexed (excluded from the indexer's version hash). + tdamm = curated_url.tdamm_tag + if tdamm: + line["tdamm_tag"] = list(tdamm) + + return line + + +def export_curated_to_s3(collection, target: str, run_id: str) -> int: + """Stream the curated set to S3; manifest last. Returns the exact document count.""" + from ..models.delta_url import CuratedUrl + + s3 = get_boto3_session().client("s3") + bucket = settings.SDE_INDEX_BUCKET + if not bucket: + raise ValueError("SDE_INDEX_BUCKET is not configured — cannot export") + prefix = export_prefix(collection.config_folder, run_id) + + # excluded is a queryset annotation, not a field — filtering it out here is what + # keeps curator exclusions from being published. + curated = CuratedUrl.objects.filter(collection=collection).exclude(excluded=True).iterator() + + count = 0 + # Spooled to disk: a crawled collection can be far larger than task memory. + with tempfile.TemporaryFile() as body: + for curated_url in curated: + line = _document_line(curated_url, collection.division, collection.document_type) + body.write(json.dumps(line, ensure_ascii=False).encode("utf-8") + b"\n") + count += 1 + body.seek(0) + s3.upload_fileobj(body, bucket, f"{prefix}/documents.jsonl") + + manifest = { + "schema_version": SCHEMA_VERSION, + "run_id": run_id, + "collection_key": collection.config_folder, + "collection_name": collection.name, + "division": _label(Divisions, collection.division), + "document_type": _label(DocumentTypes, collection.document_type), + "target": target, + "document_count": count, # the indexer verifies line count against this — must be exact + "exported_at": timezone.now().isoformat(), + "cosmos_workflow_status": collection.workflow_status, + } + # Written LAST: its presence is the "export complete" signal the indexer trusts. + s3.put_object( + Bucket=bucket, + Key=f"{prefix}/manifest.json", + Body=json.dumps(manifest).encode("utf-8"), + ContentType="application/json", + ) + return count diff --git a/sde_collections/indexing/run_status.py b/sde_collections/indexing/run_status.py new file mode 100644 index 00000000..0f350ba5 --- /dev/null +++ b/sde_collections/indexing/run_status.py @@ -0,0 +1,41 @@ +"""Read a WEB_COSMOS run's outcome from S3 — never ecs.describe_tasks. + +The indexer writes index_runs/{config_folder}/{run_id}/status.json last and +unconditionally, including on failure; on test runs it also writes validation.json +(the WORKFLOW.md steps 22–25 count/title QC report, produced indexer-side because +only it holds AOSS credentials). +""" + +import json + +from botocore.exceptions import ClientError +from django.conf import settings + +from ..utils.aws import get_boto3_session + +_MISSING_KEY_CODES = {"NoSuchKey", "404"} + + +def run_prefix(config_folder: str, run_id: str) -> str: + return f"index_runs/{config_folder}/{run_id}" + + +def _fetch_json(key: str): + s3 = get_boto3_session().client("s3") + try: + obj = s3.get_object(Bucket=settings.SDE_INDEX_BUCKET, Key=key) + except ClientError as e: + if e.response.get("Error", {}).get("Code") in _MISSING_KEY_CODES: + return None + raise + return json.loads(obj["Body"].read()) + + +def fetch_run_status(config_folder: str, run_id: str): + """status.json as a dict, or None while the run is still in flight.""" + return _fetch_json(f"{run_prefix(config_folder, run_id)}/status.json") + + +def fetch_validation_report(config_folder: str, run_id: str): + """validation.json (test runs only), or None if absent.""" + return _fetch_json(f"{run_prefix(config_folder, run_id)}/validation.json") diff --git a/sde_collections/migrations/0080_indexdispatch.py b/sde_collections/migrations/0080_indexdispatch.py new file mode 100644 index 00000000..9190377e --- /dev/null +++ b/sde_collections/migrations/0080_indexdispatch.py @@ -0,0 +1,38 @@ +# Generated by Django 4.2.9 on 2026-08-13 21:27 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ("sde_collections", "0079_scraperconfigoverride_scrapedispatch"), + ] + + operations = [ + migrations.CreateModel( + name="IndexDispatch", + fields=[ + ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("run_id", models.CharField(max_length=64)), + ("target", models.CharField(choices=[("test", "test"), ("prod", "prod")], max_length=8)), + ("task_arn", models.CharField(blank=True, default="", max_length=256)), + ("previous_workflow_status", models.IntegerField(blank=True, null=True)), + ("dispatched_at", models.DateTimeField(auto_now_add=True)), + ("completed_at", models.DateTimeField(blank=True, null=True)), + ( + "collection", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="index_dispatches", + to="sde_collections.collection", + ), + ), + ], + options={ + "verbose_name_plural": "Index Dispatches", + "ordering": ["-dispatched_at"], + }, + ), + ] diff --git a/sde_collections/models/__init__.py b/sde_collections/models/__init__.py index 57436009..143f16ae 100644 --- a/sde_collections/models/__init__.py +++ b/sde_collections/models/__init__.py @@ -1,3 +1,4 @@ +from .indexing import IndexDispatch from .scraper_config import ScrapeDispatch, ScraperConfigOverride -__all__ = ["ScrapeDispatch", "ScraperConfigOverride"] +__all__ = ["IndexDispatch", "ScrapeDispatch", "ScraperConfigOverride"] diff --git a/sde_collections/models/indexing.py b/sde_collections/models/indexing.py new file mode 100644 index 00000000..d310e3e0 --- /dev/null +++ b/sde_collections/models/indexing.py @@ -0,0 +1,36 @@ +from django.db import models + + +class IndexDispatch(models.Model): + """One row per WEB_COSMOS indexing dispatch (test or prod target). + + Required because CELERY_RESULT_BACKEND = None means Celery task state cannot be + polled: dispatched_at is the stall-timeout reference (mirroring ScrapeDispatch), and + the COSMOS-minted run_id namespaces every S3 artifact, so an old run's status.json + can never satisfy a newer dispatch — no LastModified freshness rule needed. + """ + + TARGET_CHOICES = [("test", "test"), ("prod", "prod")] + + collection = models.ForeignKey( + "sde_collections.Collection", + on_delete=models.CASCADE, + related_name="index_dispatches", + ) + run_id = models.CharField(max_length=64) + target = models.CharField(max_length=8, choices=TARGET_CHOICES) + task_arn = models.CharField(max_length=256, blank=True, default="") + # The workflow status the collection entered the dispatch with — a succeeded prod run + # mirrors QC_PERFECT/QC_MINOR onto PROD_PERFECT/PROD_MINOR (WORKFLOW.md step 30). + previous_workflow_status = models.IntegerField(null=True, blank=True) + dispatched_at = models.DateTimeField(auto_now_add=True) + # Set when the poller resolves the run (success, failure, or stall); resolved rows + # are never polled again, which also keeps the Slack report to a single post. + completed_at = models.DateTimeField(null=True, blank=True) + + class Meta: + ordering = ["-dispatched_at"] + verbose_name_plural = "Index Dispatches" + + def __str__(self): + return f"{self.collection.config_folder} -> {self.target} ({self.run_id})" diff --git a/sde_collections/signals.py b/sde_collections/signals.py index b6a163e5..6020fe86 100644 --- a/sde_collections/signals.py +++ b/sde_collections/signals.py @@ -4,40 +4,50 @@ POLL_SCRAPE_TASK = "sde_collections.tasks.poll_scrape_jobs" POLL_SCRAPE_TASK_NAME = "Poll crawler S3 results (every 5 min)" +POLL_INDEX_TASK = "sde_collections.tasks.poll_index_runs" +POLL_INDEX_TASK_NAME = "Poll index runs (every 2 min)" + + +def _ensure_beat_row(name, task_path, crontab, enabled): + from django_celery_beat.models import PeriodicTask + + try: + task = PeriodicTask.objects.get(name=name) + except PeriodicTask.DoesNotExist: + PeriodicTask.objects.create(crontab=crontab, name=name, task=task_path, enabled=enabled) + else: + task.crontab = crontab + task.task = task_path + task.enabled = enabled + task.save() @receiver(post_migrate) def create_periodic_tasks(sender, **kwargs): - """DB-row beat schedule for the scrape-results poller (there is no - CELERY_BEAT_SCHEDULE in this repo — all schedules are django-celery-beat rows). + """DB-row beat schedules for the S3 pollers (there is no CELERY_BEAT_SCHEDULE in + this repo — all schedules are django-celery-beat rows). - `enabled` is re-asserted from SCRAPE_POLL_ENABLED on every migrate, same pattern as + `enabled` is re-asserted from the flags on every migrate, same pattern as inference/signals.py: the flag, not a hand-edit in the admin, is the source of truth. """ if sender.name != "sde_collections": return - from django_celery_beat.models import CrontabSchedule, PeriodicTask - - crontab, _ = CrontabSchedule.objects.get_or_create( - minute="*/5", - hour="*", - day_of_week="*", - day_of_month="*", - month_of_year="*", - ) + from django_celery_beat.models import CrontabSchedule - try: - task = PeriodicTask.objects.get(name=POLL_SCRAPE_TASK_NAME) - except PeriodicTask.DoesNotExist: - PeriodicTask.objects.create( - crontab=crontab, - name=POLL_SCRAPE_TASK_NAME, - task=POLL_SCRAPE_TASK, - enabled=settings.SCRAPE_POLL_ENABLED, + def crontab_every(minutes): + crontab, _ = CrontabSchedule.objects.get_or_create( + minute=f"*/{minutes}", + hour="*", + day_of_week="*", + day_of_month="*", + month_of_year="*", ) - else: - task.crontab = crontab - task.task = POLL_SCRAPE_TASK - task.enabled = settings.SCRAPE_POLL_ENABLED - task.save() + return crontab + + _ensure_beat_row( + POLL_SCRAPE_TASK_NAME, POLL_SCRAPE_TASK, crontab_every(5), settings.SCRAPE_POLL_ENABLED + ) + _ensure_beat_row( + POLL_INDEX_TASK_NAME, POLL_INDEX_TASK, crontab_every(2), settings.INDEX_POLL_ENABLED + ) diff --git a/sde_collections/tasks.py b/sde_collections/tasks.py index a4942ddb..5d8882af 100644 --- a/sde_collections/tasks.py +++ b/sde_collections/tasks.py @@ -10,10 +10,16 @@ WorkflowStatusChoices, ) +from .indexing.dispatch import run_index_task +from .indexing.export import export_curated_to_s3 +from .indexing.run_status import fetch_run_status, fetch_validation_report from .models.delta_url import DumpUrl from .scraping.s3_results import fetch_documents, fetch_summary, results_ready from .scraping.ssm_dispatch import send_job_to_crawler -from .utils.slack_utils import send_detailed_import_notification +from .utils.slack_utils import ( + send_detailed_import_notification, + send_indexing_validation_report, +) @celery_app.task() @@ -164,30 +170,155 @@ def poll_scrape_jobs(): return f"Enqueued ingest for {enqueued} collection(s)." -@celery_app.task() -def index_collection_to_test(collection_id): - """P5 stub — the event-trigger seam for the WEB_COSMOS indexing pipeline - (sde-api-scrapers, branch web-indexing). P7 fills this in: mint a run_id, export the - curated set to S3 (documents.jsonl + manifest.json, manifest written last), assume - the dispatch role, and ecs:RunTask with a command override. Never indexes in-process. - """ +def _mint_run_id(): + import uuid + + from django.utils import timezone + + return f"{timezone.now().strftime('%Y-%m-%dT%H-%M-%SZ')}-{uuid.uuid4().hex[:6]}" + + +def _dispatch_index_run(collection_id, target, in_flight_status, failed_status): + """Shared body of the two indexing hand-off tasks: mint run_id -> export (manifest + last) -> RunTask -> record IndexDispatch -> set the in-flight status. Never indexes + in-process; failure lands on the target's failed status and never raises.""" Collection = apps.get_model("sde_collections", "Collection") + IndexDispatch = apps.get_model("sde_collections", "IndexDispatch") collection = Collection.objects.get(id=collection_id) - collection.workflow_status = WorkflowStatusChoices.TEST_INDEXING + run_id = _mint_run_id() + previous_status = collection.workflow_status + + try: + document_count = export_curated_to_s3(collection, target, run_id) + if document_count == 0: + raise ValueError("curated set is empty — nothing to index") + task_arn = run_index_task(collection, target, run_id) + except Exception as e: + print(f"Index dispatch ({target}) failed for {collection.config_folder}: {e}") + collection.workflow_status = failed_status + collection.save() + return None + + IndexDispatch.objects.create( + collection=collection, + run_id=run_id, + target=target, + task_arn=task_arn, + previous_workflow_status=previous_status, + ) + collection.workflow_status = in_flight_status collection.save() - print(f"[P5 stub] Test indexing recorded for {collection.config_folder}; dispatch lands in P7.") - return f"Test indexing started for {collection.config_folder}" + print(f"Dispatched {target} index run {run_id} for {collection.config_folder} ({document_count} documents)") + return run_id + + +@celery_app.task() +def index_collection_to_test(collection_id): + """Hand a curated collection to the WEB_COSMOS indexer, test target.""" + return _dispatch_index_run( + collection_id, + target="test", + in_flight_status=WorkflowStatusChoices.TEST_INDEXING, + failed_status=WorkflowStatusChoices.INDEXING_FAILED_ON_TEST, + ) @celery_app.task() def index_collection_to_prod(collection_id): - """P5 stub — prod counterpart of index_collection_to_test; see its docstring.""" + """Hand a QC-passed collection to the WEB_COSMOS indexer, prod target.""" + return _dispatch_index_run( + collection_id, + target="prod", + in_flight_status=WorkflowStatusChoices.PRODUCTION_INDEXING, + failed_status=WorkflowStatusChoices.INDEXING_FAILED_ON_PROD, + ) + + +@celery_app.task() +def poll_index_runs(): + """Beat task (every 2 min, gated on INDEX_POLL_ENABLED): resolve in-flight index runs + by polling S3 status.json — never ecs.describe_tasks. + + Mapping: succeeded+test -> stay TEST_INDEXING and post the validation report to Slack + (curator sets QC from it); succeeded+prod -> PROD_PERFECT/PROD_MINOR mirroring the QC + status the run entered with; failed, unknown state, or stall timeout -> the target's + INDEXING_FAILED status. run_id namespacing means an old run's status.json can never + satisfy a newer dispatch. + """ + from datetime import timedelta + + from django.utils import timezone + Collection = apps.get_model("sde_collections", "Collection") - collection = Collection.objects.get(id=collection_id) - collection.workflow_status = WorkflowStatusChoices.PRODUCTION_INDEXING - collection.save() - print(f"[P5 stub] Production indexing recorded for {collection.config_folder}; dispatch lands in P7.") - return f"Production indexing started for {collection.config_folder}" + + failed_status_for_target = { + "test": WorkflowStatusChoices.INDEXING_FAILED_ON_TEST, + "prod": WorkflowStatusChoices.INDEXING_FAILED_ON_PROD, + } + stall_timeout = timedelta(hours=settings.INDEX_STALL_TIMEOUT_HOURS) + now = timezone.now() + resolved = 0 + + in_flight = Collection.objects.filter( + workflow_status__in=[ + WorkflowStatusChoices.TEST_INDEXING, + WorkflowStatusChoices.PRODUCTION_INDEXING, + ] + ) + for collection in in_flight: + dispatch = collection.index_dispatches.filter(completed_at__isnull=True).first() + if dispatch is None: + continue # nothing open to poll (e.g. status set by hand) + + try: + status = fetch_run_status(collection.config_folder, dispatch.run_id) + except Exception as e: + print(f"Error checking index run for {collection.config_folder}: {e}") + continue + + if status is None: + if now - dispatch.dispatched_at > stall_timeout: + print(f"Index run stalled for {collection.config_folder} (run {dispatch.run_id})") + collection.workflow_status = failed_status_for_target[dispatch.target] + collection.save() + dispatch.completed_at = now + dispatch.save() + resolved += 1 + continue + + state = status.get("state") + if state == "succeeded": + if dispatch.target == "test": + # Collection stays at TEST_INDEXING; the curator sets QC from the report. + try: + validation = fetch_validation_report(collection.config_folder, dispatch.run_id) + send_indexing_validation_report(collection.name, dispatch.run_id, validation) + except Exception as e: + print(f"Error posting validation report for {collection.config_folder}: {e}") + else: + mirror = { + WorkflowStatusChoices.QUALITY_CHECK_MINOR: WorkflowStatusChoices.PROD_MINOR, + } + collection.workflow_status = mirror.get( + dispatch.previous_workflow_status, WorkflowStatusChoices.PROD_PERFECT + ) + collection.save() + else: + # "failed" and any unknown state are both failures — needs_confirmation is + # reserved for future two-phase deletion and must not read as success. + error = status.get("error") + print( + f"Index run for {collection.config_folder} (run {dispatch.run_id}) " + f"ended state={state!r} error={error!r}" + ) + collection.workflow_status = failed_status_for_target[dispatch.target] + collection.save() + + dispatch.completed_at = now + dispatch.save() + resolved += 1 + + return f"Resolved {resolved} index run(s)." @celery_app.task(soft_time_limit=600) diff --git a/sde_collections/tests/test_indexing_dispatch.py b/sde_collections/tests/test_indexing_dispatch.py new file mode 100644 index 00000000..82e823a1 --- /dev/null +++ b/sde_collections/tests/test_indexing_dispatch.py @@ -0,0 +1,332 @@ +# docker-compose -f local.yml run --rm django pytest sde_collections/tests/test_indexing_dispatch.py + +import json +from datetime import timedelta +from unittest.mock import MagicMock, patch + +import pytest +from django.test import override_settings +from django.utils import timezone + +from sde_collections.indexing.export import export_curated_to_s3 +from sde_collections.indexing.dispatch import run_index_task +from sde_collections.models.collection_choice_fields import ( + Divisions, + DocumentTypes, + WorkflowStatusChoices, +) +from sde_collections.models.delta_patterns import DeltaExcludePattern +from sde_collections.models.indexing import IndexDispatch +from sde_collections.tasks import ( + index_collection_to_prod, + index_collection_to_test, + poll_index_runs, +) +from sde_collections.tests.factories import CollectionFactory, CuratedUrlFactory + +RUN_ID = "2026-08-13T20-00-00Z-abc123" + +INDEXING_SETTINGS = dict( + SDE_INDEX_BUCKET="sde-cosmos-indexing-dev", + INDEXING_ECS_CLUSTER="api-scrapers-cluster-dev", + INDEXING_TASK_FAMILY="web_cosmos-scraper-dev", + INDEXING_DISPATCH_ROLE_ARN="arn:aws:iam::998871305517:role/CosmosIndexingDispatchRole-dev", +) + + +class ExportCapture: + """Mock S3 client capturing the export write sequence and payloads.""" + + def __init__(self): + self.calls = [] # ordered (kind, key) + self.jsonl_lines = None + self.manifest = None + self.client = MagicMock() + self.client.upload_fileobj.side_effect = self._upload_fileobj + self.client.put_object.side_effect = self._put_object + + def _upload_fileobj(self, fileobj, bucket, key): + content = fileobj.read().decode("utf-8") + self.jsonl_lines = [json.loads(line) for line in content.splitlines() if line] + self.calls.append(("documents", key)) + + def _put_object(self, Bucket, Key, Body, **kwargs): + self.manifest = json.loads(Body) + self.calls.append(("manifest", Key)) + + +@pytest.fixture +def s3_export(): + capture = ExportCapture() + session = MagicMock() + session.client.return_value = capture.client + with patch("sde_collections.indexing.export.get_boto3_session", return_value=session): + yield capture + + +@pytest.mark.django_db +class TestExportCuratedToS3: + @pytest.fixture(autouse=True) + def indexing_settings(self): + with override_settings(**INDEXING_SETTINGS): + yield + def test_manifest_written_last_with_exact_count_and_keys(self, s3_export): + collection = CollectionFactory() + CuratedUrlFactory.create_batch(3, collection=collection) + + count = export_curated_to_s3(collection, "test", RUN_ID) + + assert count == 3 + assert [kind for kind, _ in s3_export.calls] == ["documents", "manifest"] + prefix = f"curated_collections/{collection.config_folder}/{RUN_ID}" + assert s3_export.calls[0][1] == f"{prefix}/documents.jsonl" + assert s3_export.calls[1][1] == f"{prefix}/manifest.json" + assert s3_export.manifest["document_count"] == 3 + assert s3_export.manifest["collection_key"] == collection.config_folder + assert s3_export.manifest["run_id"] == RUN_ID + assert s3_export.manifest["target"] == "test" + assert s3_export.manifest["schema_version"] == 1 + + def test_excluded_urls_are_not_exported(self, s3_export): + collection = CollectionFactory() + CuratedUrlFactory(collection=collection, url="https://keep.nasa.gov/a") + excluded_url = CuratedUrlFactory(collection=collection, url="https://exclude.nasa.gov/b") + pattern = DeltaExcludePattern.objects.create( + collection=collection, match_pattern="https://exclude.nasa.gov/b" + ) + # The excluded annotation reads this M2M; population is the pattern system's job + # (covered in test_promote_collection) — here we only care that export honours it. + pattern.curated_urls.add(excluded_url) + + count = export_curated_to_s3(collection, "test", RUN_ID) + + assert count == 1 + assert s3_export.manifest["document_count"] == 1 + assert [line["url"] for line in s3_export.jsonl_lines] == ["https://keep.nasa.gov/a"] + + def test_title_and_label_resolution(self, s3_export): + collection = CollectionFactory(division=Divisions.ASTROPHYSICS, document_type=DocumentTypes.DATA) + CuratedUrlFactory( + collection=collection, + generated_title="Generated wins", + scraped_title="Scraped loses", + document_type=DocumentTypes.IMAGES, # differs from collection default -> exported + division=Divisions.ASTROPHYSICS, # equals collection default -> omitted + ) + + export_curated_to_s3(collection, "test", RUN_ID) + + line = s3_export.jsonl_lines[0] + assert line["title"] == "Generated wins" + assert line["document_type"] == "Images" # label, not the int + assert "division" not in line + assert line["is_metadata_viewer"] is False + assert s3_export.manifest["division"] == "Astrophysics" + assert s3_export.manifest["document_type"] == "Data" + + @override_settings(SDE_INDEX_BUCKET="") + def test_blank_bucket_refuses_to_export(self, s3_export): + collection = CollectionFactory() + + with pytest.raises(ValueError, match="SDE_INDEX_BUCKET"): + export_curated_to_s3(collection, "test", RUN_ID) + + +@pytest.mark.django_db +class TestRunIndexTask: + def test_unconfigured_settings_refuse_to_dispatch(self): + """Dev-only guard: with the blank defaults, no dispatch can leave the box.""" + collection = CollectionFactory() + + with pytest.raises(ValueError, match="INDEXING_DISPATCH_ROLE_ARN"): + run_index_task(collection, "test", RUN_ID) + + @override_settings(**INDEXING_SETTINGS) + @patch("sde_collections.indexing.dispatch.boto3.client") + @patch("sde_collections.indexing.dispatch.get_boto3_session") + def test_dispatch_assumes_role_and_runs_task(self, mock_session, mock_boto3_client): + collection = CollectionFactory() + sts = MagicMock() + sts.assume_role.return_value = { + "Credentials": {"AccessKeyId": "AK", "SecretAccessKey": "SK", "SessionToken": "TOK"} + } + mock_session.return_value.client.return_value = sts + ecs = MagicMock() + ecs.run_task.return_value = {"tasks": [{"taskArn": "arn:aws:ecs:task/1"}], "failures": []} + mock_boto3_client.return_value = ecs + + arn = run_index_task(collection, "test", RUN_ID) + + assert arn == "arn:aws:ecs:task/1" + assert sts.assume_role.call_args.kwargs["RoleArn"] == INDEXING_SETTINGS["INDEXING_DISPATCH_ROLE_ARN"] + run_kwargs = ecs.run_task.call_args.kwargs + assert run_kwargs["cluster"] == "api-scrapers-cluster-dev" + assert run_kwargs["taskDefinition"] == "web_cosmos-scraper-dev" + command = run_kwargs["overrides"]["containerOverrides"][0]["command"] + assert command == [ + "--source", "WEB_COSMOS", + "--collection", collection.config_folder, + "--target", "test", + "--run-id", RUN_ID, + ] + + @override_settings(**INDEXING_SETTINGS) + @patch("sde_collections.indexing.dispatch.boto3.client") + @patch("sde_collections.indexing.dispatch.get_boto3_session") + def test_runtask_failures_raise(self, mock_session, mock_boto3_client): + collection = CollectionFactory() + mock_session.return_value.client.return_value.assume_role.return_value = { + "Credentials": {"AccessKeyId": "AK", "SecretAccessKey": "SK", "SessionToken": "TOK"} + } + mock_boto3_client.return_value.run_task.return_value = { + "tasks": [], + "failures": [{"reason": "MISSING"}], + } + + with pytest.raises(RuntimeError, match="failures"): + run_index_task(collection, "test", RUN_ID) + + +@pytest.mark.django_db +class TestIndexDispatchTasks: + @patch("sde_collections.tasks.run_index_task", return_value="arn:aws:ecs:task/1") + @patch("sde_collections.tasks.export_curated_to_s3", return_value=25) + def test_test_dispatch_records_and_sets_status(self, mock_export, mock_run): + collection = CollectionFactory(workflow_status=WorkflowStatusChoices.CURATED) + + run_id = index_collection_to_test(collection.id) + + dispatch = IndexDispatch.objects.get(collection=collection) + assert dispatch.run_id == run_id + assert dispatch.target == "test" + assert dispatch.task_arn == "arn:aws:ecs:task/1" + assert dispatch.previous_workflow_status == WorkflowStatusChoices.CURATED + assert dispatch.completed_at is None + collection.refresh_from_db() + assert collection.workflow_status == WorkflowStatusChoices.TEST_INDEXING + # export happens before dispatch, with the same run_id + assert mock_export.call_args.args[1] == "test" + assert mock_export.call_args.args[2] == run_id + + @patch("sde_collections.tasks.run_index_task") + @patch("sde_collections.tasks.export_curated_to_s3", side_effect=Exception("S3 down")) + def test_export_failure_lands_on_failed_status_without_raising(self, mock_export, mock_run): + collection = CollectionFactory(workflow_status=WorkflowStatusChoices.CURATED) + + assert index_collection_to_test(collection.id) is None + + collection.refresh_from_db() + assert collection.workflow_status == WorkflowStatusChoices.INDEXING_FAILED_ON_TEST + assert not IndexDispatch.objects.filter(collection=collection).exists() + mock_run.assert_not_called() + + @patch("sde_collections.tasks.run_index_task") + @patch("sde_collections.tasks.export_curated_to_s3", return_value=0) + def test_empty_curated_set_fails_before_dispatch(self, mock_export, mock_run): + collection = CollectionFactory(workflow_status=WorkflowStatusChoices.CURATED) + + index_collection_to_test(collection.id) + + collection.refresh_from_db() + assert collection.workflow_status == WorkflowStatusChoices.INDEXING_FAILED_ON_TEST + mock_run.assert_not_called() + + @patch("sde_collections.tasks.run_index_task", return_value="arn:aws:ecs:task/2") + @patch("sde_collections.tasks.export_curated_to_s3", return_value=10) + def test_prod_dispatch_remembers_entering_qc_status(self, mock_export, mock_run): + collection = CollectionFactory(workflow_status=WorkflowStatusChoices.QUALITY_CHECK_MINOR) + + index_collection_to_prod(collection.id) + + dispatch = IndexDispatch.objects.get(collection=collection) + assert dispatch.target == "prod" + assert dispatch.previous_workflow_status == WorkflowStatusChoices.QUALITY_CHECK_MINOR + collection.refresh_from_db() + assert collection.workflow_status == WorkflowStatusChoices.PRODUCTION_INDEXING + + +def _dispatched(collection, target, previous, run_id="run-1"): + return IndexDispatch.objects.create( + collection=collection, + run_id=run_id, + target=target, + task_arn="arn:aws:ecs:task/x", + previous_workflow_status=previous, + ) + + +@pytest.mark.django_db +class TestPollIndexRuns: + @patch("sde_collections.tasks.send_indexing_validation_report") + @patch("sde_collections.tasks.fetch_validation_report", return_value={"count_matches": True}) + @patch("sde_collections.tasks.fetch_run_status", return_value={"state": "succeeded"}) + def test_test_success_stays_and_posts_validation_once(self, mock_status, mock_validation, mock_slack): + collection = CollectionFactory(workflow_status=WorkflowStatusChoices.TEST_INDEXING) + dispatch = _dispatched(collection, "test", WorkflowStatusChoices.CURATED) + + poll_index_runs() + poll_index_runs() # resolved dispatches are never polled again + + collection.refresh_from_db() + assert collection.workflow_status == WorkflowStatusChoices.TEST_INDEXING + mock_slack.assert_called_once_with(collection.name, dispatch.run_id, {"count_matches": True}) + dispatch.refresh_from_db() + assert dispatch.completed_at is not None + + @pytest.mark.parametrize( + "entered_with,expected", + [ + (WorkflowStatusChoices.QUALITY_CHECK_PERFECT, WorkflowStatusChoices.PROD_PERFECT), + (WorkflowStatusChoices.QUALITY_CHECK_MINOR, WorkflowStatusChoices.PROD_MINOR), + ], + ) + @patch("sde_collections.tasks.fetch_run_status", return_value={"state": "succeeded"}) + def test_prod_success_mirrors_entering_qc_status(self, mock_status, entered_with, expected): + collection = CollectionFactory(workflow_status=WorkflowStatusChoices.PRODUCTION_INDEXING) + _dispatched(collection, "prod", entered_with) + + poll_index_runs() + + collection.refresh_from_db() + assert collection.workflow_status == expected + + @pytest.mark.parametrize("state", ["failed", "needs_confirmation", "something_new"]) + @patch("sde_collections.tasks.fetch_run_status") + def test_failed_and_unknown_states_land_on_failed_status(self, mock_status, state): + mock_status.return_value = {"state": state, "error": "deletion_threshold_exceeded"} + collection = CollectionFactory(workflow_status=WorkflowStatusChoices.TEST_INDEXING) + _dispatched(collection, "test", WorkflowStatusChoices.CURATED) + + poll_index_runs() + + collection.refresh_from_db() + assert collection.workflow_status == WorkflowStatusChoices.INDEXING_FAILED_ON_TEST + + @patch("sde_collections.tasks.fetch_run_status", return_value=None) + def test_in_flight_run_stays_open_until_stall_timeout(self, mock_status): + collection = CollectionFactory(workflow_status=WorkflowStatusChoices.PRODUCTION_INDEXING) + dispatch = _dispatched(collection, "prod", WorkflowStatusChoices.QUALITY_CHECK_PERFECT) + + poll_index_runs() + collection.refresh_from_db() + assert collection.workflow_status == WorkflowStatusChoices.PRODUCTION_INDEXING + + IndexDispatch.objects.filter(id=dispatch.id).update( + dispatched_at=timezone.now() - timedelta(hours=7) # default timeout is 6h + ) + poll_index_runs() + collection.refresh_from_db() + assert collection.workflow_status == WorkflowStatusChoices.INDEXING_FAILED_ON_PROD + + @patch("sde_collections.tasks.fetch_run_status", return_value=None) + def test_poller_reads_only_the_open_dispatchs_run_id(self, mock_status): + """run_id namespacing: an old (resolved) run's status.json can never satisfy a + newer dispatch — the poller only ever queries the open dispatch's run_id.""" + collection = CollectionFactory(workflow_status=WorkflowStatusChoices.TEST_INDEXING) + old = _dispatched(collection, "test", WorkflowStatusChoices.CURATED, run_id="run-old") + IndexDispatch.objects.filter(id=old.id).update(completed_at=timezone.now()) + _dispatched(collection, "test", WorkflowStatusChoices.CURATED, run_id="run-new") + + poll_index_runs() + + assert mock_status.call_args.args == (collection.config_folder, "run-new") diff --git a/sde_collections/utils/slack_utils.py b/sde_collections/utils/slack_utils.py index f1f84026..8e80cb79 100644 --- a/sde_collections/utils/slack_utils.py +++ b/sde_collections/utils/slack_utils.py @@ -114,6 +114,30 @@ def send_detailed_import_notification( print(f"Error sending Slack message: {response.text}") +def send_indexing_validation_report(collection_name, run_id, validation): + """Post the indexer-produced validation.json (WORKFLOW.md steps 22-25 QC report) to + the curation channel so the curator can set the QC status from it.""" + if validation is None: + message = ( + f"Test indexing of '{collection_name}' succeeded (run {run_id}), " + f"but no validation report was found." + ) + else: + missing = validation.get("titles_missing_in_index") or [] + extra = validation.get("titles_only_in_index") or [] + message = ( + f"Test indexing of '{collection_name}' succeeded (run {run_id}). QC report:\n" + f"Expected documents: {validation.get('expected_count')}\n" + f"Indexed documents: {validation.get('indexed_count')}\n" + f"Counts match: {validation.get('count_matches')}\n" + f"Title match rate: {validation.get('title_match_rate')}\n" + f"Titles missing from index: {len(missing)}\n" + f"Titles only in index: {len(extra)}\n" + f"Please review and set the QC status." + ) + send_slack_message(message) + + def send_slack_message(message): webhook_url = settings.SLACK_WEBHOOK_URL payload = {"text": message} From a3a1ab45da96fd1df4d3ab9aaa936998581dfaaf Mon Sep 17 00:00:00 2001 From: Bernard Benson Date: Thu, 13 Aug 2026 16:53:56 -0500 Subject: [PATCH 10/20] update on Phase 7 with shared AWS account IDs --- IMPLEMENTATION_PLAN.md | 55 ++++++++++++++++++++++++++++++------------ 1 file changed, 39 insertions(+), 16 deletions(-) diff --git a/IMPLEMENTATION_PLAN.md b/IMPLEMENTATION_PLAN.md index 3a58ebfa..3e2e438a 100644 --- a/IMPLEMENTATION_PLAN.md +++ b/IMPLEMENTATION_PLAN.md @@ -721,7 +721,9 @@ independent of COSMOS and is exercised from its own CLI against hand-written exp document_count, exported_at, cosmos_workflow_status}`. The indexer verifies line count against `document_count` and skips deletions on mismatch, so the count must be exact. -2. **Dispatch.** Assume **`CosmosIndexingDispatchRole-{env}`** (cross-account), then `ecs:RunTask` +2. **Dispatch.** Assume **`CosmosIndexingDispatchRole-{env}`** (same-account in dev — see + "Cross-repo status" below; the assume-role indirection is kept so test/prod can be genuinely + cross-account later), then `ecs:RunTask` with a **command override**: `--source WEB_COSMOS --collection {config_folder} --target test|prod --run-id {run_id}`. (Not container-env overrides — the earlier `COLLECTION_ID`/`TARGET` sketch is superseded. Target→endpoint resolution is tier-capped on the @@ -778,14 +780,39 @@ timeout (measured from `dispatched_at`) → `INDEXING_FAILED_ON_TEST` / `INDEXIN The `run_id` namespacing means an old run's `status.json` can never satisfy a newer dispatch — no `LastModified` freshness rule needed (unlike the P4 crawler contract). -### Cross-repo blockers (hand these over early — they gate the closed loop, not the coding) - -- [ ] **Give the `sde-api-scrapers` team the COSMOS AWS account id** (per environment). - `settings.COSMOS_AWS_ACCOUNT_ID` is empty there, and until it is filled the cross-account - bucket policy and `CosmosIndexingDispatchRole` are deliberately **not synthesized** — - dispatch cannot work. One dict entry + redeploy on their side; nothing else changes. -- [ ] Indexer stacks deployed to dev and the AOSS data-access policy granted (their OOB.2), plus - `version` added as `keyword` to live `sde-web` before cutover (their OOB.1). +### Cross-repo status (updated 2026-08-13 from their tracker's "Next Steps" — NS numbering is theirs) + +> **Correction: there is no cross-account boundary in dev.** Verified by the indexer team against +> AWS: the COSMOS Django host (`i-02b3d3e1ac0671952`, instance profile `indexing-helper-role`), the +> crawler, the indexer stacks, and the web AOSS collection all live in account **998871305517**. +> The earlier blocker "give them the COSMOS account id" had no unknown in it — the dev answer is +> the account both repos already deploy into. The assume-role indirection stays anyway (dispatch.py +> is unchanged), so test/prod can move to a genuinely separate account later. Test/prod account ids +> remain unknown but block nothing until those tiers exist (their NS.5). + +- [ ] **NS.1 (their side):** fill `COSMOS_AWS_ACCOUNT_ID[DEV] = "998871305517"` — this is what makes + their CDK synthesize the `sde-cosmos-indexing-dev` bucket policy and + `CosmosIndexingDispatchRole-dev`. They will also narrow the role's trust from + `AccountPrincipal` to `ArnPrincipal(...role/indexing-helper-role)` — **which means COSMOS's + host role `indexing-helper-role` needs `sts:AssumeRole` on the dispatch role in its identity + policy** (a COSMOS deploy-time item; fold into P9's preflight). +- [ ] **NS.2 (their side):** deploy the `web-indexing` branch stacks to dev (nothing from the branch + exists in AWS yet — bucket/role/task-family absence re-confirmed by both teams 2026-08-13). +- [ ] **NS.3 (their side → our env):** they send the Fargate network values (their cluster uses the + default VPC, so it's a lookup, not code). On receipt, set in COSMOS dev env: + `INDEXING_SUBNETS`, `INDEXING_SECURITY_GROUPS`, plus the known values + `SDE_INDEX_BUCKET=sde-cosmos-indexing-dev`, `INDEXING_ECS_CLUSTER=api-scrapers-cluster-dev`, + `INDEXING_TASK_FAMILY=web_cosmos-scraper-dev`, + `INDEXING_DISPATCH_ROLE_ARN=arn:aws:iam::998871305517:role/CosmosIndexingDispatchRole-dev`. +- [ ] **NS.4 (our side): commit Phase 7.** Their tracker flags our indexing work as complete but + uncommitted — "the closed loop is unreviewable until it lands." +- [x] **Contract verified by the indexer team (2026-08-13)** — they read our `export.py` against + their `cosmos_source.py`/`web_processor.py`: manifest fields, JSONL names, label resolution, + `tdamm_tag`/`is_metadata_viewer` handling all match. *"Nothing to renegotiate."* +- [x] AOSS data-access policy for dev (their OOB.2) — **already satisfied**: the existing + `sde-services-access` policy's `index/sde-binary/sde-*` wildcard covers `sde-web-copy`, with + `ApiScraperTaskRole-dev` as principal. `version: keyword` is already mapped on `sde-web-copy` + (431,363 docs); their OOB.1 (`version` on live `sde-web`) is **cutover-only**. - [ ] **Cutover awareness:** flipping the indexer's `WEB_INDEX_NAME` from `sde-web-copy` to `sde-web` *is* the production cutover; COSMOS needs no change for it. Their open id-scheme-collision finding (12 collections, incl. 100% of `gcn_circulars`) is an @@ -808,12 +835,8 @@ completes a newer dispatch. - [x] `QC_PERFECT`/`QC_MINOR` dispatches a prod run and lands on `PROD_PERFECT`/`PROD_MINOR` - [x] Failure/stall paths land on `INDEXING_FAILED_ON_TEST`/`INDEXING_FAILED_ON_PROD` - [ ] Closed loop verified against dev (their E2E.10): Curated → export → `RunTask` → poller → Slack - *(blocked cross-repo, checked 2026-08-13: `api-scrapers-cluster-dev` is ACTIVE, but - `sde-cosmos-indexing-dev`, `CosmosIndexingDispatchRole-dev`, and the `web_cosmos-scraper-dev` - task family do not exist — the web-indexing branch is undeployed and `COSMOS_AWS_ACCOUNT_ID` - is unfilled on their side. Also hand them our subnet/SG needs: Fargate `RunTask` requires - `networkConfiguration`, so COSMOS needs `INDEXING_SUBNETS`/`INDEXING_SECURITY_GROUPS` values - from their VPC stack)* + *(gated on their NS.1 + NS.2 + NS.3 — see "Cross-repo status" above. All implementation on + both sides is done; what remains is their dev deploy plus env values on ours)* --- @@ -852,7 +875,7 @@ clean host needs dummy Sinequa secrets to boot. | File | Content | |---|---| -| `sde_collections/management/commands/validate_deploy_env.py` | **New.** Fails if required settings are missing. Once P7 lands, it must also require the indexing settings (`SDE_INDEX_BUCKET`, `INDEXING_ECS_CLUSTER`, `INDEXING_TASK_FAMILY`, `INDEXING_DISPATCH_ROLE_ARN`) non-empty on deployed hosts. (Test/prod endpoint separation is enforced **indexer-side** — its target→endpoint resolution is tier-capped — so COSMOS has no endpoint-equality check to make) | +| `sde_collections/management/commands/validate_deploy_env.py` | **New.** Fails if required settings are missing. Once P7 lands, it must also require the indexing settings (`SDE_INDEX_BUCKET`, `INDEXING_ECS_CLUSTER`, `INDEXING_TASK_FAMILY`, `INDEXING_DISPATCH_ROLE_ARN`, and the Fargate networking pair `INDEXING_SUBNETS`/`INDEXING_SECURITY_GROUPS`) non-empty on deployed hosts. (Test/prod endpoint separation is enforced **indexer-side** — its target→endpoint resolution is tier-capped — so COSMOS has no endpoint-equality check to make) | | `sde_collections/management/commands/preflight_aws.py` | **New.** SSM reachability to the crawler instance and S3 read on `SDE_S3_BUCKET`, using `get_boto3_session()` from P0. Reports each check independently rather than aborting on the first failure. P7 adds checks on `SDE_INDEX_BUCKET` (write `curated_collections/*`, read `index_runs/*`) and an `sts:AssumeRole` on the dispatch role; COSMOS never gets AOSS/SageMaker access, so no such checks exist here | | `config/urls.py` + a `healthz` view | **New.** There is **no health endpoint in the repo today**; the deploy smoke checks need one. Minimal 200 + DB connectivity, unauthenticated | | `.pre-commit-config.yaml` | **Fix:** the gitleaks hook passes `--config=gitleaks-config.toml`, but that file does not exist and is not tracked — the hook fails instead of scanning. Add the config or drop the arg | From 20c919ed0ccb932144da3e3d1325ddfa676678d5 Mon Sep 17 00:00:00 2001 From: Bernard Benson Date: Fri, 14 Aug 2026 11:31:42 -0500 Subject: [PATCH 11/20] implementation plan and bug fixees --- IMPLEMENTATION_PLAN.md | 6 +- LOCAL_VERIFICATION_GUIDE.md | 671 ++++++++++++++++++ config/settings/test.py | 16 + sde_collections/indexing/dispatch.py | 4 + .../tests/test_indexing_dispatch.py | 3 + 5 files changed, 697 insertions(+), 3 deletions(-) create mode 100644 LOCAL_VERIFICATION_GUIDE.md diff --git a/IMPLEMENTATION_PLAN.md b/IMPLEMENTATION_PLAN.md index 3e2e438a..dad17354 100644 --- a/IMPLEMENTATION_PLAN.md +++ b/IMPLEMENTATION_PLAN.md @@ -46,7 +46,7 @@ inference pipeline dormant, and a repeatable deploy path. |---|---| | **Reindexing (re-scrape) flow** | `create_configs_on_status_change` has a second, `reindexing_status`-keyed block (`REINDEXING_FINISHED_ON_DEV → fetch_full_text`, `REINDEXING_CURATED → promote_to_curated`) that the original plan didn't account for — P6 deletes `fetch_full_text`, which would sever re-scrapes. **Rewire it onto the same dispatch/poll path**: dispatch on `REINDEXING_NEEDED_ON_DEV` (P3), poll it (P4), ingest flips to `REINDEXING_FINISHED_ON_DEV`, and the migrate task's existing `→ REINDEXING_READY_FOR_CURATION` transition takes over. Keep `REINDEXING_CURATED → promote_to_curated`. | | **Dispatch record & result freshness** | S3 objects persist between runs, so on any re-dispatch the poller would instantly "complete" against the **previous run's** output, and the stall timeout has nothing to measure from. Add a small **`ScrapeDispatch`** model (P3): `collection` FK, `dispatched_at`, `ssm_command_id`. `results_ready()` requires the S3 summary's `LastModified > dispatched_at`; the stall timeout is measured from `dispatched_at`. | -| **Web indexing pipeline: `WEB_COSMOS` in `sde-api-scrapers`, event-triggered** *(updated 2026-08-13 from the built `web-indexing` branch — supersedes the earlier separate-repo / container-env / `describe_tasks` sketch)* | The pipeline is a **`WEB_COSMOS` source inside `sde-api-scrapers`** (ECS Fargate: chunk → SageMaker vectorize → AOSS bulk upsert, `uploader/` reused with parameterized `chunk_field`/filtered scans; `schedule=None` in every env — fired only by COSMOS, per collection, the moment curation completes via the P5 triggers: `CURATED` → test, `QC_PERFECT`/`QC_MINOR` → prod). The hand-off is **S3 both ways** through a dedicated bucket `sde-cosmos-indexing-{env}`: COSMOS exports `CuratedUrl`s as `documents.jsonl` + `manifest.json` (manifest written **last** = export complete) under `curated_collections/{config_folder}/{run_id}/`, then assumes `CosmosIndexingDispatchRole-{env}` and calls `ecs:RunTask` with a **command override** (`--source WEB_COSMOS --collection --target test\|prod --run-id `). Completion is observed by **polling S3 `index_runs/{config_folder}/{run_id}/status.json`** (written by the indexer last and unconditionally, incl. on failure) — **not** `ecs.describe_tasks`; an **`IndexDispatch`** record (`collection`, `run_id`, `target`, `task_arn`, `dispatched_at`) provides the stall timeout, and the COSMOS-minted `run_id` namespaces every artifact, so no `LastModified` freshness rule is needed. No callback endpoint into COSMOS. | +| **Web indexing pipeline: `WEB_COSMOS` in `sde-api-scrapers`, event-triggered** *(updated 2026-08-13 from the built `web-indexing` branch — supersedes the earlier separate-repo / container-env / `describe_tasks` sketch)* | The pipeline is a **`WEB_COSMOS` source inside `sde-api-scrapers`** (ECS Fargate: chunk → SageMaker vectorize → AOSS bulk upsert, `uploader/` reused with parameterized `chunk_field`/filtered scans; `schedule=None` in every env — fired only by COSMOS, per collection, the moment curation completes via the P5 triggers: `CURATED` → test, `QC_PERFECT`/`QC_MINOR` → prod). The hand-off is **S3 both ways** through a dedicated bucket `sde-cosmos-indexing-{env}`: COSMOS exports `CuratedUrl`s as `documents.jsonl` + `manifest.json` (manifest written **last** = export complete) under `curated_collections/{config_folder}/{run_id}/`, then assumes `CosmosIndexingDispatchRole-{env}` and calls `ecs:RunTask` with a **command override** (`python3 api_scraper.py --source WEB_COSMOS --collection --target test\|prod --run-id ` — the executable must lead: an ECS override replaces the task definition's command wholesale and the indexer image has no ENTRYPOINT). Completion is observed by **polling S3 `index_runs/{config_folder}/{run_id}/status.json`** (written by the indexer last and unconditionally, incl. on failure) — **not** `ecs.describe_tasks`; an **`IndexDispatch`** record (`collection`, `run_id`, `target`, `task_arn`, `dispatched_at`) provides the stall timeout, and the COSMOS-minted `run_id` namespaces every artifact, so no `LastModified` freshness rule is needed. No callback endpoint into COSMOS. | ### Hard constraints @@ -598,7 +598,7 @@ These stubs are the **event-trigger seam for the `WEB_COSMOS` pipeline** (built `sde-api-scrapers`, branch `web-indexing` — see the decisions table). Phase 7 turns them into export-then-dispatch tasks: mint a `run_id`, export the curated set to S3 (`documents.jsonl` + `manifest.json`, manifest last), assume the dispatch role, and `ecs:RunTask` -with a command override (`--source WEB_COSMOS --collection --target test|prod +with a command override (`python3 api_scraper.py --source WEB_COSMOS --collection --target test|prod --run-id `) — they never index in-process. This is what replaces the api pipeline's EventBridge schedule: indexing runs as soon as a collection is curated, not on a timer. @@ -724,7 +724,7 @@ independent of COSMOS and is exercised from its own CLI against hand-written exp 2. **Dispatch.** Assume **`CosmosIndexingDispatchRole-{env}`** (same-account in dev — see "Cross-repo status" below; the assume-role indirection is kept so test/prod can be genuinely cross-account later), then `ecs:RunTask` - with a **command override**: `--source WEB_COSMOS --collection {config_folder} + with a **command override**: `python3 api_scraper.py --source WEB_COSMOS --collection {config_folder} --target test|prod --run-id {run_id}`. (Not container-env overrides — the earlier `COLLECTION_ID`/`TARGET` sketch is superseded. Target→endpoint resolution is tier-capped on the indexer side, so a dev dispatch can never reach prod AOSS.) diff --git a/LOCAL_VERIFICATION_GUIDE.md b/LOCAL_VERIFICATION_GUIDE.md new file mode 100644 index 00000000..629f705a --- /dev/null +++ b/LOCAL_VERIFICATION_GUIDE.md @@ -0,0 +1,671 @@ +# COSMOS Local Verification Guide — Phases 0–7 + +This guide verifies the rewired COSMOS pipeline (branch `cosmos-rewiring`, Phases 0–7 of +[`IMPLEMENTATION_PLAN.md`](./IMPLEMENTATION_PLAN.md)) by **walking one real collection through the +entire workflow on your machine**: *Aurorasaurus — Reporting Auroras from the Ground Up* +(`config_folder: aurorasaurus_reporting_auroras_from_the_ground_up`). + +Why this collection: the crawl4ai scraper **already crawled it for real** — its output (25 +documents from `aurorasaurus.org`) sits in the dev S3 bucket. That lets the demo ingest *genuine +scraped data* through the *genuine production code path*, no mocks. Only one thing stays +simulated: the WEB_COSMOS indexer's responses, because its AWS stacks (`sde-cosmos-indexing-dev`) +are not deployed yet. + +Each step of the walkthrough has the same shape: + +- **Where we are** — what this hop means in the curation workflow, and which phase built it. +- **Do this** — exact commands / clicks. +- **Expect this** — the observed outcome (this walkthrough was executed successfully on + 2026-08-14; every expected output below is what actually happened). +- **Phase tests** — the pytest suite that locks the behavior in. + +*No dev-AWS access?* Appendix A has a fully-offline variant of the ingest using mocked S3. + +--- + +## The workflow you are about to walk + +``` +Research in Progress + │ curator finishes research, sets… + ▼ +Ready for Engineering ──────► COSMOS builds a job JSON and SSM-sends it (Phase 3) + │ to the crawl4ai crawler on EC2 + ▼ + [crawler runs; writes results + a completion summary to S3] + │ + ▼ +Scraping Successful ────────► COSMOS polls S3, ingests documents into (Phase 4) + │ DumpUrls, then migrates them to DeltaUrls + ▼ (inference is dormant — Phase 2 — so the +Ready for Curation migration runs immediately) + │ curator reviews/edits the deltas in the UI, sets… + ▼ +Curated ────────────────────► promote_to_curated(): deltas become (Phase 5) + │ CuratedUrls; COSMOS exports them to S3 and + ▼ fires the WEB_COSMOS indexer (test target) (Phase 7) +Test Indexing ──────────────► poller reads the indexer's status.json; + │ validation report posts to Slack + │ curator QCs the test index, sets… + ▼ +QC: Perfect / QC: Minor ────► same hand-off, prod target (Phase 7) + ▼ +Production Indexing ────────► poller resolves; final status mirrors QC: + ▼ +Prod: Perfect / Prod: Minor Issues ← the finish line +``` + +Failure at any dispatch/poll lands on a red status (**Scraping Failed**, **Indexing Failed on +Test/Prod**) instead of raising — which this guide uses deliberately: with the indexer's AWS +settings blank, its two dispatch hops fail *gracefully*, and that graceful failure is itself the +proof the trigger fired. Phase 0 supplies the shared settings/credentials plumbing, Phase 1 the +six new statuses, Phase 6 removed the old Sinequa machinery entirely. + +--- + +## 0. Setup + +### Prerequisites + +- Docker Desktop running. +- Repo on branch `cosmos-rewiring`. +- A local database restored from production (the Aurorasaurus collection must exist — checked in + Step A below). +- For the real-S3 ingest: `aws sso login --profile sde-dev` (account 998871305517). Everything + else works without it. + +### Environment — `.envs/.local/.django` + +All pipeline vars already exist in this file. For this walkthrough the AWS-facing ones stay +**blank** and the pollers **off**: + +| Var | Value | Why | +|---|---|---| +| `SLACK_WEBHOOK_URL` | any non-empty dummy, e.g. `http://localhost/dummy` | **Required to boot** (no default). Dummy → every Slack post prints a caught error and continues. Real webhook → messages actually post on every status change. | +| `SDE_S3_BUCKET`, `CRAWLER_INSTANCE_ID` | blank | The scrape-dispatch hop then fails gracefully (Step 3's wiring proof). The real bucket is injected per-command in Step 4, not set here. | +| `SDE_INDEX_BUCKET`, `INDEXING_*` | blank (keep `INDEXING_CONTAINER_NAME` default) | The indexing hops fail gracefully (Steps 5 & 7) — correct until the indexer's stacks deploy. | +| `SCRAPE_POLL_ENABLED`, `INDEX_POLL_ENABLED`, `INFERENCE_ENABLED` | `False` | With blank buckets the pollers would only log S3 errors every 2–5 min; the inference-off state is itself verified in Step 2. | +| `SDE_AWS_ACCESS_KEY_ID`, `SDE_AWS_SECRET_ACCESS_KEY` | blank | Keeps `get_boto3_session()` on the default credential chain — which is exactly how Step 4 injects short-lived SSO credentials. | + +### Build and start + +```bash +docker-compose -f local.yml build +docker-compose -f local.yml up -d # django, postgres, redis, celeryworker, celerybeat, flower +docker-compose -f local.yml run --rm django python manage.py createsuperuser # first time only +``` + +Migrations run automatically on startup. Confirm the rewiring migrations are in: + +```bash +docker-compose -f local.yml run --rm django python manage.py showmigrations sde_collections | tail -3 +# [X] 0078_alter_collection_workflow_status_and_more ← statuses 21–26 (Phase 1) +# [X] 0079_scraperconfigoverride_scrapedispatch ← Phase 3 models +# [X] 0080_indexdispatch ← Phase 7 model +``` + +### URLs + +> **Gotcha:** the django log says `Starting development server at http://0.0.0.0:8000/` — that is +> the address *inside the container*. On your host the app is on **8001** (`local.yml` maps +> `8001:8000`; host port 8000 usually belongs to the inference API, which answers +> `{"detail": "Not Found"}` if you hit it by mistake). First visit redirects to the login page — +> sign in with your superuser. + +| What | URL | +|---|---| +| Collection list (main UI) | `http://localhost:8001/` | +| Collection detail | `http://localhost:8001//` | +| Django admin | `http://localhost:8001/admin/` | +| Flower (Celery monitor) | `http://localhost:5555/` | + +### Running the tests + +> **Important — test isolation from the live worker:** `config/settings/test.py` forces +> `CELERY_BROKER_URL=memory://` (both the setting *and* the env var — Celery gives the env var +> precedence). Without it, tests that change workflow statuses publish real task messages onto +> the same Redis your celeryworker consumes, and the worker executes them against your **local +> database** — test-DB collection ids can collide with real rows and silently flip their +> statuses. If you ever see a burst of `dispatch_scrape_job` / `DoesNotExist` noise in the +> worker log right after a pytest run, check that override is still in place. + +```bash +# Everything in sde_collections (expect: 308 passed): +docker-compose -f local.yml run --rm django pytest sde_collections/tests/ + +# Just the rewiring suites (expect: 129 passed = 4 + 74 + 7 + 10 + 15 + 19): +docker-compose -f local.yml run --rm django pytest \ + sde_collections/tests/test_aws_utils.py \ + sde_collections/tests/test_workflow_status_triggers.py \ + sde_collections/tests/test_inference_flag.py \ + sde_collections/tests/test_scrape_dispatch.py \ + sde_collections/tests/test_scrape_ingest.py \ + sde_collections/tests/test_indexing_dispatch.py +``` + +### Shell for the paste-in snippets + +Every Python snippet below runs in: + +```bash +docker-compose -f local.yml run --rm django python manage.py shell_plus +``` + +--- + +## Step A — Meet the demo collection (baseline) + +**Where we are.** Before touching anything, establish what exists: the collection in your local +DB, and its finished crawl in the dev S3 bucket. + +**Do this** — in `shell_plus`: + +```python +from sde_collections.models.collection import Collection +c = Collection.objects.get(config_folder="aurorasaurus_reporting_auroras_from_the_ground_up") +print(c.id, "|", c.name) +print("status:", c.get_workflow_status_display()) +print("dump:", c.dump_urls.count(), "| delta:", c.delta_urls.count(), "| curated:", c.curated_urls.count()) +``` + +**Expect this:** the collection exists (id `1431` on the 2026-08 restore) with **25 curated +URLs** — it has been through curation before, which makes the Step 4 diff meaningful. Its status +may be anything; the walkthrough sets what it needs at each step, and the whole run is +**repeatable** (re-ingesting replaces dumps and re-diffs; nothing accumulates). + +And, if you have `sde-dev` access, confirm the crawl output (the completion marker is the +`_failures_summary.json` — the crawler writes it only at the end of a completed run): + +```bash +aws s3 ls s3://sdecrawlerstack-crawlbucket0d63eba8-lhkxqnh8ophy/scraped_collections/ --profile sde-dev | grep aurorasaurus +aws s3 ls s3://sdecrawlerstack-crawlbucket0d63eba8-lhkxqnh8ophy/failure_logs/ --profile sde-dev | grep aurorasaurus +# aurorasaurus_reporting_auroras_from_the_ground_up.json (25 documents, 2026-08-13) +# aurorasaurus_reporting_auroras_from_the_ground_up_failures_summary.json (the completion marker) +``` + +--- + +## Step 0 — Foundations hold (Phase 0) + +**Where we are.** Phase 0 added the `SDE_*` settings block (every var with a safe default) and +`get_boto3_session()` — the single credential entry point for all pipeline AWS code: explicit +`SDE_AWS_*` keys if both are set, otherwise the default chain (instance role in AWS, env vars +locally). The fact that your stack booted with everything blank *is* the core guarantee. + +**Do this / expect this:** + +```bash +docker-compose -f local.yml run --rm django python manage.py check +# → "System check identified no issues" +``` + +```python +from django.conf import settings +from sde_collections.utils.aws import get_boto3_session +s = get_boto3_session() +print(s.region_name) # → us-east-1 +print(bool(settings.SDE_AWS_ACCESS_KEY_ID)) # → False — default-chain branch taken +``` + +**Phase tests** — expect `4 passed`: + +```bash +docker-compose -f local.yml run --rm django pytest sde_collections/tests/test_aws_utils.py -v +``` + +--- + +## Step 1 — The status vocabulary (Phase 1) + +**Where we are.** The workflow diagram above needs six statuses that didn't exist before: +`Scraping Successful` (21), `Test Indexing` (22), `Scraping Failed` (23), `Indexing Failed on +Test` (24), `Indexing Failed on Prod` (25), `Production Indexing` (26). Phase 1 added them, +fixed both colour maps to never `KeyError` on an unmapped status, and made failure statuses +render **red** instead of neutral. + +**Do this** — at `http://localhost:8001/`, find *Aurorasaurus — Reporting Auroras from the Ground +Up* in the list (search box helps): + +1. Open its **workflow status dropdown** — all 26 statuses are listed; the filter panel shows + them too. +2. Open its detail page → **Workflow History** tab. Every transition the walkthrough makes from + here on will appear in this tab — check back after each step. + +**Expect this:** dropdown renders with no JS console errors; failure statuses show as red +buttons (`btn-danger`). + +**Spot-check in shell:** + +```python +from sde_collections.models.collection_choice_fields import WorkflowStatusChoices +from sde_collections.models.collection import Collection +print(len(WorkflowStatusChoices.choices)) # → 26 +c = Collection(workflow_status=WorkflowStatusChoices.SCRAPING_FAILED) +print(c.workflow_status_button_color) # → btn-danger +``` + +**Phase tests** — expect `74 passed` (parametrized over every status × both colour maps; also +covers the Phase 5 trigger table): + +```bash +docker-compose -f local.yml run --rm django pytest sde_collections/tests/test_workflow_status_triggers.py -v +``` + +--- + +## Step 2 — Inference is dormant, not dead (Phase 2) + +**Where we are.** The old pipeline routed three hard-coded TDAMM collections through an ML +inference job between scraping and curation. That pipeline is now gated off +(`INFERENCE_ENABLED=False`): `queue_necessary_classifications()` short-circuits straight to the +delta migration for *every* collection. This matters for Step 4 — it's why the ingest reaches +*Ready for Curation* in seconds instead of stranding behind a queued inference job that never +runs. + +**Do this / expect this:** + +```python +from django_celery_beat.models import PeriodicTask +print(list(PeriodicTask.objects.filter(task__startswith="inference").values("name", "enabled"))) +# → both rows enabled=False +``` + +The disable is durable: re-running `manage.py migrate` re-asserts `enabled` from the flag (the +`post_migrate` signal owns these rows — a hand-edit in the admin does not survive a deploy, by +design). Optionally watch `docker-compose -f local.yml logs -f celerybeat` — no inference ticks. + +**Phase tests** — expect `7 passed`: + +```bash +docker-compose -f local.yml run --rm django pytest sde_collections/tests/test_inference_flag.py -v +``` + +--- + +## Step 3 — Requesting a scrape (Phase 3) + +**Where we are.** In production, a curator sets **Ready for Engineering** and COSMOS reacts: +`build_job_json()` merges the collection's seed URL with any per-collection +`ScraperConfigOverride` (only non-null fields are emitted — the crawler supplies its own +defaults), and `send_job_to_crawler()` drops the JSON into the crawler's inbox on EC2 via SSM, +recording a `ScrapeDispatch` row (the poller's freshness reference). For Aurorasaurus **this +already happened** — the Aug-13 crawl in the bucket *is* the output of this hop. So locally we +verify the machinery two ways: the job-builder logic in the shell, and the trigger via its +graceful failure path. + +**Do this (1) — job-builder spot-checks:** + +```python +from sde_collections.models.collection import Collection +from sde_collections.models.scraper_config import ScraperConfigOverride +from sde_collections.scraping.job_builder import build_job_json + +c = Collection.objects.get(config_folder="aurorasaurus_reporting_auroras_from_the_ground_up") +print(build_job_json(c)) +# → {"seed": "https://aurorasaurus.org/", "collection_id": "aurorasaurus_reporting_auroras_from_the_ground_up"} + +ScraperConfigOverride.objects.update_or_create(collection=c, defaults={"max_pages": 25, "delay": None}) +print(build_job_json(c)) +# → adds "max_pages": 25; "delay" ABSENT (null overrides are never emitted) +# (max_pages=25 is exactly the override the real Aug-13 crawl ran with — see its summary) + +ScraperConfigOverride.objects.filter(collection=c).update(max_pages=200_000) +try: + build_job_json(c) +except ValueError as e: + print("cap enforced:", e) # → the crawler rejects >100_000, so COSMOS refuses to send it + +ScraperConfigOverride.objects.filter(collection=c).delete() # clean up +``` + +**Do this (2) — the trigger, via its failure path.** In the UI set the collection to +**Ready for Engineering**, then watch: + +```bash +docker-compose -f local.yml logs -f celeryworker +``` + +**Expect this:** within seconds — +`Scrape dispatch failed for aurorasaurus_reporting_auroras_from_the_ground_up: Unable to locate credentials` +and the status flips to **Scraping Failed** (red). That failure *is* the proof: the trigger +fired, the SSM call was attempted, and the error path held (no exception escaped, no +`ScrapeDispatch` row recorded — check Admin → **Scrape dispatches**, a read-only list). With +real crawler settings this same click lands a job JSON in `/opt/sde-crawler/jobs/incoming/`. + +Also verifiable: Admin → **Scraper config overrides** is the curator-facing override editor, and +`manage.py dispatch_scrape --collection ` is the manual CLI re-dispatch (same code path; +locally it exits with a `CommandError` after marking *Scraping Failed* — expected). + +**Phase tests** — expect `10 passed`: + +```bash +docker-compose -f local.yml run --rm django pytest sde_collections/tests/test_scrape_dispatch.py -v +``` + +--- + +## Step 4 — Ingesting the real crawl (Phase 4) ★ the centerpiece + +**Where we are.** In production, `poll_scrape_jobs` (a beat task, every 5 min) notices the fresh +completion summary in S3 and enqueues `ingest_scraped_collection`, which: + +1. **claims** the collection with an atomic compare-and-swap + (*Ready for Engineering / Engineering in Progress → Scraping Successful*) so two ingests can + never write concurrently; +2. replaces its `DumpUrl`s with the scraped documents; +3. hands off to the delta migration, which diffs the new dump against the existing `CuratedUrl`s + and promotes the status to **Ready for Curation**. + +We run exactly that path — real S3, real documents, `claim=True` — injecting your short-lived +SSO credentials and the real bucket into a one-shot container (the env file stays untouched; +`SDE_AWS_*` stay blank so the default chain picks up the session token). + +**Do this** — from the repo root, after `aws sso login --profile sde-dev`: + +```bash +eval "$(aws configure export-credentials --profile sde-dev --format env)" +docker-compose -f local.yml run --rm \ + -e AWS_ACCESS_KEY_ID -e AWS_SECRET_ACCESS_KEY -e AWS_SESSION_TOKEN \ + -e SDE_S3_BUCKET=sdecrawlerstack-crawlbucket0d63eba8-lhkxqnh8ophy \ + django python manage.py shell -c " +from sde_collections.models.collection import Collection +from sde_collections.models.collection_choice_fields import WorkflowStatusChoices +from sde_collections.tasks import ingest_scraped_collection + +c = Collection.objects.get(config_folder='aurorasaurus_reporting_auroras_from_the_ground_up') +c.workflow_status = WorkflowStatusChoices.ENGINEERING_IN_PROGRESS # claimable; no trigger +c.save() + +print(ingest_scraped_collection(c.id)) # claim=True: the full production path +c.refresh_from_db() +print('status:', c.get_workflow_status_display()) +print('dump_urls:', c.dump_urls.count()) +" +``` + +**Expect this** (observed on the 2026-08-14 run): + +``` +Ingested 25 documents for aurorasaurus_reporting_auroras_from_the_ground_up (replaced 0). +status: Scraping Successful +dump_urls: 25 +``` + +The ingest ends by enqueueing the migration, which the **celeryworker** executes (no S3 needed +there). Give it a few seconds, then: + +```python +from sde_collections.models.collection import Collection +c = Collection.objects.get(config_folder="aurorasaurus_reporting_auroras_from_the_ground_up") +print(c.get_workflow_status_display()) # → Ready for Curation +print(c.dump_urls.count(), c.delta_urls.count(), c.curated_urls.count()) +``` + +**Expect this:** `Ready for Curation`, dumps `0` (cleared by the migration), curated still `25` +— and deltas **`0`**. Zero is the *correct* real-world answer here: the Aug-13 crawl matches the +already-curated set exactly, so the differ found nothing new, changed, or deleted. A re-crawl +with actual site changes would surface exactly those pages as deltas. In the worker log you'll +also see the ingest-summary Slack attempt (caught error with a dummy webhook). + +**Verify in the UI:** the collection shows **Ready for Curation**; **Workflow History** now has +*Engineering in Progress → Scraping Successful → Ready for Curation*. + +Two failure modes worth knowing (both unit-tested): a completed crawl with +`documents_scraped == 0` is marked **Scraping Failed** (an empty crawl must never silently +publish an empty collection), and stale S3 results older than the latest `ScrapeDispatch` are +invisible to the poller (re-dispatch safety). + +**Phase tests** — expect `15 passed`: + +```bash +docker-compose -f local.yml run --rm django pytest sde_collections/tests/test_scrape_ingest.py -v +``` + +--- + +## Step 5 — Curation and the hand-off to test indexing (Phase 5) + +**Where we are.** *Ready for Curation → Curated* is the human part of the workflow: curators +review the deltas (exclude URLs, fix titles, tag divisions) in the UI. Setting **Curated** fires +the rewired dispatcher (`handle_workflow_status_change`), which does two things: promotes the +deltas into `CuratedUrl`s, and fires `index_collection_to_test` — the Phase 7 hand-off. With the +indexer's settings blank, that second hop fails gracefully: the wiring proof again. + +**Do this** — in the UI (or shell), walk the collection +*Ready for Curation → Curation in Progress → Curated*. With zero deltas there is nothing to +review this time — which is itself the honest outcome — so this step is mostly about the +trigger. Watch the worker log as you set **Curated**. + +**Expect this:** + +- `CuratedUrl`s: still 25, `DeltaUrl`s: 0 (promote with an empty delta set is a no-op — the + curated data is never touched unnecessarily). +- Worker log: `Index dispatch (test) failed for aurorasaurus_…: SDE_INDEX_BUCKET is not + configured — cannot export`, and the status lands on **Indexing Failed on Test** (red). +- With the indexer deployed, this same click would export + `curated_collections/{cf}/{run_id}/documents.jsonl` + `manifest.json` to S3, `ecs:RunTask` the + WEB_COSMOS indexer, and land on **Test Indexing**. + +**Phase tests:** the trigger table lives in the same suite as Step 1 (`74 passed`); it asserts +`CURATED` promotes *and* enqueues test indexing, `QC_*` enqueues prod indexing, and no Sinequa +method is called on any transition. + +--- + +## Step 6 — Sinequa is gone (Phase 6) + +**Where we are.** Everything the old pipeline used — the Sinequa API client, XML config +generation, the GitHub configs push — was deleted outright in Phase 6. The whole walkthrough you +just did ran without any of it; this step proves the removal is total. + +**Do this / expect this:** + +```bash +ls sde_collections/sinequa_api.py config_generation default_scraper.xml 2>&1 +# → "No such file or directory" for each + +grep -ri "sinequa_api\|XmlEditor\|GitHubHandler\|PyGithub" \ + --include='*.py' --include='*.html' --include='*.js' sde_collections/ config/ +# → empty (a plain grep for "sinequa" still hits comments/help_text — historical, retained +# deliberately, plus the SourceChoices.ONLY_IN_SINEQUA_CONFIGS data value) + +docker-compose -f local.yml run --rm django python manage.py check # boots with NO Sinequa env vars +docker-compose -f local.yml run --rm django pytest sde_collections/tests/ # → 308 passed +``` + +**In the UI:** no Sinequa config link on the collection detail page; no +`import_from_sinequa` / `push_to_github` in `manage.py --help`. + +--- + +## Step 7 — The indexing hand-off, resolved (Phase 7) + +**Where we are.** Phase 7 filled the Phase 5 stubs with the real contract: mint a `run_id`, +export curated docs to `curated_collections/{cf}/{run_id}/` (manifest written **last** = export +complete), assume the cross-repo dispatch role, `ecs:RunTask` the WEB_COSMOS indexer with a +command override, record an `IndexDispatch` row, and let `poll_index_runs` (beat, every 2 min) +resolve the run by reading `index_runs/{cf}/{run_id}/status.json` from S3 — never +`ecs.describe_tasks`. The `run_id` namespacing means an old run's status can never satisfy a +newer dispatch. + +The indexer isn't deployed yet, so here we simulate **its half only** — the `status.json` +responses — while running COSMOS's poller for real. Three outcomes, continuing from +*Indexing Failed on Test*: + +**Do this** — paste into `shell_plus`: + +```python +from unittest import mock +from sde_collections.models.collection import Collection +from sde_collections.models.collection_choice_fields import WorkflowStatusChoices +from sde_collections.models.indexing import IndexDispatch +from sde_collections import tasks + +c = Collection.objects.get(config_folder="aurorasaurus_reporting_auroras_from_the_ground_up") + +# --- Outcome 1: test run SUCCEEDS → status holds at Test Indexing; the indexer-produced +# validation report (count/title QC) is posted to Slack for the curator to judge --- +c.workflow_status = WorkflowStatusChoices.TEST_INDEXING # no trigger on this status +c.save() +IndexDispatch.objects.create(collection=c, run_id="aurora-e2e-1", target="test", + task_arn="arn:demo", previous_workflow_status=WorkflowStatusChoices.CURATED) +validation = {"expected_count": 25, "indexed_count": 25, "count_matches": True, + "title_match_rate": 1.0, "titles_missing_in_index": [], "titles_only_in_index": []} +with mock.patch.object(tasks, "fetch_run_status", return_value={"state": "succeeded"}), \ + mock.patch.object(tasks, "fetch_validation_report", return_value=validation): + print(tasks.poll_index_runs()) # → "Resolved 1 index run(s)." +c.refresh_from_db() +print(c.get_workflow_status_display()) # → Test Indexing (curator now sets QC from the report) +``` + +**Now the QC trigger, for real.** In the UI (or shell) set **QC: Minor Issues** and watch the +worker: `Index dispatch (prod) failed … SDE_INDEX_BUCKET is not configured` → status +**Indexing Failed on Prod**. That's the `QC_* → index_collection_to_prod` trigger, proven the +same way as Step 5. Then resolve the prod run: + +```python +# --- Outcome 2: prod run SUCCEEDS → final status mirrors the QC status it entered with --- +c.refresh_from_db() +c.workflow_status = WorkflowStatusChoices.PRODUCTION_INDEXING +c.save() +IndexDispatch.objects.create(collection=c, run_id="aurora-e2e-2", target="prod", + task_arn="arn:demo", + previous_workflow_status=WorkflowStatusChoices.QUALITY_CHECK_MINOR) +with mock.patch.object(tasks, "fetch_run_status", return_value={"state": "succeeded"}): + print(tasks.poll_index_runs()) +c.refresh_from_db() +print(c.get_workflow_status_display()) # → Prod: Minor Issues ← THE FINISH LINE + +# --- Outcome 3 (optional): an UNKNOWN state is a failure, never a success --- +c.workflow_status = WorkflowStatusChoices.TEST_INDEXING +c.save() +IndexDispatch.objects.create(collection=c, run_id="aurora-e2e-3", target="test", + task_arn="arn:demo", previous_workflow_status=WorkflowStatusChoices.CURATED) +with mock.patch.object(tasks, "fetch_run_status", + return_value={"state": "needs_confirmation", "error": None}): + print(tasks.poll_index_runs()) +c.refresh_from_db() +print(c.get_workflow_status_display()) # → Indexing Failed on Test +``` + +**Expect this** (all three observed on the 2026-08-14 run): `Test Indexing` held with the +validation report posted (caught Slack error on a dummy webhook); `Prod: Minor Issues` as the +finish line; `Indexing Failed on Test` for the unknown state. In Admin → **Index dispatches** +the `aurora-e2e-*` rows are read-only with `completed_at` stamped. + +**Phase tests** — expect `19 passed`: + +```bash +docker-compose -f local.yml run --rm django pytest sde_collections/tests/test_indexing_dispatch.py -v +``` + +--- + +## The finish line — what you just proved + +Open the collection's **Workflow History** tab. The full journey reads: + +> … → Ready for Engineering → **Scraping Failed** *(Step 3: dispatch wiring, graceful failure)* +> → Engineering in Progress → **Scraping Successful** *(Step 4: real S3 ingest, CAS claim)* +> → **Ready for Curation** *(Step 4: migration + zero-delta diff)* +> → Curation in Progress → **Curated** *(Step 5: promote + test hand-off)* +> → **Indexing Failed on Test** *(Step 5: graceful failure = trigger proof)* +> → **Test Indexing** *(Step 7: simulated indexer success, validation posted)* +> → **QC: Minor Issues** → **Indexing Failed on Prod** *(Step 7: prod trigger proof)* +> → **Production Indexing** → **Prod: Minor Issues** *(Step 7: QC mirroring — done)* + +Everything COSMOS-side ran for real: settings/credential plumbing (P0), the status vocabulary +(P1), inference-off migration (P2), dispatch triggers and job building (P3), real-S3 ingest with +claim semantics (P4), curation triggers and promote (P5), a Sinequa-free codebase (P6), and the +export/dispatch/poll machinery (P7). The only simulated piece was the indexer's `status.json` — +the moment the `sde-api-scrapers` `web-indexing` stacks deploy (its NS.2) and the COSMOS env gets +the `INDEXING_*` values, Steps 5 and 7 stop failing gracefully and this same collection is the +natural first candidate for the fully-real closed loop. + +The walkthrough is repeatable end to end: Step 4's ingest replaces dumps and re-diffs, promote +is idempotent, and each `IndexDispatch` gets a fresh `run_id`. + +--- + +## Appendix A — Fully-offline ingest (no dev-AWS access) + +If you can't reach the dev bucket, Step 4 can run with mocked S3 instead. The only S3 read in the +ingest path is `sde_collections/scraping/s3_results.py::_get_object` — patch it with an in-memory +fake and call the task synchronously. + +> **⚠️ Use a scratch collection, never a real curated one.** The migration diffs the fake dump +> against the existing `CuratedUrl`s — on a collection with a real curated set, 5 fake documents +> produce a *deletion-marker delta for every real URL*. Create a throwaway collection in the +> admin (name + seed URL + division; `config_folder` auto-generates) and use its `config_folder` +> below. + +```python +CONFIG_FOLDER = "" # ⚠️ EDIT FIRST + +import io, json +from datetime import datetime, timezone as tz +from unittest import mock +from botocore.exceptions import ClientError + +from sde_collections.models.collection import Collection +from sde_collections.models.collection_choice_fields import WorkflowStatusChoices +from sde_collections.tasks import ingest_scraped_collection + +c = Collection.objects.get(config_folder=CONFIG_FOLDER) +c.workflow_status = WorkflowStatusChoices.ENGINEERING_IN_PROGRESS +c.save() + +# 5 fake documents in the crawler's exact 7-field shape; URLs must be globally unique +DOCS = [ + {"url": f"https://{c.config_folder}.demo.local/page{i}", + "title": f"Demo Page {i}", "full_text": f"Body text for demo page {i}.", + "content_type": "text/html", "seed": "https://demo.local", + "host": "demo.local", "depth": 1} + for i in range(1, 6) +] +SUMMARY = {"collection_id": c.config_folder, "documents_scraped": len(DOCS)} + +def fake_get_object(key): + payload = { + f"scraped_collections/{c.config_folder}.json": DOCS, + f"failure_logs/{c.config_folder}_failures_summary.json": SUMMARY, + }.get(key) + if payload is None: + raise ClientError({"Error": {"Code": "NoSuchKey"}}, "GetObject") + return {"Body": io.BytesIO(json.dumps(payload).encode()), + "LastModified": datetime.now(tz.utc)} + +with mock.patch("sde_collections.scraping.s3_results._get_object", side_effect=fake_get_object): + print(ingest_scraped_collection(c.id)) # → "Ingested 5 documents for …" + +c.refresh_from_db() +print(c.get_workflow_status_display()) # → Scraping Successful; worker then → Ready for Curation +print(c.dump_urls.count()) # → 5 +``` + +From there the walkthrough continues identically at Step 5 (you'll have 5 fake deltas to +"curate" instead of zero). The zero-document failure case: rerun with +`SUMMARY = {..., "documents_scraped": 0}` (status reset to *Engineering in Progress* first) → +**Scraping Failed**. Idempotency: rerun with `ingest_scraped_collection(c.id, claim=False)` — +twice yields 5 DumpUrls, not 10 (this is also what +`manage.py ingest_scrape_results --collection ` calls; that command always reads real S3, so +locally it fails on the blank bucket by design). + +--- + +## Appendix B — What this guide deliberately does NOT verify + +These need real AWS beyond the crawler bucket, and are covered by the "Manual verification (real +dev AWS)" blocks in `IMPLEMENTATION_PLAN.md` (P3, P4, P7) once the `sde-api-scrapers` +`web-indexing` stacks deploy: + +- A real SSM `send-command` reaching the crawler inbox on `i-0b6a61d95888886f4` (the Step 3 + success path — its output for Aurorasaurus already exists, which is what Step 4 consumed). +- The real export → `sts:AssumeRole` → `ecs:RunTask` → `status.json` loop against + `sde-cosmos-indexing-dev` (Step 5/7 success paths; the indexer repo's E2E.10). +- Slack delivery, if you ran with a dummy webhook. +- The stall-timeout paths in real time (both unit-tested; live simulation means waiting + `SCRAPE_STALL_TIMEOUT_HOURS` / `INDEX_STALL_TIMEOUT_HOURS`). +- The beat pollers firing on schedule (`SCRAPE_POLL_ENABLED` / `INDEX_POLL_ENABLED=True`) — with + blank buckets they would only log S3 errors; their rows' existence and flag-gating are + verified in Steps 2/4/7. diff --git a/config/settings/test.py b/config/settings/test.py index d7eaa130..72d18875 100644 --- a/config/settings/test.py +++ b/config/settings/test.py @@ -28,5 +28,21 @@ # DEBUGGING FOR TEMPLATES # ------------------------------------------------------------------------------ TEMPLATES[0]["OPTIONS"]["debug"] = True # type: ignore # noqa F405 + +# CELERY +# ------------------------------------------------------------------------------ +# Never publish to the real broker from tests. The container entrypoint exports +# CELERY_BROKER_URL=${REDIS_URL} — the same Redis the celeryworker container consumes — +# so any test that changes a workflow status without patching .delay() would enqueue a +# real message, and the live worker would run it against the LOCAL database (test-DB +# collection ids can collide with local rows, flipping their statuses). kombu's +# memory:// transport queues in-process and dies with the test run. +# Celery gives the CELERY_BROKER_URL *environment variable* precedence over Django +# settings, so the env var must be overridden too; this runs at settings import, before +# the celery app's lazy config finalizes. +import os # noqa: E402 + +os.environ["CELERY_BROKER_URL"] = "memory://" +CELERY_BROKER_URL = "memory://" # Your stuff... # ------------------------------------------------------------------------------ diff --git a/sde_collections/indexing/dispatch.py b/sde_collections/indexing/dispatch.py index b1774bc7..ce7a5096 100644 --- a/sde_collections/indexing/dispatch.py +++ b/sde_collections/indexing/dispatch.py @@ -41,7 +41,11 @@ def run_index_task(collection, target: str, run_id: str) -> str: "containerOverrides": [ { "name": settings.INDEXING_CONTAINER_NAME, + # An ECS command override replaces the task definition's command + # wholesale, and the indexer image has no ENTRYPOINT — so the + # executable must be restated here, not just the flags. "command": [ + "python3", "api_scraper.py", "--source", "WEB_COSMOS", "--collection", collection.config_folder, "--target", target, diff --git a/sde_collections/tests/test_indexing_dispatch.py b/sde_collections/tests/test_indexing_dispatch.py index 82e823a1..5409c46e 100644 --- a/sde_collections/tests/test_indexing_dispatch.py +++ b/sde_collections/tests/test_indexing_dispatch.py @@ -163,7 +163,10 @@ def test_dispatch_assumes_role_and_runs_task(self, mock_session, mock_boto3_clie assert run_kwargs["cluster"] == "api-scrapers-cluster-dev" assert run_kwargs["taskDefinition"] == "web_cosmos-scraper-dev" command = run_kwargs["overrides"]["containerOverrides"][0]["command"] + # The executable must lead the list: a container override replaces the task + # definition's command wholesale, and the indexer image has no ENTRYPOINT. assert command == [ + "python3", "api_scraper.py", "--source", "WEB_COSMOS", "--collection", collection.config_folder, "--target", "test", From 9e18ced8d0a2645d15ef423c26b27a338bece266 Mon Sep 17 00:00:00 2001 From: Bernard Benson Date: Fri, 14 Aug 2026 15:33:17 -0500 Subject: [PATCH 12/20] test fixes --- TEST_AUDIT.md | 112 ++++++++++++++++++ environmental_justice/tests/conftest.py | 8 +- inference/tests/test_batch.py | 66 +++++------ inference/tests/test_classification_utils.py | 8 +- inference/utils/classification_utils.py | 2 +- sde_collections/tests/test_database_backup.py | 74 ++++++++---- sde_collections/tests/test_delta_patterns.py | 13 +- .../tests/test_indexing_dispatch.py | 87 ++++++++++++-- sde_collections/tests/test_migrate_dump.py | 25 ++-- .../tests/test_promote_collection.py | 45 ++++--- sde_collections/tests/test_scrape_dispatch.py | 83 ++++++++++++- sde_collections/tests/test_scrape_ingest.py | 91 +++++++++++++- sde_collections/tests/test_url_apis.py | 17 +-- .../tests/test_workflow_status_triggers.py | 4 +- 14 files changed, 503 insertions(+), 132 deletions(-) create mode 100644 TEST_AUDIT.md diff --git a/TEST_AUDIT.md b/TEST_AUDIT.md new file mode 100644 index 00000000..ba8292ea --- /dev/null +++ b/TEST_AUDIT.md @@ -0,0 +1,112 @@ +# COSMOS Test Audit + +**Branch:** `cosmos-rewiring` · **Date:** 2026-08-14 · **Status:** all changes uncommitted on the working tree + +**Goal:** verify that every test in the repository actually exercises production behavior — that mocks sit at external boundaries (AWS, HTTP, Celery, Slack) while assertions land on real code paths and database state, never on the mock's own configuration. + +| Metric | Before | After | +|---|---|---| +| Full-suite result | **66 failed**, 401 passed, 2 collection errors | **482 passed, 0 failed**, 2 env-gated skips | +| Runtime | ~3:54 | ~37s | +| New boundary tests | — | 14 | +| Vacuous / dead tests repaired | — | 15 | +| Lint | — | flake8 clean on all touched files | + +--- + +## 1 · Method + +Every test file changed or added on this branch was reviewed line-by-line; the legacy suites (pattern/delta/promotion, users, feedback, environmental justice, inference, management commands) were audited in a parallel sweep. Each test was classified as: + +- **Vacuous** — patches the system under test itself, asserts only what the mock was configured to return, or asserts a condition that cannot fail. These stay green with broken production code. +- **Boundary-mocked (healthy)** — mocks external services but asserts real DB state, return values, or logic branches. +- **Plain functional** — no mocks. + +**Verdict on the pre-existing suite:** healthier than its mock density suggests. The ~2,500 lines of pattern/delta/promotion tests are essentially mock-free and carry the real regression protection. The rot was concentrated in the backup-command tests, a few inference tests, and three self-referential or assertion-free tests — all repaired below. + +--- + +## 2 · New coverage: the AWS boundary modules + +The branch's new pipeline tests (`test_scrape_dispatch`, `test_scrape_ingest`, `test_indexing_dispatch`, `test_inference_flag`, `test_workflow_status_triggers`) were already well-shaped. But every caller-side test mocks the three AWS boundary modules away, so their internal logic had **zero coverage** — the S3 key layouts that form the contract with the crawler and indexer, the SSM script construction, and the missing-key-versus-real-error branching. 14 tests were added (12 functions, 14 runs with parametrization): + +| Module | New tests (location) | What is now proven | +|---|---|---| +| `scraping/ssm_dispatch.py` | `TestSendJobToCrawler` ×4 (test_scrape_dispatch.py) | The generated shell script is shell-split and the job JSON recovered by round-trip — the payload the crawler receives equals `build_job_json()` exactly, including a hostile seed URL with quotes/spaces/ampersands. Write is atomic (`.tmp` → `chown` → `mv`, in that order), the command targets `CRAWLER_INSTANCE_ID` via AWS-RunShellScript, and the SSM comment is truncated to its 100-char limit. | +| `scraping/s3_results.py` | `TestS3ResultFetchers` ×4, 5 runs (test_scrape_ingest.py) | Exact crawler key contract: `failure_logs/{id}_failures_summary.json` and `scraped_collections/{id}.json` against `SDE_S3_BUCKET`; `LastModified` passthrough (feeds the staleness rule); `NoSuchKey`/`404` → "run not finished" (`None`); `AccessDenied` raises rather than reading as "still crawling" forever. | +| `indexing/run_status.py` | `TestRunStatusFetchers` ×4, 5 runs (test_indexing_dispatch.py) | Exact indexer key contract: `index_runs/{config_folder}/{run_id}/status.json` and `validation.json` against `SDE_INDEX_BUCKET`; missing key → in-flight (`None`); real S3 errors propagate instead of stalling to timeout. | + +Also tightened in the branch tests: the Slack-notification assertion in `test_workflow_status_triggers.py` contained `or "<" in message`, which made it nearly impossible to fail; it now asserts the collection name **and** the transition-specific message text. + +--- + +## 3 · Vacuous tests repaired + +| File | Defect | Repair | +|---|---|---| +| `sde_collections/tests/test_database_backup.py` | Three tests could never fail: error/cleanup assertions checked that a file at a bare relative path — which production never writes (it writes to `/app/backups/`) and which the mocked `pg_dump` never created — did not exist. `test_handle_compression_error` additionally mocked a method on a fixture `Command` instance that `call_command` never touches. | The mocked `pg_dump` now genuinely writes a dump file. The real `compress_file` gzips it (content verified by decompressing), the real `temp_file_handler` cleanup is observed, error paths assert the reported message ("Backup failed" / "Error during backup process") plus absence of artifacts, and `compress_file` is patched on the class so the failure actually occurs. The integration test now pins the exact `/app/backups/…` path. | +| `sde_collections/tests/test_url_apis.py` | `test_candidate_url_api_alias` reversed the same URL name twice into one variable and asserted a response equal to itself. | Now compares `candidate-urls-api` against `curated-urls-api` — the actual alias contract (both routes serve `CuratedURLAPIView`) — with distinct-route and non-empty-payload checks. | +| `sde_collections/tests/test_promote_collection.py` | `test_promotion_with_overlapping_patterns_and_deletion` had zero assertions — its "verification" was `print()` loops. `test_promotion_with_title_change` ended with a bare call and a comment about an expected production error. | Real assertions on exact pattern↔URL relations before and after a deletion promotion — which exposed a latent bug in the test itself (§4.2). The title-change test now asserts the update carries through and the pattern relation survives. | +| `sde_collections/tests/test_migrate_dump.py` | The file kept its own copy of `DELTA_COMPARISON_FIELDS` ("assuming a central definition") — silently drift-prone — and `test_empty_delta_comparison_fields` "emptied" that local copy, a no-op on production. | Imports the production constant from `models/collection.py`; the empty-fields test patches it in the module where production reads it, with *differing* titles, genuinely proving the field list drives delta creation. | +| `inference/tests/test_classification_utils.py` | `test_threshold_parameter_behavior` asserted that the `threshold` argument is *discarded* — certifying a live production bug as correct behavior. | Production bug fixed (§5); the test now asserts the threshold is forwarded to `map_classification_to_tdamm_tags`. | +| `inference/tests/test_batch.py` | `test_extremely_large_text` patched two methods of the `BatchProcessor` under test and never checked the truncation its docstring promised. `test_integration_with_mock_django_db` carried a dead `patch.object` wrapper and misleading comments. | The batch limit is constructor-configurable, so the test now feeds real 250-char text against a limit of 100 and asserts the emitted batch contains the actually-truncated text. The integration test drops the dead patch and asserts text and metadata produced by the real `prepare_url_data`. | +| `sde_collections/tests/test_delta_patterns.py` | Two dead statements where assertions were clearly intended: a discarded `.first()` queryset (plus a commented-out `apply()`), and an attribute assignment never saved. | Both became assertions: the equal-titles test now proves the pattern *matched* the CuratedUrl (so the missing DeltaUrl is a deliberate skip, not a failed match); the reapplication test asserts the title was applied on create (`save()` auto-applies patterns). | + +--- + +## 4 · Failures found and their root causes + +### 4.1 · 66 tests failing in every full-suite run — infra bug, fixed + +`environmental_justice/tests/conftest.py` registered an **autouse fixture that permanently overwrote** `settings.ROOT_URLCONF` with its private EJ-only URL table and never restored it. The EJ module collects early (alphabetical order), so every later test that resolves a named URL failed with `NoReverseMatch` — while passing in isolation, which is why it went unnoticed. Pre-existing on `dev`; unrelated to the rewiring branch. Fixed with pytest-django's self-restoring `settings` fixture (the test-local urlconf itself is legitimate: the EJ API has no registration in the project urlconf). Runtime fell from ~3:54 to ~37s once the failure churn disappeared. + +| File | Failed | Tests | +|---|---|---| +| `feedback/tests.py` | 20 | All of `TestFeedbackAPI` (8: dropdown options, create success, invalid email, 4× missing-field, invalid dropdown) and `TestContentCurationRequestAPI` (12: create success, without additional info, invalid email, 5× missing-field, 4× max-length). Only the 2 pure model tests survived. | +| `sde_collections/tests/test_url_apis.py` | 19 | `TestDeltaURLAPIView` (5: empty list, with data, wrong config folder, serializer fields, pagination) and `TestCuratedURLAPIView` / `TestCandidateURLAPIView` (7 each: empty list, with data, wrong config folder, serializer fields, alias, multiple collections, invalid filters). | +| `sde_collections/tests/frontend/` | 15 | `test_auth.py` (failed login, logout, successful login); `test_homepage_features.py` (collections display, universal search, 6 search panes: connector type, curated URLs, curator, division, reindexing status, workflow status); `test_pattern_application.py` (create document-type / exclude / include / title pattern). | +| `sde_indexing_helper/users/tests/` | 12 | `test_admin.py` (changelist, search, add, view user); `test_views.py` (get_success_url, form_valid, get_redirect_url, not_authenticated); `test_urls.py` (detail, update, redirect); `test_models.py` (get_absolute_url). | + +### 4.2 · Latent test bug: wildcard vs. regex match patterns — masked bug, fixed + +Adding real assertions to the overlapping-patterns promotion test revealed its regex-idiom patterns (`.*docs.*` etc.) **matched zero URLs**: `BaseMatchPattern.get_regex_pattern()` runs `re.escape()` on the pattern and only translates `*` wildcards — so `.*docs.*` becomes a literal-dot regex that never matches. The print-only "assertions" had concealed for the test's whole life that it tested an empty scenario. Converted to wildcard idiom (`*docs*`, `*api/v1/doc*`, …) with exact expected relation sets, verified against actual behavior. + +### 4.3 · Two directories cannot import in the test container — pre-existing, excluded + +A bare `pytest` in the Django container aborts collection on `functional_tests/` (imports `webdriver_manager`, installed nowhere) and `document_classifier/` (imports `numpy`). Neither is a real pytest suite: `functional_tests/test_check_collection.py` is a standalone Selenium script that takes a collection name from `sys.argv`, drives real Chrome, and targets the *live* NASA Sinequa servers — infrastructure this branch deletes. The project's own CI (`init.sh`, line 8) already excludes both directories; the audit runs used matching `--ignore` flags. + +--- + +## 5 · Production code changes + +Two non-test files changed; everything else is test-only. + +- **`inference/utils/classification_utils.py`** — bug, fixed. `update_url_with_classification_results(…, threshold=X)` accepted and documented a `threshold` parameter but silently discarded it; every caller got `settings.TDAMM_CLASSIFICATION_THRESHOLD` regardless. One-line fix forwards it. No live behavior change on this branch (inference is dormant, `INFERENCE_ENABLED=False`) — **flag to the team anyway**. +- **`environmental_justice/tests/conftest.py`** — the URLconf-leak fix (§4.1). Test infrastructure only. + +--- + +## 6 · Current state + +``` +482 passed, 2 skipped, 0 failed (~37s; was 66 failed, ~3:54) +flake8 clean on all touched files (isort applied) +``` + +13 files modified, all **uncommitted** on `cosmos-rewiring`: 11 test files, 1 production fix (`classification_utils.py`), 1 test-infra fix (EJ conftest). The 2 skips are pre-existing environment-gated skips, unchanged. Verification: + +```bash +docker compose -f local.yml run --rm django pytest -q \ + --ignore=document_classifier --ignore=functional_tests +``` + +--- + +## 7 · Flagged but deliberately not changed + +- **`inference/tests/test_inference_integration.py`** — every test skips via fixture when `http://host.docker.internal:8000` is unreachable, so in CI the module is unconditionally green while asserting nothing. Coverage theater rather than vacuous mocking; consider gating on an env var that CI sets explicitly. +- **`test_field_modifier_patterns.py`** — three tests assert only that model fields equal the values just passed to `objects.create()` (testing Django, not the app). Harmless; low value. +- **`test_database_restore.py`** — monkeypatches `pytest.mark` at import time to define `integration`. Works, but fragile and affects any other module using that mark name; a `conftest`/`pytest.ini` marker registration would be safer. +- **`test_delta_patterns.py`** (2 spots) — expected titles computed by calling the same `resolve_title()` the production path calls; a bug there changes both sides identically. Would need hand-computed expected strings to close. + +> **Recommendation:** add `--ignore=document_classifier --ignore=functional_tests` to `addopts` in `pytest.ini` (or rename the Selenium script off the `test_*.py` glob) so a plain `pytest` in the container behaves like CI instead of aborting on collection errors. diff --git a/environmental_justice/tests/conftest.py b/environmental_justice/tests/conftest.py index d8b53c9a..df620f68 100644 --- a/environmental_justice/tests/conftest.py +++ b/environmental_justice/tests/conftest.py @@ -23,8 +23,10 @@ def client(): @pytest.fixture(autouse=True) -def setup_urls(): - """Setup URLs for testing""" - from django.conf import settings +def setup_urls(settings): + """Point ROOT_URLCONF at this module's router-only urlpatterns. + Uses pytest-django's `settings` fixture so the change is rolled back after each + test — assigning django.conf.settings directly leaked the EJ-only urlconf into + every later test module and broke all reverse() calls in a full-suite run.""" settings.ROOT_URLCONF = __name__ diff --git a/inference/tests/test_batch.py b/inference/tests/test_batch.py index b6d10963..9578b15d 100644 --- a/inference/tests/test_batch.py +++ b/inference/tests/test_batch.py @@ -1,6 +1,6 @@ # inference/tests/test_batch.py # docker-compose -f local.yml run --rm django pytest inference/tests/test_batch.py -from unittest.mock import MagicMock, Mock, patch +from unittest.mock import MagicMock, Mock import pytest from django.db.models import QuerySet @@ -307,31 +307,24 @@ def close(self): # Verify close was still called despite the exception mock_iterator.close.assert_called_once() - def test_integration_with_mock_django_db(self, processor): - """Test integration with mocked Django DB objects""" + def test_integration_with_factory_urls(self, processor): + """Real model instances (unsaved factory builds) flow through prepare_url_data.""" from sde_collections.tests.factories import DumpUrlFactory - # Create a patch for the QuerySet iterator that returns our factory objects - with patch.object(QuerySet, "iterator") as mock_iterator: - # Create mock URLs using the factory - url1 = DumpUrlFactory.build(id=1, scraped_text="Text 1") - url2 = DumpUrlFactory.build(id=2, scraped_text="Text 2") + url1 = DumpUrlFactory.build(id=1, scraped_text="Text 1") + url2 = DumpUrlFactory.build(id=2, scraped_text="Text 2") - # Set up the mock to return these objects - mock_iterator.return_value = iter([url1, url2]) - - # Create a real QuerySet (that will use our mock iterator) - mock_queryset = MagicMock(spec=QuerySet) - mock_queryset.iterator = mock_iterator + mock_queryset = MagicMock(spec=QuerySet) + mock_queryset.iterator.return_value = iter([url1, url2]) - # Process the batches - batches = list(processor.iter_url_batches(mock_queryset)) + batches = list(processor.iter_url_batches(mock_queryset)) - # Verify the output - assert len(batches) == 1 # Both URLs fit in one batch - assert len(batches[0]) == 2 - assert batches[0][0]["url_id"] == 1 - assert batches[0][1]["url_id"] == 2 + assert len(batches) == 1 # Both URLs fit in one batch + assert len(batches[0]) == 2 + assert batches[0][0]["url_id"] == 1 + assert batches[0][0]["text"] == "Text 1" + assert batches[0][0]["metadata"] == {"title": url1.scraped_title or "", "url": url1.url} + assert batches[0][1]["url_id"] == 2 # Additional test class to identify potential issues @@ -339,30 +332,25 @@ class TestBatchProcessorPotentialIssues: """Tests focused on identifying potential problems with BatchProcessor""" def test_extremely_large_text(self): - """Test handling of extremely large text to check for memory issues""" - processor = BatchProcessor() - - # Create a URL with extremely large text (100MB) - # This is simulated rather than actually creating such a large string - large_text_size = 100 * 1024 * 1024 # 100MB + """An oversized URL must be truncated to the batch limit and yielded as its own + batch — with real text against a small limit, not by patching the processor.""" + processor = BatchProcessor(max_batch_text_length=100) url = Mock() url.id = 1 + url.scraped_text = "A" * 250 + url.scraped_title = "Big page" + url.url = "https://example.com/big" - # Instead of creating a huge string, we'll patch get_text_length - # to simulate the size calculation - with patch.object(processor, "get_text_length", return_value=large_text_size): - url_data = {"url_id": url.id, "text": "LARGE", "metadata": {}} - - with patch.object(processor, "prepare_url_data", return_value=url_data): - mock_queryset = MagicMock(spec=QuerySet) - mock_queryset.iterator.return_value = iter([url]) + mock_queryset = MagicMock(spec=QuerySet) + mock_queryset.iterator.return_value = iter([url]) - batches = list(processor.iter_url_batches(mock_queryset)) + batches = list(processor.iter_url_batches(mock_queryset)) - # Should create a single batch with truncated content - assert len(batches) == 1 - assert len(batches[0]) == 1 + assert len(batches) == 1 + assert len(batches[0]) == 1 + assert batches[0][0]["text"] == "A" * 100 # actually truncated to the limit + assert batches[0][0]["url_id"] == 1 def test_url_with_no_text(self): """Test handling of URLs with empty text""" diff --git a/inference/tests/test_classification_utils.py b/inference/tests/test_classification_utils.py index 2f992f3d..230347bc 100644 --- a/inference/tests/test_classification_utils.py +++ b/inference/tests/test_classification_utils.py @@ -153,7 +153,7 @@ def test_update_url_properly_calls_mapping(self, mock_map_function, mock_url): result = update_url_with_classification_results(mock_url, classification_results) # Verify map_classification_to_tdamm_tags was called properly - mock_map_function.assert_called_once_with(classification_results) + mock_map_function.assert_called_once_with(classification_results, threshold=None) # Verify URL object was updated correctly assert mock_url.tdamm_tag_ml == mock_tdamm_tags @@ -164,7 +164,8 @@ def test_update_url_properly_calls_mapping(self, mock_map_function, mock_url): @patch("inference.utils.classification_utils.map_classification_to_tdamm_tags") def test_threshold_parameter_behavior(self, mock_map_function, mock_url): - """Test how threshold parameter is handled""" + """A caller-supplied threshold must reach the mapping function (it used to be + silently discarded, so every caller got settings.TDAMM_CLASSIFICATION_THRESHOLD).""" mock_tdamm_tags = ["MMA_M_EM_O"] mock_map_function.return_value = mock_tdamm_tags @@ -173,8 +174,7 @@ def test_threshold_parameter_behavior(self, mock_map_function, mock_url): update_url_with_classification_results(mock_url, classification_results, threshold=custom_threshold) - # Based on the implementation, the function doesn't pass the threshold parameter - mock_map_function.assert_called_once_with(classification_results) + mock_map_function.assert_called_once_with(classification_results, threshold=custom_threshold) def test_integration_with_real_mapping(self, mock_url): """Test end-to-end integration with real mapping function""" diff --git a/inference/utils/classification_utils.py b/inference/utils/classification_utils.py index 0e757e36..61915c97 100644 --- a/inference/utils/classification_utils.py +++ b/inference/utils/classification_utils.py @@ -82,7 +82,7 @@ def update_url_with_classification_results(url_object, classification_results, t Returns: list: The list of TDAMM tags that were applied """ - tdamm_tags = map_classification_to_tdamm_tags(classification_results) + tdamm_tags = map_classification_to_tdamm_tags(classification_results, threshold=threshold) # Update the URL object url_object.tdamm_tag_ml = tdamm_tags diff --git a/sde_collections/tests/test_database_backup.py b/sde_collections/tests/test_database_backup.py index 680da2f1..7556a8e3 100644 --- a/sde_collections/tests/test_database_backup.py +++ b/sde_collections/tests/test_database_backup.py @@ -3,7 +3,8 @@ import os import subprocess from datetime import datetime -from unittest.mock import Mock, patch +from io import StringIO +from unittest.mock import patch import pytest from django.core.management import call_command @@ -141,37 +142,58 @@ def test_handle_integration(self, compress, env_name, mock_subprocess, mock_date # Verify correct command execution mock_subprocess.assert_called_once() - # Verify correct filename used + # Verify the dump lands on the exact backups-volume path cmd_args = mock_subprocess.call_args[0][0] - date_str = "20240115" - expected_base = f"{env_name}_backup_{date_str}.sql" - assert cmd_args[-1].endswith(expected_base) + assert cmd_args[-1] == f"/app/backups/{env_name}_backup_20240115.sql" - # Verify cleanup attempted if compressed - if compress: - assert not os.path.exists(expected_base) + def test_compressed_backup_writes_gz_and_removes_temp_dump(self, mock_subprocess, tmp_path): + """Real file lifecycle: the mocked pg_dump writes a dump file, the real + compress_file gzips it, and temp_file_handler removes the intermediate .sql.""" + dump_content = b"-- PostgreSQL dump" - def test_handle_pg_dump_error(self, mock_subprocess, mock_date, monkeypatch): - """Test error handling when pg_dump fails.""" + def fake_pg_dump(cmd, env, check): + with open(cmd[-1], "wb") as f: + f.write(dump_content) + + mock_subprocess.side_effect = fake_pg_dump + output = tmp_path / "backup.sql" + + call_command("database_backup", output=str(output)) + + assert not output.exists() # temp dump cleaned up + with gzip.open(str(output) + ".gz", "rb") as f: + assert f.read() == dump_content + + def test_handle_pg_dump_error(self, mock_subprocess, tmp_path): + """pg_dump failure must be reported, swallowed, and leave no backup artifacts.""" mock_subprocess.side_effect = subprocess.CalledProcessError(1, "pg_dump") - monkeypatch.setenv("BACKUP_ENVIRONMENT", "staging") + output = tmp_path / "backup.sql" + out = StringIO() - call_command("database_backup") + call_command("database_backup", output=str(output), stdout=out) # must not raise - # Verify error handling and cleanup - date_str = "20240115" - temp_file = f"staging_backup_{date_str}.sql" - assert not os.path.exists(temp_file) + assert "Backup failed" in out.getvalue() + assert not output.exists() + assert not os.path.exists(str(output) + ".gz") - def test_handle_compression_error(self, mock_subprocess, mock_date, command, monkeypatch): - """Test error handling during compression.""" - monkeypatch.setenv("BACKUP_ENVIRONMENT", "staging") - # Mock compression to fail - command.compress_file = Mock(side_effect=Exception("Compression failed")) + def test_handle_compression_error(self, mock_subprocess, tmp_path): + """Compression failure must be reported, swallowed, and still clean up the temp + dump that pg_dump produced. (Patch compress_file on the class: call_command + instantiates its own Command, so patching a fixture instance guards nothing.)""" + + def fake_pg_dump(cmd, env, check): + with open(cmd[-1], "wb") as f: + f.write(b"-- dump") + + mock_subprocess.side_effect = fake_pg_dump + output = tmp_path / "backup.sql" + out = StringIO() - call_command("database_backup") + with patch.object( + database_backup.Command, "compress_file", side_effect=Exception("Compression failed") + ): + call_command("database_backup", output=str(output), stdout=out) # must not raise - # Verify cleanup - date_str = "20240115" - temp_file = f"staging_backup_{date_str}.sql" - assert not os.path.exists(temp_file) + assert "Error during backup process" in out.getvalue() + assert not output.exists() # temp dump cleaned up despite the failure + assert not os.path.exists(str(output) + ".gz") diff --git a/sde_collections/tests/test_delta_patterns.py b/sde_collections/tests/test_delta_patterns.py index a7941fbd..0f85e61a 100644 --- a/sde_collections/tests/test_delta_patterns.py +++ b/sde_collections/tests/test_delta_patterns.py @@ -134,18 +134,17 @@ def test_apply_does_not_generate_delta_url_if_titles_match(self): generated_title=resolve_title(title_pattern, context), ) - # Create and apply a `DeltaTitlePattern` with the same title pattern - DeltaTitlePattern.objects.create( + # Creating the pattern auto-applies it (BaseMatchPattern.save calls apply) + pattern = DeltaTitlePattern.objects.create( collection=collection, match_pattern="https://example.com/*", match_pattern_type=2, title_pattern=title_pattern, ) - # pattern.apply() - - # Since the title matches, no new `DeltaUrl` should be created - DeltaUrl.objects.filter(url=curated_url.url).first() + # The pattern did match the CuratedUrl — so the absence of a DeltaUrl below + # is a deliberate skip on equal titles, not a failure to match. + assert pattern.get_matching_curated_urls().filter(url=curated_url.url).exists() assert not DeltaUrl.objects.filter(url=curated_url.url).exists() def test_apply_resolves_title_for_delta_urls(self): @@ -253,7 +252,7 @@ def test_pattern_reapplication_does_not_duplicate_delta_urls(self): ) delta_url.refresh_from_db() - delta_url.generated_title = "Title Before - Processed" + assert delta_url.generated_title == "Title Before - Processed" # applied on create # Promote to CuratedUrl collection.promote_to_curated() diff --git a/sde_collections/tests/test_indexing_dispatch.py b/sde_collections/tests/test_indexing_dispatch.py index 5409c46e..5bbb246e 100644 --- a/sde_collections/tests/test_indexing_dispatch.py +++ b/sde_collections/tests/test_indexing_dispatch.py @@ -1,15 +1,21 @@ # docker-compose -f local.yml run --rm django pytest sde_collections/tests/test_indexing_dispatch.py +import io import json from datetime import timedelta from unittest.mock import MagicMock, patch import pytest +from botocore.exceptions import ClientError from django.test import override_settings from django.utils import timezone -from sde_collections.indexing.export import export_curated_to_s3 from sde_collections.indexing.dispatch import run_index_task +from sde_collections.indexing.export import export_curated_to_s3 +from sde_collections.indexing.run_status import ( + fetch_run_status, + fetch_validation_report, +) from sde_collections.models.collection_choice_fields import ( Divisions, DocumentTypes, @@ -70,6 +76,7 @@ class TestExportCuratedToS3: def indexing_settings(self): with override_settings(**INDEXING_SETTINGS): yield + def test_manifest_written_last_with_exact_count_and_keys(self, s3_export): collection = CollectionFactory() CuratedUrlFactory.create_batch(3, collection=collection) @@ -91,9 +98,7 @@ def test_excluded_urls_are_not_exported(self, s3_export): collection = CollectionFactory() CuratedUrlFactory(collection=collection, url="https://keep.nasa.gov/a") excluded_url = CuratedUrlFactory(collection=collection, url="https://exclude.nasa.gov/b") - pattern = DeltaExcludePattern.objects.create( - collection=collection, match_pattern="https://exclude.nasa.gov/b" - ) + pattern = DeltaExcludePattern.objects.create(collection=collection, match_pattern="https://exclude.nasa.gov/b") # The excluded annotation reads this M2M; population is the pattern system's job # (covered in test_promote_collection) — here we only care that export honours it. pattern.curated_urls.add(excluded_url) @@ -166,11 +171,16 @@ def test_dispatch_assumes_role_and_runs_task(self, mock_session, mock_boto3_clie # The executable must lead the list: a container override replaces the task # definition's command wholesale, and the indexer image has no ENTRYPOINT. assert command == [ - "python3", "api_scraper.py", - "--source", "WEB_COSMOS", - "--collection", collection.config_folder, - "--target", "test", - "--run-id", RUN_ID, + "python3", + "api_scraper.py", + "--source", + "WEB_COSMOS", + "--collection", + collection.config_folder, + "--target", + "test", + "--run-id", + RUN_ID, ] @override_settings(**INDEXING_SETTINGS) @@ -248,6 +258,65 @@ def test_prod_dispatch_remembers_entering_qc_status(self, mock_export, mock_run) assert collection.workflow_status == WorkflowStatusChoices.PRODUCTION_INDEXING +class TestRunStatusFetchers: + """The S3 boundary itself: poll_index_runs tests mock fetch_run_status, so the real + index_runs/{config_folder}/{run_id}/ key layout and missing-key handling (None while + the run is in flight, raise on real errors) must be proven here.""" + + @pytest.fixture(autouse=True) + def index_bucket(self): + # override_settings can't decorate a plain (non-SimpleTestCase) class + with override_settings(SDE_INDEX_BUCKET="sde-cosmos-indexing-test"): + yield + + def _patch_s3(self, get_object): + s3 = MagicMock() + if isinstance(get_object, BaseException): + s3.get_object.side_effect = get_object + else: + s3.get_object.return_value = get_object + session = MagicMock() + session.client.return_value = s3 + return patch("sde_collections.indexing.run_status.get_boto3_session", return_value=session), s3 + + def test_fetch_run_status_reads_status_json_under_run_prefix(self): + payload = {"state": "succeeded"} + patcher, s3 = self._patch_s3({"Body": io.BytesIO(json.dumps(payload).encode("utf-8"))}) + + with patcher: + assert fetch_run_status("astro_data", RUN_ID) == payload + + s3.get_object.assert_called_once_with( + Bucket="sde-cosmos-indexing-test", Key=f"index_runs/astro_data/{RUN_ID}/status.json" + ) + + def test_fetch_validation_report_reads_validation_json(self): + payload = {"count_matches": True} + patcher, s3 = self._patch_s3({"Body": io.BytesIO(json.dumps(payload).encode("utf-8"))}) + + with patcher: + assert fetch_validation_report("astro_data", RUN_ID) == payload + + s3.get_object.assert_called_once_with( + Bucket="sde-cosmos-indexing-test", Key=f"index_runs/astro_data/{RUN_ID}/validation.json" + ) + + @pytest.mark.parametrize("code", ["NoSuchKey", "404"]) + def test_missing_status_means_run_in_flight(self, code): + patcher, _ = self._patch_s3(ClientError({"Error": {"Code": code}}, "GetObject")) + + with patcher: + assert fetch_run_status("astro_data", RUN_ID) is None + + def test_real_s3_errors_propagate(self): + """AccessDenied etc. must surface, not read as 'still indexing' until stall timeout.""" + patcher, _ = self._patch_s3(ClientError({"Error": {"Code": "AccessDenied"}}, "GetObject")) + + with patcher: + with pytest.raises(ClientError): + fetch_run_status("astro_data", RUN_ID) + + def _dispatched(collection, target, previous, run_id="run-1"): return IndexDispatch.objects.create( collection=collection, diff --git a/sde_collections/tests/test_migrate_dump.py b/sde_collections/tests/test_migrate_dump.py index a1a3bd12..1f308bd3 100644 --- a/sde_collections/tests/test_migrate_dump.py +++ b/sde_collections/tests/test_migrate_dump.py @@ -3,6 +3,8 @@ import pytest +# The production list — a local copy would silently drift and stop covering new fields. +from sde_collections.models.collection import DELTA_COMPARISON_FIELDS # noqa: E402 from sde_collections.models.collection_choice_fields import Divisions, DocumentTypes from sde_collections.models.delta_patterns import ( DeltaDocumentTypePattern, @@ -16,8 +18,6 @@ DumpUrlFactory, ) -DELTA_COMPARISON_FIELDS = ["scraped_title", "tdamm_tag", "division"] # Assuming a central definition - @pytest.mark.django_db class TestMigrationHelpers: @@ -230,20 +230,19 @@ def test_full_migration_deleted_url(self): @pytest.mark.django_db def test_empty_delta_comparison_fields(): - collection = CollectionFactory() - dump_url = DumpUrlFactory(collection=collection, scraped_title="Same Title") - CuratedUrlFactory(collection=collection, url=dump_url.url, scraped_title="Same Title") # noqa + """The comparison-field list is what drives delta creation: with it patched empty + in the PRODUCTION module, even a differing title must not produce a DeltaUrl. + (Rebinding this test module's import would be a no-op — patch where it's used.)""" + from unittest.mock import patch - global DELTA_COMPARISON_FIELDS - original_fields = DELTA_COMPARISON_FIELDS - DELTA_COMPARISON_FIELDS = [] # Simulate empty comparison fields + collection = CollectionFactory() + dump_url = DumpUrlFactory(collection=collection, scraped_title="New Title") + CuratedUrlFactory(collection=collection, url=dump_url.url, scraped_title="Old Title") - try: + with patch("sde_collections.models.collection.DELTA_COMPARISON_FIELDS", []): collection.migrate_dump_to_delta() - # No DeltaUrl should be created as there are no fields to compare - assert not DeltaUrl.objects.filter(url=dump_url.url).exists() - finally: - DELTA_COMPARISON_FIELDS = original_fields # Reset the fields after test + + assert not DeltaUrl.objects.filter(url=dump_url.url).exists() @pytest.mark.django_db diff --git a/sde_collections/tests/test_promote_collection.py b/sde_collections/tests/test_promote_collection.py index 8791efae..eb01d98c 100644 --- a/sde_collections/tests/test_promote_collection.py +++ b/sde_collections/tests/test_promote_collection.py @@ -138,12 +138,14 @@ def test_promotion_with_overlapping_patterns_and_deletion(): for url in urls: DeltaUrl.objects.create(collection=collection, url=url, scraped_title=f"Title for {url}") - # Create overlapping patterns that will affect the same URLs + # Create overlapping patterns that will affect the same URLs. + # NOTE: match patterns are *-wildcards (get_regex_pattern re.escape()s everything + # else) — regex-idiom patterns like ".*docs.*" silently match nothing. patterns = [ - {"pattern": ".*docs.*", "title": "Documentation: {title}"}, - {"pattern": ".*guide.*", "title": "Guide: {title}"}, - {"pattern": ".*api.*", "title": "API: {title}"}, - {"pattern": ".*doc[0-9]", "title": "Doc Number: {title}"}, + {"pattern": "*docs*", "title": "Documentation: {title}"}, + {"pattern": "*guide*", "title": "Guide: {title}"}, + {"pattern": "*api*", "title": "API: {title}"}, + {"pattern": "*api/v1/doc*", "title": "Doc Number: {title}"}, ] # Create and apply multiple patterns @@ -161,27 +163,31 @@ def test_promotion_with_overlapping_patterns_and_deletion(): # Initial promotion collection.promote_to_curated() - # Verify our complex setup + # Every pattern's curated_urls relation must hold exactly its wildcard matches + expected_matches = { + "*docs*": {"https://example.com/docs/guide1", "https://example.com/docs/guide2"}, + "*guide*": {"https://example.com/docs/guide1", "https://example.com/docs/guide2"}, + "*api*": {"https://example.com/api/v1/doc1", "https://example.com/api/v1/doc2"}, + "*api/v1/doc*": {"https://example.com/api/v1/doc1", "https://example.com/api/v1/doc2"}, + } + assert CuratedUrl.objects.filter(collection=collection).count() == 4 for pattern in title_patterns: - matching_urls = pattern.curated_urls.all() - print(f"\nPattern '{pattern.match_pattern}' matches {matching_urls.count()} URLs:") - for url in matching_urls: - print(f"- {url.url}") + matched = set(pattern.curated_urls.values_list("url", flat=True)) + assert matched == expected_matches[pattern.match_pattern], pattern.match_pattern # Now create deletion DeltaUrls but with overlapping pattern matches urls_to_delete = ["https://example.com/docs/guide1", "https://example.com/api/v1/doc1"] for url in urls_to_delete: DeltaUrl.objects.create(collection=collection, url=url, to_delete=True) - # Try the promotion - this should trigger similar conditions to production + # The promotion must apply the deletions without corrupting pattern relations collection.promote_to_curated() - # Print final state for debugging - print("\nFinal state:") + remaining = set(CuratedUrl.objects.filter(collection=collection).values_list("url", flat=True)) + assert remaining == {"https://example.com/docs/guide2", "https://example.com/api/v1/doc2"} for pattern in title_patterns: - print(f"\nPattern '{pattern.match_pattern}':") - for url in pattern.curated_urls.all(): - print(f"- {url.url}") + matched = set(pattern.curated_urls.values_list("url", flat=True)) + assert matched == expected_matches[pattern.match_pattern] & remaining, pattern.match_pattern @pytest.mark.django_db @@ -209,9 +215,14 @@ def test_promotion_with_title_change(): # Now create new DeltaUrl with updated title DeltaUrl.objects.create(collection=collection, url=url, scraped_title="New Title") # Changed title - # This should trigger the same error we're seeing in production + # Regression guard (production bug): updating a CuratedUrl that has an active + # title-pattern relationship must succeed and carry the new title through. collection.promote_to_curated() + curated = CuratedUrl.objects.get(collection=collection, url=url) + assert curated.scraped_title == "New Title" + assert pattern.curated_urls.filter(id=curated.id).exists() + @pytest.mark.django_db def test_promotion_maintains_pattern_relationships_through_updates(collection): diff --git a/sde_collections/tests/test_scrape_dispatch.py b/sde_collections/tests/test_scrape_dispatch.py index 47f5590d..5f6e87c9 100644 --- a/sde_collections/tests/test_scrape_dispatch.py +++ b/sde_collections/tests/test_scrape_dispatch.py @@ -1,15 +1,20 @@ # docker-compose -f local.yml run --rm django pytest sde_collections/tests/test_scrape_dispatch.py -from unittest.mock import patch +import json +import shlex +from unittest.mock import MagicMock, patch import pytest +from django.test import override_settings +from sde_collections.models.collection import Collection from sde_collections.models.collection_choice_fields import ( ReindexingStatusChoices, WorkflowStatusChoices, ) from sde_collections.models.scraper_config import ScrapeDispatch, ScraperConfigOverride from sde_collections.scraping.job_builder import build_job_json +from sde_collections.scraping.ssm_dispatch import send_job_to_crawler from sde_collections.tasks import dispatch_scrape_job from sde_collections.tests.factories import CollectionFactory @@ -84,6 +89,82 @@ def test_ready_for_engineering_no_longer_touches_sinequa_configs(self, mock_dela assert not hasattr(Collection, "create_scraper_job") +@pytest.mark.django_db +class TestSendJobToCrawler: + """The SSM boundary itself: every caller-side test mocks send_job_to_crawler, so the + script construction (quoting, atomic write, inbox path) must be proven here.""" + + @pytest.fixture(autouse=True) + def crawler_settings(self): + # override_settings can't decorate a plain (non-SimpleTestCase) class + with override_settings( + CRAWLER_INSTANCE_ID="i-0test", CRAWLER_INBOX_PATH="/opt/sde-crawler/jobs/incoming" + ): + yield + + def _dispatch(self, collection): + ssm = MagicMock() + ssm.send_command.return_value = {"Command": {"CommandId": "cmd-xyz"}} + session = MagicMock() + session.client.return_value = ssm + with patch("sde_collections.scraping.ssm_dispatch.get_boto3_session", return_value=session): + command_id = send_job_to_crawler(collection) + return command_id, ssm.send_command.call_args.kwargs + + def test_command_targets_crawler_instance_and_returns_command_id(self): + collection = CollectionFactory() + + command_id, kwargs = self._dispatch(collection) + + assert command_id == "cmd-xyz" + assert kwargs["InstanceIds"] == ["i-0test"] + assert kwargs["DocumentName"] == "AWS-RunShellScript" + + def test_script_delivers_exact_job_json_via_atomic_rename(self): + """Recover the payload by shell-splitting the script: what the shell would hand to + printf must round-trip back to build_job_json's output, and the write must land on + a .tmp path that is mv'd into the inbox last (the watcher must never see a partial + file).""" + collection = CollectionFactory() + + _, kwargs = self._dispatch(collection) + + lines = kwargs["Parameters"]["commands"][0].splitlines() + dest = f"/opt/sde-crawler/jobs/incoming/{collection.config_folder}.json" + + printf_tokens = shlex.split(lines[0]) + assert printf_tokens[0] == "printf" + assert json.loads(printf_tokens[2]) == build_job_json(collection) + assert printf_tokens[-1] == dest + ".tmp" + + assert shlex.split(lines[1]) == ["chown", "ec2-user:ec2-user", dest + ".tmp"] + assert shlex.split(lines[2]) == ["mv", "-f", dest + ".tmp", dest] + + def test_hostile_seed_url_survives_shell_quoting(self): + """Seed URLs contain quotes/spaces/ampersands that would break an unquoted heredoc.""" + collection = CollectionFactory() + Collection.objects.filter(id=collection.id).update( + url="https://example.nasa.gov/search?q='solar wind'&page=1" + ) + collection.refresh_from_db() + + _, kwargs = self._dispatch(collection) + + printf_tokens = shlex.split(kwargs["Parameters"]["commands"][0].splitlines()[0]) + payload = json.loads(printf_tokens[2]) + assert payload["seed"] == "https://example.nasa.gov/search?q='solar wind'&page=1" + + def test_comment_is_truncated_to_ssm_limit(self): + collection = CollectionFactory() + Collection.objects.filter(id=collection.id).update(config_folder="x" * 120) + collection.refresh_from_db() + + _, kwargs = self._dispatch(collection) + + assert len(kwargs["Comment"]) <= 100 + assert kwargs["Comment"].startswith("COSMOS scrape dispatch:") + + @pytest.mark.django_db class TestDispatchScrapeJobTask: @patch("sde_collections.tasks.send_job_to_crawler", return_value="cmd-abc123") diff --git a/sde_collections/tests/test_scrape_ingest.py b/sde_collections/tests/test_scrape_ingest.py index 2b9968bf..32e62a74 100644 --- a/sde_collections/tests/test_scrape_ingest.py +++ b/sde_collections/tests/test_scrape_ingest.py @@ -1,19 +1,27 @@ # docker-compose -f local.yml run --rm django pytest sde_collections/tests/test_scrape_ingest.py -from datetime import datetime, timedelta, timezone as dt_timezone -from unittest.mock import patch +import io +import json +from datetime import datetime, timedelta +from datetime import timezone as dt_timezone +from unittest.mock import MagicMock, patch import pytest +from botocore.exceptions import ClientError +from django.test import override_settings from django.utils import timezone -from sde_collections.models.collection import Collection from sde_collections.models.collection_choice_fields import ( ReindexingStatusChoices, WorkflowStatusChoices, ) from sde_collections.models.delta_url import DumpUrl from sde_collections.models.scraper_config import ScrapeDispatch -from sde_collections.scraping.s3_results import results_ready +from sde_collections.scraping.s3_results import ( + fetch_documents, + fetch_summary, + results_ready, +) from sde_collections.tasks import ( ingest_scraped_collection, migrate_dump_to_delta_and_handle_status_transistions, @@ -250,6 +258,81 @@ def test_rescrape_collections_are_polled(self, mock_ready, mock_ingest): mock_ingest.assert_called_once_with(collection.id) +def _s3_stub(get_object=None): + """Patchable session whose s3 client's get_object returns (or raises) the given value.""" + s3 = MagicMock() + if isinstance(get_object, BaseException): + s3.get_object.side_effect = get_object + else: + s3.get_object.return_value = get_object + session = MagicMock() + session.client.return_value = s3 + return session, s3 + + +def _client_error(code): + return ClientError({"Error": {"Code": code}}, "GetObject") + + +def _s3_object(payload, last_modified=None): + return { + "Body": io.BytesIO(json.dumps(payload).encode("utf-8")), + "LastModified": last_modified or datetime(2026, 8, 13, 12, 0, 0, tzinfo=dt_timezone.utc), + } + + +class TestS3ResultFetchers: + """The S3 boundary itself: the ingest/poll tests all mock fetch_summary/fetch_documents, + so the real key layout, bucket wiring and missing-key handling must be proven here. + The keys are the crawler's contract (sde_crawler/job.py::s3_keys_for_collection).""" + + @pytest.fixture(autouse=True) + def crawler_bucket(self): + # override_settings can't decorate a plain (non-SimpleTestCase) class + with override_settings(SDE_S3_BUCKET="crawler-bucket-test"): + yield + + def test_fetch_summary_reads_crawler_summary_key_and_returns_last_modified(self): + summary = make_summary(7) + modified = datetime(2026, 8, 14, 9, 30, 0, tzinfo=dt_timezone.utc) + session, s3 = _s3_stub(_s3_object(summary, modified)) + + with patch("sde_collections.scraping.s3_results.get_boto3_session", return_value=session): + result = fetch_summary("astro_data") + + assert result == (summary, modified) + s3.get_object.assert_called_once_with( + Bucket="crawler-bucket-test", Key="failure_logs/astro_data_failures_summary.json" + ) + + @pytest.mark.parametrize("code", ["NoSuchKey", "404"]) + def test_fetch_summary_missing_key_means_run_not_finished(self, code): + session, _ = _s3_stub(_client_error(code)) + + with patch("sde_collections.scraping.s3_results.get_boto3_session", return_value=session): + assert fetch_summary("astro_data") is None + + def test_fetch_summary_propagates_real_s3_errors(self): + """AccessDenied etc. must surface, not read as 'still crawling' forever.""" + session, _ = _s3_stub(_client_error("AccessDenied")) + + with patch("sde_collections.scraping.s3_results.get_boto3_session", return_value=session): + with pytest.raises(ClientError): + fetch_summary("astro_data") + + def test_fetch_documents_reads_scraped_collections_key(self): + documents = make_documents(2) + session, s3 = _s3_stub(_s3_object(documents)) + + with patch("sde_collections.scraping.s3_results.get_boto3_session", return_value=session): + result = fetch_documents("astro_data") + + assert result == documents + s3.get_object.assert_called_once_with( + Bucket="crawler-bucket-test", Key="scraped_collections/astro_data.json" + ) + + class TestResultsFreshness: """Stale-results regression guard: a summary older than the dispatch is treated as absent.""" diff --git a/sde_collections/tests/test_url_apis.py b/sde_collections/tests/test_url_apis.py index 8ce4d93a..2a216a1d 100644 --- a/sde_collections/tests/test_url_apis.py +++ b/sde_collections/tests/test_url_apis.py @@ -221,22 +221,25 @@ def test_candidate_url_api_serializer_fields(self, client): assert set(data.keys()) == expected_fields def test_candidate_url_api_alias(self, client): - """Should verify candidate-urls-api endpoint aliases to candidate-urls-api""" - candidate_url = CuratedUrlFactory(collection=self.collection, generated_title="Test Generated Title") + """The legacy candidate-urls-api route must serve the exact same payload as + curated-urls-api (both are wired to CuratedURLAPIView).""" + CuratedUrlFactory(collection=self.collection, generated_title="Test Generated Title") candidate_url = reverse( "sde_collections:candidate-url-api", kwargs={"config_folder": self.collection.config_folder} ) - candidate_url = reverse( - "sde_collections:candidate-url-api", kwargs={"config_folder": self.collection.config_folder} + curated_url = reverse( + "sde_collections:curated-url-api", kwargs={"config_folder": self.collection.config_folder} ) + assert candidate_url != curated_url # distinct routes, same view candidate_response = client.get(candidate_url) - candidate_response = client.get(candidate_url) + curated_response = client.get(curated_url) assert candidate_response.status_code == status.HTTP_200_OK - assert candidate_response.status_code == status.HTTP_200_OK - assert candidate_response.json()["results"] == candidate_response.json()["results"] + assert curated_response.status_code == status.HTTP_200_OK + assert len(candidate_response.json()["results"]) == 1 + assert candidate_response.json()["results"] == curated_response.json()["results"] def test_multiple_collections(self, client): """Should only return URLs from the specified collection""" diff --git a/sde_collections/tests/test_workflow_status_triggers.py b/sde_collections/tests/test_workflow_status_triggers.py index 217e074d..f26b29ee 100644 --- a/sde_collections/tests/test_workflow_status_triggers.py +++ b/sde_collections/tests/test_workflow_status_triggers.py @@ -131,7 +131,9 @@ def test_mapped_transition_sends_message_once(self, mock_send, mock_dispatch): self.collection.save() mock_send.assert_called_once() - assert self.collection.name in mock_send.call_args.args[0] or "<" in mock_send.call_args.args[0] + message = mock_send.call_args.args[0] + assert self.collection.name in message + assert "Ready for engineering" in message @patch("sde_collections.models.collection.send_slack_message") def test_unmapped_transition_sends_nothing(self, mock_send): From b9fe968d0056a96753f6ccf8c3db86e6e33705f9 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 21 Aug 2026 17:01:06 +0000 Subject: [PATCH 13/20] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- rewiring_decisions.md | 40 +++++++++---------- sde_collections/admin.py | 2 +- sde_collections/indexing/dispatch.py | 15 ++++--- sde_collections/signals.py | 8 +--- sde_collections/tasks.py | 8 +--- sde_collections/tests/test_database_backup.py | 4 +- sde_collections/tests/test_scrape_dispatch.py | 12 ++---- sde_collections/tests/test_scrape_ingest.py | 12 ++---- sde_collections/utils/slack_utils.py | 3 +- sde_collections/views.py | 1 + 10 files changed, 44 insertions(+), 61 deletions(-) diff --git a/rewiring_decisions.md b/rewiring_decisions.md index 01db369b..ea7d104b 100644 --- a/rewiring_decisions.md +++ b/rewiring_decisions.md @@ -1,25 +1,25 @@ -1. Disable the inference pipeline \- path of least resistance \- we don’t want to delete functionality -2. Look at api indexing pipeline for context on how to start indexing and/ use same resources to start indexing web content -3. Dhanurs Django/COSMOS cheat commands - 1. **Run:** - 2. docker-compose \-f local.yml build - 3. docker-compose \-f local.yml up - - 5. **Docker shell:** +1. Disable the inference pipeline \- path of least resistance \- we don’t want to delete functionality +2. Look at api indexing pipeline for context on how to start indexing and/ use same resources to start indexing web content +3. Dhanurs Django/COSMOS cheat commands + 1. **Run:** + 2. docker-compose \-f local.yml build + 3. docker-compose \-f local.yml up + + 5. **Docker shell:** 6. docker-compose \-f local.yml run \--rm django python manage.py shell\_plus - - 7. **Migrations:** - 8. docker-compose \-f local.yml run \--rm django python manage.py makemigrations - 9. docker-compose \-f local.yml run \--rm django python manage.py makemigrations \--merge - 10. docker-compose \-f local.yml run \--rm django python manage.py migrate - 12. docker-compose \-f local.yml logs \-f celeryworker - 13. docker-compose \-f local.yml logs \-f celerybeat - - -Use scraper repo also as context \- ssm the .json file + 7. **Migrations:** + 8. docker-compose \-f local.yml run \--rm django python manage.py makemigrations + 9. docker-compose \-f local.yml run \--rm django python manage.py makemigrations \--merge + 10. docker-compose \-f local.yml run \--rm django python manage.py migrate + 12. docker-compose \-f local.yml logs \-f celeryworker + 13. docker-compose \-f local.yml logs \-f celerybeat + + + +Use scraper repo also as context \- ssm the .json file -4. Remove references to XML config generation for sinequa -5. Provide context of how sinequa is replaced with this new backend, purpose of this integration included \ No newline at end of file +4. Remove references to XML config generation for sinequa +5. Provide context of how sinequa is replaced with this new backend, purpose of this integration included diff --git a/sde_collections/admin.py b/sde_collections/admin.py index a81a85ba..7025c564 100644 --- a/sde_collections/admin.py +++ b/sde_collections/admin.py @@ -14,8 +14,8 @@ from .models.collection import Collection, ReindexingHistory, WorkflowHistory from .models.collection_choice_fields import TDAMMTags from .models.delta_url import CuratedUrl, DeltaUrl, DumpUrl -from .models.pattern import DivisionPattern, IncludePattern, TitlePattern from .models.indexing import IndexDispatch +from .models.pattern import DivisionPattern, IncludePattern, TitlePattern from .models.scraper_config import ScrapeDispatch, ScraperConfigOverride diff --git a/sde_collections/indexing/dispatch.py b/sde_collections/indexing/dispatch.py index ce7a5096..12619cc5 100644 --- a/sde_collections/indexing/dispatch.py +++ b/sde_collections/indexing/dispatch.py @@ -45,11 +45,16 @@ def run_index_task(collection, target: str, run_id: str) -> str: # wholesale, and the indexer image has no ENTRYPOINT — so the # executable must be restated here, not just the flags. "command": [ - "python3", "api_scraper.py", - "--source", "WEB_COSMOS", - "--collection", collection.config_folder, - "--target", target, - "--run-id", run_id, + "python3", + "api_scraper.py", + "--source", + "WEB_COSMOS", + "--collection", + collection.config_folder, + "--target", + target, + "--run-id", + run_id, ], } ] diff --git a/sde_collections/signals.py b/sde_collections/signals.py index 6020fe86..aaad28dd 100644 --- a/sde_collections/signals.py +++ b/sde_collections/signals.py @@ -45,9 +45,5 @@ def crontab_every(minutes): ) return crontab - _ensure_beat_row( - POLL_SCRAPE_TASK_NAME, POLL_SCRAPE_TASK, crontab_every(5), settings.SCRAPE_POLL_ENABLED - ) - _ensure_beat_row( - POLL_INDEX_TASK_NAME, POLL_INDEX_TASK, crontab_every(2), settings.INDEX_POLL_ENABLED - ) + _ensure_beat_row(POLL_SCRAPE_TASK_NAME, POLL_SCRAPE_TASK, crontab_every(5), settings.SCRAPE_POLL_ENABLED) + _ensure_beat_row(POLL_INDEX_TASK_NAME, POLL_INDEX_TASK, crontab_every(2), settings.INDEX_POLL_ENABLED) diff --git a/sde_collections/tasks.py b/sde_collections/tasks.py index 5d8882af..41131743 100644 --- a/sde_collections/tasks.py +++ b/sde_collections/tasks.py @@ -347,9 +347,7 @@ def ingest_scraped_collection(collection_id, claim=True): # Zero-document completion is a failure: without this, an empty crawl would # "succeed" and silently publish an empty collection. if summary.get("documents_scraped", 0) == 0: - Collection.objects.filter(id=collection_id).update( - workflow_status=WorkflowStatusChoices.SCRAPING_FAILED - ) + Collection.objects.filter(id=collection_id).update(workflow_status=WorkflowStatusChoices.SCRAPING_FAILED) return f"Scrape of {cid} completed with 0 documents; marked Scraping Failed." if claim: @@ -394,7 +392,5 @@ def ingest_scraped_collection(collection_id, claim=True): except Exception as e: # Never leave a claimed collection stuck in SCRAPING_SUCCESSFUL with no DumpUrls. print(f"Ingest failed for {cid}: {e}") - Collection.objects.filter(id=collection_id).update( - workflow_status=WorkflowStatusChoices.SCRAPING_FAILED - ) + Collection.objects.filter(id=collection_id).update(workflow_status=WorkflowStatusChoices.SCRAPING_FAILED) return None diff --git a/sde_collections/tests/test_database_backup.py b/sde_collections/tests/test_database_backup.py index 7556a8e3..5f895f96 100644 --- a/sde_collections/tests/test_database_backup.py +++ b/sde_collections/tests/test_database_backup.py @@ -189,9 +189,7 @@ def fake_pg_dump(cmd, env, check): output = tmp_path / "backup.sql" out = StringIO() - with patch.object( - database_backup.Command, "compress_file", side_effect=Exception("Compression failed") - ): + with patch.object(database_backup.Command, "compress_file", side_effect=Exception("Compression failed")): call_command("database_backup", output=str(output), stdout=out) # must not raise assert "Error during backup process" in out.getvalue() diff --git a/sde_collections/tests/test_scrape_dispatch.py b/sde_collections/tests/test_scrape_dispatch.py index 5f6e87c9..dd5d9f62 100644 --- a/sde_collections/tests/test_scrape_dispatch.py +++ b/sde_collections/tests/test_scrape_dispatch.py @@ -97,9 +97,7 @@ class TestSendJobToCrawler: @pytest.fixture(autouse=True) def crawler_settings(self): # override_settings can't decorate a plain (non-SimpleTestCase) class - with override_settings( - CRAWLER_INSTANCE_ID="i-0test", CRAWLER_INBOX_PATH="/opt/sde-crawler/jobs/incoming" - ): + with override_settings(CRAWLER_INSTANCE_ID="i-0test", CRAWLER_INBOX_PATH="/opt/sde-crawler/jobs/incoming"): yield def _dispatch(self, collection): @@ -143,9 +141,7 @@ def test_script_delivers_exact_job_json_via_atomic_rename(self): def test_hostile_seed_url_survives_shell_quoting(self): """Seed URLs contain quotes/spaces/ampersands that would break an unquoted heredoc.""" collection = CollectionFactory() - Collection.objects.filter(id=collection.id).update( - url="https://example.nasa.gov/search?q='solar wind'&page=1" - ) + Collection.objects.filter(id=collection.id).update(url="https://example.nasa.gov/search?q='solar wind'&page=1") collection.refresh_from_db() _, kwargs = self._dispatch(collection) @@ -197,9 +193,7 @@ def test_redispatch_keeps_prior_dispatch_rows(self, mock_send): dispatch_scrape_job(collection.id) - ids = list( - ScrapeDispatch.objects.filter(collection=collection).values_list("ssm_command_id", flat=True) - ) + ids = list(ScrapeDispatch.objects.filter(collection=collection).values_list("ssm_command_id", flat=True)) assert set(ids) == {"cmd-1", "cmd-2"} # Meta.ordering is -dispatched_at: first row is the latest dispatch assert ScrapeDispatch.objects.filter(collection=collection).first().ssm_command_id == "cmd-2" diff --git a/sde_collections/tests/test_scrape_ingest.py b/sde_collections/tests/test_scrape_ingest.py index 32e62a74..43077c1b 100644 --- a/sde_collections/tests/test_scrape_ingest.py +++ b/sde_collections/tests/test_scrape_ingest.py @@ -51,9 +51,7 @@ def make_summary(documents_scraped): def backdate_dispatch(dispatch, hours): - ScrapeDispatch.objects.filter(id=dispatch.id).update( - dispatched_at=timezone.now() - timedelta(hours=hours) - ) + ScrapeDispatch.objects.filter(id=dispatch.id).update(dispatched_at=timezone.now() - timedelta(hours=hours)) @pytest.mark.django_db @@ -169,9 +167,7 @@ def test_rescrape_path_ends_ready_for_recuration(self, mock_ready, mock_docs, mo @patch("sde_collections.tasks.send_detailed_import_notification") @patch("sde_collections.tasks.fetch_documents") @patch("sde_collections.tasks.results_ready") - def test_end_to_end_reaches_ready_for_curation_with_inference_off( - self, mock_ready, mock_docs, mock_slack - ): + def test_end_to_end_reaches_ready_for_curation_with_inference_off(self, mock_ready, mock_docs, mock_slack): """P2+P4 integration: ingest -> SCRAPING_SUCCESSFUL -> migrate -> READY_FOR_CURATION, with the ingest summary posted to Slack.""" collection = CollectionFactory(workflow_status=WorkflowStatusChoices.READY_FOR_ENGINEERING) @@ -328,9 +324,7 @@ def test_fetch_documents_reads_scraped_collections_key(self): result = fetch_documents("astro_data") assert result == documents - s3.get_object.assert_called_once_with( - Bucket="crawler-bucket-test", Key="scraped_collections/astro_data.json" - ) + s3.get_object.assert_called_once_with(Bucket="crawler-bucket-test", Key="scraped_collections/astro_data.json") class TestResultsFreshness: diff --git a/sde_collections/utils/slack_utils.py b/sde_collections/utils/slack_utils.py index 8e80cb79..baff671f 100644 --- a/sde_collections/utils/slack_utils.py +++ b/sde_collections/utils/slack_utils.py @@ -119,8 +119,7 @@ def send_indexing_validation_report(collection_name, run_id, validation): the curation channel so the curator can set the QC status from it.""" if validation is None: message = ( - f"Test indexing of '{collection_name}' succeeded (run {run_id}), " - f"but no validation report was found." + f"Test indexing of '{collection_name}' succeeded (run {run_id}), " f"but no validation report was found." ) else: missing = validation.get("titles_missing_in_index") or [] diff --git a/sde_collections/views.py b/sde_collections/views.py index c2e02b5d..cdbbafc7 100644 --- a/sde_collections/views.py +++ b/sde_collections/views.py @@ -51,6 +51,7 @@ IncludePatternSerializer, TitlePatternSerializer, ) + User = get_user_model() From 09ac58e4d4af78406612d45c24c44e44630df579 Mon Sep 17 00:00:00 2001 From: Bernard Benson Date: Fri, 21 Aug 2026 15:55:26 -0500 Subject: [PATCH 14/20] updated docs --- .github/ISSUE_TEMPLATE/bug_report.md | 2 +- CODE_STANDARDS.md | 5 +- IMPLEMENTATION_PLAN.md | 141 ++-- INDEXING_HANDOFF_TODO.md | 755 ++++++++++++++++++ LOCAL_VERIFICATION_GUIDE.md | 39 +- README.md | 97 ++- SQLDumpRestoration.md | 131 ++- TEST_AUDIT.md | 112 --- .../testing_strategy.md | 329 ++++---- docs/howto.rst | 2 +- docs/index.rst | 8 +- inference/inference_pipeline_queue.md | 19 +- inference/results_processing.md | 9 +- rewiring_decisions.md | 25 - scripts/ej/README.md | 2 +- sde_collections/DEPLOYMENT.md | 29 +- sde_collections/models/README.md | 6 + sde_collections/models/README_LIFECYCLE.md | 32 +- .../models/README_MANUAL_TESTING.md | 329 ++++---- .../models/README_PATTERN_SYSTEM.md | 2 +- .../models/README_REINDEXING_STATUSES.md | 70 +- 21 files changed, 1468 insertions(+), 676 deletions(-) create mode 100644 INDEXING_HANDOFF_TODO.md delete mode 100644 TEST_AUDIT.md delete mode 100644 rewiring_decisions.md diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 8b8b6d5a..94a0dfc8 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -11,7 +11,7 @@ assignees: '' A clear and concise description of what the bug is. ## Steps To Reproduce -Steps to reproduce the behavior on https://sde-indexing-helper.nasa-impact.net/: +Steps to reproduce the behavior on the COSMOS web application: 1. Go to '...' 2. Click on '....' 3. Scroll down to '....' diff --git a/CODE_STANDARDS.md b/CODE_STANDARDS.md index 39d473b7..9616173b 100644 --- a/CODE_STANDARDS.md +++ b/CODE_STANDARDS.md @@ -47,10 +47,9 @@ The following pre-commit hooks are configured: - black: Formats Python code to ensure consistent styling. - isort: Sorts imports alphabetically and automatically separated into sections. - flake8: Lints code to catch styling errors and potential bugs. -- mypy: Checks type annotations to catch potential bugs. +- mypy: Configured to check type annotations, but currently a no-op — the hook sets `exclude: "."`, so no files are checked. - bandit: Scans code for common security issues. -- gitleaks: Prevents secrets from being committed to the repository. -- hadolint: Lints Dockerfiles to ensure best practices and common conventions are followed. +- gitleaks: Intended to prevent secrets from being committed to the repository. Known gap: the hook passes `--config=gitleaks-config.toml`, and that file does not exist in the repository, so the hook fails instead of scanning. ## Continuous Integration (CI) When a commit is pushed to a branch that is part of a Pull Request, our Continuous Integration (CI) pipeline automatically runs specified tools to check code quality, style, security and other standards. If these checks fail, the PR cannot be merged until all issues are resolved. diff --git a/IMPLEMENTATION_PLAN.md b/IMPLEMENTATION_PLAN.md index dad17354..1a0fc4ef 100644 --- a/IMPLEMENTATION_PLAN.md +++ b/IMPLEMENTATION_PLAN.md @@ -4,9 +4,8 @@ > > Update the checkboxes in this file as work lands. This document is the progress tracker. > -> Companion documents: [`WORKFLOW.md`](./WORKFLOW.md) (what the pipeline does), -> [`sde_collections/DEPLOYMENT.md`](./sde_collections/DEPLOYMENT.md) (how it deploys), -> [`rewiring_decisions.md`](./rewiring_decisions.md) (why). +> Companion documents: [`WORKFLOW.md`](./WORKFLOW.md) (what the pipeline does) and +> [`sde_collections/DEPLOYMENT.md`](./sde_collections/DEPLOYMENT.md) (how it deploys). --- @@ -23,9 +22,8 @@ COSMOS ──SSM job JSON──► crawl4ai scraper on EC2 ──► S3 ── └──► DeltaUrl ──curation──► CuratedUrl ──► OpenSearch (test) ──QC──► OpenSearch (prod) ``` -`sde_collections/DEPLOYMENT.md` is the companion CI/CD spec. Both, plus -`rewiring_decisions.md` and `WORKFLOW_DIAGRAM.png`, are currently **untracked** files on branch -`cosmos-rewiring`, which has no commits of its own. +`sde_collections/DEPLOYMENT.md` is the companion CI/CD spec. Both, plus `WORKFLOW_DIAGRAM.png`, +are tracked on branch `cosmos-rewiring`. **Intended outcome:** COSMOS dispatches scrape jobs, ingests results from S3, drives curation to `CuratedUrl`, and hands curated content to an indexing pipeline — with Sinequa removed, the @@ -37,7 +35,7 @@ inference pipeline dormant, and a repeatable deploy path. |---|---| | Scope | Pipeline rewiring **+** the CI/CD machinery from `DEPLOYMENT.md` | | Sinequa | **Delete outright** (unwire first, then remove the files) | -| Indexing pipeline (chunk → SageMaker → AOSS) | **Built as a `WEB_COSMOS` source inside `sde-api-scrapers`** (branch `web-indexing`) — supersedes the earlier "separate repo" call: the quantization math must stay byte-identical to what built the live index, so `uploader/` is reused, not forked. Event-triggered from COSMOS via cross-account `ecs:RunTask`. Its phases W0–W3 + W5 are **code-complete** (209 offline tests, `cdk synth` clean); this plan owns only the COSMOS side — its Phase 7 = that repo's **W4** | +| Indexing pipeline (chunk → SageMaker → AOSS) | **Built as a `WEB_COSMOS` source inside `sde-api-scrapers`** (branch `web-indexing`) — supersedes the earlier "separate repo" call: the quantization math must stay byte-identical to what built the live index, so `uploader/` is reused, not forked. Event-triggered from COSMOS via `ecs:RunTask` through an assume-role indirection (same-account in dev — both repos deploy into `998871305517`; kept so test/prod can be cross-account later). Its phases W0–W3 + W5 are **code-complete** (316 offline tests) and **deployed to dev 2026-08-20** (merged to `develop`, PR #47); this plan owns only the COSMOS side — its Phase 7 = that repo's **W4** | | Validation per phase | pytest with mocked AWS; manual smoke tests against the real `sde-dev` account | ### Decisions added after plan review (2026-08-11) — confirm with team @@ -79,7 +77,6 @@ inference pipeline dormant, and a repeatable deploy path. COSMOS/ ├── WORKFLOW.md ← tracked (was untracked) ├── WORKFLOW_DIAGRAM.png ← tracked -├── rewiring_decisions.md ← tracked ├── ecr.override.yml ★ P9 ├── scripts/deploy.sh ★ P9 ├── .github/workflows/ @@ -145,7 +142,7 @@ COSMOS/ | `sde_collections/utils/aws.py` | **New.** `get_boto3_session()` | | `.env_sample`, `.envs/.local/.django` | Document the new vars | | `requirements/base.txt` | No change yet (boto3 already pinned at `1.34.31`) | -| `git add` the four untracked docs | Bring `WORKFLOW.md`, `WORKFLOW_DIAGRAM.png`, `rewiring_decisions.md`, `sde_collections/DEPLOYMENT.md` under version control | +| `git add` the untracked docs | Bring `WORKFLOW.md`, `WORKFLOW_DIAGRAM.png`, `sde_collections/DEPLOYMENT.md` under version control | ### New settings @@ -288,7 +285,7 @@ New tests in `sde_collections/tests/test_workflow_status_triggers.py`: ## Phase 2 — Disable the inference pipeline (do not delete) -**Goal:** `rewiring_decisions.md` item 1 — path of least resistance, keep the functionality. +**Goal:** path of least resistance — keep the functionality, just stop it running. ### The trap @@ -629,7 +626,7 @@ and Slack posts the curation message. ## Phase 6 — Delete Sinequa -**Goal:** `rewiring_decisions.md` items 4–5. Nothing in the pipeline path depends on Sinequa after +**Goal:** remove Sinequa entirely. Nothing in the pipeline path depends on it after Phase 5, so this is now a pure removal. ### Delete outright @@ -692,22 +689,25 @@ inherits `base.py`, so a lingering required var would mask a missed reference. ## Phase 7 — Indexing hand-off: export, dispatch, poll (= `sde-api-scrapers` Phase W4) -**No longer "deferred until the pipeline exists" — the pipeline exists.** It landed as a -`WEB_COSMOS` source on the **`web-indexing` branch of `sde-api-scrapers`** (its phases W0 +**No longer "deferred until the pipeline exists" — the pipeline exists and is deployed to dev.** +It landed as a `WEB_COSMOS` source in **`sde-api-scrapers`** (built on branch `web-indexing`, +**merged to `develop` in PR #47 @ `c2aebad` and deployed to dev 2026-08-20** — NS.2; its phases W0 foundations, W1 shared-component parameterization, W2 web pipeline, W3 infrastructure, and W5 tests -are code-complete: 209 offline tests green, `cdk synth` clean for dev/test/prod — but **nothing has -run against real AWS yet**, and all runtime defaults there target the disposable **`sde-web-copy`** -index until an explicit cutover). What remains here is exactly that repo's **Phase W4 — the +are code-complete: 316 offline tests green — but **no run has executed against real AWS yet**, and +all runtime defaults there target the disposable **`sde-web-subset`** +index — a scratch subset of live `sde-web`, which replaced `sde-web-copy` on 2026-08-19 (`10975ee`) — until an explicit cutover). What remains here is exactly that repo's **Phase W4 — the COSMOS side**: export, dispatch, poll, Slack. Authoritative docs on that branch: `DESIGN.md`, -`Web Indexing - Task Plan & Tracking.md`, `Update.md`, `open_questions.md` (decision record). +`Web Indexing - Task Plan & Tracking.md`, `open_questions.md` (decision record), +`FINDING_id_scheme_collision.md`. -**Still blocked on Phase 5** (the stubs this phase fills in). Everything indexer-side is -independent of COSMOS and is exercised from its own CLI against hand-written exports. +**Phase 5 landed (`9b3df519`) and this phase is committed (`6fa19843`, dispatch fix `20c919ed`).** +Everything indexer-side is independent of COSMOS and is exercised from its own CLI against +hand-written exports; only the closed loop (their E2E.10) is still open — see "Cross-repo status". ### The contract (fixed by the built indexer — do not re-negotiate silently) 1. **Export (COSMOS → S3).** Write to the dedicated bucket **`sde-cosmos-indexing-{env}`** - (cross-account; **not** the crawler's `SDE_S3_BUCKET`): + (owned by the indexer stacks; **not** the crawler's `SDE_S3_BUCKET`): ``` curated_collections/{config_folder}/{run_id}/documents.jsonl @@ -780,7 +780,7 @@ timeout (measured from `dispatched_at`) → `INDEXING_FAILED_ON_TEST` / `INDEXIN The `run_id` namespacing means an old run's `status.json` can never satisfy a newer dispatch — no `LastModified` freshness rule needed (unlike the P4 crawler contract). -### Cross-repo status (updated 2026-08-13 from their tracker's "Next Steps" — NS numbering is theirs) +### Cross-repo status (updated 2026-08-20 from their tracker's "Next Steps" — NS numbering is theirs) > **Correction: there is no cross-account boundary in dev.** Verified by the indexer team against > AWS: the COSMOS Django host (`i-02b3d3e1ac0671952`, instance profile `indexing-helper-role`), the @@ -789,31 +789,72 @@ The `run_id` namespacing means an old run's `status.json` can never satisfy a ne > the account both repos already deploy into. The assume-role indirection stays anyway (dispatch.py > is unchanged), so test/prod can move to a genuinely separate account later. Test/prod account ids > remain unknown but block nothing until those tiers exist (their NS.5). - -- [ ] **NS.1 (their side):** fill `COSMOS_AWS_ACCOUNT_ID[DEV] = "998871305517"` — this is what makes - their CDK synthesize the `sde-cosmos-indexing-dev` bucket policy and - `CosmosIndexingDispatchRole-dev`. They will also narrow the role's trust from - `AccountPrincipal` to `ArnPrincipal(...role/indexing-helper-role)` — **which means COSMOS's - host role `indexing-helper-role` needs `sts:AssumeRole` on the dispatch role in its identity - policy** (a COSMOS deploy-time item; fold into P9's preflight). -- [ ] **NS.2 (their side):** deploy the `web-indexing` branch stacks to dev (nothing from the branch - exists in AWS yet — bucket/role/task-family absence re-confirmed by both teams 2026-08-13). -- [ ] **NS.3 (their side → our env):** they send the Fargate network values (their cluster uses the - default VPC, so it's a lookup, not code). On receipt, set in COSMOS dev env: - `INDEXING_SUBNETS`, `INDEXING_SECURITY_GROUPS`, plus the known values +> +> **Everything on both sides is code-complete, and the indexer is deployed to dev (NS.2 done +> 2026-08-20** — `web-indexing` merged to `develop`, PR #47 @ `c2aebad`, stacks deployed via CI). +> **NS.6 is also done (2026-08-20)** — the `sts:AssumeRole` grant is attached and was verified live +> from the COSMOS staging host. What remains is the network values in our env (NS.3) and the +> closed-loop proof (E2E.10). See `INDEXING_HANDOFF_TODO.md` for the step-by-step — note its C.* +> steps target the **staging** host `i-08f9b2175b70fa05c`, not production. + +- [x] **NS.1 (their side) — DONE 2026-08-13 (their W3.9):** `COSMOS_AWS_ACCOUNT_ID[DEV] = "998871305517"` + is filled, so their CDK now synthesizes the `sde-cosmos-indexing-dev` bucket policy and + `CosmosIndexingDispatchRole-dev`. Both grants name our host role + `arn:aws:iam::998871305517:role/indexing-helper-role` directly (`ArnPrincipal`, not + `AccountPrincipal`) — verified by rendering the CloudFormation. Consequence for us is NS.6. +- [x] **NS.2 (their side) — DONE 2026-08-20:** `web-indexing` merged to `develop` (PR #47 @ + `c2aebad`) and the stacks deployed to dev via CI. Stack outputs verified by the indexer team: + `sde-cosmos-indexing-dev` bucket, `CosmosIndexingDispatchRole-dev`, + `web_cosmos-scraper-dev:1` task def, `ScheduledRulesCount = 0` (correct — on-demand only). + The residual ECR check is also **done 2026-08-20**: `:latest` (digest `ae1c9e02…`) is + co-tagged with the exact merge commit `c2aebad…` and passed the offline tokenizer check + against that digest. Unblocks NS.3, NS.6, E2E.10. +- [ ] **NS.3 (their side → our env) — unblocked:** the Fargate network values (their cluster uses + the default VPC, so it's a lookup, not code; values were pre-looked-up 2026-08-18 — see + `INDEXING_HANDOFF_TODO.md` I.3 — and need re-confirming post-deploy). On receipt, set in + COSMOS dev env: `INDEXING_SUBNETS`, `INDEXING_SECURITY_GROUPS`, plus the known values `SDE_INDEX_BUCKET=sde-cosmos-indexing-dev`, `INDEXING_ECS_CLUSTER=api-scrapers-cluster-dev`, `INDEXING_TASK_FAMILY=web_cosmos-scraper-dev`, - `INDEXING_DISPATCH_ROLE_ARN=arn:aws:iam::998871305517:role/CosmosIndexingDispatchRole-dev`. -- [ ] **NS.4 (our side): commit Phase 7.** Their tracker flags our indexing work as complete but - uncommitted — "the closed loop is unreviewable until it lands." + `INDEXING_DISPATCH_ROLE_ARN=arn:aws:iam::998871305517:role/CosmosIndexingDispatchRole-dev`; + then `manage.py migrate` (the poller beat row is written at `post_migrate`) and restart. +- [x] **NS.4 (our side) — DONE 2026-08-13:** Phase 7 committed as `6fa19843` (+ plan `a3a1ab45`), + verified by the indexer team 2026-08-14, including `test_indexing_dispatch.py` and migration + `0080_indexdispatch`. +- [x] **NS.6 (our side) — DONE 2026-08-20:** inline policy `CosmosIndexingDispatch-dev` on + `indexing-helper-role` grants `sts:AssumeRole` on + `arn:aws:iam::998871305517:role/CosmosIndexingDispatchRole-dev` (a same-account trust is + satisfied only by the identity policy). Verified three ways: policy read back after + `put-role-policy`, `aws iam simulate-principal-policy` → `allowed`, and a live + `aws sts assume-role` **from the COSMOS staging host** returning credentials + (`Expiration = 2026-08-20T22:53:59+00:00`). This was the only IAM change needed on our side — + the indexer's bucket policy names our role directly, so no S3 statements were required. + P9's `preflight_aws` will *check* this grant; it did not create it. + **Host note:** the COSMOS indexing loop runs on the **staging** box + `i-08f9b2175b70fa05c` (`COSMOS Staging`, `18.215.146.207`, `ssh staging_cosmos`), not + production `i-02b3d3e1ac0671952`. Both share the `indexing-helper-role` instance profile, so + this grant covers either; NS.3's env values go on staging. `i-0178c998e868792d7` + (`COSMOS_Staging_Refresh`) has no instance profile and cannot dispatch. + Also attached `AmazonSSMManagedInstanceCore` to the role — neither COSMOS box had ever + registered with SSM; until an agent restart is confirmed, use SSH rather than + `ssm start-session`. +- [x] **NS.8 (our side) — DONE 2026-08-14 (`20c919ed`):** the `RunTask` command override was + flags-only; the indexer image has no `ENTRYPOINT`, and an ECS override replaces the command + wholesale, so every dispatched task would have died on "executable file not found". Fixed to + lead with `python3 api_scraper.py`; `test_indexing_dispatch.py` now pins the full command. + Container name (`WEB_COSMOSContainer`) and the omitted `--web-index` (so their + `WEB_INDEX_NAME` default governs — `sde-web-copy` at the time, `sde-web-subset` since 2026-08-19) were confirmed correct. - [x] **Contract verified by the indexer team (2026-08-13)** — they read our `export.py` against their `cosmos_source.py`/`web_processor.py`: manifest fields, JSONL names, label resolution, `tdamm_tag`/`is_metadata_viewer` handling all match. *"Nothing to renegotiate."* - [x] AOSS data-access policy for dev (their OOB.2) — **already satisfied**: the existing - `sde-services-access` policy's `index/sde-binary/sde-*` wildcard covers `sde-web-copy`, with - `ApiScraperTaskRole-dev` as principal. `version: keyword` is already mapped on `sde-web-copy` - (431,363 docs); their OOB.1 (`version` on live `sde-web`) is **cutover-only**. -- [ ] **Cutover awareness:** flipping the indexer's `WEB_INDEX_NAME` from `sde-web-copy` to + `sde-services-access` policy's `index/sde-binary/sde-*` wildcard covers `sde-web-copy` **and** + `sde-web-subset`, with `ApiScraperTaskRole-dev` as principal. The subset mapping check + (**OOB.3**) was **verified 2026-08-20**: `sde-web-subset` carries the checked-in mapping + (`version: keyword`, knn 768/BINARY incl. nested full-text); census 59 docs across 2 + collections (`astromaterials_data_system` 52, `aurorasaurus_…` 7), none carrying `version` + (expected first-run profile), 0 id-scheme mismatches, 0 duplicate URLs. Their OOB.1 + (`version` on live `sde-web`) is **cutover-only**. +- [ ] **Cutover awareness:** flipping the indexer's `WEB_INDEX_NAME` from `sde-web-subset` (was `sde-web-copy` until 2026-08-19) to `sde-web` *is* the production cutover; COSMOS needs no change for it. Their open id-scheme-collision finding (12 collections, incl. 100% of `gcn_circulars`) is an indexer-side guard/repair — COSMOS is unaffected but should not onboard those collections @@ -835,8 +876,10 @@ completes a newer dispatch. - [x] `QC_PERFECT`/`QC_MINOR` dispatches a prod run and lands on `PROD_PERFECT`/`PROD_MINOR` - [x] Failure/stall paths land on `INDEXING_FAILED_ON_TEST`/`INDEXING_FAILED_ON_PROD` - [ ] Closed loop verified against dev (their E2E.10): Curated → export → `RunTask` → poller → Slack - *(gated on their NS.1 + NS.2 + NS.3 — see "Cross-repo status" above. All implementation on - both sides is done; what remains is their dev deploy plus env values on ours)* + *(their NS.2 deploy DONE 2026-08-20; our NS.6 `sts:AssumeRole` grant DONE 2026-08-20 and + verified live from the staging host. The one remaining gate is NS.3: env values + + `migrate` + restart on `i-08f9b2175b70fa05c` (`ssh staging_cosmos`). Step-by-step in + `INDEXING_HANDOFF_TODO.md` C.2–C.4)* --- @@ -876,7 +919,7 @@ clean host needs dummy Sinequa secrets to boot. | File | Content | |---|---| | `sde_collections/management/commands/validate_deploy_env.py` | **New.** Fails if required settings are missing. Once P7 lands, it must also require the indexing settings (`SDE_INDEX_BUCKET`, `INDEXING_ECS_CLUSTER`, `INDEXING_TASK_FAMILY`, `INDEXING_DISPATCH_ROLE_ARN`, and the Fargate networking pair `INDEXING_SUBNETS`/`INDEXING_SECURITY_GROUPS`) non-empty on deployed hosts. (Test/prod endpoint separation is enforced **indexer-side** — its target→endpoint resolution is tier-capped — so COSMOS has no endpoint-equality check to make) | -| `sde_collections/management/commands/preflight_aws.py` | **New.** SSM reachability to the crawler instance and S3 read on `SDE_S3_BUCKET`, using `get_boto3_session()` from P0. Reports each check independently rather than aborting on the first failure. P7 adds checks on `SDE_INDEX_BUCKET` (write `curated_collections/*`, read `index_runs/*`) and an `sts:AssumeRole` on the dispatch role; COSMOS never gets AOSS/SageMaker access, so no such checks exist here | +| `sde_collections/management/commands/preflight_aws.py` | **New.** SSM reachability to the crawler instance and S3 read on `SDE_S3_BUCKET`, using `get_boto3_session()` from P0. Reports each check independently rather than aborting on the first failure. P7 adds checks on `SDE_INDEX_BUCKET` (write `curated_collections/*`, read `index_runs/*`) and an `sts:AssumeRole` on the dispatch role (the grant itself is NS.6, made manually once the role is deployed — preflight verifies it, it does not create it); COSMOS never gets AOSS/SageMaker access, so no such checks exist here | | `config/urls.py` + a `healthz` view | **New.** There is **no health endpoint in the repo today**; the deploy smoke checks need one. Minimal 200 + DB connectivity, unauthenticated | | `.pre-commit-config.yaml` | **Fix:** the gitleaks hook passes `--config=gitleaks-config.toml`, but that file does not exist and is not tracked — the hook fails instead of scanning. Add the config or drop the arg | | `scripts/deploy.sh` | **New.** The single definition of a deploy, in `DEPLOYMENT.md`'s order: fetch artifact → `validate_deploy_env` → backup (prod only) → `migrate` → `docker compose up -d` → smoke checks → rollback on failure | @@ -954,9 +997,12 @@ Then, against the dev AWS account: results land, and that the collection reaches **Ready for Re-Curation**. Steps beyond 8 (test indexing, validation, prod indexing) need **Phase 7**. The indexer side is -code-complete on `sde-api-scrapers`' `web-indexing` branch, but the closed loop additionally needs -the COSMOS AWS account id recorded there, its stacks deployed, and the AOSS data-access policy -granted. Until then status stops at `Test Indexing`. +code-complete **and deployed to dev (NS.2 done 2026-08-20** — merged to `develop`, PR #47; account +id recorded and AOSS data-access policy already in place), and our `sts:AssumeRole` grant is in +place too (**NS.6 done 2026-08-20**, verified live from the staging host). The closed loop now needs +one thing: the Fargate network values in our env + `migrate` + restart on the **staging** host +`i-08f9b2175b70fa05c` (`ssh staging_cosmos`) — NS.3. Until then status stops at `Test Indexing`. +Step-by-step: `INDEXING_HANDOFF_TODO.md`. --- @@ -973,7 +1019,8 @@ granted. Until then status stops at `Test Indexing`. | Duplicate ingest from the 5-minute poller | Ingest claims via an atomic status CAS **before** writing (ingest can outrun the poll interval, and `BaseUrl.url` is globally unique — concurrent writes would `IntegrityError`); manual re-ingest stays idempotent by deleting `DumpUrl`s first | | Deleting Sinequa breaks unrelated GitHub metadata sync | P6 keeps `sync_with_production_webapp` (COSMOS prod webapp) and removes only the Sinequa-configs-repo paths | | `config/settings/test.py` inherits `base.py`, so stale env vars mask missed references | P6 validation runs with the deleted vars unset | -| **Cross-account dispatch silently unbuildable** — `sde-api-scrapers` has no COSMOS account id, so its bucket policy and `CosmosIndexingDispatchRole` are (deliberately) not synthesized | Hand the account id over as a P7 precondition — one dict entry (`settings.COSMOS_AWS_ACCOUNT_ID`) + redeploy on their side | +| ~~**Cross-account dispatch silently unbuildable**~~ — `sde-api-scrapers` had no COSMOS account id, so its bucket policy and `CosmosIndexingDispatchRole` were not synthesized | **Resolved 2026-08-13**: dev is the same account (`998871305517`), filled in their `settings.COSMOS_AWS_ACCOUNT_ID` (their W3.9); both resources now synthesize and name `indexing-helper-role` directly. **Deployed 2026-08-20 (NS.2)**; our `sts:AssumeRole` grant landed the same day (NS.6, verified from the staging host) — remaining: env values on staging (NS.3) | +| **`RunTask` command override must lead with the executable** — the indexer image has no `ENTRYPOINT`, and an ECS override replaces the whole command | Fixed in `20c919ed` (NS.8); `test_indexing_dispatch.py` asserts the full `python3 api_scraper.py …` command so a regression fails a test | | Curator-excluded URLs published to search | P7 export uses `.exclude(excluded=True)` — `excluded` is a queryset annotation, not a field; test asserts exclusions never reach the JSONL | | Truncated export read as a mass deletion | Indexer-side guard: line count vs `manifest.document_count` → `export_incomplete`, deletions skipped. COSMOS's job is writing the manifest **last** with an exact count | | Stale `status.json` completes a newer index dispatch | Every artifact is namespaced by the COSMOS-minted `run_id` (`index_runs/{cf}/{run_id}/`), so cross-run staleness is structurally impossible — unlike the P4 crawler contract, which needs the `LastModified` freshness rule | diff --git a/INDEXING_HANDOFF_TODO.md b/INDEXING_HANDOFF_TODO.md new file mode 100644 index 00000000..576e4a7d --- /dev/null +++ b/INDEXING_HANDOFF_TODO.md @@ -0,0 +1,755 @@ +# Web Indexing Hand-off — Status Update & Remaining To-Do (Indexer + COSMOS) + +## Status overview — 2026-08-20 + +> **Verified 2026-08-18** against `COSMOS@9e18ced8` (working tree), `sde-api-scrapers@10975ee`, and the live +> `sde-dev` account (`998871305517`). Corrections made in this pass: `get_chunker` import path (I.1), C.2 needs +> `manage.py migrate` for the beat row, C.3 S3 probes rewritten (role has `AmazonS3FullAccess`; bucket policy has +> no `ListBucket`), `dispatch_scrape --collection`, ratio guard is `>` not `≥`, four (not three) ownership +> boundaries, `+67` tests (not `47+`), I.3 subnet/SG values pre-filled, `:latest` overwrite caveat in I.1, and +> the uploader endpoint tier-cap gap recorded as an indexer to-do. +> +> **Retarget 2026-08-19 (`10975ee`):** the branch-era working index is now **`sde-web-subset`**, a scratch +> *subset* of live `sde-web`, replacing `sde-web-copy` (the full 431k-doc copy) as every runtime default +> (`web/web_pipeline.py`, `infrastructure/config/settings.py`, `api_scraper.py`, `scripts/audit_index.py`) and +> the value pinned by `tests/test_infra_web_env.py`. `sde-web-copy` still exists in dev AOSS but nothing on the +> branch targets it. Verifications dated before 2026-08-19 in the indexer tracker were done against the copy; +> the tracker's new **OOB.3** (confirm `sde-web-subset` carries the `version: keyword` mapping + access-policy +> coverage) must pass before I.4 *(it did — verified 2026-08-20, see below)*. This file has been +> updated to the subset throughout. +> +> **Deployed 2026-08-20 (per the indexer tracker):** `web-indexing` was **merged to `develop` (PR #47 @ +> `c2aebad`) and the stacks deployed to dev — NS.2 (I.1/I.2 here) is DONE.** Stack outputs verified by the +> indexer team: `sde-cosmos-indexing-dev` bucket, `CosmosIndexingDispatchRole-dev` +> (`arn:aws:iam::998871305517:role/CosmosIndexingDispatchRole-dev`), task def `web_cosmos-scraper-dev:1`, +> and `ScheduledRulesCount = 0` (correct — `WEB_COSMOS` is on-demand only). The merge also closes **NS.7** +> (the `deploy.yml` test job now guards this code) and moots I.1's hand-push instructions. +> +> **Both pre-run sanity checks passed 2026-08-20 (per the indexer tracker):** +> - **ECR image check DONE** — `:latest` (digest `ae1c9e02…`) is co-tagged `c2aebadcea62…`, the exact +> PR #47 merge commit, pushed by CI at 14:54 CDT. The E2E.1 offline tokenizer check was re-run +> against that exact digest and passed (`HF_HUB_OFFLINE=1`, `web/` present, `get_chunker()` with +> zero network). Note: the image is **linux/amd64 only** — correct for Fargate; local runs on +> Apple Silicon need `--platform linux/amd64`. +> - **OOB.3 VERIFIED** — `sde-web-subset` exists in dev AOSS with the checked-in mapping (`version: +> keyword`; `vectorized_title` knn 768/BINARY; nested `vectorized_full_text` likewise; +> `public_visibility: boolean`). Census: **59 docs across 2 collections** +> (`astromaterials_data_system` 52, `aurorasaurus_reporting_auroras_from_the_ground_up` 7); +> **0 of 59 carry `version`**, so the first run of either collection has the expected first-run +> profile (empty state scan, full vectorize, zero deletions — see `first_run.md` / +> `COSMOS_INDEX_REAL_RUN.md` §4); 0 id-scheme mismatches, 0 duplicate URLs. + +> **Host correction 2026-08-20 — COSMOS work happens on STAGING, not production.** Every C.* step +> below now targets **`i-08f9b2175b70fa05c`** (tag `COSMOS Staging`, `18.215.146.207`, ssh alias +> `staging_cosmos`, user `ec2-user`, key `~/.ssh/sde-indexing-helper-staging.pem`). Earlier revisions +> of this file named `i-02b3d3e1ac0671952` (tag `COSMOS`, `54.227.74.92`, ssh alias +> `production_cosmos`) as "the COSMOS host" throughout — that is the production box and is **not** +> where this loop runs. **Nothing was executed on it.** This retarget costs no IAM rework: staging +> and production carry the *same* instance profile, `indexing-helper-role`, so C.1's grant (which +> lives on the role, not the host) applies to staging unchanged, as does the indexer dispatch role's +> trust policy. Watch out for the third box, **`i-0178c998e868792d7`** (tag `COSMOS_Staging_Refresh`, +> `23.20.135.115`) — it has **no instance profile at all**, so no dispatch can ever work from it; +> C.2 must land on `i-08f9b2175b70fa05c` specifically. +> +> **C.1 / NS.6 DONE 2026-08-20 — verified end to end.** Inline policy `CosmosIndexingDispatch-dev` +> is attached to `indexing-helper-role` (verified by read-back), `aws iam simulate-principal-policy` +> returns **`allowed`** for `sts:AssumeRole` → `CosmosIndexingDispatchRole-dev`, the dispatch role's +> trust policy names `arn:aws:iam::998871305517:role/indexing-helper-role`, and **`aws sts +> assume-role` run on the staging host itself succeeded** (`Credentials.Expiration = +> 2026-08-20T22:53:59+00:00`). Dispatch IAM is proven from the box that will do the dispatching. +> **Next up: C.2.** +> +> **SSM is not usable on these hosts yet.** `indexing-helper-role` carried no SSM permissions at all, +> so neither COSMOS box has ever registered as a managed instance (`describe-instance-information` +> returns nothing). `AmazonSSMManagedInstanceCore` was attached to the role 2026-08-20 — which covers +> staging too, same role — but the production box had not registered after ~15 min of polling, so the +> agent may also need a restart (`sudo systemctl restart amazon-ssm-agent`) or may not be installed. +> **Until SSM works, use SSH** (`ssh staging_cosmos`) for C.1's verification and for C.2/C.3. + +**One sentence:** the indexer is **deployed to dev and pre-run-verified** (image + subset both checked +2026-08-20); what stands between us and a working Curated → indexed loop is confirming one IAM grant +on-host (C.1 — the policy is already attached), env values on the COSMOS **staging** host (C.2–C.3), +and the end-to-end proofs (I.4 / C.4) — **I.4 is runnable right now with no prerequisites left**. + +## What's next — step by step + +The exact commands for each step live in the detail sections referenced in parentheses. +Steps 1–3 are COSMOS wiring; 4 is indexer-side and **fully unblocked — it can start immediately +and run in parallel with 1–3**; 5 is the closed loop. + +1. ~~**C.1 — grant `sts:AssumeRole`** on `indexing-helper-role` for + `CosmosIndexingDispatchRole-dev` — one `put-role-policy`~~ — **DONE 2026-08-20**: policy + attached, simulator `allowed`, and `aws sts assume-role` verified on the staging host itself. +2. **C.2 — wire the staging host** — append the env vars (bucket, cluster, family, role ARN, + subnets/SGs — the I.3 values from 2026-08-18 are pre-filled; re-run the lookup once to confirm + they're unchanged post-deploy — and `INDEX_POLL_ENABLED=true`), then **`manage.py migrate`** + (required — the `poll_index_runs` beat row is written by `post_migrate`; a restart alone does + nothing), then restart django/celeryworker/celerybeat. +3. **C.3 — pre-flight** — S3 smoke probes + a dry `run_index_task` dispatch from a Django shell + against a scratch collection. +4. **I.4 — CLI end-to-end against `sde-web-subset`** *(E2E.2–9c)* — hand-written 10-doc export → + manual `run-task` → `status.json` / `validation.json` / index checks, deletion-guard and + id-collision-guard cases. **No prereqs remain** (image check + OOB.3 both passed 2026-08-20); + does not wait on COSMOS. Read `first_run.md` before the first run. +5. **C.4 — closed loop** *(E2E.10, the last open Phase 7 done-when)* — set a small non-collision + collection to **Curated** → export → `RunTask` → poller → Slack report → QC → prod dispatch → + `PROD_PERFECT`; plus the failure path. Needs steps 1–3. Note the subset already holds two + collections (`astromaterials_data_system`, `aurorasaurus_…`) with clean ids and no `version` — + per the census, a run against either is a plain first run (no collision-guard refusal), so + whichever curated collection is chosen behaves predictably. +6. **Close out** — tick E2E boxes in the indexer tracker, "Closed loop verified" + NS.3 in + `IMPLEMENTATION_PLAN.md`; then Phase 9 CI/CD (independent — don't let it gate the loop) and the + not-blocking housekeeping (C.5 / I.5: uploader tier-cap gap before any prod deploy, id-collision + *repair*, NS.5, OOB.1 at cutover only). + +**Headline numbers** + +| | Indexer (`sde-api-scrapers` · merged to `develop`, PR #47 @ `c2aebad`) | COSMOS (`COSMOS` · `cosmos-rewiring` · HEAD `9e18ced8`) | +|---|---|---| +| Phases | W0–W5 all done (6 of 6); **stacks deployed to dev 2026-08-20 (NS.2)** | P0–P6 done, **P7 10 of 14 boxes** (4 open, see below), P8 resolved (folded into P7), **P9 not started, 0 of 8** | +| Tests | **316** offline, all green — re-run 2026-08-18 (`uv run pytest tests/ -q`, 316 passed); `test_fixes.md` mutation audit: 17/17 killed; CI now runs the suite on `develop` pushes | `test_indexing_dispatch.py` + rewritten workflow tests, all green (run via `docker compose -f local.yml run --rm django pytest`; not re-run 2026-08-18 — no local Django env) | +| In AWS today (per indexer tracker, 2026-08-20, `sde-dev`) | **Deployed and pre-run-verified**: `sde-cosmos-indexing-dev` bucket, `CosmosIndexingDispatchRole-dev`, `web_cosmos-scraper-dev:1` task def, 0 scheduled rules (correct); ECR `:latest` = merge commit `c2aebad` (digest `ae1c9e02…`, tokenizer check passed); `sde-web-subset` mapping verified, 59 docs / 2 collections, none versioned (OOB.3) | Django **staging** host `i-08f9b2175b70fa05c` (`COSMOS Staging`, `18.215.146.207`), instance profile `indexing-helper-role` — now carrying inline `CosmosIndexingDispatch-dev` (C.1, 2026-08-20) plus `AmazonS3FullAccess`, `AmazonRDSFullAccess`, `indexing-helper-s3-access`, `AmazonSSMManagedInstanceCore`; every dispatch-gating setting blank/off by design | +| Blocking dependency | **none — E2E.2–9c runnable now** | **unblocked** — C.1 applied (on-host confirm outstanding); C.2/C.3 can run now; C.4 needs them done | + +### Indexer — done + +- **Pipeline** (`WEB_COSMOS` source): S3 export → chunk → SageMaker vectorize → AOSS bulk upsert into the shared web index, with the safety stack the shared index demands — scope probe, filtered state scan + ownership assertion at four boundaries (`state_scan`, `export_ids`, `upsert_batch`, `deletion_candidates`), export-completeness check, deletion ratio (abort when > 0.90) + absolute cap (5,000, checked first), reversible tombstones, `status.json` written last and always, `validation.json` on test runs. +- **New since last update (`cf695f9`, 2026-08-18):** W2.13 **id-collision guard** — refuses a run when the index already holds the collection under ids the pipeline would not mint (`id_scheme_collision`) or under duplicated ids (`duplicate_business_ids`), before any spend; `--allow-id-collision` is an audited override. This closes the "12 collections would be silently doubled" finding. Plus `first_run.md` (what run 1 actually does) and a test-suite hardening pass (+67 tests, incl. new `test_tombstone_batch.py`, `test_ensure_index.py`, `test_id_collision_guard.py`). +- **Infrastructure (CDK)**: `sde-cosmos-indexing-{env}` bucket with per-prefix/per-direction policy, `CosmosIndexingDispatchRole-{env}` (trusts COSMOS's `indexing-helper-role` only, `RunTask` limited to the `web_cosmos-scraper-{env}` family + cluster), on-demand task def with all env injected and pinned by tests, monitoring filter so an on-demand task doesn't park an alarm, `AWSV4SignerAuth` fix for long runs. `cdk synth -c environment=dev` re-verified clean 2026-08-18 (test/prod per the tracker). `COSMOS_AWS_ACCOUNT_ID[DEV]` filled — dev is **same-account** (`998871305517`). +- **Contract with COSMOS** verified field-by-field on 2026-08-13 — nothing to renegotiate. Every default targets **`sde-web-subset`**, a scratch subset of live `sde-web` (replaced `sde-web-copy` 2026-08-19); production is reachable only by an explicit override at cutover. +- **CI**: `deploy.yml` `test` job gates the image build (the tracker's earlier "no CI" note was wrong and has been retracted). Triggers: pushes to `develop`/`test`/`main` **and `workflow_dispatch`** — a manual run on `web-indexing` is possible. +- **Known latent gap (not a dev blocker):** only the pipeline's probe/validate client is tier-capped by `--target` (`OPENSEARCH_ENDPOINT_TEST/PROD`); `APIOpenSearchUploader` (`fetch_index_state`, `index_batch`, `tombstone_batch`) always uses bare `OPENSEARCH_ENDPOINT`. Identical in dev (all three resolve to the same collection), but on a prod deploy `--target test` would probe test while writing prod. Track as an indexer to-do before cutover. + +### Indexer — remaining + +1. ~~Build/push the image and deploy (I.1–I.2, NS.2)~~ — **DONE 2026-08-20** via merge to `develop` + (PR #47) + stack deploy. ~~Residual ECR image check~~ — **DONE 2026-08-20**: `:latest` co-tagged + with the merge SHA; tokenizer check re-run against that exact digest. +2. ~~OOB.3~~ — **VERIFIED 2026-08-20**: `sde-web-subset` carries the checked-in mapping; census + recorded (59 docs, 2 collections, none versioned). +3. **Confirm the Fargate subnet/SG ids unchanged** (I.3, NS.3) — values already looked up 2026-08-18; + re-confirm against the deployed cluster and paste into C.2. +4. **CLI end-to-end against `sde-web-subset`** (I.4, E2E.2–9c: E2E.1 done — re-verified against the + deployed image; 14 boxes open) — **no prereqs remain**; does not wait on COSMOS. +5. Not blocking: test/prod account ids (NS.5); `version: keyword` on live `sde-web` (OOB.1, cutover only); + the id-scheme *repair* (guard is in, repair isn't); the uploader endpoint tier-cap gap above (before any + prod deploy). + +### COSMOS — done + +- **P0–P2** settings/session helper, 21–26 workflow statuses + colour maps + Slack transitions, inference pipeline disabled (not deleted). +- **P3–P4** scrape dispatch to the crawl4ai host via SSM (`ScrapeDispatch` freshness/stall model) and S3 → `DumpUrl` ingest with atomic claim + 5-min poller. +- **P5** curation triggers: `CURATED` → test-index hand-off, `QC_PERFECT/QC_MINOR` → prod hand-off, re-scrape path. +- **P6** Sinequa deleted. +- **P7** indexing hand-off — export (manifest last, exact count, exclusions honoured), `sts:AssumeRole` → `ecs:RunTask` with the correct command override (a flags-only bug was found and fixed 2026-08-14), `IndexDispatch` model + migration, 2-min S3 poller with unknown-state-as-failure and 6-h stall, Slack validation report; every dispatch-gating setting (bucket, cluster, family, role ARN, subnets, SGs, both `*_POLL_ENABLED`) defaults blank/off so nothing dispatches until wired (`INDEXING_CONTAINER_NAME` defaults to `WEB_COSMOSContainer`, `INDEX_STALL_TIMEOUT_HOURS` to 6, `AWS_REGION` to `us-east-1`). Note: `run_index_task` fail-fasts only on role ARN/cluster/family and `export_curated_to_s3` on the bucket; blank subnets/SGs surface as an AWS-side `RunTask` error, and an empty curated set (`document_count == 0`) fails dispatch → `INDEXING_FAILED_ON_TEST`. **11 of 14 P7 boxes done (in the working-tree `IMPLEMENTATION_PLAN.md` — uncommitted; committed HEAD still shows 6 of 12). NS.6 ticked 2026-08-20. Open: NS.3, closed loop (both unblocked) + "Cutover awareness" (needs no COSMOS change).** +- **P8** resolved — the QC validation report is produced indexer-side. + +### COSMOS — remaining + +1. ~~**`sts:AssumeRole` grant** on `indexing-helper-role` for `CosmosIndexingDispatchRole-dev` (C.1, NS.6)~~ — **DONE 2026-08-20**: inline `CosmosIndexingDispatch-dev` attached, simulator `allowed`, on-host `assume-role` from staging returned credentials. **NS.6 can be ticked in `IMPLEMENTATION_PLAN.md`.** +2. **Set the env vars on the STAGING host (`i-08f9b2175b70fa05c` / `ssh staging_cosmos`), `migrate`, and restart** (C.2) — bucket, cluster, task family, dispatch role ARN, subnets, SGs, `INDEX_POLL_ENABLED=true` (container name already defaults). The `poll_index_runs` beat row is created/enabled by a `post_migrate` receiver, so `manage.py migrate` is required — a restart alone does not enable it. +3. **Pre-flight + closed loop** (C.3–C.4, their E2E.10): Curated → export → RunTask → poller → Slack → QC → prod. This is the last open Phase 7 done-when. +4. **Phase 9 CI/CD** (deploy/rollback/preflight, healthz, gitleaks, **prod DB credential rotation** — 0 of 8 done) — independent of the indexing loop; don't let the loop wait on it. +5. Keep the 12 id-collision collections out of the flow until the indexer's *repair* lands (the guard will refuse them fast if one slips through). Cutover needs no COSMOS change. + +### Order of operations + +`C.1 → C.2 → C.3 → C.4`, with `I.4` runnable **immediately, in parallel** — I.1/I.2, the ECR image +check, and OOB.3 are all done (2026-08-20), so every remaining gate is COSMOS-side wiring or a proof. + +--- + +## Detail + +**Status 2026-08-20** (indexer merged to `develop` — PR #47 @ `c2aebad`, stacks deployed to dev; COSMOS HEAD `9e18ced8`): all code on both sides is complete and +committed (COSMOS's `IMPLEMENTATION_PLAN.md` Phase 7 box updates and this file are still uncommitted) — the indexer suite is **316** offline tests, incl. the **W2.13 id-collision guard** +(`web/id_collision.py`). **The deploy (I.1/I.2, NS.2), the ECR image check, and OOB.3 are all done +(2026-08-20)**; what remains is COSMOS-side wiring (C.1–C.3) and the end-to-end proofs (I.4, C.4). +I.1/I.2 below are kept as a record and as the fallback procedure; skip to I.3. + +- Indexer repo: `sde-api-scrapers`, now on `develop` (tracker: `Web Indexing - Task Plan & Tracking.md`; first-run walkthrough: `first_run.md`; test audit: `test_fixes.md`) +- COSMOS repo: `COSMOS`, branch `cosmos-rewiring` (tracker: `IMPLEMENTATION_PLAN.md`, Phase 7) +- Account (dev, both sides): **998871305517**, profile `sde-dev`, region `us-east-1` +- Working index for every branch-era run: **`sde-web-subset`** — a scratch subset of live `sde-web`, since 2026-08-19 (`sde-web-copy` before that; never live `sde-web` until cutover) + +Order of operations: **~~I.1 → I.2~~ (done) → I.3 → C.1 → C.2 → C.3 → I.4/C.4** (closed loop); I.4 has no open prereqs (image check + OOB.3 both done 2026-08-20). + +--- + +## Indexer (`sde-api-scrapers`) + +### I.1 — Build and push the `web-indexing` image to ECR (`api-scrapers-dev:latest`) — **DONE 2026-08-20 via merge** + +> **DONE 2026-08-20:** the preferred path below was taken — `web-indexing` merged to `develop` +> (**PR #47 @ `c2aebad`**), so CI's `test → build+push → cdk deploy` covered I.1 and I.2 in one run. +> **Residual image check also DONE 2026-08-20:** `:latest` (digest `ae1c9e02…`) is co-tagged +> `c2aebadcea62…` — the exact merge commit — pushed by CI at 14:54 CDT; the offline tokenizer check +> was re-run against that exact digest and passed. The image is **linux/amd64 only** (GitHub runner +> build) — correct for Fargate; local runs on Apple Silicon need `--platform linux/amd64`. The +> hand-push commands stay as the fallback. + +The ECS task definitions pull `{ecr}/api-scrapers-dev:latest`. CI (`deploy.yml`) only builds on +pushes to `develop`/`test`/`main` (or a manual `workflow_dispatch`), so a branch deploy must push the image by hand — +**or merge to `develop` and let CI do I.1 + I.2 in one run** (see below). + +> **Checked 2026-08-19:** `deploy.yml` does `test → build+push (:sha, :latest) → cdk deploy --all → verify`, so a +> CI run covers I.1 *and* I.2. But `GitHubActions-ApiScrapers-DEV`'s trust policy is pinned to +> `repo:NASA-IMPACT/sde-api-scrapers:ref:refs/heads/develop` (PROD to `refs/heads/main`), so a +> `workflow_dispatch` on `web-indexing` fails at "Configure AWS credentials". **Preferred path: merge +> `web-indexing` → `develop` and push** (`git checkout develop && git merge --no-ff web-indexing && git push`, +> then `gh run watch`); rollback is `git revert -m 1 ` + push. The hand-push below remains the +> alternative if you'd rather not merge before I.4 (it would need the trust policy widened to reach CI). + +> **Caveat (verified 2026-08-18):** `api-scrapers-dev:latest` is currently the `develop` build (`7b4c8b0`, +> pushed 2026-08-14) and is what the 8 existing scheduled dev scrapers (`cmr_api`, `gcn_circulars`, …) +> pull on every run. Pushing `web-indexing` as `:latest` puts branch code under those tasks too — acceptable +> in dev only if the branch is a superset of `develop` (it is, per the tracker) and you're prepared to re-push +> `develop` if anything regresses. The Dockerfile +bakes the HF tokenizer at build time (W0.2) — build needs network access. + +```bash +cd ~/projects/sde-api-scrapers +git checkout web-indexing && git pull +export AWS_PROFILE=sde-dev AWS_REGION=us-east-1 +ACCOUNT=998871305517 +ECR=$ACCOUNT.dkr.ecr.us-east-1.amazonaws.com/api-scrapers-dev + +aws ecr get-login-password | docker login --username AWS --password-stdin $ACCOUNT.dkr.ecr.us-east-1.amazonaws.com +docker build --platform linux/amd64 -t $ECR:latest -t $ECR:$(git rev-parse --short HEAD) . +docker push $ECR:latest +docker push $ECR:$(git rev-parse --short HEAD) + +# sanity: tokenizer resolves offline inside the image (E2E.1) +docker run --rm --network none $ECR:latest python3 -c "from uploader.text_chunker import get_chunker; get_chunker(); print('ok')" +``` + +- [x] Confirmed 2026-08-20: `:latest` digest `ae1c9e02…` co-tagged with merge SHA `c2aebad…`, CI-pushed 14:54 CDT; offline tokenizer check passed against that digest (E2E.1 re-verified). + +### I.2 — Deploy the branch stacks to dev (**NS.2**) — **DONE 2026-08-20** + +> **DONE 2026-08-20** by the merge's CI run. Stack outputs verified (indexer tracker NS.2): +> `CosmosIndexBucketName = sde-cosmos-indexing-dev`, `CosmosIndexingDispatchRoleArn = +> arn:aws:iam::998871305517:role/CosmosIndexingDispatchRole-dev`, `WEBCOSMOSTaskDefArn = +> …:task-definition/web_cosmos-scraper-dev:1`, `ScheduledRulesCount = 0` (correct — on-demand only). +> The verification commands below remain useful spot checks and the checkboxes are ticked +> accordingly; re-run them if anything looks off. + +Creates the `sde-cosmos-indexing-dev` bucket (+ bucket policy naming `indexing-helper-role`), +`CosmosIndexingDispatchRole-dev`, the `web_cosmos-scraper-dev` task family, and the monitoring +filter. Requires `COSMOS_AWS_ACCOUNT_ID[DEV]` to be filled (done, W3.9). + +```bash +cd ~/projects/sde-api-scrapers/infrastructure +python3 -m venv .venv && source .venv/bin/activate +pip install -r requirements.txt +npm install -g aws-cdk # if not present +export AWS_PROFILE=sde-dev AWS_REGION=us-east-1 + +# run the offline suite first — it pins every injected env var and the dispatch trust +(cd .. && uv run pytest tests/ -q) # expect 316 passed (as of cf695f9) + +cdk synth -c environment=dev # must be clean +cdk diff -c environment=dev # review: new bucket, new role, new task def, alarm filter +cdk deploy --all -c environment=dev --require-approval never +``` + +Verify what was created: + +```bash +aws s3api head-bucket --bucket sde-cosmos-indexing-dev +aws s3api get-bucket-policy --bucket sde-cosmos-indexing-dev --query Policy --output text | python3 -m json.tool +aws iam get-role --role-name CosmosIndexingDispatchRole-dev --query 'Role.AssumeRolePolicyDocument' +aws ecs describe-task-definition --task-definition web_cosmos-scraper-dev \ + --query 'taskDefinition.containerDefinitions[0].[name,environment]' # name == WEB_COSMOSContainer, WEB_INDEX_NAME == sde-web-subset +``` + +- [x] Stacks deployed 2026-08-20 (outputs verified per the indexer tracker) +- [x] Bucket, dispatch role, and task family exist (`web_cosmos-scraper-dev:1`); trust policy names `arn:aws:iam::998871305517:role/indexing-helper-role` per the synthesized template — re-check live with the command above if desired +- [x] Spot-checked 2026-08-20: `web_cosmos-scraper-dev:1`, container `WEB_COSMOSContainer`, env + `WEB_INDEX_NAME=sde-web-subset`, `COSMOS_INDEX_BUCKET=sde-cosmos-indexing-dev`; cluster + `api-scrapers-cluster-dev` ACTIVE; `head-bucket` on `sde-cosmos-indexing-dev` OK + +### I.3 — Look up and send COSMOS the Fargate network values (**NS.3**) + +The cluster runs in the **default VPC**; the scheduled API tasks use public subnets and the VPC +default security group. COSMOS's `dispatch.py` sets `assignPublicIp: ENABLED`, so public subnets +are required (ECR/S3/SageMaker egress). + +```bash +export AWS_PROFILE=sde-dev AWS_REGION=us-east-1 +VPC=$(aws ec2 describe-vpcs --filters Name=isDefault,Values=true --query 'Vpcs[0].VpcId' --output text) +aws ec2 describe-subnets --filters Name=vpc-id,Values=$VPC Name=map-public-ip-on-launch,Values=true \ + --query 'Subnets[].SubnetId' --output text | tr '\t' ',' +aws ec2 describe-security-groups --filters Name=vpc-id,Values=$VPC Name=group-name,Values=default \ + --query 'SecurityGroups[0].GroupId' --output text +``` + +Looked up 2026-08-18 and **re-confirmed unchanged post-deploy 2026-08-20** (default VPC +`vpc-0265394c8c285afba`, all six subnets are `map-public-ip-on-launch`, one per AZ `us-east-1a`–`f`, +each with ~4,090 free IPs; default SG `sg-01817cfe4f3629986`; re-run the commands above if the VPC +changes). **This block is paste-ready for C.2:** + +``` +INDEXING_SUBNETS=subnet-0268b60265d9d6e87,subnet-0c29076fe7de10791,subnet-030a3a47fa10c76b2,subnet-0a6c6c437ed87dda3,subnet-09355979ab5496a50,subnet-0f3a7b40152e63be3 +INDEXING_SECURITY_GROUPS=sg-01817cfe4f3629986 +INDEXING_ECS_CLUSTER=api-scrapers-cluster-dev +INDEXING_TASK_FAMILY=web_cosmos-scraper-dev +INDEXING_CONTAINER_NAME=WEB_COSMOSContainer +SDE_INDEX_BUCKET=sde-cosmos-indexing-dev +INDEXING_DISPATCH_ROLE_ARN=arn:aws:iam::998871305517:role/CosmosIndexingDispatchRole-dev +``` + +- [x] Values looked up (above) — [x] **confirmed unchanged after I.2 (2026-08-20)**: same six + subnets, same default SG, cluster ACTIVE, task def env correct. Ready to paste into C.2. + +### I.4 — Prove the task runs end to end from the CLI (E2E.2 – E2E.9c, against `sde-web-subset`) + +Hand-write a 10-doc export, run the task, check the index. **Runnable now with no open prereqs** — +I.2 done 2026-08-20, and **both former prereqs passed 2026-08-20**: the I.1 image check (`:latest` = +merge SHA, tokenizer offline check green) and **OOB.3** (`sde-web-subset` verified to carry the +checked-in mapping — `version: keyword`, knn 768/BINARY incl. the nested full-text field; census: +59 docs across `astromaterials_data_system` (52) and `aurorasaurus_reporting_auroras_from_the_ground_up` +(7), **none carrying `version`**, 0 id-scheme mismatches, 0 duplicate URLs). Does **not** depend on +COSMOS. Read `first_run.md` first: on the **first** run of any collection +nothing is deleted (no document carries `version` yet, so the state scan is empty) and everything +is re-vectorized; the deletion guards only become live from run 2. The new **W2.13 id-collision +guard** runs before the state scan and refuses a collection the index already holds under ids the +pipeline would not mint (`id_scheme_collision`) or under duplicated ids (`duplicate_business_ids`); +`--allow-id-collision` overrides it and is recorded in `status.json` — never use it by default. + +```bash +export AWS_PROFILE=sde-dev AWS_REGION=us-east-1 +# 1) upload a fixture export (documents.jsonl first, manifest.json LAST) +aws s3 cp documents.jsonl s3://sde-cosmos-indexing-dev/curated_collections/verify_web/local-1/documents.jsonl +aws s3 cp manifest.json s3://sde-cosmos-indexing-dev/curated_collections/verify_web/local-1/manifest.json + +# 2) run the task manually with the same command override COSMOS will send +SUBNETS=...; SG=... # from I.3 +aws ecs run-task --cluster api-scrapers-cluster-dev --launch-type FARGATE \ + --task-definition web_cosmos-scraper-dev \ + --network-configuration "awsvpcConfiguration={subnets=[$SUBNETS],securityGroups=[$SG],assignPublicIp=ENABLED}" \ + --overrides '{"containerOverrides":[{"name":"WEB_COSMOSContainer","command":["python3","api_scraper.py","--source","WEB_COSMOS","--collection","verify_web","--target","test","--run-id","local-1"]}]}' + +# 3) watch it and read the result +aws logs tail /ecs/api-scrapers-dev --follow --log-stream-name-prefix web_cosmos-scraper # log group verified 2026-08-18 +aws s3 cp s3://sde-cosmos-indexing-dev/index_runs/verify_web/local-1/status.json - +aws s3 cp s3://sde-cosmos-indexing-dev/index_runs/verify_web/local-1/validation.json - +``` + +- [ ] E2E.3 `status.json` `state: succeeded`, `validation.json` full match +- [ ] E2E.4/5 `sde-web-subset` has 10 docs for `collection_key: verify_web`, knn hits return +- [ ] E2E.6 re-run → `changed: 0`; E2E.7a–c deletion guards; E2E.9/9a/9b/9c scope + tombstone checks (see tracker for exact assertions) +- [ ] Id-collision guard live: run against `gcn_circulars` (or `CODE_NASA_API`) → `status.json` `error: id_scheme_collision`, no SageMaker calls, nothing written; `status.json.id_collision_check` present on runs that pass the guard +- [ ] Tick these off in `Web Indexing - Task Plan & Tracking.md` + +### I.5 — Housekeeping (not blocking) + +- [x] **NS.7** — **closed 2026-08-20 by the merge to `develop` (PR #47)**: `deploy.yml`'s `test` job (incl. the rotation-matrix checksum) and `build-and-push` now run in CI for this code. numpy stays unpinned by decision (W0.1), guarded by the checksum test in CI. +- [ ] **NS.5** test/prod COSMOS account ids — only when those tiers exist +- [ ] **OOB.1** add `version: keyword` to live `sde-web` mapping — **cutover only** +- [ ] Cutover: flip `WEB_INDEX_NAME` `sde-web-subset` → `sde-web` (settings + task def) once E2E signed off +- [ ] Before any prod deploy: route `APIOpenSearchUploader` through the tier-capped client (today it uses bare `OPENSEARCH_ENDPOINT`; see "Known latent gap" above) + +--- + +## COSMOS + +### C.1 — Grant `sts:AssumeRole` on the dispatch role to `indexing-helper-role` (**NS.6**) — **APPLIED 2026-08-20** + +> **DONE 2026-08-20** — the `put-role-policy` below was run against `indexing-helper-role` and read +> back clean: inline policy **`CosmosIndexingDispatch-dev`**, one statement, +> `sts:AssumeRole` → `arn:aws:iam::998871305517:role/CosmosIndexingDispatchRole-dev`. The dispatch +> role's live trust policy names `arn:aws:iam::998871305517:role/indexing-helper-role`, and +> `aws iam simulate-principal-policy` evaluates the pair as **`allowed`**. Because the grant is on +> the *role*, it covers both COSMOS boxes that use `indexing-helper-role` — staging +> (`i-08f9b2175b70fa05c`, where this loop runs) and production (`i-02b3d3e1ac0671952`). +> +> **Still open:** the on-host confirmation. SSM could not reach either box (see the SSM note at the +> top of this file), so run it over SSH instead: +> +> ```bash +> ssh staging_cosmos # ec2-user@18.215.146.207, ~/.ssh/sde-indexing-helper-staging.pem +> aws sts assume-role --region us-east-1 \ +> --role-arn arn:aws:iam::998871305517:role/CosmosIndexingDispatchRole-dev \ +> --role-session-name cosmos-preflight --query Credentials.Expiration +> ``` +> +> An expiration timestamp = C.1 fully verified. While on the host, `sudo systemctl restart +> amazon-ssm-agent` is worth running — C.2's instructions assume SSM works. + +**The role exists as of 2026-08-20 (I.2 done) — do this now.** Don't wait for Phase 9's +`preflight_aws`, which only *checks* this grant. Same-account trust is satisfied only by the +identity policy, so without this every dispatch fails with `AccessDenied` on `AssumeRole`. +No S3 permissions are needed on our side: the bucket policy names our role directly (and `indexing-helper-role` already carries `AmazonS3FullAccess` + `indexing-helper-s3-access`; as of 2026-08-18 it had **no inline policies** and no `sts:AssumeRole` anywhere — the C.1 policy below is what changed that on 2026-08-20, alongside an `AmazonSSMManagedInstanceCore` attach for SSM). + +```bash +export AWS_PROFILE=sde-dev AWS_REGION=us-east-1 +cat > cosmos-indexing-dispatch.json <<'JSON' +{ + "Version": "2012-10-17", + "Statement": [{ + "Sid": "AssumeCosmosIndexingDispatchRoleDev", + "Effect": "Allow", + "Action": "sts:AssumeRole", + "Resource": "arn:aws:iam::998871305517:role/CosmosIndexingDispatchRole-dev" + }] +} +JSON +aws iam put-role-policy --role-name indexing-helper-role \ + --policy-name CosmosIndexingDispatch-dev \ + --policy-document file://cosmos-indexing-dispatch.json + +# verify from the COSMOS STAGING host itself (`ssh staging_cosmos` — SSM is not registered yet): +aws sts assume-role --role-arn arn:aws:iam::998871305517:role/CosmosIndexingDispatchRole-dev \ + --role-session-name cosmos-preflight --query 'Credentials.Expiration' +``` + +- [x] Inline policy attached (2026-08-20, read back; `simulate-principal-policy` → `allowed`) +- [x] `assume-role` from the COSMOS **staging** host succeeds — run on `ec2-user@STAGING` + 2026-08-20, returned `Credentials.Expiration = 2026-08-20T22:53:59+00:00`. **C.1 / NS.6 DONE.** + +### C.2 — Set the indexing env vars on the staging host (**NS.3, our half**) + +Env files are hand-maintained per host (`.envs/.production/.django` on the Django/Celery host, +per `sde_collections/DEPLOYMENT.md`). Every dispatch-gating setting defaults blank/off, so nothing +dispatches until these are present. `INDEXING_CONTAINER_NAME` already defaults to `WEB_COSMOSContainer` +and `AWS_REGION` to `us-east-1` (set it explicitly if the host is ever elsewhere); `launchType=FARGATE` +and `assignPublicIp=ENABLED` are hard-coded in `dispatch.py`, not settings. + +```bash +# on the COSMOS STAGING host: `ssh staging_cosmos` (ec2-user@18.215.146.207) +# — SSM (`aws ssm start-session --target i-08f9b2175b70fa05c`) works only once the agent registers; +# see the SSM note at the top of this file. Do NOT use i-0178c998e868792d7 +# (`COSMOS_Staging_Refresh`) — it has no instance profile, so dispatch cannot work from it. +sudo -e /path/to/.envs/.production/.django # append: +SDE_INDEX_BUCKET=sde-cosmos-indexing-dev +INDEXING_ECS_CLUSTER=api-scrapers-cluster-dev +INDEXING_TASK_FAMILY=web_cosmos-scraper-dev +INDEXING_CONTAINER_NAME=WEB_COSMOSContainer +INDEXING_DISPATCH_ROLE_ARN=arn:aws:iam::998871305517:role/CosmosIndexingDispatchRole-dev +INDEXING_SUBNETS= +INDEXING_SECURITY_GROUPS= +INDEX_POLL_ENABLED=true + +# 1) migrate — the poll_index_runs / poll_scrape_jobs beat rows are (re)written and enabled by a +# post_migrate receiver (sde_collections/signals.py); the production start script does NOT migrate, +# so without this step INDEX_POLL_ENABLED=true changes nothing (DEPLOYMENT.md step 4) +docker compose -f production.yml run --rm django python manage.py migrate --noinput +# 2) restart the services that read settings +docker compose -f production.yml up -d --force-recreate django celeryworker celerybeat +docker compose -f production.yml run --rm django python manage.py shell -c \ + "from django.conf import settings as s; print(s.INDEXING_DISPATCH_ROLE_ARN, s.INDEXING_SUBNETS, s.INDEX_POLL_ENABLED)" +``` + +- [ ] Vars present in the running containers; `PeriodicTask` "Poll index runs (every 2 min)" exists with `enabled=True` (`python manage.py shell -c "from django_celery_beat.models import PeriodicTask; print(list(PeriodicTask.objects.values_list('name','enabled')))"`). Note the flag gates only the beat row — a manual `poll_index_runs.delay()` runs regardless. + +### C.3 — Pre-flight from the COSMOS side (before firing a real curation) + +```bash +# S3 probes — run FROM THE COSMOS STAGING HOST (`ssh staging_cosmos`, its role). The bucket policy grants only s3:PutObject on +# curated_collections/* and s3:GetObject on index_runs/* (no ListBucket), but in dev the same-account +# indexing-helper-role also carries AmazonS3FullAccess, so these are smoke tests, not permission tests: +# expect the put and the get to succeed; do NOT expect a DENY on the read-back, and `aws s3 ls` may +# 403 only if the identity policy is ever narrowed. +echo test | aws s3 cp - s3://sde-cosmos-indexing-dev/curated_collections/_preflight/x/probe.txt +aws s3 cp s3://sde-cosmos-indexing-dev/curated_collections/_preflight/x/probe.txt - +aws s3api list-objects-v2 --bucket sde-cosmos-indexing-dev --prefix index_runs/ --max-keys 5 # ok or AccessDenied — both fine + +# dry dispatch from a Django shell against a scratch collection +docker compose -f production.yml run --rm django python manage.py shell -c \ + "from sde_collections.models.collection import Collection; from sde_collections.indexing.dispatch import run_index_task; \ + c=Collection.objects.get(config_folder='verify_web'); print(run_index_task(c, 'test', 'preflight-1'))" +``` + +- [ ] `taskArn` returned; task visible with `aws ecs list-tasks --cluster api-scrapers-cluster-dev --family web_cosmos-scraper-dev` +- [ ] Optional: run `python manage.py preflight_aws` once Phase 9 lands it + +### C.4 — Closed-loop verification (their **E2E.10**, our Phase 7 last done-when) + +1. Pick a small, non-collision collection (not one of the 12 id-scheme-collision collections — e.g. **not** `gcn_circulars` or `CODE_NASA_API`). The indexer now refuses those itself (`id_scheme_collision` / `duplicate_business_ids`), which COSMOS would see as `INDEXING_FAILED_ON_TEST` — a correct refusal, not a bug. +2. In the admin, set `workflow_status` → **Curated**. +3. Confirm: `IndexDispatch` row created; export objects under `curated_collections/{cf}/{run_id}/` with `manifest.json` last; ECS task running; status moves to `TEST_INDEXING`. +4. Wait for `index_runs/{cf}/{run_id}/status.json`; poller keeps the collection in `TEST_INDEXING` and posts the `validation.json` summary to Slack (channel is whatever `SLACK_WEBHOOK_URL` is bound to — COSMOS sends no `channel` field; `#sde-data-curation` is the expected binding). +5. Set **QC Perfect** → confirm a prod dispatch fires (`--target prod`, still landing in `sde-web-subset` until cutover) and status lands on `PROD_PERFECT`. +6. Failure path: hand-corrupt a run (e.g. delete `manifest.json` before dispatch) → `INDEXING_FAILED_ON_TEST`. + +```bash +# useful while watching +docker compose -f production.yml run --rm django python manage.py shell -c \ + "from sde_collections.models.indexing import IndexDispatch; print(list(IndexDispatch.objects.order_by('-dispatched_at').values()[:3]))" +aws s3 ls s3://sde-cosmos-indexing-dev/index_runs/ --recursive | tail +``` + +- [ ] Tick "Closed loop verified against dev" in `IMPLEMENTATION_PLAN.md` Phase 7 done-when +- [ ] Update `IMPLEMENTATION_PLAN.md` cross-repo status: NS.3 → `[x]` (NS.2 and NS.6 both flipped 2026-08-20) + +### C.5 — Later / not blocking + +- [ ] Phase 9: `preflight_aws` gains the `SDE_INDEX_BUCKET` and `sts:AssumeRole` checks (verifies C.1, doesn't replace it) +- [ ] The 12 id-scheme-collision collections: the indexer's **guard landed** (`cf695f9`, W2.13) and refuses them at run time, so onboarding one is safe-but-futile (it fails fast, no spend). Keep them out of the flow until the *repair* (`FINDING_id_scheme_collision.md` §9) lands; expect `INDEXING_FAILED_ON_TEST` if one slips through +- [ ] Cutover needs **no COSMOS change** — it is the indexer's `WEB_INDEX_NAME` flip + +--- + +## Full workflow — COSMOS ↔ crawler ↔ indexer, end to end + +Every hop is a **file in S3 (or a JSON drop) plus a poller** — no callbacks, no `describe_tasks`. +Function/script names are the real ones in each repo. Statuses are `WorkflowStatusChoices` unless +marked `reindexing_status`. + +``` + COSMOS (Django + Celery) crawl4ai host (i-0b6a…) sde-api-scrapers (ECS Fargate) + ──────────────────────── ───────────────────── ────────────────────────────── + [1] status → READY_FOR_ENGINEERING + handle_workflow_status_change + └─ dispatch_scrape_job.delay ──SSM──▶ jobs/incoming/{cf}.json + watcher → crawl → S3 + [2] poll_scrape_jobs (5 min) ◀───S3────── scraped_collections/{cf}.json + └─ ingest_scraped_collection failure_logs/{cf}_failures_summary.json + → SCRAPING_SUCCESSFUL + └─ migrate_dump_to_delta… + → READY_FOR_CURATION + [3] curator works in COSMOS UI + [4] status → CURATED + handle_workflow_status_change + └─ promote_to_curated() + └─ index_collection_to_test.delay + export_curated_to_s3 ──S3──────────────────────────────▶ curated_collections/{cf}/{run_id}/documents.jsonl + curated_collections/{cf}/{run_id}/manifest.json (last) + run_index_task ──sts:AssumeRole → ecs:RunTask ────────▶ web_cosmos-scraper-dev + IndexDispatch row; → TEST_INDEXING python3 api_scraper.py --source WEB_COSMOS + --collection {cf} --target test --run-id {run_id} + WebPipeline.run() (steps below) + [5] poll_index_runs (2 min) ◀───S3────────────────────────────── index_runs/{cf}/{run_id}/status.json (last, always) + fetch_run_status / fetch_validation_report index_runs/{cf}/{run_id}/validation.json (test only) + succeeded+test → stays TEST_INDEXING, + send_indexing_validation_report → Slack #sde-data-curation + [6] curator reads report, sets QC_PERFECT / QC_MINOR + handle_workflow_status_change + └─ index_collection_to_prod.delay (same export → RunTask, --target prod) + → PRODUCTION_INDEXING + [7] poll_index_runs: succeeded+prod → PROD_PERFECT / PROD_MINOR + failed / unknown state / stall (INDEX_STALL_TIMEOUT_HOURS=6) → INDEXING_FAILED_ON_TEST|PROD +``` + +### Sequence diagram + +```mermaid +sequenceDiagram + autonumber + actor Eng as Engineer / Curator + participant Cosmos as COSMOS (Django + Celery) + participant SSM as AWS SSM + participant Crawler as crawl4ai host + participant CrawlS3 as S3 crawler bucket + participant IdxS3 as S3 sde-cosmos-indexing-dev + participant STS as STS / ECS + participant Idx as WEB_COSMOS task (Fargate) + participant AOSS as AOSS sde-web-subset + SageMaker + participant Slack as Slack (sde-data-curation) + + rect rgb(235, 245, 235) + Note over Eng,CrawlS3: Phase 3–4 · scrape + Eng->>Cosmos: workflow_status = READY_FOR_ENGINEERING + Cosmos->>Cosmos: handle_workflow_status_change → dispatch_scrape_job.delay + Cosmos->>SSM: send_command(AWS-RunShellScript) — write jobs/incoming/{cf}.json (.tmp → mv) + Cosmos->>Cosmos: ScrapeDispatch(dispatched_at) + SSM->>Crawler: run script on i-0b6a61d95888886f4 + Crawler->>Crawler: watcher picks up job → crawl (≤ MAX_PAGES_CAP) + Crawler->>CrawlS3: scraped_collections/{cf}.json + failure_logs/{cf}_failures_summary.json + loop poll_scrape_jobs every 5 min (SCRAPE_POLL_ENABLED) + Cosmos->>CrawlS3: results_ready? summary.LastModified > dispatched_at + CrawlS3-->>Cosmos: summary + documents + end + alt fresh results + Cosmos->>Cosmos: ingest_scraped_collection (CAS) → SCRAPING_SUCCESSFUL → DumpUrl + Cosmos->>Cosmos: migrate_dump_to_delta… → DeltaUrl → READY_FOR_CURATION + Cosmos->>Slack: ingest summary + else zero pages / stall > 24 h + Cosmos->>Cosmos: SCRAPING_FAILED + end + end + + Eng->>Cosmos: curate in UI (patterns, exclusions, titles) + + rect rgb(232, 242, 247) + Note over Eng,Slack: Phase 7 · test indexing + Eng->>Cosmos: workflow_status = CURATED + Cosmos->>Cosmos: promote_to_curated() → index_collection_to_test.delay + Cosmos->>Cosmos: _dispatch_index_run: run_id = _mint_run_id() + Cosmos->>IdxS3: export_curated_to_s3 → curated_collections/{cf}/{run_id}/documents.jsonl + Cosmos->>IdxS3: manifest.json (written LAST, document_count exact) + Cosmos->>STS: sts:AssumeRole CosmosIndexingDispatchRole-dev + STS-->>Cosmos: temp credentials + Cosmos->>STS: ecs:RunTask web_cosmos-scraper-dev, override: python3 api_scraper.py --source WEB_COSMOS --collection {cf} --target test --run-id {run_id} + STS-->>Cosmos: taskArn + Cosmos->>Cosmos: IndexDispatch(run_id, target=test, task_arn) → TEST_INDEXING + STS->>Idx: start container WEB_COSMOSContainer + Idx->>IdxS3: load_manifest + Idx->>AOSS: ensure_index → probe_scope + Idx->>AOSS: check_id_collisions (W2.13) — refuse id_scheme_collision / duplicate_business_ids before any spend + Idx->>AOSS: fetch_index_state(filter) + assert_owned + Idx->>IdxS3: stream_ids (id-only pre-pass) + Idx->>Idx: check_export_completeness · evaluate_deletions (cap 5000, then ratio > 0.90) — before any spend + Idx->>IdxS3: stream_documents + Idx->>AOSS: to_web_document → skip unchanged version → vectorize_documents_chunkwise → index_batch + Idx->>AOSS: tombstone_batch (public_visibility=false) — only if upsert complete + Idx->>AOSS: validate_run (test only) + Idx->>IdxS3: index_runs/{cf}/{run_id}/validation.json + Idx->>IdxS3: index_runs/{cf}/{run_id}/status.json — LAST, always, incl. on failure + loop poll_index_runs every 2 min (INDEX_POLL_ENABLED) + Cosmos->>IdxS3: fetch_run_status(cf, run_id) + IdxS3-->>Cosmos: status.json or nothing yet + end + alt state == succeeded (target test) + Cosmos->>IdxS3: fetch_validation_report + Cosmos->>Slack: send_indexing_validation_report — collection stays TEST_INDEXING + else failed · unknown state · stall > 6 h + Cosmos->>Cosmos: INDEXING_FAILED_ON_TEST + end + end + + rect rgb(247, 240, 228) + Note over Eng,IdxS3: Phase 7 · prod indexing + Eng->>Cosmos: workflow_status = QUALITY_CHECK_PERFECT / QUALITY_CHECK_MINOR (from the report) + Cosmos->>Cosmos: index_collection_to_prod.delay → new run_id + Cosmos->>IdxS3: export again (documents.jsonl, then manifest.json) + Cosmos->>STS: AssumeRole → RunTask … --target prod --run-id {run_id2} + Cosmos->>Cosmos: IndexDispatch → PRODUCTION_INDEXING + STS->>Idx: start task + Idx->>AOSS: same pipeline (still sde-web-subset until cutover — endpoints tier-capped) + Idx->>IdxS3: index_runs/{cf}/{run_id2}/status.json + loop poll_index_runs every 2 min + Cosmos->>IdxS3: fetch_run_status + end + alt succeeded + Cosmos->>Cosmos: PROD_PERFECT (or PROD_MINOR if previous status was QC_MINOR) + else failed · unknown · stall + Cosmos->>Cosmos: INDEXING_FAILED_ON_PROD + end + end +``` + +### Step by step + +**[1] Scrape dispatch (COSMOS → crawler, Phase 3)** +- Trigger: `Collection.workflow_status` set to `READY_FOR_ENGINEERING` (or + `reindexing_status` = `REINDEXING_NEEDED_ON_DEV` for a re-scrape) → `post_save` → + `handle_workflow_status_change` (`sde_collections/models/collection.py`). +- `sde_collections/tasks.py::dispatch_scrape_job` → `scraping/ssm_dispatch.py::send_job_to_crawler`: + builds the job JSON (`scraping/job_builder.py::build_job_json`; a request above the hard-coded `MAX_PAGES_CAP = 100_000` is rejected with `ValueError`, not clamped), + `ssm.send_command(AWS-RunShellScript)` to `CRAWLER_INSTANCE_ID`, writing + `{CRAWLER_INBOX_PATH}/{cf}.json` via a `.tmp` + `mv` so the watcher never reads a partial file. +- Records a `ScrapeDispatch` row (`ssm_command_id`, `dispatched_at`) — the poller's freshness + reference. Failure to send → `SCRAPING_FAILED`. +- Manual equivalent: `python manage.py dispatch_scrape --collection `. + +**[2] Scrape results (crawler → S3 → COSMOS, Phase 4)** +- Crawler writes to `SDE_S3_BUCKET` (`sdecrawlerstack-crawlbucket…`): + `scraped_collections/{cf}.json`, `failure_logs/{cf}_failures.jsonl`, + `failure_logs/{cf}_failures_summary.json`. +- Beat: `poll_scrape_jobs` every 5 min (`SCRAPE_POLL_ENABLED`). `scraping/s3_results.py::results_ready` + accepts a summary only if its `LastModified` is after `ScrapeDispatch.dispatched_at`; past + `SCRAPE_STALL_TIMEOUT_HOURS` (24) with nothing fresh → `SCRAPING_FAILED`. +- `ingest_scraped_collection` claims the collection with an atomic status CAS → `SCRAPING_SUCCESSFUL`, + loads `DumpUrl`s (zero pages → `SCRAPING_FAILED`), then + `migrate_dump_to_delta_and_handle_status_transistions` → `DeltaUrl`s → `READY_FOR_CURATION` + (re-scrape: `REINDEXING_FINISHED_ON_DEV` → `REINDEXING_READY_FOR_CURATION`) and posts the + ingest summary to Slack. + +**[3] Curation** — human step in the COSMOS UI (patterns, exclusions, titles, doc types). + +**[4] Test-index hand-off (COSMOS → indexer, Phase 7 / W4)** +- Trigger: `CURATED` → `handle_workflow_status_change` → `promote_to_curated()` (Delta → Curated + URLs) → `index_collection_to_test.delay`. +- `tasks.py::_dispatch_index_run` (shared by test and prod): + 1. `_mint_run_id()`. + 2. `indexing/export.py::export_curated_to_s3(collection, target, run_id)` — iterates + `CuratedUrl.objects.filter(collection=c).exclude(excluded=True)`, spools JSONL to a temp + file, uploads `documents.jsonl`, then `manifest.json` **last** (`document_count` exact). + Bucket: `SDE_INDEX_BUCKET` = `sde-cosmos-indexing-dev`. + 3. `indexing/dispatch.py::run_index_task(collection, target, run_id)` — + `sts.assume_role(INDEXING_DISPATCH_ROLE_ARN)` → `ecs.run_task(cluster=INDEXING_ECS_CLUSTER, + taskDefinition=INDEXING_TASK_FAMILY, overrides.containerOverrides[name=WEB_COSMOSContainer, + command=["python3","api_scraper.py","--source","WEB_COSMOS","--collection",cf,"--target", + target,"--run-id",run_id]], networkConfiguration from INDEXING_SUBNETS/SECURITY_GROUPS)` + → returns `taskArn`. + 4. `IndexDispatch` row (`collection, run_id, target, task_arn, dispatched_at, + previous_workflow_status`) → status `TEST_INDEXING`. + - Any exception in 2–3 (including an empty curated set — `document_count == 0` raises before export) → `INDEXING_FAILED_ON_TEST`, nothing recorded. + +**Indexer run (`sde-api-scrapers`, `api_scraper.py::_run_web_cosmos` → `web/web_pipeline.py::WebPipeline.run()`)** +- Reads `COSMOS_INDEX_BUCKET`, `WEB_INDEX_NAME` (=`sde-web-subset` until cutover), both AOSS + endpoints (probe/validate client tier-capped by `--target`; the uploader's write path uses bare + `OPENSEARCH_ENDPOINT` — same collection in dev), deletion knobs — all injected by the task definition. +- Order is load-bearing: + 1. `cosmos_source.load_manifest` (`curated_collections/{cf}/{run_id}/manifest.json`). + 2. `ensure_index` — explicit mapping from `web/index_mappings/sde_web.json` (`version: keyword`, binary knn). + 3. `scope.probe_scope` — proves `WebIndexScope(cf).filter_query` isolates this collection + (else `scope_filter_ineffective`). + 3b. `id_collision.check_id_collisions` (**W2.13**, `cf695f9`) — refuses if the index already holds + this collection under ids the pipeline would not mint (`id_scheme_collision`) or under + duplicated business ids (`duplicate_business_ids`); the upsert would insert, not update, and + silently double the collection. Skipped when the index is absent (first run); + `--allow-id-collision` overrides and records the waiver in `status.json.id_collision_check`. + 4. `uploader.fetch_index_state(filter_query)` + `scope.assert_owned(…, "state_scan")` + (foreign id → `foreign_documents_in_scan`, zero deletes). + 5. Id-only pre-pass over the export (`cosmos_source.stream_ids`) → + `deletion_guard.check_export_completeness` (line count / dupes vs `document_count` → + `export_incomplete`, deletions skipped) and `evaluate_deletions` (count > `WEB_DELETION_ABORT_MAX` + (5000) → `deletion_budget_exceeded`, checked first; then ratio **> 0.90** (exactly 0.90 passes) → + `deletion_threshold_exceeded`). `assert_owned(…, "export_ids")` also runs on the id pre-pass. + All of this **before** any SageMaker spend. + 6. `_index_documents`: `cosmos_source.stream_documents` → `web_processor.to_web_document` + (mints `id=/SDE/{cf}/|{url}`, content-hash `version`, drops `tdamm_tag`) → skip unchanged + versions → `SageMakerVectorizer.vectorize_documents_chunkwise` → `assert_owned(…, "upsert_batch")` + → `uploader.index_batch`. + 7. `uploader.tombstone_batch` (sets `public_visibility: false`, reversible) — only if the upsert + completed, and only after `assert_owned(…, "deletion_candidates")`. + 8. `--target test` only: `validate.validate_run` → `index_runs/{cf}/{run_id}/validation.json` + (count + title diff vs manifest; report, never a gate). + 9. `status.json` written **last and unconditionally**, incl. on failure + (`state`, counts, `deletion_ratio`, `deletion_mode`, machine-readable `error`). Exit code + 0 iff `state == succeeded`. +- **First run of a collection** (`first_run.md`): no document carries `version` yet, so the state + scan is empty, the deletion-candidate set is structurally empty, and every document is + re-vectorized (full SageMaker cost). Run 1 writes `version`, which is what arms the deletion + guards for run 2 onward — treat run 2 as the first one where the safety machinery matters. +- `--reconcile` (operator-only, never dispatched by COSMOS): scans without the `version` filter, + writes `reconcile.json` listing orphans — report, no deletes. + +**[5] Poll test result (COSMOS)** +- Beat: `poll_index_runs` every 2 min (`INDEX_POLL_ENABLED` — enforced on the `PeriodicTask.enabled` row, written at `post_migrate`). For each collection in + `TEST_INDEXING`/`PRODUCTION_INDEXING` with an open `IndexDispatch`: + `indexing/run_status.py::fetch_run_status(cf, run_id)` reads `index_runs/{cf}/{run_id}/status.json`. +- `None` → still running; past `INDEX_STALL_TIMEOUT_HOURS` (6) → `INDEXING_FAILED_ON_*`. +- `succeeded` + `test` → collection **stays** `TEST_INDEXING`; `fetch_validation_report` → + `slack_utils.send_indexing_validation_report` posts to `#sde-data-curation`. +- `failed` or any unknown `state` → `INDEXING_FAILED_ON_TEST`. `IndexDispatch.completed_at` set. + +**[6] QC → prod hand-off (COSMOS)** +- Curator reads the Slack report and sets `QUALITY_CHECK_PERFECT` or `QUALITY_CHECK_MINOR` + → `handle_workflow_status_change` → `index_collection_to_prod.delay` → same + `_dispatch_index_run` with `target="prod"` (new `run_id`, fresh export, `--target prod`) → + `PRODUCTION_INDEXING`. (Until cutover the prod run still lands in `sde-web-subset`; in dev every + endpoint env var resolves to the dev collection, so a dev dispatch cannot reach prod AOSS.) + +**[7] Poll prod result (COSMOS)** +- `poll_index_runs`: `succeeded` + `prod` → `PROD_PERFECT`, or `PROD_MINOR` if + `previous_workflow_status` was `QUALITY_CHECK_MINOR`; failure/stall → `INDEXING_FAILED_ON_PROD`. +- Re-index later: `reindexing_status` = `REINDEXING_NEEDED_ON_DEV` restarts at [1]; + `REINDEXING_CURATED` → `promote_to_curated()` (then the curator sets `CURATED` to re-run [4]). + +### Where each side's guarantees live + +| Concern | Owner | Mechanism | +|---|---|---| +| Stale crawler results | COSMOS | `ScrapeDispatch.dispatched_at` vs S3 `LastModified` | +| Stale index results | structural | `run_id` namespaces every artifact — no freshness rule needed | +| Partial export read as complete | COSMOS writes manifest **last**; indexer checks count | `export_incomplete` → deletions skipped | +| Mass deletion / mis-scope | indexer | scope probe, ownership assertion at 4 boundaries, absolute cap + ratio (> 0.90) | +| Wasted SageMaker spend | indexer | all guards run before vectorization | +| Reversibility | indexer | tombstones (`public_visibility: false`), never hard deletes | +| Which index | indexer | `WEB_INDEX_NAME` in the task def (`sde-web-subset` now; flip = cutover) | +| Silent duplication (id-scheme drift) | indexer | W2.13 `check_id_collisions` — `prefix` must-not on `id` + `min_doc_count: 2` agg, both fail-fast; `--allow-id-collision` is an audited override | +| Who may dispatch | indexer IAM | dispatch role trusts `indexing-helper-role` only; RunTask limited to the `web_cosmos-scraper-{env}` family + cluster | diff --git a/LOCAL_VERIFICATION_GUIDE.md b/LOCAL_VERIFICATION_GUIDE.md index 629f705a..86c5a186 100644 --- a/LOCAL_VERIFICATION_GUIDE.md +++ b/LOCAL_VERIFICATION_GUIDE.md @@ -1,15 +1,17 @@ # COSMOS Local Verification Guide — Phases 0–7 -This guide verifies the rewired COSMOS pipeline (branch `cosmos-rewiring`, Phases 0–7 of -[`IMPLEMENTATION_PLAN.md`](./IMPLEMENTATION_PLAN.md)) by **walking one real collection through the -entire workflow on your machine**: *Aurorasaurus — Reporting Auroras from the Ground Up* +This guide verifies the rewired COSMOS pipeline (branch `cosmos-rewiring`, Phases 0–7) by +**walking one real collection through the entire workflow on your machine**: +*Aurorasaurus — Reporting Auroras from the Ground Up* (`config_folder: aurorasaurus_reporting_auroras_from_the_ground_up`). Why this collection: the crawl4ai scraper **already crawled it for real** — its output (25 documents from `aurorasaurus.org`) sits in the dev S3 bucket. That lets the demo ingest *genuine scraped data* through the *genuine production code path*, no mocks. Only one thing stays -simulated: the WEB_COSMOS indexer's responses, because its AWS stacks (`sde-cosmos-indexing-dev`) -are not deployed yet. +simulated: the WEB_COSMOS indexer's responses. Its AWS stacks *are* deployed in the dev account +(the `sde-cosmos-indexing-dev` bucket, the `CosmosIndexingDispatchRole-dev` role, and the +`web_cosmos-scraper-dev` task family) — simulating its replies is a choice of this local +walkthrough, which runs COSMOS on your machine and deliberately starts no real Fargate tasks. Each step of the walkthrough has the same shape: @@ -83,7 +85,7 @@ All pipeline vars already exist in this file. For this walkthrough the AWS-facin |---|---|---| | `SLACK_WEBHOOK_URL` | any non-empty dummy, e.g. `http://localhost/dummy` | **Required to boot** (no default). Dummy → every Slack post prints a caught error and continues. Real webhook → messages actually post on every status change. | | `SDE_S3_BUCKET`, `CRAWLER_INSTANCE_ID` | blank | The scrape-dispatch hop then fails gracefully (Step 3's wiring proof). The real bucket is injected per-command in Step 4, not set here. | -| `SDE_INDEX_BUCKET`, `INDEXING_*` | blank (keep `INDEXING_CONTAINER_NAME` default) | The indexing hops fail gracefully (Steps 5 & 7) — correct until the indexer's stacks deploy. | +| `SDE_INDEX_BUCKET`, `INDEXING_*` | blank (keep `INDEXING_CONTAINER_NAME` default) | The indexing hops then fail gracefully (Steps 5 & 7). Deliberate: the dev stacks are live, and a local run should not export to their bucket or start real Fargate tasks. | | `SCRAPE_POLL_ENABLED`, `INDEX_POLL_ENABLED`, `INFERENCE_ENABLED` | `False` | With blank buckets the pollers would only log S3 errors every 2–5 min; the inference-off state is itself verified in Step 2. | | `SDE_AWS_ACCESS_KEY_ID`, `SDE_AWS_SECRET_ACCESS_KEY` | blank | Keeps `get_boto3_session()` on the default credential chain — which is exactly how Step 4 injects short-lived SSO credentials. | @@ -442,7 +444,7 @@ trigger. Watch the worker log as you set **Curated**. curated data is never touched unnecessarily). - Worker log: `Index dispatch (test) failed for aurorasaurus_…: SDE_INDEX_BUCKET is not configured — cannot export`, and the status lands on **Indexing Failed on Test** (red). -- With the indexer deployed, this same click would export +- With the `INDEXING_*` settings filled in from the dev stacks, this same click would export `curated_collections/{cf}/{run_id}/documents.jsonl` + `manifest.json` to S3, `ecs:RunTask` the WEB_COSMOS indexer, and land on **Test Indexing**. @@ -488,9 +490,9 @@ resolve the run by reading `index_runs/{cf}/{run_id}/status.json` from S3 — ne `ecs.describe_tasks`. The `run_id` namespacing means an old run's status can never satisfy a newer dispatch. -The indexer isn't deployed yet, so here we simulate **its half only** — the `status.json` -responses — while running COSMOS's poller for real. Three outcomes, continuing from -*Indexing Failed on Test*: +The indexer is live in the dev account, but a local walkthrough has no business starting real +Fargate tasks — so here we simulate **its half only** — the `status.json` responses — while +running COSMOS's poller for real. Three outcomes, continuing from *Indexing Failed on Test*: **Do this** — paste into `shell_plus`: @@ -577,10 +579,10 @@ Open the collection's **Workflow History** tab. The full journey reads: Everything COSMOS-side ran for real: settings/credential plumbing (P0), the status vocabulary (P1), inference-off migration (P2), dispatch triggers and job building (P3), real-S3 ingest with claim semantics (P4), curation triggers and promote (P5), a Sinequa-free codebase (P6), and the -export/dispatch/poll machinery (P7). The only simulated piece was the indexer's `status.json` — -the moment the `sde-api-scrapers` `web-indexing` stacks deploy (its NS.2) and the COSMOS env gets -the `INDEXING_*` values, Steps 5 and 7 stop failing gracefully and this same collection is the -natural first candidate for the fully-real closed loop. +export/dispatch/poll machinery (P7). The only simulated piece was the indexer's `status.json`. +Its dev stacks are already deployed, so nothing further has to be built: fill a COSMOS +environment's `INDEXING_*` values from those stack outputs and Steps 5 and 7 stop failing +gracefully — this same collection is the natural first candidate for the fully-real closed loop. The walkthrough is repeatable end to end: Step 4's ingest replaces dumps and re-diffs, promote is idempotent, and each `IndexDispatch` gets a fresh `run_id`. @@ -655,14 +657,15 @@ locally it fails on the blank bucket by design). ## Appendix B — What this guide deliberately does NOT verify -These need real AWS beyond the crawler bucket, and are covered by the "Manual verification (real -dev AWS)" blocks in `IMPLEMENTATION_PLAN.md` (P3, P4, P7) once the `sde-api-scrapers` -`web-indexing` stacks deploy: +These need real AWS beyond the crawler bucket. Nothing here is blocked on infrastructure — the +crawler stack and the indexer's dev stacks both exist — they are simply out of scope for a local +run, and are checked by hand against dev AWS instead: - A real SSM `send-command` reaching the crawler inbox on `i-0b6a61d95888886f4` (the Step 3 success path — its output for Aurorasaurus already exists, which is what Step 4 consumed). - The real export → `sts:AssumeRole` → `ecs:RunTask` → `status.json` loop against - `sde-cosmos-indexing-dev` (Step 5/7 success paths; the indexer repo's E2E.10). + `sde-cosmos-indexing-dev` (Step 5/7 success paths), which runs from a COSMOS host whose instance + role may assume `CosmosIndexingDispatchRole-dev`. - Slack delivery, if you ran with a dummy webhook. - The stall-timeout paths in real time (both unit-tested; live simulation means waiting `SCRAPE_STALL_TIMEOUT_HOURS` / `INDEX_STALL_TIMEOUT_HOURS`). diff --git a/README.md b/README.md index ab3da78b..408de230 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,49 @@ COSMOS is a web application designed to manage collections indexed in NASA's Science Discovery Engine (SDE), facilitating precise content selection and allowing metadata modification before indexing. +## How the pipeline works + +A collection moves through scrape → curate → index. COSMOS orchestrates that flow but does not +crawl or index anything itself: it hands work to two external systems and watches S3 for results. +Every hop is a file in S3 plus a poller — there are no callbacks. + +``` + COSMOS (Django + Celery) crawl4ai host sde-api-scrapers (ECS Fargate) + ──────────────────────── ─────────────── ────────────────────────────── + Ready for Engineering ──SSM──▶ crawl ──▶ S3 + Scraping Successful ◀──S3─── poll_scrape_jobs (5 min) + Ready for Curation → (curator works in the UI) + Curated ──S3 export + ecs:RunTask──────────────────────────▶ index into OpenSearch + Test Indexing ◀──S3─── poll_index_runs (2 min) ◀──────────── status.json / validation.json + QC: Perfect / QC: Minor Issues ──▶ prod run ──▶ Prod: Perfect / Prod: Minor Issues +``` + +The curator drives this by changing `workflow_status` in the admin; a `post_save` handler +(`sde_collections/models/collection.py::handle_workflow_status_change`) fires the matching Celery +task. Failures land on **Scraping Failed**, **Indexing Failed on Test**, or **Indexing Failed on +Prod** rather than silently stalling. + +COSMOS holds no OpenSearch or SageMaker credentials. Chunking, vectorizing, indexing, and the QC +validation report all happen in the indexer repo (`sde-api-scrapers`). COSMOS only writes exports +to S3, assumes one IAM role, and calls `ecs:RunTask`. + +### Where things are documented + +| Doc | What it covers | +|---|---| +| [`WORKFLOW.md`](./WORKFLOW.md) | The curation workflow end to end, with a diagram | +| [`sde_collections/DEPLOYMENT.md`](./sde_collections/DEPLOYMENT.md) | How deploys actually work today, and the CI/CD gaps | +| [`LOCAL_VERIFICATION_GUIDE.md`](./LOCAL_VERIFICATION_GUIDE.md) | Verifying the pipeline locally, phase by phase | +| [`sde_collections/models/README_STATUS_TRIGGERS.md`](./sde_collections/models/README_STATUS_TRIGGERS.md) | What each status change triggers | +| [`sde_collections/models/README_LIFECYCLE.md`](./sde_collections/models/README_LIFECYCLE.md) | Dump → Delta → Curated URL lifecycle | + +> **Note on configuration:** every setting that gates a dispatch (S3 buckets, ECS cluster, task +> family, IAM role ARN, subnets, security groups, and both `*_POLL_ENABLED` flags) defaults to +> blank or off in `config/settings/base.py`. Nothing dispatches until a host is explicitly wired. +> The pollers are `django_celery_beat` database rows written by a `post_migrate` receiver +> (`sde_collections/signals.py`), so enabling a poller requires `manage.py migrate` — restarting +> the services alone will not do it. + ## Basic Commands ### Building the Project @@ -202,20 +245,22 @@ $ pip install celery ### Running a Celery Worker +Run these from the **repository root** — the folder containing `manage.py` and `config/`. For +Celery's import magic to work, the working directory matters. + ```bash -$ cd sde_indexing_helper $ celery -A config.celery_app worker -l info ``` -Please note: For Celery's import magic to work, it is important where the celery commands are run. If you are in the same folder with manage.py, you should be right. - ### Running Celery Beat Scheduler ```bash -$ cd sde_indexing_helper $ celery -A config.celery_app beat ``` +Note that beat schedules in this project are `django_celery_beat` **database rows**, not a +`CELERY_BEAT_SCHEDULE` setting — see the configuration note at the top of this file. + ### Pre-Commit Hook Instructions To install pre-commit hooks: @@ -233,21 +278,40 @@ Sign up for a free account at [Sentry](https://sentry.io/signup/?code=cookiecutt ## Deployment -Refer to the detailed [Cookiecutter Django Docker documentation](http://cookiecutter-django.readthedocs.io/en/latest/deployment-with-docker.html). - -## Importing Candidate URLs from the Test Server +See [`sde_collections/DEPLOYMENT.md`](./sde_collections/DEPLOYMENT.md) for how deploys work on this +project — the compose stacks, the branch flow (`dev` → `staging` → `production`), the hand-maintained +per-host env files, and the current CI/CD gaps. Deployment is manual today: SSH to the host and +rebuild in place. -Documented [here](https://github.com/NASA-IMPACT/sde-indexing-helper/wiki/How-to-bring-in-Candidate-URLs-from-the-test-server). +Background on the underlying Docker setup is in the +[Cookiecutter Django Docker documentation](http://cookiecutter-django.readthedocs.io/en/latest/deployment-with-docker.html). ## Adding New Features/Fixes We welcome contributions to improve the project! Before you begin, please take a moment to review our [Contributing Guidelines](./CONTRIBUTING.md). These guidelines will help you understand the process for submitting new features, bug fixes, and other improvements. -## Job Creation +## Dispatching a Scrape + +Scrapes are normally triggered by setting a collection's `workflow_status` to **Ready for +Engineering** in the admin, which dispatches a job to the crawl4ai host over AWS SSM. + +To dispatch one by hand: + +```shell +docker-compose -f local.yml run --rm django python manage.py dispatch_scrape --collection +``` + +Results are picked up automatically by the `poll_scrape_jobs` beat task (every 5 minutes, gated by +`SCRAPE_POLL_ENABLED`). To ingest a completed scrape manually instead: + +```shell +docker-compose -f local.yml run --rm django python manage.py ingest_scrape_results --collection +``` -Eventually, job creation will be done seamlessly by the webapp. Until then, edit the `config.py` file with the details of what sources you want to create jobs for, then run `generate_jobs.py`. +## Code Structure -## Code Structure for SDE_INDEXING_HELPER +The Django project package is still named `sde_indexing_helper/` (COSMOS is the product name; the +package was not renamed). - Frontend pages: - HTML: `/sde_indexing_helper/templates/` @@ -255,6 +319,17 @@ Eventually, job creation will be done seamlessly by the webapp. Until then, edit - CSS: `/sde_indexing_helper/static/css` - Images: `/sde_indexing_helper/static/images` +- Pipeline code, all under `sde_collections/`: + - `scraping/` — dispatching crawls and reading their results: + `job_builder.py` (job JSON), `ssm_dispatch.py` (SSM send-command to the crawl4ai host), + `s3_results.py` (freshness checks and result fetch) + - `indexing/` — the hand-off to the indexer: + `export.py` (writes `documents.jsonl`, then `manifest.json` last), + `dispatch.py` (`sts:AssumeRole` → `ecs:RunTask`), `run_status.py` (reads `status.json`) + - `tasks.py` — the Celery tasks, including both pollers + - `signals.py` — the `post_migrate` receiver that writes the beat schedule rows + - `models/` — collections, URL lifecycle, and patterns (see the `README_*.md` files there) + ## Running Long Scripts on the Server ```shell diff --git a/SQLDumpRestoration.md b/SQLDumpRestoration.md index 866093db..cb545049 100644 --- a/SQLDumpRestoration.md +++ b/SQLDumpRestoration.md @@ -8,6 +8,10 @@ docker-compose -f local.yml run --rm django python manage.py loaddata backup.jso However, if the JSON file is particularly large (>1.5GB), Docker might struggle with this method. In such cases, you can use SQL dump and restore commands as an alternative. +> **Never paste real credentials, hostnames, or database endpoints into this file.** Every value +> below is a placeholder. Read the actual values from the appropriate `.envs/*/.postgres` file on +> the host at the time you run the commands. + ### Steps for Using SQL Dump and Restore 1. Begin by starting only the PostgreSQL container. This prevents the Django container from making changes while the PostgreSQL container is starting up. @@ -21,9 +25,9 @@ docker-compose -f local.yml up postgres ``` $ docker ps CONTAINER ID IMAGE COMMAND -23d33f22cc43 sde_indexing_helper_production_postgres "docker-entrypoint.s…" + "docker-entrypoint.s…" -$ docker exec -it 23d33f22cc43 bash +$ docker exec -it bash ``` 3. Create a connection to the database. @@ -34,25 +38,25 @@ psql -U -d **Note**: - For local deployment, refer to the `.envs/.local/.postgres` file for the `POSTGRES_USER` and `POSTGRES_DB` variables. -- For production deployment, refer to the `.envs/.production/.postgres` file. +- For deployed hosts, refer to that host's `.envs/.production/.postgres` file. 4. Ensure that the database `` is empty. Here's an example: ``` -sde_indexing_helper-# \c -You are now connected to database "sde_indexing_helper" as user "VnUvMKBSdk...". -sde_indexing_helper-# \dt +-# \c +You are now connected to database "" as user "". +-# \dt Did not find any relations. ``` If the database is not empty, delete its contents to create a fresh database: ``` -sde_indexing_helper=# \c postgres //connect to a different database before dropping -You are now connected to database "postgres" as user "VnUvMKBSdk....". -postgres=# DROP DATABASE sde_indexing_helper; +=# \c postgres //connect to a different database before dropping +You are now connected to database "postgres" as user "". +postgres=# DROP DATABASE ; DROP DATABASE -postgres=# CREATE DATABASE sde_indexing_helper; +postgres=# CREATE DATABASE ; CREATE DATABASE ``` @@ -60,7 +64,7 @@ CREATE DATABASE 5. Transfer the backup SQL dump (`backup.sql`) from your local machine to the PostgreSQL container. ``` -docker cp /local/path/backup.sql 23d33f22cc43:/ +docker cp /local/path/backup.sql :/ ``` 6. Import the SQL dump into the PostgreSQL container. @@ -84,109 +88,82 @@ docker-compose -f local.yml run --rm django python manage.py createsuperuser 8. Log in to the COSMOS frontend to ensure that all data has been correctly populated in the UI. +--- +## Making a backup from a deployed host -# making the backup +Read the database values from the host's env file — do not copy them anywhere: ```bash -ssh sde -cat .envs/.production/.postgres +ssh +cat .envs/.production/.postgres # POSTGRES_HOST, POSTGRES_PORT, POSTGRES_DB, POSTGRES_USER, POSTGRES_PASSWORD ``` -find the values for the variables: -POSTGRES_HOST=sde-indexing-helper-db.c3cr2yyh5zt0.us-east-1.rds.amazonaws.com -POSTGRES_PORT=5432 -POSTGRES_DB=postgres -POSTGRES_USER=postgres -POSTGRES_PASSWORD=this_is_A_web_application_built_in_2023 +Find the running Postgres container: ```bash docker ps ``` -b3fefa2c19fb +Dump the database. Prefer letting `pg_dump` prompt for the password (`-W`) over putting it in the +command, which would otherwise land in your shell history: -note here that you need to put the ```bash -docker exec -t your_postgres_container_id pg_dump -U your_postgres_user -d your_database_name > backup.sql +docker exec -it pg_dump -h -U -d -W > backup.sql ``` + +### Move the backup to your local machine + ```bash -docker exec -t container_id pg_dump -h host -U user -d database -W > prod_backup.sql +scp :/home/ec2-user/sde-indexing-helper/backup.sql . ``` -docker exec -t b3fefa2c19fb env PGPASSWORD="this_is_A_web_application_built_in_2023" pg_dump -h sde-indexing-helper-db.c3cr2yyh5zt0.us-east-1.rds.amazonaws.com -U postgres -d postgres > prod_backup.sql - -# move the backup to local - go back to local computer and scp the file +To copy it to another host, `scp` or — if the transfer is unreliable — `rsync`: ```bash -scp sde:/home/ec2-user/sde_indexing_helper/prod_backup.sql . +rsync -avzP backup.sql :/home/ec2-user/sde-indexing-helper/ ``` -scp prod_backup.sql sde_staging:/home/ec2-user/sde-indexing-helper -if you have trouble transferring the file, you can use rsync: -rsync -avzP prod_backup.sql sde_staging:/home/ec2-user/sde-indexing-helper/ -# restoring the backup -bring down the local containers +### Restoring the backup + +Bring the local containers down, then start only Postgres: + ```bash docker-compose -f local.yml down docker-compose -f local.yml up postgres docker ps ``` -find the container id - -c11d7bae2e56 - -find the local variables from -cat .envs/.production/.postgres -POSTGRES_HOST=sde-indexing-helper-staging-db.c3cr2yyh5zt0.us-east-1.rds.amazonaws.com -POSTGRES_PORT=5432 -POSTGRES_DB=sde_staging -POSTGRES_USER=postgres -POSTGRES_PASSWORD=postgres - +Read the target database values from the appropriate env file, then connect and recreate the +database: ```bash -docker exec -it bash -``` -docker exec -it c11d7bae2e56 bash - -## do all the database shit you need to - - +docker exec -it bash psql -U -d -psql -U postgres -d sde_staging -or, if you are on one of the servers: -psql -h sde-indexing-helper-staging-db.c3cr2yyh5zt0.us-east-1.rds.amazonaws.com -U postgres -d postgres +``` +```sql \c postgres -DROP DATABASE sde_staging; -CREATE DATABASE sde_staging; - -# do the backup - -```bash -docker cp prod_backup.sql c11d7bae2e56:/ -docker exec -it c11d7bae2e56 bash +DROP DATABASE ; +CREATE DATABASE ; ``` +Copy the dump into the container and load it: + ```bash +docker cp backup.sql :/ +docker exec -it bash psql -U -d -f backup.sql ``` -psql -U VnUvMKBSdkoFIETgLongnxYHrYVJKufn -d sde_indexing_helper -f prod_backup.sql - -psql -h sde-indexing-helper-staging-db.c3cr2yyh5zt0.us-east-1.rds.amazonaws.com -U postgres -d postgres -f prod_backup.sql -pg_restore -h sde-indexing-helper-staging-db.c3cr2yyh5zt0.us-east-1.rds.amazonaws.com -U postgres -d postgres prod_backup.sql - +Finally, bring everything back up and migrate: -docker down - -docker up build - -migrate - -down +```bash +docker-compose -f local.yml down +docker-compose -f local.yml up --build +docker-compose -f local.yml run --rm django python manage.py migrate +``` -up +**Note:** the `database_backup` and `database_restore` management commands documented in the +[README](./README.md) are the recommended path for routine work; the manual procedure above is for +cases those commands can't handle. diff --git a/TEST_AUDIT.md b/TEST_AUDIT.md deleted file mode 100644 index ba8292ea..00000000 --- a/TEST_AUDIT.md +++ /dev/null @@ -1,112 +0,0 @@ -# COSMOS Test Audit - -**Branch:** `cosmos-rewiring` · **Date:** 2026-08-14 · **Status:** all changes uncommitted on the working tree - -**Goal:** verify that every test in the repository actually exercises production behavior — that mocks sit at external boundaries (AWS, HTTP, Celery, Slack) while assertions land on real code paths and database state, never on the mock's own configuration. - -| Metric | Before | After | -|---|---|---| -| Full-suite result | **66 failed**, 401 passed, 2 collection errors | **482 passed, 0 failed**, 2 env-gated skips | -| Runtime | ~3:54 | ~37s | -| New boundary tests | — | 14 | -| Vacuous / dead tests repaired | — | 15 | -| Lint | — | flake8 clean on all touched files | - ---- - -## 1 · Method - -Every test file changed or added on this branch was reviewed line-by-line; the legacy suites (pattern/delta/promotion, users, feedback, environmental justice, inference, management commands) were audited in a parallel sweep. Each test was classified as: - -- **Vacuous** — patches the system under test itself, asserts only what the mock was configured to return, or asserts a condition that cannot fail. These stay green with broken production code. -- **Boundary-mocked (healthy)** — mocks external services but asserts real DB state, return values, or logic branches. -- **Plain functional** — no mocks. - -**Verdict on the pre-existing suite:** healthier than its mock density suggests. The ~2,500 lines of pattern/delta/promotion tests are essentially mock-free and carry the real regression protection. The rot was concentrated in the backup-command tests, a few inference tests, and three self-referential or assertion-free tests — all repaired below. - ---- - -## 2 · New coverage: the AWS boundary modules - -The branch's new pipeline tests (`test_scrape_dispatch`, `test_scrape_ingest`, `test_indexing_dispatch`, `test_inference_flag`, `test_workflow_status_triggers`) were already well-shaped. But every caller-side test mocks the three AWS boundary modules away, so their internal logic had **zero coverage** — the S3 key layouts that form the contract with the crawler and indexer, the SSM script construction, and the missing-key-versus-real-error branching. 14 tests were added (12 functions, 14 runs with parametrization): - -| Module | New tests (location) | What is now proven | -|---|---|---| -| `scraping/ssm_dispatch.py` | `TestSendJobToCrawler` ×4 (test_scrape_dispatch.py) | The generated shell script is shell-split and the job JSON recovered by round-trip — the payload the crawler receives equals `build_job_json()` exactly, including a hostile seed URL with quotes/spaces/ampersands. Write is atomic (`.tmp` → `chown` → `mv`, in that order), the command targets `CRAWLER_INSTANCE_ID` via AWS-RunShellScript, and the SSM comment is truncated to its 100-char limit. | -| `scraping/s3_results.py` | `TestS3ResultFetchers` ×4, 5 runs (test_scrape_ingest.py) | Exact crawler key contract: `failure_logs/{id}_failures_summary.json` and `scraped_collections/{id}.json` against `SDE_S3_BUCKET`; `LastModified` passthrough (feeds the staleness rule); `NoSuchKey`/`404` → "run not finished" (`None`); `AccessDenied` raises rather than reading as "still crawling" forever. | -| `indexing/run_status.py` | `TestRunStatusFetchers` ×4, 5 runs (test_indexing_dispatch.py) | Exact indexer key contract: `index_runs/{config_folder}/{run_id}/status.json` and `validation.json` against `SDE_INDEX_BUCKET`; missing key → in-flight (`None`); real S3 errors propagate instead of stalling to timeout. | - -Also tightened in the branch tests: the Slack-notification assertion in `test_workflow_status_triggers.py` contained `or "<" in message`, which made it nearly impossible to fail; it now asserts the collection name **and** the transition-specific message text. - ---- - -## 3 · Vacuous tests repaired - -| File | Defect | Repair | -|---|---|---| -| `sde_collections/tests/test_database_backup.py` | Three tests could never fail: error/cleanup assertions checked that a file at a bare relative path — which production never writes (it writes to `/app/backups/`) and which the mocked `pg_dump` never created — did not exist. `test_handle_compression_error` additionally mocked a method on a fixture `Command` instance that `call_command` never touches. | The mocked `pg_dump` now genuinely writes a dump file. The real `compress_file` gzips it (content verified by decompressing), the real `temp_file_handler` cleanup is observed, error paths assert the reported message ("Backup failed" / "Error during backup process") plus absence of artifacts, and `compress_file` is patched on the class so the failure actually occurs. The integration test now pins the exact `/app/backups/…` path. | -| `sde_collections/tests/test_url_apis.py` | `test_candidate_url_api_alias` reversed the same URL name twice into one variable and asserted a response equal to itself. | Now compares `candidate-urls-api` against `curated-urls-api` — the actual alias contract (both routes serve `CuratedURLAPIView`) — with distinct-route and non-empty-payload checks. | -| `sde_collections/tests/test_promote_collection.py` | `test_promotion_with_overlapping_patterns_and_deletion` had zero assertions — its "verification" was `print()` loops. `test_promotion_with_title_change` ended with a bare call and a comment about an expected production error. | Real assertions on exact pattern↔URL relations before and after a deletion promotion — which exposed a latent bug in the test itself (§4.2). The title-change test now asserts the update carries through and the pattern relation survives. | -| `sde_collections/tests/test_migrate_dump.py` | The file kept its own copy of `DELTA_COMPARISON_FIELDS` ("assuming a central definition") — silently drift-prone — and `test_empty_delta_comparison_fields` "emptied" that local copy, a no-op on production. | Imports the production constant from `models/collection.py`; the empty-fields test patches it in the module where production reads it, with *differing* titles, genuinely proving the field list drives delta creation. | -| `inference/tests/test_classification_utils.py` | `test_threshold_parameter_behavior` asserted that the `threshold` argument is *discarded* — certifying a live production bug as correct behavior. | Production bug fixed (§5); the test now asserts the threshold is forwarded to `map_classification_to_tdamm_tags`. | -| `inference/tests/test_batch.py` | `test_extremely_large_text` patched two methods of the `BatchProcessor` under test and never checked the truncation its docstring promised. `test_integration_with_mock_django_db` carried a dead `patch.object` wrapper and misleading comments. | The batch limit is constructor-configurable, so the test now feeds real 250-char text against a limit of 100 and asserts the emitted batch contains the actually-truncated text. The integration test drops the dead patch and asserts text and metadata produced by the real `prepare_url_data`. | -| `sde_collections/tests/test_delta_patterns.py` | Two dead statements where assertions were clearly intended: a discarded `.first()` queryset (plus a commented-out `apply()`), and an attribute assignment never saved. | Both became assertions: the equal-titles test now proves the pattern *matched* the CuratedUrl (so the missing DeltaUrl is a deliberate skip, not a failed match); the reapplication test asserts the title was applied on create (`save()` auto-applies patterns). | - ---- - -## 4 · Failures found and their root causes - -### 4.1 · 66 tests failing in every full-suite run — infra bug, fixed - -`environmental_justice/tests/conftest.py` registered an **autouse fixture that permanently overwrote** `settings.ROOT_URLCONF` with its private EJ-only URL table and never restored it. The EJ module collects early (alphabetical order), so every later test that resolves a named URL failed with `NoReverseMatch` — while passing in isolation, which is why it went unnoticed. Pre-existing on `dev`; unrelated to the rewiring branch. Fixed with pytest-django's self-restoring `settings` fixture (the test-local urlconf itself is legitimate: the EJ API has no registration in the project urlconf). Runtime fell from ~3:54 to ~37s once the failure churn disappeared. - -| File | Failed | Tests | -|---|---|---| -| `feedback/tests.py` | 20 | All of `TestFeedbackAPI` (8: dropdown options, create success, invalid email, 4× missing-field, invalid dropdown) and `TestContentCurationRequestAPI` (12: create success, without additional info, invalid email, 5× missing-field, 4× max-length). Only the 2 pure model tests survived. | -| `sde_collections/tests/test_url_apis.py` | 19 | `TestDeltaURLAPIView` (5: empty list, with data, wrong config folder, serializer fields, pagination) and `TestCuratedURLAPIView` / `TestCandidateURLAPIView` (7 each: empty list, with data, wrong config folder, serializer fields, alias, multiple collections, invalid filters). | -| `sde_collections/tests/frontend/` | 15 | `test_auth.py` (failed login, logout, successful login); `test_homepage_features.py` (collections display, universal search, 6 search panes: connector type, curated URLs, curator, division, reindexing status, workflow status); `test_pattern_application.py` (create document-type / exclude / include / title pattern). | -| `sde_indexing_helper/users/tests/` | 12 | `test_admin.py` (changelist, search, add, view user); `test_views.py` (get_success_url, form_valid, get_redirect_url, not_authenticated); `test_urls.py` (detail, update, redirect); `test_models.py` (get_absolute_url). | - -### 4.2 · Latent test bug: wildcard vs. regex match patterns — masked bug, fixed - -Adding real assertions to the overlapping-patterns promotion test revealed its regex-idiom patterns (`.*docs.*` etc.) **matched zero URLs**: `BaseMatchPattern.get_regex_pattern()` runs `re.escape()` on the pattern and only translates `*` wildcards — so `.*docs.*` becomes a literal-dot regex that never matches. The print-only "assertions" had concealed for the test's whole life that it tested an empty scenario. Converted to wildcard idiom (`*docs*`, `*api/v1/doc*`, …) with exact expected relation sets, verified against actual behavior. - -### 4.3 · Two directories cannot import in the test container — pre-existing, excluded - -A bare `pytest` in the Django container aborts collection on `functional_tests/` (imports `webdriver_manager`, installed nowhere) and `document_classifier/` (imports `numpy`). Neither is a real pytest suite: `functional_tests/test_check_collection.py` is a standalone Selenium script that takes a collection name from `sys.argv`, drives real Chrome, and targets the *live* NASA Sinequa servers — infrastructure this branch deletes. The project's own CI (`init.sh`, line 8) already excludes both directories; the audit runs used matching `--ignore` flags. - ---- - -## 5 · Production code changes - -Two non-test files changed; everything else is test-only. - -- **`inference/utils/classification_utils.py`** — bug, fixed. `update_url_with_classification_results(…, threshold=X)` accepted and documented a `threshold` parameter but silently discarded it; every caller got `settings.TDAMM_CLASSIFICATION_THRESHOLD` regardless. One-line fix forwards it. No live behavior change on this branch (inference is dormant, `INFERENCE_ENABLED=False`) — **flag to the team anyway**. -- **`environmental_justice/tests/conftest.py`** — the URLconf-leak fix (§4.1). Test infrastructure only. - ---- - -## 6 · Current state - -``` -482 passed, 2 skipped, 0 failed (~37s; was 66 failed, ~3:54) -flake8 clean on all touched files (isort applied) -``` - -13 files modified, all **uncommitted** on `cosmos-rewiring`: 11 test files, 1 production fix (`classification_utils.py`), 1 test-infra fix (EJ conftest). The 2 skips are pre-existing environment-gated skips, unchanged. Verification: - -```bash -docker compose -f local.yml run --rm django pytest -q \ - --ignore=document_classifier --ignore=functional_tests -``` - ---- - -## 7 · Flagged but deliberately not changed - -- **`inference/tests/test_inference_integration.py`** — every test skips via fixture when `http://host.docker.internal:8000` is unreachable, so in CI the module is unconditionally green while asserting nothing. Coverage theater rather than vacuous mocking; consider gating on an env var that CI sets explicitly. -- **`test_field_modifier_patterns.py`** — three tests assert only that model fields equal the values just passed to `objects.create()` (testing Django, not the app). Harmless; low value. -- **`test_database_restore.py`** — monkeypatches `pytest.mark` at import time to define `integration`. Works, but fragile and affects any other module using that mark name; a `conftest`/`pytest.ini` marker registration would be safer. -- **`test_delta_patterns.py`** (2 spots) — expected titles computed by calling the same `resolve_title()` the production path calls; a bug there changes both sides identically. Would need hand-computed expected strings to close. - -> **Recommendation:** add `--ignore=document_classifier --ignore=functional_tests` to `addopts` in `pytest.ini` (or rename the Selenium script off the `test_*.py` glob) so a plain `pytest` in the container behaves like CI instead of aborting on collection errors. diff --git a/docs/architecture-decisions/testing_strategy.md b/docs/architecture-decisions/testing_strategy.md index 3d6c0298..465f8998 100644 --- a/docs/architecture-decisions/testing_strategy.md +++ b/docs/architecture-decisions/testing_strategy.md @@ -1,184 +1,153 @@ ## Overview -As of early 2025, we have only recently been writing tests for new features, and have about 250 tests in total, mostly centered around the EJ portal, the reindexing process, and pattern applications. - -Although this covers much of the core system logic, there still remain a number of untested logical areas such as the config file generation, core project settings, frontend features, etc. - -This document outlines a testing strategy for the project, which will guide us towards adding tests in the most critical areas first, followed by a plan to fully cover the remaining areas. - -## Current Coverage -Using the coverage library, the following report was generated: -Name | Stmts | Miss | Cover | Missing -----------|--------------------------------------------------------------------------------------------------|-------|--------|-------- -config/__init__.py | 2 | 0 | 100% | -config/celery_app.py | 6 | 0 | 100% | -config/settings/__init__.py | 0 | 0 | 100% | -config/settings/base.py | 94 | 0 | 100% | -config/settings/local.py | 20 | 20 | 0% | 1-65 -config/settings/production.py | 48 | 48 | 0% | 1-162 -config/urls.py | 14 | 4 | 71% | 26-47 -config/wsgi.py | 8 | 8 | 0% | 17-36 -config_generation/__init__.py | 0 | 0 | 100% | -config_generation/api.py | 34 | 34 | 0% | 1-88 -config_generation/config_example.py | 15 | 15 | 0% | 1-69 -config_generation/db_to_xml.py | 203 | 133 | 34% | 45, 47, 50, 96, 119-125, 129-136, 142-149, 197-200, 206-214, 225-230, 242-271, 274-278, 285-292, 303-308, 311, 317, 326-332, 342-349, 361-368, 371-374, 377-378, 382-390, 393-399, 402-412, 415-429 -config_generation/db_to_xml_file_based.py | 52 | 52 | 0% | 4-119 -config_generation/delete_config_folders.py | 24 | 24 | 0% | 9-50 -config_generation/delete_server_content.py | 12 | 12 | 0% | 3-25 -config_generation/delete_webapp_collections.py | 5 | 5 | 0% | 6-12 -config_generation/export_collections.py | 36 | 36 | 0% | 1-73 -config_generation/export_whole_index.py | 28 | 28 | 0% | 1-58 -config_generation/generate_collection_list.py | 29 | 29 | 0% | 8-69 -config_generation/generate_commands.py | 41 | 41 | 0% | 6-87 -config_generation/generate_emac_indexer.py | 24 | 24 | 0% | 1-81 -config_generation/generate_jobs.py | 42 | 42 | 0% | 8-100 -config_generation/generate_scrapers.py | 15 | 15 | 0% | 2-54 -config_generation/minimum_api.py | 33 | 33 | 0% | 1-81 -config_generation/preprocess_sources.py | 25 | 25 | 0% | 1-50 -config_generation/sources_to_scrape.py | 28 | 28 | 0% | 2-1631 -docs/__init__.py | 0 | 0 | 100% | -docs/conf.py | 17 | 17 | 0% | 13-62 -environmental_justice/__init__.py | 0 | 0 | 100% | -environmental_justice/admin.py | 5 | 0 | 100% | -environmental_justice/apps.py | 4 | 0 | 100% | -environmental_justice/models.py | 29 | 1 | 97% | 44 -environmental_justice/serializers.py | 6 | 0 | 100% | -environmental_justice/views.py | 23 | 0 | 100% | -feedback/__init__.py | 0 | 0 | 100% | -feedback/admin.py | 14 | 0 | 100% | -feedback/apps.py | 4 | 0 | 100% | -feedback/models.py | 42 | 15 | 64% | 20-29, 35-44, 61-63 -feedback/serializers.py | 10 | 0 | 100% | -feedback/urls.py | 4 | 0 | 100% | -feedback/views.py | 9 | 0 | 100% | -manage.py | 16 | 16 | 0% | 2-31 -merge_production_dotenvs_in_dotenv.py | 15 | 1 | 93% | 26 -scripts/ej/cmr_processing.py | 241 | 5 | 98% | 160, 186-188, 397, 410 -scripts/ej/config.py | 6 | 0 | 100% | -scripts/ej/test_cmr_processing.py | 225 | 1 | 99% | 610 -scripts/ej/test_threshold_processing.py | 97 | 1 | 99% | 209 -scripts/ej/threshold_processing.py | 20 | 0 | 100% | -sde_collections/__init__.py | 0 | 0 | 100% | -sde_collections/admin.py | 212 | 72 | 66% | 22-24, 29, 34, 40-60, 65-81, 86-89, 98-101, 110-112, 120-134, 143, 148, 153, 158, 163, 168, 173, 178-189, 196-197, 260, 265, 270, 275, 302-303, 308-309, 314-316, 345-372, 478-480 -sde_collections/apps.py | 4 | 0 | 100% | -sde_collections/forms.py | 15 | 0 | 100% | -sde_collections/management/commands/database_backup.py | 62 | 1 | 98% | 68 -sde_collections/management/commands/database_restore.py | 83 | 8 | 90% | 34, 36, 87-89, 142-145 -sde_collections/models/__init__.py | 0 | 0 | 100% | -sde_collections/models/candidate_url.py | 89 | 16 | 82% | 124, 128-134, 138-142, 145, 176-177 -sde_collections/models/collection.py | 414 | 144 | 65% | 241, 269, 277-287, 291-301, 305-315, 319-344, 348-357, 361, 365, 369-376, 380-387, 394, 403-406, 419, 436-439, 449-470, 478, 482-515, 519, 523, 527, 531-532, 536, 540-546, 550-553, 558-567, 575-617, 640, 679, 689, 703, 707-732, 765, 769-777, 785 -sde_collections/models/collection_choice_fields.py | 138 | 20 | 86% | 14-17, 36-39, 56-59, 74-77, 168-171 -sde_collections/models/delta_patterns.py | 313 | 33 | 89% | 119, 123, 139, 226-227, 263, 267, 291, 382-389, 439-449, 498, 503-506, 592, 627-641 -sde_collections/models/delta_url.py | 81 | 19 | 77% | 117-125, 129-135, 139-143, 146 -sde_collections/models/pattern.py | 145 | 79 | 46% | 40-48, 56-63, 66, 69, 73-74, 78-79, 87, 94-96, 105, 117-119, 128, 139-151, 163-205, 208-212, 215-216, 230-233, 243, 257-260, 268 -sde_collections/serializers.py | 191 | 47 | 75% | 80-81, 84-85, 88-89, 92-93, 129-130, 133-134, 137-138, 141-142, 197, 201, 211-214, 244-247, 257-260, 271, 274, 307-315, 335-343, 358-366 -sde_collections/sinequa_api.py | 102 | 3 | 97% | 65, 255, 289 -sde_collections/tasks.py | 119 | 67 | 44% | 25-67, 72-108, 113-117, 122-125, 130-148, 153-155, 215-216 -sde_collections/urls.py | 17 | 0 | 100% | -sde_collections/utils/__init__.py | 0 | 0 | 100% | -sde_collections/utils/bulk_github_push.py | 8 | 8 | 0% | 7-22 -sde_collections/utils/generate_deployment_message.py | 8 | 8 | 0% | 1-24 -sde_collections/utils/github_helper.py | 115 | 93 | 19% | 12-18, 30-42, 49-52, 60-68, 81-96, 104-110, 119-123, 127-129, 132-142, 145-152, 155-172, 175, 178-185, 189-192, 196-224, 227 -sde_collections/utils/health_check.py | 123 | 106 | 14% | 33-46, 51-57, 61-98, 102-143, 155-165, 172-187, 191-273 -sde_collections/utils/paired_field_descriptor.py | 33 | 2 | 94% | 35, 52 -sde_collections/utils/slack_utils.py | 19 | 4 | 79% | 57-58, 66-67 -sde_collections/utils/title_resolver.py | 90 | 5 | 94% | 64, 75, 83, 85, 92 -sde_collections/views.py | 368 | 229 | 38% | 70, 82-89, 102-141, 144-187, 194, 208-212, 215-223, 226-237, 246, 249-251, 256-265, 273-277, 280-306, 309-315, 323-327, 330-336, 339-345, 353-355, 358-368, 410, 413-422, 430, 433-442, 450, 458, 461-475, 483, 486-490, 505-511, 523-530, 538-566, 577-583, 586-607, 610-613, 628-634 -sde_indexing_helper/__init__.py | 2 | 0 | 100% | -sde_indexing_helper/conftest.py | 9 | 0 | 100% | -sde_indexing_helper/contrib/__init__.py | 0 | 0 | 100% | -sde_indexing_helper/contrib/sites/__init__.py | 0 | 0 | 100% | -sde_indexing_helper/users/__init__.py | 0 | 0 | 100% | -sde_indexing_helper/users/adapters.py | 11 | 11 | 0% | 1-16 -sde_indexing_helper/users/admin.py | 13 | 0 | 100% | -sde_indexing_helper/users/apps.py | 10 | 0 | 100% | -sde_indexing_helper/users/context_processors.py | 3 | 0 | 100% | -sde_indexing_helper/users/forms.py | 15 | 0 | 100% | -sde_indexing_helper/users/models.py | 10 | 0 | 100% | -sde_indexing_helper/users/tasks.py | 6 | 0 | 100% | -sde_indexing_helper/users/urls.py | 4 | 0 | 100% | -sde_indexing_helper/users/views.py | 27 | 0 | 100% | -sde_indexing_helper/utils/__init__.py | 0 | 0 | 100% | -sde_indexing_helper/utils/exceptions.py | 7 | 0 | 100% | -sde_indexing_helper/utils/storages.py | 7 | 7 | 0% | 1-11 -tests/test_merge_production_dotenvs_in_dotenv.py | 13 | 0 | 100 |% +COSMOS's tests grew up around the EJ portal, the URL lifecycle, and the pattern system — the parts +of the app that were always ours. The rewiring changed what sits at the edges: scraping is now +COSMOS → SSM → the crawl4ai crawler on EC2 → S3 → `DumpUrl`s, and indexing is now COSMOS → an S3 +export → `sts:AssumeRole` → `ecs:RunTask` → the WEB_COSMOS indexer, whose result COSMOS reads back +out of S3. Both of those halves were built with tests beside them. + +This document records where testing effort belongs and why, so that new tests land where a +regression is expensive rather than where code happens to be easy to exercise. It is deliberately +qualitative: the coverage numbers are produced by CI on every pull request, and a table pasted in +here goes stale the day after it is written. + +## How the suite runs +- `pytest.ini` pins `--ds=config.settings.test --reuse-db`; everything runs against + `config/settings/test.py`. +- CI (`.github/workflows/run_full_test_suite.yml`) triggers on pull requests to `dev`, builds the + `local.yml` stack, runs `bash ./init.sh`, then `coverage report`. +- `init.sh` runs each `test_*.py` file as its own pytest process under `coverage run --append`, + excluding `document_classifier/` and `functional_tests/`. To see current coverage locally: + `docker-compose -f local.yml run --rm django bash ./init.sh` followed by + `docker-compose -f local.yml run --rm django coverage report`. + +Two properties of the test settings are load-bearing and must survive any refactor of them: + +- `CELERY_BROKER_URL` is forced to `memory://` (both the setting and the environment variable). + Without it, any test that changes a workflow status would publish a real message to the same + Redis the local `celeryworker` consumes, and that worker would run the task against the *local* + database. +- Every pipeline setting (`SDE_S3_BUCKET`, `CRAWLER_INSTANCE_ID`, `SDE_INDEX_BUCKET`, `INDEXING_*`, + `SCRAPE_POLL_ENABLED`, `INDEX_POLL_ENABLED`, `INFERENCE_ENABLED`) defaults to blank/off, so a test + that forgets to mock is pointed at no real bucket, instance, or cluster. Tests that need those + values supply them with `override_settings`. + +## Where the tests live +| Location | What it covers | +|---|---| +| `sde_collections/tests/` | The bulk of the suite: scrape dispatch and ingest, the indexing hand-off, workflow-status triggers, the URL lifecycle, the pattern system, the inference flag, AWS session selection, the URL APIs, the backup/restore commands. | +| `sde_collections/tests/frontend/` | Selenium tests (auth, homepage features, pattern application). They `pytest.fail` unless `chromedriver` and `chromium` are on `PATH`. | +| `inference/tests/` | The classification pipeline, which is dormant (`INFERENCE_ENABLED` defaults to `False`) but not deleted. Its unit tests still run; `test_inference_integration.py` skips itself unless a live inference API is reachable. | +| `environmental_justice/tests/`, `sde_indexing_helper/users/tests/`, `scripts/ej/`, `tests/` | The EJ API, the user app, the EJ CMR/threshold processing scripts, and the dotenv merge helper. | +| `document_classifier/`, `functional_tests/` | Excluded from `init.sh` and from CI. `functional_tests/test_check_collection.py` is a Sinequa-era Selenium script pointed at the retired `sciencediscoveryengine.*` endpoints; it no longer describes anything the system does. | ## Critical Areas -### Config Generation -- config_generation/db_to_xml.py - - update_or_add_element_value() - - _update_config_xml() - - convert_template_to_scraper() - - add_document_type() - - add_url_exclude() - - add_title_mapping() - - add_job_list_item() - - get_tag_value() - - fetch_treeroot() - - fetch_document_type() -- config_generation/generate_jobs.py - - make_all_parallel_jobs() - -### Models - - environmental_justice/models.py - - sde_collections/models/collection.py - - clear_delta_urls() - - clear_dump_urls() - - refresh_url_lists_for_all_patterns () - - migrate_dump_to_delta () - - create_or_update_delta_url - - promote_to_curate - - add_to_public_query() - - create_scraper_config() - - create_indexer_config() - - create_plugin_config() - - _write_to_github() - - update_config_xml() - - apply_all_patterns() - - handle_workflow_status_change() - - sde_collections/models/collection_choice_fields.py - - sde_collections/models/delta_patterns.py - - sde_collections/models/delta_url.py - - sde_collections/models/pattern.py - - sde_indexing_helper/users/models.py - -### Views - - environmental_justice/views.py - - sde_collections/views.py - - sde_indexing_helper/users/views.py - -### Serializers and APIs - - environmental_justice/serializers.py - - sde_collections/serializers.py - -### Admin Interface - - environmental_justice/admin.py - - sde_collections/admin.py - - fetch_full_text_lrm_dev_action() - - fetch_full_text_xli_action() - - sde_indexing_helper/users/admin.py - -### Utilities and Helpers - - sde_collections/utils/github_helper.py - - sde_collections/utils/health_check.py - - sde_collections/utils/title_resolver.py - - sde_collections/utils/github_helper.py - - fetch_metadata() - - _get_contents_from_path() - -### Task Automation and Background Jobs - - sde_collections/tasks.py - -### Key Operational Pipelines in the Repository -The selection of critical areas for testing is guided by the following pipelines of the repository: -1. Sinequa config files are generated -2. COSMOS imports data from LRM Dev -3. Imported data is processed -4. Curators update URL metadata -5. Sinequa reads results from the COSMOS APIs - -### Critical Areas Lacking Tests -- **Config Generation**: Config generation files are under-tested. Develop unit tests for all critical functions in the config_generation files. -- **Project Settings**: Environment-specific configurations (`local.py`, `production.py`) have no tests. -- **Frontend Features**: Currently, there are no tests covering frontend logic and interactions. -- **Utilities and Helpers**: Essential utility modules like github_helper.py and health_check.py lack tests +### Scraping: dispatch and ingest +This is a contract with another repository, expressed in shell commands and S3 key names — the +class of thing that breaks silently. Cover, at minimum: + +- `sde_collections/scraping/job_builder.py` — `build_job_json()`: which override fields are emitted + (`None` is skipped, `False` is not), and the `MAX_PAGES_CAP` refusal. +- `sde_collections/scraping/ssm_dispatch.py` — `send_job_to_crawler()`: the exact command sent, the + `.tmp` + `mv` atomic delivery, shell quoting of hostile seed URLs, and the SSM comment limit. +- `sde_collections/scraping/s3_results.py` — the key layout, missing-key codes meaning "not + finished" rather than an error, and `results_ready()` rejecting a summary older than the latest + `ScrapeDispatch` (without which a re-dispatch would instantly "complete" against the previous + run's output). +- `sde_collections/tasks.py` — `dispatch_scrape_job()` (failure lands on **Scraping Failed** and + never raises), `poll_scrape_jobs()` (which statuses are scanned, the stall timeout), and + `ingest_scraped_collection()` (the compare-and-swap claim, zero documents counting as a failure, + replay idempotence, and failure after a claim not stranding the collection). + +### Indexing hand-off +The export layout is fixed by the indexer and cannot be renegotiated in a patch release, so its +shape belongs in tests: + +- `sde_collections/indexing/export.py` — manifest written **last**, `document_count` exactly + matching the JSONL line count, excluded URLs absent, title/label resolution, and the refusal to + export with a blank bucket. +- `sde_collections/indexing/dispatch.py` — the settings guard, role assumption, the full command + override (the image has no entrypoint, so the executable must be restated), and `RunTask` + failures surfacing as errors. +- `sde_collections/indexing/run_status.py` — status/validation reads under the `run_id` prefix, and + a missing `status.json` meaning "in flight". +- `sde_collections/tasks.py` — `index_collection_to_test()` / `index_collection_to_prod()` and + `poll_index_runs()`: the `IndexDispatch` record, the in-flight and failed statuses, prod success + mirroring the QC status the run entered with, unknown states counting as failure, and an old + run's status never resolving a newer dispatch. + +### Workflow status machine +`sde_collections/models/collection.py` is where the pipeline is actually wired: which status change +promotes, which enqueues an index run, the re-entrancy guard, the Slack notification (whose failure +must not break the save), and `WorkflowHistory` rows. Every status and reindexing status must +resolve to a button colour — an unmapped status silently rendering neutral is a real defect class. +The complementary assertion is negative: no removed Sinequa method may reappear on a transition. + +### URL lifecycle +`DumpUrl → DeltaUrl → CuratedUrl` is the core data model, described in +`sde_collections/models/README_LIFECYCLE.md`: + +- `Collection.migrate_dump_to_delta()` and `create_or_update_delta_url()` — the diff, including + deletion markers and `DELTA_COMPARISON_FIELDS`. +- `Collection.promote_to_curated()` — updates, deletions, metadata changes, repeated promotions, + and patterns re-applied afterwards. +- `sde_collections/models/delta_url.py`, `candidate_url.py`. + +### Pattern system +`sde_collections/models/delta_patterns.py` and `pattern.py` carry the most intricate logic in the +repo: apply and unapply for exclude, include, title, document type, division and other field +modifiers, plus specificity resolution when patterns overlap. This area is comparatively well +covered; keep it that way, and add a test for every reported mis-application rather than for the +fix alone. + +### Inference gating +The classification pipeline is disabled, not removed. What must stay tested is the gate itself: +`queue_necessary_classifications()` short-circuiting straight to migration when +`INFERENCE_ENABLED` is `False`, and `inference/signals.py` re-asserting `enabled` on its beat rows +from the flag on every `post_migrate` — the flag, not a hand-edit in the admin, is the source of +truth. Tests here should call the real method and patch only the queued task's `.delay`; patching +the method wholesale would guard nothing. + +### AWS session boundary +`sde_collections/utils/aws.py::get_boto3_session()` decides between explicit `SDE_AWS_*` keys (local +dev) and the default credential chain (instance role in AWS), and deliberately ignores the +`DJANGO_AWS_*` static-assets credentials. Partial keys must fall back rather than half-configure. + +### APIs, serializers, and the UI +`sde_collections/views.py` and `sde_collections/serializers.py` back the curation UI and the +DataTables endpoints. The list APIs keyed by `config_folder` are covered; the viewsets, the bulk +create path, and `CollectionDetailView.post` are thinner. + +### Operational surfaces +`sde_collections/management/commands/` (backup/restore are covered; the pipeline commands are not), +`sde_collections/admin.py` actions, and `sde_collections/utils/slack_utils.py` message formatting. + +## Critical Areas Lacking Tests +- **Beat-row creation for the pollers** — `sde_collections/signals.py` creates the `poll_scrape_jobs` + and `poll_index_runs` schedules on `post_migrate` and re-asserts `enabled` from + `SCRAPE_POLL_ENABLED` / `INDEX_POLL_ENABLED`. The equivalent handler in `inference/signals.py` is + tested; this one is not. +- **Pipeline management commands** — `dispatch_scrape`, `ingest_scrape_results`, + `migrate_urls_and_patterns`, `deduplicate_patterns`, `deduplicate_urls`, `export_urls_to_csv`, + `sync_with_production_webapp`. +- **Admin actions** — the CSV export, the exclude/include pattern actions, and the read-only + guarantees on the `ScrapeDispatch` / `IndexDispatch` admins. +- **Slack message construction** — `send_detailed_import_notification()` and + `send_indexing_validation_report()` are exercised only as patched call sites; the message bodies + themselves are untested. +- **Views and serializers** beyond the URL list APIs. +- **Project settings** — `config/settings/local.py` and `production.py` have no tests. +- **Frontend** — the Selenium suite covers auth, the homepage, and pattern application; the rest of + the curation UI is unverified, and the suite is skipped wherever Chromium is absent. + +## Conventions for new pipeline tests +- Mock at the seam, not at AWS: patch `get_boto3_session` *in the module under test* + (`sde_collections.indexing.export.get_boto3_session`, `…scraping.s3_results._get_object`), or the + task-module alias of a helper (`sde_collections.tasks.fetch_run_status`). Patching + `boto3` globally hides which client a module actually asks for. +- Drive the pipeline settings with `override_settings`; never rely on a developer's `.envs`. +- Patch `.delay` when a test changes a workflow status, unless the enqueue *is* what is being + asserted. +- Assert on the request that would have gone out — the SSM command text, the S3 key, the `RunTask` + overrides — rather than on the mock having been called. These are cross-repo contracts, and the + arguments are the contract. diff --git a/docs/howto.rst b/docs/howto.rst index fd6a13a7..183f9775 100644 --- a/docs/howto.rst +++ b/docs/howto.rst @@ -4,7 +4,7 @@ How To - Project Documentation Get Started ---------------------------------------------------------------------- -Documentation can be written as rst files in `sde_indexing_helper/docs`. +Documentation can be written as rst files in `docs/`. To build and serve docs, use the commands:: diff --git a/docs/index.rst b/docs/index.rst index 0e94e197..9405d095 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -1,20 +1,20 @@ -.. SDE Indexing Helper documentation master file, created by +.. COSMOS documentation master file, created by sphinx-quickstart. You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. -Welcome to SDE Indexing Helper's documentation! +Welcome to COSMOS's documentation! ====================================================================== .. toctree:: :maxdepth: 2 - :caption: Working with Sinequa: + :caption: Project Documentation: howto .. toctree:: :maxdepth: 2 - :caption: Using the Indexing Helper: + :caption: Using COSMOS: documentation/indexing_guidelines diff --git a/inference/inference_pipeline_queue.md b/inference/inference_pipeline_queue.md index d1c39a34..bea7f3e6 100644 --- a/inference/inference_pipeline_queue.md +++ b/inference/inference_pipeline_queue.md @@ -1,7 +1,19 @@ # COSMOS Inference Pipeline +> **DORMANT — the inference pipeline is disabled, not deleted.** +> As of Phase 2 the entire pipeline is gated on the `INFERENCE_ENABLED` setting +> (`config/settings/base.py`), which defaults to `False`. While the flag is off: +> - `Collection.queue_necessary_classifications()` never creates an `InferenceJob`; it +> goes straight to `migrate_dump_to_delta_and_handle_status_transistions`. +> - `process_inference_job_queue()` returns immediately without touching the queue. +> - The two `PeriodicTask` beat rows created in `inference/signals.py` are written with +> `enabled=settings.INFERENCE_ENABLED`, so beat never fires them. +> +> The models, tasks, and API client all remain in the tree. Everything below describes +> how the pipeline behaves **when `INFERENCE_ENABLED` is turned back on**. + ## Overview -The server runs both the COSMOS curation app and an ML Inference Pipeline, which can analyze and classify website content. COSMOS is process whole collections and send the full_texts of the individual urls to the Inference Pipeline for classification. Right now it supports Division Classifications and TDAMM Classifications. +The server runs both the COSMOS curation app and an ML Inference Pipeline, which can analyze and classify website content. When enabled, COSMOS processes whole collections and sends the full_texts of the individual urls to the Inference Pipeline for classification. Right now it supports Division Classifications and TDAMM Classifications. The Inference Pipeline can support multiple model versions for a single classification type. When a collection needs to be classified for certain classification and model, say "Division" and "v1", the COSMOS app will create an InferenceJob object. The InferenceJob will then create ExternalJob objects for each batch of urls in the collection. The ExternalJob objects will send the full_texts to the Inference Pipeline API, which will return a job_id. The ExternalJob will then ping the API with the job_id to get the results. Once all ExternalJobs are complete, the InferenceJob will be marked as complete. @@ -39,9 +51,12 @@ The inference pipeline uses a two-level job system: - InferenceJob is created for the collection/classification pair 2. **Chron** - - Every 5 minutes, between 6pm-7am, attempts to process_inference_job_queue() + - When enabled, every 5 minutes between 6pm-7am, attempts to process_inference_job_queue() - this could either mean batching and api sending - or it could mean reading in results from an open InferenceJob + - The beat rows are created disabled while `INFERENCE_ENABLED` is `False`, and + `process_inference_job_queue()` itself short-circuits on the same flag, so a + hand-enabled row or an ad-hoc invocation still processes nothing 3. **def process_inference_job_queue()** - Loop through all InferenceJob objects to find status=Pending diff --git a/inference/results_processing.md b/inference/results_processing.md index 4a47e412..d26ec0cd 100644 --- a/inference/results_processing.md +++ b/inference/results_processing.md @@ -1,3 +1,10 @@ +> **DORMANT — the inference pipeline is disabled, not deleted.** +> As of Phase 2 classification is gated on the `INFERENCE_ENABLED` setting +> (`config/settings/base.py`), which defaults to `False`. With the flag off, +> `Collection.queue_necessary_classifications()` skips job creation entirely and +> DumpUrls migrate straight to DeltaUrls, so no classification stage runs between them. +> The design below describes the DumpUrl classification stage **when +> `INFERENCE_ENABLED` is turned back on**. ## Classifying Collections @@ -43,7 +50,7 @@ Pros - By using the DumpUrl and the associated promotion code, we can piggy back on the DeltaUrl determination processes to handle delta generation Cons -- You have to re-pull from dev in order to classify +- You have to re-scrape the collection in order to classify - Promotion has to wait on inference server processing (this is also a pro, as Emily will never see until the processing is done) ### Dedicated Process diff --git a/rewiring_decisions.md b/rewiring_decisions.md deleted file mode 100644 index ea7d104b..00000000 --- a/rewiring_decisions.md +++ /dev/null @@ -1,25 +0,0 @@ -1. Disable the inference pipeline \- path of least resistance \- we don’t want to delete functionality -2. Look at api indexing pipeline for context on how to start indexing and/ use same resources to start indexing web content -3. Dhanurs Django/COSMOS cheat commands - 1. **Run:** - 2. docker-compose \-f local.yml build - 3. docker-compose \-f local.yml up - - 5. **Docker shell:** - 6. docker-compose \-f local.yml run \--rm django python manage.py shell\_plus - - - - 7. **Migrations:** - 8. docker-compose \-f local.yml run \--rm django python manage.py makemigrations - 9. docker-compose \-f local.yml run \--rm django python manage.py makemigrations \--merge - 10. docker-compose \-f local.yml run \--rm django python manage.py migrate - 12. docker-compose \-f local.yml logs \-f celeryworker - 13. docker-compose \-f local.yml logs \-f celerybeat - - - -Use scraper repo also as context \- ssm the .json file - -4. Remove references to XML config generation for sinequa -5. Provide context of how sinequa is replaced with this new backend, purpose of this integration included diff --git a/scripts/ej/README.md b/scripts/ej/README.md index eb74c490..fee33db4 100644 --- a/scripts/ej/README.md +++ b/scripts/ej/README.md @@ -70,7 +70,7 @@ The pipeline generates a JSON file named `ej_dump_YYYYMMDD_HHMMSS.json` containi To deploy the output to the server: ```bash # Copy to server -scp ej_dump_YYYYMMDD_HHMMSS.json sde:/home/ec2-user/sde_indexing_helper/backups/ +scp ej_dump_YYYYMMDD_HHMMSS.json sde:/home/ec2-user/sde-indexing-helper/backups/ # Process on server using dm shell dmshell diff --git a/sde_collections/DEPLOYMENT.md b/sde_collections/DEPLOYMENT.md index 0f824acc..4923c8d3 100644 --- a/sde_collections/DEPLOYMENT.md +++ b/sde_collections/DEPLOYMENT.md @@ -1,12 +1,11 @@ -# COSMOS CI/CD — Design +# COSMOS Deployment and CI/CD -> Companion to [WORKFLOW.md](../WORKFLOW.md) (the curation pipeline) and -> [IMPLEMENTATION_PLAN.md](../IMPLEMENTATION_PLAN.md) (phased delivery, where this is Phase 9). +> Companion to [WORKFLOW.md](../WORKFLOW.md) (the curation pipeline). > Database backup and restore are covered in [SQLDumpRestoration.md](../SQLDumpRestoration.md). -**This document is a design, not a runbook.** Nothing described under "Proposed pipeline" exists -in the repo. Deploys today are manual. Current state is recorded below and was verified against the -tree on 2026-08-11 — keep the two sections distinct as the design lands. +**Deploys are manual today.** Everything under "Current state" describes the repo as it actually +is; everything under "Proposed pipeline" is a target that does **not** exist yet — there is no +deploy script and no deployment workflow in `.github/workflows/`. Keep the two sections distinct. --- @@ -22,8 +21,8 @@ tree on 2026-08-11 — keep the two sections distinct as the design lands. | Pre-commit | `.pre-commit-config.yaml` with black, isort, flake8, pyupgrade, bandit, mypy (excluded), and gitleaks. `pre-commit.ci` is enabled with weekly autoupdate. | | Compose stacks | `local.yml` and `production.yml`. Four services share the Django image: `django`, `celeryworker`, `celerybeat`, `flower`. `production.yml` adds `traefik`, `postgres`, `awscli`. | | Backup tooling | `manage.py database_backup` and `manage.py database_restore` exist in `sde_collections/management/commands/`. | -| Beat schedules | No `CELERY_BEAT_SCHEDULE` setting anywhere. All schedules are `django_celery_beat` **database rows**, written by a `post_migrate` receiver — today only `inference/signals.py`. | -| Credentials in code | AWS access is via static keys (`DJANGO_AWS_ACCESS_KEY_ID` / `DJANGO_AWS_SECRET_ACCESS_KEY`), not instance roles. Env files (`.envs/.production/.django`) are maintained by hand on each host. | +| Beat schedules | No `CELERY_BEAT_SCHEDULE` setting anywhere. All schedules are `django_celery_beat` **database rows**, written by `post_migrate` receivers in `inference/signals.py` and `sde_collections/signals.py`. The latter writes "Poll crawler S3 results (every 5 min)" and "Poll index runs (every 2 min)", each enabled from `SCRAPE_POLL_ENABLED` / `INDEX_POLL_ENABLED`. Because `enabled` is re-asserted at migrate time, **changing one of those flags requires `manage.py migrate`** — restarting the services alone does nothing. | +| Credentials | Two separate scopes. django-storages static assets use static keys (`DJANGO_AWS_ACCESS_KEY_ID` / `DJANGO_AWS_SECRET_ACCESS_KEY`). The pipeline uses `sde_collections/utils/aws.py::get_boto3_session()`, which deliberately does *not* read those: it prefers `SDE_AWS_*` if set and otherwise falls through to the default chain (the host's instance role). Dispatching an index run additionally requires `sts:AssumeRole` on the indexer's dispatch role. Env files (`.envs/.production/.django`) are maintained by hand on each host. | | Health endpoint | **None.** There is no `/healthz` or equivalent. | ### Two defects worth fixing regardless of CI/CD @@ -52,10 +51,13 @@ Three reasons, in order of weight: task that deletes and rebuilds a collection's `DumpUrl` rows. A bad deploy stops being a broken UI and becomes unwanted writes to shared infrastructure. -> The indexing pipeline (writes to the `sde-web` OpenSearch index) is **deferred** and likely lands -> in a separate repo. When it arrives, add its endpoints to `validate_deploy_env` and its -> reachability to `preflight_aws` — the hooks below are shaped to accept it, but do not write -> checks for machinery that is not here. +> The indexing hand-off now exists. COSMOS exports curated URLs to S3, assumes an IAM role in the +> indexer's account, and calls `ecs:RunTask`; the indexer writes to OpenSearch. The settings that +> gate it — `SDE_INDEX_BUCKET`, `INDEXING_ECS_CLUSTER`, `INDEXING_TASK_FAMILY`, +> `INDEXING_DISPATCH_ROLE_ARN`, `INDEXING_SUBNETS`, `INDEXING_SECURITY_GROUPS`, `INDEX_POLL_ENABLED` +> — all default blank or off, so a host that has not been wired cannot dispatch. `validate_deploy_env` +> and `preflight_aws` should cover them: the bucket's reachability and the `sts:AssumeRole` grant on +> the dispatch role. --- @@ -159,7 +161,8 @@ introducing it must say so, and rollback for that release becomes restore-from-b The **deploy role** needs `ecr:*` on the repository plus `ssm:SendCommand` and `ssm:GetCommandInvocation` scoped to the two instances. The **hosts' own roles** need whatever the -curation pipeline uses — initially SSM to the crawler instance and S3 read on the crawler bucket. +curation pipeline uses: SSM to the crawler instance, S3 read on the crawler bucket, read/write on +the indexing bucket (`SDE_INDEX_BUCKET`), and `sts:AssumeRole` on the indexer's dispatch role. Verify before flipping `CD_ENABLED`: diff --git a/sde_collections/models/README.md b/sde_collections/models/README.md index 3c326f6a..97502fc4 100644 --- a/sde_collections/models/README.md +++ b/sde_collections/models/README.md @@ -13,3 +13,9 @@ A system for managing collections of URLs through pattern-based rules and status - [Pattern Unapplication Logic](./README_UNAPPLY_LOGIC.md) - [Collection Status Workflows](./README_STATUS_TRIGGERS.md) - Collection progression and automated triggers - [Reindexing Status System](./README_REINDEXING_STATUSES.md) - Status management for reindexing collections + +## Scraping and Indexing Models + +- [`ScraperConfigOverride`](./scraper_config.py) - Per-collection overrides (`max_pages`, `depth_limit`, `delay`, `concurrent_requests`, `obey_robots`, `include_subdomains`) merged onto the crawler's own defaults. All fields are nullable; only non-null values reach the job JSON. +- [`ScrapeDispatch`](./scraper_config.py) - One row per SSM scrape dispatch, recording `ssm_command_id` and `dispatched_at`. `dispatched_at` is the poller's freshness reference (older S3 results belong to a previous run) and the stall-timeout start time. +- [`IndexDispatch`](./indexing.py) - One row per indexing run, recording `collection`, `run_id`, `target` (test or prod), `task_arn`, `previous_workflow_status`, and `dispatched_at`, plus `completed_at` once the poller resolves the run. diff --git a/sde_collections/models/README_LIFECYCLE.md b/sde_collections/models/README_LIFECYCLE.md index 8b9a8cd2..fcbb26d2 100644 --- a/sde_collections/models/README_LIFECYCLE.md +++ b/sde_collections/models/README_LIFECYCLE.md @@ -32,29 +32,36 @@ The classification process analyzes content to automatically add metadata, inclu - TDAMM tags for Astrophysics content - Division classification for General content +Classification is optional and is gated on the `INFERENCE_ENABLED` setting, which +defaults to `False`. The inference pipeline is currently dormant, so in the default +configuration no classification stage runs at all. + ### When Classification Happens -Classification occurs after DumpUrls are created but before they are migrated to DeltaUrls: +Classification, when enabled, occurs after DumpUrls are created but before they are migrated to DeltaUrls: 1. DumpUrls are created from scraped content -2. Classification models analyze DumpUrl content -3. Classification results are applied to DumpUrls -4. DumpUrls (with enhanced metadata) are migrated to DeltaUrls +2. `Collection.queue_necessary_classifications()` is called +3. If `INFERENCE_ENABLED` is `False`, migration is queued immediately and steps 4–6 are skipped +4. Classification models analyze DumpUrl content +5. Classification results are applied to DumpUrls +6. DumpUrls (with enhanced metadata) are migrated to DeltaUrls ### Classification Types - **TDAMM Classification**: Applied to Astrophysics collections to tag content related to multi-messenger astronomy - **Division Classification**: Applied to General collections to suggest appropriate divisions ### Classification Flow -1. Check if collection needs classification based on division type -2. Queue appropriate classification jobs -3. Process classifications asynchronously -4. Apply classification results to DumpUrls -5. Initiate migration to DeltaUrls once all classifications complete +1. If `INFERENCE_ENABLED` is `False`, immediately queue `migrate_dump_to_delta_and_handle_status_transistions` and stop +2. Check if collection needs classification based on its configuration +3. Queue appropriate classification jobs; collections needing none go straight to migration +4. Process classifications asynchronously +5. Apply classification results to DumpUrls +6. Initiate migration to DeltaUrls once all classifications complete ## Pattern Application ### When Patterns Are Applied Patterns are applied in two scenarios: -1. During migration from Dump to Delta (after classifications are complete) +1. During migration from Dump to Delta (after classifications are complete, if any ran) 2. When a new pattern is created/updated Patterns are NOT applied during promotion. The effects of patterns (modified titles, document types, etc.) are carried through to CuratedUrls during promotion, but the patterns themselves don't reapply. @@ -69,7 +76,7 @@ Patterns are NOT applied during promotion. The effects of patterns (modified tit ### Overview Migration converts DumpUrls to DeltaUrls, preserving all fields and applying patterns. This process happens when: -- New content is scraped and classified +- New content is scraped (and classified, if `INFERENCE_ENABLED` is on) - Content is reindexed - Collection is being prepared for curation @@ -268,9 +275,10 @@ curated_url = CuratedUrl( - Pattern-set values take precedence over original values ### Classification Behavior +- Classifications only run when `INFERENCE_ENABLED` is on; with the flag off (the default) migration runs immediately after the DumpUrls are created - Classifications only run on DumpUrls before migration to DeltaUrls - Classification results become regular field values and persist through promotion -- Migration to DeltaUrls waits for all classifications to complete +- When classifications are queued, migration to DeltaUrls waits for all of them to complete ### Pattern Behavior - Patterns only apply during migration or when patterns themselves are created/updated diff --git a/sde_collections/models/README_MANUAL_TESTING.md b/sde_collections/models/README_MANUAL_TESTING.md index 2be75f50..f35d2a7b 100644 --- a/sde_collections/models/README_MANUAL_TESTING.md +++ b/sde_collections/models/README_MANUAL_TESTING.md @@ -1,166 +1,217 @@ # COSMOS Curation System Testing Guide -## Resources -There are 14 collections which have been reindexed on dev and can have their statuses changed to `REINDEXING_FINISHED` to test url importing. The collections and their counts can be seen [here](https://docs.google.com/spreadsheets/d/1z_YeTwsyadW6ywPsahUElnf8X65gP7t7UyaO7sVqGiI/edit?gid=1316450061#gid=1316450061). +Manual acceptance tests for the curation pipeline. This is the curator-facing counterpart to +[`LOCAL_VERIFICATION_GUIDE.md`](../../LOCAL_VERIFICATION_GUIDE.md), which verifies a local install +from a developer's point of view. Here the question is whether the workflow behaves correctly for +the people who use it. -## Test Flow 1: Basic URL Collection Lifecycle +The pipeline these tests exercise is described in [`WORKFLOW.md`](../../WORKFLOW.md), and what each +status change triggers is in [`README_STATUS_TRIGGERS.md`](./README_STATUS_TRIGGERS.md). + +## Before you start + +Every dispatch-gating setting defaults blank or off, so on an unwired host **nothing will happen** +when you change a status and the tests below will all appear to fail. Confirm first: + +- `CRAWLER_INSTANCE_ID` and `SDE_S3_BUCKET` are set, and `SCRAPE_POLL_ENABLED=true`, for anything + involving a scrape. +- `SDE_INDEX_BUCKET`, `INDEXING_ECS_CLUSTER`, `INDEXING_TASK_FAMILY`, `INDEXING_DISPATCH_ROLE_ARN`, + `INDEXING_SUBNETS`, `INDEXING_SECURITY_GROUPS` are set, and `INDEX_POLL_ENABLED=true`, for + anything involving indexing. +- `manage.py migrate` has been run **since** those flags were last changed. The poller schedules are + `django_celery_beat` rows written by a `post_migrate` receiver, so a restart alone does not enable + them. + +Pick a small collection. Avoid one whose documents are already in the target index under a +different id scheme — the indexer refuses those deliberately, which looks like a failure but is +correct behaviour. + +## Test Flow 1: Scrape dispatch and ingest + +### Objective + +Verify a collection can be scraped and its results ingested. + +### Test Cases + +#### 1.1 Dispatch + +1. Set a collection's workflow status to **Ready for Engineering**. +2. Confirm a `ScrapeDispatch` row is created, carrying an `ssm_command_id` and `dispatched_at`. +3. Confirm the job JSON lands in the crawler's inbox. It is written via a temporary file and then + moved, so the watcher should never see a partial file. +4. Failure path: with `CRAWLER_INSTANCE_ID` unset or the instance unreachable, confirm the status + moves to **Scraping Failed** rather than hanging. +5. Cap check: request a page count above the crawler's cap (100,000) and confirm the job is + rejected outright rather than silently clamped. + +#### 1.2 Ingest + +1. Wait for the crawler to write its results. The poller runs every 5 minutes. +2. Confirm the status moves to **Scraping Successful**, then on to **Ready for Curation**. +3. Confirm `DumpUrl` rows appear, then `DeltaUrl` rows after migration. +4. Confirm a summary is posted to Slack. +5. Staleness: confirm results older than the dispatch are ignored — the poller only accepts a + summary written *after* `ScrapeDispatch.dispatched_at`. +6. Empty result: a scrape returning zero pages should land on **Scraping Failed**, not + **Scraping Successful** with an empty collection. +7. Stall: with nothing fresh for longer than `SCRAPE_STALL_TIMEOUT_HOURS` (default 24), confirm the + collection lands on **Scraping Failed**. + +Expected results: + +- Each status transition fires exactly once; re-saving a collection does not re-dispatch. +- Claiming is atomic, so two pollers running concurrently cannot double-ingest. +- With `INFERENCE_ENABLED=False` (the default) classification is skipped entirely and migration to + DeltaUrls runs immediately. + +## Test Flow 2: Curation and the test-indexing hand-off ### Objective -Verify the complete lifecycle of a URL collection from initial creation through curation to production. -### Prerequisites -- Access to dev environment -- Test collection created -- Sample URLs ready for testing +Verify curation promotes correctly and hands off to the indexer. ### Test Cases -#### 1.1 Collection Status Progression -1. Create new collection in `RESEARCH_IN_PROGRESS` status -2. Verify initial scraper and indexer configs are created when moved to `READY_FOR_ENGINEERING` -3. Progress through `ENGINEERING_IN_PROGRESS` to `INDEXING_FINISHED_ON_DEV` -4. Confirm full text fetch triggers automatically -5. Verify status updates to `READY_FOR_CURATION` -6. Check plugin config creation -7. Move through `CURATION_IN_PROGRESS` to `CURATED` -8. Verify DeltaUrls promotion to CuratedUrls -9. Test quality check status changes (`QUALITY_CHECK_PERFECT/MINOR`) -10. Confirm collection appears in public query after PR merge - -#### 1.2 Data State Transitions -1. Verify DumpUrls are created during indexing -2. Test migration from DumpUrls to DeltaUrls -3. Confirm field preservation during transitions -4. Check promotion from DeltaUrls to CuratedUrls -5. Verify all metadata transfers correctly - -Expected Results: -- Each status transition triggers appropriate automated actions -- Data integrity maintained through all transitions -- Correct config generation at each stage -- Proper public visibility after final approval - -## Test Flow 2: Pattern System Functionality +#### 2.1 Promotion and dispatch + +1. Curate the collection — apply include/exclude patterns, title and document-type changes. +2. Set the status to **Curated**. +3. Confirm `DeltaUrl`s are promoted to `CuratedUrl`s and the Delta set is cleared. +4. Confirm an export appears in S3 under `curated_collections/{config_folder}/{run_id}/`, with + `documents.jsonl` written first and `manifest.json` **last**. The manifest's `document_count` + must exactly match the JSONL line count. +5. Confirm excluded URLs are absent from the export. +6. Confirm an `IndexDispatch` row is created with a `run_id`, `target=test`, and a `task_arn`, and + that the status moves to **Test Indexing**. +7. Empty-curation failure path: a collection with no curated URLs should fail dispatch and land on + **Indexing Failed on Test** rather than exporting an empty file. + +#### 2.2 Reading the result + +1. The poller runs every 2 minutes. When the indexer finishes, confirm the collection **stays** in + **Test Indexing** — a successful test run is not an automatic promotion. +2. Confirm the validation report is posted to Slack. +3. Failure path: confirm a failed run, an unrecognised result, or no result at all within + `INDEX_STALL_TIMEOUT_HOURS` (default 6) lands on **Indexing Failed on Test**. + +## Test Flow 3: Quality check and production indexing ### Objective -Test the creation, application, and interaction of different pattern types. -### Prerequisites -- Collection with sample URLs -- Mix of different URL types and structures +Verify the QC decision drives the production hand-off. ### Test Cases -#### 2.1 Include/Exclude Patterns -1. Create exclude pattern for specific directory +1. From **Test Indexing**, set **QC: Perfect** and confirm a second indexing run is dispatched with + a new `run_id`, and the status moves to **Production Indexing**. +2. On success, confirm the status lands on **Prod: Perfect**. +3. Repeat from **QC: Minor Issues** and confirm the terminal status is **Prod: Minor Issues** — the + distinction must survive the round trip. +4. Failure path: confirm a failed production run lands on **Indexing Failed on Prod**. + +## Test Flow 4: Re-scrape and re-curation + +### Objective + +Verify an already-published collection can be refreshed. + +### Test Cases + +1. Set `reindexing_status` to **Re-Indexing Needed** and confirm a *new* `ScrapeDispatch` row is + created. +2. Confirm the poller ignores the previous scrape's S3 output until fresh results land. +3. Confirm the collection reaches **Ready for Re-Curation**. +4. Confirm patterns are reapplied to the new URLs and that manual, per-URL changes are preserved. +5. Set **Re-Curation Finished** and confirm promotion runs. Note the causality: the curator sets + this status, and that triggers promotion — not the reverse. +6. Confirm **Re-Indexing Finished** triggers nothing on its own; the ingest task sets that status + itself, and a second trigger would double-fire. + +## Test Flow 5: Pattern system + +### Objective + +Test creation, application, and interaction of pattern types. This area is independent of the +scrape/index plumbing and is unchanged by the rewiring. + +### Test Cases + +#### 5.1 Include/exclude patterns + +1. Create an exclude pattern for a directory: ```python pattern = "https://example.com/internal/*" ``` -2. Create include pattern for specific file within excluded directory +2. Create an include pattern for one file inside it: ```python pattern = "https://example.com/internal/public-doc.html" ``` -3. Verify include pattern overrides exclude pattern -4. Test wildcard pattern matching -5. Check pattern precedence rules +3. Verify the include pattern overrides the exclude. +4. Test wildcard matching and precedence rules. +5. Confirm excluded URLs do not reach the export in Test Flow 2. + +#### 5.2 Modification patterns -#### 2.2 Modification Patterns 1. Create overlapping title patterns: ```python pattern1 = "*/docs/* → title='Documentation'" pattern2 = "*/docs/api/* → title='API Reference'" ``` -2. Create division patterns with different specificity -3. Test document type patterns with wildcards -4. Verify "smallest set priority" resolution -5. Check pattern application during migrations - -#### 2.3 Pattern Removal Scenarios -1. Test removing pattern affecting only Delta URLs -2. Remove pattern affecting Curated URLs -3. Verify handling of multiple pattern effects -4. Test manual change preservation -5. Check cleanup procedures - -Expected Results: -- Pattern precedence rules correctly applied -- Proper handling of overlapping patterns -- Manual changes preserved during pattern operations -- Correct reversal of pattern effects on removal - -## Test Flow 3: Reindexing Workflow - -### Objective -Verify the reindexing process and status management. - -### Prerequisites -- Existing collection in production -- Access to both dev and prod environments - -### Test Cases - -#### 3.1 Reindexing Status Progression -1. Change status from `REINDEXING_NOT_NEEDED` to `REINDEXING_NEEDED_ON_DEV` -2. Complete reindexing and update to `REINDEXING_FINISHED_ON_DEV` -3. Verify automatic full text fetch -4. Confirm status update to `REINDEXING_READY_FOR_CURATION` -5. Progress through `REINDEXING_CURATED` -6. Final update to `REINDEXING_INDEXED_ON_PROD` - -#### 3.2 Data Handling During Reindex -1. Verify existing DumpUrls are cleared -2. Check new full text data processing -3. Test DumpUrl to DeltaUrl migration -4. Verify pattern reapplication -5. Confirm CuratedUrl updates - -Expected Results: -- Proper status progression through reindexing -- Data integrity maintained -- Patterns correctly reapplied -- Existing customizations preserved - -## Edge Cases and Stress Testing - -### URL Pattern Edge Cases -1. Test URLs with/without trailing slashes -2. Verify handling of overlapping wildcards -3. Check pattern resolution with equal URL count matches -4. Test maximum pattern chain depth -5. Verify handling of malformed URLs - -### Status Transition Edge Cases -1. Test interrupted transitions -2. Verify handling of failed automated actions -3. Check concurrent status updates -4. Test invalid status progressions -5. Verify recovery procedures - -### Data Volume Testing -1. Test with large number of URLs (>100k) -2. Check pattern application performance -3. Verify migration speed with large datasets -4. Test memory usage during bulk operations -5. Check system response under heavy concurrent access - -## Common Issues to Watch For - -1. Pattern Precedence - - Multiple patterns affecting same URL - - Include/exclude pattern conflicts - - Resolution of equal-specificity patterns - -2. Data Integrity - - Field preservation during transitions - - Manual change retention - - Pattern effect tracking - -3. Performance - - Large collection handling - - Multiple pattern application - - Status transition timing - -4. Status Management - - Automated trigger reliability - - Status update race conditions - - Recovery from failed transitions +2. Create division patterns of differing specificity. +3. Test document-type patterns with wildcards. +4. Verify "smallest set priority" resolution. +5. Check pattern application during migrations. + +#### 5.3 Pattern removal + +1. Remove a pattern affecting only Delta URLs. +2. Remove one affecting Curated URLs. +3. Verify handling where several patterns affect the same URL. +4. Confirm manual changes are preserved. + +Expected results: + +- Precedence rules are applied consistently. +- Manual changes survive pattern operations. +- Removing a pattern reverses its effects. + +## Edge cases + +### URL patterns + +1. URLs with and without trailing slashes. +2. Overlapping wildcards. +3. Equal URL-count matches. +4. Maximum pattern chain depth. +5. Malformed URLs. + +### Status transitions + +1. Interrupted transitions. +2. Failed automated actions — every failure path should reach a terminal *failed* status, never + leave the collection in an in-progress state indefinitely. +3. Concurrent status updates. +4. Invalid progressions. +5. Recovery: confirm a collection that reached **Scraping Failed** or **Indexing Failed on Test** + can be re-driven through the workflow without manual database surgery. + +### Data volume + +1. Large collections (>100k URLs). +2. Pattern application performance. +3. Migration speed on large datasets. +4. Memory use during bulk operations. + +## Common issues to watch for + +1. **Nothing happens on a status change.** Almost always an unwired setting or a missing `migrate` + — check the prerequisites above before investigating anything else. +2. **Pattern precedence.** Multiple patterns on one URL, include/exclude conflicts, equal-specificity + resolution. +3. **Data integrity.** Field preservation across Dump → Delta → Curated, retention of manual + changes, pattern effect tracking. +4. **Stale results.** The scrape poller uses dispatch time to reject old output; index runs are + namespaced by `run_id`. A collection picking up a previous run's data is a bug worth reporting + in detail. +5. **Status races.** Two workers acting on one collection, or a status change firing twice. diff --git a/sde_collections/models/README_PATTERN_SYSTEM.md b/sde_collections/models/README_PATTERN_SYSTEM.md index b8381747..a159b149 100644 --- a/sde_collections/models/README_PATTERN_SYSTEM.md +++ b/sde_collections/models/README_PATTERN_SYSTEM.md @@ -8,7 +8,7 @@ The pattern system is designed to manage and track changes to URLs in a content ### URL States - **Curated URLs**: Production-ready, approved content - **Delta URLs**: Work-in-progress changes, additions, or deletions to curated content -- **Dump URLs**: Raw content from the dev server +- **Dump URLs**: Raw content ingested from the crawl4ai scrape results in S3 ### Pattern Types 1. **Exclude Patterns**: Mark URLs for exclusion from the collection diff --git a/sde_collections/models/README_REINDEXING_STATUSES.md b/sde_collections/models/README_REINDEXING_STATUSES.md index 144a83c2..d93de96b 100644 --- a/sde_collections/models/README_REINDEXING_STATUSES.md +++ b/sde_collections/models/README_REINDEXING_STATUSES.md @@ -5,8 +5,8 @@ The typical reindexing status flow is: 1. `REINDEXING_NOT_NEEDED` ("Re-Indexing Not Needed") → Default state -2. `REINDEXING_NEEDED_ON_DEV` ("Re-Indexing Needed") → When reindexing is required -3. `REINDEXING_FINISHED_ON_DEV` ("Re-Indexing Finished") → After reindexing completes +2. `REINDEXING_NEEDED_ON_DEV` ("Re-Indexing Needed") → When a re-scrape is required +3. `REINDEXING_FINISHED_ON_DEV` ("Re-Indexing Finished") → After the scrape results are ingested 4. `REINDEXING_READY_FOR_CURATION` ("Ready for Re-Curation") → After dump URLs are migrated 5. `REINDEXING_CURATION_IN_PROGRESS` ("Re-Curation in Progress") → During active re-curation 6. `REINDEXING_CURATED` ("Re-Curation Finished") → After re-curation is complete @@ -18,21 +18,26 @@ The typical reindexing status flow is: - Default status for new collections - Applied to collections in early workflow stages (research, engineering, etc.) -### Reindexing Needed on LRM Dev +### Reindexing Needed - Variable name: `REINDEXING_NEEDED_ON_DEV` (2) -- Indicates collections that need to be reindexed on LRM Dev environment +- Indicates collections that need to be re-scraped - For collections that have already been indexed on production +- Manually set by a curator or engineer; triggers `dispatch_scrape_job`, which sends the + job to the crawl4ai host via SSM (the same dispatch/poll path as the initial workflow) -### Reindexing Finished on LRM Dev +### Reindexing Finished - Variable name: `REINDEXING_FINISHED_ON_DEV` (3) -- For collections that have completed reindexing on LRM Dev -- Currently managed manually by LRM team via admin interface +- For collections whose re-scrape has completed and whose results have been claimed +- Set automatically by `ingest_scraped_collection` as its atomic compare-and-swap claim + on the re-scrape path (`REINDEXING_NEEDED_ON_DEV` → `REINDEXING_FINISHED_ON_DEV`) +- This status deliberately triggers nothing: the ingest sets it, so a trigger here would + double-fire ### Ready for Re-Curation - Variable name: `REINDEXING_READY_FOR_CURATION` (4) -- Automatically set when: - - A collection's dump URLs are migrated to delta URLs AND there are curated URLs present - - Triggered by Collection.migrate_dump_to_delta() method +- Automatically set after a collection's dump URLs are migrated to delta URLs +- Set by the `migrate_dump_to_delta_and_handle_status_transistions` task, for collections + that entered migration at `REINDEXING_FINISHED_ON_DEV` ### Re-Curation in Progress - Variable name: `REINDEXING_CURATION_IN_PROGRESS` (5) @@ -42,33 +47,42 @@ The typical reindexing status flow is: ### Re-Curation Finished - Variable name: `REINDEXING_CURATED` (6) -- Automatically set when: - - Delta URLs are promoted to curated URLs AND there are curated URLs present - - Triggered by Collection.promote_to_curated() method +- Manually set by the curator when re-curation is finished +- Setting it is what *triggers* promotion: the `handle_workflow_status_change` receiver + calls `Collection.promote_to_curated()`, moving delta URLs to curated URLs ### Re-Indexed on Prod - Variable name: `REINDEXING_INDEXED_ON_PROD` (7) -- Currently managed manually via command line -- Future: Will be set automatically via plugin ping +- Manually set by a dev after the collection has been indexed on prod ### Key Code Locations for Automatic Changes -1. In migrate_dump_to_delta(): +1. In `ingest_scraped_collection()` (`sde_collections/tasks.py`) — the claim on the + re-scrape path: ```python -# After migrating, check if we should update reindexing status -curated_urls_count = self.curated_urls.count() -if curated_urls_count > 0: - self.reindexing_status = ReindexingStatusChoices.REINDEXING_READY_FOR_CURATION - self.save() +claimed = Collection.objects.filter( + id=collection_id, + reindexing_status=ReindexingStatusChoices.REINDEXING_NEEDED_ON_DEV, +).update(reindexing_status=ReindexingStatusChoices.REINDEXING_FINISHED_ON_DEV) ``` -2. In promote_to_curated(): +2. In `migrate_dump_to_delta_and_handle_status_transistions()` (`sde_collections/tasks.py`): ```python -# After promoting, check if we should update reindexing status -curated_urls_count = self.curated_urls.count() -if curated_urls_count > 0: - self.reindexing_status = ReindexingStatusChoices.REINDEXING_CURATED - self.save() +# Check reindexing status transition +if initial_reindexing_status == ReindexingStatusChoices.REINDEXING_FINISHED_ON_DEV: + collection.reindexing_status = ReindexingStatusChoices.REINDEXING_READY_FOR_CURATION + collection.save() ``` -Note: All status changes are logged in the ReindexingHistory model for tracking purposes. +3. In `handle_workflow_status_change()` (`sde_collections/models/collection.py`) — the + status set by the curator drives the action, not the other way around: +```python +if instance.reindexing_status == ReindexingStatusChoices.REINDEXING_NEEDED_ON_DEV: + dispatch_scrape_job.delay(instance.id) +elif instance.reindexing_status == ReindexingStatusChoices.REINDEXING_CURATED: + instance.promote_to_curated() +``` + +Note: Status changes made through `Collection.save()` are logged in the ReindexingHistory +model for tracking purposes. The ingest claim above is a queryset `.update()`, which +bypasses the `post_save` receiver and so is not recorded there. From c1505d36e1905d5750f34e6dd9140474e1c356d3 Mon Sep 17 00:00:00 2001 From: Bernard Benson Date: Sun, 23 Aug 2026 14:15:54 -0500 Subject: [PATCH 15/20] updating pre-commit hooks and removing stale imports --- .pre-commit-config.yaml | 6 +++--- bandit-config.yml | 32 +++++++++----------------------- sde_collections/views.py | 8 +------- 3 files changed, 13 insertions(+), 33 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index a0f4c06a..9086acac 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,5 +1,5 @@ exclude: "^docs/|/migrations/" -default_stages: [commit] +default_stages: [pre-commit] repos: - repo: https://github.com/pre-commit/pre-commit-hooks @@ -12,7 +12,7 @@ repos: - id: debug-statements - repo: https://github.com/asottile/pyupgrade - rev: v3.17.0 + rev: v3.20.0 hooks: - id: pyupgrade args: [--py310-plus] @@ -61,7 +61,7 @@ repos: - types-requests - repo: https://github.com/PyCQA/bandit - rev: "1.7.0" + rev: "1.8.6" hooks: - id: bandit args: ["-r", "--configfile=bandit-config.yml"] diff --git a/bandit-config.yml b/bandit-config.yml index 36a65525..a6e47d5d 100644 --- a/bandit-config.yml +++ b/bandit-config.yml @@ -1,26 +1,12 @@ # bandit-config.yml -skips: - - B101 # Skip assert used (often used in tests) - - B403 # Skip import from the pickle module - -exclude: - - ./tests/ # Exclude test directories - - ./migrations/ # Exclude migration directories - - ./venv/ # Exclude virtual environment - +# Only run these checks (same effective profile as the previous legacy config): +# B105 - hardcoded password strings +# B602 - subprocess call with shell=True tests: - - B105 # Include test for hardcoded password strings - - B602 # Include test for subprocess call with shell equals true - -profiles: - default: - include: - - B403 # Include test for dangerous default argument - exclude: - - B401 # Exclude test for import telnetlib - -# Set the severity level to focus on higher-risk issues -severity: 'HIGH' + - B105 + - B602 -# Set the confidence level to ensure that reported issues are likely true positives -confidence: 'HIGH' +exclude_dirs: + - tests + - migrations + - venv diff --git a/sde_collections/views.py b/sde_collections/views.py index cdbbafc7..7b496007 100644 --- a/sde_collections/views.py +++ b/sde_collections/views.py @@ -1,29 +1,23 @@ import re -from django.contrib import messages from django.contrib.auth import get_user_model from django.contrib.auth.mixins import LoginRequiredMixin from django.db import models from django.shortcuts import get_object_or_404, redirect, render from django.urls import reverse from django.utils import timezone -from django.views.generic import TemplateView, View +from django.views.generic import View from django.views.generic.detail import DetailView from django.views.generic.edit import DeleteView from django.views.generic.list import ListView from rest_framework import generics, status, viewsets -from rest_framework.exceptions import ValidationError from rest_framework.generics import ListAPIView from rest_framework.response import Response -from rest_framework.views import APIView from .forms import CollectionGithubIssueForm, CommentsForm, RequiredUrlForm from .models.collection import Collection, Comments, RequiredUrls, WorkflowHistory from .models.collection_choice_fields import ( - ConnectorChoices, CurationStatusChoices, - Divisions, - DocumentTypes, ReindexingStatusChoices, WorkflowStatusChoices, ) From 90dbad86494d087d64ea9eb8d0c4d9ec74bc35a2 Mon Sep 17 00:00:00 2001 From: Bernard Benson Date: Tue, 25 Aug 2026 14:49:45 -0500 Subject: [PATCH 16/20] bug fixes --- .env_sample | 1 + .pre-commit-config.yaml | 2 +- CHANGELOG.md | 11 + RELEASE_NOTES.md | 24 ++ REVIEW_AND_DEPLOYMENT_PREP.md | 389 ++++++++++++++++++ config/settings/base.py | 1 + gitleaks-config.toml | 18 + sde_collections/indexing/dispatch.py | 14 +- sde_collections/models/collection.py | 19 +- sde_collections/models/indexing.py | 4 +- sde_collections/scraping/ssm_dispatch.py | 4 + sde_collections/tasks.py | 166 ++++++-- .../tests/test_indexing_dispatch.py | 58 ++- .../tests/test_management_commands.py | 65 +++ sde_collections/tests/test_scrape_dispatch.py | 37 +- sde_collections/tests/test_scrape_ingest.py | 62 +++ sde_collections/tests/test_signals.py | 66 +++ .../tests/test_workflow_status_triggers.py | 37 +- .../utils/generate_deployment_message.py | 2 +- sde_collections/utils/slack_utils.py | 30 +- .../sde_collections/collection_detail.html | 4 - 21 files changed, 949 insertions(+), 65 deletions(-) create mode 100644 REVIEW_AND_DEPLOYMENT_PREP.md create mode 100644 gitleaks-config.toml create mode 100644 sde_collections/tests/test_management_commands.py create mode 100644 sde_collections/tests/test_signals.py diff --git a/.env_sample b/.env_sample index 24540a26..4992b8c9 100644 --- a/.env_sample +++ b/.env_sample @@ -31,5 +31,6 @@ INDEXING_CONTAINER_NAME="WEB_COSMOSContainer" INDEXING_DISPATCH_ROLE_ARN="" INDEXING_SUBNETS="" INDEXING_SECURITY_GROUPS="" +INDEXING_ASSIGN_PUBLIC_IP=True INDEX_POLL_ENABLED=False INDEX_STALL_TIMEOUT_HOURS=6 diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 9086acac..4fd8e657 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -12,7 +12,7 @@ repos: - id: debug-statements - repo: https://github.com/asottile/pyupgrade - rev: v3.20.0 + rev: v3.21.2 hooks: - id: pyupgrade args: [--py310-plus] diff --git a/CHANGELOG.md b/CHANGELOG.md index 1c0d7ca1..6d836986 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,17 @@ For each PR made, an entry should be added to this changelog. It should contain ## Changelog ### 3.1.?? +- cosmos-rewiring review fixes + - Description: Pre-merge fixes from the branch review. Status-triggered tasks are enqueued on commit; Slack messages are posted for statuses set via queryset `.update()` and for the `PRODUCTION_INDEXING -> PROD_*` transitions; re-scrape failures no longer overwrite the live workflow status; `send_job_to_crawler` refuses to run on a host without `CRAWLER_INSTANCE_ID`; duplicate URLs in crawl output are dropped instead of aborting the ingest; the prod status mirror map is explicit; `print()` replaced by `logging` in `tasks.py`. + - Changes: + - `sde_collections/models/collection.py`: `_enqueue_on_commit` wraps the four `.delay()` calls in `handle_workflow_status_change` + - `sde_collections/tasks.py`: `_mark_scrape_failed`, `_dedupe_by_url`, `PROD_STATUS_FOR_QC_STATUS`, logging + - `sde_collections/utils/slack_utils.py`: `notify_status_change`, two new `PRODUCTION_INDEXING -> PROD_*` messages + - `sde_collections/scraping/ssm_dispatch.py`: settings guard + - `templates/sde_collections/collection_detail.html`: removed the "View on prod" buttons (properties deleted with Sinequa) + - New tests: `test_signals.py`, `test_management_commands.py`; additions to the scrape/ingest/indexing/trigger suites + - `gitleaks-config.toml` added so the pre-commit gitleaks hook runs (it referenced a missing file) + - Deployment: none beyond the branch's existing migration/env steps - 1232-process-the-full-text-dump - Description: A script was added `/scripts/sde_dump_processing/clean_text_dump.py` which cleans dumps from sinequa. The sinequa dump does not respect normal csv new line formatting, so that a dump of 1.8 million records becomes a csv of 900 million lines. This script can detect the headers and process the dump with the three possible sources TDAMM, SDE, and scripts, in order to create a final, clean csv. It has a simple CLI which allows setting the input and output, the verbosity of the logs, etc. Because the input files can be very large, the script streams them instead of holding them in memory. - Changes: diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md index 1ced2857..f6943964 100644 --- a/RELEASE_NOTES.md +++ b/RELEASE_NOTES.md @@ -1,4 +1,28 @@ # COSMOS Release Notes +## Unreleased — `cosmos-rewiring` (Sinequa removal, crawl4ai + web-indexing hand-off) + +Sinequa, the GitHub config push and XML generation are removed. Collections are now scraped by the +crawl4ai crawler (dispatched over SSM, results ingested from S3) and indexed by the `sde-api-scrapers` +`WEB_COSMOS` ECS task (curated export to S3, `ecs:RunTask`, status polled from S3). Six workflow +statuses are added (Scraping Successful/Failed, Test Indexing, Indexing Failed on Test/Prod, +Production Indexing). See `WORKFLOW.md` and `sde_collections/DEPLOYMENT.md`. + +### Behaviour changes to be aware of +- **TDAMM classification threshold now takes effect.** `map_classification_to_tdamm_tags` previously + accepted `threshold` and ignored it; it is now honoured (`inference/utils/classification_utils.py`). + Inference is shipped disabled (`INFERENCE_ENABLED=False`); when re-enabled, collections will receive + different TDAMM tags than earlier runs at the same `TDAMM_CLASSIFICATION_THRESHOLD`. +- **Orphaned workflow statuses.** `Secret Deployment Started` (8), `Ready for LRM Quality Check` (10), + `Merge Pending` (17) and `Indexing Finished on Dev` (20) remain selectable but nothing advances them + any more (the Sinequa/LRM steps that consumed them are gone). Collections currently parked in those + statuses need to be moved by hand — audit them before/after deploying. +- Celery beat schedules for the two S3 pollers are DB rows written on `post_migrate`; their `enabled` + flag is re-asserted from `SCRAPE_POLL_ENABLED` / `INDEX_POLL_ENABLED` on **every** `migrate`. + Toggling a poller therefore requires `manage.py migrate`, not just a restart. +- Status-triggered Celery tasks are now enqueued with `transaction.on_commit`. +- A failed re-scrape (`Re-Indexing Needed`) no longer rewrites the collection's live workflow status; + it clears the reindexing request and posts a Slack alert instead. + ## v3.0.0 from v2.0.1 COSMOS v3.0.0 introduces several major architectural changes that fundamentally enhance the system's capabilities. The primary feature is a new website reindexing system that allows COSMOS to stay up-to-date with source website changes, addressing a key limitation of previous versions where websites could only be scraped once. This release includes comprehensive updates to the data models, frontend interface, rule creation system, and backend processing along with some bugfixes from v2.0.1. diff --git a/REVIEW_AND_DEPLOYMENT_PREP.md b/REVIEW_AND_DEPLOYMENT_PREP.md new file mode 100644 index 00000000..a087494b --- /dev/null +++ b/REVIEW_AND_DEPLOYMENT_PREP.md @@ -0,0 +1,389 @@ +# Review & Deployment Prep — `cosmos-rewiring` + `sde-api-scrapers` web indexing + +Prepared 2026-08-25 against COSMOS `cosmos-rewiring` @ `c1505d36` (14 commits over `dev`, 130 files, +6440/−9372) +and `sde-api-scrapers` `web-indexing` @ `8dde345` (local checkout; see §1 — the work itself lives on `develop`). + +--- + +## 0. TL;DR + +1. **COSMOS branch review findings are applied in the working tree (uncommitted, 2026-08-25)** — §4 has a + status column. Fixed: A (`on_commit`), B/C (dead Slack transitions), D (re-scrape clobbering prod status), + E (unwired-host guard), G (in-crawl URL de-dup), H, I, K, template leftovers, gitleaks config, release notes, + and the test gaps. Still open: F (whole-crawl-in-memory ingest), L (clock skew), cross-collection duplicate + URLs (design call), DB indexes, and the out-of-band credential rotation. Full `init.sh` suite is green. +2. **`sde-api-scrapers/web-indexing` is already merged and deployed.** PR #47 (`c2aebad`) landed on `develop` + and the dev stacks deployed 2026-08-20. The local `web-indexing` branch is now *behind* `develop` — diffing it + against `develop` yields a **revert of the RDR prod-freeze work (PR #49/#50)**. Do not open a PR from it; + rebase or delete it. "Review the indexer" means reviewing `web/` + the shared uploader changes as they sit on + `develop`. +3. **One gate remains before the closed loop can run: C.2** — wire the P7 env block on the **staging** host, + run `migrate` (the beat rows come from `post_migrate`), recreate containers. Infra on both sides is in place. +4. **One indexer bug must land before any test/prod tier deploy (R1):** the guards read the tier-capped endpoint + but `APIOpenSearchUploader` writes to bare `OPENSEARCH_ENDPOINT`. Harmless in dev (same collection), a + guard-bypass in prod. +5. **The production DB password is still in git history** (scrubbed from `SQLDumpRestoration.md` on this branch, + but present on `dev`). Rotate it; the scrub alone does nothing. The gitleaks hook that should have caught it + points at a `gitleaks-config.toml` that does not exist. +6. Uncommitted: COSMOS `.pre-commit-config.yaml` (pyupgrade bump `v3.20.0→v3.21.2`); scrapers repo has a + status-update edit to the task tracker and an **untracked `COSMOS_INDEX_REAL_RUN.md`** which is the best + description of the hand-off contract anywhere — commit it. + +--- + +## 1. Branch state + +| Repo | Branch | vs base | Notes | +|---|---|---|---| +| COSMOS | `cosmos-rewiring` @ `c1505d36` | 14 commits over `dev` (Phase 0–7) | Tree clean except `.pre-commit-config.yaml`. CI (`run_full_test_suite.yml`) runs only on PRs to `dev`, `paths-ignore: '**/*.md'`. | +| sde-api-scrapers | `web-indexing` @ `8dde345` | `origin/develop..web-indexing` = 1 commit (the merge); `web-indexing..origin/develop` = 8 commits | Web indexing merged via PR #47. Diff vs `develop` = removal of `RDR_API_BASE_URLS`/`_resolve_base_url()`/`schedule_enabled` — i.e. it would re-enable the frozen prod RDR EventBridge rule and reintroduce the silent sandbox fallback. | + +Uncommitted / untracked: +- COSMOS: `.pre-commit-config.yaml` — pyupgrade `v3.20.0 → v3.21.2`. Fine to commit with the branch. +- scrapers: `Web Indexing - Task Plan & Tracking.md` (records NS.2 done, NS.7 closed, OOB.3 verified, ECR digest + `ae1c9e02…` co-tagged `c2aebad…`, image linux/amd64 only); `COSMOS_INDEX_REAL_RUN.md` (untracked runbook, "not + yet executed end to end"). + +--- + +## 2. What the COSMOS branch does + +**Pipeline in one paragraph.** A curator moves a collection to *Ready for Engineering* → `post_save` enqueues +`dispatch_scrape_job`, which drops a crawl4ai job JSON into the crawler EC2 inbox over SSM `AWS-RunShellScript` +and records a `ScrapeDispatch`. `poll_scrape_jobs` (beat, every 5 min) watches +`s3://{SDE_S3_BUCKET}/failure_logs/{cf}_failures_summary.json`; a summary newer than `dispatched_at` triggers +`ingest_scraped_collection`, which claims the collection with a compare-and-swap, replaces `DumpUrl` rows from +`scraped_collections/{cf}.json`, then runs the existing delta migration → *Ready for Curation*. Inference is +present but dormant (`INFERENCE_ENABLED=False`). On *Curated*, `promote_to_curated()` then +`index_collection_to_test` exports `CuratedUrl` rows as JSONL to `s3://{SDE_INDEX_BUCKET}/curated_collections/{cf}/{run_id}/` +(`manifest.json` written last), assumes `INDEXING_DISPATCH_ROLE_ARN`, and `ecs:RunTask`s the indexer with a full +command override. `poll_index_runs` (every 2 min) reads `index_runs/{cf}/{run_id}/status.json`; test success +posts `validation.json` to Slack and holds at *Test Indexing*; a curator sets QC Perfect/Minor → prod dispatch → +*Production Indexing* → `PROD_PERFECT`/`PROD_MINOR`. Sinequa, GitHub config push, XML generation and the +health-check module are deleted outright. + +### New modules + +| Path | Purpose | +|---|---| +| `sde_collections/scraping/job_builder.py` | Pure `build_job_json(collection)` — seed URL + `collection_id` + non-null `ScraperConfigOverride` fields; refuses `max_pages > 100_000`. | +| `sde_collections/scraping/ssm_dispatch.py` | `send_job_to_crawler` — write `.tmp` → `chown` → `mv -f` into `CRAWLER_INBOX_PATH` via SSM; `shlex.quote`d. | +| `sde_collections/scraping/s3_results.py` | `fetch_summary`/`fetch_documents`/`results_ready` — missing key = not ready; `LastModified <= dispatched_at` = stale. | +| `sde_collections/indexing/export.py` | `export_curated_to_s3` — streams non-excluded `CuratedUrl` to JSONL, manifest last with exact `document_count`. | +| `sde_collections/indexing/dispatch.py` | `run_index_task` — settings guard, `sts:AssumeRole`, fresh ECS client, RunTask with full command override, optional `awsvpc` config. | +| `sde_collections/indexing/run_status.py` | `fetch_run_status`/`fetch_validation_report` from S3 only (never `ecs:DescribeTasks`). | +| `sde_collections/models/scraper_config.py` | `ScraperConfigOverride` (1:1, curator-editable), `ScrapeDispatch`. | +| `sde_collections/models/indexing.py` | `IndexDispatch` (`run_id`, `target`, `task_arn`, `previous_workflow_status`, `completed_at`). | +| `sde_collections/signals.py` | `post_migrate` creates/updates two `django_celery_beat` rows and re-asserts `enabled` from settings on every migrate. | +| `sde_collections/utils/aws.py` | `get_boto3_session()` — `SDE_AWS_*` keys if both set, else instance role. Ignores `DJANGO_AWS_*`. | +| `sde_collections/utils/slack_utils.py` | 10 new transition messages + `send_indexing_validation_report`. | +| `sde_collections/tasks.py` | `dispatch_scrape_job`, `poll_scrape_jobs`, `ingest_scraped_collection`, `_dispatch_index_run`, `index_collection_to_{test,prod}`, `poll_index_runs`. | +| `management/commands/{dispatch_scrape,ingest_scrape_results}.py` | Synchronous manual entry points (`--collection `); ingest uses `claim=False`. | + +### New settings (`config/settings/base.py:346-382`; mirrored in `.env_sample`, `.envs/.local/.django`) + +| Setting | Default | Setting | Default | +|---|---|---|---| +| `AWS_REGION` | `us-east-1` | `SDE_INDEX_BUCKET` | `""` | +| `SDE_S3_BUCKET` | `""` | `INDEXING_ECS_CLUSTER` | `""` | +| `CRAWLER_INSTANCE_ID` | `""` | `INDEXING_TASK_FAMILY` | `""` | +| `CRAWLER_INBOX_PATH` | `/opt/sde-crawler/jobs/incoming` | `INDEXING_CONTAINER_NAME` | `WEB_COSMOSContainer` | +| `SCRAPE_POLL_ENABLED` | `False` | `INDEXING_DISPATCH_ROLE_ARN` | `""` | +| `SCRAPE_STALL_TIMEOUT_HOURS` | `24` | `INDEXING_SUBNETS` | `""` | +| `INFERENCE_ENABLED` | `False` | `INDEXING_SECURITY_GROUPS` | `""` | +| `SDE_AWS_ACCESS_KEY_ID` / `_SECRET_ACCESS_KEY` | `""` (local only) | `INDEX_POLL_ENABLED` | `False` | +| | | `INDEX_STALL_TIMEOUT_HOURS` | `6` | + +Removed: `GITHUB_ACCESS_TOKEN`, `SINEQUA_CONFIGS_*`, `XLI_*`, `LRM_*`. Dropped deps: `PyGithub`, `xmltodict`. +`config/settings/test.py` forces `CELERY_BROKER_URL=memory://` (without it tests publish real tasks). + +### Migrations & statuses +- `0078` — `AlterField` for six new `WorkflowStatusChoices` (21 `SCRAPING_SUCCESSFUL`, 22 `TEST_INDEXING`, + 23 `SCRAPING_FAILED`, 24 `INDEXING_FAILED_ON_TEST`, 25 `INDEXING_FAILED_ON_PROD`, 26 `PRODUCTION_INDEXING`). + Also sweeps unrelated `match_pattern_type` default drift on five delta-pattern models. **No data migration — + none needed**; values are additive and `dev` topped out at 20. +- `0079` — `ScraperConfigOverride`, `ScrapeDispatch`. `0080` — `IndexDispatch`. All additive → rollback-safe. +- Orphaned statuses `8`, `10`, `17`, `20` remain in choices but nothing advances them any more (the + `IndexingInstructionsView` that drove 8→10 is gone). Audit prod rows parked there. + +--- + +## 3. What the indexer side does (`sde-api-scrapers` `develop`) + +- Entry: `python3 api_scraper.py --source WEB_COSMOS --collection --run-id [--target test|prod] + [--reconcile] [--web-index NAME] [--allow-id-collision]` (`api_scraper.py:616,695-728`). Exit 0 iff + `status.state == "succeeded"`. Excluded from `--source ALL`. +- `web/web_pipeline.py` orchestrates: load manifest → ensure index → probe scope → id-collision check → + scan existing ids → deletion guard → index/vectorize → tombstone → write `status.json` (+ `validation.json` + when `--target test`). +- **Contract with COSMOS** (`web/cosmos_source.py:4-11`): + ``` + COSMOS writes curated_collections/{collection_key}/{run_id}/documents.jsonl + curated_collections/{collection_key}/{run_id}/manifest.json ← must be LAST + indexer writes index_runs/{collection_key}/{run_id}/status.json + index_runs/{collection_key}/{run_id}/validation.json (test only) + ``` + Manifest requires `collection_key`, `run_id`, `document_count`; also reads `collection_name`, + `document_type`, `division`. Per-doc passthrough is `url`, `title`, `full_text` only — **`tdamm_tag` is + dropped** at `web/web_processor.py:18-25`. Doc id `/SDE/{collection_key}/|{url}`; `version` = sha256[:32] + of `[title, full_text, document_type, division]`. +- Index: working `sde-web-subset` (59 docs, 2 collections, mapping verified); live `sde-web` (431k docs, + **no `version` field yet** — OOB.1). Mapping in `web/index_mappings/sde_web.json`. +- Runtime: Fargate 2 vCPU / 8 GB, family `web_cosmos-scraper-dev`, container `WEB_COSMOSContainer`, + cluster `api-scrapers-cluster-dev`, logs `/ecs/api-scrapers-dev`. No cron, no monitoring alarm, **no + `ENTRYPOINT`** — the baked command is a placeholder that argparse rejects; COSMOS must send the full + command override (it does: `indexing/dispatch.py:47-58`). +- IAM: `CosmosIndexingDispatchRole-dev` trusts only `indexing-helper-role`; `RunTask` limited to the family + + cluster; `PassRole` on the two ECS roles. Bucket policy grants COSMOS put on `curated_collections/*`, get + on `index_runs/*`. No SSM parameters are used on the web path. +- Tier capping (`infrastructure/config/settings.py:330-350`): dev→dev/dev, test→test/test, prod→test/prod. + +--- + +## 4. Code review checklist — COSMOS + +Status column reflects the working tree as of 2026-08-25 (fixes applied, uncommitted; full `init.sh` suite green). + +### High + +| # | Status | Finding | Where | Resolution | +|---|---|---|---|---| +| A | ✅ fixed | `.delay()` fired inside `post_save`, no `transaction.on_commit`. Admin change views are atomic, so `export_curated_to_s3` could run before `promote_to_curated()`'s rows commit → false `INDEXING_FAILED_ON_TEST`. | `sde_collections/models/collection.py` `handle_workflow_status_change` | `_enqueue_on_commit()` wraps all four `.delay()` calls. Test: `test_task_is_enqueued_only_after_commit`. | +| B | ✅ fixed | Statuses set via queryset `.update()` bypassed `post_save`, so the `SCRAPING_SUCCESSFUL` / ingest-side `SCRAPING_FAILED` Slack messages never fired. | `tasks.py` ingest + `_mark_scrape_failed`; `utils/slack_utils.py` | `notify_status_change()` posts the mapped message after every `.update()`-set transition. Test: `test_claim_posts_the_scraping_successful_notification`. | +| C | ✅ fixed | "Live on Public Prod" keyed on `QC_* → PROD_*`, but the flow goes `PRODUCTION_INDEXING → PROD_*`. | `utils/slack_utils.py` `STATUS_CHANGE_NOTIFICATIONS` | Added `(PRODUCTION_INDEXING, PROD_PERFECT/PROD_MINOR)` pairs. Test: `test_prod_handoff_transitions_are_mapped`. | +| D | ✅ fixed | Ingest `except` unconditionally set `SCRAPING_FAILED`, including on the re-scrape path where the collection may be `PROD_PERFECT`. | `tasks.py` `_mark_scrape_failed` | Only rewrites `workflow_status` when it is in `SCRAPE_FLOW_STATUSES`; otherwise leaves it, resets `reindexing_status` → *Not Needed* (stops the 5-min re-enqueue loop) and posts a Slack alert. Tests: `test_rescrape_ingest_failure_leaves_workflow_status_alone`, `test_rescrape_dispatch_failure_leaves_prod_status_alone`. | +| E | ✅ fixed | Blank `CRAWLER_INSTANCE_ID` → `InstanceIds=[""]` → every *Ready for Engineering* transition on an unwired host failed + @-mention. | `scraping/ssm_dispatch.py` | Settings guard for `CRAWLER_INSTANCE_ID` / `CRAWLER_INBOX_PATH`, mirroring `indexing/dispatch.py`. Test: `test_unconfigured_crawler_refuses_to_dispatch`. | +| F | ❌ open | Whole crawl JSON (`full_text` for up to 100k pages) loaded with one `json.loads`; list held through batching. Worker OOM risk on large collections. | `scraping/s3_results.py` `fetch_documents`; `tasks.py` ingest | Needs a crawler-side JSONL contract or `ijson` (not in requirements). Not changed; size ceiling is `MAX_PAGES_CAP` = 100k. | +| G | ✅ partial | `BaseUrl.url` is `unique=True` **globally**. A duplicate URL in one crawl output — or a URL already in another collection's `DumpUrl` rows — raised `IntegrityError` → whole ingest failed. | `models/delta_url.py:72`; `tasks.py` `_dedupe_by_url` | In-crawl duplicates/blank URLs are now dropped (first wins, logged). **Cross-collection** duplicates still fail — skip-vs-fail is a design decision, see §10. Test: `test_duplicate_urls_in_crawl_output_are_dropped`. | + +### Medium + +| # | Status | Finding | Where | Resolution | +|---|---|---|---|---| +| H | ✅ fixed | Prod mirror map only had `QC_MINOR`; anything else silently became `PROD_PERFECT`. | `tasks.py` `PROD_STATUS_FOR_QC_STATUS` | Explicit two-key map; a prod run entered from a non-QC status holds at `PRODUCTION_INDEXING`, resolves the dispatch, and Slacks "set by hand". Test: `test_prod_success_from_non_qc_status_holds_for_manual_resolution`. | +| I | ✅ fixed | `print()` instead of `logging`; persistent S3 errors were invisible. | `tasks.py`, `utils/slack_utils.py` | Module loggers; `logger.exception` on failure paths so tracebacks are kept. | +| J | ⏸ by design | Beat `enabled` re-asserted on every `post_migrate`: flag flips need `migrate`, admin toggles are reverted on deploy. | `sde_collections/signals.py`; same in `inference/signals.py` | Kept (flag is the source of truth). Now in `RELEASE_NOTES.md` and pinned by `test_signals.py::test_flag_is_reasserted_on_every_migrate`. | +| K | ✅ fixed | `assignPublicIp: ENABLED` hardcoded; SGs only read inside the subnets guard. | `indexing/dispatch.py`; `config/settings/base.py` | New `INDEXING_ASSIGN_PUBLIC_IP` (default `True`; in `.env_sample`). Subnets/SGs read independently; one-without-the-other raises `ValueError`. 3 new tests. | +| L | ❌ open | `results_ready` compares S3 `LastModified` to the Django host clock — skew makes a fresh summary look stale forever. | `scraping/s3_results.py` `results_ready` | A tolerance window would let a quick re-dispatch accept the previous run's summary. Proper fix: snapshot the prior summary's `LastModified` on `ScrapeDispatch` at dispatch time (needs a migration). Decide in review. | +| M | ✅ test / ⏸ docs | Real account ID in a test; instance IDs, IPs, ARNs throughout the planning docs. | `tests/test_indexing_dispatch.py` | Test uses `123456789012`. Planning docs left in place (owner will remove). | +| N | ✅ hook / ⏸ rotate | Prod DB password + RDS host in git history (`SQLDumpRestoration.md` on `dev`); gitleaks hook pointed at a missing config. | `.pre-commit-config.yaml`; `gitleaks-config.toml` | `gitleaks-config.toml` created (extends default rules); `pre-commit run gitleaks --all-files` passes. **Credential rotation still required** — out of band. | + +### Cleanup / leftovers + +| Status | Item | +|---|---| +| ✅ | `collection_detail.html` "View on prod / secret prod" buttons (deleted properties) removed; `utils/generate_deployment_message.py` (unused) trimmed for the same reason. | +| ✅ | `IndexDispatch.TARGET_TEST` / `TARGET_PROD` constants replace bare `"test"`/`"prod"` in `tasks.py`. | +| ✅ | `threshold` behaviour change and orphaned statuses 8/10/17/20 documented in `RELEASE_NOTES.md` ("Unreleased") + `CHANGELOG.md`. | +| ❌ skipped | Cosmetic Sinequa `help_text` strings (`delta_url.py`, `candidate_url.py`, `pattern.py`, `delta_patterns.py`) and `ConnectorChoices.ONLY_IN_SINEQUA_CONFIGS` — Django tracks `help_text`, so editing them generates a migration; not worth the noise on this branch. Legacy `scripts/` and `jupyter_notebooks/` import nothing deleted. | +| ❌ later | Indexes on `IndexDispatch.run_id` / `ScrapeDispatch.collection` — needs a migration; fine at current scale. | +| ➖ non-issue | 5-min `poll_scrape_jobs` vs 10-min ingest `soft_time_limit`: the CAS claim runs *before* `fetch_documents`, so a second invocation exits without downloading. Earlier note was overstated. | + +### Tests +- Branch added: `test_scrape_dispatch.py`, `test_scrape_ingest.py`, `test_indexing_dispatch.py`, + `test_inference_flag.py`, `test_aws_utils.py`. Removed: `test_sinequa_api.py`, `test_import_fulltexts.py`, + `sde_collections/tests.py`, `config_generation/tests/*`. +- Real fixes riding along: `environmental_justice/tests/conftest.py` no longer leaks `ROOT_URLCONF` into later + modules; `test_promote_collection.py` patterns changed from `.*docs.*` to `*docs*` (the old regex idiom matched + nothing); `test_migrate_dump.py` imports the real `DELTA_COMPARISON_FIELDS`. +- Review fixes added: `test_signals.py` (6), `test_management_commands.py` (6), plus on_commit ordering, + Slack-content, re-scrape failure, URL de-dup, unmapped prod mirror, SSM guard and network-config tests in the + existing suites. Trigger tests now use `captureOnCommitCallbacks(execute=True)`. +- Gaps closed: `signals.py`, both management commands, Slack message content, on_commit ordering. Still untested: + F (memory) and L (clock skew) by nature. +- Run: `docker-compose -f local.yml run --rm django bash ./init.sh` then `… coverage report` + (`init.sh` runs each `test_*.py` as its own process). Last run 2026-08-25: all files pass; + `makemigrations --check` clean. + +--- + +## 5. Code review checklist — indexer (`sde-api-scrapers`) + +| # | Finding | Where | Action | +|---|---|---|---| +| R0 | Local `web-indexing` is behind `develop`; a PR from it reverts PR #49/#50 (RDR prod freeze + sandbox guard). | `scrapers/rdr_scraper.py`, `infrastructure/config/settings.py`, `infrastructure/scheduling/scheduling_stack.py:112` | Rebase onto `origin/develop` or delete the branch. | +| R1 | **Split-brain endpoints.** `WebPipeline._resolve_endpoint` tier-caps `self.endpoint` for `ensure_index`/`probe_scope`/collision check/state scan/validate, but `APIOpenSearchUploader` never receives it — six bare `get_opensearch_client()` calls fall back to env `OPENSEARCH_ENDPOINT`. Masked in dev/test (same collection); on prod `--target test` guards TEST and writes PROD. Uploader is a `MagicMock` in `test_web_pipeline.py`, so untested. | `web/web_pipeline.py:110-116`; `uploader/api_opensearch_upload.py:92,187,245,364,454,521` | Thread `endpoint` into the uploader constructor. **Block prod deploy on this.** | +| R2 | `export_incomplete` / skipped deletions set `out["error"]` but `state` is still overwritten to `"succeeded"`; COSMOS branches on `state` only → truncated export indexes partially and reports success. | `web/web_pipeline.py:155,226-228` | Decide: `failed`, or a distinct `succeeded_with_warnings` COSMOS handles explicitly. | +| R3 | Deletion thresholds (`0.90`, `0.25`, `5000`) have silent in-code defaults; only the deployed task def injects them. | `web/deletion_guard.py:28-48` | Acceptable with the drift test; note for local runs. | +| R4 | Hardcoded account `998871305517`, role ARN, three AOSS hostnames; `deploy.yml:163` verify step bakes the account into the S3 name. TEST/PROD COSMOS account IDs commented out (silently no grant, not a synth error). | `infrastructure/config/settings.py:241-243,290-292,310` | Fine for dev; must be resolved for test/prod (NS.5). | +| R5 | Operator-facing error strings tell you to read `FINDING_id_scheme_collision.md §9` — deleted in `8c34fea`. Nine dangling doc refs total. | `web/id_collision.py:15,42,146,172`; `web/scope.py:18`; `web/validate.py:2`; `README.md:99` | Restore §9 or rewrite the strings. | +| R6 | 369 unit tests pass; **zero E2E** (E2E.2–E2E.10 unchecked). `test_infra_web_env.py:374` is misnamed (asserts endpoint divergence, not bucket passthrough). | tracker `:446-459` | C.4 below is the E2E. | +| R8 | 12 id-collision collections (`gcn_circulars`, `CODE_NASA_API`, …) excluded by verbal agreement only; nothing enforces it on either side beyond the runtime refusal. The 0.90 ratio guard does not back up the scope filter; `WEB_DELETION_ABORT_MAX` is the real protection. `AWSV4SignerAuth` rotation fix unverified on a >6 h run. | tracker `:460-477` | Consider a COSMOS-side denylist or an `ScraperConfigOverride` flag. | +| R9 | `documents.jsonl` read 2× per run (3× with `--reconcile`); ids and titles held in memory — the reason for 8 GB. | `web/web_pipeline.py:204-206,267,284` | Note; not a blocker. | +| R10 | Three dependency sources (`requirements.txt`, `pyproject.toml`+`uv.lock`, `infrastructure/requirements.txt`); `requests-aws4auth` still pinned though unused. | | Cleanup. | +| — | `infrastructure/DEPLOYMENT.md` predates the branch; its `run-task` example has no command override and will fail for `WEB_COSMOS`. `API_SCRAPERS_ARCHITECTURE_REVIEW.md` is stale (3 sources, `us-west-1`). | | Update or mark stale. | + +Deploy path: `.github/workflows/deploy.yml` on push to `develop`/`test`/`main` → `pytest tests/` → ECR +`:sha`+`:latest` → `cdk deploy --all` → verify. OIDC trust is branch-pinned, so `workflow_dispatch` from a feature +branch fails at credential setup; rollback is `git revert -m 1 ` + push. + +--- + +## 6. Pre-merge fix list + +**COSMOS (before PR `cosmos-rewiring → dev`)** — applied 2026-08-25 in the working tree (uncommitted); full suite green via `init.sh` +- [x] A — `_enqueue_on_commit` wraps the four `.delay()` calls (`collection.py`) +- [x] B + C — `notify_status_change` posts for `.update()`-set statuses; `PRODUCTION_INDEXING → PROD_*` pairs added +- [x] D — `_mark_scrape_failed` leaves the live `workflow_status` alone on the re-scrape path (clears the reindexing request + Slack alert so the poller doesn't loop) +- [x] E — settings guard in `send_job_to_crawler` +- [x] Template leftovers removed from `collection_detail.html` (and `generate_deployment_message.py`) +- [x] Placeholder account ID in `test_indexing_dispatch.py` +- [x] `gitleaks-config.toml` created (extends defaults) — `pre-commit run gitleaks --all-files` passes +- [ ] Commit `.pre-commit-config.yaml` (with the rest of these changes) +- [ ] Decide whether `INDEXING_HANDOFF_TODO.md`, `IMPLEMENTATION_PLAN.md`, `LOCAL_VERIFICATION_GUIDE.md` (instance IDs, IPs, ARNs) belong in a public repo, or move to the wiki +- [x] Release notes (`RELEASE_NOTES.md` "Unreleased") + `CHANGELOG.md` entry +- [x] G (in-crawl URL de-dup), H (explicit `PROD_STATUS_FOR_QC_STATUS`; unknown entry status holds at `PRODUCTION_INDEXING` + Slack), I (`logging` in `tasks.py`/`slack_utils.py`), tests for `signals.py` and both mgmt commands +- [x] K — `INDEXING_ASSIGN_PUBLIC_IP` setting; subnets/SGs validated together (`indexing/dispatch.py`, `base.py`, `.env_sample`) +- [x] `IndexDispatch.TARGET_TEST/TARGET_PROD` constants used in `tasks.py` +- [ ] F (streaming ingest) — not done; needs a crawler-side JSONL contract or `ijson` +- [ ] L (clock skew in `results_ready`) — not done; see §4 for the migration-based fix +- [ ] G, cross-collection duplicate URLs — design decision (skip vs fail), see §10 +- [ ] Indexes on `IndexDispatch.run_id` / `ScrapeDispatch.collection` — later, needs a migration +- Out of band: **rotate the prod DB credential** + +**Indexer** +- [ ] R0 — rebase/delete local `web-indexing` +- [ ] Commit `COSMOS_INDEX_REAL_RUN.md` and the tracker update +- [ ] R1 — endpoint into `APIOpenSearchUploader` (before any test/prod tier deploy) +- [ ] R2 — settle `export_incomplete` semantics with COSMOS +- [ ] R5 — restore/rewrite the collision remediation text + +--- + +## 7. Deployment runbook (dev, staging host only) + +**Standing rule:** all COSMOS work runs on **staging `i-08f9b2175b70fa05c`** (`ssh staging_cosmos`, +`ec2-user@18.215.146.207`, key `~/.ssh/sde-indexing-helper-staging.pem`). Never the production box +`i-02b3d3e1ac0671952`. `i-0178c998e868792d7` (`COSMOS_Staging_Refresh`) has no instance profile and cannot +dispatch. The COSMOS boxes are not SSM-registered — use SSH. Note `indexing-helper-role` is shared by staging and +production, so the C.1 `sts:AssumeRole` grant already exists on production's role too. + +### Prerequisites — all in place (account `998871305517`, `us-east-1`, profile `sde-dev`) + +| Resource | Value | Status | +|---|---|---| +| Indexing bucket | `sde-cosmos-indexing-dev` | ✅ NS.2 | +| Dispatch role | `arn:aws:iam::998871305517:role/CosmosIndexingDispatchRole-dev` | ✅ NS.2 | +| COSMOS role grant | inline `CosmosIndexingDispatch-dev` on `indexing-helper-role` | ✅ C.1 / NS.6 done 2026-08-20 (the scrapers tracker row is stale) | +| ECS | cluster `api-scrapers-cluster-dev`, family `web_cosmos-scraper-dev:1`, container `WEB_COSMOSContainer` | ✅ | +| ECR | `…/api-scrapers-dev:latest` = `c2aebad` | ✅ | +| Network | VPC `vpc-0265394c8c285afba`, SG `sg-01817cfe4f3629986`, 6 public subnets (below) | ✅ NS.3 values known | +| Index | `sde-web-subset` (59 docs; mapping verified) | ✅ OOB.3 | +| Crawler | `i-0b6a61d95888886f4`, bucket `sdecrawlerstack-crawlbucket0d63eba8-lhkxqnh8ophy`, inbox `/opt/sde-crawler/jobs/incoming` | ✅ | + +### C.2 — wire the staging host + +1. `ssh staging_cosmos`, `cd` to the checkout, `git fetch && git checkout cosmos-rewiring` (or the merged `dev`). +2. Append to `.envs/.production/.django` (from `INDEXING_HANDOFF_TODO.md:293-299`): + ``` + AWS_REGION=us-east-1 + SDE_S3_BUCKET=sdecrawlerstack-crawlbucket0d63eba8-lhkxqnh8ophy + CRAWLER_INSTANCE_ID=i-0b6a61d95888886f4 + CRAWLER_INBOX_PATH=/opt/sde-crawler/jobs/incoming + SCRAPE_POLL_ENABLED=true + INFERENCE_ENABLED=False + + SDE_INDEX_BUCKET=sde-cosmos-indexing-dev + INDEXING_ECS_CLUSTER=api-scrapers-cluster-dev + INDEXING_TASK_FAMILY=web_cosmos-scraper-dev + INDEXING_CONTAINER_NAME=WEB_COSMOSContainer + INDEXING_DISPATCH_ROLE_ARN=arn:aws:iam::998871305517:role/CosmosIndexingDispatchRole-dev + INDEXING_SUBNETS=subnet-0268b60265d9d6e87,subnet-0c29076fe7de10791,subnet-030a3a47fa10c76b2,subnet-0a6c6c437ed87dda3,subnet-09355979ab5496a50,subnet-0f3a7b40152e63be3 + INDEXING_SECURITY_GROUPS=sg-01817cfe4f3629986 + INDEX_POLL_ENABLED=true + ``` + Leave `SDE_AWS_*` blank so the instance role is used. Keep `SCRAPE_POLL_ENABLED=false` if you only want to + exercise the indexing loop first. +3. Build + migrate + recreate — **order matters; `migrate` is required** (beat rows come from `post_migrate`, + and the production start script does not migrate): + ``` + docker compose -f production.yml build django + docker compose -f production.yml run --rm django python manage.py migrate --noinput + docker compose -f production.yml up -d --force-recreate django celeryworker celerybeat + ``` +4. Verify: + ``` + docker compose -f production.yml run --rm django python manage.py shell -c \ + "from django.conf import settings as s; print(s.INDEXING_DISPATCH_ROLE_ARN, s.INDEXING_SUBNETS, s.INDEX_POLL_ENABLED)" + docker compose -f production.yml run --rm django python manage.py shell -c \ + "from django_celery_beat.models import PeriodicTask; print(list(PeriodicTask.objects.filter(task__startswith='sde_collections.tasks.poll').values_list('name','enabled')))" + docker compose -f production.yml exec celeryworker celery -A config.celery_app inspect ping + ``` + Expect `Poll index runs (every 2 min)` / `Poll crawler S3 results (every 5 min)` with the expected `enabled`. + Confirm migrations `0078`, `0079`, `0080` applied (`showmigrations sde_collections | tail`). + +### C.3 — pre-flight from the staging host +``` +aws s3 cp /etc/hostname s3://sde-cosmos-indexing-dev/curated_collections/_preflight/x/probe.txt +aws s3 cp s3://sde-cosmos-indexing-dev/curated_collections/_preflight/x/probe.txt - +aws s3api list-objects-v2 --bucket sde-cosmos-indexing-dev --prefix index_runs/ # AccessDenied is acceptable +aws sts assume-role --role-arn arn:aws:iam::998871305517:role/CosmosIndexingDispatchRole-dev --role-session-name preflight +``` +Then from a Django shell, on a **scratch** collection (e.g. `config_folder='verify_web'`): +`from sde_collections.indexing.dispatch import run_index_task; run_index_task(c, 'test', 'preflight-1')` +→ expect a `taskArn`; `aws ecs list-tasks --cluster api-scrapers-cluster-dev --family web_cosmos-scraper-dev`. +The task will fail on a missing export — that is the wiring proof. + +### C.4 — closed loop (the indexer's E2E.10) +Pick a small collection **not** in the id-collision set (avoid `gcn_circulars`, `CODE_NASA_API`); the two already +in `sde-web-subset` are `astromaterials_data_system` and `aurorasaurus_reporting_auroras_from_the_ground_up`. +1. Admin → set `workflow_status = Curated`. Confirm: `IndexDispatch` row; objects under + `s3://sde-cosmos-indexing-dev/curated_collections/{cf}/{run_id}/` with `manifest.json` last; ECS task running; + status `TEST_INDEXING`. Watch `/ecs/api-scrapers-dev` in CloudWatch. +2. Wait for `index_runs/{cf}/{run_id}/status.json` (≤ a few minutes). Poller posts `validation.json` to + `#sde-data-curation`; collection **stays** `TEST_INDEXING`. +3. Set `QC Perfect` → prod dispatch (`--target prod`, same collection in dev) → `PRODUCTION_INDEXING` → `PROD_PERFECT`. +4. Failure path: re-curate, delete `manifest.json` before the task reads it (or dispatch against an empty + export) → `INDEXING_FAILED_ON_TEST`, Slack alert. +5. Optional scrape leg: `SCRAPE_POLL_ENABLED=true` + migrate, set a collection to *Ready for Engineering*, + confirm the job JSON lands in the crawler inbox via SSM and the ingest reaches *Ready for Curation*. +6. Tick E2E.2–E2E.10 in the scrapers tracker and "Closed loop verified" / NS.3 in `IMPLEMENTATION_PLAN.md`. + +### Rollback +- Code: `git checkout ` and repeat step 3. Migrations 0078–0080 are additive — leave them applied. +- Disable the pipeline without rolling back: set `INDEX_POLL_ENABLED=false` / `SCRAPE_POLL_ENABLED=false`, + run `migrate` (not just restart — see J), recreate `celerybeat`. Or blank `INDEXING_DISPATCH_ROLE_ARN` to make + dispatch raise on the settings guard. +- Indexer: `git revert -m 1 ` on `develop` and push; CD redeploys. + +--- + +## 8. Cutover and later +- **OOB.1** — add `version: keyword` to live `sde-web` mapping *before* the first write (dynamic mapping would + create it as `text` and the differ never works). Backfilling `version` arms the 431k blast radius — do it with + the deletion guards understood. +- Flip `WEB_INDEX_NAME` `sde-web-subset → sde-web` in `infrastructure/config/settings.py` + task def. No COSMOS change. +- R1 must be fixed before any test/prod tier deploy of the indexer. +- NS.5 — test/prod COSMOS account IDs (`COSMOS_AWS_ACCOUNT_ID[TEST|PROD]`) so the dispatch role + bucket policy + synth for those tiers. +- COSMOS Phase 9 CI/CD (0/8): `validate_deploy_env`/`preflight_aws` commands, `scripts/deploy.sh`, staging/prod + workflows gated on `CD_ENABLED`, `/healthz`, rollback rehearsal. Explicitly not a gate for the loop. +- COSMOS never calls `ecs:DescribeTasks`; a task that dies before writing `status.json` is invisible for + `INDEX_STALL_TIMEOUT_HOURS` (6 h). Consider a `DescribeTasks` check in `poll_index_runs` later. + +--- + +## 9. Doc discrepancies to fix +1. `INDEXING_HANDOFF_TODO.md` / `IMPLEMENTATION_PLAN.md` cite HEAD `9e18ced8` and "uncommitted" state; actual HEAD is `c1505d36`, tree clean. +2. `INDEXING_HANDOFF_TODO.md` says P7 "10 of 14" in one place and "11 of 14" in another. +3. `IMPLEMENTATION_PLAN.md` NS.1 prose and the scrapers tracker still call `i-02b3d3e1ac0671952` (production) "the COSMOS host"; the loop runs on staging. +4. Scrapers `COSMOS_INDEX_REAL_RUN.md` §0 lists NS.3/NS.6 open and COSMOS env "all blank" — NS.6 done 2026-08-20; its worked example uses `nasa_applied_sciences`, which is not in `sde-web-subset`. +5. Deletion guard threshold: `> 0.90` (handoff, tracker, E2E.7a) vs `≥ 0.90` (`COSMOS_INDEX_REAL_RUN.md` §4). Code is `>`. +6. `sde-web-copy` vs `sde-web-subset` — pre-2026-08-19 verifications were against `-copy`; `IMPLEMENTATION_PLAN.md` NS.8 still says so. +7. `sde_collections/DEPLOYMENT.md` says `validate_deploy_env` must refuse identical endpoints; `IMPLEMENTATION_PLAN.md` Phase 9 says tier separation is indexer-side only. +8. `DEPLOYMENT.md` puts the COSMOS ECR repo in "the SMCE account"; all indexing resources are in `998871305517`. +9. Scrapers `infrastructure/DEPLOYMENT.md` `run-task` example lacks the command override. +10. `WORKFLOW.md` omits statuses 22/26 and says the collection moves to QC after validation; the code holds at `TEST_INDEXING` and QC is curator-set. +11. Scrapers `DESIGN.md` (deleted) and `API_SCRAPERS_ARCHITECTURE_REVIEW.md` describe cross-account / 3-source / `us-west-1` — stale. + +--- + +## 10. Open questions for the review +- Should the 12 id-collision collections be enforced in COSMOS code (denylist / override flag) rather than by agreement? +- `export_incomplete` → `succeeded` with `error` (R2): does COSMOS want to treat that as failure, or surface it as a distinct status? +- `tdamm_tag` is exported by COSMOS but dropped by the indexer — intentional for now, or should the mapping carry it? +- Static `SDE_AWS_*` keys vs instance role as the long-term model; env-file source of truth (hand-maintained per host vs SSM Parameter Store / Secrets Manager). +- Do the planning docs with instance IDs / IPs stay in the public repo? +- Fargate networking: dev runs `INDEXING_ASSIGN_PUBLIC_IP=True` on public subnets; is a private subnet + NAT (`False`) the target for prod? +- G, cross-collection duplicates: `BaseUrl.url` is globally unique, so a URL already in another collection's `DumpUrl` rows aborts an ingest. Skip the row (and log), or fail the collection so a curator notices the overlap? +- L: should `ScrapeDispatch` snapshot the previous summary's `LastModified` at dispatch time (migration) so completion detection stops depending on the Django host clock? diff --git a/config/settings/base.py b/config/settings/base.py index 76a83f9d..69828378 100644 --- a/config/settings/base.py +++ b/config/settings/base.py @@ -377,6 +377,7 @@ # Fargate RunTask needs awsvpc network config; comma-separated ids, from the indexer's VPC. INDEXING_SUBNETS = env("INDEXING_SUBNETS", default="") INDEXING_SECURITY_GROUPS = env("INDEXING_SECURITY_GROUPS", default="") +INDEXING_ASSIGN_PUBLIC_IP = env.bool("INDEXING_ASSIGN_PUBLIC_IP", default=True) INDEX_POLL_ENABLED = env.bool("INDEX_POLL_ENABLED", default=False) # An index run with no status.json after this long is declared dead (indexing is minutes, not hours). INDEX_STALL_TIMEOUT_HOURS = env.int("INDEX_STALL_TIMEOUT_HOURS", default=6) diff --git a/gitleaks-config.toml b/gitleaks-config.toml new file mode 100644 index 00000000..b65dab1c --- /dev/null +++ b/gitleaks-config.toml @@ -0,0 +1,18 @@ +# gitleaks configuration for the pre-commit hook (.pre-commit-config.yaml). +# Extends the built-in default ruleset; only allowlists are added here. +title = "COSMOS gitleaks config" + +[extend] +useDefault = true + +[allowlist] +description = "Paths that legitimately contain example/placeholder values" +paths = [ + '''\.env_sample$''', + '''\.envs/\.local/''', + '''gitleaks-config\.toml$''', +] +regexes = [ + # Placeholder AWS account used in tests + '''123456789012''', +] diff --git a/sde_collections/indexing/dispatch.py b/sde_collections/indexing/dispatch.py index 12619cc5..338fcaad 100644 --- a/sde_collections/indexing/dispatch.py +++ b/sde_collections/indexing/dispatch.py @@ -60,12 +60,18 @@ def run_index_task(collection, target: str, run_id: str) -> str: ] }, } - if settings.INDEXING_SUBNETS: + subnets = [s for s in settings.INDEXING_SUBNETS.split(",") if s] + security_groups = [s for s in settings.INDEXING_SECURITY_GROUPS.split(",") if s] + if subnets or security_groups: + if not (subnets and security_groups): + raise ValueError("INDEXING_SUBNETS and INDEXING_SECURITY_GROUPS must both be set (or both blank)") kwargs["networkConfiguration"] = { "awsvpcConfiguration": { - "subnets": [s for s in settings.INDEXING_SUBNETS.split(",") if s], - "securityGroups": [s for s in settings.INDEXING_SECURITY_GROUPS.split(",") if s], - "assignPublicIp": "ENABLED", + "subnets": subnets, + "securityGroups": security_groups, + # Public subnets (dev's default VPC) need a public IP to reach S3/AOSS; + # a private subnet with NAT should set INDEXING_ASSIGN_PUBLIC_IP=False. + "assignPublicIp": "ENABLED" if settings.INDEXING_ASSIGN_PUBLIC_IP else "DISABLED", } } diff --git a/sde_collections/models/collection.py b/sde_collections/models/collection.py index bbf210d2..ecced933 100644 --- a/sde_collections/models/collection.py +++ b/sde_collections/models/collection.py @@ -4,7 +4,7 @@ from django.conf import settings from django.contrib.auth import get_user_model from django.contrib.contenttypes.models import ContentType -from django.db import models +from django.db import models, transaction from django.db.models.signals import post_save from django.dispatch import receiver from model_utils import FieldTracker @@ -631,6 +631,12 @@ def reindexing_status_button_color(self) -> str: return color_choices[self.reindexing_status] +def _enqueue_on_commit(task, collection_id): + """Enqueue `task` once the surrounding transaction commits (immediately when there + is none). Keeps post_save side effects from racing uncommitted writes.""" + transaction.on_commit(lambda: task.delay(collection_id)) + + def _send_status_change_notification(instance, old_status, new_status): """Slack notification for a committed status transition. Lives in post_save (not Collection.save) so a message can never be sent for a save that then fails, and so @@ -672,21 +678,24 @@ def handle_workflow_status_change(sender, instance, created, **kwargs): old_status = instance.tracker.changed()["workflow_status"] _send_status_change_notification(instance, old_status, instance.workflow_status) + # Tasks are enqueued on commit: admin change views and callers wrapping the + # save in transaction.atomic() would otherwise let the worker start before + # the status (and promote_to_curated's CuratedUrl rows) are visible to it. if instance.workflow_status == WorkflowStatusChoices.READY_FOR_ENGINEERING: - dispatch_scrape_job.delay(instance.id) + _enqueue_on_commit(dispatch_scrape_job, instance.id) elif instance.workflow_status == WorkflowStatusChoices.CURATED: instance.promote_to_curated() - index_collection_to_test.delay(instance.id) + _enqueue_on_commit(index_collection_to_test, instance.id) elif instance.workflow_status in [ WorkflowStatusChoices.QUALITY_CHECK_PERFECT, WorkflowStatusChoices.QUALITY_CHECK_MINOR, ]: - index_collection_to_prod.delay(instance.id) + _enqueue_on_commit(index_collection_to_prod, instance.id) if "reindexing_status" in instance.tracker.changed(): if instance.reindexing_status == ReindexingStatusChoices.REINDEXING_NEEDED_ON_DEV: # Re-scrape path: replaces the engineer manually re-running a Sinequa job. - dispatch_scrape_job.delay(instance.id) + _enqueue_on_commit(dispatch_scrape_job, instance.id) elif instance.reindexing_status == ReindexingStatusChoices.REINDEXING_CURATED: instance.promote_to_curated() diff --git a/sde_collections/models/indexing.py b/sde_collections/models/indexing.py index d310e3e0..dfdb33ec 100644 --- a/sde_collections/models/indexing.py +++ b/sde_collections/models/indexing.py @@ -10,7 +10,9 @@ class IndexDispatch(models.Model): can never satisfy a newer dispatch — no LastModified freshness rule needed. """ - TARGET_CHOICES = [("test", "test"), ("prod", "prod")] + TARGET_TEST = "test" + TARGET_PROD = "prod" + TARGET_CHOICES = [(TARGET_TEST, TARGET_TEST), (TARGET_PROD, TARGET_PROD)] collection = models.ForeignKey( "sde_collections.Collection", diff --git a/sde_collections/scraping/ssm_dispatch.py b/sde_collections/scraping/ssm_dispatch.py index db22ed30..da16231a 100644 --- a/sde_collections/scraping/ssm_dispatch.py +++ b/sde_collections/scraping/ssm_dispatch.py @@ -17,6 +17,10 @@ def send_job_to_crawler(collection) -> str: """Build and drop the job JSON for `collection`; returns the SSM command id.""" + for name in ("CRAWLER_INSTANCE_ID", "CRAWLER_INBOX_PATH"): + if not getattr(settings, name): + raise ValueError(f"{name} is not configured — cannot dispatch a scrape job") + job_json = json.dumps(build_job_json(collection)) dest = f"{settings.CRAWLER_INBOX_PATH}/{collection.config_folder}.json" script = ( diff --git a/sde_collections/tasks.py b/sde_collections/tasks.py index 41131743..67f5d881 100644 --- a/sde_collections/tasks.py +++ b/sde_collections/tasks.py @@ -1,5 +1,7 @@ # /sde_collections/tasks.py +import logging + from django.apps import apps from django.conf import settings from django.db import transaction @@ -14,14 +16,54 @@ from .indexing.export import export_curated_to_s3 from .indexing.run_status import fetch_run_status, fetch_validation_report from .models.delta_url import DumpUrl +from .models.indexing import IndexDispatch from .scraping.s3_results import fetch_documents, fetch_summary, results_ready from .scraping.ssm_dispatch import send_job_to_crawler from .utils.slack_utils import ( + notify_status_change, send_detailed_import_notification, send_indexing_validation_report, + send_slack_message, +) + +logger = logging.getLogger(__name__) + +# Statuses a collection can hold while a crawl is in flight on the *workflow* path. A +# scrape/ingest failure may only rewrite workflow_status when it is one of these; on the +# re-scrape path (reindexing_status) the live workflow status — typically PROD_* — is +# left alone. +SCRAPE_FLOW_STATUSES = ( + WorkflowStatusChoices.READY_FOR_ENGINEERING, + WorkflowStatusChoices.ENGINEERING_IN_PROGRESS, + WorkflowStatusChoices.SCRAPING_SUCCESSFUL, ) +def _mark_scrape_failed(collection, reason): + """Record a scrape/ingest failure without clobbering a status outside the scrape flow. + + Uses a queryset .update() (so no post_save side effects fire) and posts the mapped + Slack message itself. Outside the scrape flow only an alert is sent. + """ + Collection = apps.get_model("sde_collections", "Collection") + old_status = Collection.objects.filter(id=collection.id).values_list("workflow_status", flat=True).first() + if old_status in SCRAPE_FLOW_STATUSES: + Collection.objects.filter(id=collection.id).update(workflow_status=WorkflowStatusChoices.SCRAPING_FAILED) + notify_status_change(collection.name, collection.id, old_status, WorkflowStatusChoices.SCRAPING_FAILED) + return + # Re-scrape path: keep the live workflow status, and clear the reindexing request so + # the poller stops re-enqueueing the same failed run every 5 minutes. + logger.error("Re-scrape of %s failed (%s); workflow status left unchanged", collection.config_folder, reason) + Collection.objects.filter(id=collection.id).update(reindexing_status=ReindexingStatusChoices.REINDEXING_NOT_NEEDED) + try: + send_slack_message( + f"Alert: re-scrape of '{collection.name}' failed ({reason}). " + f"Workflow status was left unchanged; set Re-Indexing Needed again to retry." + ) + except Exception as e: + logger.warning("Error sending Slack message for %s: %s", collection.name, e) + + @celery_app.task() def sync_with_production_webapp(): Collection = apps.get_model("sde_collections", "Collection") @@ -87,7 +129,7 @@ def migrate_dump_to_delta_and_handle_status_transistions(collection_id): marked_for_deletion_count=collection.delta_urls.filter(to_delete=True).count(), ) except Exception as e: - print(f"Error sending ingest summary to Slack: {e}") + logger.warning("Error sending ingest summary to Slack for %s: %s", collection.config_folder, e) return f"Successfully migrated DumpUrls to DeltaUrls for collection {collection.name}." @@ -108,9 +150,8 @@ def dispatch_scrape_job(collection_id): try: command_id = send_job_to_crawler(collection) except Exception as e: - print(f"Scrape dispatch failed for {collection.config_folder}: {e}") - collection.workflow_status = WorkflowStatusChoices.SCRAPING_FAILED - collection.save() + logger.exception("Scrape dispatch failed for %s: %s", collection.config_folder, e) + _mark_scrape_failed(collection, f"dispatch error: {e}") return None ScrapeDispatch.objects.create(collection=collection, ssm_command_id=command_id) @@ -153,23 +194,29 @@ def poll_scrape_jobs(): try: summary = results_ready(collection.config_folder, dispatch.dispatched_at) except Exception as e: - print(f"Error checking S3 results for {collection.config_folder}: {e}") + logger.error("Error checking S3 results for %s: %s", collection.config_folder, e) continue if summary is not None: ingest_scraped_collection.delay(collection.id) enqueued += 1 elif now - dispatch.dispatched_at > stall_timeout: - print( - f"Scrape stalled for {collection.config_folder}: no fresh results " - f"{settings.SCRAPE_STALL_TIMEOUT_HOURS}h after dispatch" + logger.error( + "Scrape stalled for %s: no fresh results %sh after dispatch", + collection.config_folder, + settings.SCRAPE_STALL_TIMEOUT_HOURS, ) - collection.workflow_status = WorkflowStatusChoices.SCRAPING_FAILED - collection.save() + _mark_scrape_failed(collection, f"no results {settings.SCRAPE_STALL_TIMEOUT_HOURS}h after dispatch") return f"Enqueued ingest for {enqueued} collection(s)." +PROD_STATUS_FOR_QC_STATUS = { + WorkflowStatusChoices.QUALITY_CHECK_PERFECT: WorkflowStatusChoices.PROD_PERFECT, + WorkflowStatusChoices.QUALITY_CHECK_MINOR: WorkflowStatusChoices.PROD_MINOR, +} + + def _mint_run_id(): import uuid @@ -183,7 +230,6 @@ def _dispatch_index_run(collection_id, target, in_flight_status, failed_status): last) -> RunTask -> record IndexDispatch -> set the in-flight status. Never indexes in-process; failure lands on the target's failed status and never raises.""" Collection = apps.get_model("sde_collections", "Collection") - IndexDispatch = apps.get_model("sde_collections", "IndexDispatch") collection = Collection.objects.get(id=collection_id) run_id = _mint_run_id() previous_status = collection.workflow_status @@ -194,7 +240,7 @@ def _dispatch_index_run(collection_id, target, in_flight_status, failed_status): raise ValueError("curated set is empty — nothing to index") task_arn = run_index_task(collection, target, run_id) except Exception as e: - print(f"Index dispatch ({target}) failed for {collection.config_folder}: {e}") + logger.exception("Index dispatch (%s) failed for %s: %s", target, collection.config_folder, e) collection.workflow_status = failed_status collection.save() return None @@ -208,7 +254,9 @@ def _dispatch_index_run(collection_id, target, in_flight_status, failed_status): ) collection.workflow_status = in_flight_status collection.save() - print(f"Dispatched {target} index run {run_id} for {collection.config_folder} ({document_count} documents)") + logger.info( + "Dispatched %s index run %s for %s (%s documents)", target, run_id, collection.config_folder, document_count + ) return run_id @@ -217,7 +265,7 @@ def index_collection_to_test(collection_id): """Hand a curated collection to the WEB_COSMOS indexer, test target.""" return _dispatch_index_run( collection_id, - target="test", + target=IndexDispatch.TARGET_TEST, in_flight_status=WorkflowStatusChoices.TEST_INDEXING, failed_status=WorkflowStatusChoices.INDEXING_FAILED_ON_TEST, ) @@ -228,7 +276,7 @@ def index_collection_to_prod(collection_id): """Hand a QC-passed collection to the WEB_COSMOS indexer, prod target.""" return _dispatch_index_run( collection_id, - target="prod", + target=IndexDispatch.TARGET_PROD, in_flight_status=WorkflowStatusChoices.PRODUCTION_INDEXING, failed_status=WorkflowStatusChoices.INDEXING_FAILED_ON_PROD, ) @@ -252,8 +300,8 @@ def poll_index_runs(): Collection = apps.get_model("sde_collections", "Collection") failed_status_for_target = { - "test": WorkflowStatusChoices.INDEXING_FAILED_ON_TEST, - "prod": WorkflowStatusChoices.INDEXING_FAILED_ON_PROD, + IndexDispatch.TARGET_TEST: WorkflowStatusChoices.INDEXING_FAILED_ON_TEST, + IndexDispatch.TARGET_PROD: WorkflowStatusChoices.INDEXING_FAILED_ON_PROD, } stall_timeout = timedelta(hours=settings.INDEX_STALL_TIMEOUT_HOURS) now = timezone.now() @@ -273,12 +321,12 @@ def poll_index_runs(): try: status = fetch_run_status(collection.config_folder, dispatch.run_id) except Exception as e: - print(f"Error checking index run for {collection.config_folder}: {e}") + logger.error("Error checking index run for %s: %s", collection.config_folder, e) continue if status is None: if now - dispatch.dispatched_at > stall_timeout: - print(f"Index run stalled for {collection.config_folder} (run {dispatch.run_id})") + logger.error("Index run stalled for %s (run %s)", collection.config_folder, dispatch.run_id) collection.workflow_status = failed_status_for_target[dispatch.target] collection.save() dispatch.completed_at = now @@ -288,28 +336,45 @@ def poll_index_runs(): state = status.get("state") if state == "succeeded": - if dispatch.target == "test": + if dispatch.target == IndexDispatch.TARGET_TEST: # Collection stays at TEST_INDEXING; the curator sets QC from the report. try: validation = fetch_validation_report(collection.config_folder, dispatch.run_id) send_indexing_validation_report(collection.name, dispatch.run_id, validation) except Exception as e: - print(f"Error posting validation report for {collection.config_folder}: {e}") + logger.warning("Error posting validation report for %s: %s", collection.config_folder, e) else: - mirror = { - WorkflowStatusChoices.QUALITY_CHECK_MINOR: WorkflowStatusChoices.PROD_MINOR, - } - collection.workflow_status = mirror.get( - dispatch.previous_workflow_status, WorkflowStatusChoices.PROD_PERFECT - ) - collection.save() + # Explicit map only: a prod run entered from anything other than a QC + # status (e.g. a manual re-dispatch) stays at PRODUCTION_INDEXING for a + # human to resolve rather than being silently promoted. + mirrored = PROD_STATUS_FOR_QC_STATUS.get(dispatch.previous_workflow_status) + if mirrored is None: + logger.warning( + "Prod index run %s for %s succeeded but entered from status %r; " + "leaving PRODUCTION_INDEXING for manual resolution", + dispatch.run_id, + collection.config_folder, + dispatch.previous_workflow_status, + ) + try: + send_slack_message( + f"Prod indexing of '{collection.name}' succeeded (run {dispatch.run_id}) but the run " + f"was not started from a QC status. Please set the final Prod status by hand." + ) + except Exception as e: + logger.warning("Error sending Slack message for %s: %s", collection.name, e) + else: + collection.workflow_status = mirrored + collection.save() else: # "failed" and any unknown state are both failures — needs_confirmation is # reserved for future two-phase deletion and must not read as success. - error = status.get("error") - print( - f"Index run for {collection.config_folder} (run {dispatch.run_id}) " - f"ended state={state!r} error={error!r}" + logger.error( + "Index run for %s (run %s) ended state=%r error=%r", + collection.config_folder, + dispatch.run_id, + state, + status.get("error"), ) collection.workflow_status = failed_status_for_target[dispatch.target] collection.save() @@ -347,10 +412,11 @@ def ingest_scraped_collection(collection_id, claim=True): # Zero-document completion is a failure: without this, an empty crawl would # "succeed" and silently publish an empty collection. if summary.get("documents_scraped", 0) == 0: - Collection.objects.filter(id=collection_id).update(workflow_status=WorkflowStatusChoices.SCRAPING_FAILED) + _mark_scrape_failed(collection, "crawl completed with 0 documents") return f"Scrape of {cid} completed with 0 documents; marked Scraping Failed." if claim: + old_status = collection.workflow_status claimed = Collection.objects.filter( id=collection_id, workflow_status__in=[ @@ -358,7 +424,10 @@ def ingest_scraped_collection(collection_id, claim=True): WorkflowStatusChoices.ENGINEERING_IN_PROGRESS, ], ).update(workflow_status=WorkflowStatusChoices.SCRAPING_SUCCESSFUL) - if claimed == 0: + if claimed: + # .update() bypasses post_save, so post the transition message ourselves. + notify_status_change(collection.name, collection.id, old_status, WorkflowStatusChoices.SCRAPING_SUCCESSFUL) + else: # Workflow path not claimable — try the re-scrape path. claimed = Collection.objects.filter( id=collection_id, @@ -368,7 +437,7 @@ def ingest_scraped_collection(collection_id, claim=True): return f"{cid} already claimed by another ingest; exiting." try: - documents = fetch_documents(cid) + documents = _dedupe_by_url(fetch_documents(cid), cid) with transaction.atomic(): deleted_count, _ = DumpUrl.objects.filter(collection=collection).delete() batch_size = 500 @@ -384,13 +453,34 @@ def ingest_scraped_collection(collection_id, claim=True): for document in documents[start : start + batch_size] # noqa: E203 ] ) - print(f"Ingested {len(documents)} documents for {cid} (replaced {deleted_count}).") + logger.info("Ingested %s documents for %s (replaced %s).", len(documents), cid, deleted_count) collection.refresh_from_db() collection.queue_necessary_classifications() return f"Ingested {len(documents)} documents for {cid}." except Exception as e: # Never leave a claimed collection stuck in SCRAPING_SUCCESSFUL with no DumpUrls. - print(f"Ingest failed for {cid}: {e}") - Collection.objects.filter(id=collection_id).update(workflow_status=WorkflowStatusChoices.SCRAPING_FAILED) + # On the re-scrape path the live workflow status is left alone (see _mark_scrape_failed). + logger.exception("Ingest failed for %s: %s", cid, e) + _mark_scrape_failed(collection, f"ingest error: {e}") return None + + +def _dedupe_by_url(documents, cid): + """Drop repeated URLs within one crawl output (first occurrence wins). + + BaseUrl.url is unique, so a single duplicate would otherwise abort the whole + bulk_create inside the atomic block. + """ + seen = set() + unique = [] + for document in documents: + url = document.get("url") + if not url or url in seen: + continue + seen.add(url) + unique.append(document) + dropped = len(documents) - len(unique) + if dropped: + logger.warning("Dropped %s duplicate/blank-URL documents from crawl output for %s", dropped, cid) + return unique diff --git a/sde_collections/tests/test_indexing_dispatch.py b/sde_collections/tests/test_indexing_dispatch.py index 5bbb246e..f8017a99 100644 --- a/sde_collections/tests/test_indexing_dispatch.py +++ b/sde_collections/tests/test_indexing_dispatch.py @@ -36,7 +36,7 @@ SDE_INDEX_BUCKET="sde-cosmos-indexing-dev", INDEXING_ECS_CLUSTER="api-scrapers-cluster-dev", INDEXING_TASK_FAMILY="web_cosmos-scraper-dev", - INDEXING_DISPATCH_ROLE_ARN="arn:aws:iam::998871305517:role/CosmosIndexingDispatchRole-dev", + INDEXING_DISPATCH_ROLE_ARN="arn:aws:iam::123456789012:role/CosmosIndexingDispatchRole-dev", ) @@ -183,6 +183,43 @@ def test_dispatch_assumes_role_and_runs_task(self, mock_session, mock_boto3_clie RUN_ID, ] + def _run_with_network(self, subnets, security_groups, assign_public_ip=True): + collection = CollectionFactory() + with ( + override_settings( + **INDEXING_SETTINGS, + INDEXING_SUBNETS=subnets, + INDEXING_SECURITY_GROUPS=security_groups, + INDEXING_ASSIGN_PUBLIC_IP=assign_public_ip, + ), + patch("sde_collections.indexing.dispatch.boto3.client") as mock_boto3_client, + patch("sde_collections.indexing.dispatch.get_boto3_session") as mock_session, + ): + mock_session.return_value.client.return_value.assume_role.return_value = { + "Credentials": {"AccessKeyId": "AK", "SecretAccessKey": "SK", "SessionToken": "TOK"} + } + ecs = mock_boto3_client.return_value + ecs.run_task.return_value = {"tasks": [{"taskArn": "arn:aws:ecs:task/1"}], "failures": []} + run_index_task(collection, "test", RUN_ID) + return ecs.run_task.call_args.kwargs + + def test_network_config_is_built_from_settings(self): + kwargs = self._run_with_network("subnet-a,subnet-b", "sg-1", assign_public_ip=False) + + assert kwargs["networkConfiguration"]["awsvpcConfiguration"] == { + "subnets": ["subnet-a", "subnet-b"], + "securityGroups": ["sg-1"], + "assignPublicIp": "DISABLED", + } + + def test_no_network_config_when_both_blank(self): + assert "networkConfiguration" not in self._run_with_network("", "") + + def test_subnets_without_security_groups_refuse_to_dispatch(self): + """Half-configured networking must fail loudly, not send an empty securityGroups list.""" + with pytest.raises(ValueError, match="INDEXING_SUBNETS and INDEXING_SECURITY_GROUPS"): + self._run_with_network("subnet-a", "") + @override_settings(**INDEXING_SETTINGS) @patch("sde_collections.indexing.dispatch.boto3.client") @patch("sde_collections.indexing.dispatch.get_boto3_session") @@ -362,6 +399,25 @@ def test_prod_success_mirrors_entering_qc_status(self, mock_status, entered_with collection.refresh_from_db() assert collection.workflow_status == expected + def test_prod_success_from_non_qc_status_holds_for_manual_resolution(self): + """The mirror map is explicit: a prod run that did not enter from a QC status + (e.g. a manual re-dispatch) is never silently promoted to PROD_PERFECT.""" + collection = CollectionFactory(workflow_status=WorkflowStatusChoices.PRODUCTION_INDEXING) + dispatch = _dispatched(collection, "prod", WorkflowStatusChoices.INDEXING_FAILED_ON_PROD) + + with ( + patch("sde_collections.tasks.fetch_run_status", return_value={"state": "succeeded"}), + patch("sde_collections.tasks.send_slack_message") as mock_slack, + ): + poll_index_runs() + + collection.refresh_from_db() + assert collection.workflow_status == WorkflowStatusChoices.PRODUCTION_INDEXING + dispatch.refresh_from_db() + assert dispatch.completed_at is not None # resolved: not re-polled + mock_slack.assert_called_once() + assert "by hand" in mock_slack.call_args.args[0] + @pytest.mark.parametrize("state", ["failed", "needs_confirmation", "something_new"]) @patch("sde_collections.tasks.fetch_run_status") def test_failed_and_unknown_states_land_on_failed_status(self, mock_status, state): diff --git a/sde_collections/tests/test_management_commands.py b/sde_collections/tests/test_management_commands.py new file mode 100644 index 00000000..8c2988c3 --- /dev/null +++ b/sde_collections/tests/test_management_commands.py @@ -0,0 +1,65 @@ +# docker-compose -f local.yml run --rm django pytest sde_collections/tests/test_management_commands.py + +from io import StringIO +from unittest.mock import patch + +import pytest +from django.core.management import call_command +from django.core.management.base import CommandError + +from sde_collections.tests.factories import CollectionFactory + + +@pytest.mark.django_db +class TestDispatchScrapeCommand: + def test_unknown_collection_is_a_command_error(self): + with pytest.raises(CommandError, match="No collection"): + call_command("dispatch_scrape", collection="does_not_exist") + + @patch("sde_collections.management.commands.dispatch_scrape.dispatch_scrape_job", return_value="cmd-1") + def test_runs_the_task_synchronously_and_reports_command_id(self, mock_task): + collection = CollectionFactory() + out = StringIO() + + call_command("dispatch_scrape", collection=collection.config_folder, stdout=out) + + mock_task.assert_called_once_with(collection.id) # called directly, not .delay + assert "cmd-1" in out.getvalue() + + @patch("sde_collections.management.commands.dispatch_scrape.dispatch_scrape_job", return_value=None) + def test_dispatch_failure_is_a_command_error(self, mock_task): + collection = CollectionFactory() + + with pytest.raises(CommandError, match="Dispatch failed"): + call_command("dispatch_scrape", collection=collection.config_folder) + + +@pytest.mark.django_db +class TestIngestScrapeResultsCommand: + def test_unknown_collection_is_a_command_error(self): + with pytest.raises(CommandError, match="No collection"): + call_command("ingest_scrape_results", collection="does_not_exist") + + @patch( + "sde_collections.management.commands.ingest_scrape_results.ingest_scraped_collection", + return_value="Ingested 3 documents", + ) + def test_manual_ingest_skips_the_claim(self, mock_task): + """The command's contract: explicit operator intent bypasses the status CAS.""" + collection = CollectionFactory() + out = StringIO() + + call_command("ingest_scrape_results", collection=collection.config_folder, stdout=out) + + mock_task.assert_called_once_with(collection.id, claim=False) + assert "Ingested 3 documents" in out.getvalue() + + @patch( + "sde_collections.management.commands.ingest_scrape_results.ingest_scraped_collection", + return_value=None, + ) + def test_ingest_failure_is_a_command_error(self, mock_task): + collection = CollectionFactory() + + with pytest.raises(CommandError, match="Ingest failed"): + call_command("ingest_scrape_results", collection=collection.config_folder) diff --git a/sde_collections/tests/test_scrape_dispatch.py b/sde_collections/tests/test_scrape_dispatch.py index dd5d9f62..88a4dad9 100644 --- a/sde_collections/tests/test_scrape_dispatch.py +++ b/sde_collections/tests/test_scrape_dispatch.py @@ -5,7 +5,7 @@ from unittest.mock import MagicMock, patch import pytest -from django.test import override_settings +from django.test import TestCase, override_settings from sde_collections.models.collection import Collection from sde_collections.models.collection_choice_fields import ( @@ -59,11 +59,13 @@ def test_max_pages_above_crawler_cap_raises(self): @pytest.mark.django_db class TestStatusTriggersDispatch: + # Triggers enqueue on commit; the test transaction never commits, so run the hooks. @patch("sde_collections.tasks.dispatch_scrape_job.delay") def test_ready_for_engineering_dispatches_scrape_job(self, mock_delay): collection = CollectionFactory() collection.workflow_status = WorkflowStatusChoices.READY_FOR_ENGINEERING - collection.save() + with TestCase.captureOnCommitCallbacks(execute=True): + collection.save() mock_delay.assert_called_once_with(collection.id) @@ -71,7 +73,8 @@ def test_ready_for_engineering_dispatches_scrape_job(self, mock_delay): def test_reindexing_needed_dispatches_scrape_job(self, mock_delay): collection = CollectionFactory() collection.reindexing_status = ReindexingStatusChoices.REINDEXING_NEEDED_ON_DEV - collection.save() + with TestCase.captureOnCommitCallbacks(execute=True): + collection.save() mock_delay.assert_called_once_with(collection.id) @@ -82,7 +85,8 @@ def test_ready_for_engineering_no_longer_touches_sinequa_configs(self, mock_dela collection = CollectionFactory() collection.workflow_status = WorkflowStatusChoices.READY_FOR_ENGINEERING - collection.save() + with TestCase.captureOnCommitCallbacks(execute=True): + collection.save() mock_delay.assert_called_once_with(collection.id) assert not hasattr(Collection, "create_scraper_config") @@ -109,6 +113,14 @@ def _dispatch(self, collection): command_id = send_job_to_crawler(collection) return command_id, ssm.send_command.call_args.kwargs + def test_unconfigured_crawler_refuses_to_dispatch(self): + """A host without the crawler wired must fail loudly on the settings guard rather + than send an SSM command to InstanceIds=[""].""" + collection = CollectionFactory() + with override_settings(CRAWLER_INSTANCE_ID=""): + with pytest.raises(ValueError, match="CRAWLER_INSTANCE_ID"): + send_job_to_crawler(collection) + def test_command_targets_crawler_instance_and_returns_command_id(self): collection = CollectionFactory() @@ -185,6 +197,23 @@ def test_ssm_failure_sets_scraping_failed_and_does_not_raise(self, mock_send): assert collection.workflow_status == WorkflowStatusChoices.SCRAPING_FAILED assert not ScrapeDispatch.objects.filter(collection=collection).exists() + @patch("sde_collections.tasks.send_slack_message") + @patch("sde_collections.tasks.send_job_to_crawler", side_effect=Exception("SSM unreachable")) + def test_rescrape_dispatch_failure_leaves_prod_status_alone(self, mock_send, mock_slack): + """On the re-scrape path the live workflow status (PROD_*) must not be rewritten; + the reindexing request is cleared and an alert is posted instead.""" + collection = CollectionFactory( + workflow_status=WorkflowStatusChoices.PROD_PERFECT, + reindexing_status=ReindexingStatusChoices.REINDEXING_NEEDED_ON_DEV, + ) + + assert dispatch_scrape_job(collection.id) is None + + collection.refresh_from_db() + assert collection.workflow_status == WorkflowStatusChoices.PROD_PERFECT + assert collection.reindexing_status == ReindexingStatusChoices.REINDEXING_NOT_NEEDED + mock_slack.assert_called_once() + @patch("sde_collections.tasks.send_job_to_crawler", return_value="cmd-2") def test_redispatch_keeps_prior_dispatch_rows(self, mock_send): """Rows are never deleted — the poller takes the latest per collection.""" diff --git a/sde_collections/tests/test_scrape_ingest.py b/sde_collections/tests/test_scrape_ingest.py index 43077c1b..776e06b0 100644 --- a/sde_collections/tests/test_scrape_ingest.py +++ b/sde_collections/tests/test_scrape_ingest.py @@ -133,6 +133,68 @@ def test_ingest_failure_after_claim_sets_scraping_failed(self, mock_ready, mock_ collection.refresh_from_db() assert collection.workflow_status == WorkflowStatusChoices.SCRAPING_FAILED + @patch("sde_collections.tasks.notify_status_change") + @patch("sde_collections.tasks.migrate_dump_to_delta_and_handle_status_transistions.delay") + @patch("sde_collections.tasks.fetch_documents") + @patch("sde_collections.tasks.results_ready") + def test_claim_posts_the_scraping_successful_notification(self, mock_ready, mock_docs, mock_migrate, mock_notify): + """The claim is a queryset .update() (no post_save), so the task must post the + READY_FOR_ENGINEERING -> SCRAPING_SUCCESSFUL message itself.""" + collection = CollectionFactory(workflow_status=WorkflowStatusChoices.READY_FOR_ENGINEERING) + ScrapeDispatch.objects.create(collection=collection, ssm_command_id="cmd-1") + mock_ready.return_value = make_summary(1) + mock_docs.return_value = make_documents(1) + + ingest_scraped_collection(collection.id) + + mock_notify.assert_called_once_with( + collection.name, + collection.id, + WorkflowStatusChoices.READY_FOR_ENGINEERING, + WorkflowStatusChoices.SCRAPING_SUCCESSFUL, + ) + + @patch("sde_collections.tasks.send_slack_message") + @patch("sde_collections.tasks.fetch_documents", side_effect=Exception("S3 read died")) + @patch("sde_collections.tasks.results_ready") + def test_rescrape_ingest_failure_leaves_workflow_status_alone(self, mock_ready, mock_docs, mock_slack): + """A re-scrape hiccup must never rewrite a production collection's workflow status.""" + collection = CollectionFactory( + workflow_status=WorkflowStatusChoices.PROD_PERFECT, + reindexing_status=ReindexingStatusChoices.REINDEXING_NEEDED_ON_DEV, + ) + ScrapeDispatch.objects.create(collection=collection, ssm_command_id="cmd-1") + mock_ready.return_value = make_summary(2) + + assert ingest_scraped_collection(collection.id) is None + + collection.refresh_from_db() + assert collection.workflow_status == WorkflowStatusChoices.PROD_PERFECT + # Cleared so the poller does not re-enqueue the same failed run every 5 minutes. + assert collection.reindexing_status == ReindexingStatusChoices.REINDEXING_NOT_NEEDED + mock_slack.assert_called_once() + + @patch("sde_collections.tasks.migrate_dump_to_delta_and_handle_status_transistions.delay") + @patch("sde_collections.tasks.fetch_documents") + @patch("sde_collections.tasks.results_ready") + def test_duplicate_urls_in_crawl_output_are_dropped(self, mock_ready, mock_docs, mock_migrate): + """BaseUrl.url is unique: one repeated URL must not abort the whole bulk_create.""" + collection = CollectionFactory(workflow_status=WorkflowStatusChoices.READY_FOR_ENGINEERING) + ScrapeDispatch.objects.create(collection=collection, ssm_command_id="cmd-1") + documents = make_documents(3) + documents.append(dict(documents[0], title="Duplicate of page 0")) + documents.append({"url": "", "title": "blank url"}) + mock_ready.return_value = make_summary(len(documents)) + mock_docs.return_value = documents + + ingest_scraped_collection(collection.id) + + dumps = DumpUrl.objects.filter(collection=collection) + assert dumps.count() == 3 + assert dumps.get(url=documents[0]["url"]).scraped_title == "Page 0" # first occurrence wins + collection.refresh_from_db() + assert collection.workflow_status == WorkflowStatusChoices.SCRAPING_SUCCESSFUL + @patch("sde_collections.tasks.send_detailed_import_notification") @patch("sde_collections.tasks.fetch_documents") @patch("sde_collections.tasks.results_ready") diff --git a/sde_collections/tests/test_signals.py b/sde_collections/tests/test_signals.py new file mode 100644 index 00000000..e9546dac --- /dev/null +++ b/sde_collections/tests/test_signals.py @@ -0,0 +1,66 @@ +# docker-compose -f local.yml run --rm django pytest sde_collections/tests/test_signals.py + +from types import SimpleNamespace + +import pytest +from django.test import override_settings + +from sde_collections.signals import ( + POLL_INDEX_TASK, + POLL_INDEX_TASK_NAME, + POLL_SCRAPE_TASK, + POLL_SCRAPE_TASK_NAME, + create_periodic_tasks, +) + + +def _run_post_migrate_handler(app_label="sde_collections"): + create_periodic_tasks(sender=SimpleNamespace(name=app_label)) + + +def _rows(): + from django_celery_beat.models import PeriodicTask + + return {row.name: row for row in PeriodicTask.objects.filter(task__in=[POLL_SCRAPE_TASK, POLL_INDEX_TASK])} + + +@pytest.mark.django_db +@pytest.mark.parametrize("scrape_flag,index_flag", [(False, False), (True, False), (False, True), (True, True)]) +def test_poller_rows_follow_their_flags(scrape_flag, index_flag): + with override_settings(SCRAPE_POLL_ENABLED=scrape_flag, INDEX_POLL_ENABLED=index_flag): + _run_post_migrate_handler() + + rows = _rows() + assert rows[POLL_SCRAPE_TASK_NAME].enabled is scrape_flag + assert rows[POLL_SCRAPE_TASK_NAME].crontab.minute == "*/5" + assert rows[POLL_INDEX_TASK_NAME].enabled is index_flag + assert rows[POLL_INDEX_TASK_NAME].crontab.minute == "*/2" + + +@pytest.mark.django_db +@override_settings(SCRAPE_POLL_ENABLED=False, INDEX_POLL_ENABLED=False) +def test_flag_is_reasserted_on_every_migrate(): + """The flag, not an admin hand-edit, is the source of truth: a hand-enable is + reverted by the next deploy's migrate step (and vice versa).""" + from django_celery_beat.models import PeriodicTask + + _run_post_migrate_handler() + PeriodicTask.objects.filter(task__in=[POLL_SCRAPE_TASK, POLL_INDEX_TASK]).update(enabled=True) + + _run_post_migrate_handler() + + assert all(row.enabled is False for row in _rows().values()) + assert len(_rows()) == 2 # updated in place, never duplicated + + +@pytest.mark.django_db +@override_settings(SCRAPE_POLL_ENABLED=True, INDEX_POLL_ENABLED=True) +def test_handler_ignores_other_apps(): + from django_celery_beat.models import PeriodicTask + + # Test-DB setup already ran the real post_migrate; start from a clean slate. + PeriodicTask.objects.filter(task__in=[POLL_SCRAPE_TASK, POLL_INDEX_TASK]).delete() + + _run_post_migrate_handler(app_label="inference") + + assert _rows() == {} diff --git a/sde_collections/tests/test_workflow_status_triggers.py b/sde_collections/tests/test_workflow_status_triggers.py index f26b29ee..46b44d20 100644 --- a/sde_collections/tests/test_workflow_status_triggers.py +++ b/sde_collections/tests/test_workflow_status_triggers.py @@ -25,8 +25,22 @@ def test_ready_for_engineering_triggers_scrape_dispatch(self, mock_dispatch): """When status changes to READY_FOR_ENGINEERING, it should dispatch a scrape job (P3: replaces the Sinequa create_scraper_config/create_scraper_job trigger).""" self.collection.workflow_status = WorkflowStatusChoices.READY_FOR_ENGINEERING - self.collection.save() + with self.captureOnCommitCallbacks(execute=True): + self.collection.save() + + mock_dispatch.assert_called_once_with(self.collection.id) + + @patch("sde_collections.tasks.dispatch_scrape_job.delay") + def test_task_is_enqueued_only_after_commit(self, mock_dispatch): + """Tasks are enqueued via transaction.on_commit so a worker can never read the + collection (or promote_to_curated's rows) before the triggering save commits.""" + self.collection.workflow_status = WorkflowStatusChoices.READY_FOR_ENGINEERING + with self.captureOnCommitCallbacks() as callbacks: + self.collection.save() + mock_dispatch.assert_not_called() + assert len(callbacks) == 1 + callbacks[0]() mock_dispatch.assert_called_once_with(self.collection.id) def _save_and_assert_no_triggers(self, **status_updates): @@ -41,7 +55,8 @@ def _save_and_assert_no_triggers(self, **status_updates): ): for field, value in status_updates.items(): setattr(self.collection, field, value) - self.collection.save() + with self.captureOnCommitCallbacks(execute=True): + self.collection.save() mock_dispatch.assert_not_called() mock_test.assert_not_called() @@ -83,7 +98,8 @@ def test_no_sinequa_methods_remain(self): def test_curated_promotes_and_enqueues_test_indexing(self, mock_promote, mock_index_test): """CURATED promotes DeltaUrls to CuratedUrls AND hands off to test indexing.""" self.collection.workflow_status = WorkflowStatusChoices.CURATED - self.collection.save() + with self.captureOnCommitCallbacks(execute=True): + self.collection.save() mock_promote.assert_called_once() mock_index_test.assert_called_once_with(self.collection.id) @@ -94,7 +110,8 @@ def test_quality_check_statuses_enqueue_prod_indexing(self, mock_index_prod): for status in [WorkflowStatusChoices.QUALITY_CHECK_PERFECT, WorkflowStatusChoices.QUALITY_CHECK_MINOR]: collection = CollectionFactory() collection.workflow_status = status - collection.save() + with self.captureOnCommitCallbacks(execute=True): + collection.save() mock_index_prod.assert_called_with(collection.id) assert mock_index_prod.call_count == 2 @@ -112,7 +129,8 @@ def promote_and_save_again(): side_effect=promote_and_save_again, ) as mock_promote: self.collection.workflow_status = WorkflowStatusChoices.CURATED - self.collection.save() + with self.captureOnCommitCallbacks(execute=True): + self.collection.save() mock_promote.assert_called_once() mock_index_test.assert_called_once() @@ -135,6 +153,15 @@ def test_mapped_transition_sends_message_once(self, mock_send, mock_dispatch): assert self.collection.name in message assert "Ready for engineering" in message + def test_prod_handoff_transitions_are_mapped(self): + """The prod hand-off goes QC_* -> PRODUCTION_INDEXING -> PROD_*; the 'live on prod' + message must be keyed on the transition the poller actually makes.""" + from sde_collections.utils.slack_utils import STATUS_CHANGE_NOTIFICATIONS + + for final in [WorkflowStatusChoices.PROD_PERFECT, WorkflowStatusChoices.PROD_MINOR]: + details = STATUS_CHANGE_NOTIFICATIONS[(WorkflowStatusChoices.PRODUCTION_INDEXING, final)] + assert "live on Public Prod" in details["message"] + @patch("sde_collections.models.collection.send_slack_message") def test_unmapped_transition_sends_nothing(self, mock_send): self.collection.workflow_status = WorkflowStatusChoices.MERGE_PENDING diff --git a/sde_collections/utils/generate_deployment_message.py b/sde_collections/utils/generate_deployment_message.py index 19ecd2ec..eb91ea15 100644 --- a/sde_collections/utils/generate_deployment_message.py +++ b/sde_collections/utils/generate_deployment_message.py @@ -12,7 +12,7 @@ def generate_deployment_message(collection_config_folders): to our production environment as part of our latest deployment! :tada:\n Collections Now Live in Prod:\n""" - message_middle = "\n\n".join([f"- {collection.name} | {collection.server_url_prod}" for collection in collections]) + message_middle = "\n\n".join([f"- {collection.name}" for collection in collections]) message_end = """ If you find something needs changing, please let us know. diff --git a/sde_collections/utils/slack_utils.py b/sde_collections/utils/slack_utils.py index baff671f..4cc40a91 100644 --- a/sde_collections/utils/slack_utils.py +++ b/sde_collections/utils/slack_utils.py @@ -1,8 +1,12 @@ +import logging + import requests from django.conf import settings from ..models.collection_choice_fields import WorkflowStatusChoices +logger = logging.getLogger(__name__) + SLACK_ID_MAPPING = { "Shravan Vishwanathan": "<@U056B4HMGEP>", "Advait Yogaonkar": "<@U06L5SKQ5QA>", @@ -46,6 +50,17 @@ "message": "{name} is now live on Public Prod! Congrats team! :sparkles:", "mention_users": ["channel"], }, + # The prod hand-off passes through PRODUCTION_INDEXING, so the transition the poller + # actually makes is PRODUCTION_INDEXING -> PROD_*; keep the QC_* -> PROD_* pairs above + # for the manual/legacy path. + (WorkflowStatusChoices.PRODUCTION_INDEXING, WorkflowStatusChoices.PROD_PERFECT): { + "message": "{name} is now live on Public Prod! Congrats team! :sparkles:", + "mention_users": ["channel"], + }, + (WorkflowStatusChoices.PRODUCTION_INDEXING, WorkflowStatusChoices.PROD_MINOR): { + "message": "{name} is now live on Public Prod! Congrats team! :sparkles:", + "mention_users": ["channel"], + }, # --- SDE curation pipeline (crawl4ai scraper + web indexing) --- # Detailed scrape counts are posted separately via send_detailed_import_notification on ingest. (WorkflowStatusChoices.READY_FOR_ENGINEERING, WorkflowStatusChoices.SCRAPING_SUCCESSFUL): { @@ -111,7 +126,7 @@ def send_detailed_import_notification( payload = {"text": message} response = requests.post(webhook_url, json=payload) if response.status_code != 200: - print(f"Error sending Slack message: {response.text}") + logger.warning("Error sending Slack message: %s", response.text) def send_indexing_validation_report(collection_name, run_id, validation): @@ -137,6 +152,19 @@ def send_indexing_validation_report(collection_name, run_id, validation): send_slack_message(message) +def notify_status_change(collection_name, collection_id, old_status, new_status): + """Post the mapped message for a transition that was written with a queryset + .update() (which bypasses post_save and therefore the model-level notifier). + No-op for unmapped transitions; never raises.""" + details = STATUS_CHANGE_NOTIFICATIONS.get((old_status, new_status)) + if details is None: + return + try: + send_slack_message(format_slack_message(collection_name, details, collection_id)) + except Exception as e: + logger.warning("Error sending Slack message for %s: %s", collection_name, e) + + def send_slack_message(message): webhook_url = settings.SLACK_WEBHOOK_URL payload = {"text": message} diff --git a/sde_indexing_helper/templates/sde_collections/collection_detail.html b/sde_indexing_helper/templates/sde_collections/collection_detail.html index 9867dc86..c6a1011e 100644 --- a/sde_indexing_helper/templates/sde_collections/collection_detail.html +++ b/sde_indexing_helper/templates/sde_collections/collection_detail.html @@ -30,10 +30,6 @@

    {{ colle

    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≱AaNR_2ip2t0({JbFYTM7sTp?wpEu(7G|%iQ(r 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�Jr*2sZb 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