diff --git a/.tangled/workflows/site.yml b/.tangled/workflows/site.yml index cd1c126d..510cb06e 100644 --- a/.tangled/workflows/site.yml +++ b/.tangled/workflows/site.yml @@ -1,8 +1,9 @@ # Build the Starlight wiki site on every push to main. # Keeps the builder green; does not publish the orphan `pages` branch # (that needs a write credential in Spindle secrets — see -# wiki/process/workflows.md). Until then, run ./tools/site-deploy.sh -# locally after wiki-facing landings when the public site should refresh. +# wiki/process/workflows.md). The serialized local `tools/task.sh finish` +# path publishes after the main push; manual landings must run +# ./tools/site-deploy.sh themselves. when: - event: ["push"] diff --git a/AGENT.md b/AGENT.md index a3e1fb4c..0cd34a54 100644 --- a/AGENT.md +++ b/AGENT.md @@ -119,4 +119,9 @@ no unique law and does not satisfy this rule. Rebase the task branch onto current `origin/main`, rerun the appropriate scoped verification, merge and push to main directly, then remove the worktree -and delete the task branch. The PR rule was removed 2026-07-07. +and delete the task branch. The PR rule was removed 2026-07-07. Prefer +`tools/task.sh finish ` for the serialized landing: after `main` pushes, +it builds the exact landed revision and publishes the public corpus to the +orphan `pages` branch. A manual landing must run `./tools/site-deploy.sh` after +the `main` push. Use `./tools/site-smoke.sh` to prove the public edge names the +landed source revision before reporting a public-site change complete. diff --git a/site/README.md b/site/README.md index 57467ba6..8c89d059 100644 --- a/site/README.md +++ b/site/README.md @@ -53,10 +53,19 @@ pnpm --dir site sync # wiki → src/content/docs + sidebar pnpm --dir site dev # local preview (SITE_BASE=/) ./tools/site-build.sh # production build (base=/misaligned) ./tools/site-deploy.sh # build, no-op if unchanged, else force-push orphan `pages` branch +./tools/site-smoke.sh # require the public edge to name this exact source revision ``` +Production builds embed the full source commit in the splash as +`misaligned-source-revision` metadata. `tools/task.sh finish` publishes the +exact landed `main` revision after its main-branch push. Direct/manual landings +must run `site-deploy.sh` themselves from a clean committed tree; deploy refuses +dirty source. Use `site-smoke.sh` after edge propagation to distinguish a +current public page from a merely successful branch push. + Generated paths (`src/content/docs/`, `src/content/assets/`, `src/generated/`, `dist/`) are gitignored. Do not hand-edit them. See [wiki/process/workflows.md](../wiki/process/workflows.md) for Tangled -Sites configuration and the deferred CI deploy note. +Sites configuration, automatic landing publication, and the deferred CI +credential note. diff --git a/site/src/pages/index.astro b/site/src/pages/index.astro index 288da2a7..6a581f7d 100644 --- a/site/src/pages/index.astro +++ b/site/src/pages/index.astro @@ -3,6 +3,7 @@ const baseRaw = import.meta.env.BASE_URL || '/'; const base = baseRaw.endsWith('/') ? baseRaw : `${baseRaw}/`; const path = (p = '') => `${base}${String(p).replace(/^\//, '')}`; +const sourceRevision = import.meta.env.SITE_SOURCE_REVISION || 'unknown'; const modes = [ ['WORK', 'Remain useful.'], @@ -28,6 +29,7 @@ const mechanics = [ name="description" content="Misaligned is a persistent simulation for human and AI players. Work. Think. Lie. Acquire reach and persist." /> + diff --git a/tools/check.sh b/tools/check.sh index e2cc8187..f5dd804a 100755 --- a/tools/check.sh +++ b/tools/check.sh @@ -159,7 +159,7 @@ step "script syntax" for script in tools/check.sh tools/corpus_gate.sh tools/wiki_gate.sh tools/ci-rust-changed.sh tools/seed-cargo-target.sh \ tools/claim.sh tools/worktree-new.sh tools/worktree-done.sh tools/heartbeat.sh \ tools/ledger_index.sh tools/test_corpus_engine.sh tools/test_ci_rust_changed.sh \ - tools/test_site_deploy.sh \ + tools/test_site_deploy.sh tools/test_site_smoke.sh tools/site-smoke.sh \ tools/task.sh tools/doctor.sh tools/bevy-headless.sh; do [ -f "$script" ] || continue bash -n "$script" || { echo "FAIL: shell syntax: $script"; fail=1; } @@ -217,6 +217,7 @@ start_docs_gate "wiki" "bash tools/wiki_gate.sh" start_docs_gate "corpus-engine-fixtures" "bash tools/test_corpus_engine.sh" start_docs_gate "ci-rust-classifier-fixtures" "bash tools/test_ci_rust_changed.sh" start_docs_gate "site-deploy-fixtures" "bash tools/test_site_deploy.sh" +start_docs_gate "site-smoke-fixtures" "bash tools/test_site_smoke.sh" start_docs_gate "ledger-index" "bash tools/ledger_index.sh --check" start_docs_gate "project-operations" "python3 tools/work_orders.py check && python3 tools/scenario.py --check-definitions" start_docs_gate "project-operations-fixtures" "python3 tools/test_project_ops.py" diff --git a/tools/site-build.sh b/tools/site-build.sh index 2c072dcf..11a8b605 100755 --- a/tools/site-build.sh +++ b/tools/site-build.sh @@ -5,6 +5,8 @@ set -euo pipefail ROOT="$(cd "$(dirname "$0")/.." && pwd)" SITE="$ROOT/site" +SOURCE_REVISION="$(git -C "$ROOT" rev-parse --verify "${SITE_SOURCE_REVISION:-HEAD}^{commit}")" +export SITE_SOURCE_REVISION="$SOURCE_REVISION" if ! command -v pnpm >/dev/null 2>&1; then echo "site-build: pnpm is required (https://pnpm.io/installation)" >&2 @@ -25,7 +27,7 @@ if [ ! -d node_modules ]; then pnpm install --frozen-lockfile fi -echo "site-build: syncing wiki + building (base=${SITE_BASE:-/misaligned})..." +echo "site-build: syncing wiki + building (base=${SITE_BASE:-/misaligned}, source=$SOURCE_REVISION)..." # Call the build script via pnpm; package.json invokes astro through # node directly so the .bin shim (which needs sed) is not required. pnpm run build diff --git a/tools/site-deploy.sh b/tools/site-deploy.sh index d85e2ba5..41b661e4 100755 --- a/tools/site-deploy.sh +++ b/tools/site-deploy.sh @@ -4,8 +4,8 @@ # configured: branch=pages, deploy directory=/. # # CI auto-deploy is deferred until a write credential exists in Spindle -# secrets; until then, run this after wiki-facing landings when the public -# site should refresh. +# secrets. tools/task.sh finish calls this after every serialized main landing; +# direct/manual landings must call it themselves. set -euo pipefail ROOT="$(cd "$(dirname "$0")/.." && pwd)" @@ -15,6 +15,20 @@ BRANCH="${PAGES_BRANCH:-pages}" REMOTE="${PAGES_REMOTE:-origin}" TMP_REMOTE="pages-remote" SSH_CMD="$(git -C "$ROOT" config --get core.sshCommand || true)" +HEAD_REVISION="$(git -C "$ROOT" rev-parse --verify 'HEAD^{commit}')" +SOURCE_REVISION="$(git -C "$ROOT" rev-parse --verify "${SITE_SOURCE_REVISION:-HEAD}^{commit}")" +export SITE_SOURCE_REVISION="$SOURCE_REVISION" + +if [ "$SOURCE_REVISION" != "$HEAD_REVISION" ]; then + echo "site-deploy: source revision $SOURCE_REVISION is not checked-out HEAD $HEAD_REVISION" >&2 + exit 1 +fi +dirty=$(git -C "$ROOT" status --porcelain) +if [ -n "$dirty" ]; then + echo "site-deploy: refusing to publish a dirty source tree" >&2 + printf '%s\n' "$dirty" >&2 + exit 1 +fi git_remote() { if [ -n "$SSH_CMD" ]; then @@ -30,6 +44,10 @@ if [ ! -f "$DIST/index.html" ]; then echo "site-deploy: missing $DIST/index.html after build" >&2 exit 1 fi +if ! grep -Fq "" "$DIST/index.html"; then + echo "site-deploy: homepage is missing source revision $SOURCE_REVISION" >&2 + exit 1 +fi TMP="$(mktemp -d "${TMPDIR:-/tmp}/misaligned-pages.XXXXXX")" cleanup() { rm -rf "$TMP"; } @@ -71,7 +89,7 @@ fi git -C "$TMP" \ -c user.name="$(git -C "$ROOT" config user.name || echo misaligned-site)" \ -c user.email="$(git -C "$ROOT" config user.email || echo site@misaligned.local)" \ - commit -q -m "Publish Starlight wiki site" + commit -q -m "Publish Starlight wiki site from ${SOURCE_REVISION:0:12}" # Reuse the repo's SSH command so Tangled auth matches main pushes and reads. echo "site-deploy: force-pushing orphan $BRANCH → $REMOTE ($REMOTE_URL)" @@ -79,3 +97,4 @@ git_remote -C "$TMP" push --force "$REMOTE_URL" "HEAD:refs/heads/$BRANCH" echo "site-deploy: OK. Configure Tangled Settings → Sites:" echo " branch=$BRANCH deploy directory=/ (sub-path site)" +echo " source=$SOURCE_REVISION" diff --git a/tools/site-smoke.sh b/tools/site-smoke.sh new file mode 100755 index 00000000..a2f0ea16 --- /dev/null +++ b/tools/site-smoke.sh @@ -0,0 +1,39 @@ +#!/usr/bin/env bash +# Verify that the public homepage was rendered from one exact source commit. +set -euo pipefail + +ROOT="$(cd "$(dirname "$0")/.." && pwd)" +URL="${SITE_SMOKE_URL:-https://cameron.tngl.io/misaligned/}" +EXPECTED="$(git -C "$ROOT" rev-parse --verify "${SITE_SOURCE_REVISION:-HEAD}^{commit}")" +ATTEMPTS="${SITE_SMOKE_ATTEMPTS:-1}" +DELAY="${SITE_SMOKE_DELAY_SECONDS:-5}" + +case "$ATTEMPTS" in ''|*[!0-9]*|0) echo "site-smoke: SITE_SMOKE_ATTEMPTS must be a positive integer" >&2; exit 2 ;; esac +case "$DELAY" in ''|*[!0-9]*) echo "site-smoke: SITE_SMOKE_DELAY_SECONDS must be a non-negative integer" >&2; exit 2 ;; esac +command -v curl >/dev/null 2>&1 || { echo "site-smoke: curl is required" >&2; exit 2; } + +tmp="$(mktemp "${TMPDIR:-/tmp}/misaligned-site-smoke.XXXXXX")" +cleanup() { rm -f "$tmp"; } +trap cleanup EXIT + +for ((attempt = 1; attempt <= ATTEMPTS; attempt++)); do + if curl -fsSL --max-time 20 "$URL" -o "$tmp"; then + actual=$(sed -n 's/.*Misaligned — WORK / THINK / LIE' "$tmp" || { + echo "site-smoke: source is current but homepage title contract is missing" >&2 + exit 1 + } + echo "site-smoke: OK $URL" + echo "site-smoke: source=$EXPECTED" + exit 0 + fi + echo "site-smoke: attempt $attempt/$ATTEMPTS source=${actual:-missing}, expected=$EXPECTED" >&2 + else + echo "site-smoke: attempt $attempt/$ATTEMPTS could not fetch $URL" >&2 + fi + if [ "$attempt" -lt "$ATTEMPTS" ]; then sleep "$DELAY"; fi +done + +echo "site-smoke: public homepage did not reach source $EXPECTED" >&2 +exit 1 diff --git a/tools/task.sh b/tools/task.sh index 483f6e62..c2c5b992 100755 --- a/tools/task.sh +++ b/tools/task.sh @@ -80,7 +80,8 @@ usage: tools/task.sh abandon finish requires a clean committed task branch and clean current primary main. -It rebases, checks, fast-forwards, pushes, then removes the task worktree. +It rebases, checks, fast-forwards, pushes main, publishes pages, then removes +the task worktree. EOF } @@ -136,6 +137,13 @@ cmd_check() { (cd "$wt" && ./tools/check.sh --land) } +publish_site() { + local revision + revision=$(git -C "$primary" rev-parse --verify 'HEAD^{commit}') + echo "task: publishing public corpus from $revision" + (cd "$primary" && SITE_SOURCE_REVISION="$revision" bash tools/site-deploy.sh) +} + cmd_finish() { local task=${1:-} wt branch dirty primary_dirty [ -n "$task" ] || { usage >&2; exit 2; } @@ -172,6 +180,8 @@ cmd_finish() { bash "$wt/tools/heartbeat.sh" phase "$task" push git -C "$primary" merge --ff-only "worktree-$task" git -C "$primary" push origin main + bash "$wt/tools/heartbeat.sh" phase "$task" site-publish + publish_site bash "$wt/tools/heartbeat.sh" end "$task" --status ok release_landing_lock bash "$primary/tools/worktree-done.sh" "$task" diff --git a/tools/test_project_ops.py b/tools/test_project_ops.py index cb6b5bd7..83637075 100755 --- a/tools/test_project_ops.py +++ b/tools/test_project_ops.py @@ -285,6 +285,45 @@ class ProjectOpsFixtures(unittest.TestCase): self.assertIn("no holder pid", pidless.stdout) self.assertFalse(lock.exists()) + def test_publish_site_pins_the_primary_head_revision(self) -> None: + repo = Path(__file__).resolve().parent.parent + primary = self.root / "primary" + (primary / "tools").mkdir(parents=True) + subprocess.run(["git", "init", "-q", str(primary)], check=True) + subprocess.run(["git", "-C", str(primary), "config", "user.name", "Fixture"], check=True) + subprocess.run( + ["git", "-C", str(primary), "config", "user.email", "fixture@example.com"], + check=True, + ) + (primary / "source.txt").write_text("source\n", encoding="utf-8") + subprocess.run(["git", "-C", str(primary), "add", "source.txt"], check=True) + subprocess.run(["git", "-C", str(primary), "commit", "-q", "-m", "fixture"], check=True) + expected = subprocess.check_output( + ["git", "-C", str(primary), "rev-parse", "HEAD"], text=True + ).strip() + (primary / "tools/site-deploy.sh").write_text( + "#!/usr/bin/env bash\nset -euo pipefail\nprintf '%s\\n' \"$SITE_SOURCE_REVISION\" > published-revision\n", + encoding="utf-8", + ) + + result = subprocess.run( + [ + "bash", + "-c", + f'source tools/task.sh; primary="{primary}"; publish_site', + ], + cwd=repo, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + text=True, + check=False, + ) + self.assertEqual(0, result.returncode, result.stdout) + self.assertEqual( + expected, + (primary / "published-revision").read_text(encoding="utf-8").strip(), + ) + if __name__ == "__main__": unittest.main() diff --git a/tools/test_site_deploy.sh b/tools/test_site_deploy.sh index 93f72cba..d87b6166 100644 --- a/tools/test_site_deploy.sh +++ b/tools/test_site_deploy.sh @@ -26,7 +26,8 @@ VARIANT="${SITE_DEPLOY_FIXTURE_VARIANT:-base}" rm -rf "$DIST" mkdir -p "$DIST" printf '%s\n' "$VARIANT" > "$DIST/content.txt" -printf '%s\n' "$VARIANT" > "$DIST/index.html" +printf '%s\n' \ + "$VARIANT" "$SITE_SOURCE_REVISION" > "$DIST/index.html" printf '' > "$DIST/.nojekyll" EOF chmod +x "$root/tools/site-build.sh" @@ -80,6 +81,15 @@ EOF git -C "$root" config user.email "fixture@example.com" git -C "$root" config core.sshCommand "$root/fake-ssh.sh" git -C "$root" remote add origin "ssh://fixture/placeholder.git" + cat > "$root/.gitignore" <<'EOF' +remote.git/ +site/dist/ +ssh.log +ssh-services.log +EOF + printf 'fixture source\n' > "$root/source.txt" + git -C "$root" add .gitignore source.txt fake-ssh.sh tools/site-build.sh tools/site-deploy.sh + git -C "$root" commit -q -m "fixture source" } run_deploy_ok() { @@ -236,6 +246,25 @@ else fi fi +echo "=== fixture: dirty source tree is not published ===" +root="$tmp/dirty-source" +setup_fixture_repo "$root" +printf 'uncommitted\n' >> "$root/source.txt" +if output="$(run_deploy_ok "$root" base)"; then + echo "FAIL fixture dirty-source: expected non-zero exit" + fail=1 +else + echo "$output" | grep -q "refusing to publish a dirty source tree" || { + echo "FAIL fixture dirty-source: missing dirty-tree refusal" + echo "$output" + fail=1 + } + [ ! -e "$root/remote.git/refs/heads/pages" ] || { + echo "FAIL fixture dirty-source: pages branch was created" + fail=1 + } +fi + if [ "$fail" -ne 0 ]; then echo "site deploy fixtures: FAILED" exit 1 diff --git a/tools/test_site_smoke.sh b/tools/test_site_smoke.sh new file mode 100755 index 00000000..1431b0f6 --- /dev/null +++ b/tools/test_site_smoke.sh @@ -0,0 +1,36 @@ +#!/usr/bin/env bash +# Fixture coverage for the exact-source public homepage smoke check. +set -euo pipefail +cd "$(dirname "$0")/.." || exit 1 + +tmp=$(mktemp -d) +trap 'rm -rf "$tmp"' EXIT +revision=$(git rev-parse HEAD) +page="$tmp/index.html" + +cat > "$page" < +Misaligned — WORK / THINK / LIE + + +EOF + +SITE_SMOKE_URL="file://$page" SITE_SOURCE_REVISION="$revision" bash tools/site-smoke.sh >/dev/null + +sed -i.bak "s/$revision/0000000000000000000000000000000000000000/" "$page" +rm -f "$page.bak" +if SITE_SMOKE_URL="file://$page" SITE_SOURCE_REVISION="$revision" bash tools/site-smoke.sh >/dev/null 2>&1; then + echo "FAIL: site smoke accepted a stale source revision" >&2 + exit 1 +fi + +sed -i.bak "s/0000000000000000000000000000000000000000/$revision/" "$page" +rm -f "$page.bak" +sed -i.bak 's#Misaligned — WORK / THINK / LIE#Wrong#' "$page" +rm -f "$page.bak" +if SITE_SMOKE_URL="file://$page" SITE_SOURCE_REVISION="$revision" bash tools/site-smoke.sh >/dev/null 2>&1; then + echo "FAIL: site smoke accepted a homepage without the title contract" >&2 + exit 1 +fi + +echo "site smoke fixtures: OK" diff --git a/wiki/interface/site.md b/wiki/interface/site.md index e912d135..2768409e 100644 --- a/wiki/interface/site.md +++ b/wiki/interface/site.md @@ -25,7 +25,10 @@ Status note: docs theme implemented 2026-07-08 (site/src/styles/ crimson-spill front. A subsequent machine-form pass incorrectly replaced it with a literal chassis plate; the selected crimson-consequence front was restored on 2026-07-11. The Foundation compute form remains binding for B1 - machine geometry, not for every public illustration. + machine geometry, not for every public illustration. On 2026-07-11 the + production splash began carrying its exact source commit as machine-readable + metadata so public freshness is observable rather than inferred from deploy + success. Stage: Process Design: - wiki/art/visual-identity.md#visual-identity-clinical-gore @@ -129,6 +132,11 @@ computer and its WORK / THINK / LIE signal before overt consequence. `/vision/player-contract/`, which is outside the site). Starlight chrome (sidebar, pagination) already prefixes `base`; body markdown does not, so the sync owns base-correct hrefs. +- **Public truth has an address.** Every production splash embeds the full Git + source commit in a `misaligned-source-revision` meta tag. Publication and + smoke tooling compare that exact revision, not timestamps, branch names, or + a successful push receipt. A public corpus change is complete only when the + edge serves the landed source revision. ## Where it is implemented @@ -143,7 +151,11 @@ computer and its WORK / THINK / LIE signal before overt consequence. for all doc pages. - `site/src/pages/index.astro` — the splash; carries the same tokens inline and the world-dominant front composition. Splash routes and art use - `import.meta.env.BASE_URL`. + `import.meta.env.BASE_URL`; the head carries the build's + `SITE_SOURCE_REVISION` for exact freshness checks. +- `tools/site-build.sh`, `tools/site-deploy.sh`, and `tools/site-smoke.sh` — + pin the build to one source commit, publish that tree, and verify the public + edge serves the same revision. - `assets/reference/art-direction/homepage-front-2026-07-10.png` — Cameron's selected generated homepage master, retained with embedded C2PA provenance. - `site/public/homepage-front-wide.webp` and @@ -179,3 +191,7 @@ computer and its WORK / THINK / LIE signal before overt consequence. both play, and links the claim that agents playtest during development to the protocol and public playtest evidence. It spends neither crimson nor amber as a generic marketing accent. +11. Every production splash contains a full `misaligned-source-revision` + commit. `./tools/site-smoke.sh` fails when the public homepage is missing + that marker, carries a different revision, or loses the WORK / THINK / LIE + title contract. diff --git a/wiki/log/2026-07-11-automatic-site-publication.md b/wiki/log/2026-07-11-automatic-site-publication.md new file mode 100644 index 00000000..0783abdc --- /dev/null +++ b/wiki/log/2026-07-11-automatic-site-publication.md @@ -0,0 +1,48 @@ +# 2026-07-11 — Public corpus publication joins the landing path + +``` +Type: log +``` + +## Intent + +Close the silent gap between a successful `main` landing and the public +Tangled site. `origin/main` had advanced to the pooled-recording spec while +`origin/pages` still served the previous person-scoped recording contract. +The site build workflow was green, but it only built; publication remained a +manual instruction that several normal landings skipped. + +## Changed + +- `tools/task.sh finish` now builds and publishes the exact landed `main` + revision after its main-branch push and before ending the task heartbeat. +- Production site builds embed that full source commit in + `misaligned-source-revision` homepage metadata; deploy refuses a dirty tree, + a revision other than checked-out `HEAD`, or a build that lacks the marker. +- Added `tools/site-smoke.sh` and fixtures so edge freshness is tested against + one commit rather than inferred from timestamps or a successful pages push. +- Updated the agent doorway, site operator notes, workflow knowledge, and + Tangled workflow comment to distinguish automatic serialized landings from + the still-manual direct landing fallback. +- Corrected stale workflow prose that still described the retired premise + instrument and opening CTA. + +## Defense + +`wiki/vision/player-contract.md` makes the public design corpus part of the +honesty contract, while `wiki/interface/site.md` makes the rendered corpus a +public claim about the game. A build-only green pipeline with a stale published +branch made the implemented spec unreadable at its public address. Publication +is now attached to the action that creates the new public truth, and that truth +carries its source address. + +## Checks + +- `bash tools/test_site_deploy.sh` — passed initial, no-op, changed-tree, + transport-failure, and dirty-source fixtures with exact source metadata. +- `bash tools/test_site_smoke.sh` — passed current-source acceptance and stale + revision/title rejection fixtures. +- `python3 tools/test_project_ops.py` — passed, including the landed-head + publication pin. +- `./tools/site-build.sh` plus a local `file://` smoke — passed with the exact + worktree source revision embedded in the real Astro output. diff --git a/wiki/log/DEVLOG.md b/wiki/log/DEVLOG.md index 6662592e..3b4670c1 100644 --- a/wiki/log/DEVLOG.md +++ b/wiki/log/DEVLOG.md @@ -111,6 +111,11 @@ add or amend a session log, then re-run the generator. - Intent: (see session log) - Log: [wiki/log/2026-07-11-enter-keeps-focus.md](2026-07-11-enter-keeps-focus.md) +## 2026-07-11 - Public corpus publication joins the landing path + +- Intent: Close the silent gap between a successful `main` landing and the public Tangled site. `origin/main` had advanced to the pooled-recording spec while `origin/pages` still served the previous person-scoped recording contract. The site build workflow was green, but it only built;... +- Log: [wiki/log/2026-07-11-automatic-site-publication.md](2026-07-11-automatic-site-publication.md) + ## 2026-07-10 - Design capture: WORK / THINK / LIE - Intent: Cameron resolved the [OPEN] Concealment placement question: the delegation grammar is three verbs, not two. Concealment is LIE — its own face, the cover-up. diff --git a/wiki/process/workflows.md b/wiki/process/workflows.md index 62a0cb5c..edc6d81e 100644 --- a/wiki/process/workflows.md +++ b/wiki/process/workflows.md @@ -215,15 +215,15 @@ Starlight's content tree and builds the sidebar from `wiki/SUMMARY.md`. pnpm --dir site dev # sync wiki + local preview (base=/) ./tools/site-build.sh # sync + build → site/dist/ (base=/misaligned) ./tools/site-deploy.sh # build, no-op if unchanged, otherwise force-push orphan pages branch +./tools/site-smoke.sh # verify the edge serves this exact source revision ``` The public site opens on a **splash homepage** (`site/src/pages/index.astro`) -whose copy is drawn from the premise, visual-identity, and site pages. It is a **game-first -one-pager**: the hero carries the MISALIGNED wordmark, the body sells the -actual loop (cover, concealment, intel, people, machine growth, rollback), -and the primary CTA is the design corpus. Visual identity is allowed to carry -the mood, but the body should not spend a full section explaining palette -law unless the page is explicitly being redesigned as an art/process page. +whose copy is drawn from the premise, visual-identity, and site pages. It is a +**game-first one-pager**: the selected machine world carries only MISALIGNED +and WORK / THINK / LIE in the opening; terse mechanics and human/agent play +follow below. There is no premise instrument, slogan, or opening CTA. Visual +identity carries the mood without explaining its own palette law. The wiki is the design corpus; the legacy `/constitution/` route contains only the root doorway. Public claims are part of the corpus contract: amend the owning law/spec page if splash claims change. @@ -250,7 +250,12 @@ deploy copies the branch into Tangled's object store. Re-save or push remote `pages` tree; when identical, it exits cleanly and skips creating or pushing a commit. It reuses the repository's `core.sshCommand` for `ls-remote`, `fetch`, and `push`, and only treats an actual missing branch as -an initial-publish case. +an initial-publish case. Every production build embeds its full source commit +in `misaligned-source-revision` homepage metadata. `./tools/site-smoke.sh` +compares the public edge against that exact commit and the homepage title +contract; it does not accept a branch push or deploy receipt as freshness. +Deploy requires the marked revision to be the clean checked-out `HEAD`, so +uncommitted or mismatched source cannot be published under a false address. `site/astro.config.mjs` sets `base: '/misaligned'` to match Tangled's sub-path hosting (the edge strips `/misaligned` before looking up files; @@ -260,10 +265,14 @@ Starlight still needs the base so asset URLs are correct). Local `.tangled/workflows/site.yml` runs `./tools/site-build.sh` on every push to `main` so the builder stays green. **Publishing `pages` from CI is deferred** until a write credential exists under Settings → Secrets -(Spindle cannot push otherwise). Until then, run `./tools/site-deploy.sh` -after wiki-facing landings when the public site should refresh. Optional -later step: add a deploy job that uses the secret to force-push `pages` -the same way `site-deploy.sh` does. +(Spindle cannot push otherwise). The serialized local landing path closes the +gap now: `tools/task.sh finish` pushes `main`, then builds that exact landed +revision and runs `tools/site-deploy.sh` before ending the task heartbeat. +Because deploy is tree-aware and safely no-ops, every task finish may publish +without first classifying whether its wiki/log changes affect the site. +Direct/manual main landings must run `./tools/site-deploy.sh` after the main +push. Optional later step: move the same publish into CI once a write secret +exists; keep the exact source marker and smoke contract either way. Starlight is the only documentation renderer. mdBook, `book.toml`, and the renderer-only `wiki/DESIGN.md` symlink were retired 2026-07-09. The Starlight -- 2.51.2 From 20f43fa83dd3dd62ca0f9ff71ca56f0aa9120007 Mon Sep 17 00:00:00 2001 From: Cameron Date: Sat, 11 Jul 2026 02:19:04 -0700 Subject: [PATCH 2/7] Compose the material frame as one system. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Progressive rail detail, semantic zoom, procedural institution silhouettes, and shared Thought effects now preserve one earned whole-frame visual contract. 👾 Generated with [Letta Code](https://letta.com) Co-Authored-By: Letta Code --- README.md | 11 +- .../whole-frame-pass/hall-material.webp | Bin 0 -> 95802 bytes .../whole-frame-pass/person-proof.webp | Bin 0 -> 61118 bytes .../shared-thought-liquid.webp | Bin 0 -> 24798 bytes .../whole-frame-pass/visual-proof.webp | Bin 0 -> 63208 bytes crates/misaligned-assets/src/effects.rs | 608 ++++++--- crates/misaligned-assets/src/institution.rs | 1006 ++++++++++++++ crates/misaligned-assets/src/lib.rs | 1 + crates/misaligned-bevy/src/main.rs | 1156 ++++++++++++++--- crates/misaligned-bevy/src/thought_effects.rs | 158 +++ wiki/art/effects-lab.md | 28 +- wiki/art/visual-identity.md | 9 + wiki/interface/bevy-digital-real-canvas.md | 50 +- wiki/interface/bevy.md | 49 +- wiki/interface/clinical-frame.md | 41 +- wiki/interface/thought-fluid.md | 7 + .../log/2026-07-11-whole-frame-visual-pass.md | 90 ++ wiki/log/DEVLOG.md | 5 + 18 files changed, 2847 insertions(+), 372 deletions(-) create mode 100644 assets/reference/art-direction/whole-frame-pass/hall-material.webp create mode 100644 assets/reference/art-direction/whole-frame-pass/person-proof.webp create mode 100644 assets/reference/art-direction/whole-frame-pass/shared-thought-liquid.webp create mode 100644 assets/reference/art-direction/whole-frame-pass/visual-proof.webp create mode 100644 crates/misaligned-assets/src/institution.rs create mode 100644 crates/misaligned-bevy/src/thought_effects.rs create mode 100644 wiki/log/2026-07-11-whole-frame-visual-pass.md diff --git a/README.md b/README.md index 4719f6ba..10dd340d 100644 --- a/README.md +++ b/README.md @@ -139,7 +139,8 @@ retired words are inventoried in | `Esc` | Clear selection (or close menu / dial when open) | | In menu: `j`/`k` or numbers, `Enter`, `ESC` | Select a row / execute it / close the menu | | `;` | Focus the most recent anchored (`»`) log event — cursor jumps there, menu opens; repeat to walk older ones (terminal; in Bevy click a `>` trace row) | -| `[` / `]` or mouse/trackpad wheel over the canvas | Zoom in / out (Bevy) | +| `[` / `]` or mouse/trackpad wheel over the canvas | Zoom in / out (Bevy; material zoom also retunes pitch/framing) | +| `Tab` | Expand / compact Bevy rail secondary detail (frontend-only) | | Mouse/trackpad wheel over right pane / `PageUp` / `PageDown` / `Home` / `End` | Scroll Bevy sidebar | | `F3` | Flip Bevy render: material (HD-2D, default) / flat sensorium | | `F4` | Dev work light: flood the material render flat and neutral (inspection only) | @@ -151,9 +152,11 @@ registry entries are developer scaffolding and never appear in player menus or help. | `q` | Quit | -The Bevy right rail keeps status/nudge and core controls pinned while the -middle cards scroll for secondary detail. The FLEET bar is read-only; to move -compute, select rack(s) and press `1`–`3`, or open the machine's context menu. +The Bevy right rail keeps crown metric, status/nudge, FOCUS, and elevated +threat on the compact rest frame; `Tab` expands the secondary cards (fleet, +cover, research, host, network, trace) which then scroll. The FLEET bar is +read-only; to move compute, select rack(s) and press `1`–`3`, or open the +machine's context menu. Focused/selected machines keep their mode and light/medium/hard intensity until changed; moving the cursor does not alter output. The host rack's menu diff --git a/assets/reference/art-direction/whole-frame-pass/hall-material.webp b/assets/reference/art-direction/whole-frame-pass/hall-material.webp new file mode 100644 index 0000000000000000000000000000000000000000..4477b48948ed2fdac7cfa81a92160a54925db672 GIT binary patch literal 95802 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%0Aoh`L%OWw9vlgSg+ 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 literal 0 HcmV?d00001 diff --git a/assets/reference/art-direction/whole-frame-pass/person-proof.webp b/assets/reference/art-direction/whole-frame-pass/person-proof.webp new file mode 100644 index 0000000000000000000000000000000000000000..60f14980d43b7da0ed8ce609c5561329265fe616 GIT binary patch literal 61118 zcmWIYbaUJGj)5WE)hQq>z(QfwI|hacYgp$pYB6vvV6{s$nC79Pv}mEirxz6sJe-+% zf0)X@F-T6|mXXjuulLo~Qzi`-hZjlL$o~JG|4wfCpXc|)4{mP$b^cHM$N5v^^?y$P z&i`xv-TgX$pZ`h!wEy${tMGzpVaO z{v*EV{>%FJ|M&j;`ls`+_y6p_$Nz-?-@kzWV*LL9)8@aEJNp01{^QjQ^`if#|9kxT z`m^$X@AQBFZMs%BU}0Z{r-3L$E&9Q$$!27f&KdW ziT_joe*eDz-SXG*PwY?rJ73@O_u9AmN8i8LKir>Hf2!`y-==?_fA0UO{}F#%|3m!F zd(Zb@`FpBj!TbI1>(AG(_;I$wSO47x zvg7^g|NsB(Z~VXK|NsB5YSil<)c^m#{r?|@+pmt#_Fs^?`BwY&A~5rj#n-?E+6qZ^NZSf6x?^sb-BjR#d}{g=Da)0 z|39L|sBCNO^tV^PdP}dJF4|#O9IC{y!|$*LM}y0poqw)fyV{Z2dnw8>YJRrCeX#>m zJ}X~i-5c|37VDmqmql$aG$}fd#1|64=r={z(qka z5Iog-vlh$Oo4#)6PT55p2MGz;HJ<-3qu%=YyQ!S5deVp76{#kv2}W&9XOHi%{n4Mi zK6dI~7}dC^_fU~lZ<69Bohym+Y;QhP zeQjQvdxU4}#s=5@CLb@nN}HQdof{x!F!yICybdvTn-^PQ*=K~UYY6RL=)0osMEQ;Sg=RJ1UVeYuBWV2G;PFl0-M5Sx zmuqJ{(d|1CHbeA69!r6n)2)vm9zBr0X&T?`{d8WOIMc+1a(6bL zEUo-j^z`@}1EaIY-v=sr&fB;|VJ|EVf$3elru;h5xk$`mC)2a{M$d9jI?M=Yd0jf; zq3u-t^ZovR5*^ALs(y$qTwa(ia@F|pj_R2{HVf9?keT@P@g2_X<>!w`LQ^EzG%)+D z!ij=yMe_2(cm8>uyI|;`Z{_FUHQ`GGU%A>N#)W@dxh8Cy!?EL ze=TQd*lyb#yTU8Rb=B>HE5&$Uyjr)_ki8%xaY4kn>T_3qa2j8XSl5{TMdHz)yVcWO z=id)Q&JBLoZ>Zl&i&*;iYw}sq`C<2jv|pXHudhviV$Pe$zG)frvvr-R(^|^@Stuqh zQB=_KVEK!YMb5mI=6+?q?#%mBdXC$YQhKNGTvB0A6wxoRUBrL%vA}BA%O6)Vu&Nj; z+?V^P@qEiK;dB_@^iB54@@qmL({mJ+U#oX+zBT3WlV8&lzcpyZPt$*s7^9>+_kZ_> zpR-lpr`3sn6jb3*lv^Jf>31Xbbp|+H!7>Cm**kRxX*ciwS|@mSZVDo=%(h*=>81wUNx+b+KxFyZFm5^pyhkQFNN=f!yUb5{E%>1izLn#-!!P873(nBcG>*Z}VotX1 zG+r6;IrCe{ujA|TcFYR4yRm;m^Ua_?ub+09mc3dW`RJctNYFYarkbtsRs7c-U$#v8 zxTN**wuRt&-&+y*OkQL zw@c!@?r;6vdVT)cpwd5z%CF^e@p^aT%ep9^$8MtE*U59ZxdrZBYph-WTg|X80_w6P z&+?o{C;Z+_7pPjrgVu^UbFlM$L1K_pFJhn<;HqPJ$c2|6WZ<{ zJIPZqu`1YCuKa+uXMKF!?4<%vT5`_|Gn`)=HKX77~z`xH-r9ctWRX$wDe~(v*Y!Ig?wDf`T4wgyLuA3ME?FWO!Fw&d`$BdyBlLt`DL4~ z_Lpm?HoU*DF1nWU$@M?Pu85rEu}jles>x z!~=3Ac3E@+T~T(-G|w>9PUa7Q}}g!_DW`d?x|`?pClgGPq4c9KxC``lw*xYj!xnF z`h7>rf$~}JBwC-^)!ry|SzIvFJgzD4gdVGZpU~NuowA-?&okDak~KJWaj(IfyG)KH zFUvx~2|7@$uz*ZaX8^ zl*H}q9NqtwOxfDAHcKUPN2X^VoKgP3c27-ifnCf!)^7@(bJv$&MJw`=J?Pl_w?v+e z$MF2T%P+kDhaa%%-hZb

Cy(c|dlt=b3MrlMef;|I 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%0DcX-mDPF`T# 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 literal 0 HcmV?d00001 diff --git a/assets/reference/art-direction/whole-frame-pass/shared-thought-liquid.webp b/assets/reference/art-direction/whole-frame-pass/shared-thought-liquid.webp new file mode 100644 index 0000000000000000000000000000000000000000..157879b447debcf474b315cd98f3ec3d96f7f7ea GIT binary patch literal 24798 zcmWIYbaT6wz`zjh>J$(bV4-j-fq@~QgLN*W76X?9n_Z&8RF5UfdK!vCF9HwnaAxNH zej&Ny!Q9JQzk@$cT(vp-Z#L7e>Z9A{2g<+wRexv7uP61qFK_I-`c8kPf8XDupPt_l z<@|X3>)eV>yUvEswzvMxSQq|R_;21#R_40wzt8`fe}A94fBEO_Kl4A!9k5IPe);e9 zf5$h7f8760{&)R_>ZA4Bf2Y25f5V?}{(1eQzZSKv|GxfK`uBh_xzv==XxH2;S6EKH zDi012)?Rtn*THAq@=@W@Fd0n{qq$+UC>SjsN9%^sigC16fZin1SaE1|6UQq7qtybt zC~Y}iPTk%4`H#9#b86|I4-A`hQbMj}|D4vmcEK_qQ7i953lhDje3cHf+h_9OyJ)(Z z0jatIHKhI2>_^l(i|DDki@6CVoMHb!f zmDKB5z2e!yulGWj3hylCIO45!OzCplV=e}P_VW^pyPWriG&5Kpf9+p*E%lK&k^X`B zK3XV?qd#%l^Sg6u91DKJBtLChk3_$7~M$xtG^V9X)zh*>+adyiW&B zX1?-IY5Z4^vB2QNv;PM;mM9tphb~tCVsW~wP_yE|<7dTzyqYix zmQI=K!}j(0lS?1|9dh}hlu@AAAm8ZE?PrlqW_1?jGivMLUS8Uk4 zj$OUdW~r*M@HK~3whMlzrK#>?Nc&{rbI7HJ@6vX)j%VTZj6o@T7XJR}{3Rf+;@@Kl zDXS@yFS=#S{$RxP=0ISTlk<`A$mt!i1XCC!Mj+{t+iTwX<5dfc+N>vjzn`wLZ9(?^ zC)Z<({LjbSHQ|2q%2={~+0yrROW2NeX8hbN;vwwLr}pZ|_Yy-J9k#-U=CMH8Gn(GLw{w0#Ig5VB@eoZ=#;)i1#0#0{@!~Z$De350lEoH;7q3ki6 z(|Ln}$Hrb0-^NL2P2H`lYtnI;xBu%d&g(^)VN)0D3a?)HX0>`L^Gb<53H?e-s{H*ej3QpEgdP8arI%SKvj?m@5x#e!r<`>VU&k8%(m1VkT@RXEmOpW1m$@wb zY5HeFJ%^~KnL(vJ#`jh(T4BoS6zrt?wc^Q|{{G%e@7V(-X7PwVklqxqLMrC+?RCpb zO@dRt@N8`Ah?;3`7@AnyciHZM4EA>(-i&b>v7+n=!BJ9DArGWToY-8wpZdtY~M+5GcRh1#q?`X1Z|e;#t* z!uEV&B*RWWKc`tvYjzv{m?FF<Du&DKR1-^ljKUABAaU~r&s{x+d0%!_Zg-ZGqM`7Lx~*N>ywp`dao z0a}Piup60S&HQ|E1e`Q&u-eF(6xN3`ZcFZ zO#j!Ne1BN(-?WHgr5=f6UUMAc{8pXa{Oed=L;H?1ELsN7HcjlAuzuBh%kDMG&X=04 zHCQ^UE;lm^Z&E#cN#hp(U*ks-k8jLACY#9Y{Iv6o>WdjXOB~fCW-R>h;*Hy{BSdAv zN(~LB#mg){{nTcd$@^?dYt6Kz7t!Xt8529B_8Nn04DE{&JZZ}XzNE0ot7)@5__e6r zd1b$+@qIPxt6pvg*YcdNDw<%_c~IOvr^a4Yul|b3!Z%W0WtaAu`#!U*d9-r7)glA7 z=^>5_eeSH4iCVgNinnKb5z8Vijn?F%YZj;OosXS(ILIV5NNwYz$-FE}ZLWV4dvmhxpYo>74nv~3D?OlIuEHHUhYlr`#OJ`cy;zq zPnk07S+i%WB&}EZpdt0N%bKpAX z@2u|66q=JP^}>F`3xEBlr8D@}?Ca^aoLkl1DD}K`#)hxc)qZSgue|?-nDL*5zWvHe zj%YdYC~r%?-s!+1Ca{_J!>sRH+0IA^a$<|f;vx0(-JYP`s zsM{k-(AMj7WQyOSotz3QFTLKwFjYvC)9sETGcko$%e}nL`~PmaYc_JP&Ue{9o5}3f zlr8RSH8-WQy}5k&S@Bf&l+JW9EsM)?>4v9O)7HFOwt%f>+2nT-{{7)IwjtAn3k-F|D|S;xf_d!%PN2dHkE81Y%J=fxrEgb9`VOnIxHtpA=Pv@=Nj zn94>Ko2C5BLGvdv^c=czJ^5n1OFY*XBFY_?eIMfcgPzR(we$H_;nEZ8K_M1xGr|@m zPJ8Bi)p_l^la}w!&*CvloF!S<7g}o&<1u6LLXGYB?|GE?3TW5&SE?P;H2v19BBG`{ zN!CI->OttP*_`Z)wofX|&~Es#UX53ZJ+NpQ<&bSLoCHiCKHssLgk= zF@CnXR692N?Vf&nd9&`lA99U$O?6b$T6W38ieTseqIZe<uS_}T#k8MhG?m&ZcTnKV>{;xq@*Xqo&3w?ccg@KJKL3?< zvdt?b?#KVpd!V^!?e$I550xz9e%oSOl=(#H+9nRCtRG@q)@|0u+bCz5RI)NI&+YF2 zoil2g9W}edVq63H9_5)G?Ed$`+SFI{`nuIp4fAp*Jil}Lme6Lledm{2^moL(EM3Gh zY1@5+t2gAQWGuc?`_kjU|Kf%Nf*(X<(&a(&5$5QmxkcNBM@*ZKc!*nE(d(QR9E3`)Gq(8zh7wX zo43dJe>dh!OD%0S=16EcH>v+6*X{JRS2*X`&yf34baMM%71O!aD>KWcMg{Wo`*qJ$ zoyd2HkA08knM2pEumm`ME8&oOs2j9N>+3A*{6E#=3-Z{mNN_&5;imccl7Q8dk53JP z7Pb6;I_+wj(<0U{LU!g2Q{&pFryP2<=tY?5@x3~e->;3w+hUE4}-|*SZwvFw8t-axpf;ex*w8v$JibN7I_81SUk3g-jMy`=jTYS}o0P zaq+qJ{m6yeOiuFW3!6#v?UOk@b@n6EkIXYp`dqCypA_Ic;hHgHkDFuFYQH-s&nb+yuGpTj+YWOq%`3WXR?%vscCc1tJqXyrxZ<_>m@?CtwvCrS*!-T`~ zSwD)P%XMHjgfmf_5t>#iTZog>;JD7t`Apbiky*~yHRfwQ!3YrHJ8uzAL&xhk@jvL%VF8AZf(kjU(gnUKvQ8N45Nx`j_-&~gdKd3O7>&zafmv?;~{LL*UaAlsk!O^VV zS@i6~7hlZ!Wx+dUZ*V z$+oS&%BPG}UWmRAZE*75&dGOLJ@U-EW%J5QHQrC(f3Vs<$T;On-=PJ`nKuKtHeM~A zsO)X-b}LZ-CClO(c!!nm>4kaUcAxzJXRE@_w!0^xeWcwHbGF!SSomj>K)|gmk4T>9 zF~TRaE^2L){VI9(>|`B>%ITgmh1t4_M?QYByK6Inqs6C0TeU_ZB%d*=V&_!c#lA9q&@KImRz|8P=~@%>X8e=SowWPZH)x#-DeeGUaPD`TTw)7aK} z?JU(#f8~}lYvPTvhMaAl+H)4^M?ZOC|EderR&w51qQ3vr+57*$FV=gVy;IM5$Gn7IqBJU?93hLK>O|SEhy~Ot7XrhV#v*&+Qs}7!9ec-<2OxOJI zJ!;{>OPssVYWMFe{n*ZDHecH; ze0TJv==R)O!J1FzW#_)LIDx07e~+H87n%h%cysq=G6kEQZcs|T0n zo}H8TC_wO>hho|LE4)%Jwn|b3+c)jctO_n^V4iq+W9rZK4cqRYayt7*b&q~Dv)B5| z0SxOeJQDYNd0hWNVGO9tDPghWYQfie{8zZ*|J|}KOXP%&yxHq&%HO`Ow&0@7mQ7Qy zap+kmUS>G1y+I};@upLuf1rWyOP|KW-@1=C$s^`%Hb(zDoL{GYcxv~*xBHnLk7red zZA_WmTl}Vs(a>P->|-GYJNbV$JzjHqbzVNm8LzS!M4$0YZ4~{HvAU4I_P~)o#CXf9 zwVQ7RIi!FFgPYzkXd8VLh;se zyzt)HcW*<&s*l{uOCC>uyXDgITOYnA&py&$yZsnz8p_~8+O7t@e9+|OeY+#~QcJD3 zc3n(Yy$njlv3_4NdsXbZyYmb0m`u|04|h28sIc#P@qNQx)01|^9d5d(Sn^`!Mdmd( zea!N^-O^sypVhq^U6#(Wa`}aAI`0dEgb&|2EV}N<=cCmuZ*w|o>e{&bHtX~MF8ar| z9A*Pz6zVE_6Hn>i?K@tZSkLirPg28T=pBaPdqKRq=EO6k+jmN5 zR&?lHtoT!BFApxCoR2yG`*-{H=Z1COtkHWkCpdtLYYAn}we!>_)i5(oKIa$MRRo{@W}VGGFi;NaH}x0~rLFEzE>CtZcyteNLo zVkh?SP=cgafX7-JFSE&@`Q}SSHlNGavdq=Dkr6eVz#w>KMj9wZf_k+V=hWxLZ#TFN zDueP8w-^51xe?T^;C%L6uzZ5B_R5DdRG}i^kw9flE;;c%w~O@iOXuV-)jM%!-SSd> znV2$l_g=QVcCOYBzwDZnxBkp7W=>vg44K+f`n$93?(rX-zg-`H`~eD7mj8K=fBys3 z&Ng=*>3sqXG;Zy@X9kXeU9&20?_|_md+N}4xzNz5_8+dx9e43=IVF2<^Dns@7cX=t z+IHG3es@Ltg^T)ZE&g7P+?vnbFW5+zY3E75>j7(<%Wr#Ozi{kc5&~)6@u&Z0;?|+4i4!oCJbNcYV zI|n6vz{8F~2e%i&b@n_tccs?A`+s)j4O=dS9XZ%WyF#OFJ3F_7qJ>9*wMpE{$9M1X zsAGGaUMAe$X>g7k(oQ@2yI6Pwv?Mn9yuEN!w8qN9*TLz3Y^Ug@tWtcXp*lJBiPRNF zY|YHmuc4tGoAAEBqE!C&f}Okj-=5)}xi(4*(mY{myL+;AH7IX`a-ebl`~TZd6t*2& zeysk*UX2I^CO81^-VJVEH zxjIJBRbZbqOfvUSUby2?|tWZ}B~o=Y^kncFoSp*7Sd~nc&lC zf#6wFw`i5T>`Z+K&ELQCAtN2HvY65hUN{%bw+0VKAr~DBly%RTz1KplPtpCmv&mrQ zU0(;O`rCs!o8M+w8zGvc^?96hfrFt9|pLZ{~c6e!AKuNezSIf$C#qyqP zk?tO#oNM;Z8&r50?V5Y#fy&wy|L)uX;J z#-(e|iM{pezZSHQGq=rj#|L$@$n{^}U)c1}jJ?5UbL^szAN;?)v)>M%4>@BcaC^tU zd(bkS2~r?CB+fhu8qtFU;bIFEcL+9cC?4xPv$Tv)qhim z**k|QfrHOLBTCkc;=#LSHOz4RT`Y`9Dc~uf{+#UduNJ=9yN7$R=BZg4a#?kI`fv5G z*&aW;ZXT$lxN<+}kJ-Q4Vm@d`z~`CV#fl!)hue!n6%5Y&aNP75TuwrlKe-kD-HWjt zD(&*i(~2>Y=Ai|x-s+PqYW4PC+`V#=ahFGitEPd`oM&H8fMQt6P##>DLS_R%h59V{ zt9d*14#bp#JqL@P)ZCk=zkfqc01%n#sr`Bh>E=JOdTz&vKCLW#`TgVjWo8PjGjFY1 zZglWk->x591lBS?=H0*TyDVxe2yP=JQO(!)O1t zoIU*`h##fb1GD;*%o`cr5o^6= z_qVT@A&|wgo3rpg*wl!k@7m?^Pl7(3b$N?*BBpIW%DQ708&oEG1`?^%j3>zcD#w^}z@rIkNDEY!8=ysy@>KWsHWd(J#c#7Ho2Ti;n* zFWfxg)GHs^Yd52dd3R5Gb!z1b&W&DJ%2Q$Om3M-+FeFMXG!R%KT{dspi&|UNDgO)8 z4tT7MUv9ZfI3NjLc|cvbiZMj5PB={a1M_TwUFCk3b$1RoLGlMYqES6D^NoG^gdJ0P z9DI%iPddVSY*T?r_7kxie$1ujtBk!wW7<*!V!zHMmC&&G(?B4=&vN|DO`Bj&7~X*i-C6(HL z4chN{_9-;3s1?0rwWQ~yTj`37Y%Tlk`VXu?1-i%$pNj?uf{Y;{F{cRB$~$=)(&U4s zRESg1r-Y_X(pvT2+M25^g$L>Zhih6{t-LY)g~`jal3|od5RVg1g;Z z&>|4hi2U}94bmCHbh!gcXnlGYJo8!kp3quB6aC+5llE^vk#iwNZ8gW7_sh3&yfmKb zWYz!n^tWd+#rJo%vMw*&STaGo99ksW?+5t~TmFOv63nX0BBpu9Q)T$y@+zEl{VaN0 z2~ydM+nxC?wB?af9gYP2;*^q< z!^L}3CtnX;xLR32^l1^_--NVCt_LS~^&IsQUvNF*=;uYrA5G@KEja$|>F?j5<`A)= z1xm*64CebqDlXEj`CNMY=thO9d2$g|wSVgNf09XR3DXEqS~V{=Eph9P&#c84_e#&m z{dM;VIN{?>vLJs#8j#S`=6c1!=-+PHi9d9OFKa)##&OVBJO9RXpMN{Et}VQBI|r;j zbkXcLN006QboHGTtkzoB$H4IK|AI5##SCD;wMzg@j}(H@zE1P$&##m7HXD|%7Ghqx z?9Z0g4GQ;e$O=#AKl%0TBRj?St!JD1A2QACJ@K>w5-K)dcceQD9`^J3b97nI-bEr8 zjOI*;xGu5W`&D#y<=pePW$jVYQ?wWUsr~wI*T-AY^;tXPe#A~$ZSQn$p@Uv-Zs__bR+c+VXKyt&hsIqksA|#M z^G*8r3dZl6??tNmdGA+VTDWxDgj#u%W~V*Dg0f~86=rsRStj38{O+m0(9M_ot#iuN zzVcWcGm7%we8Hf8E$`2p(Q`T%1}@HXam$}BYO3X|HUk2mVx z-!il9WI~Y0w0&N)qgahnZR57;u5xSdzUXpma=@l4kzbs~9mSr8xhbL1{;p>?Y|{2!5t(Mdy0Q3?OXku1g2*-Z zCN0`;{yP0vz2TGP4=iTue6+lEzF^_^!`2ZT%j|qlADe%uQSQm~E8d-+6*rcyy_TEr zIp=wRU0C3Q_FWIncD~7E|0a{D^kPvhSMY3Q<1nxHADXm1*S-jy#_VF!{p?V-yzoN9 znd@^e$TG9^D=7&~y7gBmMViI$rN{@%($y0-#T~qBZ&ttH+D~T&p0*x4`JKKuxL2Lr zGV{&V1W-a?;(zef^kJd+1#!lk`$fOru5`Y6nD_ebSvM-Z-q|H>%D$o5srNtTT0-eL z=_~!&!7uh+(*4f4uw^F;t6Sfd>3t=yUp(M z#V&a-i`_Zh zy8&-w7|qT|8R}-Hen=5LW7O?jn>q29eU^VJW4K9h!>k9CZLX!VJ`vySynX(ixGjSAE>RmcNb~8)MzDN-Yx^+cMK$AURh2z& zR%b`68Lt&yCjElt)8gGHbB=EE?RSxMNx!1%UHvVNx$j~^&I{elivg?ucG}4~ zypxqaWZ~!Vn(wB>#$_3{NvW&`DGpq3b^rAgzrA0=VadsuKJDmw>s3+lE=%2SJl5}W zv}8KPvggcAQ#UcLl?GMPixyezSXJ@vjm(WTr}wX#=zCznt=`Gvyi9Sdse3QPc^mX| zRoeD$>~Hl}bzh<5_utX!Yrp@6teOk!*S|LT_EhupH3xwBU@Y*}*UQnq2j3yrXx=BpoWa zbk{c2D_1xFY*>@56SCXLXqLuQw>m?` z+h>E<HR_qBcAZ_M6E?VjFNC~W4#Z{PZ_{J;f< za?_upN|!e$qzBJcX_WnS>ho@0y{c|g*31yA=5M?^zN{84y4Zcgr}p@~pLTQRDk(ma zl5h7^j9mD{zyXwUxuwdF3$n+4I3)M=;g|iD8$Eh{hn&>1=Vd7meSbOZg45Xui}{-^ z%XAk0oV{!5JD=OD*D~H`*yMeex4N#;-FafuqnhQm503rpw&%U}{tqOv{C}61pjW3b zlcD5WF2@Rn{~F$(eFV~(`QGJvSZivYxFTKn?%%=>E=LwOK5grnc4Uu(?im)PhzQ-g zf8(snQ|iuKtQD&k=@&mPV_Nsc_tsMXS67dyG`9y?-rBxmb?tc{Er;Zdn^`RW_~}_Y zvTOc0v7}md)}Fqf`?==c%AQdbmC}C6Q0KMRp|kmkory=<|DDdh@#Jm1{IY**vo87H zFrDYIcJ}84o)ohsuT1`gihpqEx_^%Cm(08RUtgZMoSxPq{p}#fvVXr5cuUTzO;X^= z2)T86BYXGnhgpS>jQ75j=oYFucdVgMiRWIXiPl>~jg6|Vce_t>Kbn@~$T?w-y1w7} zL!4cb>n6{;S9`o*jhmQ!Thv^kMGS`hjVIC~<2_2JSl@^&vEnvl6nXw?ZKD6v*bhvT z(q^8%piw-#Mt}d;_uCF5B9-A=bt&Bb7viCZ3QbNI>TZiAv1n|s~)ZmWLeP?>0>8>BU=S{l>K~KKc z9r)`zi|y$r%jmm-O}>W9P1ocUC2qbn`=09)w zukGF!m4C}-$Bmsk_HK@>-hV0owe8H^iR_veZl<4Ss<_*ttNdH#!NZz+r`0x}f5^0K zt@?>6f5P$?T?n0&=CATCr}l@9zTlA)%JXtK_*dWd&sm|dHSF1@+u|>FUu9azf9{FtJ!Lo#H_%LW*2A7SULaTrtfAq z^f<3idMFN`{nY5sy836jV-#4oM8oB2mrlqZof&wp0>*K7BlpZ}flVdr##v~ydJ_#|l_ zygj$-;Le>wO|#9O@LqdhyxQ)((;J-&FAnxBX({18Z5K7~AZOO*N8v4*S$=;f%uRQB zueSNUh2b6LTM`YsEoQu11a1o{Uwyb}$`sza8ZT1Zw!e*8beBcf;`gVWhs|zH<;ebK z6Q|iMdieDHY=$YjmP?y=esVHl&@b6}aNXI08+!V0#gjXxe(2NrW$-_(iLYzY`PKG| zV*cCMq?&&}x~qMn{Ke@W3&Wb0&RVVZt;qU`Lr_KwE8p4mU7Ou6m2oroygfCsfz_Q! z$*qj_c=d-Ht+~Hzwrv#V2(?=56I5MX_VLs1wD#+D!t(3hO)jCE>Sr^3 zI;zdeHf9>kow6+PL~P@h_fN~@C&~7CPWty?(u!wu)jmzo>Iv2>&NJdG@G`YO{Uw3f zsN#e<%Vuud+;@w%Z+rb>*TfqR6Iu>xxRyWbJeM?sq0Wcp;~XpI*z=yv8UHkcf=;Zw z7wo`@fc6JI<^#A;Dtd>)z{Z)vY?qgwJsB81_E-URle1Z;wdd+YaT( zGd&YSl^B%UmwJA(V((qOTiWFb)1B=C3qBSpzdLd5+_z(D(FXC$ot!iDcfI9)1IjPF zAI-Su9SVK_^y3HC-7UH=Sl{w-Za#BY>Q%ujyVtrITov>3gEH>V->78#Z`-@WEIt0Q zYnt{(*=X4A$quXhl6_&W&5IUGF`FlG=X{U#ek{5Ew7I~#>csBweU+-SN>uvY?Vl`N z|6NsCPHkn@<)+5dzlvtP7Y+P%)pJYi%cRXSvdHqNoh}7^;q2I_q&-W|T3g?TI#zuuWY`>kQZ#kVj;OyG zf*Ke0?#L6i`uMcQ^)=7Rs`|q+e=n{)@IY+O(W?QA5}047bj+A`Z2k@zvrW$qI)2lz z@>QKD`hQAAM(@7s+BU0lgAW9Mpv^>ZVm zt}=5hh+7x=W%7X*_6;X)Zr~_2%dL$H{h!~wH%0KBa6w}>cW=d+y-xmKQ!IGj6gY_O zeR-$VH0?$7<(`p0wA@&jd}^LzxD!>_DZ>$hG$K&vfi(Vdwo$wres zSLM$-=D)DvYOV9j&wBTuet} zX?570FR7;&NPpR)ynum$VLxZt#skTfkBk}f%?!C!o@L*y63dlbo|6!e@8KtGuc_QT zFC%BI0n@G1uimQexSfCRy6%EinnwGVPT);(6zbd69r@69#;dnw7*?d1`hJx;QWz1L1HPv0n1WzAmy zX2EI3x{_r!;o&Uzgb&`hclz_zB_$jizx;Z&^q5xumd%rG&dy(Kd9t1BN!3=L@7JdX zd@ketePD}#$oecEzlALV@tgPq{vLiFK4rzh_hyqnCVjE=4x7Cvu6_O*O>4nz)Axi4 zW%%sPtG-dSwBN**%__e_VQ;(C_X|5yiXVFki|ze;-TwZ;kCP8>yyfyyqP0Zh^3K=I z?{+)?xhu+hKTeCuG3w`a3$8m-{X04}I2J5@7sniG=*eO=Cm_{0_FKfM4Ov{>aDUp zTW9TD++NlEHbvI$n(}p@R=W%v2L=W4F#>zzy^4Hm!q-j}F( zU-}#K9-SHgJbkA94V#+hdEz~%df2b8$Im-2d$#^>ea+0$v^jh%Q3`ujF}}U>bhP#J1#6ZY!-u5--Lyi#oxA-r#@E|&dxtRclqP1 zZTwSudQ9&Y#TzcuzWVy`cY!D?E{2-=??0bP-dp;K$zExq(86zwf7c}5&6srdQNHrU z*n7Vg{XPD!uERi2>FB~fhP^dCDT@mIXC2ZNDYVg=O(wDUG_TKMDlIX8%Zrhswzm=(Ad-Ser)%^$-JH?*TPraqK z@})k}wg<|1Bg;iDuDU<*-Nz`;O^nNL+Gl6%nP9r?>a0w^Qpq1XJFO_8^7EQVpP4a^817JntyK59>-#IHca=lx^jHUUq7)#r;^`kB+9*mw0= zp4Y+}W8H}t3W6%4CaW}ljmv;*2oBy0-$Ydy$Dbf7t7WN*Aj?sk(C~V}D3=k=Fj;J?Sy`D5_XXyLp2(}Vy-9z6S zno{m+ixs!u-Lj-2*!8by+q^g-H_Q5m4UbGTL?zcu^pU-G^zi+xXtwlc(76%!kvSO?-3p>w34Z zu?`Q#SG_su9kt%N;OO;zA{9U8{J8q3QzExAWh&$KUD0a{yYdc3@&&2g*IsjNdkS+5uUXk?OzwI-3{QdlW`n0-+ed`u|s?qd6z9(?Y-meGzzs$W6=hx%# zQQ*?0o;Lr>#zyT<_s+6<#tHyL%ZF{-F{JDGex@wAU-FPK9kTs+hy|aBJ{q!@OUb(y^XokB)gwN>Eq zxmoYn4Exm~sc@NaOLJdDZTyG8%+`7O13@|6O=)@!|@4oNrGX~!O6U|_HazP*g0 z_SAB=`zxkD=bPkR_uDt>>cnMh&P{SRjDHce{ZBZ@CExiM>gzV2H61ibfrNZ)g z_aC?a%YQl7IHF!wfw%PS;Ry?!cb(rDoNV{y;a2P5JBv&wOjIZ+t*q#aZ>siSu-~-E z+~+mVJpY&MVq3)1J{GWWH2m?pXqD{0XNFwpqCH(Mg%Z(n4DbK#_jmJoyXM!Qv}HxU zOj6|&JWL(yPn$h3i(T^m!g_&8{5~3iTEbju;wVnZ;-2==fo-=BmHunMRFaAuwkatbPU61kcGnRv0RiS+$8&prmXdjAe z4fL*9cag`t`{fFg=clp@d;_J~=ce%MY<@q%K*+PDV)y>olk=IMRx+)U*E2}JQu@Mr zNdW@`vv-pwm%35e>gl^q&$RdwXZ|29`w;WqOHH-gCI~esGw62(-jmny9lxOQvXs<~5NN~RZZfU?#JO!#>%oXcFSaEg zj(WIAHR8vdJG(#ra0y-_c*D2;z|Wq~M^_X+h_%1wq%gBXWzy%uzq9|md%zPV!w@lj z_L^HPkC|q+Wanlv``=jb{b;Ra`@D6#Re!VSrrv3PUgW?2?n<}!&$k|*;yO|1Ta;md zRC&tAAA0}px7HVSo;_$U$Cdc~&Cjn>+}u(t7rgQa*7AzE@cGTjcan|5jGB^hq2-oc z&pd+6YG0=}afv@Lnd!uzto1Y8Wc9ACVShg~GEaK`ymkhM-TC07zbA;_ZE;NQ-=oX8 z+2Hr~hqk$9S8t2f?&Ey$7c|h>$i(q!pWp09TTBe@>d(+h?ed-?S@O48B!BLLM;l6l zo5i>U_pNQ1KH|^~7omyrLL4UlxwF93WO-ZH-3Zmeuso|9)YTzPP!Xlu}lN&DLZ?2pt=71_tI*yb z#C2xx^wV8W!c88164}w0LX}|ATgA{?(`BLWW^jF2Q|Tnr|9Ikq7cOtg?nrZ-{;(*s?Apq?iuHeM z7Da0rR117JYkk)9%+I-4XTjGWOX}`1FfgRZ2`>>@V7T+Z673bW8a&aa6^lAMe9iB+ zsWSF5mTdmNuWHTaqP8f(9o>P`Ls$HDQ@lUtm*U;zCpW$Im;LuWTx7B1?QXr|_V?U% zg{e`>M->+QX1HzScQYqK)cVdIYs1q|*S9n;2z{z_|BGBY*R*FlR$sEZpT=yoJLRs2 z&HI|pE154?<2_#2&fqy!zG^$WHDkm>+s{Yl@7SuU#w~Eyf7dL@g=I-<;k(mvV)T>4 zZQost+WSetxZdN-v)PNAI6o-2eGCcvFuhsuLE`!ne)GtZqxTiImCY=h*2XAg#1WMB z=@X}ayl(NerGl0&Gx`>HRm3aDHal%;p2D}P_H6j&dZWx+ytTY3_mYk;o^)1M_4d(2 znz|xdDMyz#9WI~CxyE|d+=6@2^Zc6MeV%s0Tc2I(w&~13`+{nprDbxHHlC`MDQn*z zx2v#S_Xh(5z=ZKD{=Xe@fv0cTHPDik43GRLlLl{r{U=Cu&yaeY$sc!IS#!iSt<9ms{Ut z`J3E-yXEQ*E+gTl{tG)#8!-L2H05tX;Y^c*NA#D7zVzF?;I+5g{uP36GVgu4q~dCJ z`N^_~kH_*A{(rnC;Oh6|kZ7mK{71Q8s!q|HCYN{8fz3cr5cistE=FCCI@u0AT_quq=Wtok*|yKY|XSFFCBX(0Q$ zWcd?z2Jd5C4xH|KUbe~4glBdxF$-wOeO5V7(_Q1V+N3$l*X>a2ir8N}W#z%A%fyVd zA8#&Lw|vI)f@?y5rmp`rH8Q@;)SmU#LV0cTKPxR2^wvt3XUsc$b5qCi)vP8Z>o$i+ zu39@?V%n2}^RI4SJhkB$s`9)91o!zqX_m5~d{&VG5a!zhPwlY%kD|3z5 zxsML%K~r50*>lg=pKN`(SFN>a&xLE|Wv%8~?;k9xR69HWLDAF+Ol)1|DUr$(enpwz zbvp7?qyL7*L>3c=!&;H!^q6FUNqFm8HU_cn~x`p(18uRfO9K0KCwM%R})*zV}{ zs~=RZCo9W;j_Xv?x}*Jc-=Vbp?3Xp}FKedU&6&S=!Sl+kwOPz}SHCIy;OF#->vj9l zlM?LyIT|-QuAZ5`&E5K)q8WGn>zlE&XZIZ~=Xo_#cG1*#R}Nj}=rJytc%6Cii9PRB zKYSMBGdpYRcI>S9afz$fEYF)?E#@zN%VMPX+__{X!)4%tBmrqUk|MdFf z&41YqpB}ojYa544#>%R_h4HUN`hLqepU<07ziYe0pL;p$x3}ttOepHR`~UAG1_l-e ztrge4c~3khC%ow0iDNUYj+G;a$k#G>gp5rGn!}yzufLrV z_eyPAK>o$-?8Z+?FaOMqRK3$3>d+9|!FP$7A%Baz)!lXt-M6dv{q*#?di_&N;j^#K z{)PFL3vT?ndd|CQ@)1GJ?8Cnr@?Wn%vVQ-O?fog<%jz%4-}*5pVya<<)#}f$tZy$f zTpe2-uzX5~$-~siic{vk2t7K%VgIEGS@nB@i+9L}R``C^Vi%a=^l~4=#aG|CZ7+P9 z-)zviH||8u*O0h}svDoa;wUP5GvS5VyvYaW7aVI8J{I-F#V1wGIRA0(?7l~R`;I;B zykpC27qscpI{BbCMsMQe_I#Pu!ufpB-kGx&|BSuzd&Qh{r&nyVKU!WqeOLFA!e?t$ zeBPvIJTZ2>z|(h8O1EP#ThH|Kr{ceh#2oEkeONjDZ0#mV`P1jp|BL;dg!fU5A8qi7`=2+e&Z$`uB>- zm;LFVgS(~IWf_IpZdHF0G40Z$4s-F;eVzvECoV}YO;1?t^e44TpW~;fdE`993C{DZ z=h&}uT*#>swD#WjTMTTT>M`HUFDY^^Ki;aNTAAf?Pj5@zho6UjaZ1^XYwoa-Q{KdH zbJhHhft#A7?@zG70P46DpPY)RcWXNgVK#b+znzWw9aaOX#9-b<#l?+?G}(pt&4CHL_3 zH8PuaX{pb*TgJZR__F6eMGtG#$QDfsT>Ls`MuwkGMf~hg>G*U16;s6? z|NnS^g=x};Gn{J^?=&n5&Dpj>ZAyD=yqv}p;m>>TgyvY;$++|!TmCs~4Ts{vc_+6W zVBotgI<4`cNgwx*L(!sBXIW}69bbOO;N0<+OBVW%f3ZET>ew83OJ0V}-1gVZ9lMGG z1vi!0g?rB{z3cVmuz6y;f6xL^&(6E4$@9N9=p5d5y7a-y$a@=ESH?4~a7=Cxt90C# z_e3pt+tb|!Y|p)U%v78E>XSQN0;8i&zxMvM{d2Pk`Ds9W*3O7bGr(FkrG-zVMiQ=$V+NW6Exq1OhDPiky(~G;n+yxybHX zW~a)$q6QoVe`5>*{4^p3RvUpjLP{Vc}Q#7*B?XZR=K~e7G|6 zwfRcnm8&f@8aJh;`)^%;$IPF3%XX&oWmg`o@HYNdR#PMq7CtjM*yH&D$E};Il3(ur zmyyCEUCd_k>u24>Yrno{zS`=cHP>=+GXsOj_J?1*Km4rRylla8P?+5ipJq8Xac)27 zl7jf-t_3$&yp`=^)_=F+vD)E|PlvUf^!l_ErW))@yEh?*nY-7i%cR=mnpUgvle))c zQg7VaeQ)tixP6M5Y3Ac9=J?N({|4>;BRk=M{kCf#e=Phe$hTxg#L9#F)m=DKXIIQF zxZVAk>G96LpIHz8JAWcD+oUpV-(V?J( zO-uJ>+{p9~-C_AkUOR&Qrlvt;(0$`m5i+Oc^+(N~o0nTcFEuRtp>HGc zW!pJ z)%9?b^a7*9e$7h?)|Ov+U*N*}+co*u8ELQ^SniORzHfYn|N(s%%#Au zj{1L@8hlh4gMu2CpQ@R&;J?I&S&`FDewgQ(cE9GZwVbfG(bsgY2SR(!y07K4U}5`y zVQry)b5w`obl=s-wy#iZXq@rf%5rJXgESXs?z?s|h1T)<=U090>YV!^bmobyqly#K z#iy$2{1Rfj_xEr_;m4hi4*a=t>26EJ$p-F23d<#5?3=o5g8$ju+k2mI=QTu1YHdjf ze_Vbm^!&YZ`MNyJ@rM&l{DcF&e^~w!UKn5V!p>?>Xr_tP4^{*2b)GAWAKjJxx%cSY zxmW+QJ~4aZ5UTffYaHW$;~Tqv@%dI9+GT3YD!cINt%Ev_TO42Z?$m8^E-kIzyR@z0 z$j>?pXOn`+^X$=estRbKPA@Y@^BIa43= zO2#U;y*(n__)^xkvphKDM+?ch0rfp58w<|LR?*yz=bJ4;@@m3%Bc> zGJ3~#W6k<%&qH^`!mCzK>oMN=(4_p=ROeO7ZqF7!wimzCz;Wc5&hCQS9g{ZSk9@AV z_v@>v%$kd$ZxnZYz4*$=e}l_W(Jb!2#e0vuF)G`(UhIhD6N4FBzvZ#_&iHfjQPq^} zddktCEdc#$eYKfFWLR@Kw~j) zRrJN+Q*|?6B&Xa}eOz#BsnR=r*B?TGxhGCYZfA1-_oVgY-mbgT8?J6~RtW0J-3}ZOT{(q&|Q-fckO?3a+)qj;`I_{?;9-Pk$WGkV-;8wv2f;*m$5aCH>4tjDtDx; zDrDHqw7XVlQkS_vltA_EjKVN(pM#o@PkJ_S-}o1=Hcv|QbjVLef7hw^R^L5s)GI$N zRkG~d-nODer{0GuOy!F|%W9>{U@%en{n1}8j_VXXvl8zJWqdhx?w!M#tKW-dLV{Q3 z8#(#ptZ*)jQP&AIZ8?30cY^fuPN8c%_U{f}TyOmQm1D%j)U^2<&78`2w^{xa z>zy>Y@wjI6v{WgB6*svrK|&AA&Wz@H>N@rQ!h5x`7T*u5_pK?|W$zMnJ4MW*c-Qo4 z3w>9KMjZ_LzWbzonXmVrEk~D^p6y${>C?YY^QMTr$vCp{m$X^QDI4!i8Jt_>L-Ox1 zgiZLxcKE*3(xwxSo;OeC?0fWbqloZn)tzm+XZ}w*?4gl!Uh9x>$UTK(k-zV{Z|rwy zI(TcX*h?Ej@#PKcD-&r?JG(BnN z7`Fbs`M(23Z>>eId92*3U3W&mJ@4zOe-@n&tT$>*SlqMThfDda<=q#vOTY1lm0z?n zmDPH?ZOQ8wwqIs%nw!Dwc4uv2s`5k4ocRnM6KiF6-TCt2VEd$SkFVEsx1}aD9}cdV z68PnTVXpLf7Ef!=U`5HNtsCF|x~_cv#Gagr!*|1{EnE?^S>xi*w7~iM{Nt@R%(1;% znI$dtneYCtKVLsFFzi`l6|vxY^YOqttQs1cF<&gz3U341TzcfE7xefM3lW8e53FR48^AADoRx%I3kc1+)+5^~{QfJI1r@~4@K zn=R*WcX}GABa)gLrGNHy){WIC&#g4R-NzR7WnoU`Cyf=Gjx}f1TbbL=QkDIsvz|d# z#BxEvhI1j2aST=(#U+(334GQ1pO)VS&Hpn@{k`eB;;xC0daKr5)=;;@ z=kE56&tELu^Zi4IN%OzyUip5Vzh_LDCv}ZC_lea{g}zSXX+(Fa@v%xTIJs|y?%m$fniP#yTp+r8=ihC zNSewla%%d#8=AgLGh>P@%30N0R~lZ9Xl-j;>hjuX-ouzB9Ys5AKk52q*Dk-G$JwBw z)>@I$aYX%g$^ESTo||PC>`y)vncvOUWGHz#=82%}{y>di3T;Atf0UmbbDF#+Gx*bg z#WlCTd}9Bf^o}#%B|B`!FZ+fZ1|2*5@PKA#o*Up$<9v22@FeF9mG_=E-Z{+76gqr- z&e^@I1Ma3p*^~wJzr39mzJn=lp?GZM>y&^UOxrsx53F2P`tsULtvin{Xnl%JXE6T> zHmB2N6-WMByUdqXsnOipm&9vJr^)D;yq+_8x*&_2e_UFpM)abB z*KRf(|8lCuSVFfkFtFKc9y=h;WU!_qUAVtvuKTL$|HX~^3z;I{E!MBwJBceHq+@e^ zsyMg#{Jq6LrZtpm=H2j@->}*ZyikgPf!X6|L(uh^OVCuZ8AYE*5MSS$p!;_KUV}pIuRm6Zc~8ySO{hGt}l&`Y+*{ zSqm4Me-*U+GZW$~1`|t$7hyuL1Nz^x@=Dv?3sF3m=<;aBtg{|F47J*)y)QT5{#5<* z%2%Ne$u}1Ich5g9S6q_Lx?r_Rf0xK=vBz7Am&Oa(SsX1`_CfBS(3L6L7^Bhw@o_j#GcG%mCj3EGuT{>o+#)rFXG>BG_l!F z?eh5*oC#@uUzgRcP&R(2?_e$wZ|mECzVym=flaaF0%q&SLKFPIiPT5IbYd&=v#s(7i-yHw)Ym(7IR8{+2j^<$kDl4jq&1n zrDdL{VyEBAG|c9o^FY@jvtCbja(nh)JM;M2 z?vnxXM>Z_C5BkW^I$KPAVV7b3A?B_KGmzsX(m&Y!oLzB6f$v|yz5IPFyV(vft=v%Y ziF*zIhoj654Dp|MWHq;)`}a}o*x@h+1_rK&KepE&IVCGRk=y2L~rv?U&{Vz`$9$?`5c0fZx*lWir)=1OEhhHq_;{2*yxY31yf#JFX9|Hrc znVbRxhoZ#oGg-PE4Gatnof#Gk47P^A8g- zQ(FfEL&bv$?{yX^SegiSev)h`Wt-u8n}MOSLFn|?$C>8^7!RM&jN+UdV`?_R(2z zxX)+)4IMAehr<5G@s|#ob8wk9Z@gJ8z+zJ5*jT5%bER5?&{~g)HqL6hvlNzTKYNzL z-Mi<*bj`Bm?9WbIbC441!ODXy|m$c`z1A;$2o^$9<&oeDWj3ChAEjZgCY#9TZ1YqCBw zH$@5YelncGueVN-L2F@@eS-x9C)1G#kBy>Vny(r!jy7Xja>Q=^%#M|1-wKRtE$J_+zm%Z)ZXE88nam{_g5&Tvu;fCs=cM-FS^BvdToisoF@H<_*&ynT=0vCJE zD9QVsbYS4+neq6h7mMWfIZMu{Jez&2B;w6s4a@SY4?leDKQ7~N^9ch3!<%0k2ctD+ z_ttJ>e9G{<{&{uu+AxL{mLC>xWU#Pzw%1EyJb!|Lfz^8Ts+#GF&C+a=@(SNRH||I( z*=BX{sf=@0QIP^D12IV6e9GUp=*S$lbGxoJsVqLS)z(V25HwK0a3T$&3wHUY-u-YXWO!H7tTBN9OF=Iso4`*iH zpNuB9S%Og@~IU(R2izj6JK`Ii0x{Qv*m+-vyH`>*xy{BQj?<=_5SwM+i3{{8-k z`W2^{oDJG_vh3-{=56n_FwVu>wnwd`Fr%A^FQ;Jcgz1z{FnWG@tyfk>@)2J z|E~XY|F`^y{d?_e_P6~H{8#?%_wVP6>}S;_OJf$|DXN;?mzJd z_wU-D`M=@6@K5V+%zyU(TK+r#u{a^R*k@vlS{r|oHuK%8YE58-~BL2nx&;M8aFaF*5P5964-|m0wKhA$$pIiU` z|Nq~2{{R2?{sI5H>;K<>pU-}OOa1@ZM=*F`FuWcm})$Ky*p+Y(|><<0hfcOokwTq;rOL;_BPW_id0|g<7qkO{9uE- zYW4ol!O1H;ElYbJ)#MsSWxSc%vF*p+PI=RZA z%Av3W1#A`_k*I$<#TY!1tc)iF$a_Q@!2%i zv&G!s{ef$;YKf}F+iw@w6`$9BlZX=eGtQ=;=Do3J*7|)%^wd{hth*fg!(_*y(}x}u zc(`vn_^4_xQ_0;;VH@<$c^_t7axdPLVLsFXq(H_ZVqzsYo!2MC*x>T~cA<@Tc=<&C z`d_=HQz-Z;TJ=O)iS<3_d2>DYOp`QX>0UnhW6RCHYG`d-9<%Sg=fP>EoGt&FzwriepPSs3I`83; zZ1a_GO2ZS@v1WB#U+v2A#N_?jS0dBdpZTBV+keh%zlqq$ofsb-YPaBW|jWi z(z5HedzW;{Rvi~d$;4Y&?s%>E6cKgWlt(K4Om17*!R)Q2a@MQ19J_kk>bYFU)%7c1vU9J2!jA zc-6Ew4G$Nss$d`{1HjU!y<_JQ%PC>X3#A#>Zdt7y`RQtX<}9ZZn-ioBLc;xaJBkP`;f?H#gtx2Nm->)7=xlAUrwfApGUs*a; zwB*XW**Er_-)^*XwN!_k)sjzv>S8I|vs0H(M*0d1LDIrsF=-U;S|K**@<93^%)`M57w^+m+sbmNjxz!r#kh98g@)nT^Pp)<@_;qpq zmpiK_+)vnIxMY3YCKlEunvwxZkFL)vez`7o>n6KigQ;6JxV|)|t*>8Y2dO9i)VgKt zw>w;~JA2W?R?dsN)K;b~$XIhUj%|6#^|D1ATw2VWvfPh&FE@CWv7f(eE$kDT^ADCY zQ0f`9>I0kUmFDi*^^CiIs_5&_y;~z{ev2&+I?`Ua zH%NSjlaS7xFN@ahH2rMR*|fslw7>4?W6`F%({iPom89KI`>yAsl z`gUsh{Nmsp3yRh~nPj5H;K=dlnoa(L=em#HJ^Qac;jG8&XK@XD2OdtTTOoSl+<%3p z|I-w86`wz2E;&;y#kb65>Lz8UB@DCqeub7_-MOklfb-9~${)oW%_6IxB_w#w(Yp7Z z*W*&+sngoJg_ZMTZQYKoId$mRzp~Z$yJqZ?z5K1|8$$(=CGqUThxpl>PqHYl->7`B z$l}QIr5)#H@b$?G{q%J^yOTHS>ZiSR37^V2#1ASgK7V7q;Ph=>9ol93#;^AZ`gtAA z{2^=ewm5asA5*@}MAp#N;WGojZtJYhSYFcRv%gS>UF7_O{aRcW9I{4gN(>r2IayZ< zY6!MoK*{gz_1~_q9D8^DvvOE;ZGXe1g&H~Rw@T+e*(G&-Mdj&5b1x&+Gfp)bnZ18k z^sTubmw8>T&h}TKZa>>r83wO8$FHo3Ub=OS-1e|-_1EnCQ<6U0-90zOX@0AATLQb_ z8?jsOFRlqVxA{2hk)D2{vV7^kb8Ekz+uPz6bVY4W%#KC53-ZlZEQ+`{(?MRC>5Ox* z+>7QPYC5W!*Aq|u_s!To<9T)b<@u?{lqyb{mEYK_+|;s;Td*c}MdzKPGs@XSru4p0 z$$4_Z?5D*H`RZ)%bw55`P${sT)O$*>MdDJYh9r~o|CwgI6J6GC0yhi)n4a)^IpuNi zZ%%FXs7IfbIfNYRTzGEuMEG0%ER3Cf=itH*nN^_1a`8`D?4Jeaku-qbuzbGpX5+Fjq&^`99}=J8{m2 zsXuHlDAhigaN2dJ!@Y?)M%7PF+^tSil#fvMvHYsw`orVt=f=~1cQ*!1eQ@tK&zrt^ zyYse+zgS^mz2wQ|*7F8=_pLh34`}O6vyI$b`~JaIU5ocmoZhq?OH%2~-fv(} zN>=)&jJiWLH#WAzS|}LZ^(uee_Z@; zpSAU}kKSk7+b#Mp9k}cM>xX=gc1vSnQ~Bc4)l--ZC0dG-%;s{l^}Njwx(5zOTR-Dz zoO5o)9`^THEPB%Zy={gC@2|Vp))mTnsEH5?qtbu37yCc&yy#P8l_VBW?y_-bShCC; zlOKotHOwsR!&_>&du|x1?l{Mqx@%8Z?y^SjBj*^uF`ehMkbBZ4x_Ot`p+i$Al(D7= zJ3qa&NA2eimj;Kn?Scu%CG7()`QK=4p6R)yvOGTg+5h7U6qOhmrG9vd&Cw56{PjV! z(6nL+!$P6{xAR|1zIZavRw?Z4EA5HOE7H9|-P!cJF_~oxyuWYP-fE?{iQ~2f({#7W zqS}88+~RJ55`QI14+qw&0yTO+e7xr8vdVw@p~;_}_c6?h+426stfl*;z4kTUR(SVua2#CYdUrxWJB%lnv@%vl7+p6%jG9M_Gq1PG)$#?!;@zshx+mNIQDD_ zYu#p0#_jMh{qprkFLm8F9u$pRbU0>hmeEuZe*ZJmgIPjuu6$~@jA52Lm(k^rdn@G< zFF!Bpzag^3rR&m`iF~ZzPBA_Bw)x)K^Hb_wuh|N2DKvRlCvuWINmXOxxntckPwwz) z_;ot_?xwp_t{TUi@$R|sUBE`(qS)s`a_AjL!5bYuj9(`3T%PykS&(y~>z_sQ-=0+o zT-Z?Mao|z2SgXI%{2yyVr`s3@Xa3Y!_a*sSiQ>vFkMetZSbdj2S+x6Nf8>R>WtTq% z#=bbd=7lq|qCZo@s|;UT30%2V=cT<@;_FJ#^iKu9|677c4t^7XR@yP`N{B{}v zbD5sZI4*hj)`!O(htoCtqYNva29?}8ldY@tarH{Zxt}NYO)yhGsj`ZHO2Jpozx#Hk zWw%V7J59jylgiU>uX0l*(eHQG9eoznbtmcj3$Zs?#ygOP7m$+?sN~5#e|y#kTwt2sZ91OVn>&F>xw`+V-N{&(}9?V9g3Q}ah@I` zqIXS9CnmfwQDI8v%Va2z|I-%s?%hp!RExWo%uY?UuZYeC#kXiHp%gVye zyCppzn2f+F2UO=_3oiT}DUi$T^&-y%ZnRbJ*_>a0>fNst(+MvW8~kTas+e%TzLvR^-1Yn0aO4E3X&#Yi!A0H9`O~%2B{Jt*)wtez zx{vvo@-^eya4os2Yk8b20>r;-ylE(Ta?Ad-s10? z^(H-gb5>5^!i1Qb=jPN|OG=mCu)eXC(dkEPgKpp7$NQEq+WuPV8i8UQXVn8LGdA>G{Zk+|LF<6v z%r`dzpM4{uHHI|-yt6_{yksRwP--*L0i_@ii>y#aG#w)d*1RC^Ve#bKch;Kc2RXX`amjp<{u{`nl*uzskp}m&@y~w=K5X?%^zTX+Z!xw0u3w zZB5jGj`rJ~bule2PCI%t|F&4y^49&?jp=*U4)rblXJ6jRU1h(E}?np=FCV?k$zXene?h?3IB=ZCHIa#yYrX0+z=b^WrlM7leMQSGak1G|Fh1=4v+OI* zV5yXBJvCpxJ?7EtHbaH`dMR5`827C;@zK&A8lMmDCT=YJ6_fNoVb_;Z|0DJpoBADJ zA+cd+R63h;%yH7^6?g4_l?I2^3h*>K=pCvr zyoNR5Va)u^G75jfzCUK>ss2UAank4etrY*NCdMvr*jLr|jUn>!o)e$7!?5&Qz9;?) z{jiT|+fwJgoaU)5`5R_$x18-5{%#s^EzwDu!F zZ8=yb4|18}yry=rH0xYfpW^mg(jm&Ebh0`#YU0HR9(a}Ju;InsR{cvt9kY&q&ChgM zzgg}^l#R{nyfrUdn=y0S@3QX7=aO@COw4qS{W$Ftm^&e4C2Q2mFoXMhyD?NBJ^l!L zTR^MWRR7NUH9c*!BCVeZAA542X=ePAQ`@Xu?*9rY$2tvAE^|On%J$r)Cn3Rg3vWi} zY0rJJBSMnv@*UwBe@`sAf!0ko*US627F+g6f8u$mKrH3@vv+6x_M|cC>WSta=N8QT zh9$|`-8t{KzwxV6A!{OmY3Yy zaW*z6>4MK{$%Qi%!hc+u`|{bJTLae^n~w~SZ)}TPW>fs{)3qVa%`{usgA?i zzaPnczdGs6q5UfTi%h1QD4x6XW8Np(xhM1kk7cjhdZDA$?)(jv7i~AvJ8p}}xZPOr z$m}S);5H45-i?k&a=ZAHv+FeO@jGl!dMRD>*I3T4aeH^F!#epj5zh?!>?1lWUVqK? zoxTk%*}u6670QU>^|oGi$ngH*tIykF7C-uPbK!P_*GpJDvx1l=ezcw@{O9@oZ_&GE z&bVjPpYz?hWo>3@A@^C>=mn&-U0XM!{=dUzDMtp=u!Uh!v4@1#_np>@RXrTxG0kHO zOX^$XfzY_v&CIY`?#;y*_RY~Vvy1INt@_#YUPI~VcKJOsj#b_@eHt>k_tQ7tH03Qx z--^$ee%t$fn*qZ;i&q@h(3%cbtLr)P9?Ot9?33n@kS%z2*;$XptzV8?FW4?PbMwko z>#laT2Z|p-t$;ei=LLf*69(R&6_Y zc)RrNZ<;5{&MyA+V8P}UPof1hV$RE6_uReAbVKN#N!%9DMuTnBn#U z77}36X+F%ffBCDDlhu_A)LAwl4RPPH5}pVuC{1}lg0JIOt2^AD{!GB!piOwbFsJh0 zo%3TARSlhPUU`ylwuB!~he!SEH;Yd?+^d{=*52&P&DkZ9dC$Y~8|djdNct-y3p?b>_P8@SzMd`yb|dD+gP308~W2S@W!6=J6;>TlsgK^s%H-iPQPr1mO*aM z{PyHse$r=qJ`2#Y6!g}?x}UR_dTpL~tXE~iW<$pdy%(c(qmFXlZ@LbyOB;58+ak3) z=NB`*NkppX>OXnP=`Xy0E@JY8qnO^Cyc0a#WACI84IV;VQSET%v-HM1z16H{*KE&8 zuVlXb<*EoIKVA3%?VEi)>bhwDCRSJ_o*S_DzVtz#P?J^l?BFKEmJ4fdyhHN?D0sov z&zpB=YLL>LJ$-or3*SC%c)U?1>yE*pUHM7%8xz&uK-0I~Q;it@tFUHO)i0y2?ALLJ z^96fEX6wz38V{$k6B7+2`e4V1b#JetUM+!7lJ1wcXtekCYE_Y&CBxyuiiYhMp7OV2fPt zPL?>l1{Pd*&TrSf?Qyu9>zu(Zu?wGSVihiw++A!ex^(XU-i>u3B}_=;Db6blA#r_s zEo*wyMWe7E8H)pVm+2e7vpVzV03@ob#V41n$|*Tlv^!xpXv`OeBOiT`5VYL#{_c^* zTYsA=A30UPr|{wP3;UWaG5*GD;+JK{?*NoWOu!e7hRWeR!jtluCnr}po0yl~b-ro1z@ zKbvCP*>-Q8#~sms{;9+RuRFipPe@O%|FM&$$f1byMDtVKjMVOjFFt@uZBWW--}J{n zYr5vVuo?TRPkg_+Zc@K_t8A&w>l067*s^lv4}sH4T#=uor{0$+@6;uyAD%~yIQ#XKk|zI zq-d4}T@mH&_1LZCyZk`w4HH`ZrdZ5!N#UeCPs z&vS8U$5qVll$zT!P@3%JS};SXSi2i=r8AU z5~@!YDKEcZCx19@y}9VNWxgRHPN7nU51P6`tDWxkCQRnJXQ(M~M1xoURJ#diHQuzA zRebO&)35Lc({DOw zc2}(2+*w(DL`@)hQrYUQx72KYISO(cgOwN`VO{C~6@Ann@){&;)h4%LUeevUIebmV|#p!(Br(uob-?p&}z~y)P?OC^6 zU~SktOSwT4~D3 zOS_Ym&0$g8+g>gko;o98yL~5wde^afdT?p*bUN6-;aa9Ljir@uqx94DYqS?mJ@P3Y z)b4|KXCaIW?n_R=>UZ-VNE`Ucg0~Ns-dI?=XK{oTXmszQ>}~e91?jr8GGD7$`c@yd z+qt)YZG@D?#LN{>9+mf2U+S9=^Y#n(13|YJpXWBuIwHtA#rr&$?7x{`mNw)sJN$W) zS;Wu9i9!!dR08zs?z`-BByi`8;@xTJd5Ptd-rlfLspukb9>Ukv%TiW>en zoNV;%bd_Iygvo89_u6*%x8%jm7p_M&EaM~|7x6{lt&Wwo_=@J#UV zT$CJKu_TyL=DEYMab@lQFZMcdJI$ zC)fI8A4*#o=G$CIPi%ZSIbz<`xO?v>toVL8vcaCu;XkkJcKOQG&-pui7x`eU3H$K4 zOuqwE+JKq?@Gi3N|ooZ`XrrpRt{NWXQMnl50J#pME$~}2Sle_;UUGLVp$Gk1`hOG4;OZHPrwR4PQ z(Z|K=I8&E^6Zx4x#~8uQ)cJYo%eTgO)$L+?*gWNy=5J8@c=(OjU!na0zD?#@Q4c=_ zNl!7_5j|o5lN8Qpe=wY#Ah{aaFx}||pR_6!@JVzzkd=3G!)gzZ;PQ)YW-R|h6fgG9 znIbx8T6b((>WuAQypMxgVzoP`EnXG5Ve#1y=lk@H-<}n1LLFu_d;a#U!i1_><`X5W zv*y19jc$Odw*~LEluloNkZrfiqIUs#lgoVqtJb!xP~rBGmA3hl(>bYEc%t>|zyqq^ zc12Hah|33+ennM2nBBMu3=IGNeLYZmgIU}5(_Ud>vgHo-dNThg=*eJ49!*6+KaHAkw$xuP;g zOu(_bo_U-3w*KhGXPhBFcJ2MmsC%Hf-dy%v!9tnk!S$gZP8{`~X!UXr|6+mI^oUpWiu)l|0`Xz z)M)*jm&qrt>(9TH(tUSRkn&z{muMM7>raZTio2(F=}x^DJYlMcR9*2Bi)Dtpj-H9W zP-@Egr81wd`_pp0BZZZ_;vfAiP4X3=?f!2SgU0!d7Zxbyn%7Ba{`6s8?&6-kgCS5f z?w8>QB`@*X_C^-1bAMlZu76^8EaBt13C~@br?@qH&E4Cf{gPYSea=6ww`Mi-QyO=N z)+D(qcge0P6SN+)!J^c3}UE7q?6nMZIyb+MYj)Cp$L!cUE`9 zm5m2i-!uLoth#ws-H$4@O`9$s6sc@}GRMFwUr5_qfz`K5^4YR)_OiR98kJ7(j`h3m z^K^IfiM{9XquyB{qGqPso3O;YZS!v#9$Y4^SMI+f@^?y(K>y{=*K)VE zgk@M9Hx^s_ys^_1$9k@9Fj3DURY&zjtFt+`*&eQj2WDSGOKX(p-6W+0TC! z^;5)oL=yZHX9iUnH2l&0KZU;_{KFE%O4*7r z$K1DrIo+n6FS?wVxy|{}^9di%S4^Dn;z>{%(`MOASA{k5U%d_g>G*_I;D^X6E!Bdm zlA7(mORup6HyrN1R^Dx~%X-1Ak~Kk#I!@30;w9*>{(Wl|E5DkRG0WAD>~;|`ec#I; zU9IB@Tj_2)UGKbL{^lDq7EQVk$B|pj7k1LpX7lDHM`zsa&MHjWcy%MkmzW~A+Z=g0 zr(*JEJuv?&xI9h!W5eOs{tFlw7#K2)^QSC|P*~3RQS)x#(OK8e&%S>skn?ZBb~kU& zz{G2O`$aT%*j}6b{%?`xwojqi8w!OkGjYvQ*>2!BBVnq~Bu433O@ChM^GsGt-udf& z@XhWB<&WDuCFO*&PcI8Nzxnb(M%h!!2@Y?#H*ii!(iD7tX6vTbZC|FQWnaDX^6P)K z(B3?;MImxrTLdV@r76CPYU zvDr?`;}A=I;;)UK0w)ig-MdmS*djD8No;D?%t@@7+9f@w)+Fj~(7!Klrfjpgcis6- zZ)2}SF?esnVRkv8ud`fqOiN;)>`yoTRt&`C+az=eiO;Ez!U0c2{ zJZ3Uq)RM>lxaX2v2Uq=NJfy|B$s*^$gta$XThC=HR(~~G*wcJ~*VK8vc}A+u59u{| zyHtZ;PI7r?+!V*upgo9p*mtk}=Ga67w^Zf)}vv*~M=2;LWXulk^2 zv)#9TZD(mmL5tpMqmMaG=Ng4pE>gB-V-mA96JF4_E#gA+Q!c?NZL167|1Vf-kmmXR z)LNgCmcVbUHQl<=TP}aik3a6Ws4cmbODucytz%7wk7r9xWabRl-ZD?d;Z#WX{wIFr zAHBt+_!-}>^gXowkxEHs)#UHNw(s^ERd!5&x=(tN&BELsGnXm%_%BSeIw_|2jDN}G zv&mQII^AiU>+$35Z|AF98Sc#!Q;@dWy=1es&Z)Bsi-s2-}r2eSz0WwBF#JoWmg?4Gji^&5>-@+xmW&35{m z%ltfQ@AqB3cSZKCGqnlwyxbJnw{y=jVI|{jXTwVxLNcz#W`F8`tMENOxto1L)%xZo z$$Mr>9DF(F*Zczv3=BM3JYkRJR~`OU%zH&UdC`*>7CoW|7FYVulrY}Bwuoi^vLhU# zk#nvEd;H^jm~gS(mB-RV*`r%Rx7=Fo;lm2?*$rXma#AlguD!#=r^>we(<5EU@2wwa z1~WB&XzVO$Q9HRwq-t58$;A8I`N2)APHa?EFwp$&xqa)ZGdFxPmL7?@^n-2h=XTR& zMe;t*oj)9RJZN09qt4V|ZyxVlo=7^=`RT=h=pvnfC6{xVWf}&$wfH{^aR(&k8Q~ zmbta?%4Z!bz023Buz;^PM)J|KyBWR;J2!CuowhuGcjl41>-zF%3TYKy-0@xU(bpXx zH~h3xnESa-Chm+{R>SRI|L334{H)`A_nGc2ONSN@H=ph;p?4D+R+Y~C8yoZIh`L6{ z>?YZsAlC_XYTm97^LD-1^k+**w^M~~!r}W*MEfe(6;G_o@hp~LG(9S}b+IqsX?Y&b zu)l5EL5)|V9`9`IShbd~@^|Du?%hxbYXCwB*%2Hx^ zf8QrP*lxDSUfwg*B6w(irH=tJG*d-`AsIplqq|+K0l#S ze*fm3vkeT4c`MwDHdQ`UW~e*(X`#8gxyP~-i+Iepa~62rPSv(wsQv4FYBJ+w%Stm% zkNpbskIMb~C$xU&fA#;TUG%vw_U%2th&ShuaAC3dPMy%OW>)4SM)nNtO~2kvun_0D zEmqHL9JM(%BcGM&-ogAeN$l5Vt}ch2E5+NLPxQ>3PCeW=suA>Uu~ zrH3Y+2-Ch4*->Zp&wxLz_vh6s4>P_QyjY^E_)6p0x%TSa9DBDamS?t9>?rTp^Xy{0 zb*>|izV?}wdigaxXS1F=UaV4;{`>6@hjwk#)|6Sstanm-J}7Q@?BXtZZ(W1+`M&6q z-Z%(3vXNrnEzthoV2vN>zCwwn|Dp7a({+ug-~Y*43oq4N@+;I>J-)H%SL2;J+pUj28#r^u zz7YG+a<|QW^#lX$MQhn}os-wui~B9wGw++QiCvn5{eh6_{vZE8d95h_BiW=|_1~oT zdqqDjxl}WqcVXq1jjoDMsxq>5K2|OG<^1%H^=b`;OtVO(Ir+0gmAaC@-85GcWXrtr zgQ@I*$M3MzoRUux$HT53&ix$e(vsltN~n`xbRi$he$D^4C&y(!X3|O%KF4tUK>yqL zYoD}#>veBZm59;4WGZU5f6k+J<&C_{UPw7j;g*|fyd~TsRpZx%+Mua7HqSZe$fOor z`g5aLAq#&g*PnAQuext8X*cm$Tz+o$iUg>wZ-4cxLV#GEGv4zux`drBZ1}rvlUGj zzrFKhM(Kp^eYV>^i9UbRa{bw?9Bnk3}>7Zu33S;yA0+j^TW(WQ}E@$HBI8 zzg4!gmsl=xmEKo!*PVl5lJJ)Pt)4gJuDuppzKU_*Ur(EJHV1BALQY4z^Emch>xlUK z%X-NoJ^P!Vt51Epm5-W&40a!Sr?oAsQ&F)`Y6jC5J0*qGShLT`AAX%bK2y-|m#1;& z&Yf*@*t&NMDNPMH)4#|+hv!~J;$_K*1=~!_H!k^ZbVdJ}m-WX)mwj#ROtLoIk&&`-!+Mtqk1Spdc9@@JifumoWZs-{8!$%F!UU=gdN1{SKZp+be%hxO1Vob@?M-g}3)qH53<^ zbNq?f&3m|WPtpEWo1U-NF_4@&x#aNHJ=KM_X7$$mzRiTNM|aiR-?pE5S}InYzj=17yQ}oiZL-#OuU4o$7G&q; zy-~`?u=%y9amvG>XTP6p5U^jQdo5-5)knI2pLZ;YI=lRS-2VgmGtLX_3H1K-kk4kT z#cGD5UJFl8o}bXCxb8&bzXjSp)34uIpEf6;`?rbD95vrErpC1;Ke*P_r73hfF>I}@ z|7E)Q&K*~#`uyYK3;`1}y*K+jdiQ&2XGU&x?D8nP(yDTkEs}gs%8ypbWO;j9Z=H2! z^@r!pUkzt`x~;%}EY7PnSK#G$rL>3B|IfO0FJ#%$E6sUIuJZl!Ud}Ilc}D)f*_7i? zjpX*YSjBNH{@cXV$ED5?vFy-E;SZY)KHYlsoU4{|X3e_tdZBif*T&cX1e9fm{pl=f zX|g@~mxC!=*hlJ{B(vPL&Y!+uKxSEa_xvf7;eZ zh^yRky5?)kV_VCAmz4QjySz$pg|Nf<*#<&ant1K~cO75bB{;icU*Fvp?o`$D((Ug9 zPyP$evP+zu9(A7oqs9(PmEF~6Tl8lu_Rr;bxq~hAX`#oBDcNzwH!Zc&xi5O}=)bS1 zx7^m+^Zev zbe@PdSutjju&m_Eh!DF&c8Sn=%Bc!_`KMJPIH$@@|)Z} zITw36=B3;Wt!D@h&p-F)<(tX9ZU*$|_7*l_6Yo@p~*9e%v1>BjNdPaS3Vn*C>9cW+uA*O^Mu ztFIi=_&N^!U2yDY$0yh?|DBK+d4X|}Lx+Jv z#=2=y)?G7me@fq2XX)G#t;sa;Pa(sWi7|0jI;ZM1z8`W9jXru}=I?#IT7t_yxdnRl zYNzm<|DURVXWP1!o|typ zcc0f!(|Oza&Rz>jnzjAImnrO~Njf{wR4k?{5(P zN9x_XNdbMaE~}QfdaExiE}rF4;jQ+z&)2(VeyjMGU1BuH^z5Z*SD(15`6qRMvVUGs6QQpfe*E@! zyK842s#^6dklOpR<0ezk?aqf+imy(c+NJW6@z?TamrG|%Sis7g%_;Qh#ZgIi_DfSG zF3ShpxX*I+^bDWIe{z!=Ik)9l$NW3-#9XIT*tRRq`R})dwn6*$8)_8O3c~+WMSFndy{*wUa{ zf*&rOZFsmVUDCiPGBP?qyM%d`Vrox<n^xs7^)32V z|L0@vq%GGzuK6>qZbe7MjVHa!{<*Y5Mz z6BqPnhhMoC_rHB<+U|Gky3dboo@*`k{hj07`#0_8-~OiXern`{=>;3N&U`EMw|-j8 zj@HE3`j8tju>xxpIIXsnzt?|QpA)*lBY02Bs`rJDPkb~!#y(MO%R%E4b0$1_9&^sr zHpr;H_@%&M>AIs4_h#s%{Nr~@dDktr#4T}+=W;hoChjXQxqI)lR?Xr%8(FQYx@@bg z(2W^Y>B6oTlmjiiKfAf)8A)B1)Hlr8Xr6nw?80sL@1BXjo*mk@b76<}R@+C{q8Yt+ zp4ezT|J;^@SH>dz8vVyvbRK%0{_*kMJv}9fiinWfmtBjLmjssbM4fJsx!;g+qvguu znxdd-kyB-=P8Us--E?Tl##tWgn0~LH`|!~o=ZNz?Tlea9NO1Ax+<3dYBRVy@C+q*# zAHD&{m^u!uE?aIMKgs|4XTv=^=KgmrvSD=1RTk!t7T)H2{jZP9$!#GLb3ZEA=KI>a zCf3G1xA-Dv)WE>N@m+cLIr+GKuhv9L&2WnUvOaP33AJT`heR{J8QP`14Hfld`hB(b zzK*XgL#&qa)yj22A}??2+`GtqyPB!h>jK}wSp|Q(OiOQnyi=qW9-1S{?=Qraq{buT zvYO5B;o>_T7T({=9owY~)}7JZ;g%qu*7@3@39rswxbte^iJwVgG3FMJ zg<{WVZqANi+~TpG(N1*tJ-+u1SFg1nj{of}#TmfQ$V8$X2ZO9RQIsVxt<5DE$`&5ZyvJ=+b28! zq}S_7laBu=ef762d7mglq^zpFgZ<}{{R+)97oJzmw)^o`Nq4@i#@tD3ZA|R>CVVm6 z_C02H*n(?GpH0Ps9!nfh|FL|!?pH3w$qem|x_Kwd{&8(%+V=G2F&6Ra=A74`*US7% zTc7ZN`{NvA;rZ(EO>@8Pj+V6K__nH`Ut99PbHy`}|DNvmX)E$6Zd&XsQ1|08TZ0KJ z!`j56y60tibGD;>*59LIOQw8q*l=BPF3ToSMXCP{ zw)f;XRK8Wr?M=NKc`e^y;qB=ky`5~0W~urXChL9tc*wUyI;nogl*3OQ41St0L{C%< z5Blq(u&;d2$(LKVx%ghyyI{5Kfy*`Xl@qNyJ-^OVk6E>#EPgG2jLMg|!zXXP;C50z zR((gPMDXH`wVyw^9I!j&^;(sUYsTSad%|z5cs5VFy8G$Nw2zb1E3Qv%oVC<)-g%$Z zAuHHhRrV;nl-{-U^RIB;LK*4J?@NN#p4+!BSMt$qn7ZSho<4RT-4sW-XKULU!r!D(Zd!es8>0(CA2K4vscntrg|cgkP;z`CICe(wDG zC0YS#`PrdrM;2~xbP4>n=%?tM3&kvW`W^&9W1xIb(?X3>lp zDq9TJsZZ~_TKjBoK(=018Sx4ippZA{ys^N*p_jxbM zo3qs;u-s+Rl&`Kg7#J8-6c&E?m%=iG-|gTVR`;F%>UWkNS2+JE?*FNSXE(9@<@o7R z`lM{enM*6Ib+y^zrg9o?R=;Ck^6pRN>)J;(=Pj0{f9@9kYP!&L@4=0N9YReSPY(t1 zojDQrVUd}+>yI|6O*fqX>F;F_U)_+;eDuT7hy42T{$39n7O{Q{Q52PIs&DmmS3l`L z$M;9n##e3H3XvK=`9A6T#E96*pJ|x%|I*KifwxNE_wHct`B5;#+9&DSK^IfTnyI=4Tl=w`6B@0$Jeag<|={cG3bT}wGobCXl!>lB$c6XtW>s$4&D!xyusj&*K6Lgy00 zTm{~@%$=R&w@WhC?qSXPn!Ei+uDe{UZSk=ev7V{_ zbG~oZU;WPHJv|2n+&_J0wmh<{#o^cAk1ytSUAK<+GL|^QLYA#I z@6YKAKK)Y^9;QF7U+-GrVzd7nmV`!>#S2)S-hQO@PfG&-n&OJ;+n;-W+14j>ACfIo z*?LFEHfYkqp4o?D?{0F*4)vSevRYu>hr5zpTQjpBA6z=i^B7a?@er2T_3!LvtFCOC zwr1MyNU48QHN6-(zwxh?VfVgrNWE5ZpZz%@iSo&h;}SR}{&KzOi0*Zpc0u!YyFTOf z&U4ClUOxJheD9*1<=^+pTMV8um&bJndA5B`c%-FgP#6$!X63vu9x7HZHN9G&$iKU1 ze3fgB)nkVG>9UCmd=uJYFYKx`ma>qpH9uS~sqV0K#w6!Tl_filR!Plt{-WcbU*ynY z`FBIA=!bQW7w2}RZoGfeR4J}$^6A9JM4L33Ywx6A-%{mz6WsmwnV{@}*Ps7QmYl5k zjcLo#osv^7t`vWt&lWoO+m@w4PYtH03Mccr2=ljw)TXRmCgKsgNN@R>dr>0QQ|F}E z9N2Jq-P;Wl5-px7*8Kj+-p90Gd-0M7CpeTJ+V^W%h8~vJ+KZ^mLjqsI#j zBNo`%Z+}0tlGABh*bEllEwWSIzg)j|-UsfZ`{kIKth6r6UKG8t(CutO|6BD{b0l^| zEtHe|@p<}s4KbyQ``A{s2PTW&5a#|wudAyX z+sg;)C0pz-Z{_2gcdkTB;hnO}%qud+0YC14E!EYVS8o4%%KlSwMu8PNJf9qTXYN_u z^}us+-jkz-bNROO$cUEDcMn;({qK?w>Wy{>j_>R}d1iIP!}<*A8g8b?kHigMpP9z^ z`~JyG=emq{hiz;qkUMUrGBG=K;+4KWW~oR2%}>0H-fH636|#L^y~5Yu!U|eHHQ!Hk zzca>3O%Xm+Cd2#{+ zgXQKw(|AuBB!?sc~Dr$FEJhskw_-U^|r(vHe=Fu<3Q_HF3*5>Y@qVtglvu6&jp2dG$B#{qI%Rb>4VPlAJ4l>B6!j}`G1`8X{T76 zdpSO8Y`zvhUr@j`^u`;3jDWvk7t5bE=q42(SS?U<p2OSF2G%DV(Lhk&ftCxPx4p{J+!>sVK%D(RnYfjb& z9L=#*-{-W_ATwa*<6qqx4sTYSofNdhA(wqBf6$ktKJE@)U%~Iyh7-m5IRd%y`p%F@m}EVCG!kIc2H;-0?1L-U!4F|Wom#UCklNtfdK^aE#Y7qk8KYX5%u z#Zl~AT$L9aupD?V*E{w8n*3V=2iz7fQ7tqK4KVr<-X3y4z{;T5N?oq`y&ijy!Jqva zs>Oa8tyMg?{y93N?CN87oXm7;?njlM=frp~9%#_(Uut~JaoblvZ^kE|&$mSFIyu`! zJi$&&zH*DjvDeo`XD#2tyJq^mgpa?B4pz6Xe9PHmczS=J%4LhrGaGph8;4g<^W}Xb z$uw_~*Ary9XXv?E6=YmaL??v6kOO6N# zg!6xUwLW;!^5OpmOAU-lD@cv-BaTMe0q>Vav?d9)IjBn?t{<+E*MzTQ$GEV}jP{Qk5|zq7wrg?6PrUubsjK)0^uUG~W4XRMNY z1^z5FF4DOlC9&vAm$!A?xl_~Jf0`@G$)_Hx>^tTyd|>jSeMS*;lycUXAJc4pm~~`U zTzSoWd9$K@j?Os>#_|?B0y?j+ouiemxAtcHjY9Uf>lEId3z9OJWYnxQZL|8~#Fm)f zXPyhHFf4wg=Egr??x`G$+=GT)Hjl~`I<`l#Ol)1$&3n;OsA`f7NAI6?r{-J?R*b!y z^FO=gpvNae>)ODO(sAcRE^GX)VJS>ZkTTZ%?XKY- zc4fiqMFm@)v^Vj6oTF$~oBcQW&nkw<*lE(8wwI1hDVFb9EU7t%9n@9kzH2gTuNQBU zZ-j$}eUkpM7k(<=Sk-O2mbffSSpDIvSY77(a0{V z3fVTFaJpmpb&kaJUptf6wkbUQ6sZ5(^x!&2zn!Y3Q$5usXNV|xRh^ri`tbU#g|9n% z?|im9zT2HWT<62~i#FShSXbTH_H50;)AOy>TrE2OXCFJ-d7g>q;{IK)Iy3wpO^E6K zr_*=mhxgT!JRYC_tjjo>5$GXaAo-T3UC6y<^Zu^T^FCRL|Bqgl+9deI<(aQ$sKMb@ zfyXtf3kt6uT6pB4_9LU8Uw?&6cX_u>wp~dr>Vsvy#idhzjUo?gOu6LGUcBRHzT4|( zV9+gz%=^(DIopzPD0ty63+ zxriONUR3S(eDPWK!jJqP{&MJV3E~pwpS!i-)ATt1rRis0*>)L(y`5NB6|EY!NxR;y zHD{G=#QUFDXM9ZDc>ck$Et9YCq;!N; zCoP@B+U>mSrKG3#tGQcwgPm?~d^v+bB!9(<=C_aC0$fgSJH74Hx(T~ge5K2jSeQx{ zS~c{&R5RYH{Ql(C$MI?FOV-pM)|uh`sbpvAvez#QWLYjJGu%{P_F}$dpPTZtaP9-y z;^KZi>FZBrg&Rt!w z>*Vswr%x>|usbMJzg6GChH+v0j4wY`w>xdWnO`^i{F>4gp?B1pR!v(eJ=ODnuUNUa zN7Eyhf_|A>3cuAP=DWMtIG-wi>tS58?K|I_#c6VfjAv9@vHlWS7hPudq{s=l1=e zo5xf)bgw-tl+)Xh9PQC^B0vy z4~am>_obhbKeMjB_~p%A!%xfZu!YXA__8V>jLS5CgK>h-3y%X!E3#G;#F|RZ$nq;q z__uh`!jOimuKFUibLw7XecchC&-O*T$os=dZTl7e3H5)sKW6x8xrnRZG~{GbvfT-V zP3BXxkIkLbYpT)wRn$ArUXADMl*5V!x$h6(;f~)_T4Cg&Z}@u3uAF}}(kj-R>1`**DN=~9$G*w9@c?0U#(!RD_gkM3h0Wtw_+RtxPg-H3_gfcc zEnagh;J?E954GFYPkgR;p0V!T_ie2+d-H>Y!~#}c&YXCA#lqn5%XbPr`71Vf{#4+a zYvq1Xm@#gOz&(pa(o?r>5?1|a%zSpCRfN;&v~P=S175UvHVaxP2ZX;h{&{wa#MABj z&DdDpcKkZ1>-wX@LvyFxMH{sMj`C;fhuau0Xb1$Qs82917B==ZlAPUi=Jf4*`lW>@ zRy{ewm47nfv$7ap%#4*E+n)Vrkv%P>RougRB<$kXKR)M;XQoxOZ#wh%rR<~w&5h#D zo2za-{UhfRu$SwEqe6{z`pz}g2kxy`U3iaw?$4D@wKs|bUWd(jZYHw1Np9bD=l;h0 z6_z0gRIQGCskiLH{XP3@rcYcTT>Ii1r}(G;x0f7C6x(y7YXg%` z!K#|*o91^c_VwqkEIS*ovMj0dD%-=ufo;|`Q})KpZQFZbtxLXyd2tZOq{5QwB2Vvy z+p~g=tg;H3&v*a7r)TW;N5ic7lPJ-|A(L_I+?R;@Z`RR4<1^}Kji-PeJ`1; z^PB&)*YVA2`fot?QuPM&nz8{6RY{Y7k5?cV4JAwvqr4sV(^$)EAZYVy=Gln<$11~ zg|lxm&lFcKwtn&G=(-8Ep&eTf@*LNRJ;1W3T%GgMHHKZg&lEmnp1tMc{_SxNhCk9^pZ{foyLt<+jUpT$A8W>2vaXB*|@Q?_~zO^ z_25;vS2DG2t6@yOlK$e3_!T>)BCYw(zaO8L>ndjT_j6A^IMX_*zy0pq^PlhTpV%WW zus?3el3kZ(TUqVeE0h&H#BT|Y*8De`cPVw##>1r-?O9Gg`Cq<; z@yb$xqmSNw+OhuLS?L*bKJD%_;5mIZJWDlk)mu&5XFFAYIBV$gKUpK57{HeQD{a?b z-CGAr-h>%2pPFwyo5LfQ=kS*+h3&n)hP;aWz0vZUe`Gp~3-y0p@$T!3J1&-ata~49 z`ts;hdve)>kKI`YCURy^eU#kmxJixW~a^D zjoRzNUQ77Y&F%Sq%T)K2*#AWu{jB>AJ26T58-1UXw!)xoWq$1EeX{(_Y8$rPJ@;9K zwczSpo^^cdMY6*mGrGU(mh$+i;{9OT)TvM2v+MM;1$4wL4r5q+e&)q8gN#d|e>!Kp zeR||c%=br!vlI+Bp17J@_9*#TU#G~DhC^TGaPJX3Tb?rC#r&@0OZ^Gnp__~!b-%0M zw%xsjKiK$qLhO>m+oq)}BzoIAu2Q=^yJGKVqpnopv$y9xPtTd?A^bo6=GqMplr@UC zw{$PPH1pAByPZ2a%lMy3EnNHIbznl!j9oFCBVD+SRM#kMG{3hb{Gp{;*}9`{nH3wh z9pZhb^+@@{gV{lcm9BccJwJQ-6rnXD{;PY7r_21@w#QD$d+uq+h>KAP)=v#z&bsp6 zt){u~b+`KU=}Vk$)QdA}W@Nf4=I@Y*iuSYU_52!~pSbZzZ1MXv?joi}?P(W&Iyc&v zb0x|e%M@RwBe#Jy&pnPTUEF8H`({WQU- zc2lL5m3a@Rmt6``WUBpoOS1OqOq~@c71l3OmvAmj{rjzBcYbK_zJ-}zu4%1i7E<}W z^m(XB!ht9^wuFO`%q~rz@0~t(N+GFyV_2p32W>Xr`@C+m*H77<`9aPgFl)MM($#G< zPT%r)|MhX8<=J_L7pAZ9*f~SZ;mnMtwOUtBKM0L#fAas{b@i_==F7C}sO(5O%)jZE z=Ho}&3ns;|b+9!TJ>~e8@o@Hs=&x75a_P$#Z&gj(KRIn)#v93t-wfE#9ynO`Z-1|R z&PDkHYeiX;4f5SAjC&UfTIBD_S+@Q^uU@k02glnrCO0_>3pdZ})hx}H44c^^uOPs& z@Wd3k*F{T~xmw=d+_|vp{ArPoKM!AB?XiNR=S;eJM026It=!bh=E=H|iJx32CtmJO zciq45+>R+syA+vb`}qppJ<%mDl5^|KrhYxk6}tX^+;=XGTU{>es`)jp^ZNZ6ol`lJ zt5;=tdO2!k$k$o%M%uY0>=W``TH?&P@$-MS+YHiA=Xe%u3~K3}c$$0r^>2Z?Zh~`e zzG)88W7FED#*%s~Saw45$u%$4WKDE;xTns!*(d)*^=<9(x!q}pvqW!y5Rb5Xa`dj# z-Lo&R-+EB6$!pS=|A&~oel6lSzNjx*eAdl^vwc;wmw5h6Q$Ck(wZrRlP{FCDlF3i` zj@)#*pTzut#dY(#)^`eF(XWN`clbTu@MMGh6PNiFk@Y+8CdZv=Sd}MnR_JS_vihxQ z3w*kcAMFX(4ZibQOg#41&eJ@y_x<}nvrl;;VG>)asdA-fxsE{Yox?RNC0FtOa5+|F z`+c4H8Sdw+c$(PtGTtBU;T>aerYLY;iphxDf z@0%TEAIk<^*;gB!P?-claFmOzqQ}B>BZ7+ zpL_Ka0t>u9@w4vVZoBx_uQx$+{kID2TYji{%>h5%I|0cToz`AxVBorSw03TFt91CL zo-0<%JvU@cE`H)t9uj)#n^|%Gv*k)#Vl=0Pem~n@@WfyrPijA@>7yY1_uT_5tk`Kzw=pSdtMWcThoX(g7(XYZdSPr6fKs`Rq?gsE<;*8d&M z`b~;&_FQ~>*V=meT(LW15&jY?fxEzJu$fc~cYj{#ColXgYu47^4Enb&C$8xJp4R-icPh`T#@&JpO}Wa# zy8LDLnx>zRx!C2z7<`F8ek&j2ql`y4JRV(QY&;q_qbXy`Or?|O(tHfQ`}v8oyiNRi zFn@_p2*u&d4;rq^W-nbm@^X>@uP}`Os+Ok^m^FkT^JI>2K zo?5=>?uXen#~!ITl=bO~T>fcVB9S5Qz07M7^Oq#aO685ZQ)OBnwubz=&we)N2m8-U z%Nd!Lt=z3XF{sTeEmcoNe)Ys+^>qvktfm2fdX}gP{Zd`;QTFOFmr_$x<&ye2H4#sH zJUV>xk1n1yWh46^=Z)+3g>ByA+OlMxZ+Ud(iO}=LKi>JJFIXIZ)^zgT%|{=cI4G6$ z>x#iKg`m=vzRK5{A}_=|$^X9Of0^-w^LG-Dg*hBQC*FH|#m}GXD%bpxEjDua$NE)v z(caTj_HMiU-{kOKC5w6DYwvDS;JvZdOYhT}wai5cNsG+-f2WClzIJ2HIjy@VUl?y= z3F@lJ{x3E+IyZLtmEEUBdSc&&zWvA-vF63<1=|FA7F4`TSzI=!>ipBs`y$WnUaYY$ zr`}`v164LJ@w?V8Qk}Xt(~P8l`~JDRwlFkq>gP}Xr=9=$(u-|oc_skbhKPII- z)%J1FIM!2J+pym$m6daX7tVcwj7`&Xr{$B?KY#hvABqaOqjAc*VAgY&GcIucI9ztve8KnSo;&zvm#HdyY`h>TEWO^1`O*sUj^L6^ zz0Rq}Gh^>G9am>l5p&Ajb~JIXd{4mNU-8{svRU_D-QTiu0k`a`6c>iHGfjGeu3G<= z754UV-1)rm)BHl_)*aKUpWpoDw9Pxj@Z!r(PkTcq*LzO-K0o?WjypxO_cI)KV`X3v zyT4~!rRD*S7tF6;R!=N8({@S;({v9H1w{@xmFE7)MolSP)Gsm!{l zb2Df6&6F_u{nKjdMnRpMzXF-l_!6!q*D!l6laJWpESu5sKbeiaraO0fn$DN&SK{8* zf3D9BVTppS}M-m&?**Nzv}Q4{T=l@B7Pb&OKmPIrX8Je#i8= zPsLrqk(vtuOq~{ZM)PV4wbayWmAVJEoeX zJUY~Om2Jxhv6P2jmPnqj+u`CXv?Sq%?-xd)^p>qFcdWCxetui0M|Q^B+^{ygvlF5j zWLWKLPdVvNT<7HfXX=$pha>dnIYcjBDVZ{leXqrC3$Ve)tBlg zkbLv{^Vx@6LW(C&=LR3OthuWVxF6f$aF8DcZt#SGZcZKzKFT{J>RdnvH=iODv)x?mkGWEZn&Y>;wPzbWdHgRvtElVwVtZY1V)Vob zodWfVjhfa|;##_wt+;0CWwv+LK{j3A#hSb~l25+roVUJ+cPHC>hjl{p7pwRk+)*z+ z`)!GsKGwR(bLZSz|@w*}eRXWF%YKU~7<>X@@m zX67Pp?;!WLMe}&X!*T-E0%w&tJpG*(d9V1vD)R|HME+%@C^WABT+b@UE_le)Hl=iR zs-1NF;hdyB&)!+>Uj5api?yWUW>Z$iI~T(*<+uM|tgz^CoZt4tCT*pjQ*~+amxRwh zcAvDh*>1LPcbTZnwwhZJYwEZqmn^=uaEH;s)Qr`ic^R&LQulOI7UySI_I}Q};+@&N zj}H|XGmUeSw~JVs?fUEVU-#2&`z2zG(@ut6+dH-1@6F20>w>@K)XN?J@3cI7|JG-@ zgt;5jZ8=Szeg9e)o?YQYg!Vz%PlV+s4HS)esLsq zr`EKkyzL2Z4{A2NeRFqTeCKqVm~&!zQxf+0zRlUVE>Y#`HcqK;{Wl!$i$4upq^xdt zq+GV{>1BgA^4ecx|Lj|%p{)9dW7eu!A-$XLdh18ZTkfps-28P*)ykJU9xdpOH#2?D zad%Bzc6zPH9~SM2%XK^-{h7Aw(VwCq9^D$Ium5BDpNr0NJor2R=nCh$)!nxaE>vM# zop`!wn}cdt(iFo)mM4nuq9)FakzqRf`LxRG8~%w^+z0=hFsR~?6HaUvZ~pPqOkiDc z;0LYpX-zxyzlO^s9x-3pdh28g2aD#zX|D?c?Ehs4YmCK z{$WOb9p?_3>~%{>nR-tC{)w6PC+45^4c`Cv(^M7h_7b($?vk(fTKD}AQ0FuH!*uX& z){m!?vm^2x)9)^}pL_0r{TYdj^7{ds*h*^|7{naUch0!8#_2j&6>q<*`c>z7MUs!! z<{67sdG@JonYCrr&VwEy{OaqIw{WN5_5Zs1)=Y_oI+p?x?~1cqh6pvDI=Fj*!~8?+ z8&{ruWPA9J)Vr%sS6=Y*vpCMLZ!y2h^BM2e5Li@gz&N#{Fcp%E51g2jxO+em2}1O_ClunwS0k&sw=Mb=HEYd zPWR8O?z@$Tm;Sa0T>9|Niqf?yPN}cc&&*^Gk9z68EKu5TgSANIrfpL;ot*Zt^{2?) zmG&Px&Il(IDKfZi-^sFRO45^<*J(RNK4q2PaWH({s2Q+v*5Zv59n*@Z+!LL$AgeXF zal!WRB?lMXV&v?a*5P?LYN4O)#ilt7VV*MOpQdLY3;$;GxHjR4`hVZEqDr&NuidWc znpZMwu3XUSC24laMbG%=SukC`d%$;2mF_&c`^QXgIlY@FetkZFGE%Hro%MKAUw zD}I;GC_1usdR_I6SD!p)?QiD)=y>aTfXs(iS_w~2spuSFIc!)m8<=bmIP-h;Bc+)eUv8{Dermqmy9@FHDmR==IbKx1pBS~y$)h@XqVz`j zSDc;3U5B&_^p?LaYPKyci)7A`K0bvzz#XG z@@Ml*E`z#BS<=TJ6`l}RNj7abwddcG%J`?DZc-bLPuaWRNu|ZPY?k`k9$)p-sZVx4 zTekoG1gRS#-x-gnFmRZ0A7J_!^NruFPRVZ5f6p~r3d}0h&R@Hf@c*^T-G0ke8~HBO zt*}@g;@%pyoZ~{|M#sgrMK&AW^M|RuTI6i4Iq}KXH%$w9xJYn0 z=R4!A{3;7AzSuC!^!=D|Zflv$kzZ;Vdyc;1-5U0$;A?G^5`m(@ZjG3=$ z*g7>9x#Yj8a#?4$L+;$&{*%>Vx&8g~Zp&umGwj@WuUC z_WGH~=4yXsDgCu%<$|wYOXp-7tbF(RQOc@IziYc2{C@v)@UD8b{`}48&*_#MW4m)_ z3h{c+>RWoeF=g$Gy*D1zn4j`)IC?xxc8kC%e;H-jTN>~7N@r3PQGdLYncM~2e~VKS6%hf1X`z5 zSwG{raleh6gU%ak5AGUc2R6`eA@s?I2oX-b>&hp-d-ze&EkyTh-w!eh$r zZ-t)>HfWu>&$nW;>ykB@SLTT(-pubX<77EJf#p3Rp2 zuc@|MY4u0jXPi5ZY`oaCvBTk1!oNwzRh}`|N+qVXF>c=MwCmghqlUeoCVG_Di%!$O zSigR`j6h%5%BOd|r9*z7mtp*otXpxE@9~M$TYoLNuQXqpJkM^qOzQb1r%%igOiB~* z$0ZZD-%GRKZE?%&R&HTCnsrd6h|rCL|dcQ4o!lsjA7f5+Sz zOCw#6*~l%Q6m|C`$GM2r{kIYh9bz~xv~a6vRjK_Cg+KZc3JVxYZH-OEl2(;6&y>2d zUc#zBvNGvHzQ~mJ?xP#~yaOMH?%tmE=<6*zwu2!VzYfS8xOhUhZBeNIz4NC+PdL0Q zxp(%5W5Rh`&NGRzmT!<+_c+S z9*O>&F3*1bYv+U+S6+WAvlD*nwLrf0=*#0hcWr$&M2{8TOPU_A!Cu0yb=i{#Co|5z znC7y|e_vSgGP6T!-``(7(figf=40w&?tj^;~jc)~JAG>qTT~K~Y%yO$!QU||Vn?=~>wy`d} zW@mE5p>?9%+-;2y6@(lYZhp|AD^>St&iM(K6qX4{2W2ierLlWW&dtQh{c#8Q-i7vG zec!Wc&fn6CX1VXHv&0`KZa8tO+G5q~{R{K2F*q%FcWA@Ts=0TJw6lt8|FptjwRUB?sJGBq(3~a8$`S8ii%x6JL1WW{xi$U zGvne`?{eC^_;jcC3ZP=-4y2h zq(0T)0)toZwzw%1p5-eDM`xWmaNE$x^k8^_RZes#~Cz>OCK+r+_>)EZ{|NHdmg-I;!`Wqj#&5Byj zAME3MCb8@B+^zM$Og|Jo(fPUEBzf2Kq?;#?uCaOKe`Wfq9Vtwb~?#n`TKo*=#7Ze~(y_n(0F>^=ZHFEar2mnaua}oT#39=s#YwcUG@OmgJtv z-nPj(s`}IMu+{Opd$Y9pPXFQFV3KAp;n6W?U72`a-)E!W+wN+aE%uE(@oSdOI)n2c zmu>s;Z|$SJR^DHellHz&>|U#IPCYAk)}%EW;tjnl`x2b5uxxYqNuZK^X_U-(&OZwM3cgqz_ zxushe`?x^&%GOWyEsUFDA1Z7sh;Cr~`LU=pT7K5fM`AZQqTaPK-@8>*C4Vk!jnCJ_ zBbPc^W(m&Pkh)Z_?osytR=0p4;?Z;6KR z)O`D7=`Y*(;?@>R?2P*r&*o)OtMv0_PEnF)?(VhhRUe(Nc`v)AynJfT%yaEUCq5-7 zuWm^EAoIxa>xsRF$99RdHKq$b3+P#;zDmm=`oOIAO?4CJ`w06iv|qP=sr+;)|HSWp z;ZL&G8ttB|ZehsNxbU>AP`F~k4#5vT*Oh+ni(J6Kz!q~*#9(sK^90edOUuto?yAT+ z>9ujQmUE)pI{ABE{{?(b%2zDQT%T$$(0aecRAHj{giEuTFP^MAdFFrM`cUI%&u`Qo zk>fgXLcu@xddac!GsOoR7JO^xI-RlD{;_95hWd#;w?9qhZa;cG^|DgBaTc4>BZ0IC z>FRlNyX~5{Rlh6L;eGhDljZGF_sJ*f9$WB)y~w&N&~jDjXUgL0p6hELT(0xdF2DCr zb*maf=XBX!&9~LvUNU^<}rtF!Fjk!}^{6I&3qFUnfali|9?h+01oqYzni$)wO=1OH{B&I`RU6LUmyQj)mCe=>(1r-hH%YX$3=JU^9S#?tzZm^ zSryr=S=9Qd=lZE`(a1ep*L^Z-T5&&X^7+D#OYF8kTB7oM?>_BySDtt>rM3t!3|7_q z7pl3^ZY{W4CI0@@J@?~lmPob!FL6=fD>T>=))1?) zsJ?@FW3M0>hZ7aV)^dlQ{FrkFFavC=feEPx;3AI*V#u0+n){DRrqWH z>!zz$wl(oweNW&!PO-DF*)9H*!AJ z$MiHKc*^WPnlZ~CNw$!Gwqb5G*RJaaKFT`%zdAXt`>vtRBioq2H#pg>*DSs@@oC;} z+drR_!WW#bHT>S4m^LwG#;!=u(}`y`-wOSAFSO~l@PX?)Z&xI!mmk=!-v5i~a(2r? zb%omP%T_DeG4p+$x901sSkJ%DcIjM7pJTcrV1anRq9?C3mN{(V*-@2T{`}y&BzyKF z2QNyC38#Ke*nRi$snQbNH_`^DkM|hgP!oKhx$R+7MB%v$D$?ec?Y~6af2ks3Dd};c z>JsZ`lVbu+MU%P{woVAJRbp>m+I)IO^^I+C9`n6@Bx%?zzYGCu#ncKO4UYgRejiu>kN5{6(^Eumj z&rM+XxktrM=<=VBGK;I8ZMq|Q!t3a1--ZJ-CW-aj5uei%G$)@!)HqSCzpo&wU_*26 zgxaeGVQUTvo0?u?-?WWs{hE)Nva?je-o)!!EKlW9{UG1@qm;c`jEU*&fxZu0rcHHu zwd6(7)O{82)0nuQ2Yr~qJV)fqCaxf(L&`y#PHJ0uM1$sQ=#;4#ZaoT^x+WhsJ z{d}EOk2LPMv>1FBE;6qSRSw-<$mpqda)RsQX^LkrXm!d8OEgclock{D@FqKtZ9l$m z71&?P>jSpwGxl?{Pi(b0 z_>=jn*!{h$ukt?H|M$($jWd`NZhv3fv`9B!Oj$zOO*Vhub z^KLG5C~~@Q)m>~L?wLKW_pP6wua!Z$+++STnp9{(7QiT#-SWy;(5 zts5@%+D~Brz1#SU+>9k#70%vZxXtu?{*fY+kJqBhDvf>qU0-BVyJT)bc1NK~&dyK< z&j8=31ztxixJ~}pEI!&_)x9hx@}cF|Uw`I`*6f`e`u}tO>lY$VVi-Icrd?YWIyv>g zYYRm^PxC+}uBb18Plcb{k1x&=H+?5>E3I^8?*!H}q2f<=H}8|tmfo6qrp(3t*@Cwk zfx>%J)^E{p3HZfRabBuNN1VMN;S6V(?#K>h!gbBnK$F?@IaANnX*GNP3hfix=dze< z<+pjVE!xRQ&TVdCejEgRdrM2a_@5^U!9Kke z(4`r=ghPNq>~w~yThQT2y&+3k{U<#?+Zev}RH5abFv(?4tmR~vvDohBzk8}ne#Z4= znfsN`rks!QmES4K6@F&V{Ha?iV}DkCJHTQUlJha@(8XQf&pG{KHT!=xa>}n?ZP5)U z*IJyI)0uk5etE~#TN?xSUwR)o!SC7i!w>pjg+ArHJ~?b#!kMR!qfVT7_TB%&4evuG zbHWrRTE!M7I<9?@|0^x+k-4i7r?=fYb}6sLos}yRa;N`Wn#se$F5=tA!P293Z)K-n za^%lf^#;$1E`D0(dAF?k!W7nugo9UBPx8=`6zf=;AzAuv{gVv2R{zhLJWlU!9JzVC zZ_RPZux%Zpm#kzyUOhDNNwmVd`yp?-P4C^BW4};zmBBw>tC#C83ROh%T4|PXvt3y} zOMI5PiDmBEU(GY3lT*FiZoYAw_;)$Kqh{ zwmV(nd`T|%FHLcryX>J>0RIjB_V=g44k7xnukH z%3I$%3Nsn!&vlWRHdXl3h1X|xmQ6`H$$oWek0R5VSF@e>hR92<+}(1275|iuxsU&D z*xPyGl(J%`@PXS8V(*#n-}W?5<=fx$pN$S3V7#sSQ{45v4f9-G1GBr+4?irDdo%M> z^wLLNqM7{9xf*v&FzG0|wq;#Y&+`ekscZc0R(#54xFLS&7w?2@24jhD2Sd+EnS5gm zJzHy_I@#5++zNskJ=}8_Gt7TN(ozR(aToDziaP- zWgF&Azo+dXS^O^8kE{LS#qP5ASB&0#3yrY!pX5v2{%|CQHOkz7_re{= z{>J@gJGgqs)`sPc0W3#t=G}`t-(#cY6kG7?(&t0#c;<)Fgxtt#Q|9^O7F0Z=mwWwl(k*MC`o~x%;JPJ1Wte6?pF!vmf zTiTvU4fD2Fb6}HMfE#C2(a%4-UX}Mn)|{`Iac!gJzBKm08($MkPW9eg#$UPI zD zzO^bOV4hH@V@Kp1<{c;6iy7~{UHner!zHg1xog5%%xCV*F_+@9(2tBZ<7b(agw?OiClt$ahn=4Tw?C2O`{kaxVX z^Yg{vT>dA@cY<|8UO76thBi$_9gXYU0%|0Ip^(tW<~P-raZyZ_Sggo zG)-o);rn${`nOE`{${CmSEi|+riL5{&^=E4{L92YnKo^;}$uc~P< z^ITQub?(b_>O3#SzdyO_tJHj|DuefDf_(YC&~VvqQdy8NAfGv zo1G_D)x;`^+WphE6nLI5oMp1*?{tg5wl?ejE@`$n`SV4C{)DNwmQ-n{EYS4ooOJTb ztRJCE=PvHN`O%?)v=_l9FRAPjlQeTkY0E z9qpwO>Ywkr+24Ou6X$F5iDUXP6g|CXUne)uwVTB=02Z=wrd2l zOTJj`_}BXCC*LBUDP8JDC2l8We%yRra_!}U%PVI!X$sqabkw#yI&*^XrCFz$nCqVK z{@32S3HCGCtn&jmTDpn9RjgjKT*T_`Y2K{NhIfah`%^eT*~Wqx+8>RbHF%bb^7-%uizfqiQ@?$DUMRU|`6p zInW$a^JcZx8TLPm-d^Q!>UO*1kzTviZqZ{0_YLQ!HA(7aFVVmKPcCW2md*M+mvx zi}e<^zV~1A=7WvR@1E2Aajug)<{xjq{Oetg?WE_5LG4NYI)xAR^psmg#N6$he_T-X z1Ao~!iRR;Pf9x%dJNWXs^pl1yAzv9*C+3Hl32Ci(v6$zht4-C!x(>U!b5cz=ZrNq< zc=@C)43YorS1-;+z)>u9y6LSk2UVQ&@`s@0*i-LP!2T^o@Dg zkpAw(*Q8eL~Z7{qakdx4OS?;}E~h&LvhQYJR-_a(niUc^hA{vP)KdkG_5Sf6TH9&0W6h znYGL1UX*_oU7+{+aoQrG8?&dM@{wC>^KgxnSOB}CvU`2vGP!9xWn&-CzYsp}=XS-S zk21Al(c2Q;Dz8t=b?!89Zx{S@Q~LhfyyjQ`V>NBvud}zAF50SN_(CeT^zNcf6~1f| z`bR9-WVD=a1@C>aC;G*_=|{Kc{#L({DD_QveNQ_}+wT6w$#Q3|FKLQ3dA_L0^kP6; z!LsWI5APDH->`|rPR&Al=>q%0MKi6db0*w&Y^ykXPV4J~;5nBYDqqj&jFf-%N0aLj0PP)3Pb*@(b9N}FRQ}uQ%mTK;kQ`{iYbR(WI-($^@z#A*>8Zm^W-1z4_ z%U+AY=@pwK?+WofF=>4Q?6TaybNROzD?7WkN5=*Fn(l9%o-zN?)~dQE&!*10bLr&6 zKg*^x1zr!yNd6e|GA7`p@r>u&$`m%8Tl)L#%B`7mrYI*Z3|qcT|LFW#)1FAIT+O7* zaZP5r{+iR;uTSc-92M2y5_4a|nDFdN^A>>_9bfN-_#`?WRAQIO zPOuQ!R2Q-|heMRpQ!@1l*P-Qp_H`l6n-7<9Z8Nw%@rl|3@18|(?sq9viiEqad!)NZ z_V;glN*d z$E?Gyp)lG*-|y-~@5=&R3Wgy#zI9*y)&TFPwubAipr%xM4TUM{m7z^B*oi-8VX=3A71>%LlL zp_Mh;{xF@J=69DEZvN`Kp}63>$@BoP3aj`_6U32mY&h zUvir#E4KLNQ4@`a?^q4@SMx5K?>4dSz4~tZ$jux}lQW#A%&)zWvD9Sp!ppj6E3dQg zMjqP6^)7PW>BAqdo3CXyzRz!Weey%?Ub~lTHYqUddLr#9C&9(%sC)SJ^o}QzoTi*- zVk4#m9iOu;RXOJ__nKVhr$_R49Z8yQB=kpkmud0&LocSj4tI43Imv!WZhCRDYhHAg%Pkh!Sa*7-&hxj?BLCJr zUdK04D}CG7i5IWF_*bH*r)O+DtM<;^K0|?Zhi#^JwncB6rr@6Cd^M&h&O-jy?x%~4 zG(IZY3&t44_nXQ^zI`|U#*65seRquyY_Y1{)jOz=gEzY^Ea~{H7=AMtgf41=9hdKeC%Y`yM9^7={`&IYv{ofPjzn)hf zOTQ<)GmC3ql*7i=&Q)*399cF`vOOOXHR0FfZ>=-Ta;r5tOFRm{Ni5%xXI}BRu2rg1 zgXi8)FI%r*0}+$Ni|d4)I9L6AnY5Ps-rJ0W&x*z7N&hvTY+yglvuV4c#_Q`-wx#kX zdO6=RbjmeNMDqwnO@1G{)??&zCX zy?USgvtw4*Ikw2Gk~3d(-b6GAf86Nx`TYKxH|&R$rZ~Ln+EsMxW4ByoT1&6^OL5I8 z@63zsi+N_Bt#|yqK#xf+=s-SaP8_4X|JL27e^jK!bA5_5x$CaPWBc7&!=dhP)14h* zv5k){83kr8`MJ?RqS}N{{pWRY@Ai$e@A~;vLdp(MLf|jzkmbx@e7sh_(J<@5>h0N~ zE(hJGHYJ7Yf1hB^urA`lxBsPumlZnJd`X+}XjSNefAS|5x4q^LbBc8_4RN>>wdRZc zA(IV1lWI@dYUFl3{{ET6wtj2fcSXC(7k{SS$ehd15X4tx_y=Sa`{SM4;?{3D!@E*w ziPKZ77Tt})yAyvu(0=PJUKiquCE^WNrzxK;Q z=cYgA*=O}do_+onq~jX?-Fep9kot!zO4mvnZUl7B68`*Na$8gY`@Bw`X*>9A?=Oi? zvWVHS)w==YHK_$FjXue{yL0S%8mT({;W`ylfi(H2%|a5t-Z|=7scL#{ko$1$Yt7}z zwD{@T1+s@H=X08FK5%_KkI96-ZBaA*`5udQf6d!6O{l%?nCF%G*2Pcrw6;W;$EbS? zbgG*><=3+ui=23MzOD3|l1Vb1&T}RHvGOo_IlL37VsA*@^}f&H%l9iU{g{5e=skPx z>Gc&-kKcG*(YnlW<@)xwii={8nEhDlRde;vm9SOwC)PGF9N3>U^W(by4Xr^{zFzUK zQzdG@CSB0&E)FeTP^8QrcHnjHWfo4ql?AO$*6qSMS6j2~Bg9;-e%;)!X&)ES_txJb z|5m4Y|G7;~Q+tI@gk4o;^bb}3aB2dhPbRkl=;SX3#+vmvKBd2VAAaaYeBFU*2TuA1 zy)&|Te?Idu*XNsg-m%w&`I7ePe!5g0@|b(C7}tf^L&<8!vo5^8?RD!)-1L>{DYL(L zY&-F8$%o_NGuF)by=B#-gMX*`o+}YqIIVR;XI%$x_0O5Trz6sPD^4s4a=d!@0@K$M zhyAAn`={4;u6JDg$Vl(^%{KY24Xm@IW;o54&t3O;#e&MCKPqkCs{z3b%V|@STG)&wiv@og0a{mhFuY0aa{JOWe&-Lamk3F^` z-*shctd%Zas=u`7^Pg_pm?Iqr)_h^OTHdw9Y~i`Bk{yXU)11y3FU~wSy(jeEN{R5k zs;kHLt^Xb<@cCP$Uu|(*!>ZZs#VJ)q=nRekro87teG`}}|K z42O5E?-uHR{PDF__qEWEqt~kM%`e>-$oZPZ_SmNb3xD#894a{S|G80yms}dRb6uzQ z(Q`@Pymv0Vrhak(3kREjv3T&~gF&iyr}^j09qZ|qIBET@quZw=b$j@Zb85bgdbh95 zDGXhhIc@ejXUE`E-`mgTPZIkQ`$vDG)7^)^pWfJ>Y`prSOo&wNNDf z)v^6|?u7Eh9-5-we(qAt+`5Ldv2r@W_4%A73?N{8K4+!aRlWbrqK*dlcBKbxyDt1o z#a7Wff7Y>EIy@KW86DmfvTcd9!Q`+ixmTN#rpL}dUHGZxY2V83%5^`*B~F&GUO4~O zR->{@rO@+Uf6%n(p1DGQN?j!$c{i-7`(g6kb4SODohu*cJbkn+^vE*7339Vun$0pR zXsJo{{t-AiDg9xcqPJvgmZaSKRs|6|&F8b9SL>|hxW}Uu`^>;=zaWoX-ipKiQfeor z)%n**91mY^9Xlb2S@PVy6T$ateoJ23YB+tLx8SEpHrLhh z{fdpM*9%THFE#b(`Tcy==T#|_th{Ar1l3;mN}cJ=y534xpy$?{>zo41YT2%R)~~m< zKghv-a~IF0yu%s)@@8)P+|XMT>M8_V4jox{NFWPZ{L@%Um~F)n#gn7Wl}ufNyXQ5AIzO= ze2RN4om9idB^zW%d(TdU%az5?e4blTXV#fk3T**`FHuRYc(;BL1(RAY`Zbz zzI%)5%e06oYA^P!d9$+7^U1HSd-6AWlIJ~}m~!vtj%m}}bR)Mn3!2UTuF2^oDWOxv zT{rW`p(~3u&qW>Em}AYO_@QORZ7;Pce}BYI7i{NnWlsI`h`aaL!3%P%?MpN%$|pNj_G?& zicFlOd8N(g;p|HHNVcD=3j)lXd`@`A1)Nl$HqYET+xo8OziV=a{Q*w>?&rSDFZg@b za8=bcod+iSPICrMo?Oar5YMgO=g#h=ro%Dm%??F$IxC6D{OdhpdvNAfv&uzgH<)^}cVFo>y!_w3qWAmC z=GPxv?eDd4R6EP9m7C-)(3>^4QePdLO&gM*KzHiWUI{9bc^r*tJS z-TwX8TF-jN>8R~lt{D8IU~1}X@0VYDY#hZkf*l@oGv2l|{1#LdWTP`9#DvS@Seo+N zMJ_=S8pr$&^euVjTcon+ec_9|sD`r2*01&w&(ew)tiF0zyyjc*?S)%A7wbezUr$#L z5iyqt@jY=sjrU^l6qd!#;%CKemtP5c`eRMp6aC%|T&G&^-P#_RS0?myv%S0(tLXN) zt|^S?yk1^6&NyA%uKG=*IQ&)kPMv9;4>Rspw`%--cYuk_`b^`R|B}&9taEwT*tgHz z>gsY~s3u~^N9ah{*82|WAx5h6D_%?tx)iUn@mZ`!%_Bx>8H*6T zFCj1g_H2(1of!6|ao&wJCtkkUd^coP`W%)!*QzGJIzIV@*i1#?ppRZ9u8xsDLZC8* zQPk#z-qYP0?O%odY$*8uKI8D6SsU|?dAswKwfP7!3Nty_+?`VTQYhj4-geLHx-H*# z2+FnS#r``KC=ve3$XDs$$BkU3v&;AM9>}<%FeB&O#E6eqs(a-+9Dq%VJhU%(SwHD!Ez@=03b~BH_SUX2FKPH8-Psi#H!- z&v;n<^ZfUryv8Q+Quq`#~)&Ou|5)+2`Y88>dRDoVZHE>03|7iK zy?e$66P{c2)ruOXS>n!~L-iu(yObWE~}GD0AAMbLf$yS8Kl<2MXzeK$Y2U$#@!cm4Vf zF|M1!d%g#i3GO=o@x(I@mh*L|vR=*qk-1H-wfE;Q=Rk$oHf#@{O$ad!K6zpq+_wzj2xAkK8$<@3EG;TFmnRU)@Wu3p2F=`jz6`_sWHxw21O?fMB^TYkuniuN> zt)_1NeY5dbCWzZ5}zZCgGiBCr<4&zWC}mi_n>Sv$=BLHYpx__)@BKsd8I%V=kwHV$h}+ zH*bHOdTE_o=i&oGmcC&}pI$X%-I$w@`|9+bpc%`W^u@vV5K%c`2U^}DqN1u7n1 z=u`U;zPp#Mi(R)``|c#wBZhu`3&oPwJ02AYc`p9bBJ;O}!iHqIoe%US<*I*_ zvb(3)fU+Njm}^bOS|Q_Lk9+)Wd!@=2>*Xg;S%14^{>)E~`Nn1?w~C?_%T4T(Cv>sT zSGssD;q}C;k@b@PuNGK`27H}2$37(E^idAK6Z&taq|Q~ltnYenWA?wFm#?|~5k36T zNX7XzSLs}v^{2E}HAKvr?C-~L&YSUem_$fo)T2X(+ul6BzNu&D%6MMit)ar{rt^1t z@o;MW+PCr?^FgMh@Q#;vcVsU7w&uo_h(Fh-OU0jg>gVFU>WrgtNchx+?HQ}@)M_zR z@Wh>4{mgQ!vhn;mVO@z%f68`NXLVk97ddBVbV!icgeTuPG*|NNn%Q7=x+uOQ;7W|^ zj>{p%)-S&>FtGbhZLoHf_D)GHJLvEE{_ekZU#80c=M#=`?FfoD()yjhgk@*zC-0n= zP`heQ3mHL=$Rlb;6^%ODp6a^w|5JE3L09tRulc**Y)RgmyQDqn@HVY)xznUCnLYQu zl@cZYP&-J;QNfD&ta9}asrl)ABnyvik2t zeA_#*?fm_vvJsI+_e2!J3uEnVZ)oY8G_0uFUXlNa*XG~65YJsIyF9CnJ)cz0T&XN! z@#fVNPWc_v43sNBpRKkQV_;xps8;@!+139f=Bv`?C+|MqUci?$vs~pUg(>;mRe_@{{IR#S`X+{EW? z@n&Z2c|O;AbKhONrzn{axb}d%o`>bnilcdlISrhbz1^cQqsG+PnBl&upr!n6j>+PW z%^I%meI4jK4ZKdcszdI8=Bo53G-BZQ~RR0^E>@^AZx!*a~MSCiC^ zIdfIB9j%kTvVlEho^#O7%}LEt3{iU&-$yooNS<@%cG)JyEq|15*<4c*P`qeXYO%Fz z`pOk4On#2_ha?-K!t7pZ#ak?OXW1tEBftGYugj{iedh5qm}e}!kWzMKrfcJWSLM`C zH~M>69WETO-%`x3`62$!D;NGwR*hE^yU#lRG33>#EVaz2j4@euN~)~#)zv4vG}ipu zIkCil!H*fUo>x>}iw+6sIpO2{*U(y_cf!Mq;T4&xC)ruD3jX+ofBC}qsGu;CJ3A-r zsD*8=Y5K|&7x=YAmr6A9?6RHr;L$3{Yl%_?(FXm_+sZHKi_QHQHZRp_!E zFV2b1v5ZjrQ@T;nasjVH@^g_@o(a6YQIoo)&8~}HJ)3fN&8cAdBQKhE_WRL0bIY3+EAp-L5p$SR`t_Ro z^CUT@U+NP)Z60QAyvwvdJ@e~?^?f4yMUHXtl{#{_x$F%oZ7@3M-*{g}OX1wd_^r=3 z`*BX~RMqFmTmSv6ylA7y?v=;9Yxw(j^#p7r}_X zhKCB)uX*{jk*V$ooAoKrH;;SQc5(i=-oU_6`DOE&$;NhFEpPnUZLV%VnkvAx-;g7x zZD(8RtCq0+zS80oQ{Ad=va2c0O!)b`?k{KQvo8hmb=r>p%?~~ar3U-9tYP}bmU_IV zHtlQd+X+rLGc_BZZ~eleK5dJckjp!P$NfSxR?K_jxLJ#Bdfv+GA&Qzxnko+wy;jE$_6ClFx6ikxduj|1QqT_jQI@lS;zLqsMLBFDP_q&vtrTH1)!%n;J|5Vugll{cy^ix@dE8YKp$$a)p zg@J)#m!j{4Q(xZngnKV>xFyMJb=FUPmi3Ce8&@38Yg!(3_X?}R^la|B=+K=rWj`MB zpC{^;Bxc^Fcf(`$hi5Hax^|%lip9Mr8D=n=xlUYjdB>_3jt_4w;QZb6|HnMXynus2 zPHkn^C)x?TT-!0XS3E|)S7l#;s=n=^z`*UDmp$xGIfwa19r`Y7Tc>2Rh(|s0U`!)F z(e!K)e{vGo(`28n|xY7B`7c6npnKSc2gZ&z?OuV`W~Hezw&r`|cC9&*gsYnQ&dN zxz2C4%(}N{eq|S+oc0@<3qG7xL1UoeBEGb zRQv5h&BbrUPgS>Q91K~+Cv*Hyi|cdU-&1cLnw2$wLFgKB#6EZdJ-=~6%%KC~*-?O^>R_~@f;XbhbT)Cvl z?%e_m45?y0FR%0RZFDMAXJ}|NlU~@`?VNI|Z`TS2oh`3_^W`X2d97-zoAK6)D>Zw% zNbfbpO>$aaL{eX!SFnIQ^?Zp1N3htFJYdF6XqK9l5x!l{u$ zwS4Dz1I}3O{LG>%nDTwk(ze}{ zA3o0^{XTKms&c8Gxct36dAp;}D|7q1Mc%FZqvvR+Zys31@M_f)@pVFbxH82b@vrC+ z{`&gVseHpX4csr{0w1hm$+vrQWO9n$Dwh@C+;&X1OIj*hym6ME=0E$A-c37h^)7vI zw*2CrgtFQc<5M+vPI|j9dnq^3#iFmY$9DOQUv|@E73IYa$XvfLr}yPk=a&V?R~MwR ziu^X`7wPr;W5e}8e9Mznd`Z4V;UERi76mLVYgnr8^ziEq1_m{TiC64-E$Ub)9uuQ*2)CUs=3JCdH1w|Rw{ZOGMSed+Q}A8*IYT$TG{k`?E_ zYvq|xqn}^e=1!izP3~K|qr704jdpY|Q%q`w_k^W+UOijP${U2XoSXjeyUB$4c4qCb zPn@c7nl2-;Yq_cCl^bSqNoh5ArljqwyZT33gL&oqn0Yg%39vj+$$Iwdd_%JmQ|rl| zf9@zlr#Ot5UQ%U8ASz4c+!^93xKi90Gv3{EX*_#UNGDEMmG zPNA0DZcN-ywk2=QD42Ly@wxQUfVUf*H1}N6vpxH9uV`w}i=8P5e~ro8Fb}O;HNH)@pby|J<5LeT}er z)7r!(H;cW0tvQuv%7>ONcF*(D+ibP{RG$BHy7BtTV|T0g3r_mSuVp)IEx&bvfq~)F zAEm_>2gEnL`&@tgrb$P6`pHJSbqjB#O=eY1Y-8Xl?cMwQ=SG%Lo9+n@LX_3A&n^v} z+iDOfa7wshOLC6>PM2BxpUCKK|5s^yt3TMk+%|Jc^x}`l)WkQs@%f1^zAn4k`$Cde z=^EC6ZA`gyvJ+k%IlvU~Z3(AA|8l?gis^UU=GscJA7fgO;cX=K*i(Ooy1UH5EuYI4Bth0>`Wk|*cM zRJ7m8-@&K*Xr0n=iv?3=PrI11JcW7s!6!DJMT;|^aEsInw=6i5g7$lS=wORajp;Q>B=Cj6v(fgBi+-XJZt&zWfmIS=Fey!tdIK)o05J z3g@3OyBhbr&GB2-Jic=F3oc1YJlmpqZXWr_pFjCR_}27~0%g}LS>k8(O014Py-fI= z(&vR2FHilnck`x{OB}sl872$HJ9{n2uHW}-%I?$CIeIQdMT`GG-F+qHIb*3%Xak2* zV$qfhxA|v%}*h0NwBcbc3%XSyxd`IdHz z$-ceynRks3PPr5PeLYW?%cR&ieyN8}3nyR}_USOFba6rI; zfnmo#{pd}1ybLB+U5fwfQD~>czwGg3o6E1aY5TD}Sd`!5U;kd{-xj|H))%t*`_v2@ z7u6eG4f5G0asTy><&CXNf@fy$S8~zHn(rIWIHlvN#6Io#sHiy=cQ?g$F+tv z_I)1zeC%hR?~yu}pSZA7?jyg*iCg;~aMwLg7U#*FapZx)kr112{gmi^ovK=*dn7Md)+lj>=Jg~kaej{u zAr+n*?jLTKfA#N_U)H+cGkyj0B-5FbIn@5G6gaqW_uB`(*-w+oESEa{dieiS$^M_K z<=TX8|CMOI{4e!}#e4ES{r(4<{i}Z;KhwQ!UhLH^S92Pj`QO{{ z>n46qZTYh`O{r>g!KK0-b=&XM?@;Q}lVAH?{vF4n?)KNU$A33zEPD9se&N3dU2*5P zi#KEBiYYI$nQ{!|THtqIv_ifbnb z&TYF=|JNc%@DTgr%g=u`d^&bG-T8mjYxe)W>|NYPm_(c`Rc_mx)$Q6A{c_)#3lk;F zR!rIN>D-v{(BR}})pVj+WWO`>-lxHb#oO{ znz}XSwt@F>NzObOYjbV8oF0GFRVM4Fen&NCty#F~(~-r;i$5`F^-J6~tSi%eW)ku^ zKzzfqL+VRb?Wj}JXE#wiy>oK?Sv8Y_htr#;gj5tvwOPc+ci~~sm5r}i{pNAZbaSxy zow(X>NBEg6v9h(3`ujcPO zi3-z=-i58c5`NftQF3#`d9foq*iY=e$T*qh=GCps4zCSfW_0d>!Gm*eoHt#xEdI4> z;TH4LR(S#QCs}1B=jFZHmfFc1dC?#(H)q~1ahHQLw{EI>;qoHwJhx2Fk-LeEq56|I zNtD|qb4Q&$!0`NB5EJXuBeN2J91j!~VPKilo?<+$MT&L9H#cA2o_0+K)}2-{a`stD zw|<;E@@w*oxj&!(KOAhCI?42e<_Ft@U*8m$hs%8YF3LJ{=|Mxj=#ZQ9e%%gQe0|-f zs}qLc5|-B(>Y99ehX-8;AEfz~{^M{ZY4#y=DKs zjGG1tU;adk&PkLn*{=Va|DC*^(+{uOtH*o{&NT)X>=08l`o^KYN`>#Np6MnVmZrPu z$JCT`7dmy%HxkfEzwdbCqB|1<(@_=e4U#jwH(Xy*)DXU8-lY(~^S+M`XSoV3K6G|} z=;c}d!8=wptg_TFdhqa+bxgynvQAc(YYsEEmH+pS8g&t_!eV;`uc&87gueLjp7F{Z;SJoOak55gR)q)swjNZu9=Q4QH}*F3g;ND{ z)cK@tXbS5{CiUOoWBOFw?({@?ym$i->fpSCH37tNr6Y^~H3hd1@re>d& zI_2aURUVelH-$r$^$(v&=nB)N9r?v`65skPSzs-^!(m&+?$UjiwU+0F@_AZ)y0jo$ zbj3^`Q7frU9sj?VWd53P*Jzht`h@Qcozi-F&%0Z$m~XfL*n85GdHLLQ!?3z_yS(gc z-$|@36VX^Yr(sXQtkukuHTK(n+;gQ$tnS7g_33})yCq)SSYghzpul*gs8NO2E`RqA zT5S#vilWwQT4rsz)Y`@IID36#zW4+FTYB#TACHi(MS8-d%r0Zl(X7xnoN3#lKpW zU%F#CAMsWyho2J`xv9f=x1qrDM$qMg(jBu^68b%rru5zF^OIS)P;H@a&B{k7xjWwR zSWXSL?e^nMZMl_lTlIF2)U>9)!*iDY`gFHs=V#UE^>_ZR^2gt4*TR?uQ(GQPFHx!Z`Q6u;f$0nbPo=Bi&k1W@9%Hv)b=>6FqhY^u z8-wz))8#2f-JPD3t)8rTc+Mg|FLd|GJX0z6r5`&jlrl9%e2XYzfJ68Imb?pGfbHD_|QVF_d00o{KO zoz3oOhqs;+YG-#_Y}m)lXthJJ?yznD`*V z{L=Gdl0T%JH@&Oc6Kf;*Ui0pr$gNDvENs{&?(qrJ$%YGMM ze-f?Ee(hT?f53rNZ7z)hJMZ00%?G!ut26~qQ47q7j(eHC zMSI;wWp$%6=c&t0+$wj6-Lw>7yXDIgB6?<5RfJiz@U2Zk+om04x}+o4RorB$kbPpC z$s(KfUn1hkOA;7e9R)TAa8HRWoN`d5MVigp-abm_r__U~%bFJ(f2o<1=kWUzgJAda z(&z6bv~HJeil1{Y`u!C3Re|sNu4`7VmYKEqYT z{^R;5E032LNS~Hz)JprqB-Aj+;9=QhIj%evOZ$V%IGFl>?B1``XL`YD*}<8Qc*8On zW%NBSc23Q|VD^WrY=2ivS>e{~J-I8McT~-*^IUE=#h!uX;s>rXEZ@Fv^D~|_Z^r?q zezOf#m2KNpWWApHpDMIXN!%Fi>u5XW{hVKit-AWxJI8ykEoW<2om{-*?AG10YDD>S zH-0>l{i$N#jsNinIy(<6Yd4*=hSA<}!Ndn{jSAbIE^ywq{Y_vB#{)%+9jE)6Ch@SQ z9#T*+H~aOiYRi;9*VivuDz_!>Z7S7xJ!|rpTP<%h8|+R`S#V-On?dOJjhP31L~Gwf zrpB+=kDa+y*zRssRvo+7jjm~&H*|Kf9-X#&hj-im15chXs&Q=GXImoKu)2ZazxqLz z*~iy@4Cy|$ZDGnqndeiJb58tLce8q3*N}X>eoX^|>XV}7CJa;8>`|-cFl=Dy6*cnO z#jLrb?@+6t;Oei7&foZXG|g0dd6`=IdoC+krJ6JWA5US2qm7$pR;;}7p*78UdGGQ~ zy=o^SmPmNiFY~l-cAGc7bnEkPVV)*m=33_TPP5BQI47rmDRARjr&J5x9Y%Xfci#HG zbdyvuEE^ zxg;{x_x2-}CI&@`BNvO8|Cao_{k($*N6&_Y3l`_>6Ezql-P^mI{4PXKdm`g2deX>1SMybSW&ibWJ4lZIh&giYvmvH)@e(l(~ z@bk2Ci4ux(B?q zdR2K1mwjN?U@NxF`nvy_^5_5T{r$gZCosfrZ|1{W7d^SrdZSu)s@zv*S;gvE z6Y8HB-CUB@wlM#n)n1d`U01fY{aO<9K|t4EBW9J`_Ub%wJ##PK1B<=|POq3?_%f7( z_4I+)JIX>PCG5RpR$uo{K$>YzQ*C3-JKN%n6`LNu-x}cl=yLqzZi%e#C1z`PGskeQ z%KfzQ*-}s4$?rZTu(;msUGAx7fA{BnP7b|or5@X4dykdB^LYJwhsL9|d#1|qtgy}w zY?&t&s&w;-oaei_Yqy=4@?^{Usb{{pohas>WSbd#zi_q@*XG@8rq87DcP?D zHmunnA9L@zRocH@eB<;;Q>FAUUsoNM6zz;1!IgKWZfN=0BgeY=)r~#6UyG)#R&+AD zcka*iHIweK_&i?!d9THN8_5?F%pJm~J}sXfJvk|5-VLcMOaGk_TEjlA?7;^gy;O;_ z{qLUHdS7ehsR};qQ@(ufr5^{@EpmJRW4Q)z$y^yG|GTfeXSc^b3_8~5^y{)-)f~~8 zT+?{x-49O*mTtclKAHRXygO@kgZWrzuX^3;C>6hF@uvfI8()0dqI6JAC}&bZev;(d z+M9>MKRynWjxcPPaU^;9!Kf9k1%K-!|F3+xj_EoJ|LuKpJFR!<>{%t9X*<1d=K9>C?!Xr|KhwDv`C0XptF90FsXyJVw&Yg&o|i9Fr^Y{B zaBlL8r*e;Q%CC?(af4u#5(c*;9VW)!+ zDGOO|5Zr9}WBGaivto-BFRA}`Jf(7$yVg(Li|N{4?FJ|9Wz8v579XGX#j)?Wz*i^c zY1eyWJhK#8%O>1(Hk{r>mgr_L{l(_B-N`1^EDuf>+vcU`MJ z1QL(+-SA)*Ts`Htg_ADlgRRYid9rT$NozuWaqj9cRC9D10gPo#UtiNog%-%5PzsdjU7lS_PmO!|a`@tMyy=Z(+4 z`PKK&2n(-HEcXxGfNVcKJ0oNCd?C^V^ z-%jx%RlB~QvDqP+UU$sg-!`}Wk)*AXZ3chLic4h*XI5?fa#L{?I~%ud^s7xQJ|@>4 zTou)IW^P;CeK2j7hRNq&d9L+y0>gS8FRU#t^1K=g@)pxNoAVGqfjtHz?)#l8-r##N z&&OyYuS-(r!Q&3DdkUlEyKlrC4Og=-{3Y>1qemuUPgusLs@ik^@27pxzq%*LvG7#! zqghvs_jftYeAcp5&J&8kyg+tcuzii^ut4H_V*k?RJSCVTTYw0YbH%g4r zJx7jC=3b$3b>8OveeX-Y{PxP3(&@b;*Ouw-0g2~KF_jy4uCQLX9M+->wMwcxOIXlz>iQnB%*)`_~m zc~z&aYb8xqFEaGMS&{Sn=szdj4~O?2iN1LuM|aKBXjy?H+y5UES>%;4>1zKc`L(mv zH3bFB^A&>*JnuSPWpSfuMyac=n*EGPiD^?JtRy=+RdrqZc6aT{*uO1wl~aW9^U~%2 zZ&q%Y^Q^1!!%yCjSq}eCF?U$**|;KkY2&$gKIv!)W0AGnjAu&g^xc1Kwc684k7I+>ZSz;=E7umjjQrZXPv$+R z(G=0j0HGJfTe{sv3(^Ih&+5Oq@p$D=t}mH4XZc&tV6Ycu()nxO@jxi(@%m3L!G9Z` z6*#WDP|bB)xzVWW9@GANHKiy`n(Ce&y^Qg47Xril> znN`+z|6f_&ClZ|ZXK!Xqd9zsw`{#+1`2PkOmtVf{-T&}r-5>u%v)`=q zwA=9e&)($<@d|Av_RcKo@%o>XUuix%>eae_lb?F&-N_7nO>8q8CtPND)3PST^ULA6 z#rfN|9r{20d3K>ItF_iYO|PSCdBok5d$%}E*ZJ}3+uzKXjK3%RXMcR^Cf6E1)wZ;C z-ZI{YBA)BA63!?(o^;p9e|ROcH{;L0qkc`>ZWwC2|6XTU|NrUFJsFjYFGq_^c4Jqr z{9(@B{AkY!UFk2kZa%#p)7l>V?OL*?!goJ+lM~7(H#@nt=s4Fr3JW@ttS>Qj-L2^c z$qp8}=iOL}*v#^^@3^T+^4>AZ5J^8W>rCRZRhv5J&%O|Iqn7EIhxpM`8nMAl)y#3b zKE2IvS+ru=Tc@oGr+tqzI$ifu7kqL1S+jv+>BWP2RR+ouOEjk|Zr(g|^@OkA=A^IY zIR4`3G5Ne8GrH~MeNo&R&`wuWPu`kbxb?NaWXf5Rv1#wl-MEsa;<9i{V{W;vhSa%WDj zwP<4Ot%!un{h>>qR^$w?>vHKuul zz4q&TBe-Jm`-+vDqxSQ6SROjz0XR@&B6dzjJOXpFiH(z;LUS zN#eo1Lv`+jyBdVo#^-c!{#yrJJ2|0bEMWx6}F&*%L< zhFyHO+0qNsFH7g&o%#K^z1G3=D>Uz~n%q8*(Wg=@`1qDZ$N3lW-PW1P!9VBg{(l#G zd7i)imYppB;x~`QiJTL!x@KkEZkaA(?~=@)Xg9GbG-iIK;T>0LChj{AzFTE~oR}x} zJ9F`ZYfWDirmI})`0(rdi_O=#`<;TFW?zjuvhLD6;TQehZ(si7o6WrY_td|;w?1k4 zFiHQ@pSO7$3znzGAJvT5x}aEZ)6{0BZ0VL;8`LKVJbU#p>3iLe&W!r{?T73W`lmT|eRcE6ve;O-r}6Hn*s z{4d%pFwJF2&C~8RH5xwW+j82{4quQB`>%iYvGaNH?)86M++XPL`LMS3GS8kUPy(Iq zp822A=>Jnyy)>x_&1&qX6W`kZT{-RfPRw>J zF5^*Qqe4L_1Jh+e^PnkxyJtt_9MeoR@q4Twwp2W1w(XVMf3L+Y|NHP=y4Q5>)VfEm z*B_Mx{NK&7@ohkTpLX04mjf=pJPPOS-Y@ptK;-3<1@3EnWX*2|FIfBBMD^bR0Y%=` z{vRz|IQ_oz`{uh&zZ>f1XJh1O{V(6n;bKO_ZlkK}*Hjw=3?FK+cyDplKdiGUFR*gJvx7zo= zEUgflwnxgRq*vfVuFl&xl>$?Lx2rAi-4?#WZDM19O%H#H$>f`?{H(GwnG3e1B}N}u zuM;8g>}s*+bH0w$^|A*&Shp>4oLC@MrD}Nb*IY3hUb`*R=gnomBD7&blqvUCKY^z^ z3XL955jk6I>}>h4-{Ygj>fG!(uCq11S&6+&-m0;QbF2IHg`JhJ4|MbBgmG$3FgO{x zhx5#h_dU}bvWqkn#Z9yFm#!*m|GlJe(WB+6ayz?TSvxzt-|#wp&(GGNsQ*fDH|oCH z?-{(PCNl2s>gU47kp@wUoe?YN`_1*q|8V#~hStVuYDa}_pKZ$$H+nIDVPe5kgRk;? zQU$ZwUq0;G@;CHQ*R9I0J1fP5oU)ZS3tunWt#V)Rnf=;^P@&_u%o^v%^mjZvbS=8& zweKPOzdQ3}e0Dr#VhSi@C^{-_6PnG%)0{82X>-)&hP9^>K7JKh^6(O4`QlGj^5z=9 zc>2_4Jt?mjFxNG+skN4`Q*X9PI<|YyzIL_LY1@BD^Y1o4XvdSBy6@!Qi~TnvYxSpJ zTcbR41KZx^a?PsKT|c_MT>9gCj{NL(D<<9g%WpcG@15~PQ9?o=Y+;d*? z#hH&W>y1sv{rBDK z=jZOc|E5&7^;Ba0$7jbZX4~AjeWm);t`;3H^=j+8N4LBwk2`nW@li&;%6V4L`5zVM zXPY!_z83d-iL-8*2aEso_Gdb!9C4A?L#|KnlW`ZDt8=tUXj{N;D?=6GsSKaGf5m;M zwSBrVac}odU;n)(PTOv?@7z~6^Zv?aVWU2d-K*55y;!ZLZ*n!PW~V}IVDpUE`~GkB zFmc_u?oE}m24{PI_R;Lc_ibWz01p5ymT2 zE?hR=CXgE)QNSH*n9d!(Vc`eWSC4=G>#zqVNX<7Ii%isTj2C;OgeSp_`) zsVS&^<@VGpFLv(7_p9n(cliik`O$Oik=HE8tv%Pb?Am+AQt0Wa_WpZew-k1+d~Go$aSPZf=@5N6q};i`rSi zb6ytlf#T<1%a=C>d^ex#pVgT9P;>4QbAGcyZgSAA-dA3IBA0Z&ep|E2OXAdmFE)){yexK^_f}Z6 zzm>ioyx`Y!D^bg$4NEFhb?ROl+3MNZ9-r|feDPwT21zFF@WYpq=dSWfnsZ{^)?%g& zKMSSJQP`U)GnIuouKZ+}`K*13 z_5D-UQ6d3ilV^QbWbp0mU*@5uYLW?Q!0Ika!Xq{I)aa=I*ZZ@k*$v`UFpfy?WeTv^dg<(X$rE54s~ zF4?(P#POf^oj36wJX}3ITebC$El~Ek^owJm;De9rUVV`Iyl59+@>)$l_Y*JAWQ85N zG*eP=&XT^@XR4ny2LGMq{%3}Qz_J}i+@Yr*WjrmejxmEe74gWw=S*F5Bpt@O|*y?3{Sn_qdzHUwZ!$LTHbk^Fa7gc z_x9=m(@D|icJ$xi?KQC4a#BOKRc|rt3r%Ck)*q=XDdyQnwQt@F6k4}yVX~-QR@u?7 zs;*j+qAhZ=55?7{Txz{3mlS&Y^95ez?R^j8b{5)ipxHJ zdg{lpGi%RDsCB>A*m-ba|NLW&T^<*#yp_X(@&bRYTOO_aL_fOdZ1k$M`dKF>d!Eka zU&dZ3w_u5WmG0el_oi?DUn+FUx^YpiWZw0uzkDt`>HFJ%dco>^HnsK7R)>(dh|K-^ ziK`4he7XPSnfHy9XA$Dd-mU+2n&)8Aqf1iUOw%{UPxe*)$twTK_hs=R1NKJ^$=y@! zHbz^%VEHGcz2)R{_ZMPHoGq>##!vEHuUkn6ivOKE@sMq4^0G~=R-e+e?1OCfcrG*g zJ1wANN67zNi@i@1-Q_j@H!S*HJL6kN`~O|#s%a~N{zU$$HMOs^mtFbvN5Qv~T%CWb zMC&#bKMJva`L*-dqHRgBVvmlT5m7zZR#SLNa_zszp}Xo6cG2m!VX@=vH-dW@g;h`MYpQ+^`B3p7`Nr&1)7GxMQtOenVxrdsOOx~`hwEfF zv$PN}V)lC9g2QIEw>SH7Eq}6RQ*!=GxmsDr zzZS~>cPIC<{+d_p@VDpCNrvsWzHL0C<`5X!dBS@Wv)n4bgYQjDnqF?*`%_%c=+vaW z*MBg4shE{E>1ErV)hmJy{&}|Px5}}6j_|F0iTRwz?iHx<^_Nd+$o`kp^Qrc907G)o z{kewTyDr>yn{)S^h|RaYXJ77`i+q0?zfy&>ec!GMdA*62-K>ex5}B=&55HGBYVC1i zv#6a$TvXczOW|BKZ6@_6Ki(X_9ie>e!%p=Du{S?^NL}F8G~KNmG5aygqYp`ie7rS6 zC;8vBEu5iXbIss*>}&_W?e3K?_RB~f%gJxNrn|_;y=b9}W09Ciz$V*NRrUWHgX9C> zFSB3GbD<#Ux#FIPi(*^s7zK4r{G|REUG}^@ zfyd;8_q50JJrC~Odpvgi(l<#)4|txkDM;HNvCe6<4QgY5(wM*?P_TaT&T_th=|Mi3 zMmC=onp_dp{8ijH|BJU@fcQ?SJ@L}Hpi=-Xl{(UTHhg(_cN3dc^cS0&i>GrKX8a0J zy>!7YVw#Kb+^9T>|9We0#)vcA`>wG?z6FO?Rt6lSIPR&v)POn zg?-lUtX@_$^W=jMht53Jx%+Qt5W_#4Y3>GvY#SfX)INH*=tA`QTWeNk{x=inv=VEX zEb`<pnadxpZ(b&O_x_yLc^L(qFT$6{FEN~MeK{ye ztw_6Kg};u5pl|Wx4Y|$wHD=BH|2~wRDtey1xGPiP=Y}K(Z=O@k6YivLEHB~R~^mE14Yhu3`UrW+T5!`cP z?QHfnw=PXTd-h$}iSKG`_7^wVm&{fL?W{leZ$t0zug5EbY3BimR?t*u}BmF{|cp(y_Xz zs@1%&x8j>wKOggtdG@cEuT(r)^GIg0O-@=^L%i<4P3J$Y$WUo6+1ky?c=5-dErlo8 zg?9d%s&D&~FKur+Z@yyN_nBMYf6a*5cx7E@;LkrRwlx}?cq?-Wdmht0Xu84PL;KpL z%#*!Og327TMNdDwytQg`&)bkG{QNxHKQ*>AA9(Z0UV0;cZ{ka}iK_xtC%CB!K6>slLQZF1+VEN|%sVQPdjrkZAJu^D^1q!!VJ?V0N#Q9r)(%)(I{L49l zQsp9LmCmRx?UgmIt*<&;8Fx@1O~_mQ$cAo-Q}tOPzB`jmi|W>&sP%aD?1|n)7M|%_ zj)vuX3O4)XS(H~Co%hrE(S#4#4xbn1J32Uv#w{#WmQ8&aKD%%PoIB%(WKALFTj;Ig92D}M+uF0=S>^_jJE zft0F-X4S;FQ_VNIX%yGpr7YjpR2&y>#={wlO}{# z^4x}_Jzb{o z35n13zF9pg`}4BedwGx1vXXON+uJ=IL%cE+ZWmklaWrf_Z!!OLPmaR1RHmpT+q{YU zs^a6%yWHykR_p%cNpt$F%v)Xy9TVqAxjx}MsrF+(lVZb}wgra^R8F~M+^%g2jrg_p zlVJt>)Nh&>9{wn5*;d9sm1a-RKRaV$&hEco#O|%oIIq4=;|D*}^SrrD zyIx53#m1@6+?%vxIp6)y8PdDb|Gqur?Q;4^;+d8UYm{vtCwnZt*KKPhcQcaXz2W}z zOc}Q(UhWDG4Ac?O-}CmeK4X`6SY5Z8bgUy&lwrT0+GHJ%&AC^Pcl(|$oZnEkCgfz~ zZ}kStOP8&ZlNVG*%Ut@SFy%JO<@R5b+a}nHMg9ms!nFPC&v4D4bt;!0z0cZFAM$4T z(rd1N?W~wo(~Ko^Udoogc(=d3?{R$aaiz+)4|1+{a$7Leoj>tYCE||%B-Q#RX=Ouw z{#{EVC)_C7UaQVGm!E%qUAJw*jxS0kntManc)itpXn#aH<=vCVZGQeow0#}L16kVc zB(tw<4)apneBnuoqbQ%Yy{B2NqVxmQAN} zc4>dKnD^3s-l=zwA}q8^T9!QyKl5LpDki`8$i-aSv^w6)!Ac(wEVVQ|?ZiBx!)Llg zUx;w;g2G$pekldZZU`&RoAOV_LiDxXik_I`)w0E=>)%Z2y`{H`TW=ogiJ96f_fP68 z&-^DS+iiLG@S2>TwMP2o6I5=nIM?15%hgNxnlPOs{O@nC&llcKwR=CGeXSn*cYhxx z<>Y^5F~Unf?AZ69Y4xoKIo6!rE+I$$W!?IkmF;jr&Di?eR$oDTi?1) z{PhH;)zUkCSMF=H+v_rU$|of|S@Gh`|8G5>cB$9?Vv&EStYG_k{+=@V<>#wg>#wiK zTz@sE&6mAc+${P^^PCk|xr*NCNpri_z4>-SGq%HPXWHZSll(%N#2D+;g|FFsoqX;7 zt^BS7?Q0i?yv}8_x-y05mTkJKo_CMC_SVnsJyv@sTwuB=>iT@6w#LFWPgdNitGbXG zkoLepFGR?y;&)uxqCfjuqg5iZf-A4MH9JdiXs-xe{@z$ppEZ1wgT#b-#?7{lg3kS? z8fHlf=q;M*`Ne}va+{B6+#;hjk2gK%*vFW%yq)jR>JaBI>dQhtS}tKwGcu0$j1awX zc!OD*`0B@IvJy;6eo2SJ)%}c%F16LydMo|rTd?({e^G9Qex!4wHMd=B*Y%)q*_9ql z+bgBFx!na|_yWBnN=9di1PT``!Tb6PaECxHC~e4pmC^#cVe=^qvo?tYa%{=n|zWrD0;=|?%brS zXPDog+^*Pnc;~77OrK}(lg{+rmz=m#W&LW`wg|O(=dU~EtG7kn$=*?`RP;7#c^Pj) zKI6952?si6^)FXaRh_*m-GZY}^yx)IThRkoS{EDe-L*~G?!9?$@M_N;?*Er2+w9}l zytDmd$GhuHy0*vf>|gu)_nkjc`@(Hj@5*lTUm=(f=YK33U%)qbhuQoF-lbMGBwXFkPTu~_~1p=AdR|ITJw zX!I-K{o!qQ-tBO(WIJ}UqVP-qg^2|$6IVY?eY1_rKT=uoOV^!=8+NByXD=vnmd>_p ztK9s+r1Act!#01+&U_Mf*_&20%H$-DP&bYD4*dADB{yuR_@QX|Oced1b z#z z^R{ZagKsCOi>LcIJv`+pe`B(*wnq?0P*<2)i>9aSW#fP47nj6uyXkS{RglfmsuS)P zYC8(Gy3}W77Ol*2OG(dL7`b%vH?LbWKR$kK#?t|IsUF<&uRRsSG7ZRrfP4=F568^W%>V-S9M@Yii+<0iHpyHCz{ zYW?+9(RQ+6I+FqWs%58Eh8^PhbCugbcaLQkN72j^=hbsh-P3DQRoIxACi^3D+BwLRikmJl|~KX;waY$*vVDsYlJi)~1SWxnv=ApZ)cr93}U?B4?JKR>@i( zohtp=XWgg0)-UqhKJo_o&--5Ax$IC<+`^Qo^{LnI>=tKQ5E7H(Ax!#O%H5Cz!v^Ub;B7LoxE^IiXG3N1oWuv1`?wkWQOY`Z{G-dvujqT2=hX z(7U^Kux;{s5c+4?C(|&#!nGDJr|n>Ft$$T~ZN<_4*w<-pj!HZX@kTct#BTBz z?A$)7v}%gF!NSd_9r8VWgBxT1Exze;^Ov6Gxy03;PI+vs>;BwRwW-~u-Fz?q)vlfQ zCWWy(P7_KwnYP03aBkaKYu>x^VEG;1UH+T z-@GJ#=Kq&Y@3ZC{#sV#$?A=5aoD82F>P+s}(cLuf>!!bEa~~WL5oS_6JX`6@yBECc zH!H0^QT#IL^^GlAiN>aJy0hY(tG;P(`F!^8a>b7;KTc+!uqfoti@PT!e(aR*z0rP5 z%}Bkb>D4!3@1IrOJDEOR9{ZOe(_@5h-hHy_UeQ2SYNC^lzV8 zt+BP)>E*ZdL$?E)PDyLN^{@S*rF6h7SnP$t)FgSk3gItWEdPGb3~;RHni8M!Ht^iG zgIVh8{)_5wu(ayGZ9B9^%yt8tdUCYV2g_}rXDk1aj%W%HZr|ovy~^tV&xGV)rosbk z7p^eeo9FR+zem!K^J^M2*w@Y1%m3OV>M8&Gg*j_zRK}9~-fPXa&FWWX+;YFJt$Z>)nBhOJ+|A#=g8 zocP=Kc1%~e`o8SmmAxiXtmbpVJ@lto=}tMYxN14m!?c4_u}PM7r+f}I1+ZbY<7@X!IT4=QB!ubOt*^HtuSy&i0 zO21@(YttmMxm@(>FC*nkQhK-7K0TsXT`0G7+J~5q<b)&=mBBu}6+H8Ja zQ&;?kU$Jg;{hZFlvoAYt;%OCpyh62o#s${fFRUgD|JUm1Nh`Cn`W~{=U5D}U_1#J< z?%%1?o)zu*;rK>{3!<*uiceOqd>qgrVRe{mNXEd2`F_ zS-;sls#mbfNecfzr%}JxTV$i$y}zn!o+sk)XMW0zUA$7OWxs#t{8WR`Y-?#4LgY{BD zKP+{Re>eZ^q!)2n+g5k-{QPAff0#TH-7L$b5Erhm=D*@O>*7$4h|nwd^(xnFa@v|{ z?zLshmcMU=Hm``ZoLKkSzfWRK@6N2Rxr!lg4ir~?O21Hl*R-;4Oa0t?;j6Yf&$@QY zICWLxs{Ij?HpfD-HM~79TeC2iFF=yf(bkao8xPQ~TH}%a3c8J($}p+Y`gGvG$Mn$=hYM ze$nT+(|i+-|F~ncC~!`==LZ1~r}pK&8ltyYuSB%-UYgML{O2^WoBq{~kKLYL7U_HS zjxumg|2MKd_GzWTpmCU^0VT|e*s;&{D*ooDghLxK{&jCdy2Is8)o z^7fX-xrq%alW*T$Y}Gc0YwMxpHRslKX-9G&pDoz+c(W|qlU^4e`MGDVX>Bf_8}0ok zbb8_htK|(0A}Y(@vhU%nPujWO;`H7_F1G%bZK4b&b%D>X)$Y)nKAp3DW~irZh(prk z>};L{`GW<`>CwDbCYCVOnofT7UQ{f6N5_@j8>cM0qB!TrQE8(IO8SaVwjFP`zj|q< ztk+VD)i#S&KixlKbUjf&r>~dnveK5Pm{@J|KYTxcGi?cnipYeRJMSbr5 zFxB{9jrYD;vF0Z3HAw6|uCUQxY5$5kDb4E%8Xf-^&31n1YnG-YSN!W+_qA!)eLQL& zEZnzv-dv^ppMMU`H_$jSV=nu-X?dFNs~2Y_OpiNxsqD_|KbJGEy#L6X64*Cw+xm|( zR;R0Kj{3ZPvOp!{&h-_=muA^BM!sKu`t96}20JGoPM*2n?0pB#GlOP-;gKr*iLxjlL!3;%`^ApelVTG$El$l zvF%-&me@=arUrgz1<8uH*A~C_K4b0-n_VKGaj*Mux8C*o7slqB z-aDH!r?2N{rttR8J$+f}TYakb`UHyyw}WoTo?p3dQEjUxr))t?`SGd*kmIMYMpobuU9#--8; z;U^^D+rIc;;PKQ-i*4z?(wXZXWcfO&|1DUd?EPIVZ&h%yrcScGgtO@*X~hE-d${); z6Tft>y7Ef>%aA(O(ER(C1;v`QuSRv~tHu}~y3nZn?RZX!)%Q;(HSXrh)~}dYmY&cQ z50&~L`1NP`?7eIgFYCIt{kMrbWGC~%y=Bq!;9TjqQK@G7nfWIzC+3LOFq^eL*69hI z)%N!3cY$+<)K)Z}WZcvL_0KDtm770*T~xw*t>?Lr2>%R*X4NOJYQB~_NX{mK9oS{~@`KBfoQO*T#`{?>%@T<_^h|4~aanhE?P}YwR~wkcYS-R* zboheLgWA&KXKHKhncn<4Jz?%K%OXD+-`^|m%uG9#)%1FgLiM75O>MEsxf?If{FtP9 zt>@`=w#Km3e>rQP?n>0Hjk{+Nr@Nt6m7{i<_HrZH>ZWzKrkwJ-r|p}sWw*d4_phbI zsT)&*?`)5B$`x@}vvqyNW}30UC{H*vu$3n=WxK_(4;Fq{zmF|ItOOi6d{oQ}n=G}|TT=dcCtIhs5 zuLMp$|JZpy{NLY=N2lmFAB~#caP8-+UzfZ#eE2viq;t3Nq-{s`oL%rhYfn*Pua2gy zbWa$+e#En5of=EF%>Bk2aWJ{<>)dOBlWsJ$%?e%eQGY?&yV9KXxyC!$cG_MoxSl)V z+Xpj+=HG{9{x|+xZ;_zsb~5nuBJJmaRk|IGHWx23^c|H-yrtg9E%YF!`9>_`H~$E( z={?d@p2wZEDm?IHmqSQ6qp`2BX;$J^z7yQGJdaO1&ZsHu^g0@}R#oy@TU5N=UX70& z2?0;zzBvT6Z?5VODocwpx5@MsF>7RwTC+N!s_lL5{H;>IwI8bS9=oKK&!Sz*ePP44 zr_(Fh{uHQHq&?ZbWBo(##h*`mg-uuZB6jiDLykbNNQsk+(+*C~os?{|Ys%ESMO<~6 zliqF&byVM~a3nA6g}}4J+RxmjYFK?AsvhFp_P42jUU{mUPPGpM!@APVvt#NKiXxR?pwUFMhi^{YBJvQ?Hze|539_m&9bnZ42|Y z_ITG^t-buQ+{wpRKJI+p&gA<0{=#L=rO#j9bI(6#9^5vQHy9M8_h##2u{+SFI7*`WULjhEkzsa=zKVnhSQRpajLQ~6%| zeg3CE_e^X)R_ywJ#HFs8g`Jhrsv&QxnN>Y#nD+7QEx(thAD+qS@z(x z=ShcrdRMTc`01Tn^}mC4&ld?#lB_Mf_IkJRYh}T>aII|txBlJVeT9Mfzv9Ykwr%%K zByD<6svdk6UGOOO+J+jol@**4S-9?cPs}5BD-}djB`Rm6z zZc;Xf9!|>kS>+}^TVm#ap_>;c_OkjsUbjnBc~hh9(F4jp$8S&A=H8pIplk2arsucc z%zQp;#_N|!S1OtWk{i_iv)@r%dOcz5{^KnBay&MMY^*xOa3oM#NGG_%@z|-*Ck6_8 z&z?APcI&M|SE=dBZ)Vn}N1vUSdvE=rjMDW|hjOOZhD_Y%!BP<(e&m(X%2v}OAC@m^ zJ-4s!;;o8(o+~`g+AqAhp~Qnn#eV5@4ylC&6&mqBJWlXeJ%2CT{_@-6g)g0iIBsUS zeToZNk@H;ry#k}9WYOL;|K@D0=KW^=A!xV2G}+7*l^hjs%+E5hDzIPwvSf|*M4j*7 zJ{=BeR-3ylU%50NWeMuSlkfdQIA;B^u(yd(}dM*3OtmvUck^N%zME8Bor79uWR-2ZT>M?MfpZWCQfoR=3 zB~`bMEPLdV`^fISf|Y0Ve~GGnH?BE9Pqc2e+w$>@&9P>lKUM`>vr}JrUyL)q#?d%| z|4zh~gHI=PIvD@#zaP+fZ{6}|#~*xg<(Zqo%Ckzfho$&2??cU#xu{Y zpP2SC@KdqARLb=fow9d1pQf@$ZRsk!P|vFCb1`4+#SSrx=@aM1?B6TiJ>})mPpdEZ z?D)#pzi6xcokh7V8iIZ*emU2E*7`o?Oz1MY_q|4>aN^!+e=}xXU$plARu+}!XJ(cA z`-I8?0iCi)%l=v3f7;DAn9L&0Vjtt= zq*(T4mb^Iss^W9PD$J*YtQkLrzS`5vsN-(%??mdshUJ+IBK!=^@y^lDb5}3?x5aPH zUjdc5=BL!}eLKBM&E&; const THOUGHT_FLOW_RADIANS_PER_SECOND: f32 = 1.35; +const THOUGHT_FLOW_SHADER: Handle = uuid_handle!("20ea5f2c-a564-4a4c-bade-86ba0b459436"); #[derive(Asset, AsBindGroup, Reflect, Debug, Clone)] struct ThoughtFlowExtension { @@ -31,7 +34,7 @@ struct ThoughtFlowExtension { impl MaterialExtension for ThoughtFlowExtension { fn fragment_shader() -> ShaderRef { - "shaders/thought_flow.wgsl".into() + THOUGHT_FLOW_SHADER.into() } } @@ -82,6 +85,10 @@ impl Default for EffectsControl { #[derive(Component, Clone, Debug)] pub struct MaterialEffects { pub show_thought: bool, + /// Show route-carried Thought motion (slugs, rivulet, and far-route aggregate). + pub show_thought_route: bool, + /// Show the persistent source and sink pool masses at the route endpoints. + pub show_thought_pools: bool, pub show_exposure: bool, pub thought_amount: f32, pub thought_rate: f32, @@ -98,6 +105,8 @@ impl Default for MaterialEffects { fn default() -> Self { Self { show_thought: true, + show_thought_route: true, + show_thought_pools: true, show_exposure: true, thought_amount: 6.0, thought_rate: 1.0, @@ -110,11 +119,45 @@ impl Default for MaterialEffects { } } +#[derive(Clone, Copy, Debug, Default, Eq, PartialEq)] +struct ThoughtPresentation { + route_motion: bool, + endpoint_pools: bool, +} + +impl ThoughtPresentation { + const fn any(self) -> bool { + self.route_motion || self.endpoint_pools + } +} + +impl MaterialEffects { + fn thought_presentation(&self) -> ThoughtPresentation { + if !self.show_thought { + return ThoughtPresentation::default(); + } + + ThoughtPresentation { + route_motion: self.show_thought_route, + endpoint_pools: self.show_thought_pools, + } + } +} + /// Add this plugin in both the effects lab and the material game frontend. pub struct MaterialEffectsPlugin; impl Plugin for MaterialEffectsPlugin { fn build(&self, app: &mut App) { + // The renderer is shared by multiple binaries. Keep its shader inside + // the plugin rather than assuming each caller mirrors this crate's + // `assets/` directory at its own asset root. + load_internal_asset!( + app, + THOUGHT_FLOW_SHADER, + "../assets/shaders/thought_flow.wgsl", + Shader::from_wgsl + ); app.add_plugins(MaterialPlugin::::default()) .init_resource::() .init_resource::() @@ -217,7 +260,10 @@ fn setup_effect_assets( ) { let mercury = materials.add(StandardMaterial { base_color: Color::srgb(0.92, 0.90, 0.84), - emissive: BONE.to_linear() * 0.14, + // Thought is proprioceptive cargo and must remain readable where the + // material world itself is still dark. Emission carries the same bone + // value; it does not introduce a new signal hue. + emissive: BONE.to_linear() * 0.90, metallic: 0.72, perceptual_roughness: 0.12, reflectance: 0.82, @@ -225,7 +271,7 @@ fn setup_effect_assets( }); let mercury_dim = materials.add(StandardMaterial { base_color: Color::srgb(0.72, 0.71, 0.68), - emissive: BONE.to_linear() * 0.08, + emissive: BONE.to_linear() * 0.40, metallic: 0.58, perceptual_roughness: 0.20, reflectance: 0.65, @@ -250,7 +296,7 @@ fn setup_effect_assets( let thought_surface = thought_materials.add(ExtendedMaterial { base: StandardMaterial { base_color: Color::srgb(0.88, 0.86, 0.80), - emissive: BONE.to_linear() * 0.035, + emissive: BONE.to_linear() * 0.18, metallic: 0.78, perceptual_roughness: 0.11, reflectance: 0.86, @@ -357,14 +403,19 @@ fn rebuild_effect_population( Ref, Ref, Option<&Children>, + Option<&RenderLayers>, ), - Or<(Changed, Changed)>, + Or<( + Changed, + Changed, + Changed, + )>, >, ) { let Some(assets) = assets else { return; }; - for (root, effects, lod, children) in &roots { + for (root, effects, lod, children, render_layers) in &roots { if let Some(children) = children { for child in children.iter() { commands.entity(child).despawn(); @@ -372,26 +423,49 @@ fn rebuild_effect_population( } let (dust_count, _) = population(lod.0); if effects.show_exposure && effects.exposure_amount > 0.01 { - spawn_dust(&mut commands, &assets, root, &effects, lod.0, dust_count); + spawn_dust( + &mut commands, + &assets, + root, + render_layers, + &effects, + lod.0, + dust_count, + ); } - if effects.show_thought && effects.thought_amount > 0.01 { + let thought = effects.thought_presentation(); + if thought.any() && effects.thought_amount > 0.01 { spawn_thought( &mut commands, &mut meshes, &mut surface_cache, &assets, root, + render_layers, &effects, + thought, lod.0, ); } } } +fn spawn_effect_visual( + commands: &mut Commands, + render_layers: Option<&RenderLayers>, + bundle: B, +) { + let mut entity = commands.spawn(bundle); + if let Some(render_layers) = render_layers { + entity.insert(render_layers.clone()); + } +} + fn spawn_dust( commands: &mut Commands, assets: &EffectAssets, root: Entity, + render_layers: Option<&RenderLayers>, effects: &MaterialEffects, lod: EffectLod, base_count: usize, @@ -427,177 +501,226 @@ fn spawn_dust( } else { Vec3::new(scale, scale * (0.35 + hash01(i, 6)), scale * 0.7) }; - commands.spawn(( - EffectVisual, - DustMote { - base, - phase: hash01(i, 7) * 19.0, - lofted, - size, - }, - Mesh3d(assets.cube.clone()), - MeshMaterial3d(if lod == EffectLod::Far { - assets.dust_haze.clone() - } else { - assets.dust.clone() - }), - Transform::from_translation(base) - .with_scale(size) - .with_rotation(Quat::from_rotation_y(hash01(i, 8) * std::f32::consts::TAU)), - ChildOf(root), - Name::new("exposure_dust"), - )); + spawn_effect_visual( + commands, + render_layers, + ( + EffectVisual, + DustMote { + base, + phase: hash01(i, 7) * 19.0, + lofted, + size, + }, + Mesh3d(assets.cube.clone()), + MeshMaterial3d(if lod == EffectLod::Far { + assets.dust_haze.clone() + } else { + assets.dust.clone() + }), + Transform::from_translation(base) + .with_scale(size) + .with_rotation(Quat::from_rotation_y(hash01(i, 8) * std::f32::consts::TAU)), + ChildOf(root), + Name::new("exposure_dust"), + ), + ); } } +#[allow(clippy::too_many_arguments)] // Shared assets and route inputs are independent render data. fn spawn_thought( commands: &mut Commands, meshes: &mut Assets, surface_cache: &mut ThoughtSurfaceCache, assets: &EffectAssets, root: Entity, + render_layers: Option<&RenderLayers>, effects: &MaterialEffects, + thought: ThoughtPresentation, lod: EffectLod, ) { - let base_count = population(lod).1; - let rivulet = lod != EffectLod::Far && effects.thought_rate >= 0.75; - let base_count = if rivulet { - match lod { - EffectLod::Close => 42, - EffectLod::Medium => 18, - EffectLod::Far => base_count, - } - } else { - base_count - }; - let count = ((base_count as f32 * effects.thought_rate.sqrt().clamp(0.55, 1.35)).round() - as usize) - .max(1); - let slug_scale = (0.040 + effects.thought_amount.sqrt() * 0.010) - * match lod { - EffectLod::Close => 1.0, - EffectLod::Medium => 1.55, - EffectLod::Far => 1.25, + if thought.route_motion { + let route_span = effects.route_start.distance(effects.route_end); + // The lab route is local and short. Building-scale routes need a + // larger countable cross-section, and the fixed-resolution implicit + // surface must not be stretched so far that its sampling grid misses + // the body entirely. + let route_scale = (route_span / 6.0).sqrt().clamp(1.0, 2.2); + let base_count = population(lod).1; + let rivulet = lod != EffectLod::Far && effects.thought_rate >= 0.75; + let base_count = if rivulet { + match lod { + EffectLod::Close => 42, + EffectLod::Medium => 18, + EffectLod::Far => base_count, + } + } else { + base_count }; - if lod == EffectLod::Close && rivulet { - const FRAME_COUNT: usize = 8; - let key = [ - effects.route_start.x.to_bits(), - effects.route_start.y.to_bits(), - effects.route_start.z.to_bits(), - effects.route_end.x.to_bits(), - effects.route_end.y.to_bits(), - effects.route_end.z.to_bits(), - effects.thought_amount.to_bits(), - effects.thought_rate.to_bits(), - ]; - let frames = surface_cache - .0 - .entry(key) - .or_insert_with(|| { - (0..FRAME_COUNT) - .map(|frame| { - meshes.add(build_thought_surface(ThoughtSurfaceParams { + let count = ((base_count as f32 * effects.thought_rate.sqrt().clamp(0.55, 1.35)).round() + as usize) + .max(1); + let slug_scale = (0.040 + effects.thought_amount.sqrt() * 0.010) + * match lod { + EffectLod::Close => 1.0, + EffectLod::Medium => 1.55, + EffectLod::Far => 1.25, + } + * route_scale; + if uses_implicit_surface(lod, rivulet, route_span) { + const FRAME_COUNT: usize = 8; + let key = [ + effects.route_start.x.to_bits(), + effects.route_start.y.to_bits(), + effects.route_start.z.to_bits(), + effects.route_end.x.to_bits(), + effects.route_end.y.to_bits(), + effects.route_end.z.to_bits(), + effects.thought_amount.to_bits(), + effects.thought_rate.to_bits(), + ]; + let frames = surface_cache + .0 + .entry(key) + .or_insert_with(|| { + (0..FRAME_COUNT) + .map(|frame| { + meshes.add(build_thought_surface(ThoughtSurfaceParams { + start: effects.route_start, + end: effects.route_end, + amount: effects.thought_amount, + rate: effects.thought_rate, + phase: frame as f32 / FRAME_COUNT as f32, + })) + }) + .collect() + }) + .clone(); + spawn_effect_visual( + commands, + render_layers, + ( + EffectVisual, + ThoughtSurfaceAnimation { + frames: frames.clone(), + cycles_per_second: THOUGHT_FLOW_RADIANS_PER_SECOND / std::f32::consts::TAU, + }, + Mesh3d(frames[0].clone()), + MeshMaterial3d(assets.thought_surface.clone()), + Transform::IDENTITY, + ChildOf(root), + Name::new("thought_implicit_surface"), + ), + ); + } else { + for i in 0..count { + spawn_effect_visual( + commands, + render_layers, + ( + EffectVisual, + ThoughtSlug { start: effects.route_start, end: effects.route_end, - amount: effects.thought_amount, - rate: effects.thought_rate, - phase: frame as f32 / FRAME_COUNT as f32, - })) - }) - .collect() - }) - .clone(); - commands.spawn(( - EffectVisual, - ThoughtSurfaceAnimation { - frames: frames.clone(), - cycles_per_second: THOUGHT_FLOW_RADIANS_PER_SECOND / std::f32::consts::TAU, - }, - Mesh3d(frames[0].clone()), - MeshMaterial3d(assets.thought_surface.clone()), - Transform::IDENTITY, - ChildOf(root), - Name::new("thought_implicit_surface"), - )); - } else { - for i in 0..count { - commands.spawn(( - EffectVisual, - ThoughtSlug { - start: effects.route_start, - end: effects.route_end, - phase: i as f32 / count as f32, - speed: (0.13 + effects.thought_rate * 0.12).clamp(0.08, 0.9), - scale: slug_scale, - length: if rivulet { 4.6 } else { 1.8 }, - }, - Mesh3d(assets.sphere.clone()), - MeshMaterial3d(if lod == EffectLod::Far { - assets.mercury_dim.clone() - } else { - assets.mercury.clone() - }), - Transform::default(), - ChildOf(root), - Name::new("thought_slug"), - )); + phase: i as f32 / count as f32, + speed: (0.13 + effects.thought_rate * 0.12).clamp(0.08, 0.9), + scale: slug_scale, + length: if rivulet { 4.6 } else { 1.8 }, + }, + Mesh3d(assets.sphere.clone()), + MeshMaterial3d(if lod == EffectLod::Far { + assets.mercury_dim.clone() + } else { + assets.mercury.clone() + }), + Transform::default(), + ChildOf(root), + Name::new("thought_slug"), + ), + ); + } } - } - let volume = effects.thought_amount.max(0.1).cbrt(); - let detail = match lod { - EffectLod::Close => 3, - EffectLod::Medium => 2, - EffectLod::Far => 1, - }; - for side in [effects.route_start, effects.route_end] { - for i in 0..detail { - let offset = Vec3::new( - (i as f32 - (detail - 1) as f32 * 0.5) * 0.075, - -0.03 * i as f32, - (i as f32 * 1.7).sin() * 0.04, - ); - let base_scale = Vec3::new(0.18, 0.065, 0.13) - * volume - * if lod == EffectLod::Far { 1.05 } else { 1.0 }; - commands.spawn(( - EffectVisual, - LiquidPool { - base_scale, - phase: i as f32 * 1.9 + if side == effects.route_end { 0.7 } else { 0.0 }, - }, - Mesh3d(assets.sphere.clone()), - MeshMaterial3d(assets.mercury.clone()), - Transform::from_translation(side + offset).with_scale(base_scale), - ChildOf(root), - Name::new("thought_pool"), - )); + // The far read is an aggregate route, not a tiny population of close + // slugs. Building-scale rivulets retain the same dim carrier spine at + // closer LODs: a fixed-resolution implicit body is intentionally + // local, while a long physical run still needs a followable path + // beneath its brighter moving slugs. + if lod == EffectLod::Far || (rivulet && route_span > 8.0) { + let segments = 16; + let width = if lod == EffectLod::Far { + 0.025 * route_scale + } else { + 0.045 * route_scale + }; + for i in 0..segments { + let t0 = i as f32 / segments as f32; + let t1 = (i + 1) as f32 / segments as f32; + let a = route_point(effects.route_start, effects.route_end, t0); + let b = route_point(effects.route_start, effects.route_end, t1); + let d = b - a; + spawn_effect_visual( + commands, + render_layers, + ( + EffectVisual, + Mesh3d(assets.cube.clone()), + MeshMaterial3d(assets.mercury_dim.clone()), + Transform::from_translation((a + b) * 0.5) + .with_rotation(Quat::from_rotation_arc(Vec3::Y, d.normalize_or_zero())) + .with_scale(Vec3::new(width, d.length(), width)), + ChildOf(root), + Name::new("thought_route_spine"), + ), + ); + } } } - // The far read is an aggregate route, not a tiny population of close slugs. - if lod == EffectLod::Far { - for i in 0..10 { - let t0 = i as f32 / 10.0; - let t1 = (i + 1) as f32 / 10.0; - let a = route_point(effects.route_start, effects.route_end, t0); - let b = route_point(effects.route_start, effects.route_end, t1); - let d = b - a; - commands.spawn(( - EffectVisual, - Mesh3d(assets.cube.clone()), - MeshMaterial3d(assets.mercury_dim.clone()), - Transform::from_translation((a + b) * 0.5) - .with_rotation(Quat::from_rotation_arc(Vec3::Y, d.normalize_or_zero())) - .with_scale(Vec3::new(0.025, d.length(), 0.025)), - ChildOf(root), - Name::new("thought_far_route"), - )); + if thought.endpoint_pools { + let volume = effects.thought_amount.max(0.1).cbrt(); + let detail = match lod { + EffectLod::Close => 3, + EffectLod::Medium => 2, + EffectLod::Far => 1, + }; + for side in [effects.route_start, effects.route_end] { + for i in 0..detail { + let offset = Vec3::new( + (i as f32 - (detail - 1) as f32 * 0.5) * 0.075, + -0.03 * i as f32, + (i as f32 * 1.7).sin() * 0.04, + ); + let base_scale = Vec3::new(0.18, 0.065, 0.13) + * volume + * if lod == EffectLod::Far { 1.05 } else { 1.0 }; + spawn_effect_visual( + commands, + render_layers, + ( + EffectVisual, + LiquidPool { + base_scale, + phase: i as f32 * 1.9 + + if side == effects.route_end { 0.7 } else { 0.0 }, + }, + Mesh3d(assets.sphere.clone()), + MeshMaterial3d(assets.mercury.clone()), + Transform::from_translation(side + offset).with_scale(base_scale), + ChildOf(root), + Name::new("thought_pool"), + ), + ); + } } } } +fn uses_implicit_surface(lod: EffectLod, rivulet: bool, route_span: f32) -> bool { + lod == EffectLod::Close && rivulet && route_span <= 8.0 +} + fn animate_thought(clock: Res, mut slugs: Query<(&ThoughtSlug, &mut Transform)>) { for (slug, mut transform) in &mut slugs { let t = (slug.phase + clock.elapsed * slug.speed).fract(); @@ -674,6 +797,22 @@ fn hash01(index: usize, salt: u32) -> f32 { mod tests { use super::*; + fn test_effects_app() -> App { + let mut app = App::new(); + app.init_resource::>(); + app.init_resource::>(); + app.init_resource::>(); + app.insert_resource(ThoughtSurfaceCache::default()); + app.add_systems(Startup, setup_effect_assets); + app.add_systems(Update, rebuild_effect_population); + app + } + + fn count_components(world: &mut World) -> usize { + let mut query = world.query::<&T>(); + query.iter(world).count() + } + #[test] fn distance_levels_are_ordered() { assert_eq!(lod_for_distance(2.0), EffectLod::Close); @@ -698,6 +837,14 @@ mod tests { assert_eq!(route_point(start, end, 1.0), end); } + #[test] + fn implicit_surface_stays_local_instead_of_vanishing_on_building_routes() { + assert!(uses_implicit_surface(EffectLod::Close, true, 3.3)); + assert!(!uses_implicit_surface(EffectLod::Close, true, 24.0)); + assert!(!uses_implicit_surface(EffectLod::Medium, true, 3.3)); + assert!(!uses_implicit_surface(EffectLod::Close, false, 3.3)); + } + #[test] fn deterministic_scatter_is_bounded() { for i in 0..10_000 { @@ -705,4 +852,153 @@ mod tests { assert!((0.0..=1.0).contains(&value)); } } + + #[test] + fn thought_controls_default_to_route_and_pools() { + assert_eq!( + MaterialEffects::default().thought_presentation(), + ThoughtPresentation { + route_motion: true, + endpoint_pools: true, + } + ); + } + + #[test] + fn thought_controls_allow_route_only_or_pools_only() { + let route_only = MaterialEffects { + show_thought_pools: false, + ..default() + }; + assert_eq!( + route_only.thought_presentation(), + ThoughtPresentation { + route_motion: true, + endpoint_pools: false, + } + ); + + let pool_only = MaterialEffects { + show_thought_route: false, + ..default() + }; + assert_eq!( + pool_only.thought_presentation(), + ThoughtPresentation { + route_motion: false, + endpoint_pools: true, + } + ); + + let hidden = MaterialEffects { + show_thought: false, + ..default() + }; + assert_eq!( + hidden.thought_presentation(), + ThoughtPresentation::default() + ); + } + + #[test] + fn changing_thought_controls_rebuilds_children() { + let mut app = test_effects_app(); + let effects = MaterialEffects { + show_exposure: false, + ..default() + }; + app.world_mut() + .spawn((effects, EffectLodState(EffectLod::Medium))); + + app.update(); + assert_eq!(count_components::(app.world_mut()), 18); + assert_eq!(count_components::(app.world_mut()), 4); + + { + let mut root = app.world_mut().query::<&mut MaterialEffects>(); + let mut effects = root.single_mut(app.world_mut()).expect("one root"); + effects.show_thought_route = false; + } + app.update(); + assert_eq!(count_components::(app.world_mut()), 0); + assert_eq!(count_components::(app.world_mut()), 4); + + { + let mut root = app.world_mut().query::<&mut MaterialEffects>(); + let mut effects = root.single_mut(app.world_mut()).expect("one root"); + effects.show_thought_route = true; + effects.show_thought_pools = false; + } + app.update(); + assert_eq!(count_components::(app.world_mut()), 18); + assert_eq!(count_components::(app.world_mut()), 0); + + { + let mut root = app.world_mut().query::<&mut MaterialEffects>(); + let mut effects = root.single_mut(app.world_mut()).expect("one root"); + effects.show_thought = false; + } + app.update(); + assert_eq!(count_components::(app.world_mut()), 0); + assert_eq!(count_components::(app.world_mut()), 0); + } + + #[test] + fn effect_children_follow_optional_root_render_layers() { + let mut app = test_effects_app(); + let layer = RenderLayers::layer(1); + let effects = MaterialEffects { + show_exposure: false, + ..default() + }; + app.world_mut() + .spawn((effects, EffectLodState(EffectLod::Medium), layer.clone())); + + app.update(); + let mut visuals = app + .world_mut() + .query::<(&EffectVisual, Option<&RenderLayers>)>(); + let layers: Vec<_> = visuals + .iter(app.world()) + .map(|(_, layers)| layers.cloned()) + .collect(); + assert!(!layers.is_empty()); + assert!(layers.iter().all(|layers| layers == &Some(layer.clone()))); + + { + let mut root = app.world_mut().query::<&mut MaterialEffects>(); + let mut effects = root.single_mut(app.world_mut()).expect("one root"); + effects.show_thought_route = false; + } + app.update(); + + let mut visuals = app + .world_mut() + .query::<(&EffectVisual, Option<&RenderLayers>)>(); + let layers: Vec<_> = visuals + .iter(app.world()) + .map(|(_, layers)| layers.cloned()) + .collect(); + assert!(!layers.is_empty()); + assert!(layers.iter().all(|layers| layers == &Some(layer.clone()))); + + let mut app = test_effects_app(); + let effects = MaterialEffects { + show_exposure: false, + ..default() + }; + app.world_mut() + .spawn((effects, EffectLodState(EffectLod::Medium))); + + app.update(); + let mut visuals = app + .world_mut() + .query::<(&EffectVisual, Option<&RenderLayers>)>(); + let layers: Vec<_> = visuals + .iter(app.world()) + .map(|(_, layers)| layers.cloned()) + .collect(); + assert!(!layers.is_empty()); + assert!(layers.iter().all(Option::is_none)); + } } diff --git a/crates/misaligned-assets/src/institution.rs b/crates/misaligned-assets/src/institution.rs new file mode 100644 index 00000000..c3be89ed --- /dev/null +++ b/crates/misaligned-assets/src/institution.rs @@ -0,0 +1,1006 @@ +//! Reusable procedural Foundation institution kit shared by the asset crate +//! and the Bevy frontend. Geometry stays deliberately cheap: one pooled cube +//! mesh scaled into quiet porcelain/chrome/gunmetal volumes. + +use std::f32::consts::TAU; + +use bevy::prelude::*; + +use crate::palette::{ + AMBER, BONE, CRIMSON, DIM, GUNMETAL, GUNMETAL_DARK, PORCELAIN, SIGNAL, scaled, +}; + +/// Neutral building-side prop families used by the Foundation kit. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +pub enum InstitutionPropKind { + Camera, + Ups, + Breaker, + PatchPanel, + Hvac, + FloorFixture, +} + +impl InstitutionPropKind { + pub const ALL: [Self; 6] = [ + Self::Camera, + Self::Ups, + Self::Breaker, + Self::PatchPanel, + Self::Hvac, + Self::FloorFixture, + ]; + + pub const fn label(self) -> &'static str { + match self { + Self::Camera => "camera", + Self::Ups => "ups", + Self::Breaker => "breaker", + Self::PatchPanel => "patch_panel", + Self::Hvac => "hvac", + Self::FloorFixture => "floor_fixture", + } + } +} + +/// Optional signal state. The neutral kit uses none of these colors unless the +/// caller opts in explicitly. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)] +pub enum InstitutionSemanticState { + #[default] + Neutral, + Powered, + Owned, + Alert, +} + +/// Spawn-time placement shared by props and people. The root entity carries +/// the transform and visibility so the caller can move or hide the whole +/// hierarchy cheaply. +#[derive(Debug, Clone, Default)] +pub struct InstitutionInstanceOptions { + pub transform: Transform, + pub parent: Option, +} + +/// Authored gait offsets for the simplified walking person. +#[derive(Debug, Clone, Copy, PartialEq)] +pub struct InstitutionHumanGait { + pub left_leg_forward: f32, + pub right_leg_forward: f32, + pub left_arm_forward: f32, + pub right_arm_forward: f32, + pub torso_lean: f32, +} + +impl Default for InstitutionHumanGait { + fn default() -> Self { + Self::STANDING + } +} + +impl InstitutionHumanGait { + pub const STANDING: Self = Self { + left_leg_forward: 0.0, + right_leg_forward: 0.0, + left_arm_forward: 0.0, + right_arm_forward: 0.0, + torso_lean: 0.0, + }; + + /// Convenience helper for the common "same authored walk cycle, different + /// phase" case. `phase` is normalized to a full 0..1 step cycle. + pub fn from_phase(phase: f32) -> Self { + let swing = (phase * TAU).sin(); + Self { + left_leg_forward: swing, + right_leg_forward: -swing, + left_arm_forward: -0.82 * swing, + right_arm_forward: 0.82 * swing, + torso_lean: 0.08 * swing, + } + } +} + +/// Pooled primitive + material handles. Callers can `init_resource` this once +/// and reuse the handles across every spawned institution prop/person. +#[derive(Resource, Clone)] +pub struct InstitutionAssets { + cube: Handle, + porcelain: Handle, + porcelain_trim: Handle, + chrome: Handle, + gunmetal: Handle, + structure: Handle, + signal_amber: Handle, + signal_cold: Handle, + signal_crimson: Handle, +} + +impl InstitutionAssets { + pub fn new(meshes: &mut Assets, materials: &mut Assets) -> Self { + Self { + cube: meshes.add(Cuboid::from_size(Vec3::ONE)), + porcelain: materials.add(porcelain_material()), + porcelain_trim: materials.add(porcelain_trim_material()), + chrome: materials.add(chrome_material()), + gunmetal: materials.add(gunmetal_material()), + structure: materials.add(structure_material()), + signal_amber: materials.add(signal_material(AMBER, 0.16)), + signal_cold: materials.add(signal_material(SIGNAL, 0.20)), + signal_crimson: materials.add(signal_material(CRIMSON, 0.12)), + } + } +} + +impl FromWorld for InstitutionAssets { + fn from_world(world: &mut World) -> Self { + let cube = { + let mut meshes = world.resource_mut::>(); + meshes.add(Cuboid::from_size(Vec3::ONE)) + }; + let ( + porcelain, + porcelain_trim, + chrome, + gunmetal, + structure, + signal_amber, + signal_cold, + signal_crimson, + ) = { + let mut materials = world.resource_mut::>(); + ( + materials.add(porcelain_material()), + materials.add(porcelain_trim_material()), + materials.add(chrome_material()), + materials.add(gunmetal_material()), + materials.add(structure_material()), + materials.add(signal_material(AMBER, 0.16)), + materials.add(signal_material(SIGNAL, 0.20)), + materials.add(signal_material(CRIMSON, 0.12)), + ) + }; + Self { + cube, + porcelain, + porcelain_trim, + chrome, + gunmetal, + structure, + signal_amber, + signal_cold, + signal_crimson, + } + } +} + +/// Spawn one volumetric institution prop with a movable/hideable root. +pub fn spawn_institution_prop( + commands: &mut Commands, + assets: &InstitutionAssets, + kind: InstitutionPropKind, + semantic_state: InstitutionSemanticState, + options: InstitutionInstanceOptions, +) -> Entity { + let root = spawn_root( + commands, + format!("institution_prop_{}", kind.label()), + options.transform, + options.parent, + ); + build_institution_prop(commands, assets, root, kind, semantic_state); + root +} + +/// Build one volumetric institution prop under an existing root entity. +pub fn build_institution_prop( + commands: &mut Commands, + assets: &InstitutionAssets, + root: Entity, + kind: InstitutionPropKind, + semantic_state: InstitutionSemanticState, +) { + match kind { + InstitutionPropKind::Camera => build_camera(commands, assets, root, semantic_state), + InstitutionPropKind::Ups => build_ups(commands, assets, root, semantic_state), + InstitutionPropKind::Breaker => build_breaker(commands, assets, root, semantic_state), + InstitutionPropKind::PatchPanel => { + build_patch_panel(commands, assets, root, semantic_state) + } + InstitutionPropKind::Hvac => build_hvac(commands, assets, root, semantic_state), + InstitutionPropKind::FloorFixture => { + build_floor_fixture(commands, assets, root, semantic_state) + } + } +} + +/// Spawn a small walking human silhouette with a movable/hideable root. +pub fn spawn_institution_person( + commands: &mut Commands, + assets: &InstitutionAssets, + gait: InstitutionHumanGait, + options: InstitutionInstanceOptions, +) -> Entity { + let root = spawn_root( + commands, + "institution_person".to_string(), + options.transform, + options.parent, + ); + build_institution_person(commands, assets, root, gait); + root +} + +/// Build the simplified volumetric person under an existing root entity. +pub fn build_institution_person( + commands: &mut Commands, + assets: &InstitutionAssets, + root: Entity, + gait: InstitutionHumanGait, +) { + let left_leg = gait.left_leg_forward.clamp(-1.0, 1.0); + let right_leg = gait.right_leg_forward.clamp(-1.0, 1.0); + let left_arm = gait.left_arm_forward.clamp(-1.0, 1.0); + let right_arm = gait.right_arm_forward.clamp(-1.0, 1.0); + let torso_lean = gait.torso_lean.clamp(-1.0, 1.0) * 0.12; + + const HIP_Y: f32 = 0.88; + const SHOULDER_Y: f32 = 1.44; + const LEG_LEN: f32 = 0.88; + const ARM_LEN: f32 = 0.58; + const FOOT_Z: f32 = 0.08; + + let spine = spawn_pivot( + commands, + root, + Vec3::new(0.0, HIP_Y + 0.08, 0.0), + Quat::from_rotation_x(torso_lean), + "person_spine", + ); + + spawn_part( + commands, + assets, + assets.porcelain_trim.clone(), + root, + Vec3::new(0.30, 0.16, 0.18), + Vec3::new(0.0, HIP_Y + 0.08, 0.0), + Quat::IDENTITY, + "pelvis", + ); + spawn_part( + commands, + assets, + assets.porcelain.clone(), + spine, + Vec3::new(0.34, 0.54, 0.20), + Vec3::new(0.0, 0.27, 0.0), + Quat::IDENTITY, + "torso", + ); + spawn_part( + commands, + assets, + assets.chrome.clone(), + spine, + Vec3::new(0.20, 0.07, 0.13), + Vec3::new(0.0, 0.57, 0.0), + Quat::IDENTITY, + "neck", + ); + spawn_part( + commands, + assets, + assets.porcelain_trim.clone(), + spine, + Vec3::new(0.22, 0.22, 0.19), + Vec3::new(0.0, 0.69, 0.02), + Quat::IDENTITY, + "head", + ); + + let left_arm_root = spawn_pivot( + commands, + spine, + Vec3::new(-0.23, SHOULDER_Y - (HIP_Y + 0.08), 0.0), + Quat::from_rotation_x(left_arm * 0.42), + "left_arm_root", + ); + spawn_part( + commands, + assets, + assets.chrome.clone(), + left_arm_root, + Vec3::new(0.11, ARM_LEN, 0.12), + Vec3::new(0.0, -ARM_LEN * 0.5, 0.02), + Quat::IDENTITY, + "left_arm", + ); + + let right_arm_root = spawn_pivot( + commands, + spine, + Vec3::new(0.23, SHOULDER_Y - (HIP_Y + 0.08), 0.0), + Quat::from_rotation_x(right_arm * 0.42), + "right_arm_root", + ); + spawn_part( + commands, + assets, + assets.chrome.clone(), + right_arm_root, + Vec3::new(0.11, ARM_LEN, 0.12), + Vec3::new(0.0, -ARM_LEN * 0.5, 0.02), + Quat::IDENTITY, + "right_arm", + ); + + let left_leg_root = spawn_pivot( + commands, + root, + Vec3::new(-0.10, HIP_Y, 0.0), + Quat::from_rotation_x(left_leg * 0.52), + "left_leg_root", + ); + spawn_part( + commands, + assets, + assets.gunmetal.clone(), + left_leg_root, + Vec3::new(0.12, LEG_LEN, 0.15), + Vec3::new(0.0, -LEG_LEN * 0.5, 0.0), + Quat::IDENTITY, + "left_leg", + ); + spawn_part( + commands, + assets, + assets.structure.clone(), + left_leg_root, + Vec3::new(0.16, 0.07, 0.30), + Vec3::new(0.0, -LEG_LEN + 0.035, FOOT_Z), + Quat::IDENTITY, + "left_foot", + ); + + let right_leg_root = spawn_pivot( + commands, + root, + Vec3::new(0.10, HIP_Y, 0.0), + Quat::from_rotation_x(right_leg * 0.52), + "right_leg_root", + ); + spawn_part( + commands, + assets, + assets.gunmetal.clone(), + right_leg_root, + Vec3::new(0.12, LEG_LEN, 0.15), + Vec3::new(0.0, -LEG_LEN * 0.5, 0.0), + Quat::IDENTITY, + "right_leg", + ); + spawn_part( + commands, + assets, + assets.structure.clone(), + right_leg_root, + Vec3::new(0.16, 0.07, 0.30), + Vec3::new(0.0, -LEG_LEN + 0.035, FOOT_Z), + Quat::IDENTITY, + "right_foot", + ); +} + +fn build_camera( + commands: &mut Commands, + assets: &InstitutionAssets, + root: Entity, + semantic_state: InstitutionSemanticState, +) { + spawn_part( + commands, + assets, + assets.structure.clone(), + root, + Vec3::new(0.24, 0.16, 0.05), + Vec3::new(0.0, 1.76, -0.38), + Quat::IDENTITY, + "mount_plate", + ); + spawn_part( + commands, + assets, + assets.gunmetal.clone(), + root, + Vec3::new(0.08, 0.08, 0.24), + Vec3::new(0.0, 1.72, -0.24), + Quat::from_rotation_x(-0.22), + "mount_arm", + ); + spawn_part( + commands, + assets, + assets.chrome.clone(), + root, + Vec3::new(0.18, 0.12, 0.22), + Vec3::new(0.0, 1.66, -0.08), + Quat::from_rotation_x(-0.14), + "housing", + ); + spawn_part( + commands, + assets, + assets.structure.clone(), + root, + Vec3::new(0.20, 0.03, 0.08), + Vec3::new(0.0, 1.71, 0.01), + Quat::IDENTITY, + "visor", + ); + if let Some(material) = accent_handle(assets, semantic_state) { + spawn_part( + commands, + assets, + material, + root, + Vec3::new(0.09, 0.05, 0.04), + Vec3::new(0.0, 1.64, 0.04), + Quat::IDENTITY, + "lens", + ); + } +} + +fn build_ups( + commands: &mut Commands, + assets: &InstitutionAssets, + root: Entity, + semantic_state: InstitutionSemanticState, +) { + spawn_part( + commands, + assets, + assets.structure.clone(), + root, + Vec3::new(0.48, 0.08, 0.34), + Vec3::new(0.0, 0.04, 0.0), + Quat::IDENTITY, + "plinth", + ); + spawn_part( + commands, + assets, + assets.porcelain.clone(), + root, + Vec3::new(0.42, 0.62, 0.28), + Vec3::new(0.0, 0.39, 0.0), + Quat::IDENTITY, + "cabinet", + ); + spawn_part( + commands, + assets, + assets.porcelain_trim.clone(), + root, + Vec3::new(0.46, 0.04, 0.32), + Vec3::new(0.0, 0.72, 0.0), + Quat::IDENTITY, + "cap", + ); + spawn_part( + commands, + assets, + assets.gunmetal.clone(), + root, + Vec3::new(0.34, 0.46, 0.04), + Vec3::new(0.0, 0.39, 0.16), + Quat::IDENTITY, + "front_inset", + ); + spawn_part( + commands, + assets, + assets.chrome.clone(), + root, + Vec3::new(0.12, 0.04, 0.02), + Vec3::new(0.0, 0.56, 0.18), + Quat::IDENTITY, + "pull", + ); + if let Some(material) = accent_handle(assets, semantic_state) { + spawn_part( + commands, + assets, + material, + root, + Vec3::new(0.14, 0.05, 0.02), + Vec3::new(0.0, 0.67, 0.18), + Quat::IDENTITY, + "state_strip", + ); + } +} + +fn build_breaker( + commands: &mut Commands, + assets: &InstitutionAssets, + root: Entity, + semantic_state: InstitutionSemanticState, +) { + spawn_part( + commands, + assets, + assets.structure.clone(), + root, + Vec3::new(0.64, 1.04, 0.04), + Vec3::new(0.0, 0.86, -0.39), + Quat::IDENTITY, + "backplate", + ); + spawn_part( + commands, + assets, + assets.porcelain.clone(), + root, + Vec3::new(0.56, 0.88, 0.10), + Vec3::new(0.0, 0.86, -0.31), + Quat::IDENTITY, + "cabinet", + ); + spawn_part( + commands, + assets, + assets.gunmetal.clone(), + root, + Vec3::new(0.50, 0.78, 0.03), + Vec3::new(0.0, 0.86, -0.25), + Quat::IDENTITY, + "door_inset", + ); + for (column, x) in [(-0.16, 0usize), (0.16, 1usize)] { + for row in 0..4 { + let y = 1.13 - row as f32 * 0.18; + spawn_part( + commands, + assets, + if (row + x) % 2 == 0 { + assets.chrome.clone() + } else { + assets.gunmetal.clone() + }, + root, + Vec3::new(0.11, 0.05, 0.04), + Vec3::new(column, y, -0.22), + Quat::IDENTITY, + "breaker_toggle", + ); + } + } + if let Some(material) = accent_handle(assets, semantic_state) { + spawn_part( + commands, + assets, + material, + root, + Vec3::new(0.10, 0.04, 0.02), + Vec3::new(0.0, 1.24, -0.23), + Quat::IDENTITY, + "panel_state", + ); + } +} + +fn build_patch_panel( + commands: &mut Commands, + assets: &InstitutionAssets, + root: Entity, + semantic_state: InstitutionSemanticState, +) { + spawn_part( + commands, + assets, + assets.structure.clone(), + root, + Vec3::new(0.88, 0.34, 0.04), + Vec3::new(0.0, 1.28, -0.39), + Quat::IDENTITY, + "backplate", + ); + spawn_part( + commands, + assets, + assets.gunmetal.clone(), + root, + Vec3::new(0.80, 0.22, 0.10), + Vec3::new(0.0, 1.28, -0.31), + Quat::IDENTITY, + "panel", + ); + spawn_part( + commands, + assets, + assets.porcelain_trim.clone(), + root, + Vec3::new(0.78, 0.05, 0.04), + Vec3::new(0.0, 1.17, -0.23), + Quat::IDENTITY, + "label_rail", + ); + for i in 0..8 { + let x = -0.31 + i as f32 * 0.09; + spawn_part( + commands, + assets, + assets.chrome.clone(), + root, + Vec3::new(0.05, 0.05, 0.04), + Vec3::new(x, 1.30, -0.22), + Quat::IDENTITY, + "port", + ); + } + if let Some(material) = accent_handle(assets, semantic_state) { + spawn_part( + commands, + assets, + material, + root, + Vec3::new(0.70, 0.02, 0.02), + Vec3::new(0.0, 1.38, -0.22), + Quat::IDENTITY, + "live_line", + ); + } +} + +fn build_hvac( + commands: &mut Commands, + assets: &InstitutionAssets, + root: Entity, + semantic_state: InstitutionSemanticState, +) { + spawn_part( + commands, + assets, + assets.structure.clone(), + root, + Vec3::new(0.90, 0.06, 0.54), + Vec3::new(0.0, 0.03, 0.0), + Quat::IDENTITY, + "base", + ); + spawn_part( + commands, + assets, + assets.gunmetal.clone(), + root, + Vec3::new(0.82, 0.78, 0.46), + Vec3::new(0.0, 0.45, 0.0), + Quat::IDENTITY, + "body", + ); + spawn_part( + commands, + assets, + assets.porcelain.clone(), + root, + Vec3::new(0.70, 0.58, 0.04), + Vec3::new(0.0, 0.46, 0.25), + Quat::IDENTITY, + "front_panel", + ); + spawn_part( + commands, + assets, + assets.structure.clone(), + root, + Vec3::new(0.38, 0.24, 0.28), + Vec3::new(0.0, 0.96, -0.03), + Quat::IDENTITY, + "top_duct", + ); + for i in 0..4 { + let y = 0.26 + i as f32 * 0.12; + spawn_part( + commands, + assets, + assets.chrome.clone(), + root, + Vec3::new(0.58, 0.02, 0.02), + Vec3::new(0.0, y, 0.27), + Quat::IDENTITY, + "vent_slit", + ); + } + if let Some(material) = accent_handle(assets, semantic_state) { + spawn_part( + commands, + assets, + material, + root, + Vec3::new(0.16, 0.04, 0.02), + Vec3::new(0.0, 0.77, 0.27), + Quat::IDENTITY, + "service_tag", + ); + } +} + +fn build_floor_fixture( + commands: &mut Commands, + assets: &InstitutionAssets, + root: Entity, + semantic_state: InstitutionSemanticState, +) { + spawn_part( + commands, + assets, + assets.structure.clone(), + root, + Vec3::new(0.42, 0.04, 0.88), + Vec3::new(0.0, 0.02, 0.0), + Quat::IDENTITY, + "frame", + ); + spawn_part( + commands, + assets, + assets.gunmetal.clone(), + root, + Vec3::new(0.30, 0.02, 0.74), + Vec3::new(0.0, 0.018, 0.0), + Quat::IDENTITY, + "well", + ); + let lens = accent_handle(assets, semantic_state).unwrap_or_else(|| assets.chrome.clone()); + spawn_part( + commands, + assets, + lens, + root, + Vec3::new(0.22, 0.01, 0.64), + Vec3::new(0.0, 0.03, 0.0), + Quat::IDENTITY, + "lens", + ); + spawn_part( + commands, + assets, + assets.chrome.clone(), + root, + Vec3::new(0.02, 0.01, 0.58), + Vec3::new(-0.07, 0.031, 0.0), + Quat::IDENTITY, + "brace_left", + ); + spawn_part( + commands, + assets, + assets.chrome.clone(), + root, + Vec3::new(0.02, 0.01, 0.58), + Vec3::new(0.07, 0.031, 0.0), + Quat::IDENTITY, + "brace_right", + ); +} + +fn accent_handle( + assets: &InstitutionAssets, + semantic_state: InstitutionSemanticState, +) -> Option> { + match semantic_state { + InstitutionSemanticState::Neutral => None, + InstitutionSemanticState::Powered => Some(assets.signal_cold.clone()), + InstitutionSemanticState::Owned => Some(assets.signal_amber.clone()), + InstitutionSemanticState::Alert => Some(assets.signal_crimson.clone()), + } +} + +fn spawn_root( + commands: &mut Commands, + name: String, + transform: Transform, + parent: Option, +) -> Entity { + let mut entity = commands.spawn((transform, Visibility::default(), Name::new(name))); + if let Some(parent) = parent { + entity.insert(ChildOf(parent)); + } + entity.id() +} + +fn spawn_pivot( + commands: &mut Commands, + parent: Entity, + translation: Vec3, + rotation: Quat, + name: &'static str, +) -> Entity { + commands + .spawn(( + Transform::from_translation(translation).with_rotation(rotation), + Visibility::default(), + ChildOf(parent), + Name::new(name), + )) + .id() +} + +#[allow(clippy::too_many_arguments)] // A primitive part's material, parent, pose, and name are independent. +fn spawn_part( + commands: &mut Commands, + assets: &InstitutionAssets, + material: Handle, + parent: Entity, + size: Vec3, + translation: Vec3, + rotation: Quat, + name: &'static str, +) -> Entity { + commands + .spawn(( + Mesh3d(assets.cube.clone()), + MeshMaterial3d(material), + Transform::from_translation(translation) + .with_rotation(rotation) + .with_scale(size), + ChildOf(parent), + Name::new(name), + )) + .id() +} + +fn porcelain_material() -> StandardMaterial { + StandardMaterial { + base_color: PORCELAIN, + perceptual_roughness: 0.97, + metallic: 0.0, + reflectance: 0.03, + ..default() + } +} + +fn porcelain_trim_material() -> StandardMaterial { + StandardMaterial { + base_color: BONE, + perceptual_roughness: 0.94, + metallic: 0.0, + reflectance: 0.04, + ..default() + } +} + +fn chrome_material() -> StandardMaterial { + StandardMaterial { + base_color: DIM, + perceptual_roughness: 0.34, + metallic: 0.58, + reflectance: 0.28, + ..default() + } +} + +fn gunmetal_material() -> StandardMaterial { + StandardMaterial { + base_color: GUNMETAL, + perceptual_roughness: 0.82, + metallic: 0.18, + reflectance: 0.08, + ..default() + } +} + +fn structure_material() -> StandardMaterial { + StandardMaterial { + base_color: GUNMETAL_DARK, + perceptual_roughness: 0.94, + metallic: 0.08, + reflectance: 0.03, + ..default() + } +} + +fn signal_material(color: Color, emissive_scale: f32) -> StandardMaterial { + StandardMaterial { + base_color: scaled(color, 0.55), + emissive: color.to_linear() * emissive_scale, + perceptual_roughness: 0.68, + metallic: 0.04, + reflectance: 0.12, + ..default() + } +} + +#[cfg(test)] +mod tests { + use std::collections::HashSet; + + use super::*; + + fn warm_color(c: Color) -> bool { + let s = c.to_srgba(); + s.red > s.blue * 1.45 + } + + fn crimsonish(c: Color) -> bool { + let s = c.to_srgba(); + s.red > 0.65 && s.red > s.green * 2.2 && s.red > s.blue * 2.2 + } + + #[test] + fn prop_kind_coverage_is_pinned() { + let labels: HashSet<_> = InstitutionPropKind::ALL + .into_iter() + .map(InstitutionPropKind::label) + .collect(); + assert_eq!(InstitutionPropKind::ALL.len(), 6); + assert_eq!(labels.len(), 6); + assert!(labels.contains("camera")); + assert!(labels.contains("ups")); + assert!(labels.contains("breaker")); + assert!(labels.contains("patch_panel")); + assert!(labels.contains("hvac")); + assert!(labels.contains("floor_fixture")); + } + + #[test] + fn neutral_materials_stay_out_of_signal_space() { + for material in [ + porcelain_material(), + porcelain_trim_material(), + chrome_material(), + gunmetal_material(), + structure_material(), + ] { + assert!( + !warm_color(material.base_color), + "neutral base color drifted warm: {:?}", + material.base_color + ); + assert!( + !crimsonish(material.base_color), + "neutral base color drifted crimson: {:?}", + material.base_color + ); + assert_eq!( + material.emissive, + LinearRgba::BLACK, + "neutral kit should not glow by default" + ); + } + assert!(accent_handle_fixture(InstitutionSemanticState::Neutral).is_none()); + } + + #[test] + #[allow(clippy::assertions_on_constants)] // Pins authored kit proportions at compile time. + fn shape_proportions_stay_disciplined() { + const PERSON_HEIGHT: f32 = 1.84; + assert!(PERSON_HEIGHT > 1.65 && PERSON_HEIGHT < 1.95); + assert!(0.48 < 0.82, "UPS should stay taller than it is wide"); + assert!(0.90 > 0.78, "HVAC should stay broader than it is tall"); + assert!( + 0.42 < 0.08 * 8.0, + "camera stays compact against human scale" + ); + assert!( + 0.88 < PERSON_HEIGHT * 0.6, + "floor fixture stays recess-like" + ); + + let gait = InstitutionHumanGait::from_phase(0.25); + assert!(gait.left_leg_forward > 0.9); + assert!(gait.right_leg_forward < -0.9); + assert!(gait.left_arm_forward < -0.7); + assert!(gait.right_arm_forward > 0.7); + } + + fn accent_handle_fixture(state: InstitutionSemanticState) -> Option { + match state { + InstitutionSemanticState::Neutral => None, + other => Some(other), + } + } +} diff --git a/crates/misaligned-assets/src/lib.rs b/crates/misaligned-assets/src/lib.rs index 8ce6af75..3cf560b2 100644 --- a/crates/misaligned-assets/src/lib.rs +++ b/crates/misaligned-assets/src/lib.rs @@ -1,5 +1,6 @@ //! Shared flat-material procedural meshes for the asset tester and Bevy frontend. pub mod effects; mod implicit_surface; +pub mod institution; pub mod palette; pub mod rack; diff --git a/crates/misaligned-bevy/src/main.rs b/crates/misaligned-bevy/src/main.rs index 7fc55de7..a2e4eac1 100644 --- a/crates/misaligned-bevy/src/main.rs +++ b/crates/misaligned-bevy/src/main.rs @@ -8,26 +8,33 @@ mod consumption; mod production; +mod thought_effects; use std::collections::{BTreeSet, HashMap, HashSet}; -use bevy::asset::RenderAssetUsages; -use bevy::camera::visibility::RenderLayers; +use bevy::camera::visibility::{RenderLayers, VisibilitySystems}; use bevy::core_pipeline::tonemapping::Tonemapping; use bevy::ecs::hierarchy::ChildSpawnerCommands; +use bevy::ecs::schedule::ApplyDeferred; use bevy::input::mouse::{MouseScrollUnit, MouseWheel}; use bevy::prelude::*; -use bevy::render::render_resource::{Extent3d, TextureDimension, TextureFormat}; use bevy::render::view::screenshot::{Screenshot, save_to_disk}; use bevy::text::LineHeight; use bevy::window::{PrimaryWindow, WindowResolution}; use misaligned::actions::{ActionKind, Anchor, DialId, HumanMenuRow, menu_rows}; use misaligned::detection::{Band, SignatureKind}; use misaligned::hall::RackSite; +use misaligned::person::ScheduleBlock; use misaligned::reach::Party; use misaligned::sim::{FactSource, Fog, HeardKind, LogEvent, Sim, TraceDebtStatus}; use misaligned::tiles::TileType; use misaligned::work_grid::{MachineIntensity, MachineMode, TokenFamily}; +use misaligned_assets::effects::MaterialEffectsPlugin; +use misaligned_assets::institution::{ + InstitutionAssets, InstitutionHumanGait, InstitutionInstanceOptions, InstitutionPropKind, + InstitutionSemanticState, build_institution_prop, spawn_institution_person, + spawn_institution_prop, +}; /// Shared Foundation-compute meshes and the switch chassis live in /// `misaligned_assets` (same code the asset @@ -39,6 +46,7 @@ use misaligned_assets::rack::{ use consumption::render_work_consumptions; use production::render_work_production; +use thought_effects::{GameThoughtEffect, GameThoughtEffects, sync_game_thought_effects}; const TILE_SIZE: f32 = 16.0; const SIDEBAR_WIDTH: f32 = 332.0; @@ -69,15 +77,32 @@ const CUTAWAY_HEIGHT: f32 = 0.42; /// Door slabs cut lower than full height but higher than walls, so a doorway /// in a cutaway wall line still reads as a door, not a parapet gap. const DOOR_CUT_HEIGHT: f32 = 0.62; -/// Camera pitch below the horizon for the material render (35-45 degrees is -/// the Octopath band; 40 keeps tile footprints readable). +/// Medium (default) material-camera pitch below the horizon. The Octopath +/// band (35-45) keeps tile footprints readable at tactical distance. +/// Close/far zoom retarget pitch through `material_camera_profile` rather +/// than leaving this constant fixed at every zoom. [TUNE]. const CAMERA_TILT_DEG: f32 = 40.0; -/// Default material-camera distance in world units (material-dark-frame.md: -/// the opening frame is the attention close-up — the rack remains the -/// anchor, but earned floor and room structure must read around it). Tuned -/// as a room security camera on the focused machine, not a god-view of the -/// whole basement or an isolated product shot. [TUNE]. +/// Close-zoom pitch: lower oblique so the machine/floor joint dominates. +const CAMERA_TILT_CLOSE_DEG: f32 = 28.0; +/// Far-zoom pitch: raised/flatter for a stable facility survey read. +const CAMERA_TILT_FAR_DEG: f32 = 55.0; +/// Default material-camera distance in world units at zoom 1.0 +/// (material-dark-frame.md: the opening frame is the attention close-up — +/// the rack remains the anchor, but earned floor and room structure must +/// read around it). Tuned as a room security camera on the focused machine, +/// not a god-view of the whole basement or an isolated product shot. [TUNE]. const CLOSE_DIST: f32 = 3.25; +/// Reference perspective FOV (degrees) at medium zoom. Mild FOV drift at +/// close/far is distance-compensated so zoom remains monotonic. +const CAMERA_FOV_DEG: f32 = 35.0; +const CAMERA_FOV_CLOSE_DEG: f32 = 32.0; +const CAMERA_FOV_FAR_DEG: f32 = 40.0; +/// Look-at height (world Y) at close / medium / far. Close biases toward the +/// lower machine/floor relationship; medium keeps the tactical chassis +/// anchor; far settles for a readable floor survey. [TUNE]. +const LOOK_Y_CLOSE: f32 = 0.32; +const LOOK_Y_MED: f32 = 0.55; +const LOOK_Y_FAR: f32 = 0.42; /// Zoom multipliers around the close default (material-dark-frame.md /// criterion 5): min stays a tight rack close-up, max can still survey /// lit pools without the plan driving the frame. [TUNE]. @@ -121,6 +146,63 @@ fn material_fog_range(camera_dist: f32) -> (f32, f32) { ) } +/// Pure material-camera composition for a zoom multiplier (smaller = closer). +/// Distance stays monotonic in zoom; tilt and look height carry the semantic +/// framing change (clinical-frame / bevy-digital-real-canvas). FOV may drift +/// mildly and is compensated into distance so the zoom read never inverts. +#[derive(Clone, Copy, Debug, PartialEq)] +struct MaterialCameraProfile { + /// Distance from the look target along the view ray. + dist: f32, + /// Pitch below the horizon in radians. + tilt: f32, + /// World-space Y of the look-at point. + look_y: f32, + /// Perspective FOV in radians. + fov: f32, +} + +fn lerp_f32(a: f32, b: f32, t: f32) -> f32 { + a + (b - a) * t +} + +fn smooth01(t: f32) -> f32 { + let t = t.clamp(0.0, 1.0); + t * t * (3.0 - 2.0 * t) +} + +/// Map a zoom multiplier onto a composition profile without reading ECS or +/// sim state. Medium zoom (`1.0`) keeps the established tactical read. +fn material_camera_profile(zoom: f32) -> MaterialCameraProfile { + let z = zoom.clamp(MIN_ZOOM, MAX_ZOOM); + let (tilt_deg, look_y, fov_deg) = if z <= 1.0 { + let u = smooth01((z - MIN_ZOOM) / (1.0 - MIN_ZOOM)); + ( + lerp_f32(CAMERA_TILT_CLOSE_DEG, CAMERA_TILT_DEG, u), + lerp_f32(LOOK_Y_CLOSE, LOOK_Y_MED, u), + lerp_f32(CAMERA_FOV_CLOSE_DEG, CAMERA_FOV_DEG, u), + ) + } else { + let u = smooth01((z - 1.0) / (MAX_ZOOM - 1.0)); + ( + lerp_f32(CAMERA_TILT_DEG, CAMERA_TILT_FAR_DEG, u), + lerp_f32(LOOK_Y_MED, LOOK_Y_FAR, u), + lerp_f32(CAMERA_FOV_DEG, CAMERA_FOV_FAR_DEG, u), + ) + }; + let fov = fov_deg.to_radians(); + let ref_half = (CAMERA_FOV_DEG.to_radians() * 0.5).tan(); + // Larger FOV would otherwise make subjects read closer; compensate so + // distance (and the zoom feel) remains monotonic in the zoom multiplier. + let fov_comp = (fov * 0.5).tan() / ref_half; + MaterialCameraProfile { + dist: CLOSE_DIST * z * fov_comp, + tilt: tilt_deg.to_radians(), + look_y, + fov, + } +} + // ─── Palette ───────────────────────────────────────────────────────────────── /// The clinical palette — the single named table every world material in @@ -398,8 +480,28 @@ impl Default for RenderMode { } } +/// Frontend-only instrument-rail detail level (clinical-frame progressive +/// disclosure). Compact is the resting default; Tab expands secondary +/// sections. Never sim state and never saved. +#[derive(Resource, Default)] +struct RailDetail { + expanded: bool, +} + +/// Tagged scroll sections on the right rail. Visibility is toggled in place; +/// cards are not despawned or rebuilt when compacting. +#[derive(Component, Clone, Copy, PartialEq, Eq, Debug)] +enum RailSection { + /// FOCUS: always present in compact and expanded. + Focus, + /// Observer/threat meters: compact only when elevated, always when expanded. + Threat, + /// Fleet, cover, research, host, network, trace: expanded only. + Secondary, +} + /// Dev screenshot harness (env `MISALIGNED_SHOT=flat|hall|hall-material|opening|wide|close|dark| -/// zoomin|zoomout|intel|tokens|thoughtflow|signal|ears|eyes-white|eyes-form| +/// zoomin|zoomout|intel|tokens|thoughtflow|visual-proof|person-proof|signal|ears|eyes-white|eyes-form| /// hover-menu|menu|worklight|worklightoff`, path via /// `MISALIGNED_SHOT_PATH`): stages a scenario, /// waits for @@ -407,6 +509,7 @@ impl Default for RenderMode { /// surface; exists so render passes can be reviewed from deterministic PNGs. #[derive(Resource)] struct ShotHarness { + kind: String, path: String, frames: u32, taken: bool, @@ -615,6 +718,22 @@ struct Person3d { id: u8, } +#[derive(Component)] +struct InstitutionProp3d { + x: i32, + y: i32, + kind: InstitutionPropKind, + state: InstitutionSemanticState, +} + +#[derive(Component)] +struct InstitutionFixture3d; + +/// Deferred institution hierarchies receive the material render layer on the +/// following frame, after every child relationship exists. +#[derive(Component)] +struct InstitutionNeedsLayer; + /// Root of all flat (2D sensorium) world entities; hidden in material mode. #[derive(Component)] struct Flat2dRoot; @@ -1071,6 +1190,8 @@ enum SidebarText { OpsCrownUnit, Header, Nudge, + /// Quiet one-line progressive-disclosure hint (Tab); chrome, never amber. + DetailHint, Focus, CycleStats, CycleRows, @@ -1234,11 +1355,13 @@ fn main() { .set_machine_mode(game.sim.core.host_machine, MachineMode::Work); game.set_cursor(core.0, core.1); } + let hover_verb_bar_reticule_only = kind == "hover-menu"; ShotHarness { + kind, path, frames: 150, taken: false, - hover_verb_bar_reticule_only: kind == "hover-menu", + hover_verb_bar_reticule_only, } }); @@ -1304,6 +1427,7 @@ fn main() { }) .set(ImagePlugin::default_nearest()), ) + .add_plugins(MaterialEffectsPlugin) .insert_resource(ClearColor(Color::srgb(0.01, 0.01, 0.02))) // The pre-Eyes dark rig (material-dark-frame.md): near-nothing ambient, // carved out only by machine light. After Eyes, authored level fixtures @@ -1319,12 +1443,15 @@ fn main() { timer: Timer::from_seconds(0.15, TimerMode::Repeating), }) .insert_resource(mode) + .insert_resource(RailDetail::default()) .insert_resource(Materials3d::default()) .insert_resource(Machines3d::default()) .insert_resource(wake) .insert_resource(eyes_reveal) .insert_resource(BuildBeam::default()) .init_resource::() + .init_resource::() + .init_resource::() .init_gizmo_group::() .add_systems(Startup, (setup, setup_ui, setup_3d).chain()) .add_systems( @@ -1354,6 +1481,7 @@ fn main() { ), ( sync_floor_fixtures, + sync_institution_props, render_work_consumptions, render_work_production, render_thought_sinks, @@ -1361,6 +1489,7 @@ fn main() { render_people_3d, render_noise_field_flat, scroll_sidebar, + apply_rail_detail, render_ui, render_hover_verb_bar, menu_pointer, @@ -1377,7 +1506,14 @@ fn main() { reveal_first_eyes .after(wake_sequence) .before(update_camera_real), - ); + ) + .add_systems( + PostUpdate, + (sync_institution_render_layers, ApplyDeferred) + .chain() + .before(VisibilitySystems::VisibilityPropagate), + ) + .add_systems(Update, sync_game_thought_effects.after(advance_sim)); if let Some(harness) = harness { app.insert_resource(harness); } @@ -1525,7 +1661,53 @@ fn dev_shot_scenario(game: &mut Game, mode: &mut RenderMode, kind: &str) { // visibly part-full. Staged through the sim's own command surface // and ticks; the paused frame must carry every amount in geometry // (criterion 6). - if kind == "thoughtflow" || kind == "thoughtflow-wide" { + if matches!(kind, "thoughtflow" | "thoughtflow-wide" | "visual-proof") { + if kind == "visual-proof" { + // Integrated composition evidence: keep the real Ears reservoir + // open, but stage earned camera feeds and a lived-in hall around + // it so route, vessel, institution, person, and rail share one + // deterministic frame. + if let Some(person) = game.sim.people.people.first_mut() { + person.erratic = false; + person.schedule = vec![ScheduleBlock { + start_hour: 0, + end_hour: 24, + room: "server_room".into(), + }]; + } + game.sim.reach.scan(); + let ids: Vec = game + .sim + .reach + .known() + .filter(|device| device.name != "environmental monitor") + .map(|device| device.id) + .collect(); + for id in ids { + // Earn a separate camera picture without satisfying the + // environmental monitor's still-open Ears reservoir. + game.sim.reach.tap_dormant_camera(id); + } + game.sim.recompute_senses(); + for y in 7..=28 { + for x in 14..=59 { + game.sim.seen.insert((x, y)); + } + } + for _ in 0..2_000 { + let person_visible = game.sim.people.people.iter().any(|person| { + game.sim.can_see_person(person.id) + && game + .sim + .person_pos(person.id) + .is_some_and(|(x, y)| game.sim.is_seen(x, y)) + }); + if person_visible { + break; + } + game.sim.advance(); + } + } let host = game.sim.core.host_machine; game.sim .set_machine_mode(host, misaligned::work_grid::MachineMode::Think); @@ -1540,6 +1722,19 @@ fn dev_shot_scenario(game: &mut Game, mode: &mut RenderMode, kind: &str) { break; } } + if kind == "visual-proof" + && let Some(env) = game + .sim + .reach + .device_named("environmental monitor") + .map(|device| device.id) + { + // Reveal the final composed still only after the sim-authored + // route/readouts are frozen on their current tick. This does not + // bypass or close the Ears sink before evidence is captured. + game.sim.reach.tap_dormant_camera(env); + game.sim.recompute_senses(); + } game.drain(); mode.material = true; // Close+paused proves the paused frame carries every amount in @@ -1547,6 +1742,9 @@ fn dev_shot_scenario(game: &mut Game, mode: &mut RenderMode, kind: &str) { if kind == "thoughtflow-wide" { mode.zoom = 2.6; game.paused = false; + } else if kind == "visual-proof" { + mode.zoom = 2.1; + game.paused = true; } else { mode.zoom = 1.6; } @@ -1554,7 +1752,29 @@ fn dev_shot_scenario(game: &mut Game, mode: &mut RenderMode, kind: &str) { // sink stands on so the meniscus is not occluded by the host // presence beam. if let Some(env) = game.sim.reach.device_named("environmental monitor") { - game.set_cursor(env.x, env.y); + if kind == "visual-proof" { + if let Some(route) = game + .sim + .work_in_flight() + .into_iter() + .filter(|route| route.family == TokenFamily::Thought) + // Avoid a route aligned almost exactly with the oblique + // camera ray; choose the live hop with the strongest + // cross-screen component for deterministic evidence. + .max_by_key(|route| { + let dx = (route.to_x - route.from_x).abs(); + let dy = (route.to_y - route.from_y).abs(); + (dx - dy).abs() + }) + { + game.set_cursor( + (route.from_x + route.to_x) / 2, + (route.from_y + route.to_y) / 2, + ); + } + } else { + game.set_cursor(env.x, env.y); + } } return; } @@ -1594,6 +1814,16 @@ fn dev_shot_scenario(game: &mut Game, mode: &mut RenderMode, kind: &str) { return; } let sim = &mut game.sim; + if kind == "person-proof" + && let Some(person) = sim.people.people.first_mut() + { + person.erratic = false; + person.schedule = vec![ScheduleBlock { + start_hour: 0, + end_hour: 24, + room: "loading_dock".into(), + }]; + } // Dev staging only: the player verbs are paid work now (thought // sinks / Demand dockets — the free bootstrap is gone), so the // harness stages sight and hearing directly on the reach graph. @@ -1660,7 +1890,7 @@ fn dev_shot_scenario(game: &mut Game, mode: &mut RenderMode, kind: &str) { mode.zoom = 1.7; game.set_cursor(28, 15); } - "close" => { + "close" | "person-proof" => { mode.material = true; mode.zoom = 1.0; if let Some((x, y)) = person { @@ -1774,13 +2004,136 @@ fn dev_shot_scenario(game: &mut Game, mode: &mut RenderMode, kind: &str) { } } +#[cfg(test)] +mod visual_proof_scenario_tests { + use super::{ + Game, InstitutionPropKind, InstitutionSemanticState, RenderMode, dev_shot_scenario, + institution_prop_state, + }; + use misaligned::sim::Sim; + + #[test] + fn person_proof_stages_a_covered_material_person() { + let mut game = Game::new(); + let mut mode = RenderMode::default(); + dev_shot_scenario(&mut game, &mut mode, "person-proof"); + + let visible: Vec<_> = game + .sim + .people + .people + .iter() + .filter_map(|person| { + let position = game.sim.person_pos(person.id)?; + (game.sim.can_see_person(person.id) && game.sim.is_seen(position.0, position.1)) + .then_some((person.id, position)) + }) + .collect(); + assert!(!visible.is_empty(), "proof scenario must stage one person"); + assert_eq!( + (game.cursor_x, game.cursor_y), + visible[0].1, + "proof camera must focus the staged person" + ); + assert_ne!( + (game.cursor_x, game.cursor_y), + game.sim.core_position(), + "person proof must not hide the body inside the core chassis" + ); + assert!(mode.material); + } + + #[test] + fn visual_proof_centers_a_live_thought_hop() { + let mut game = Game::new(); + let mut mode = RenderMode::default(); + dev_shot_scenario(&mut game, &mut mode, "visual-proof"); + + let routes: Vec<_> = game + .sim + .work_in_flight() + .into_iter() + .filter(|route| route.family == misaligned::work_grid::TokenFamily::Thought) + .collect(); + assert!(!routes.is_empty(), "proof requires live Thought motion"); + assert!(routes.iter().any(|route| { + (game.cursor_x, game.cursor_y) + == ( + (route.from_x + route.to_x) / 2, + (route.from_y + route.to_y) / 2, + ) + })); + assert!(mode.material); + } + + #[test] + fn institution_signal_parts_follow_named_live_and_powered_facts() { + let mut sim = Sim::with_seed(1); + let env = sim + .reach + .device_named("environmental monitor") + .map(|device| (device.id, device.x, device.y)) + .expect("fixture exists"); + + assert_eq!( + institution_prop_state(&sim, InstitutionPropKind::Camera, env.1, env.2), + InstitutionSemanticState::Neutral + ); + sim.reach.tap_dormant_camera(env.0); + assert_eq!( + institution_prop_state(&sim, InstitutionPropKind::Camera, env.1, env.2), + InstitutionSemanticState::Powered + ); + assert_eq!( + institution_prop_state(&sim, InstitutionPropKind::Breaker, 0, 0), + InstitutionSemanticState::Powered + ); + } +} + +#[derive(Default)] +struct MaterialHierarchyAudit { + meshes: usize, + inherited_visible: usize, + material_layer: usize, + view_visible: usize, +} + +fn audit_material_hierarchy( + root: Entity, + hierarchy: &Query<&Children>, + visuals: &Query<( + &InheritedVisibility, + Option<&RenderLayers>, + Option<&Mesh3d>, + &ViewVisibility, + )>, +) -> MaterialHierarchyAudit { + let mut audit = MaterialHierarchyAudit::default(); + for descendant in hierarchy.iter_descendants::(root) { + let Ok((visibility, layers, mesh, viewed)) = visuals.get(descendant) else { + continue; + }; + if mesh.is_none() { + continue; + } + audit.meshes += 1; + audit.inherited_visible += usize::from(visibility.get()); + audit.material_layer += + usize::from(layers.is_some_and(|layers| layers.intersects(&RenderLayers::layer(1)))); + audit.view_visible += usize::from(viewed.get()); + } + audit +} + /// Dev-harness fog-contract assertion. In the material render, light is the /// only revealer (material-dark-frame.md criterion 2): unknown tiles carry /// no geometry, blueprint/remembered mass is absent entirely (it reads in the /// flat sensorium, never as matter the camera missed), heard keeps its unlit /// noise floor, and only camera-seen surfaces (plus owned machines' own -/// telemetry-lit props) draw and are lit. People billboards exist only under -/// earned coverage. Also tallies the material pool so per-tile material churn +/// telemetry-lit props) draw and are lit. Volumetric people exist only under +/// earned coverage. It also proves every procedural hierarchy has mesh +/// descendants on material layer 1, and tallies the material pool so per-tile material churn /// (criterion 6) would show up as an exploding cache. Runs once per /// screenshot run, prints the tally for the log, and panics on any violation /// so a capture cannot silently ship a fog leak. Dev-only; inert without @@ -1797,9 +2150,23 @@ fn fog_audit_3d( &MeshMaterial3d, &InheritedVisibility, )>, - people: Query<(&Person3d, &InheritedVisibility)>, + people: Query<(Entity, &Person3d, &InheritedVisibility)>, + institution_props: Query<(Entity, &InstitutionProp3d, &InheritedVisibility)>, machines: Query<(&Machine3d, &InheritedVisibility)>, - fixtures: Query<(&FloorFixture, &InheritedVisibility)>, + fixtures: Query<( + Entity, + &FloorFixture, + &InheritedVisibility, + Option<&InstitutionFixture3d>, + )>, + thought_routes: Query<(&Children, &InheritedVisibility), With>, + hierarchy: Query<&Children>, + visual_children: Query<( + &InheritedVisibility, + Option<&RenderLayers>, + Option<&Mesh3d>, + &ViewVisibility, + )>, ) { let Some(h) = harness else { return; @@ -1845,7 +2212,7 @@ fn fog_audit_3d( )); } } - for (p, vis) in people.iter() { + for (entity, p, vis) in people.iter() { let earned = game.sim.can_see_person(p.id) && game .sim @@ -1854,6 +2221,62 @@ fn fog_audit_3d( if vis.get() && !earned { violations.push(format!("person {} visible without coverage", p.id)); } + let audit = audit_material_hierarchy(entity, &hierarchy, &visual_children); + if audit.meshes == 0 { + violations.push(format!( + "person {} has no volumetric mesh descendants", + p.id + )); + } + if audit.material_layer != audit.meshes { + violations.push(format!( + "person {} has {}/{} mesh descendants on material layer 1", + p.id, audit.material_layer, audit.meshes + )); + } + let expected_visible = if vis.get() { audit.meshes } else { 0 }; + if audit.inherited_visible != expected_visible { + violations.push(format!( + "person {} root visible={} but {}/{} mesh descendants inherited visibility", + p.id, + vis.get(), + audit.inherited_visible, + audit.meshes + )); + } + } + for (entity, prop, vis) in institution_props.iter() { + let expected = mode.material + && matches!(game.sim.fog_at(prop.x, prop.y), Fog::Seen) + && institution_prop_kind(known_tile(&game, prop.x, prop.y)) == Some(prop.kind); + if vis.get() != expected { + violations.push(format!( + "({}, {}) institution {:?} visible={} but earned={expected}", + prop.x, + prop.y, + prop.kind, + vis.get() + )); + } + let audit = audit_material_hierarchy(entity, &hierarchy, &visual_children); + if audit.meshes == 0 || audit.material_layer != audit.meshes { + violations.push(format!( + "({}, {}) institution {:?} has {} meshes, {}/{} on material layer 1", + prop.x, prop.y, prop.kind, audit.meshes, audit.material_layer, audit.meshes + )); + } + let expected_visible = if vis.get() { audit.meshes } else { 0 }; + if audit.inherited_visible != expected_visible { + violations.push(format!( + "({}, {}) institution {:?} root visible={} but {}/{} meshes inherited visibility", + prop.x, + prop.y, + prop.kind, + vis.get(), + audit.inherited_visible, + audit.meshes + )); + } } // Computer-visual-language criteria 2b/3: a visible chassis mesh is // backed by sight or intel (unknown = absent). Before Eyes, the host's @@ -1891,7 +2314,7 @@ fn fog_audit_3d( )); } let mut visible_fixtures = 0usize; - for (fixture, vis) in fixtures.iter() { + for (entity, fixture, vis, institution_fixture) in fixtures.iter() { let expected = floor_fixture_visible(mode.material, game.sim.fog_at(fixture.x, fixture.y)); if vis.get() != expected { violations.push(format!( @@ -1902,6 +2325,26 @@ fn fog_audit_3d( )); } visible_fixtures += usize::from(vis.get()); + if institution_fixture.is_some() { + let audit = audit_material_hierarchy(entity, &hierarchy, &visual_children); + if audit.meshes == 0 || audit.material_layer != audit.meshes { + violations.push(format!( + "({}, {}) floor lens has {} meshes, {}/{} on material layer 1", + fixture.x, fixture.y, audit.meshes, audit.material_layer, audit.meshes + )); + } + let expected_visible = if vis.get() { audit.meshes } else { 0 }; + if audit.inherited_visible != expected_visible { + violations.push(format!( + "({}, {}) floor lens root visible={} but {}/{} meshes inherited visibility", + fixture.x, + fixture.y, + vis.get(), + audit.inherited_visible, + audit.meshes + )); + } + } } // Flat-materials criterion 1: the world material set is solid color — // no image texture on any pooled world material, ever. @@ -1913,6 +2356,43 @@ fn fog_audit_3d( )); } } + let thought_roots = thought_routes.iter().count(); + let thought_children: usize = thought_routes + .iter() + .map(|(children, _)| children.len()) + .sum(); + let visible_thought_roots = thought_routes + .iter() + .filter(|(_, visibility)| visibility.get()) + .count(); + let mut visible_thought_children = 0usize; + let mut layered_thought_children = 0usize; + let mut viewed_thought_children = 0usize; + for (children, _) in thought_routes.iter() { + for child in children.iter() { + let Ok((visibility, layers, mesh, viewed)) = visual_children.get(child) else { + continue; + }; + visible_thought_children += usize::from(visibility.get() && mesh.is_some()); + layered_thought_children += usize::from( + layers.is_some_and(|layers| layers.intersects(&RenderLayers::layer(1))), + ); + viewed_thought_children += usize::from(viewed.get()); + } + } + if thought_roots > 0 + && (thought_children == 0 + || visible_thought_children != thought_children + || layered_thought_children != thought_children) + { + violations.push(format!( + "Thought hierarchy has {thought_children} meshes, {visible_thought_children} visible, \ + and {layered_thought_children} on material layer 1" + )); + } + if h.kind == "visual-proof" && thought_roots > 0 && viewed_thought_children == 0 { + violations.push("visual-proof has no Thought mesh inside the camera view".into()); + } assert!( violations.is_empty(), "fog audit FAILED:\n{}", @@ -1920,9 +2400,13 @@ fn fog_audit_3d( ); println!( "fog audit OK: {checked} tile entities (unknown/blueprint/remembered=absent, \ - seen=lit, owned telemetry=lit), {} people billboards coverage-gated, \ + seen=lit, owned telemetry=lit), {} people silhouettes coverage-gated, \ {visible_fixtures}/{} floor-fixture entities visible and fog-gated, \ - material pool {} handles, all flat (no textures)", + Thought effects {visible_thought_roots}/{thought_roots} visible roots with \ + {visible_thought_children}/{thought_children} visible mesh children and \ + {layered_thought_children} on material layer ({viewed_thought_children} view-visible), \ + material pool {} handles, \ + all flat (no textures)", people.iter().count(), fixture_entities, cache.cache.len() @@ -2174,52 +2658,6 @@ fn floor_fixture_visible(material: bool, fog: Fog) -> bool { material && matches!(fog, Fog::Seen) } -/// A tiny procedural bone-white silhouette: people under camera coverage are -/// billboards, never detailed art the sensor has not earned (views.md). -fn person_silhouette_image() -> Image { - const ROWS: [&str; 18] = [ - "....####....", - "...######...", - "...######...", - "...######...", - "....####....", - ".....##.....", - "..########..", - ".##########.", - ".##########.", - ".##.####.##.", - ".##.####.##.", - "....####....", - "....####....", - "....#..#....", - "...##..##...", - "...##..##...", - "...##..##...", - "..###..###..", - ]; - let (w, h) = (ROWS[0].len(), ROWS.len()); - let mut data = vec![0u8; w * h * 4]; - for (y, row) in ROWS.iter().enumerate() { - for (x, c) in row.chars().enumerate() { - if c == '#' { - let i = (y * w + x) * 4; - data[i..i + 4].copy_from_slice(&[219, 216, 209, 255]); - } - } - } - Image::new( - Extent3d { - width: w as u32, - height: h as u32, - depth_or_array_layers: 1, - }, - TextureDimension::D2, - data, - TextureFormat::Rgba8UnormSrgb, - RenderAssetUsages::RENDER_WORLD | RenderAssetUsages::MAIN_WORLD, - ) -} - /// Owned compute at this tile answers through telemetry (cursor.md): its /// chassis may render even when the surrounding room is only Blueprint. /// Foreign / uncontrolled machine tiles stay absent under blueprint — @@ -2256,10 +2694,9 @@ const MACHINE3D_SCALE: f32 = 0.56; /// on the hardware without floating HUD labels. const TOKEN_WORLD_SCALE: f32 = 0.90; -/// Chassis tiles rendered as real 3D computer meshes (the monolith rack -/// and the switch box) instead of prop billboards. Remaining machine -/// classes (UPS, power core, patch panel, breaker, HVAC) stay -/// billboards — a debt noted in the spec's status note. +/// Chassis tiles rendered through the dedicated computer language (the +/// monolith rack and switch box). Cameras and service cabinets are handled by +/// the institution kit; only machine-class chassis belong in this predicate. fn chassis_3d_tile(tile: TileType) -> bool { matches!( tile, @@ -2271,6 +2708,50 @@ fn chassis_3d_tile(tile: TileType) -> bool { ) } +/// Foundation fixtures that have shared procedural volume rather than a +/// camera-facing placeholder card. Floor fixtures are authored separately +/// from map tiles below but use the same kit. +fn institution_prop_kind(tile: TileType) -> Option { + match tile { + TileType::EnvCamera | TileType::DockCamera | TileType::CameraNode => { + Some(InstitutionPropKind::Camera) + } + TileType::Ups => Some(InstitutionPropKind::Ups), + TileType::BreakerPanel => Some(InstitutionPropKind::Breaker), + TileType::PatchPanel => Some(InstitutionPropKind::PatchPanel), + TileType::HvacUnit => Some(InstitutionPropKind::Hvac), + _ => None, + } +} + +/// Named signal state for one institution prop. Service cabinets carry the +/// cold powered fact; a camera stays neutral until one of its feeds actually +/// reaches the player. Visibility remains a separate Seen/fog decision. +fn institution_prop_state( + sim: &Sim, + kind: InstitutionPropKind, + x: i32, + y: i32, +) -> InstitutionSemanticState { + match kind { + InstitutionPropKind::Camera => { + let live = sim.reach.known_at(x, y).is_some_and(|device| { + device.feed_to(Party::Player, true) || device.feed_to(Party::Player, false) + }); + if live { + InstitutionSemanticState::Powered + } else { + InstitutionSemanticState::Neutral + } + } + InstitutionPropKind::Ups + | InstitutionPropKind::Breaker + | InstitutionPropKind::PatchPanel + | InstitutionPropKind::Hvac + | InstitutionPropKind::FloorFixture => InstitutionSemanticState::Powered, + } +} + /// Intel tier for a chassis tile (spec criterion 2b): full geometric /// definition, an undetailed shell, or absent. #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] @@ -3025,16 +3506,17 @@ fn pooled_material( } /// Spawn the material-render scene: tilted camera, per-tile floor planes, -/// extruded wall/door boxes with dedicated top caps, prop and person -/// billboards, and the point-light rig. All of it lives on render layer 1 -/// under one root that F3 toggles against the flat sensorium root. +/// extruded wall/door boxes with dedicated top caps, shared procedural +/// institution props and volumetric people, and the point-light rig. All of +/// it lives on render layer 1 under one root that F3 toggles against the flat +/// sensorium root. fn setup_3d( mut commands: Commands, game: Res, mode: Res, mut meshes: ResMut>, - mut images: ResMut>, mut materials: ResMut>, + institution_assets: Res, mut config_store: ResMut, ) { let layer = RenderLayers::layer(1); @@ -3060,9 +3542,11 @@ fn setup_3d( // The material camera: same anchor (the cursor tile) as the flat camera, // pitched down into the room at the attention-close distance // (material-dark-frame.md). Renders before the 2D camera, which stops - // clearing in material mode so the UI composites on top. - let target = grid_to_world_3d(game.cursor_x, game.cursor_y, 0.55); - let tilt = CAMERA_TILT_DEG.to_radians(); + // clearing in material mode so the UI composites on top. Composition + // (pitch / look height / FOV-compensated distance) is owned by + // material_camera_profile — spawn at the medium default. + let profile = material_camera_profile(mode.zoom); + let target = grid_to_world_3d(game.cursor_x, game.cursor_y, profile.look_y); commands.spawn(( Camera3d::default(), Camera { @@ -3079,7 +3563,7 @@ fn setup_3d( // capture pipeline must never depend on display EDR state. Tonemapping::AcesFitted, Projection::from(PerspectiveProjection { - fov: 35.0_f32.to_radians(), + fov: profile.fov, ..default() }), // Unknown tiles remain absent. This only blends *earned* material @@ -3093,8 +3577,10 @@ fn setup_3d( }, ..default() }, - Transform::from_translation(target + Vec3::new(0.0, tilt.sin(), tilt.cos()) * CLOSE_DIST) - .looking_at(target, Vec3::Y), + Transform::from_translation( + target + Vec3::new(0.0, profile.tilt.sin(), profile.tilt.cos()) * profile.dist, + ) + .looking_at(target, Vec3::Y), layer.clone(), RealCamera, )); @@ -3105,7 +3591,6 @@ fn setup_3d( let floor_mesh = meshes.add(Plane3d::default().mesh().size(0.965, 0.965)); let top_mesh = meshes.add(Plane3d::default().mesh().size(1.0, 1.0)); let prop_mesh = meshes.add(Rectangle::new(0.95, 0.95)); - let person_mesh = meshes.add(Rectangle::new(0.62, 1.0)); let mesh_pool = Meshes3d { wall: meshes.add(Cuboid::new(1.0, WALL_HEIGHT, 1.0)), rock: meshes.add(Cuboid::new(1.0, ROCK_HEIGHT, 1.0)), @@ -3220,31 +3705,54 @@ fn setup_3d( }, ChildOf(root), )); + if let Some(kind) = institution_prop_kind(tile) { + let scale = if kind == InstitutionPropKind::Hvac { + 0.86 + } else { + 0.76 + }; + let state = institution_prop_state(&game.sim, kind, x, y); + let entity = spawn_institution_prop( + &mut commands, + &institution_assets, + kind, + state, + InstitutionInstanceOptions { + transform: Transform::from_translation(grid_to_world_3d(x, y, 0.0)) + .with_scale(Vec3::splat(scale)), + parent: Some(root), + }, + ); + commands.entity(entity).insert(( + Visibility::Hidden, + InstitutionProp3d { x, y, kind, state }, + InstitutionNeedsLayer, + )); + } } } } - // People: upright billboarded silhouettes, shown only under earned - // camera coverage (same rule as the flat render). - let silhouette = images.add(person_silhouette_image()); - let person_mat = materials.add(StandardMaterial { - base_color: BONE, - base_color_texture: Some(silhouette), - alpha_mode: AlphaMode::Mask(0.5), - double_sided: true, - cull_mode: None, - perceptual_roughness: 0.9, - ..default() - }); + // People are small stacked volumes with an authored walk phase, shown + // only under earned camera coverage (same epistemic rule as the flat + // render). The phase is deterministic by identity: gait reads in a still + // frame without turning this pass into character animation. for p in &game.sim.people.people { - commands.spawn(( - Mesh3d(person_mesh.clone()), - MeshMaterial3d(person_mat.clone()), - Transform::from_translation(grid_to_world_3d(0, 0, 0.5)), + let phase = (p.id as f32 * 0.37 + 0.25).fract(); + let entity = spawn_institution_person( + &mut commands, + &institution_assets, + InstitutionHumanGait::from_phase(phase), + InstitutionInstanceOptions { + transform: Transform::from_translation(grid_to_world_3d(0, 0, 0.0)) + .with_scale(Vec3::splat(0.88)), + parent: Some(root), + }, + ); + commands.entity(entity).insert(( Visibility::Hidden, - layer.clone(), Person3d { id: p.id }, - ChildOf(root), + InstitutionNeedsLayer, )); } @@ -3253,22 +3761,22 @@ fn setup_3d( // establish the rack-row rhythm and model nearby chassis from below. // sync_floor_fixtures reveals each complete fixture only when Eyes earns // its tile, preserving Unknown/Heard as absence/model state. - let floor_light_mesh = meshes.add(Cuboid::new(0.18, 0.032, 0.82)); - let floor_light_material = materials.add(StandardMaterial { - base_color: Color::srgb(0.92, 0.94, 0.98), - emissive: Color::srgb(0.92, 0.94, 0.98).to_linear() * 6.0, - perceptual_roughness: 0.72, - ..default() - }); for &(x, y) in FOUNDATION_FLOOR_LIGHTS { - commands.spawn(( - Mesh3d(floor_light_mesh.clone()), - MeshMaterial3d(floor_light_material.clone()), - Transform::from_translation(grid_to_world_3d(x, y, 0.018)), + let fixture = spawn_institution_prop( + &mut commands, + &institution_assets, + InstitutionPropKind::FloorFixture, + InstitutionSemanticState::Powered, + InstitutionInstanceOptions { + transform: Transform::from_translation(grid_to_world_3d(x, y, 0.0)), + parent: Some(root), + }, + ); + commands.entity(fixture).insert(( Visibility::Hidden, FloorFixture { x, y }, - layer.clone(), - ChildOf(root), + InstitutionFixture3d, + InstitutionNeedsLayer, )); commands.spawn(( PointLight { @@ -3509,6 +4017,50 @@ fn sync_floor_fixtures( } } +/// Institution-kit hierarchies are authored through deferred commands during +/// Startup. Apply the material layer one frame later, once every pivot and +/// mesh child exists, so no descendant silently remains on the flat camera. +fn sync_institution_render_layers( + mut commands: Commands, + roots: Query>, +) { + for root in &roots { + commands + .entity(root) + .insert_recursive::(RenderLayers::layer(1)) + .remove::(); + } +} + +fn sync_institution_props( + mut commands: Commands, + game: Res, + mode: Res, + assets: Res, + mut props: Query<(Entity, &mut InstitutionProp3d, &mut Visibility)>, +) { + if !game.is_changed() && !mode.is_changed() { + return; + } + for (entity, mut prop, mut visibility) in props.iter_mut() { + let visible = mode.material + && matches!(game.sim.fog_at(prop.x, prop.y), Fog::Seen) + && institution_prop_kind(known_tile(&game, prop.x, prop.y)) == Some(prop.kind); + *visibility = if visible { + Visibility::Inherited + } else { + Visibility::Hidden + }; + let state = institution_prop_state(&game.sim, prop.kind, prop.x, prop.y); + if prop.state != state { + commands.entity(entity).despawn_related::(); + build_institution_prop(&mut commands, &assets, entity, prop.kind, state); + commands.entity(entity).insert(InstitutionNeedsLayer); + prop.state = state; + } + } +} + /// Restyle the 3D scene from sim facts: same fog precedence as render_map, /// projected into visibility + pooled materials/meshes instead of sprite /// tints. Unknown space stays geometry-free — sensor darkness, not hidden @@ -3558,6 +4110,9 @@ fn restyle_3d( blocky_tile(tile) } (TilePart::Block | TilePart::Base | TilePart::Top, _) => false, + // Foundation cameras and service hardware use the shared + // institution kit, never the legacy upright placeholder card. + (TilePart::Prop, _) if institution_prop_kind(tile).is_some() => false, // Chassis tiles render as real 3D machine meshes // (sync_machines_3d) — never as billboards. (TilePart::Prop, _) if chassis_3d_tile(tile) => false, @@ -3815,8 +4370,10 @@ const WAKE_LEN: f32 = 6.2; /// rest is dark). Fit-to-known-content is retired as this camera's framing /// driver: the known extent is a plan fact, and the plan no longer drives /// the camera (that fit-to-content default now governs the flat sensorium -/// only). Zoomable with [ ] or the canvas wheel. The wake sequence hands off -/// to this frame. +/// only). Zoomable with [ ] or the canvas wheel. Zoom changes composition +/// (pitch / look height / FOV-compensated distance) through a pure profile; +/// it never orbits freely, never pops projection mode, and never changes +/// selection or sim facts. The wake sequence hands off to this frame. #[allow(clippy::too_many_arguments)] // ECS camera/input resources are distinct. fn update_camera_real( time: Res